First version of pdf generation need some refactoring

This commit is contained in:
Schoumi 2018-10-15 09:18:15 +02:00
parent 538c9485e9
commit e256a13523
2 changed files with 277 additions and 95 deletions

BIN
img.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -8,6 +8,7 @@ const {
} = require('cozy-konnector-libs') } = require('cozy-konnector-libs')
const moment = require('moment') const moment = require('moment')
const pdf = require('pdfjs') const pdf = require('pdfjs')
const fs = require('fs')
const request = requestFactory({ const request = requestFactory({
debug: false, debug: false,
@ -23,27 +24,27 @@ const urssafUrl = 'https://www.ti.urssaf.fr/'
module.exports = new BaseKonnector(start) module.exports = new BaseKonnector(start)
async function start(fields) { async function start(fields) {
let accData = this.getAccountData(); let accData = this.getAccountData()
log('info', 'Authenticating ...'); log('info', 'Authenticating ...')
//Auth and retrieve declaration URL //Auth and retrieve declaration URL
const urlDeclaration = await authenticate( const urlDeclaration = await authenticate(
fields.siret, fields.siret,
fields.lastname, fields.lastname,
fields.firstname, fields.firstname,
fields.password fields.password
); )
log('info', 'Successfully logged in'); log('info', 'Successfully logged in')
log('info', 'Get Declarations Parameters'); log('info', 'Get Declarations Parameters')
let params = await getDeclarationsParameters(urlDeclaration); let params = await getDeclarationsParameters(urlDeclaration)
log('info', 'Get Declaration '); log('info', 'Get Declaration ')
const declarationList = await buildDeclarationList(params); const declarationList = await buildDeclarationList(params)
const bills = await getAllDeclaration(params, declarationList, accData); const bills = await getAllDeclaration(params, declarationList, accData)
await saveBills(bills,fields, { await saveBills(bills, fields, {
identifiers: ['net-entreprise'], identifiers: ['net-entreprise'],
contentType: 'application/pdf' contentType: 'application/pdf'
}); })
} }
async function authenticate(siret, lastname, firstname, password) { async function authenticate(siret, lastname, firstname, password) {
@ -153,7 +154,7 @@ async function getList(params, urlPart, subItem, splitPart) {
async function getAllDeclaration(params, declarationList, accData) { async function getAllDeclaration(params, declarationList, accData) {
let exist = Object.keys(accData).length > 0 let exist = Object.keys(accData).length > 0
let bills = []; let bills = []
if (!exist || accData.lastPeriod !== params.periode - 1) { if (!exist || accData.lastPeriod !== params.periode - 1) {
let lastPeriod = declarationList.length let lastPeriod = declarationList.length
if (exist) { if (exist) {
@ -163,11 +164,11 @@ async function getAllDeclaration(params, declarationList, accData) {
for (let i = 0; i < lastPeriod; i++) { for (let i = 0; i < lastPeriod; i++) {
const bill = await getDeclaration(params, declarationList[i]) const bill = await getDeclaration(params, declarationList[i])
bills.push(bill); bills.push(bill)
break; break
} }
} }
return bills; return bills
} }
async function getDeclaration(params, periode) { async function getDeclaration(params, periode) {
@ -181,119 +182,300 @@ async function getDeclaration(params, periode) {
method: 'POST', method: 'POST',
uri: `${urssafUrl}/action.histo_netmicro`, uri: `${urssafUrl}/action.histo_netmicro`,
form: params form: params
}); })
let subData = scrape(data('#table-paiements-tldp .cellule_droite_middle'),{ let subData = scrape(data('#table-paiements-tldp .cellule_droite_middle'), {
amount: { amount: {
sel: 'span#libmtpai', sel: 'span#libmtpai',
parse: value => parseInt(value) parse: value => parseInt(value)
} }
}); })
let bill = {}; let bill = {}
bill.amount = subData.amount; bill.amount = subData.amount
subData = scrape(data,{ subData = scrape(
date: { data,
sel: 'span.text_grand_gras', {
} date: {
},'.tableau_donnees_cons .cellule_droite_middle'); sel: 'span.text_grand_gras'
subData = subData[3].date.substring(3).substring(0,10).trim(); }
moment.locale('fr'); },
subData = subData.split('/'); '.tableau_donnees .cellule_droite_middle'
let day = parseInt(subData[0])+1; )
day = day < 10 ? '0'+day.toString() : day.toString(); subData = subData[3].date
bill.date = moment(''+subData[2]+'-'+subData[1]+'-'+day); .substring(3)
bill.vendor = 'urssaf'; .substring(0, 10)
bill.filename = bill.date.format('YYYY-MM')+'.pdf'; .trim()
bill.date = bill.date.toDate(); moment.locale('fr')
bill.filestream = await buildDeclarationPDF(data, periode); subData = subData.split('/')
return bill; let day = parseInt(subData[0]) + 1
day = day < 10 ? '0' + day.toString() : day.toString()
bill.date = moment('' + subData[2] + '-' + subData[1] + '-' + day)
bill.vendor = 'urssaf'
bill.filename = bill.date.format('YYYY-MM') + '.pdf'
bill.date = bill.date.toDate()
bill.filestream = await buildDeclarationPDF(data, periode)
return bill
} }
async function buildDeclarationPDF(data, periode) { async function buildDeclarationPDF(data, periode) {
var doc = new pdf.Document(); var doc = new pdf.Document()
doc.text('Généré par le connceteur Net-Entreprise (Micro-Entrepreneur)', {
font: require('pdfjs/font/Helvetica-Bold'),
fontSize: 9
})
//title //title
const cell = doc.cell({ paddingBottom: 0.5 * pdf.cm }).text() let table = doc.table({ widths: [140, 400], borderWidth: 0 })
let type = "Déclaration Trimestrielle de Recettes" const img = new pdf.Image(fs.readFileSync('img.jpg'))
if(periode % 10 !== 0) let row = table.row()
type = "Déclaration Mensuelle de Recettes" row.cell({ paddingTop: 0.5 * pdf.cm, paddingBottom: 0.5 * pdf.cm }).image(img)
type += "\n Régime micro-social simplifié" let cell = row
.cell({
paddingTop: 0.5 * pdf.cm,
paddingBottom: 0.5 * pdf.cm,
paddingLeft: 0.2 * pdf.cm
})
.text()
let type = 'Déclaration Trimestrielle de Recettes'
if (periode % 10 !== 0) type = 'Déclaration Mensuelle de Recettes'
type += '\n Régime micro-social simplifié'
cell.add(type, { cell.add(type, {
font: require('pdfjs/font/Helvetica-Bold'), font: require('pdfjs/font/Helvetica-Bold'),
fontSize: 14 fontSize: 14
}) })
//first table //first table
let element = data('.tableau_donnees_cons'); let tableau = data('.tableau_donnees')
let table = doc.table({
widths: [270,270],
borderWidth: 1
})
element = element.children('tbody')
let subData = element.children('tr')
subData.each((i,elem) => {
elem = data(elem).children('td')
let value = data(elem[0]).text().trim()
let row = table.row({padding: 0.1 * pdf.cm})
row.cell(value,{backgroundColor: '#A0A0A0'})
value = data(elem[1]).find('span').text().trim().replace(/\s\s+/g, ' ')
row.cell(value)
})
doc.cell({ paddingBottom: 2.0 * pdf.cm }).text()
//second table
element = data('.tableau_donnees');
table = doc.table({ table = doc.table({
widths: [340,60,140], widths: [270, 270],
borderWidth: 1 borderWidth: 1
}) })
element = element.children('tbody') let element = data(tableau[0]).children('tbody')
let subData = element.children('tr')
subData.each((i, elem) => {
elem = data(elem).children('td')
let value = data(elem[0])
.text()
.trim()
let row = table.row({ padding: 0.1 * pdf.cm })
row.cell(value, { backgroundColor: '#A0A0A0' })
value = data(elem[1])
.find('span')
.text()
.trim()
.replace(/\s\s+/g, ' ')
row.cell(value)
})
doc.cell({ paddingBottom: 2.0 * pdf.cm }).text()
//second table
table = doc.table({
widths: [400, 60, 80],
borderWidth: 1
})
element = data(tableau[1]).children('tbody')
subData = element.children('tr') subData = element.children('tr')
//parse table //parse table
subData.each((i,elem) => { subData.each((i, elem) => {
const savedElem = elem
elem = data(elem).children('td') elem = data(elem).children('td')
let key = data(elem[0]).text().trim() let key = data(elem[0])
.text()
.trim()
//subtable //subtable
if(data(elem[0]).find('table').length > 0) { if (data(elem).find('table').length > 1) {
return true; if (data(elem).find('td#lib_cotisations').length > 0) {
elem = data(savedElem).find('td#lib_cotisations')
//2 tab
let title = data(elem[0])
.find('b')
.text()
let optsLeft = { backgroundColor: '#A0A0A0' }
let row = table.row({ padding: 0.1 * pdf.cm })
let cell = row.cell(title, optsLeft)
let subTable = cell.table({
widths: [340, 50],
borderWidth: 0,
paddingLeft: 0.2 * pdf.cm,
paddingBottom: 0.1 * pdf.cm
})
let subElem = data(elem[0]).find('tr')
for (let j = 0; j < subElem.length; j++) {
let subRow = subTable.row()
const td = data(subElem[j]).find('td')
subRow.cell(
data(td[0])
.text()
.trim()
)
subRow.cell(
data(td[1])
.text()
.trim()
)
}
let subRow = subTable.row()
subRow.cell('.', { color: '#FFFFFF' })
subRow.cell('.', { color: '#FFFFFF' })
subElem = data(elem[1]).find('tr')
for (let k = 1; k <= 2; k++) {
let cell = row.cell('.', { alignment: 'center', color: '#FFFFFF' })
subTable = cell.table({
widths: [55 + 18 * (k - 1)],
borderWidth: 0,
paddingBottom: 0.1 * pdf.cm,
color: '#000000'
})
for (let j = 0; j < subElem.length; j++) {
let subRow = subTable.row()
const td = data(subElem[j]).find('td')
let optsRight = { alignment: 'right' }
if (k === 1) optsRight = { alignment: 'center' }
let text = data(td[k])
.text()
.trim()
if (text.length === 0) {
optsRight.color = '#FFFFFF'
text = '.'
}
subRow.cell(text, optsRight)
}
}
} else if (data(elem).find('table#table-paiements-tldp').length > 0) {
//sepa
elem = data(elem).find('table#table-paiements-tldp')
elem = data(elem)
.children('tbody')
.children('tr')
for (let j = 0; j < elem.length - 1; j++) {
let subElem = data(elem[j]).find('.cellule_gauche_top tr')
let title = data(subElem)
.find('strong')
.text()
.trim()
let optsLeft = { backgroundColor: '#A0A0A0' }
let optsRight = { alignment: 'right', color: '#000000' }
let optsCenter = { alignment: 'center', color: '#000000' }
let optsRightWhite = { alignment: 'right', color: '#FFFFFF' }
let optsCenterWhite = { alignment: 'center', color: '#FFFFFF' }
let row = table.row({ padding: 0.1 * pdf.cm })
let cell = row.cell(title, optsLeft)
let subTable = cell.table({
widths: [130, 260],
borderWidth: 0,
paddingLeft: 0.2 * pdf.cm
})
let subRow = subTable.row()
let bic = data(subElem)
.find('div')
.text()
.trim()
subRow.cell(bic, optsLeft)
let full = data(subElem)
.find('.cellule_defaut')
.text()
.trim()
let half = data(subElem)
.find('.cellule_defaut')
.children()
.text()
.trim()
subRow.cell(full.substring(half.length), optsLeft)
subElem = data(elem[j])
.find('.cellule_droite_top tr')
.children()
title = data(subElem[1])
.text()
.trim()
cell = row.cell('.', optsCenterWhite)
subTable = cell.table({ widths: [55], borderWidth: 0 })
subRow = subTable.row()
subRow.cell(title, optsCenter)
title = data(subElem[2])
.text()
.trim()
cell = row.cell('.', optsRightWhite)
subTable = cell.table({ widths: [73], borderWidth: 0 })
subRow = subTable.row()
subRow.cell(title, optsRight)
}
let optsLeft = { backgroundColor: '#A0A0A0' }
let optsRight = { alignment: 'right', color: '#000000' }
let optsCenter = { alignment: 'center', color: '#000000' }
let subElem = data(elem[elem.length - 1]).find('.cellule_gauche_middle')
let row = table.row({ padding: 0.1 * pdf.cm })
row.cell(
data(subElem)
.text()
.trim(),
optsLeft
)
subElem = data(elem[elem.length - 1]).find(
'.cellule_droite_middle .cellule_defaut'
)
row.cell(
data(subElem[1])
.text()
.trim(),
optsCenter
)
row.cell(
data(subElem[2])
.text()
.trim(),
optsRight
)
}
return true
} }
if(key !== '') { if (key !== '') {
let subElem = data(elem[1]).find('span').parent() let subElem = data(elem[1])
let value = "" .find('span')
let interValue = "" .parent()
let optsRight = {alignment: 'right'} let value = ''
let optsCenter = {alignment: 'center'} let interValue = ''
let optsLeft = {backgroundColor: '#A0A0A0'} let optsRight = { alignment: 'right' }
let optsCenter = { alignment: 'center' }
let optsLeft = { backgroundColor: '#A0A0A0' }
let factor = 0.1 let factor = 0.1
//has 2 col value //has 2 col value
if(subElem.length > 1) { if (subElem.length > 1) {
value = data(subElem[1]).text().trim().replace(/\s\s+/g, ' ') value = data(subElem[1])
interValue = data(subElem[0]).text().trim().replace(/\s\s+/g, ' ') .text()
} .trim()
else { .replace(/\s\s+/g, ' ')
value = data(subElem[0]).text().trim().replace(/\s\s+/g, ' ') interValue = data(subElem[0])
.text()
.trim()
.replace(/\s\s+/g, ' ')
} else {
value = data(subElem[0])
.text()
.trim()
.replace(/\s\s+/g, ' ')
optsRight.colspan = 2 optsRight.colspan = 2
} }
//has no col value //has no col value
if(value === '') { if (value === '') {
optsLeft = {colspan: 3} optsLeft = { colspan: 3 }
factor = 0.3 factor = 0.3
} }
//make row //make row
let row = table.row({padding: factor * pdf.cm}) let row = table.row({ padding: factor * pdf.cm })
row.cell(key,optsLeft) row.cell(key, optsLeft)
if(interValue !== '') { if (interValue !== '') {
row.cell(interValue,optsCenter) row.cell(interValue, optsCenter)
} }
if(value !== '') { if (value !== '') {
row.cell(value,optsRight) row.cell(value, optsRight)
} }
} }
}) })
doc.end(); doc.end()
return doc; return doc
} }