pdf generation with digital sign

This commit is contained in:
merelendor 2023-03-31 10:47:58 +03:00
parent 1bed391afc
commit c4d8128b67
15 changed files with 529 additions and 85 deletions

View File

@ -3,6 +3,7 @@ import { Cookies } from 'react-cookie';
import Router from 'next/router';
import moment from 'moment';
import { nSQL } from "@nano-sql/core";
import fileDownload from 'js-file-download';
import * as actionTypes from '../constants/actionTypes';
@ -62,7 +63,7 @@ export const updateQuestionnaire = ({ dispatch, questionnaire }) =>
});
}
export const downloadQuestionnaire = () =>
export const downloadQuestionnaire = (download = true) =>
{
console.log("ACTION", "questionnaireActions", "downloadQuestionnaire()", );
@ -72,21 +73,41 @@ export const downloadQuestionnaire = () =>
{
let cookies = new Cookies();
let cookies_list = cookies.getAll();
console.log("cookies_list", cookies_list);
const { questionnaire } = global.store.getState();
axios.post(`${ process.env.NEXT_PUBLIC_INT_API_HOST }/questionnaire/check`, {}, {
console.log("questionnaire", questionnaire);
const { main, contacts, signatory_person, founded_persons, head_person, non_profit, } = questionnaire;
const playload = { main, contacts, signatory_person, founded_persons, head_person, non_profit, };
console.log({ playload });
/* axios.post(`${ process.env.NEXT_PUBLIC_INT_API_HOST }/questionnaire/download`, { questionnaire: playload }, {
headers: {
"Authorization": `Bearer ${ cookies_list.jwt }`,
},
//withCredentials: true,
})
*/
axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/questionnaire/download`, { questionnaire: playload }, {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/pdf'
},
responseType: 'arraybuffer',
})
.then((response) =>
{
console.log("downloadQuestionnaire", "response.data");
console.log(response.data);
console.log("downloaded?");
if(download)
{
console.log("downloadQuestionnaire", "response.data");
fileDownload(response.data, response.headers.filename);
resolve();
}
else
{
resolve({ file: response.data, filename: response.headers.filename });
}
//dispatch({ type: actionTypes.SUPPORT_APPEALS, data: { appeals: { list: response.data.appeals, new: response.data.new, } } });
resolve();
})
.catch((error) =>
{

View File

@ -1,9 +1,11 @@
import React from "react";
import Link from "next/link";
import { getCertificates, isPluginCryptoProInstalled } from "../../../utils/digital_signature";
import { SpinnerCircular } from "spinners-react";
import moment from "moment";
import fileDownload from 'js-file-download';
import { getCertificates, isPluginCryptoProInstalled, generateSignature } from "../../../utils/digital_signature";
import { downloadQuestionnaire } from "../../../actions";
export default class DigitalSignaturesList extends React.Component
{
constructor(props)
@ -73,7 +75,42 @@ export default class DigitalSignaturesList extends React.Component
_sign = () =>
{
alert("Подписание ЭЦП и отправка данных");
downloadQuestionnaire(false)
.then(({ filedata, filename }) =>
{
//let created_at = moment().format('DD-MM-yyyy');
//let filename = `Коммерческое предложение №${this.props.proposal.proposalId} от ${createAt}.docx`
let file = new File([ filedata ], filename);
console.log("this.state", this.state);
generateSignature(file, this.state.certificate_selected.certificate)
.then(signature => {
console.log("signature");
console.log(signature);
fileDownload(signature, `${ filename }.sig`);
fileDownload(filedata, filename);
alert("Подписание ЭЦП прошло успешно.");
});
})
.catch((e) =>
{
console.error("exception on sign");
console.error(e);
let errorsText = {
'The action was cancelled by the user. (0x8010006E)': 'Подписание было отменено',
'Key does not exist. (0x8009000D)': 'Сертификата не существует',
'Keyset does not exist (0x80090016)': 'Набор ключей не существует',
'File upload error': 'Ошибка загрузки файла',
'Invalid algorithm specified. (0x80090008)': 'На вашем компьютере не установлена программа «КриптоПро CSP»',
'The card cannot be accessed because the wrong PIN was presented. (0x8010006B)': 'Указанный пароль неверный'
}
let errorText = errorsText[e.message] || 'Ошибка подписания файла';
alert(errorText);
});
}
render()
@ -105,8 +142,8 @@ export default class DigitalSignaturesList extends React.Component
hidden=""
id={ `certificate_${ certificate.index }` }
name={ `certificate_${ certificate.index }` }
checked={ certificate_selected === certificate.index ? true : false }
onChange={ () => { this.setState({ certificate_selected: certificate.index }) } }
checked={ certificate_selected !== undefined && certificate_selected.index === certificate.index ? true : false }
onChange={ () => { this.setState({ certificate_selected: certificate }) } }
/>
<label htmlFor={ `certificate_${ certificate.index }` }>
<div className="feed_item user">

View File

@ -25,7 +25,7 @@ class Form_2_Contacts extends QuestionnaireForm
loading: false,
fact_address: {
name: "",
title: "",
fias_id: "",
},
legal_address: {
@ -33,7 +33,7 @@ class Form_2_Contacts extends QuestionnaireForm
fias_id: "",
},
postal_address: {
name: "",
title: "",
fias_id: "",
},
},
@ -74,7 +74,7 @@ class Form_2_Contacts extends QuestionnaireForm
if(contacts.address_type === "fact")
{
if(contacts.fact_address.name === "")
if(contacts.fact_address.title === "")
{
return true;
}
@ -82,7 +82,7 @@ class Form_2_Contacts extends QuestionnaireForm
if(contacts.address_type === "postal")
{
if(contacts.postal_address.name === "")
if(contacts.postal_address.title === "")
{
return true;
}

View File

@ -64,7 +64,10 @@ class Form_3_Signer extends QuestionnaireForm
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",
@ -97,7 +100,10 @@ class Form_3_Signer extends QuestionnaireForm
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",
@ -131,6 +137,24 @@ class Form_3_Signer extends QuestionnaireForm
{
}
_handle_onCitizenshipChange = (name, value) =>
{
console.log("_handle_onCitizenshipChange", value);
let citizenship = undefined;
for(let i in citizenships)
{
if(parseInt(citizenships[i].value, 10) === parseInt(value, 10))
{
citizenship = citizenships[i].label;
}
}
this._handle_onFieldChange(name, {
title: citizenship,
code: value,
});
}
_handle_onFormSubmit = (event) =>
{
event.preventDefault();
@ -225,7 +249,7 @@ class Form_3_Signer extends QuestionnaireForm
"identity_document.icode",
"identity_document.issueby",
"identity_document.placebirth",
"identity_document.citizenship_code",
"identity_document.citizenship.code",
"identity_document.registration_address.title",
];
@ -287,11 +311,11 @@ class Form_3_Signer extends QuestionnaireForm
const { main, head_person, signatory_person } = this.state;
let head_person_citizenship = undefined;
if(head_person.identity_document.citizenship_code !== "")
if(head_person.identity_document.citizenship.code !== "")
{
for(let i in citizenships)
{
if(parseInt(citizenships[i].value, 10) === parseInt(head_person.identity_document.citizenship_code, 10))
if(parseInt(citizenships[i].value, 10) === parseInt(head_person.identity_document.citizenship.code, 10))
{
head_person_citizenship = citizenships[i];
}
@ -299,11 +323,11 @@ class Form_3_Signer extends QuestionnaireForm
}
let signatory_person_citizenship = undefined;
if(signatory_person.identity_document.citizenship_code !== "")
if(signatory_person.identity_document.citizenship.code !== "")
{
for(let i in citizenships)
{
if(parseInt(citizenships[i].value, 10) === parseInt(signatory_person.identity_document.citizenship_code, 10))
if(parseInt(citizenships[i].value, 10) === parseInt(signatory_person.identity_document.citizenship.code, 10))
{
signatory_person_citizenship = citizenships[i];
}
@ -427,8 +451,8 @@ class Form_3_Signer extends QuestionnaireForm
<div className="form_field">
<label>Гражданство</label>
<Select
id="head_person.identity_document.citizenship_code"
name="head_person.identity_document.citizenship_code"
id="head_person.identity_document.citizenship"
name="head_person.identity_document.citizenship"
options={ citizenships }
placeholder="Выберите страну"
noOptionsMessage={ ({ inputValue }) => !inputValue ? noOptionsText :"Ничего не найдено" }
@ -436,7 +460,7 @@ class Form_3_Signer extends QuestionnaireForm
className="autocomlete"
classNamePrefix="react-select"
value={ head_person_citizenship }
onChange={ (element) => this._handle_onTextFieldChange("head_person.identity_document.citizenship_code", element.value) }
onChange={ (element) => this._handle_onCitizenshipChange(`head_person.identity_document.citizenship`, element.value) }
required={ true }
disabled={ checking }
/>
@ -789,8 +813,8 @@ class Form_3_Signer extends QuestionnaireForm
<div className="form_field">
<label>Гражданство</label>
<Select
id="signatory_person.identity_document.citizenship_code"
name="signatory_person.identity_document.citizenship_code"
id="signatory_person.identity_document.citizenship"
name="signatory_person.identity_document.citizenship"
options={ citizenships }
placeholder="Выберите страну"
noOptionsMessage={ ({ inputValue }) => !inputValue ? noOptionsText :"Ничего не найдено" }
@ -798,7 +822,7 @@ class Form_3_Signer extends QuestionnaireForm
className="autocomlete"
classNamePrefix="react-select"
value={ signatory_person_citizenship }
onChange={ (element) => this._handle_onTextFieldChange("signatory_person.identity_document.citizenship_code", element.value) }
onChange={ (element) => this._handle_onCitizenshipChange(`signatory_person.identity_document.citizenship`, element.value) }
required={ true }
disabled={ checking }
/>

View File

@ -21,17 +21,36 @@ class ShareholderForm extends React.Component
{
_handle_onTextFieldChange = this.props._handle_onTextFieldChange;
_handle_onCheckboxFieldChange = this.props._handle_onCheckboxFieldChange;
_handle_onFieldChange = this.props._handle_onFieldChange;
_handle_onCitizenshipChange = (name, value) =>
{
console.log("_handle_onCitizenshipChange", value);
let citizenship = undefined;
for(let i in citizenships)
{
if(parseInt(citizenships[i].value, 10) === parseInt(value, 10))
{
citizenship = citizenships[i].label;
}
}
this._handle_onFieldChange(name, {
title: citizenship,
code: value,
});
}
render()
{
const { index, shareholder, checking } = this.props;
let citizenship = undefined;
if(shareholder.identity_document.citizenship_code !== "")
if(shareholder.identity_document.citizenship.code !== "")
{
for(let i in citizenships)
{
if(parseInt(citizenships[i].value, 10) === parseInt(shareholder.identity_document.citizenship_code, 10))
if(parseInt(citizenships[i].value, 10) === parseInt(shareholder.identity_document.citizenship.code, 10))
{
citizenship = citizenships[i];
}
@ -203,16 +222,16 @@ class ShareholderForm extends React.Component
<div className="form_field">
<label>Гражданство</label>
<Select
id={ `founded_persons[${ index }].identity_document.citizenship_code` }
name={ `founded_persons[${ index }].identity_document.citizenship_code` }
id={ `founded_persons[${ index }].identity_document.citizenship` }
name={ `founded_persons[${ index }].identity_document.citizenship` }
value={ citizenship }
options={ citizenships }
options={ [ ...citizenships ] }
placeholder="Выберите страну"
noOptionsMessage={ ({ inputValue }) => !inputValue ? noOptionsText :"Ничего не найдено" }
isSearchable={ true }
className="autocomlete"
classNamePrefix="react-select"
onChange={ (element) => this._handle_onTextFieldChange(`founded_persons[${ index }].identity_document.citizenship_code`, element.value) }
onChange={ (element) => this._handle_onCitizenshipChange(`founded_persons[${ index }].identity_document.citizenship`, element.value) }
required={ true }
disabled={ checking }
/>
@ -376,7 +395,7 @@ class Shareholder extends React.Component
value="1"
id={ `founded_persons[${ index }].is_beneficial_1` }
name={ `founded_persons[${ index }].is_beneficial` }
checked={ shareholder.is_beneficial ? false : true }
checked={ shareholder.is_beneficial ? true : false }
onChange={ (event) => this._handle_onCheckboxFieldChange(event.target.name, parseInt(event.target.value, 10)) }
/>
<label className="unselectable" htmlFor={ `founded_persons[${ index }].is_beneficial_1` }>Да</label>
@ -407,7 +426,39 @@ class Form_4_Shareholders extends QuestionnaireForm
super(props);
this.state = {
founded_persons: [],
founded_persons_template: {},
founded_persons_template: {
signatory_id: null,
lastname: "",
firstname: "",
middlename: "",
no_middle_name: false,
jobtitle: "",
telephone: "",
email: "",
founder_from_list: true,
founder_number: 0,
founder_part: "",
is_beneficial: false,
identity_document:
{
doctype: "",
seria: "",
docnumber: "",
issuedate: "",
icode: "",
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",
}
}
},
loading: false,
};
}
@ -416,13 +467,14 @@ class Form_4_Shareholders extends QuestionnaireForm
{
return {
founded_persons: nextProps.questionnaire.founded_persons,
founded_persons_template: nextProps.questionnaire.founded_persons_template,
};
}
componentDidMount()
{
const { founded_persons_template } = this.state;
console.log("Form_4_Shareholders", "this.state", this.state);
console.log("Form_4_Shareholders", "global.store.getState()", global.store.getState());
const founded_persons_template = JSON.parse(JSON.stringify(this.state.founded_persons_template));
if(this.state.founded_persons.length === 0)
{
@ -434,12 +486,16 @@ class Form_4_Shareholders extends QuestionnaireForm
_handle_onAddShareholder = () =>
{
console.log("_handle_onAddShareholder");
const founded_persons = [ ...this.state.founded_persons ];
const { founded_persons_template } = this.state;
const founded_persons_template = JSON.parse(JSON.stringify(this.state.founded_persons_template));
console.log("_handle_onAddShareholder", { founded_persons_template });
if(founded_persons.length < 4)
{
founded_persons.push({ ...founded_persons_template });
founded_persons.push(founded_persons_template);
this._updateQuestionnaire({
founded_persons,
@ -460,11 +516,17 @@ class Form_4_Shareholders extends QuestionnaireForm
_handle_onClearSignatorySelection = (name, values) =>
{
this._handle_onFieldChange(name, { ...this.state.founded_persons_template , ...values } );
const founded_persons_template = JSON.parse(JSON.stringify(this.state.founded_persons_template));
const update = { ...founded_persons_template , ...values };
console.log("_handle_onClearSignatorySelection", update);
this._handle_onFieldChange(name, update );
}
_handle_onChangeSignatorySelection = (name, values) =>
{
console.log("_handle_onChangeSignatorySelection");
console.log(name, values);
this._handle_onFieldChange(name, { ...values } );
}
@ -498,7 +560,7 @@ class Form_4_Shareholders extends QuestionnaireForm
"identity_document.icode",
"identity_document.issueby",
"identity_document.placebirth",
"identity_document.citizenship_code",
"identity_document.citizenship.code",
"identity_document.registration_address.title",
];
@ -563,6 +625,7 @@ class Form_4_Shareholders extends QuestionnaireForm
address={ address }
_handle_onTextFieldChange={ this._handle_onTextFieldChange }
_handle_onCheckboxFieldChange={ this._handle_onCheckboxFieldChange }
_handle_onFieldChange={ this._handle_onFieldChange }
removeShareholder={ this._handle_onRemoveShareholder }
clearSignatorySelection={ this._handle_onClearSignatorySelection }
changeSignatorySelection={ this._handle_onChangeSignatorySelection }

View File

@ -37,7 +37,6 @@ class Form_7_Check extends QuestionnaireForm
head_person_files: [],
signatory_person: {},
signatory_person_files: [],
founded_persons_template: {},
founded_persons: [],
client_contacts: {},
non_profit: {},
@ -55,7 +54,6 @@ class Form_7_Check extends QuestionnaireForm
head_person_files: nextProps.head_person_files,
signatory_person: nextProps.signatory_person,
signatory_person_files: nextProps.signatory_person_files,
founded_persons_template: nextProps.founded_persons_template,
founded_persons: nextProps.founded_persons,
client_contacts: nextProps.client_contacts,
non_profit: nextProps.non_profit,

BIN
lib/evo_anketa.pdf Normal file

Binary file not shown.

BIN
lib/evo_anketa_old.pdf Normal file

Binary file not shown.

BIN
lib/noto.ttf Normal file

Binary file not shown.

BIN
lib/roboto.ttf Normal file

Binary file not shown.

View File

@ -93,5 +93,5 @@ module.exports = withImages(withFonts(withLess({
//},
],
}
}
},
})));

View File

@ -11,6 +11,7 @@
"dependencies": {
"@mpth/react-no-ssr": "^1.0.1",
"@nano-sql/core": "^2.3.7",
"@pdf-lib/fontkit": "^1.1.1",
"async": "^3.2.2",
"axios": "^0.24.0",
"cookie": "^0.4.1",
@ -33,6 +34,7 @@
"nextjs-cors": "^2.1.0",
"node-fetch": "^3.3.1",
"numeral": "^2.0.6",
"pdf-lib": "^1.17.1",
"pluralize-ru": "^1.0.1",
"qs": "^6.10.1",
"react": "17.0.2",

View File

@ -6,12 +6,116 @@ import moment from 'moment';
import jwt from 'jsonwebtoken';
import { cors } from '../../../lib/cors';
import { inspect } from 'util';
import fs from 'fs';
import { PDFDocument } from 'pdf-lib';
import fontkit from '@pdf-lib/fontkit';
const fields = {
main: {
title: { name: "main_title", type: "text", bind: null, },
inn: { name: "main_inn", type: "text", bind: null, },
kpp: { name: "main_kpp", type: "text", bind: null, },
email: { name: "main_email", type: "text", bind: null, },
telephone: { name: "main_telephone", type: "text", bind: null, },
websiteurl: { name: "main_website", type: "text", bind: null, },
financial_loan: { name: "main_financial_loan", type: "text", bind: null, },
individual_executive_oop: { name: "ruler_title", type: "text", bind: null },
individual_executive_inn: { name: "ruler_inn", type: "text", bind: null },
individual_executive_kpp: { name: "ruler_kpp", type: "text", bind: null },
individual_executive_docnum: { name: "ruler_docnum", type: "text", bind: null },
individual_executive_docdate: { name: "ruler_docdate", type: "text", bind: null, date: true },
high_level: { name: "execution_high", type: "text", bind: null, size: 6 },
board_of_directors: { name: "execution_counsil", type: "text", bind: null, size: 6 },
collective_executive: { name: "execution_team", type: "text", bind: null, size: 6 },
individual_executive: { name: "execution_sole", type: "text", bind: null, size: 6 },
other_control: { name: "execution_another", type: "text", bind: null, size: 6 },
},
contacts: {
address_type: { name: "address_type", type: "radio", bind: null },
fact_address: { name: "address_fact", type: "text", bind: null },
postal_address: { name: "address_postal", type: "text", bind: null },
},
head_person: {
fullname: { name: "head_fullname", type: "text", bind: null },
jobtitle: { name: "head_jobtitle", type: "text", bind: null },
evo_assignment_date: { name: "head_date", type: "text", bind: null, date: true },
evo_credentials_dateend: { name: "head_dateend", type: "text", bind: null, date: true },
evo_indefinite: { name: "head_date_infinite", type: "checkbox", bind: null },
telephone: { name: "head_phone", type: "text", bind: null },
email: { name: "head_email", type: "text", bind: null },
},
signatory_person: {
fullname: { name: "signer_fullname", type: "text", bind: null },
jobtitle: { name: "signer_jobtitle", type: "text", bind: null },
signer_rule_basis: { name: "signer_reason", type: "text", bind: null },
docdate: { name: "signer_docdate", type: "text", bind: null, date: true },
docnumber: { name: "signer_docnum", type: "text", bind: null },
telephone: { name: "signer_phone", type: "text", bind: null },
email: { name: "signer_email", type: "text", bind: null },
},
founded_persons:
[
{
fullname: { name: "shareholder_1_fullname", type: "text", bind: null, size: 6 },
personal: { name: "shareholder_1_personal", type: "text", bind: null, size: 6 },
registration: { name: "shareholder_1_registration", type: "text", bind: null, size: 6 },
founder_part: { name: "shareholder_1_part", type: "text", bind: null, size: 6 },
is_beneficial: { name: "shareholder_1_ben", type: "radio", bind: null },
},
{
fullname: { name: "shareholder_2_fullname", type: "text", bind: null, size: 6 },
personal: { name: "shareholder_2_personal", type: "text", bind: null, size: 6 },
registration: { name: "shareholder_2_registration", type: "text", bind: null, size: 6 },
founder_part: { name: "shareholder_2_part", type: "text", bind: null, size: 6 },
is_beneficial: { name: "shareholder_2_ben", type: "radio", bind: null, size: 6 },
},
{
fullname: { name: "shareholder_3_fullname", type: "text", bind: null, size: 6 },
personal: { name: "shareholder_3_personal", type: "text", bind: null, size: 6 },
registration: { name: "shareholder_3_registration", type: "text", bind: null, size: 6 },
founder_part: { name: "shareholder_3_part", type: "text", bind: null, size: 6 },
is_beneficial: { name: "shareholder_3_ben", type: "radio", bind: null },
},
{
fullname: { name: "shareholder_4_fullname", type: "text", bind: null, size: 6 },
personal: { name: "shareholder_4_personal", type: "text", bind: null, size: 6 },
registration: { name: "shareholder_4_registration", type: "text", bind: null, size: 6 },
founder_part: { name: "shareholder_4_part", type: "text", bind: null, size: 6 },
is_beneficial: { name: "shareholder_4_ben", type: "radio", bind: null },
},
],
non_profit: {
fin_source_business: { name: "nko_revenue", type: "checkbox", bind: null },
fin_source_donate: { name: "nko_donation", type: "checkbox", bind: null },
fin_source_fees: { name: "nko_members", type: "checkbox", bind: null },
fin_source_another: { name: "nko_another", type: "checkbox", bind: null },
fin_source_another_description: { name: "nko_another_description", type: "text", bind: null, size: 6 },
foreign_payers: { name: "external", type: "radio", bind: null },
fin_goals_cars: { name: "nko_object_cars", type: "text", bind: null, size: 6 },
fin_goals_trucks: { name: "nko_object_trucks", type: "text", bind: null, size: 6 },
fin_goals_special: { name: "nko_object_special", type: "text", bind: null, size: 6 },
},
};
function good(value)
{
if(value !== undefined && value !== null && value !== "")
{
return true;
}
return false;
}
export default async function handler(req, res)
{
console.log("API", "questionnaire", "get");
console.log(req.body);
console.log("-".repeat(50));
const { questionnaire } = req.body;
await cors(req, res);
if(req.headers.cookie !== undefined)
@ -23,11 +127,196 @@ export default async function handler(req, res)
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
res.status(200);
console.log("API", "download", "__dirname", __dirname);
const formPdfBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/evo_anketa.pdf`);
const fontBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/roboto.ttf`);
const pdfDoc = await PDFDocument.load(formPdfBytes);
pdfDoc.registerFontkit(fontkit);
const formFont = await pdfDoc.embedFont(fontBytes);
// Embed the Mario and emblem images
// Get the form containing all the fields
const form = pdfDoc.getForm();
//form.registerFontkit(fontkit);
for(let group in fields)
{
if(group === "founded_persons")
{
for(let p in questionnaire[group])
{
for(let field in fields[group][p])
{
if(field === "fullname")
{
fields[group][p][field].bind = form.getTextField(fields[group][p][field].name);
if(fields[group][p][field].size !== undefined) { fields[group][p][field].bind.setFontSize(fields[group][p][field].size); }
fields[group][p][field].bind.setText(`${ questionnaire[group][p].lastname.toUpperCase() } ${ questionnaire[group][p].firstname.toUpperCase() }${ good(questionnaire[group][p].middlename) ? ` ${ questionnaire[group][p].middlename.toUpperCase() }` : "" }`);
}
else if(field === "personal")
{
const { citizenship, doctype, seria, docnumber, icode, issueby, issuedate, } = questionnaire[group][p].identity_document;
fields[group][p][field].bind = form.getTextField(fields[group][p][field].name);
if(fields[group][p][field].size !== undefined) { fields[group][p][field].bind.setFontSize(fields[group][p][field].size); }
fields[group][p][field].bind.setText(`Гражданство: ${ citizenship.title }, паспорт ${ seria } ${ docnumber }, выдан \n${ issueby }, ${ icode } ${ moment(issuedate).format("DD.MM.YYYY") }`.toUpperCase());
}
else if(field === "registration")
{
const { registration_address, } = questionnaire[group][p].identity_document;
if(good(registration_address.title))
{
fields[group][p][field].bind = form.getTextField(fields[group][p][field].name);
if(fields[group][p][field].size !== undefined) { fields[group][p][field].bind.setFontSize(fields[group][p][field].size); }
fields[group][p][field].bind.setText(registration_address.title.toUpperCase());
}
}
else
{
if(fields[group][p][field].type === "checkbox")
{
if(questionnaire[group][p][field])
{
fields[group][p][field].bind = form.getCheckBox(fields[group][p][field].name);
fields[group][p][field].bind.check();
}
}
else if(fields[group][p][field].type === "radio")
{
if(questionnaire[group][p][field] !== undefined)
{
fields[group][p][field].bind = form.getRadioGroup(fields[group][p][field].name);
let options = fields[group][p][field].bind.getOptions();
if(questionnaire[group][p][field])
{
fields[group][p][field].bind.select("yes");
}
else
{
fields[group][p][field].bind.select("no");
}
}
}
else
{
if(good(questionnaire[group][p][field]))
{
fields[group][p][field].bind = form.getTextField(fields[group][p][field].name);
if(fields[group][p][field].size !== undefined) { fields[group][p][field].bind.setFontSize(fields[group][p][field].size); }
fields[group][p][field].bind.setText(questionnaire[group][p][field]);
}
}
}
}
}
continue;
}
else
{
for(let field in fields[group])
{
if(field === "fullname")
{
fields[group][field].bind = form.getTextField(fields[group][field].name);
if(fields[group][field].size !== undefined) { fields[group][field].bind.setFontSize(fields[group][field].size); }
fields[group][field].bind.setText(`${ questionnaire[group].lastname.toUpperCase() } ${ questionnaire[group].firstname.toUpperCase() }${ good(questionnaire[group].middlename) ? ` ${ questionnaire[group].middlename.toUpperCase() }` : "" }`);
}
else if(field === "postal_address")
{
if(good(questionnaire[group].postal_address.title))
{
fields[group][field].bind = form.getTextField(fields[group][field].name);
if(fields[group][field].size !== undefined) { fields[group][field].bind.setFontSize(fields[group][field].size); }
fields[group][field].bind.setText(questionnaire[group].postal_address.title.toUpperCase());
}
}
else if(field === "fact_address")
{
if(good(questionnaire[group].fact_address.title))
{
fields[group][field].bind = form.getTextField(fields[group][field].name);
if(fields[group][field].size !== undefined) { fields[group][field].bind.setFontSize(fields[group][field].size); }
fields[group][field].bind.setText(questionnaire[group].fact_address.title.toUpperCase());
}
}
else if(field === "address_type")
{
fields[group][field].bind = form.getRadioGroup(fields[group][field].name);
fields[group][field].bind.select(questionnaire[group].address_type);
}
/*
else if(field === "foreign_payers")
{
pdf_params[fields[group][field]] = questionnaire[group].foreign_payers ? 0 : 1;
}
*/
else
{
if(fields[group][field].type === "checkbox")
{
if(questionnaire[group][field])
{
fields[group][field].bind = form.getCheckBox(fields[group][field].name);
fields[group][field].bind.check();
}
}
else if(fields[group][field].type === "radio")
{
if(questionnaire[group][field] !== undefined)
{
fields[group][field].bind = form.getRadioGroup(fields[group][field].name);
if(questionnaire[group][field])
{
fields[group][field].bind.select("yes");
}
else
{
fields[group][field].bind.select("no");
}
}
}
else
{
if(good(questionnaire[group][field]))
{
fields[group][field].bind = form.getTextField(fields[group][field].name);
if(fields[group][field].size !== undefined) { fields[group][field].bind.setFontSize(fields[group][field].size); }
if(fields[group][field].date)
{
fields[group][field].bind.setText(moment(questionnaire[group][field]).format("DD.MM.YYYY"));
}
else
{
fields[group][field].bind.setText(questionnaire[group][field].toUpperCase());
}
}
}
}
}
}
}
form.updateFieldAppearances(formFont);
const pdfBytes = await pdfDoc.save();
//responseType: 'blob',
//fs.writeFileSync(`${ __dirname }/../../../../../upload/${ client_jwt_decoded.acc_number }_anketa.pdf`, pdfBytes);
//res.setHeader('Content-Type', 'application/pdf');
//res.send(pdfBytes);
console.log("pdfBytes.size", pdfBytes, pdfBytes.byteLength);
res.setHeader("filename", `${ client_jwt_decoded.acc_number }_anketa.pdf`);
res.setHeader('Content-Type', 'application/pdf');
res.send(Buffer.from(pdfBytes));
//res.setHeader('Content-Type', 'application/pdf');
//res.status(200).send(pdfBytes);
}
else
{
res.status(403);
res.status(403).send();
}
}
}

View File

@ -154,11 +154,11 @@ export const defaultState = {
fias_id: "",
},
fact_address: {
name: "",
title: "",
fias_id: "",
},
postal_address: {
name: "",
title: "",
fias_id: "",
},
},
@ -179,7 +179,10 @@ export const defaultState = {
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",
@ -213,7 +216,10 @@ export const defaultState = {
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",
@ -221,36 +227,6 @@ export const defaultState = {
}
},
signatory_person_files: [],
founded_persons_template: {
signatory_id: null,
lastname: "",
firstname: "",
middlename: "",
no_middle_name: false,
jobtitle: "",
telephone: "",
email: "",
founder_from_list: true,
founder_number: 0,
founder_part: "",
is_beneficial: false,
identity_document:
{
doctype: "",
seria: "",
docnumber: "",
issuedate: "",
icode: "",
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
registration_address: {
title: "",
fias_id: "",
}
}
},
founded_persons: [],
client_contacts: {
lastname: "",
@ -278,7 +254,10 @@ export const defaultState = {
issueby: "",
issueby_search_dadata: "",
placebirth: "",
citizenship_code: "",
citizenship: {
title: "",
code: "",
},
registration_address: {
title: "",
fias_id: "",

View File

@ -360,6 +360,27 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@pdf-lib/fontkit@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@pdf-lib/fontkit/-/fontkit-1.1.1.tgz#f18473892b65e3253eb73f4569785abd2c03b1e0"
integrity sha512-KjMd7grNapIWS/Dm0gvfHEilSyAmeLvrEGVcqLGi0VYebuqqzTbgF29efCx7tvx+IEbG3zQciRSWl3GkUSvjZg==
dependencies:
pako "^1.0.6"
"@pdf-lib/standard-fonts@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz#8ba691c4421f71662ed07c9a0294b44528af2d7f"
integrity sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==
dependencies:
pako "^1.0.6"
"@pdf-lib/upng@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@pdf-lib/upng/-/upng-1.0.1.tgz#7dc9c636271aca007a9df4deaf2dd7e7960280cb"
integrity sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==
dependencies:
pako "^1.0.10"
"@restart/hooks@^0.4.5":
version "0.4.7"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39"
@ -3028,7 +3049,7 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pako@~1.0.5:
pako@^1.0.10, pako@^1.0.11, pako@^1.0.6, pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
@ -3107,6 +3128,16 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
pdf-lib@^1.17.1:
version "1.17.1"
resolved "https://registry.yarnpkg.com/pdf-lib/-/pdf-lib-1.17.1.tgz#9e7dd21261a0c1fb17992580885b39e7d08f451f"
integrity sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==
dependencies:
"@pdf-lib/standard-fonts" "^1.0.0"
"@pdf-lib/upng" "^1.0.1"
pako "^1.0.11"
tslib "^1.11.1"
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
@ -3932,7 +3963,7 @@ tsconfig-paths@^3.14.1:
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@^1.8.1:
tslib@^1.11.1, tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==