This commit is contained in:
merelendor 2023-10-23 10:50:25 +03:00
commit 990e62b781
11 changed files with 2197 additions and 1101 deletions

View File

@ -180,6 +180,47 @@ export const signGetFileContractProject = (payload) =>
console.error("ACTION", "sign", "signGetFileContractProject()", "ERROR");
console.error(error);
reject(error.data);
});
});
}
export const signUploadPaperDocument = (contract_number, deal_id, files) =>
{
console.log({ contract_number, files });
const url = `${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/contract/sign/document/upload`;
return new Promise((resolve, reject) =>
{
let data = new FormData();
data.append('contract_number', contract_number);
data.append('deal_id', deal_id);
for(let i in files)
{
data.append('files', files[i]);
}
axios.post(url, data, {
headers: {
"Content-Type": "multipart/form-data",
},
withCredentials: true,
})
.then((response) =>
{
if(parseInt(process.env.LOG, 10) === 1) { console.log("ACTION", "sign", "signUploadPaperDocument()", "response", response.data); }
setTimeout(() =>
{
resolve();
}, 2000);
})
.catch((error) =>
{
console.error("ACTION", "sign", "signUploadPaperDocument()", "ERROR");
console.error(error);
reject(error.data);
});
});

View File

@ -5,8 +5,9 @@ import { SpinnerCircular } from "spinners-react";
import { concatSeries } from "async";
import { eachSeries } from 'async';
import Select from 'react-select';
import Dropzone from 'react-dropzone';
import { createEDOProject, docEDOCancel, signCheckCreatePrintForm, signDownloadFile, signGetGUIDEntity, signGetWMDoc, docEDOSign, docEDOStatus, docEDOConnect } from "../../../actions";
import { docEDOCancel, signCheckCreatePrintForm, signGetGUIDEntity, signGetWMDoc, docEDOStatus, getFile, signGetFileContractProject, signUploadPaperDocument } from "../../../actions";
export default class DealContractsSignPaper extends React.Component
{
@ -60,9 +61,20 @@ export default class DealContractsSignPaper extends React.Component
for(let i in documents)
{
console.log({ fin: documents[i] });
if(!documents[i].completed)
completed = false;
break;
if(documents[i].error)
{
console.log(11111);
continue;
}
else
{
if(!documents[i].completed)
{
console.log(22222);
completed = false;
break;
}
}
}
return completed;
@ -84,37 +96,17 @@ export default class DealContractsSignPaper extends React.Component
{
callback();
}
else if(document.signing)
if(document.uploading)
{
await this._updateDocs(document.index, { loading: true, });
const status_result = await docEDOStatus({ contract_number: document.id });
if(status_result.status === 3)
{
await this._updateDocs(document.index, { loading: false, signing: false, ready: false, completed: true, });
}
else
{
await this._updateDocs(document.index, { loading: false, signing: true, ready: false, });
}
callback();
}
else if(document.ready)
{
callback();
/*
console.log({ document })
await this._updateDocs(document.index, { loading: true, });
const status_result = await docEDOStatus({ contract_number: document.id });
console.log({ status_result });
if(status_result.status > 0)
{
const sign_result = await docEDOSign({ edoid: status_result.edoid });
}
await this._updateDocs(document.index, { loading: false, signing: true, ready: false, error: false, });
callback();
*/
}
else
{
@ -150,8 +142,6 @@ export default class DealContractsSignPaper extends React.Component
});
console.log({ wmdoc_result });
const connect_result = await docEDOConnect({ contract_number: document.id });
await this._updateDocs(document.index, {
entity_id: get_guid_entity_result.entityid,
ready: true,
@ -162,7 +152,12 @@ export default class DealContractsSignPaper extends React.Component
}
else
{
await this._updateDocs(document.index, { loading: false, error: true, ready: true, message: "Возникла ошибка при создании документа для подписания." });
await this._updateDocs(document.index, {
loading: false,
error: true,
ready: true,
message: create_print_form_result.message !== undefined && create_print_form_result.message !== null ? create_print_form_result.message : "Возникла ошибка при создании документа для подписания.",
});
callback();
}
}
@ -174,7 +169,7 @@ export default class DealContractsSignPaper extends React.Component
}
else
{
this.setState({ loading: false });
this.setState({ loading: false, finished: false, });
}
});
});
@ -201,19 +196,23 @@ export default class DealContractsSignPaper extends React.Component
}
}
_handle_onDownloadFile = (index, entity_id, name) =>
_handle_onDownloadFile = (index) =>
{
console.log("_handle_onDownloadFile", { index, entity_id });
const { documents } = this.state;
this.setState({ loading: true, disabled: true, }, async () =>
{
await this._updateDocs(index, { loading: true });
const wmdoc_result = await signDownloadFile({
payload: { entity_name: "evo_contract", entity_id, sign_type: "EDO", evo_id: "144", },
filename: `ЛК ЭВОЛЮЦИЯ ${ name }.pdf`,
const link_result = await signGetFileContractProject({
contract_number: documents[index].id,
});
await this._updateDocs(index, { loading: false, disabled: false, });
console.log("_handle_onDownloadFile", { link_result });
await getFile({ id: link_result.url, filename: `ЛК ЭВОЛЮЦИЯ ${ documents[index].id }.${ link_result.extension }` });
await this._updateDocs(index, { loading: false, disabled: false, ready: false, uploading: true, });
this.setState({ loading: false, disabled: false, });
});
}
@ -225,7 +224,7 @@ export default class DealContractsSignPaper extends React.Component
this.setState({ loading: true, disabled: true }, async () =>
{
await docEDOCancel({ contract_number: documents[index].id, doc_type_id: "144" });
await docEDOCancel({ contract_number: documents[index].id, doc_type_id: "60" });
const docs = [ ...this.state.documents ];
docs.splice(index, 1);
@ -256,29 +255,33 @@ export default class DealContractsSignPaper extends React.Component
onCancel(clean);
}
_handle_onCheckEDOStatus = async (index) =>
_handle_onUploadFile = async (files, index) =>
{
const { documents } = this.state;
const { deal_id } = this.props;
console.log("_handle_onUploadFile", { files, index });
await this._updateDocs(index, { loading: true });
this.setState({ loading: true, disabled: true }, async () =>
{
const status_result = await docEDOStatus({ contract_number: document.id });
console.log({ status_result });
await signUploadPaperDocument(documents[index].id, deal_id, files);
await this._updateDocs(index, { loading: false, uploading: false, completed: true, });
if(status_result.status === 3)
if(this._checkDocumentsCompleted())
{
await this._updateDocs(index, { loading: false, disabled: false, signing: false, completed: true, });
this.setState({ loading: false, disabled: false, finished: true, });
}
else
{
await this._updateDocs(index, { loading: false, disabled: false, signing: true, completed: false, });
this.setState({ loading: false, disabled: false, finished: false, });
}
});
}
_handle_onGoToEDO = () =>
_handle_onCancelUpload = async (index) =>
{
await this._updateDocs(index, { ready: true, uploading: false, });
}
render()
@ -320,34 +323,31 @@ export default class DealContractsSignPaper extends React.Component
</>
) : (
<>
{ document.upload && (
<>
<div className="status_icon await"></div>
<div className="edo_sign_status_attorney_select">
UPLOAD
</div>
</>
) }
{ document.ready && (
<>
<div className="status_icon success"></div>
{ document.entity_id !== undefined && (
<>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onDownloadFile(index, document.entity_id, document.name) }>Посмотреть проект договора</button>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onDownloadFile(index) }>Посмотреть проект договора</button>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onCancelFile(index) }>Отменить подписание</button>
</>
) }
</>
) }
{ document.signing && (
{ document.uploading && (
<>
<div className="status_icon success"></div>
<div className="status_title">
<i>Идет процесс подписания</i>
</div>
<div className="status_icon await"></div>
{ document.entity_id !== undefined && (
<>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onCheckEDOStatus(index) }>Проверить статус</button>
<>
<Dropzone onDrop={ (acceptedFiles) => this._handle_onUploadFile(acceptedFiles, index) } maxFiles={ 10 }>
{ ({getRootProps, getInputProps}) => (
<div { ...getRootProps() }>
<button className="button" disabled={ disabled }>Загрузить скан подписанного документа</button>
<input { ...getInputProps() } />
</div>
) }
</Dropzone>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onCancelUpload(index) }>Отменить загрузку</button>
</>
) }
</>
@ -356,11 +356,8 @@ export default class DealContractsSignPaper extends React.Component
<>
<div className="status_icon success"></div>
<div className="status_title">
<i>Договор подписан со стороны "ЛК Эволюция"</i>
<i>Договор отправлен вашему менеджеру "ЛК Эволюция"</i>
</div>
{ document.entity_id !== undefined && (
<button className="button" disabled={ disabled } onClick={ () => this._handle_onGoToEDO(index) }>Перейти в ЭДО</button>
) }
</>
) }
</>
@ -375,15 +372,11 @@ export default class DealContractsSignPaper extends React.Component
<form ref={ this.ref_form } onSubmit={ this._handle_onFormSubmit } onKeyDown={(e) => {if (e.key === 'Enter') e.preventDefault() }}>
<div className="form_field" style={{ display: "flex", justifyContent: "space-between" }}>
<button className="button button-blue" onClick={ this._handle_onCancel }>Отменить</button>
{ finished ? (
<button type="submit" className="button button-blue">Завершить</button>
) : (
<button type="submit" className="button button-blue">
{ loading ? (
<SpinnerCircular size={24} thickness={100} speed={100} color="rgba(255, 255, 255, 1)" secondaryColor="rgba(255, 255, 255, 0.5)" style={{ marginTop: "4px" }}/>
) : "Продолжить" }
</button>
) }
<button type="submit" className="button button-blue" disabled={ finished ? false : true }>
{ loading ? (
<SpinnerCircular size={24} thickness={100} speed={100} color="rgba(255, 255, 255, 1)" secondaryColor="rgba(255, 255, 255, 0.5)" style={{ marginTop: "4px" }}/>
) : "Продолжить" }
</button>
</div>
</form>
</div>

View File

@ -177,6 +177,7 @@ export default class LeasingRegistration extends Step
_render_preparedContracts = () =>
{
const { dealSelected } = this.props;
const { edo, paper, checked } = this.state;
//const checked = this.state.checked.prepared_contracts;
@ -198,7 +199,8 @@ export default class LeasingRegistration extends Step
if(paper)
{
return (
<DealContractsSignPaper
<DealContractsSignPaper
deal_id={ dealSelected }
documents={ this._getDocuments() }
onCancel={ this._handle_onCancelPaper }
onFinish={ this._handle_onFinishPaper }

View File

@ -147,15 +147,20 @@ export default class Offers extends Step
</div>
</td>
) : (
<td></td>
)}
<td>{ offer_index + 1 }</td>
<td>{ numeral(offer.price).format(' ., ') } </td>
<td>{ numeral(offer.first_payment_rub).format(' ., ') } </td>
<td>{ offer.first_payment_perc }%</td>
<td>{ offer.brand_name }</td>
<td>{ offer.model_name }</td>
<td>{ offer.object_count }</td>
<td>
<div className="form_field checkbox checkbox_disabled">
<input type="checkbox" name="row" id={`offer_${ offer.quote_number }`} checked={ true } onChange={ () => { } } style={{ filter: "grayscale", opacity: 0.5 }}/>
<label htmlFor={`offer_${ offer.quote_number }`}></label>
</div>
</td>
) }
<td data-title="№">{ offer_index + 1 }</td>
<td data-title="Стоимость">{ numeral(offer.price).format(' ., ') } </td>
<td data-title="Первый платеж, ₽">{ numeral(offer.first_payment_rub).format(' ., ') } </td>
<td data-title="Первый платеж, %">{ offer.first_payment_perc }%</td>
<td data-title="Марка">{ offer.brand_name }</td>
<td data-title="Модель">{ offer.model_name }</td>
<td data-title="Объектов лизинга">{ offer.object_count }</td>
<td>
<div className="docs_list" style={{ cursor: "pointer" }} onClick={ () => this._handle_onOffer(offer.quote_number) }>
<div className="row">

View File

@ -1064,19 +1064,11 @@
}
@media all and (max-width: 768px) {
.dropzone {
border: 0;
background: transparent;
height: auto;
flex-wrap: wrap;
}
.dropzone div p {
margin-bottom: 10px;
}
.dropzone div p:before {
content: attr(data-sm-text);
display: block;
}
.dropzone div p span {
display: none;
.dropzone p {
width: 100%;
}
}
/* questionnaire */

View File

@ -1265,23 +1265,11 @@
}
@media all and (max-width: 768px) {
border: 0;
background: transparent;
height: auto;
flex-wrap: wrap;
div {
p {
margin-bottom: 10px;
&:before {
content: attr(data-sm-text);
display: block;
}
span {
display: none;
}
}
p {
width: 100%;
}
}
}

View File

@ -3962,6 +3962,11 @@ main .dropdown_blocks_list .dropdown_block .block_body .fines_detail ul li {
margin-top: 50px;
}
}
@media all and (max-width: 768px) {
.feed {
overflow: hidden;
}
}
.feed .feed_item {
box-sizing: border-box;
padding: 24px 16px;
@ -5300,6 +5305,8 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
}
.contractStatus_list {
margin: 50px 0;
position: relative;
z-index: 9;
}
.contractStatus_list .list_item {
display: flex;
@ -5307,11 +5314,33 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
width: 100%;
gap: 0 30px;
justify-content: space-between;
position: relative;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item {
display: block;
padding-left: 100px;
}
}
@media all and (max-width: 768px) {
.contractStatus_list .list_item {
padding-left: 0;
}
}
.contractStatus_list .list_item div {
display: flex;
align-items: center;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div img {
max-width: 30px;
}
}
@media all and (max-width: 768px) {
.contractStatus_list .list_item div img {
display: none;
}
}
.contractStatus_list .list_item div p {
font-weight: 700;
line-height: 23px;
@ -5321,10 +5350,29 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
justify-content: flex-start;
gap: 0 8px;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div p {
font-size: 12px;
line-height: 16px;
}
}
@media all and (max-width: 920px) and (min-width: 769px) {
.contractStatus_list .list_item div:first-child {
position: absolute;
left: 0;
top: 0;
max-width: 90px;
}
}
.contractStatus_list .list_item div:nth-child(2) {
width: 30%;
position: relative;
}
@media all and (max-width: 768px) {
.contractStatus_list .list_item div:nth-child(2) {
width: 100%;
}
}
.contractStatus_list .list_item div:nth-child(2) p {
cursor: pointer;
color: var(--text_not_active);
@ -5344,6 +5392,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
border-bottom: 6px solid transparent;
background: #fff;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(2):before {
display: none;
}
}
.contractStatus_list .list_item div:nth-child(2):after {
content: "";
display: block;
@ -5353,6 +5406,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
background-size: auto 13px;
margin-left: 24px;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(2):after {
display: none;
}
}
.contractStatus_list .list_item div:nth-child(3) {
display: flex;
align-items: center;
@ -5361,6 +5419,19 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
width: 50%;
position: relative;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(3) {
width: 100%;
gap: 0 12px;
padding: 10px 20px;
justify-content: flex-start;
}
}
@media all and (max-width: 768px) {
.contractStatus_list .list_item div:nth-child(3) {
padding: 20px;
}
}
.contractStatus_list .list_item div:nth-child(3):before {
content: "";
display: block;
@ -5375,6 +5446,18 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
border-left: 8px solid #a499dd;
border-bottom: 6px solid transparent;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(3):before {
border-top: 4px solid transparent;
border-left: 6px solid #a499dd;
border-bottom: 4px solid transparent;
right: auto;
left: 0;
bottom: 0;
transform: rotate(90deg);
top: auto;
}
}
.contractStatus_list .list_item div:nth-child(3):after {
content: "";
display: block;
@ -5383,22 +5466,54 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
background: url("/assets/images/status/line_2.jpg") repeat-x left center;
background-size: auto 13px;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(3):after {
background-size: auto 10px;
position: absolute;
left: -22px;
right: auto;
transform: rotate(90deg);
width: 50px;
height: 6px;
}
}
@media all and (max-width: 768px) {
.contractStatus_list .list_item div:nth-child(3):after {
left: -17px;
width: 40px;
}
}
.contractStatus_list .list_item div:nth-child(4) {
width: 130px;
min-width: 130px;
justify-content: flex-end;
cursor: pointer;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(4) {
justify-content: flex-start;
}
}
.contractStatus_list .list_item div:nth-child(4) button {
white-space: nowrap;
gap: 0 8px;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item div:nth-child(4) button {
padding: 0;
}
}
.contractStatus_list .list_item div:first-child {
min-width: 60px;
}
.contractStatus_list .list_item:not(:last-child) {
margin-bottom: 5px;
}
@media all and (max-width: 920px) {
.contractStatus_list .list_item:not(:last-child) {
margin-bottom: 20px;
}
}
.contractStatus_list .list_item:not(:last-child) div:nth-child(5) {
/*visibility: hidden;*/
}
@ -5417,6 +5532,12 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
transition: transform 150ms ease;
overflow: hidden;
}
@media all and (max-width: 768px) {
.contractStatus_modal {
margin-bottom: 30px;
overflow: visible;
}
}
.contractStatus_modal .modal_header {
display: flex;
align-items: center;
@ -5444,12 +5565,18 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
gap: 0 30px;
padding: 0px 0;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div {
gap: 0 12px;
font-size: 12px;
}
}
.contractStatus_modal .single_status > div:last-child .status_body .wrap {
padding-bottom: 0;
border: 0;
}
.contractStatus_modal .single_status > div:last-child > span::before {
display: none;
display: none !important;
}
.contractStatus_modal .single_status > div > p {
margin: 0;
@ -5467,6 +5594,13 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
width: 40px;
height: 40px;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div i {
width: 30px;
height: 30px;
background-size: contain !important;
}
}
.contractStatus_modal .single_status > div i.status_100 {
background: url("/assets/images/status/icon_deal_status_100.svg") no-repeat center;
}
@ -5572,9 +5706,25 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
z-index: -1;
bottom: 0;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div:first-child {
padding-top: 25px;
}
.contractStatus_modal .single_status > div:first-child > p:first-child {
width: 100%;
position: absolute;
top: 0;
padding: 0;
}
}
.contractStatus_modal .single_status > div:not(:first-child) > p:first-child {
visibility: hidden;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div:not(:first-child) > p:first-child {
display: none;
}
}
.contractStatus_modal .single_status > div:not(.current) img {
filter: grayscale(1);
}
@ -5687,6 +5837,19 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
position: relative;
cursor: pointer;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .status_header {
gap: 0 12px;
font-size: 12px;
min-height: 50px;
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .status_header {
flex-wrap: wrap;
height: auto;
}
}
.contractStatus_modal .single_status > div .status_body .status_header .background {
background-color: #edeff5;
position: absolute;
@ -5696,15 +5859,38 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
height: 50px;
z-index: 1;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .status_header .background {
left: 0;
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .status_header .background {
left: -48px;
width: calc(100% + 96px);
}
}
.contractStatus_modal .single_status > div .status_body .status_header i {
z-index: 2;
white-space: nowrap;
min-width: 40px;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .status_header i {
display: none;
}
}
.contractStatus_modal .single_status > div .status_body .status_header p {
z-index: 2;
white-space: nowrap;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .status_header p {
max-width: calc(100% - 70px);
white-space: unset;
width: 100%;
}
}
.contractStatus_modal .single_status > div .status_body .status_header .buttons {
z-index: 2;
width: 100%;
@ -5712,6 +5898,13 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
justify-content: flex-end;
padding-right: 4px;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .status_header .buttons {
justify-content: flex-start;
width: 100%;
margin-top: 10px;
}
}
.contractStatus_modal .single_status > div .status_body .status_header .button_arrow {
min-width: 50px;
height: 50px;
@ -5721,6 +5914,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
z-index: 2;
margin-left: -30px;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .status_header .button_arrow {
margin-left: -12px;
}
}
.contractStatus_modal .single_status > div .status_body .status_header .button_arrow .icon {
width: 18px;
height: 18px;
@ -5739,6 +5937,18 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
padding-bottom: 25px;
border-bottom: 1px solid var(--inactive, #EDEFF5);
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .wrap {
margin-top: 15px;
padding-bottom: 15px;
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap {
margin-top: 20px;
padding-bottom: 20px;
}
}
.contractStatus_modal .single_status > div .status_body .wrap.form {
display: flex;
flex-direction: column;
@ -5747,9 +5957,19 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
display: flex;
flex-direction: row;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap.form .block {
display: block;
}
}
.contractStatus_modal .single_status > div .status_body .wrap.form .block .left {
width: 20%;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap.form .block .left {
width: 100%;
}
}
.contractStatus_modal .single_status > div .status_body .wrap.form .block .left p {
line-height: 14px;
margin: 15px 0px 15px 0px;
@ -5758,6 +5978,12 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
width: 80%;
padding-left: 30px;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap.form .block .right {
width: 100%;
padding-left: 0;
}
}
.contractStatus_modal .single_status > div .status_body .wrap input[type="checkbox"] + label {
width: 16px;
padding: 0;
@ -5775,6 +6001,12 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
margin-right: 20%;
padding-top: 10px;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap .single_text p {
margin-right: 0;
padding-top: 0;
}
}
.contractStatus_modal .single_status > div .status_body .wrap .single_text p:before {
content: "";
display: block;
@ -5786,6 +6018,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
margin-top: -10px;
background-image: url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='40' height='40' rx='8' fill='%232F80ED' fill-opacity='0.1'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 29C24.9706 29 29 24.9706 29 20C29 15.0294 24.9706 11 20 11C15.0294 11 11 15.0294 11 20C11 24.9706 15.0294 29 20 29ZM21 14.5C21 13.9477 20.5523 13.5 20 13.5C19.4477 13.5 19 13.9477 19 14.5V19.75C19 20.4404 19.5596 21 20.25 21H23.5C24.0523 21 24.5 20.5523 24.5 20C24.5 19.4477 24.0523 19 23.5 19H21V14.5Z' fill='%232F80ED'/%3E%3C/svg%3E");
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap .single_text p:before {
margin-top: 0;
}
}
.contractStatus_modal .single_status > div .status_body .wrap table {
font-size: 12px;
line-height: 120%;
@ -5816,6 +6053,116 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
.contractStatus_modal .single_status > div .status_body .wrap table .i-pdf span {
font-weight: 400;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table thead {
display: none;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table tbody {
display: block;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table tr {
display: block;
position: relative;
padding-left: 31px;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td {
display: block;
padding: 8px;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:first-child:not(:empty) {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 32px;
box-sizing: border-box;
background: #fff;
border-top: 0;
border-bottom: 0;
border-left: 0;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:first-child:not(:empty) .form_field {
width: 16px;
margin: auto;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:not(:last-child) {
border-bottom: 0;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:empty {
display: none;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td[data-title] {
display: flex;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td[data-title]:before {
content: attr(data-title);
color: var(--text_not_active);
font-size: 12px;
font-style: normal;
font-weight: 700;
line-height: 120%;
width: 100%;
display: block;
width: 50%;
min-width: 50%;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table .docs_list .row .doc_name span {
width: 100%;
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table thead {
display: none;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table tbody {
display: block;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table tr {
display: block;
position: relative;
padding-right: 56px;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td {
display: block;
padding: 8px;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:first-child:not(:empty) {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 57px;
box-sizing: border-box;
background: #fff;
border-top: 0;
border-bottom: 0;
border-right: 0;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:first-child:not(:empty) .form_field {
width: 16px;
margin: auto;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:not(:last-child) {
border-bottom: 0;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td:empty {
display: none;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table td[data-title]:before {
content: attr(data-title);
color: var(--text_not_active);
font-size: 12px;
font-style: normal;
font-weight: 700;
line-height: 120%;
width: 100%;
display: block;
margin-bottom: 5px;
}
.contractStatus_modal .single_status > div .status_body .wrap table.deal_offers_table .docs_list .row .doc_name span {
width: 100%;
}
}
.contractStatus_modal .single_status > div .status_body .wrap .message {
display: flex;
align-items: center;
@ -5898,6 +6245,15 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
justify-content: flex-end;
gap: 0 20px;
}
@media all and (max-width: 920px) {
.contractStatus_modal .single_status > div .status_body .wrap .block_footer_btn {
flex-wrap: wrap;
gap: 10px 0;
}
.contractStatus_modal .single_status > div .status_body .wrap .block_footer_btn button {
width: 100%;
}
}
.contractStatus_modal .single_status > div .status_body .wrap .flex-start {
justify-content: flex-start;
}
@ -5932,11 +6288,19 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
grid-gap: 10px 0px;
margin-bottom: 30px;
}
.contractStatus_modal .single_status > div .status_body .documents:last-child {
margin-bottom: 0;
}
.contractStatus_modal .single_status > div .status_body .documents .document {
width: 100%;
display: flex;
flex-direction: row;
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document {
flex-wrap: wrap;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .icon {
margin-top: 5px;
display: flex;
@ -5957,6 +6321,17 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
font-size: 12px;
color: #fff;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .documents .document .icon {
width: 28px;
height: 28px;
min-width: 28px;
min-height: 28px;
}
.contractStatus_modal .single_status > div .status_body .documents .document .icon .extension {
font-size: 8px;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .title {
display: flex;
flex-direction: column;
@ -5965,6 +6340,21 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
font-weight: 600;
margin-left: 16px;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .documents .document .title p {
margin-left: 0;
}
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document .title {
width: calc(100% - 56px);
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .documents .document .title {
margin-left: 12px;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .description {
display: flex;
flex-direction: row;
@ -5975,6 +6365,12 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
margin-top: 2px;
color: #8e94a7;
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .documents .document .description span {
margin-left: 0;
margin-right: 10px;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .actions {
display: flex;
flex: 1;
@ -5983,9 +6379,32 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
justify-content: flex-end;
align-items: center;
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document .actions {
flex: auto;
width: 100%;
flex-wrap: wrap;
padding-left: 50px !important;
}
}
@media all and (max-width: 768px) {
.contractStatus_modal .single_status > div .status_body .documents .document .actions {
padding-left: 30px !important;
justify-content: flex-start;
gap: 0 12px;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .actions button {
white-space: nowrap;
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document .actions button {
order: 1;
padding: 0;
justify-content: flex-start;
width: 100%;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .actions .status {
display: flex;
align-items: center;
@ -5994,6 +6413,12 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
gap: 0px 16px;
padding: 0px 16px;
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document .actions .status {
width: 100%;
order: 2;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .actions .status .status_icon {
min-width: 24px;
min-height: 24px;
@ -6004,6 +6429,13 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
color: #fff;
white-space: nowrap;
}
@media all and (max-width: 1279px) {
.contractStatus_modal .single_status > div .status_body .documents .document .actions .status span {
white-space: inherit;
line-height: 1.25;
padding: 5px 0;
}
}
.contractStatus_modal .single_status > div .status_body .documents .document .wide {
justify-content: space-between;
padding-left: 64px;
@ -6032,6 +6464,14 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
height: 16px;
background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 10L8 5L13 10' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
@media all and (max-width: 920px) {
.contractStatus_modal .bottom_button_close {
margin-left: 0;
padding: 0;
margin-top: 15px;
margin-bottom: 25px;
}
}
.all_contracts_modal .contractStatus_list .list_item .step {
width: 50%;
gap: 0 16px;
@ -6075,6 +6515,16 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
padding: 30px;
height: 100px;
}
@media all and (max-width: 920px) {
.horizontal_dropzone_wrapper {
padding: 15px;
}
}
@media all and (max-width: 768px) {
.horizontal_dropzone_wrapper {
height: auto;
}
}
.horizontal_dropzone_wrapper.disabled {
filter: grayscale(1);
opacity: 0.25;
@ -6085,6 +6535,17 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
max-width: 80%;
gap: 20px;
}
@media all and (max-width: 920px) {
.horizontal_dropzone_wrapper .horizontal_dropzone_inner {
max-width: 100%;
gap: 0 12px;
}
}
@media all and (max-width: 768px) {
.horizontal_dropzone_wrapper .horizontal_dropzone_inner {
flex-wrap: wrap;
}
}
.horizontal_dropzone_wrapper .horizontal_dropzone_inner p {
text-align: left;
margin: 0px;
@ -6092,6 +6553,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
.horizontal_dropzone_wrapper .horizontal_dropzone_inner label {
white-space: nowrap;
}
@media all and (max-width: 768px) {
.horizontal_dropzone_wrapper .horizontal_dropzone_inner label {
margin-top: 15px;
}
}
.horizontal_dropzone_files {
display: flex;
flex-direction: column;
@ -6451,3 +6917,8 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
padding-bottom: 15px;
border-top: solid 1px #edeff5;
}
.checkbox_disabled label:before {
filter: grayscale();
opacity: 0.5;
cursor: default !important;
}

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,7 @@
"next-with-less": "^1.0.1",
"nextjs-cors": "^2.1.0",
"node-fetch": "^3.3.1",
"nodemailer": "^6.9.7",
"numeral": "^2.0.6",
"pdf-lib": "^1.17.1",
"pluralize-ru": "^1.0.1",

View File

@ -0,0 +1,115 @@
import fs from 'fs';
import axios from 'axios';
import { Cookies } from 'react-cookie';
import cookie from 'cookie';
import moment from 'moment';
import jwt from 'jsonwebtoken';
import Redis from 'ioredis';
import md5 from 'md5';
import { inspect } from 'util';
import multer from 'multer';
import nodemailer from "nodemailer";
import { cors } from '../../../../../lib/cors';
const transporter = nodemailer.createTransport({
host: process.env.EMAIL_HOSTNAME,
port: 465,
secure: true,
auth: {
user: process.env.EMAIL_USERNAME,
pass: process.env.EMAIL_PASSWORD,
},
});
console.log({ host: process.env.EMAIL_HOSTNAME, user: process.env.EMAIL_USERNAME, pass: process.env.EMAIL_PASSWORD });
const storage = multer.memoryStorage();
const upload = multer({ storage: storage, limits: { fileSize: 1024 * 1024 * 300 } });
export default async function handler(req, res)
{
console.log("\n\n", "API", "SIGN", "/document/upload");
await cors(req, res);
return new Promise(async (resolve) =>
{
if(req.headers.cookie !== undefined)
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
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 });
upload.array("files", 10)(req, {}, (err) =>
{
const { contract_number, deal_id, } = req.body;
const { files } = req;
const attachments = [];
for(let i in files)
{
attachments.push({
filename: Buffer.from(files[i].originalname, 'latin1').toString('utf8'),
content: files[i].buffer,
});
}
axios.get(`${ process.env.CRM_API_HOST }/lk/Account/GetCompanyInfo/`, {
params: {
acc_number: client_jwt_decoded.acc_number,
},
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
}
})
.then(async (crm_response) =>
{
console.log({ crm_response: crm_response.data });
const { manager_email } = crm_response.data;
if(manager_email !== undefined && manager_email !== null && manager_email !== "")
{
const mail_result = await transporter.sendMail({
from: '"Devone" <devone@quickcode.ru>',
to: "aepifanov@evoleasing.ru",
subject: `Скан договора №${ contract_number } для сделки №${ deal_id }`,
text: `Клиентом загружен скан договора №${ contract_number } для сделки №${ deal_id }`,
attachments,
});
console.log({ mail_result });
}
res.status(200).send();
resolve();
})
.catch((crm_error) =>
{
console.error({ crm_error: crm_error.data });
res.status(500).send();
resolve();
})
});
}
else
{
res.status(403).send();
resolve();
}
}
else
{
res.status(403).send();
resolve();
}
});
}
export const config = {
api: {
bodyParser: false
}
}

View File

@ -4816,6 +4816,11 @@ node-releases@^1.1.71:
resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz"
integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==
nodemailer@^6.9.7:
version "6.9.7"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.7.tgz#ec2f488f62ba1558e7b19239b62778df4a5c4397"
integrity sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==
normalize-path@^2.0.0, normalize-path@^2.0.1:
version "2.1.1"
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz"