Merge branch 'master' of https://github.com/merelendor/evoleasing-account
This commit is contained in:
commit
085d5d1d27
@ -86,7 +86,7 @@ export default class DigitalCertificates extends React.Component
|
||||
{
|
||||
if(head_person[fields[i]] !== null && head_person[fields[i]] !== "")
|
||||
{
|
||||
if(cert_owner.indexOf(head_person[fields[i]].toUpperCase()) < 0)
|
||||
if(cert_owner.indexOf(head_person[fields[i]].toUpperCase().trim()) < 0)
|
||||
{
|
||||
owner_valid = false;
|
||||
}
|
||||
@ -267,16 +267,16 @@ export default class DigitalCertificates extends React.Component
|
||||
return (
|
||||
<React.Fragment>
|
||||
{ certificates_error === "NOT_INSTALLED" && (
|
||||
<FormMessage type="error" title="Ошибка" message={ <>Плагин КриптоПРО не установлен, <Link href="https://cryptopro.ru/products/cades/plugin"><a target="_blank" rel="noopener noreferrer" style={{ color: "white", textDecoration: "underline" }}>посмотрите инструкцию</a></Link> как установить плагин КриптоПРО.</> }/>
|
||||
<FormMessage type="moderate" title="Внимание" message={ <>Плагин КриптоПРО не установлен, <Link href="https://cryptopro.ru/products/cades/plugin"><a target="_blank" rel="noopener noreferrer" style={{ color: "white", textDecoration: "underline" }}>посмотрите инструкцию</a></Link> как установить плагин КриптоПРО.</> }/>
|
||||
) }
|
||||
{ certificates_error === "CERTIFICATES" && (
|
||||
<FormMessage type="error" title="Ошибка" message={ <>Плагин КриптоПРО не активирован, пожалуйста, обновите страницу и подтвердите разрешение для сайта на доступ к списку сертификатов.</> }/>
|
||||
<FormMessage type="moderate" title="Ошибка" message={ <>Плагин КриптоПРО не активирован, пожалуйста, обновите страницу и подтвердите разрешение для сайта на доступ к списку сертификатов.</> }/>
|
||||
) }
|
||||
{ certificates_error === "ISSUED" && (
|
||||
<FormMessage type="error" title="Ошибка" message={ <>Отсутствует действующий сертификат. ИНН: { company.inn }. ФИО: { head_person.lastname } { head_person.firstname } { head_person.middlename }</> }/>
|
||||
<FormMessage type="moderate" title="Ошибка" message={ <>Анкету необходимо подписать по ЭЦП сертификатом юридического лица с ИНН: { company.inn }, выданного: { head_person.lastname } { head_person.firstname } { head_person.middlename }. Такой сертификат не найден.</> }/>
|
||||
) }
|
||||
{ certificates_error === "MISMATCH" && (
|
||||
<FormMessage type="error" title="Ошибка" message={ <>Подписант не соответствует указанному подписанту в анкете.</> }/>
|
||||
<FormMessage type="moderate" title="Ошибка" message={ <>Подписант не соответствует указанному подписанту в анкете.</> }/>
|
||||
) }
|
||||
</React.Fragment>
|
||||
|
||||
|
||||
@ -219,31 +219,48 @@ export default class DigitalSignaturesList extends React.Component
|
||||
else
|
||||
{
|
||||
return (
|
||||
<div className="questionnaire message error">
|
||||
<svg width="44" height="45" viewBox="0 0 44 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M40.5425 31.1863L25.7969 8.08116C24.9653 6.77804 23.5459 6 22 6C20.4539 6 19.0345 6.77804 18.2032 8.08116L3.45741 31.1862C2.57234 32.5732 2.51363 34.3313 3.30467 35.7746C4.09572 37.2173 5.60918 38.1137 7.25444 38.1137H36.7456C38.3909 38.1137 39.9044 37.2175 40.6956 35.7742C41.4863 34.3313 41.4276 32.5733 40.5425 31.1863ZM22 34.2245C20.644 34.2245 19.5448 33.1252 19.5448 31.7694C19.5448 30.4133 20.6441 29.3141 22 29.3141C23.356 29.3141 24.4551 30.4133 24.4551 31.7694C24.4551 33.1252 23.3559 34.2245 22 34.2245ZM25.403 17.1635L24.1937 25.3052C24.0157 26.5037 22.8999 27.3309 21.7016 27.1529C20.7334 27.0091 20.0075 26.25 19.8582 25.333L18.5451 17.2074C18.2394 15.3155 19.5251 13.534 21.417 13.2283C23.3089 12.9226 25.0904 14.2083 25.3962 16.1002C25.4536 16.4565 25.4517 16.8243 25.403 17.1635Z" fill="white"/>
|
||||
</svg>
|
||||
<>
|
||||
{ certificates_error === "NOT_INSTALLED" && (
|
||||
<p><b>Ошибка</b>
|
||||
Плагин КриптоПРО не установлен, <Link href="https://cryptopro.ru/products/cades/plugin"><a target="_blank" rel="noopener noreferrer" style={{ color: "white", textDecoration: "underline" }}>посмотрите инструкцию</a></Link> как установить плагин КриптоПРО.
|
||||
</p>
|
||||
<div className="questionnaire message moderate">
|
||||
<svg width="44" height="45" viewBox="0 0 44 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M40.5425 31.1863L25.7969 8.08116C24.9653 6.77804 23.5459 6 22 6C20.4539 6 19.0345 6.77804 18.2032 8.08116L3.45741 31.1862C2.57234 32.5732 2.51363 34.3313 3.30467 35.7746C4.09572 37.2173 5.60918 38.1137 7.25444 38.1137H36.7456C38.3909 38.1137 39.9044 37.2175 40.6956 35.7742C41.4863 34.3313 41.4276 32.5733 40.5425 31.1863ZM22 34.2245C20.644 34.2245 19.5448 33.1252 19.5448 31.7694C19.5448 30.4133 20.6441 29.3141 22 29.3141C23.356 29.3141 24.4551 30.4133 24.4551 31.7694C24.4551 33.1252 23.3559 34.2245 22 34.2245ZM25.403 17.1635L24.1937 25.3052C24.0157 26.5037 22.8999 27.3309 21.7016 27.1529C20.7334 27.0091 20.0075 26.25 19.8582 25.333L18.5451 17.2074C18.2394 15.3155 19.5251 13.534 21.417 13.2283C23.3089 12.9226 25.0904 14.2083 25.3962 16.1002C25.4536 16.4565 25.4517 16.8243 25.403 17.1635Z" fill="white"/>
|
||||
</svg>
|
||||
<p><b>Внимание</b>
|
||||
Плагин КриптоПРО не установлен, <Link href="https://cryptopro.ru/products/cades/plugin"><a target="_blank" rel="noopener noreferrer" style={{ color: "white", textDecoration: "underline" }}>посмотрите инструкцию</a></Link> как установить плагин КриптоПРО.
|
||||
</p>
|
||||
</div>
|
||||
) }
|
||||
{ certificates_error === "OTHER" && (
|
||||
<p><b>Ошибка</b>
|
||||
Плагин КриптоПРО не активирован, пожалуйста, обновите страницу и подтвердите разрешение для сайта на доступ к списку сертификатов.
|
||||
</p>
|
||||
<div className="questionnaire message error">
|
||||
<svg width="44" height="45" viewBox="0 0 44 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M40.5425 31.1863L25.7969 8.08116C24.9653 6.77804 23.5459 6 22 6C20.4539 6 19.0345 6.77804 18.2032 8.08116L3.45741 31.1862C2.57234 32.5732 2.51363 34.3313 3.30467 35.7746C4.09572 37.2173 5.60918 38.1137 7.25444 38.1137H36.7456C38.3909 38.1137 39.9044 37.2175 40.6956 35.7742C41.4863 34.3313 41.4276 32.5733 40.5425 31.1863ZM22 34.2245C20.644 34.2245 19.5448 33.1252 19.5448 31.7694C19.5448 30.4133 20.6441 29.3141 22 29.3141C23.356 29.3141 24.4551 30.4133 24.4551 31.7694C24.4551 33.1252 23.3559 34.2245 22 34.2245ZM25.403 17.1635L24.1937 25.3052C24.0157 26.5037 22.8999 27.3309 21.7016 27.1529C20.7334 27.0091 20.0075 26.25 19.8582 25.333L18.5451 17.2074C18.2394 15.3155 19.5251 13.534 21.417 13.2283C23.3089 12.9226 25.0904 14.2083 25.3962 16.1002C25.4536 16.4565 25.4517 16.8243 25.403 17.1635Z" fill="white"/>
|
||||
</svg>
|
||||
<p><b>Ошибка</b>
|
||||
Плагин КриптоПРО не активирован, пожалуйста, обновите страницу и подтвердите разрешение для сайта на доступ к списку сертификатов.
|
||||
</p>
|
||||
</div>
|
||||
) }
|
||||
{ certificates_error === "ISSUED" && (
|
||||
<p><b>Ошибка</b>
|
||||
Отсутствуют действующие сертификаты.
|
||||
</p>
|
||||
<div className="questionnaire message error">
|
||||
<svg width="44" height="45" viewBox="0 0 44 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M40.5425 31.1863L25.7969 8.08116C24.9653 6.77804 23.5459 6 22 6C20.4539 6 19.0345 6.77804 18.2032 8.08116L3.45741 31.1862C2.57234 32.5732 2.51363 34.3313 3.30467 35.7746C4.09572 37.2173 5.60918 38.1137 7.25444 38.1137H36.7456C38.3909 38.1137 39.9044 37.2175 40.6956 35.7742C41.4863 34.3313 41.4276 32.5733 40.5425 31.1863ZM22 34.2245C20.644 34.2245 19.5448 33.1252 19.5448 31.7694C19.5448 30.4133 20.6441 29.3141 22 29.3141C23.356 29.3141 24.4551 30.4133 24.4551 31.7694C24.4551 33.1252 23.3559 34.2245 22 34.2245ZM25.403 17.1635L24.1937 25.3052C24.0157 26.5037 22.8999 27.3309 21.7016 27.1529C20.7334 27.0091 20.0075 26.25 19.8582 25.333L18.5451 17.2074C18.2394 15.3155 19.5251 13.534 21.417 13.2283C23.3089 12.9226 25.0904 14.2083 25.3962 16.1002C25.4536 16.4565 25.4517 16.8243 25.403 17.1635Z" fill="white"/>
|
||||
</svg>
|
||||
<p><b>Ошибка</b>
|
||||
Отсутствуют действующие сертификаты.
|
||||
</p>
|
||||
</div>
|
||||
) }
|
||||
{ certificates_error === "MISMATCH" && (
|
||||
<p><b>Ошибка</b>
|
||||
Подписант не соответствует указанному подписанту в анкете.
|
||||
</p>
|
||||
<div className="questionnaire message error">
|
||||
<svg width="44" height="45" viewBox="0 0 44 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M40.5425 31.1863L25.7969 8.08116C24.9653 6.77804 23.5459 6 22 6C20.4539 6 19.0345 6.77804 18.2032 8.08116L3.45741 31.1862C2.57234 32.5732 2.51363 34.3313 3.30467 35.7746C4.09572 37.2173 5.60918 38.1137 7.25444 38.1137H36.7456C38.3909 38.1137 39.9044 37.2175 40.6956 35.7742C41.4863 34.3313 41.4276 32.5733 40.5425 31.1863ZM22 34.2245C20.644 34.2245 19.5448 33.1252 19.5448 31.7694C19.5448 30.4133 20.6441 29.3141 22 29.3141C23.356 29.3141 24.4551 30.4133 24.4551 31.7694C24.4551 33.1252 23.3559 34.2245 22 34.2245ZM25.403 17.1635L24.1937 25.3052C24.0157 26.5037 22.8999 27.3309 21.7016 27.1529C20.7334 27.0091 20.0075 26.25 19.8582 25.333L18.5451 17.2074C18.2394 15.3155 19.5251 13.534 21.417 13.2283C23.3089 12.9226 25.0904 14.2083 25.3962 16.1002C25.4536 16.4565 25.4517 16.8243 25.403 17.1635Z" fill="white"/>
|
||||
</svg>
|
||||
<p><b>Ошибка</b>
|
||||
Подписант не соответствует указанному подписанту в анкете.
|
||||
</p>
|
||||
</div>
|
||||
) }
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -303,7 +303,7 @@ class Form_1_Main extends QuestionnaireForm
|
||||
|
||||
<div className="form_field">
|
||||
<label>Финансовая нагрузка <sup className="required_label">*</sup></label>
|
||||
<CurrencyInput
|
||||
<CurrencyInput
|
||||
className={ errors.indexOf("main.financial_loan") > -1 ? "error" : "" }
|
||||
id="main.financial_loan"
|
||||
name="main.financial_loan"
|
||||
@ -318,7 +318,7 @@ class Form_1_Main extends QuestionnaireForm
|
||||
onValueChange={ (value, name) => { this._removeError(name); this._handle_onTextFieldChange(name, value); } }
|
||||
required={ true }
|
||||
disabled={ checking }
|
||||
/>
|
||||
/>
|
||||
<p>сумма текущих ежемесячных платежей по действующим кредитам/договорам лизинга</p>
|
||||
</div>
|
||||
|
||||
|
||||
@ -134,7 +134,7 @@ class Form_2_Contacts extends QuestionnaireForm
|
||||
<p>для юр.диц - заполняется, если отличается от указанного в ЕГРЮЛ; для ИП - заполняется всегда</p>
|
||||
</div>
|
||||
|
||||
<p><b>Прошу оригиналы счетов-фактур и актов отказанных услуг по заключенному договору лизинга направлять:</b></p>
|
||||
<p><b>Прошу оригиналы счетов-фактур и актов оказанных услуг по заключенному договору лизинга направлять:</b></p>
|
||||
|
||||
<div className="form_field">
|
||||
<div style={{ width: "100%" }}>
|
||||
|
||||
@ -10,6 +10,9 @@ import Select from 'react-select';
|
||||
import { connect } from "react-redux";
|
||||
import { withRouter } from 'next/router';
|
||||
import { get as _get, slice } from 'lodash';
|
||||
import InputMask from 'react-input-mask';
|
||||
import CurrencyInput from 'react-currency-input-field';
|
||||
import moment from "moment";
|
||||
|
||||
import QuestionnaireForm from "../QuestionnaireForm";
|
||||
import CalendarDatePicker from '../../../CalendarDatePicker';
|
||||
@ -17,12 +20,10 @@ import citizenships from "../../../../lib/citizenships.json";
|
||||
import doctypes_personal from "../../../../lib/doctypes_personal.json";
|
||||
import { reduxWrapper } from '../../../../store';
|
||||
import AddressSuggests from "../../AddressSuggests";
|
||||
import InputMask from 'react-input-mask';
|
||||
import { getCitizenshipTitleByCode } from "../../../../utils/citizenship";
|
||||
import { checkDocumentData, saveQuestionnaire } from "../../../../actions";
|
||||
import SuggestsInput from "../../SuggestsInput";
|
||||
import DocumentIssuerSuggestsInput from "../../DocumentIssuerSuggestsInput";
|
||||
import moment from "moment";
|
||||
import FormMessage from "../FormMessage";
|
||||
|
||||
class ShareholderForm extends React.Component
|
||||
@ -45,6 +46,44 @@ class ShareholderForm extends React.Component
|
||||
});
|
||||
}
|
||||
|
||||
_handle_onFloatFieldChange = (name, value) =>
|
||||
{
|
||||
let float = parseFloat(value);
|
||||
let val = value;
|
||||
|
||||
if(isNaN(float))
|
||||
{
|
||||
val = "";
|
||||
}
|
||||
else if(float > 100)
|
||||
{
|
||||
val = 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
//float = float.toFixed(2);
|
||||
}
|
||||
this._handle_onTextFieldChange(name, val);
|
||||
}
|
||||
|
||||
_renderFloat = (value) =>
|
||||
{
|
||||
if(this._checkStrValue(value) !== "")
|
||||
{
|
||||
const float = parseFloat(value);
|
||||
if(!isNaN(float))
|
||||
{
|
||||
return float.toFixed(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
render()
|
||||
{
|
||||
const { index, shareholder, checking, errors } = this.props;
|
||||
@ -316,20 +355,41 @@ class ShareholderForm extends React.Component
|
||||
</div>
|
||||
|
||||
{ index === 0 && errors.indexOf("founder_part_total") > -1 && (
|
||||
<FormMessage type="error" title="Ошибка" message="Сумма долей учредителей более 100%"/>
|
||||
<FormMessage type="error" title="Ошибка" message="Сумма долей учредителей должна быть равна 100%"/>
|
||||
) }
|
||||
|
||||
<div className="form_field">
|
||||
<label>Доля в уставном капитале (%) <sup className="required_label">*</sup></label>
|
||||
{/*}
|
||||
<InputMask
|
||||
className={ errors.indexOf("founder_part") > -1 ? "error" : "" }
|
||||
mask='999'
|
||||
formatChars={{ '9': '[0-9]', }}
|
||||
mask={ [ /[0-9]/, /[0-9]/, /./, /[0-9]/, /[0-9]/ ] }
|
||||
maskPlaceholder="-"
|
||||
// formatChars={{ '9': '[0-9]', }}
|
||||
id={ `founder_persons[${ index }].founder_part` }
|
||||
name={ `founder_persons[${ index }].founder_part` }
|
||||
value={ this._checkStrValue(shareholder.founder_part) }
|
||||
placeholder="Укажите размер доли"
|
||||
onChange={ (event) => { this._removeError("founder_part"); this._handle_onTextFieldChange(event.target.name, parseInt(event.target.value, 10) > 100 ? 100 : parseInt(event.target.value, 10)); } }
|
||||
onChange={ (event) => { this._removeError("founder_part"); this._handle_onFloatFieldChange(event.target.name, event.target.value); } }
|
||||
required={ true }
|
||||
disabled={ checking }
|
||||
/>
|
||||
{*/}
|
||||
<CurrencyInput
|
||||
className={ errors.indexOf("founder_part") > -1 ? "error" : "" }
|
||||
id={ `founder_persons[${ index }].founder_part` }
|
||||
name={ `founder_persons[${ index }].founder_part` }
|
||||
// value={ this._renderFloat(shareholder.founder_part) }
|
||||
value={ this._checkStrValue(shareholder.founder_part) !== "" && parseFloat(shareholder.founder_part) > 0 ? this._checkStrValue(shareholder.founder_part) : null }
|
||||
// decimalsLimit={ 2 }
|
||||
//selectAllOnFocus={ true }
|
||||
placeholder="Укажите сумму"
|
||||
decimalSeparator="."
|
||||
groupSeparator=" "
|
||||
//suffix=" ₽"
|
||||
maxLength={ 5 }
|
||||
// fixedDecimalLength={ 1 }
|
||||
onValueChange={ (value, name) => { this._removeError(name); this._handle_onFloatFieldChange(name, value); } }
|
||||
required={ true }
|
||||
disabled={ checking }
|
||||
/>
|
||||
@ -720,9 +780,9 @@ class Form_4_Shareholders extends QuestionnaireForm
|
||||
}
|
||||
else if(check[i] === "founder_part")
|
||||
{
|
||||
if(v !== "" && v !== null && !isNaN(parseInt(v, 10)))
|
||||
if(v !== "" && v !== null && !isNaN(parseFloat(v)))
|
||||
{
|
||||
total_parts = total_parts + parseInt(v, 10)
|
||||
total_parts = total_parts + parseFloat(v)
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -738,11 +798,6 @@ class Form_4_Shareholders extends QuestionnaireForm
|
||||
}
|
||||
}
|
||||
|
||||
if(total_parts > 100)
|
||||
{
|
||||
errors[0].push(`founder_part_total`);
|
||||
}
|
||||
|
||||
if(parseInt(_get(founder_persons[f], "identity_document.doctype"), 10) === 100000000 && errors.indexOf("identity_document.seria") < 0 && errors.indexOf("identity_document.docnumber") < 0)
|
||||
{
|
||||
const founder_document_check_response = await checkDocumentData({
|
||||
@ -759,6 +814,11 @@ class Form_4_Shareholders extends QuestionnaireForm
|
||||
}
|
||||
}
|
||||
|
||||
if(parseInt(total_parts, 10) !== 100)
|
||||
{
|
||||
errors[0].push(`founder_part_total`);
|
||||
}
|
||||
|
||||
this.setState({ errors, loading: false }, () =>
|
||||
{
|
||||
window.scroll(0, 0);
|
||||
|
||||
BIN
lib/ubuntu_mono_regular.ttf
Normal file
BIN
lib/ubuntu_mono_regular.ttf
Normal file
Binary file not shown.
@ -144,7 +144,7 @@ export default async function handler(req, res)
|
||||
|
||||
console.log("API", "download", "__dirname", __dirname);
|
||||
const formPdfBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/evo_anketa_v2_empty_licenses.pdf`);
|
||||
const fontBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/roboto.ttf`);
|
||||
const fontBytes = fs.readFileSync(`${ __dirname }/../../../../../lib/ubuntu_mono_regular.ttf`);
|
||||
|
||||
const pdfDoc = await PDFDocument.load(formPdfBytes);
|
||||
pdfDoc.registerFontkit(fontkit);
|
||||
@ -207,9 +207,39 @@ export default async function handler(req, res)
|
||||
const { registration_address, } = questionnaire[group][p].identity_document;
|
||||
if(good(registration_address.name))
|
||||
{
|
||||
let field_text_value = registration_address.name.toString().toUpperCase();
|
||||
/*
|
||||
let field_text_value = "";
|
||||
for(let a = 0; a < 7; a++)
|
||||
{
|
||||
for(let b = 0; b < 10; b++)
|
||||
{
|
||||
field_text_value = field_text_value + b;
|
||||
if(b === 5)
|
||||
{
|
||||
field_text_value = field_text_value + " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
//const rx = new RegExp(/(\S)-(\S)/gim);
|
||||
//field_text_value = field_text_value.replace(rx, "$1- $2");
|
||||
|
||||
fields[group][p][field].bind = form.getTextField(fields[group][p][field].name);
|
||||
console.log(`${ group }_${ p }_${ field }`, { is_scrollable: fields[group][p][field].bind.isScrollable() });
|
||||
|
||||
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.name.toString().toUpperCase());
|
||||
|
||||
/*
|
||||
if(field_text_value.length < 70)
|
||||
{
|
||||
}
|
||||
else if(field_text_value.length < 14)
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
fields[group][p][field].bind.setText(field_text_value);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@ -19,10 +19,12 @@ const questionnaireReducer = (state = initialState.questionnaire, action) =>
|
||||
|
||||
case actionTypes.QUESTIONNAIRE_UPDATE:
|
||||
{
|
||||
/*
|
||||
console.log("actionTypes.QUESTIONNAIRE_UPDATE", {
|
||||
...state,
|
||||
...action.data.questionnaire,
|
||||
});
|
||||
*/
|
||||
|
||||
return {
|
||||
...state,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user