2023-10-18 12:33:51 +03:00

584 lines
18 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from "react";
import { connect } from "react-redux";
import moment from "moment";
import { SpinnerCircular } from "spinners-react";
import { concatSeries } from "async";
import { eachSeries } from 'async';
import Select from 'react-select';
import { createEDOProject, docEDOCancel, signCheckEDOCreatePrintForm, signCheckPowerAttorneyClient, signDownloadFile, signGetGUIDEntity, signGetPowerAttorneyClient, signGetWMDoc, docEDOSign, docEDOStatus, docEDOConnect, getFile, signGetFileContractProject } from "../../actions";
//import { getDeals, getDealOffers, getDealDocuments, getDealContracts } from "../../actions";
class EDOSign extends React.Component
{
constructor(props)
{
super(props)
this.state = {
finished: false,
operators: null,
loading: false,
disabled: false,
documents: [],
operator_selected: {},
statuses: {},
step: 0,
}
}
static getDerivedStateFromProps(nextProps, prevState)
{
console.log("EDOSign", "getDerivedStateFromProps", { nextProps });
return {
operators: nextProps.operators,
}
}
componentDidMount()
{
const docs = [];
for(let i in this.props.documents)
{
docs.push({ ...this.props.documents[i], ...{ index: i, loading: true, ready: false, attorney: false } });
}
this.setState({ documents: docs });
if(this.state.operator_selected.box_id === undefined)
{
this.setState({ operator_selected: this.state.operators !== null && this.state.operators[0] !== undefined ? this.state.operators[0] : {} });
}
}
_updateDocs = (id, update) =>
{
return new Promise((resolve) =>
{
const docs = [ ...this.state.documents ];
docs[ id ] = { ...docs[id], ...update };
this.setState({ documents: docs }, () =>
{
resolve();
});
});
}
_checkDocumentsCompleted = () =>
{
const { documents } = this.state;
let completed = true;
for(let i in documents)
{
console.log({ fin: documents[i] });
if(!documents[i].completed)
completed = false;
break;
}
return completed;
}
_sign = () =>
{
//const { documents } = this.props;
const { operator_selected, step } = this.state;
const documents = [ ...this.state.documents ];
console.log("_handle_onFormSubmit");
console.log({ documents, operator_selected });
this.setState({ loading: true }, () =>
{
eachSeries(documents, async (document, callback) =>
{
if(document.completed)
{
callback();
}
else if(document.signing)
{
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)
{
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
{
console.log({ document })
await this._updateDocs(document.index, { loading: true });
if(document.attorney && document.attorney_selected !== undefined)
{
const create_edo_project_result = await createEDOProject({
contract_number: document.id,
power_attorney: document.attorney_selected.value,
power_attorney_number: document.attorney_selected.label,
edo_box: operator_selected.edo_box,
});
console.log("\n\nIMPORTANT !!!!!!!!!!\n\n");
console.log({ create_edo_project_result });
const get_guid_entity_result = await signGetGUIDEntity({
contract_number: document.id,
});
console.log("\n\nENTITY !!!!!!!!!!\n\n");
console.log({ get_guid_entity_result });
const wmdoc_result = await signGetWMDoc({
entity_name: "evo_contract",
entity_id: get_guid_entity_result.entityid,
sign_type: "EDO",
evo_id: "144",
});
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,
loading: false,
attorney: false,
});
callback();
}
else
{
const create_print_form_result = await signCheckEDOCreatePrintForm({ contract_number: document.id, sign_type: "EDO" });
console.log({ create_print_form_result });
const docs = { status: create_print_form_result.status };
if(create_print_form_result.status !== "success")
{
docs.loading = false;
docs.error = true;
docs.ready = true;
docs.message = create_print_form_result.message;
}
await this._updateDocs(document.index, docs);
if(create_print_form_result.status === "success")
{
const check_attorney_client_result = await signCheckPowerAttorneyClient({ contract_number: document.id })
console.log({ check_attorney_client_result });
await this._updateDocs(document.index, { attorney: check_attorney_client_result.power_attorney_required, });
if(check_attorney_client_result.power_attorney_required)
{
const get_attorney_client_result = await signGetPowerAttorneyClient({ contract_number: document.id });
console.log({ get_attorney_client_result });
if(get_attorney_client_result === null)
{
await this._updateDocs(document.index, { loading: false, error: true, ready: true, message: "Возникла ошибка при создании документа для подписания." });
callback();
}
else
{
if(get_attorney_client_result.length === null)
{
await this._updateDocs(document.index, { loading: false, error: true, ready: true, message: "Не обнаружена доверенность на подписанта. Для продолжения подписания обратитесь к своему персональному менеджеру" });
callback();
}
else
{
const attorneys = [];
for(let i in get_attorney_client_result)
{
attorneys.push({
value: get_attorney_client_result[i].power_attorney,
label: get_attorney_client_result[i].power_attorney_number,
});
}
await this._updateDocs(document.index, { loading: false, error: false, attorneys, attorney_selected: undefined });
callback();
}
}
}
else
{
const create_edo_project_result = await createEDOProject({
contract_number: document.id,
edo_box: operator_selected.edo_box,
});
const get_guid_entity_result = await signGetGUIDEntity({
contract_number: document.id,
});
const wmdoc_result = await signGetWMDoc({
entity_name: "evo_contract",
entity_id: get_guid_entity_result.entityid,
sign_type: "EDO",
evo_id: "144",
});
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,
loading: false,
attorney: false,
});
callback();
}
}
else
{
await this._updateDocs(document.index, { loading: false, error: true, ready: true, message: "Возникла ошибка при создании документа для подписания." });
callback();
}
}
}
}, () =>
{
if(this._checkDocumentsCompleted())
{
this.setState({ loading: false, disabled: false, finished: true, });
}
else
{
this.setState({ loading: false, disabled: false, finished: false, });
}
});
});
}
_handle_onFormSubmit = (event) =>
{
event.preventDefault();
const { onFinish } = this.props;
const { operator_selected, step, finished } = this.state;
const documents = [ ...this.state.documents ];
console.log("_handle_onFormSubmit");
console.log({ documents, operator_selected });
if(finished)
{
onFinish();
}
else
{
switch(step)
{
case 0:
{
this.setState({ step: 1 }, () =>
{
this._sign();
});
}
break;
case 1:
{
this._sign();
}
break;
}
}
}
_handle_onSelectOperator = (operator) =>
{
this.setState({ operator_selected: operator });
}
_handle_onAttorneyChange = (index, attorney) =>
{
console.log("_handle_onAttorneyChange", { index, attorney });
this._updateDocs(index, { attorney_selected: attorney });
}
_handle_onDownloadFile = (index) =>
{
const { documents } = this.state;
this.setState({ loading: true, disabled: true, }, async () =>
{
await this._updateDocs(index, { loading: true });
const link_result = await signGetFileContractProject({
contract_number: documents[index].id,
});
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, });
this.setState({ loading: false, disabled: false, });
});
}
_handle_onCancelFile = async (index) =>
{
const { onCancel } = this.props;
const { documents } = this.state;
await this._updateDocs(index, { loading: true });
this.setState({ loading: true, disabled: true }, async () =>
{
await docEDOCancel({ contract_number: documents[index].id, doc_type_id: "144" });
const docs = [ ...this.state.documents ];
docs.splice(index, 1);
if(docs.length > 0)
{
this.setState({ documents: docs, loading: false, disabled: false, });
}
else
{
onCancel(true);
}
});
}
_handle_onCancel = () =>
{
const { onCancel } = this.props;
const { documents } = this.state;
console.log("documents", documents, "LEN", documents.length);
var clean = false;
if(documents.length === 0)
{
clean = true;
}
onCancel(clean);
}
_handle_onCheckEDOStatus = async (index) =>
{
const { documents } = this.state;
await this._updateDocs(index, { loading: true });
this.setState({ loading: true, disabled: true }, async () =>
{
const status_result = await docEDOStatus({ contract_number: documents[index].id });
console.log({ status_result });
if(status_result.status >= 2)
{
await this._updateDocs(index, { loading: false, disabled: false, signing: false, completed: true, url: status_result.url_edo, });
}
else
{
await this._updateDocs(index, { loading: false, disabled: false, signing: true, completed: false, url: status_result.url_edo, });
}
if(this._checkDocumentsCompleted())
{
this.setState({ loading: false, disabled: false, finished: true, });
}
else
{
this.setState({ loading: false, disabled: false, finished: false, });
}
});
}
_handle_onGoToEDO = (index) =>
{
const { documents } = this.state;
if(documents[index].url !== undefined && documents[index].url !== null)
{
window.open(documents[index].url, "_blank");
}
}
render()
{
const { step, operators, documents, loading, disabled, finished, operator_selected } = this.state;
const { onCancel, } = this.props;
console.log({ operators, documents });
return (
<div className="edo_detail">
<div className="docs_list medium-icon">
<p className="list_title">Подписание через ЭДО</p>
</div>
{ step === 0 && (
<div className="form_field edo_list_field">
<label>Выберите оператора для отправки пакета документов</label>
<div className="edo_list_selection">
{ operators !== undefined && operators !== null && operators.map((operator, index) => (
<div className="form_field checkbox item" key={ index }>
<input type="radio"
checked={ operator.box_id === operator_selected.box_id }
hidden=""
id={ `operator_${ index }` }
name={ `operator_${ index }` }
onChange={ (event) => this._handle_onSelectOperator(operator) }
disabled={ false }
/>
<label htmlFor={ `operator_${ index }` } className="unselectable">{ operator.provider_edo }</label>
</div>
)) }
</div>
</div>
) }
{ step === 1 && (
<div className="docs_list medium-icon edo_sign_documents_list">
{ documents.map((document, index) =>
{
console.log({ document });
return (
<div className="edo_sign_documents_document" key={ index }>
<div className="edo_sign_documents_document_left">
<p className="doc_name i-pdf extension edo_sign_document" data-format={ document.extension }>
{ document.name } от { moment(document.date).format("DD.MM.YYYY") }
{ document.type !== undefined && (<span>{ document.type }</span>) }
</p>
</div>
<div className="edo_sign_documents_document_right">
{ document.loading ? (
<>
{ loading && (
<SpinnerCircular size={ 22 } thickness={ 100 } speed={ 100 } color="rgba(236, 239, 244, 1)" secondaryColor="rgba(28, 1, 169, 1)" />
) }
</>
) : (
<>
{ document.error ? (
<>
<div className="status_icon error"></div>
<i>{ document.message !== undefined && document.message !== null ? document.message : "" }</i>
</>
) : (
<>
{ document.attorney && (
<>
<div className="status_icon await"></div>
<div className="edo_sign_status_attorney_select">
<Select
id="edo_attorneys_list"
name="edo_attorneys_list"
options={ document.attorneys }
placeholder="Выберите доверенность"
noOptionsMessage={ ({ inputValue }) => !inputValue ? "" :"Ничего не найдено" }
isSearchable={ true }
className="autocomlete autocomlete_with_indicators"
classNamePrefix="react-select"
value={ document.attorney_selected }
onChange={ (element) => { this._handle_onAttorneyChange(document.index, element) } }
required={ true }
/>
</div>
</>
) }
{ document.ready && (
<>
<div className="status_icon success"></div>
{ document.entity_id !== undefined && (
<>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onDownloadFile(index) }>Посмотреть проект договора</button>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onCancelFile(index) }>Отменить подписание</button>
</>
) }
</>
) }
{ document.signing && (
<>
<div className="status_icon success"></div>
<div className="status_title">
<i>Идет процесс подписания</i>
</div>
{ document.entity_id !== undefined && (
<>
<button className="button" disabled={ disabled } onClick={ () => this._handle_onCheckEDOStatus(index) }>Проверить статус</button>
</>
) }
</>
) }
{ document.completed && (
<>
<div className="status_icon success"></div>
<div className="status_title">
<i>Договор подписан со стороны "ЛК Эволюция"</i>
</div>
{ document.entity_id !== undefined && (
<button className="button" disabled={ disabled } onClick={ () => this._handle_onGoToEDO(index) }>Перейти в ЭДО</button>
) }
</>
) }
</>
) }
</>
) }
</div>
</div>
)
} ) }
</div>
) }
<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>
) }
</div>
</form>
</div>
)
}
}
function mapStateToProps(state, ownProps)
{
console.log("EDOSign", "mapStateToProps", { state: state });
return {
operators: state.edo.operators,
}
}
export default connect(mapStateToProps)(EDOSign)