From e256a13523810f6ae4df5ddab8ff74f61087ac33 Mon Sep 17 00:00:00 2001 From: Schoumi Date: Mon, 15 Oct 2018 09:18:15 +0200 Subject: [PATCH] First version of pdf generation need some refactoring --- img.jpg | Bin 0 -> 9794 bytes src/index.js | 372 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 277 insertions(+), 95 deletions(-) create mode 100644 img.jpg diff --git a/img.jpg b/img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba7ec76706be95f1c548b0d3feccb45a4afa6114 GIT binary patch literal 9794 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 OxRPfo3)1~(@xK9d$dda2 literal 0 HcmV?d00001 diff --git a/src/index.js b/src/index.js index 748a6b1..efc368c 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,7 @@ const { } = require('cozy-konnector-libs') const moment = require('moment') const pdf = require('pdfjs') +const fs = require('fs') const request = requestFactory({ debug: false, @@ -23,27 +24,27 @@ const urssafUrl = 'https://www.ti.urssaf.fr/' module.exports = new BaseKonnector(start) async function start(fields) { - let accData = this.getAccountData(); - log('info', 'Authenticating ...'); + let accData = this.getAccountData() + log('info', 'Authenticating ...') //Auth and retrieve declaration URL const urlDeclaration = await authenticate( fields.siret, fields.lastname, fields.firstname, fields.password - ); - log('info', 'Successfully logged in'); + ) + log('info', 'Successfully logged in') - log('info', 'Get Declarations Parameters'); - let params = await getDeclarationsParameters(urlDeclaration); - log('info', 'Get Declaration '); - const declarationList = await buildDeclarationList(params); - const bills = await getAllDeclaration(params, declarationList, accData); + log('info', 'Get Declarations Parameters') + let params = await getDeclarationsParameters(urlDeclaration) + log('info', 'Get Declaration ') + const declarationList = await buildDeclarationList(params) + const bills = await getAllDeclaration(params, declarationList, accData) - await saveBills(bills,fields, { + await saveBills(bills, fields, { identifiers: ['net-entreprise'], contentType: 'application/pdf' - }); + }) } async function authenticate(siret, lastname, firstname, password) { @@ -153,7 +154,7 @@ async function getList(params, urlPart, subItem, splitPart) { async function getAllDeclaration(params, declarationList, accData) { let exist = Object.keys(accData).length > 0 - let bills = []; + let bills = [] if (!exist || accData.lastPeriod !== params.periode - 1) { let lastPeriod = declarationList.length if (exist) { @@ -163,11 +164,11 @@ async function getAllDeclaration(params, declarationList, accData) { for (let i = 0; i < lastPeriod; i++) { const bill = await getDeclaration(params, declarationList[i]) - bills.push(bill); - break; + bills.push(bill) + break } } - return bills; + return bills } async function getDeclaration(params, periode) { @@ -181,119 +182,300 @@ async function getDeclaration(params, periode) { method: 'POST', uri: `${urssafUrl}/action.histo_netmicro`, form: params - }); - let subData = scrape(data('#table-paiements-tldp .cellule_droite_middle'),{ + }) + let subData = scrape(data('#table-paiements-tldp .cellule_droite_middle'), { amount: { sel: 'span#libmtpai', parse: value => parseInt(value) } - }); - let bill = {}; - bill.amount = subData.amount; - subData = scrape(data,{ - date: { - sel: 'span.text_grand_gras', - } - },'.tableau_donnees_cons .cellule_droite_middle'); - subData = subData[3].date.substring(3).substring(0,10).trim(); - moment.locale('fr'); - subData = subData.split('/'); - 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; + }) + let bill = {} + bill.amount = subData.amount + subData = scrape( + data, + { + date: { + sel: 'span.text_grand_gras' + } + }, + '.tableau_donnees .cellule_droite_middle' + ) + subData = subData[3].date + .substring(3) + .substring(0, 10) + .trim() + moment.locale('fr') + subData = subData.split('/') + 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) { - 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 - const cell = doc.cell({ paddingBottom: 0.5 * 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é" + let table = doc.table({ widths: [140, 400], borderWidth: 0 }) + const img = new pdf.Image(fs.readFileSync('img.jpg')) + let row = table.row() + row.cell({ paddingTop: 0.5 * pdf.cm, paddingBottom: 0.5 * pdf.cm }).image(img) + 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, { font: require('pdfjs/font/Helvetica-Bold'), fontSize: 14 }) //first table - let element = data('.tableau_donnees_cons'); - 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'); + let tableau = data('.tableau_donnees') table = doc.table({ - widths: [340,60,140], + widths: [270, 270], 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') //parse table - subData.each((i,elem) => { + subData.each((i, elem) => { + const savedElem = elem elem = data(elem).children('td') - let key = data(elem[0]).text().trim() + let key = data(elem[0]) + .text() + .trim() //subtable - if(data(elem[0]).find('table').length > 0) { - return true; + if (data(elem).find('table').length > 1) { + 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 !== '') { - let subElem = data(elem[1]).find('span').parent() - let value = "" - let interValue = "" - let optsRight = {alignment: 'right'} - let optsCenter = {alignment: 'center'} - let optsLeft = {backgroundColor: '#A0A0A0'} + if (key !== '') { + let subElem = data(elem[1]) + .find('span') + .parent() + let value = '' + let interValue = '' + let optsRight = { alignment: 'right' } + let optsCenter = { alignment: 'center' } + let optsLeft = { backgroundColor: '#A0A0A0' } let factor = 0.1 //has 2 col value - if(subElem.length > 1) { - value = data(subElem[1]).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, ' ') + if (subElem.length > 1) { + value = data(subElem[1]) + .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 } //has no col value - if(value === '') { - optsLeft = {colspan: 3} + if (value === '') { + optsLeft = { colspan: 3 } factor = 0.3 } //make row - let row = table.row({padding: factor * pdf.cm}) - row.cell(key,optsLeft) - if(interValue !== '') { - row.cell(interValue,optsCenter) + let row = table.row({ padding: factor * pdf.cm }) + row.cell(key, optsLeft) + if (interValue !== '') { + row.cell(interValue, optsCenter) } - if(value !== '') { - row.cell(value,optsRight) + if (value !== '') { + row.cell(value, optsRight) } } - }) - - doc.end(); - return doc; + + doc.end() + return doc }