questionnaire licenses

This commit is contained in:
merelendor 2023-06-11 20:43:37 +03:00
parent cbf09433d1
commit 99c4ebffb0
8 changed files with 240 additions and 41 deletions

View File

@ -54,7 +54,6 @@ export const getQuestionnaire = ({ dispatch, id }) =>
{
//console.log("ACTION", "questionnaire", "getQuestionnaire()", "response", response.data);
const founder_persons_template = {
signatory_id: null,
lastname: "",
@ -224,6 +223,7 @@ export const getQuestionnaire = ({ dispatch, id }) =>
questionnaire.main.is_individual_executive = true;
}
questionnaire.licenses = response.data.licenses;
//questionnaire.founder_persons = { ...questionnaire.head_person, ...response.data.head_person };
//console.log("questionnairequestionnairequestionnaire FROM JSON", questionnaire);
@ -445,8 +445,8 @@ export const downloadQuestionnaire = ({ filename, download = true, base64 = fals
//console.log("questionnaire", questionnaire);
const { main, contacts, signatory_person, founder_persons, head_person, non_profit, } = questionnaire;
const payload = { main, contacts, signatory_person, founder_persons, head_person, non_profit, };
const { main, contacts, signatory_person, founder_persons, head_person, non_profit, licenses, } = questionnaire;
const payload = { main, contacts, signatory_person, founder_persons, head_person, non_profit, licenses };
//console.log({ payload });

View File

@ -55,6 +55,7 @@ class Form_1_Main extends QuestionnaireForm
fin_goals_trucks: "",
fin_goals_special: "",
},
licenses: null,
step: 1,
status: "empty",
loading: false,
@ -63,12 +64,14 @@ class Form_1_Main extends QuestionnaireForm
this.ref_form = React.createRef();
this.ref_submit = React.createRef();
this.ref_licenses_field = React.createRef();
}
static getDerivedStateFromProps(nextProps, prevState)
{
return {
main: nextProps.questionnaire.main,
licenses: nextProps.questionnaire.licenses,
step: nextProps.questionnaire.step,
status: nextProps.questionnaire.status,
};
@ -76,6 +79,26 @@ class Form_1_Main extends QuestionnaireForm
componentDidMount()
{
const { licenses } = this.state;
//if(licenses !== null && licenses !== undefined && licenses !== "")
//{
this.ref_licenses_field.current.style.height = (this.ref_licenses_field.current.scrollHeight + 10) + "px";
//}
}
componentDidUpdate(prevProps, prevState)
{
if(this.ref_licenses_field.current.scrollHeight - parseInt(this.ref_licenses_field.current.style.height, 10) > 6)
{
this.ref_licenses_field.current.style.height = (this.ref_licenses_field.current.scrollHeight + 6) + "px";
}
else
{
if(this.ref_licenses_field.current.scrollHeight - parseInt(this.ref_licenses_field.current.style.height, 10) > 6)
{
this.ref_licenses_field.current.style.height = (this.ref_licenses_field.current.scrollHeight + 6) + "px";
}
}
}
_handle_onNextPage = (event) =>
@ -87,6 +110,7 @@ class Form_1_Main extends QuestionnaireForm
const { main } = this.state;
const { company } = this.props;
const check = ["title", "inn", "kpp", "email", "telephone", "financial_loan"];
if(company.inn.length > 10)
{
check.splice(check.indexOf("kpp"), 1);
@ -170,7 +194,7 @@ class Form_1_Main extends QuestionnaireForm
render()
{
const { company, checking } = this.props;
const { loading, main, status, errors, } = this.state;
const { loading, main, licenses, status, errors, } = this.state;
const firstLetter = /(?!.*[DFIOQU])[A-VXY]/i;
const letter = /(?!.*[DFIOQU])[A-Z]/i;
const digit = /[0-9]/;
@ -298,6 +322,22 @@ class Form_1_Main extends QuestionnaireForm
<p>сумма текущих ежемесячных платежей по действующим кредитам/договорам лизинга</p>
</div>
<div className="form_field" style={{ alignItems: "flex-start" }}>
<label>Информация о лицензиях</label>
<textarea
style={{ fontSize: "14px" }}
ref={ this.ref_licenses_field }
className={ errors.indexOf("licenses") > -1 ? "error" : "" }
id="licenses"
name="licenses"
placeholder="Укажите, если деятельность подлежит лицензированию"
onChange={ (event) => { this._removeError("licenses"); this._handle_onTextFieldChange(event.target.name, event.target.value); } }
required={ true }
disabled={ checking }
defaultValue={ this._checkStrValue(licenses) }
/>
</div>
{ company.inn.length < 11 && (
<div className="form_field">
<label><b>Организация является НКО</b></label>

BIN
lib/evo_anketa_v2.pdf Normal file

Binary file not shown.

View File

@ -109,6 +109,7 @@ const fields = {
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 },
},
licenses: { name: "licenses", type: "text", bind: null, size: 6 },
};
function good(value)
@ -128,6 +129,8 @@ export default async function handler(req, res)
console.log("-".repeat(50));
const { questionnaire, filename, base64 } = req.body;
console.log("API", "questionnaire", "get", { questionnaire });
await cors(req, res);
if(req.headers.cookie !== undefined)
@ -140,7 +143,7 @@ export default async function handler(req, res)
var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
console.log("API", "download", "__dirname", __dirname);
const formPdfBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/evo_anketa.pdf`);
const formPdfBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/evo_anketa_v2.pdf`);
const fontBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/roboto.ttf`);
const pdfDoc = await PDFDocument.load(formPdfBytes);
@ -151,7 +154,13 @@ export default async function handler(req, res)
for(let group in fields)
{
if(group === "founder_persons")
if(group === "licenses")
{
fields[group].bind = form.getTextField(fields[group].name);
if(fields[group].size !== undefined) { fields[group].bind.setFontSize(fields[group].size); }
fields[group].bind.setText(`${ questionnaire[group] }`);
}
else if(group === "founder_persons")
{
for(let p in questionnaire[group])
{

View File

@ -1,62 +1,126 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import https from 'https';
import axios from 'axios';
import { Cookies } from 'react-cookie';
import cookie from 'cookie';
import moment from 'moment';
import jwt from 'jsonwebtoken';
import { cors } from '../../../lib/cors';
import { inspect } from 'util';
import { get as _get, pick as _pick } from 'lodash';
import { cors } from '../../../lib/cors';
const keepAliveAgent = new https.Agent({ keepAlive: true });
export default async function handler(req, res)
{
console.log("API", "questionnaire", "get");
await cors(req, res);
if(req.headers.cookie !== undefined)
return new Promise((resolve) =>
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
if(cookies.jwt !== undefined && cookies.jwt !== null)
if(req.headers.cookie !== undefined)
{
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 });
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
const path = `${ process.env.CRM_API_HOST }/lk/Questionnaire/InfoQuestionnaire/`;
try
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
const { id } = req.query;
await axios.get(path, {
params: { name: id },
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
}
})
.then((crm_response) =>
{
console.log("crm_response for", path);
console.log(inspect(crm_response.data, true, null, true));
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).json(crm_response.data);
})
.catch((error) =>
{
console.error(error);
console.error("-".repeat(30), "error.response.data:");
console.error(error.response.data);
const path = `${ process.env.CRM_API_HOST }/lk/Questionnaire/InfoQuestionnaire/`;
res.status(500).json(error.response.data);
});
try
{
const { id } = req.query;
axios.get(path, {
params: { name: id },
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
}
})
.then((crm_response) =>
{
console.log("crm_response for", path);
console.log(inspect(crm_response.data, true, null, true));
if(crm_response.data.licenses === null)
{
axios.post(`https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party`, { query: crm_response.data.inn }, {
httpAgent: keepAliveAgent,
headers: {
"Content-Type": "application/json",
"Authorization": `Token ${ process.env.DADATA_API_KEY }`,
"X-Secret": process.env.DADATA_SECRET_KEY
},
})
.then((api_response) =>
{
console.log("API", "RESPONSE", "licenses");
console.log(api_response.data.suggestions[0].data.licenses);
const licenses_list = _get(api_response, "data.suggestions[0].data.licenses", []);
const licenses_chunks = [];
if(licenses_list !== null && licenses_list.length > 0)
{
for(let i in licenses_list)
{
licenses_chunks.push(
`${ licenses_list[i].series !== null ? licenses_list[i].series+" " : "" }${ licenses_list[i].number } от ${ moment(licenses_list[i].issue_date).format("DD.MM.YYYY") }`
);
}
}
if(licenses_chunks.length > 0)
{
crm_response.data.licenses = licenses_chunks.join(", ");
}
res.status(200).json(crm_response.data);
resolve();
})
.catch((error) =>
{
console.log("error");
console.error(error);
res.status(500).send();
resolve();
});
}
else
{
res.status(200).json(crm_response.data);
resolve();
}
})
.catch((error) =>
{
console.error(error);
console.error("-".repeat(30), "error.response.data:");
console.error(error.response.data);
res.status(500).json(error.response.data);
resolve();
});
}
catch(e)
{
console.error(e);
res.status(500).send(e);
}
}
catch(e)
else
{
console.error(e);
res.status(500).send(e);
res.status(403);
resolve();
}
}
else
{
res.status(403);
resolve();
}
}
});
}

View File

@ -0,0 +1,84 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import axios from 'axios';
import { Cookies } from 'react-cookie';
import cookie from 'cookie';
import moment from 'moment';
import jwt from 'jsonwebtoken';
import { inspect } from 'util';
import md5 from 'md5';
import { cors } from '../../../lib/cors';
import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
console.log("API", "questionnaire", "read");
await cors(req, res);
if(req.headers.cookie !== undefined)
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
console.log("cookies.jwt");
console.log(cookies.jwt);
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 });
try
{
const key = md5(`licenses_${ client_jwt_decoded.acc_number }`);
const licenses = await RedisClient.get(key);
if(licenses !== null)
{
console.log("JSON.parse(licenses)");
console.log(JSON.parse(licenses));
res.status(200).json(JSON.parse(licenses));
}
else
{
const { query, } = req.body;
axios.post(`https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party`, { query }, {
httpAgent: keepAliveAgent,
headers: {
"Content-Type": "application/json",
"Authorization": `Token ${ process.env.DADATA_API_KEY }`,
"X-Secret": process.env.DADATA_SECRET_KEY
},
})
.then((api_response) =>
{
console.log("API", "RESPONSE", "licenses");
console.log(api_response.data);
res.status(200).send(api_response.data);
resolve();
})
.catch((error) =>
{
console.log("error");
console.error(error);
res.status(500).send();
resolve();
});
}
}
catch(error)
{
console.error("error");
console.error(error);
res.status(500).send();
}
}
else
{
res.status(403);
}
}
}

View File

@ -217,6 +217,7 @@ export default async function handler(req, res)
} };
payload.financial_loan = checkNullEmpty(payload.financial_loan) ? parseFloat(payload.financial_loan.toString().replace(/[^0-9.]/g, '')) : null;
payload.licenses = parsed.licenses;
console.log({ id, path });
console.log("payload", "*".repeat(100));

View File

@ -126,7 +126,8 @@ export const questionnaire_template = {
sent: false,
filename: null,
filedate: null,
}
},
licenses: [],
};
export const defaultState = {