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, signCheckCreatePrintForm, signCheckPowerAttorneyClient, signDownloadFile, signGetGUIDEntity, signGetPowerAttorneyClient, signGetWMDoc, docEDOSign, docEDOStatus, docEDOConnect, getFile, signGetFileContractProject, signCheckCancelDocument } from "../../actions"; //import { getDeals, getDealOffers, getDealDocuments, getDealContracts } from "../../actions"; class EDOSign extends React.Component { constructor(props) { super(props) this.state = { finished: false, operators: null, edo_message: null, loading: false, disabled: false, documents: [], operator_selected: {}, statuses: {}, step: 0, } } static getDerivedStateFromProps(nextProps, prevState) { return { operators: nextProps.operators, edo_message: nextProps.edo_message, } } 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) { if(!documents[i].completed) completed = false; break; } return completed; } _sign = () => { const { operator_selected, step } = this.state; const documents = [ ...this.state.documents ]; 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) { await this._updateDocs(document.index, { loading: true, }); const status_result = await docEDOStatus({ contract_number: document.id }); 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 { 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, }); 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", code: "Leas_Contract", }); 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 signCheckCreatePrintForm({ contract_number: document.id, sign_type: "EDO" }); 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 }) 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 }); 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", }); 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: create_print_form_result.message !== undefined && create_print_form_result.message !== null ? create_print_form_result.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, onGoToEDOInvites } = this.props; const { operators, operator_selected, step, finished } = this.state; const documents = [ ...this.state.documents ]; if(operators !== null && operators.length === 0) { onGoToEDOInvites(); } else { 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) => { 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, }); 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 signCheckCancelDocument({ 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; 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 }); 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, edo_message, documents, loading, disabled, finished, operator_selected } = this.state; const { onCancel, } = this.props; return (
Подписание через ЭДО
{ document.name } от { moment(document.date).format("DD.MM.YYYY") } { document.type !== undefined && ({ document.type }) }