From ff81fdd6fa329980e0672308e48338381eaa8cd0 Mon Sep 17 00:00:00 2001 From: DwCay Date: Tue, 7 Mar 2023 19:16:19 +0300 Subject: [PATCH] =?UTF-8?q?WIP=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=81=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B5=D0=B4=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D0=BA=D0=BE=D0=B9=20=D0=BA=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/base/BaseStepperQuasar.vue | 4 + .../components/FormCreateMedicalCard.vue | 27 ++- src/pages/clients/utils/wrapperClientForm.js | 202 ++++++++++++++++++ .../components/MedicalBaseData.vue | 2 + .../components/MedicalIdentityDocuments.vue | 4 +- .../components/MedicalPolicyDocuments.vue | 15 +- 6 files changed, 241 insertions(+), 13 deletions(-) create mode 100644 src/pages/clients/utils/wrapperClientForm.js diff --git a/src/components/base/BaseStepperQuasar.vue b/src/components/base/BaseStepperQuasar.vue index ea929a9..86be752 100644 --- a/src/components/base/BaseStepperQuasar.vue +++ b/src/components/base/BaseStepperQuasar.vue @@ -69,6 +69,10 @@ export default { type: String, default: "Завершить", }, + finish: { + type: Function, + default: () => {}, + }, }, }; diff --git a/src/pages/clients/components/FormCreateMedicalCard.vue b/src/pages/clients/components/FormCreateMedicalCard.vue index d5d86db..617844a 100644 --- a/src/pages/clients/components/FormCreateMedicalCard.vue +++ b/src/pages/clients/components/FormCreateMedicalCard.vue @@ -8,6 +8,7 @@ :currentStep="currentStep", :next-step="nextStep", :prev-step="prevStep", + :finish="finishCreateCard", finishLabel="Создать медицинскую карту", flat ) @@ -23,6 +24,7 @@ import BaseSelect from "@/components/base/BaseSelect"; import MedicalBaseData from "@/pages/medicalCard/components/MedicalBaseData"; import MedicalIdentityDocuments from "@/pages/medicalCard/components/MedicalIdentityDocuments"; import MedicalPolicyDocuments from "@/pages/medicalCard/components/MedicalPolicyDocuments"; +import { requestMedicalCardData } from "@/pages/clients/utils/wrapperClientForm"; import { fetchWrapper } from "@/shared/fetchWrapper.js"; import BaseStepperQuasar from "@/components/base/BaseStepperQuasar"; @@ -81,17 +83,31 @@ export default { prevStep() { this.currentStep -= 1; }, - finish() {}, + finishCreateCard() { + requestMedicalCardData(this.clientData, this.sourceСlientDetail).then( + () => + fetchWrapper.post(`medical_card/medical_history/create/`, { + person: this.sourceСlientDetail.id, + organization: "3883e8f5-cede-4645-97a3-6d1511e63d10", + agreement: false, + }) + ); + }, fetchClientDetail() { fetchWrapper - .get(`/general/person/${this.selectedClientId}/detail/`) + .get(`general/person/${this.selectedClientId}/detail/`) .then((detail) => this.saveClientDetail(detail)); }, saveClientDetail(detail) { this.sourceСlientDetail = detail; this.clientData = { id: detail.id, - address: detail.address, + registration_address: detail.address.find( + (address) => address.registration_flg + )?.join_address, + temporary_address: detail.address.find( + (address) => address.temporary_registration_flg + )?.join_address, benefit_code: detail.benefit_code, birth_date: detail.birth_date ? new Date(detail.birth_date) : null, //contacts: detail.contacts, @@ -103,6 +119,9 @@ export default { special_mark: detail.special_mark, phone: detail.contacts.find((el) => el.kind === "PHONE")?.username, email: detail.contacts.find((el) => el.kind === "EMAIL")?.username, + confidant_name: "", + confidant_phone: "", + policy: "OMS", }; this.saveClientIdentityDoc(detail.identity_documents); this.saveCLientPolicy(detail.insurance_policy); @@ -133,7 +152,7 @@ export default { let identityDoc = data.find((el) => el.kind === "PASSPORT"); this.clientData.identity_documents = { kind: "PASSPORT", - number: + series_number: identityDoc?.series && identityDoc?.number ? `${identityDoc?.series} ${identityDoc?.number}` : "", diff --git a/src/pages/clients/utils/wrapperClientForm.js b/src/pages/clients/utils/wrapperClientForm.js new file mode 100644 index 0000000..acc293d --- /dev/null +++ b/src/pages/clients/utils/wrapperClientForm.js @@ -0,0 +1,202 @@ +import { fetchWrapper } from "@/shared/fetchWrapper"; +import moment from "moment/moment"; + +export async function updatePerson(data, initialData) { + const dataPerson = { + full_name: data.full_name, + birth_date: moment(data.birth_date).format("YYYY-MM-DD"), + insurance_number: data.insurance_number, + gender: data.gender, + benefit_code: data.benefit_code, + }; + const notEmptyData = {}; + Object.keys(dataPerson).forEach((key) => { + if (dataPerson[key] && initialData[key] !== dataPerson[key]) { + notEmptyData[key] = dataPerson[key]; + } + }); + return Object.keys(notEmptyData).length + ? fetchWrapper + .post(`general/person/${data.id}/update/`, notEmptyData) + .then((res) => res) + : Promise.resolve(); +} + +export async function requestAddress(data, initialData) { + const registrationInit = initialData.address.find( + (add) => add.registration_flg + ); + const temporaryInit = initialData.address.find( + (add) => add.temporary_registration_flg + ); + let resultRequestRegistration = Promise.resolve(); + let resultRequestTemporary = Promise.resolve(); + if (!registrationInit && data.registration_address) { + resultRequestRegistration = fetchWrapper.post(`general/address/create/`, { + person: data.id, + full_address: data.registration_address, + registration_flg: true, + }); + } + if ( + registrationInit && + registrationInit.join_address !== data.registration_address + ) { + resultRequestRegistration = fetchWrapper.post( + `general/address/${registrationInit.id}/update/`, + { + full_address: data.registration_address, + } + ); + } + if (!temporaryInit && data.temporary_address) { + resultRequestTemporary = fetchWrapper.post(`general/address/create/`, { + person: data.id, + full_address: data.temporary_address, + temporary_registration_flg: true, + }); + } + if (temporaryInit && temporaryInit.join_address !== data.temporary_address) { + resultRequestTemporary = fetchWrapper.post( + `general/address/${registrationInit.id}/update/`, + { + full_address: data.temporary_address, + } + ); + } + return Promise.all([resultRequestRegistration, resultRequestTemporary]); +} + +export async function requestContacts(data, dataInit) { + const phoneInit = dataInit.contacts.find((el) => el.kind === "PHONE"); + const emailInit = dataInit.contacts.find((el) => el.kind === "EMAIL"); + let resultRequestPhone = Promise.resolve(); + let resultRequestEmail = Promise.resolve(); + if (!phoneInit && data.phone) { + resultRequestPhone = fetchWrapper.post(`general/contact/create/`, { + person: data.id, + username: data.phone, + kind: "PHONE", + }); + } + if (phoneInit && phoneInit?.username !== data.phone) { + resultRequestPhone = fetchWrapper.post( + `general/contact/${phoneInit.id}/update/`, + { + person: data.id, + username: data.phone, + kind: "PHONE", + } + ); + } + if (!emailInit && data.email) { + resultRequestEmail = fetchWrapper.post(`general/contact/create/`, { + person: data.id, + username: data.email, + kind: "EMAIL", + }); + } + if (emailInit && emailInit?.username !== data.email) { + resultRequestEmail = fetchWrapper.post( + `general/contact/${emailInit.id}/update/`, + { + person: data.id, + username: data.email, + kind: "EMAIL", + } + ); + } + return Promise.all([resultRequestPhone, resultRequestEmail]); +} + +export async function requestIdentityDoc(data, dataInit) { + let identityInit = dataInit.identity_documents.find( + (doc) => doc.kind === "PASSPORT" + ); + identityInit = { + ...identityInit, + series_number: + identityInit?.series && identityInit?.number + ? `${identityInit.series} ${identityInit.number}` + : "", + }; + const dataIdentity = { + ...data.identity_documents, + issued_by_date: moment(data.identity_documents.issued_by_date).format( + "YYYY-MM-DD" + ), + }; + const notEmptyIdentityDoc = {}; + Object.keys(dataIdentity).forEach((key) => { + if (dataIdentity[key] && dataIdentity[key] !== identityInit[key]) { + notEmptyIdentityDoc[key] = dataIdentity[key]; + } + }); + if (Object.keys(notEmptyIdentityDoc).length) { + if (!identityInit) { + return fetchWrapper.post(`general/identity_document/create/`, { + ...notEmptyIdentityDoc, + person: dataInit.id, + }); + } else { + return fetchWrapper.post( + `general/identity_document/${identityInit.id}/update/`, + { + ...notEmptyIdentityDoc, + } + ); + } + } else { + return Promise.resolve(); + } +} + +export async function requestPolicy(data, dataInit) { + const policyInit = + data.policy === "OMS" + ? dataInit.insurance_policy.find((el) => el.title === "OMS") + : dataInit.insurance_policy.find((el) => el.title === "DMS"); + const dataPolicy = data.policy === "OMS" ? data.OMSPolicy : data.DMSPolicy; + const dataRequest = { + organization: dataPolicy.organization, + series: dataPolicy.number.split(" ")[0], + number: dataPolicy.number.split(" ")[1], + }; + const notEmptyPolicy = {}; + Object.keys(dataRequest).forEach((key) => { + if (!policyInit && dataRequest[key]) { + notEmptyPolicy[key] = dataRequest[key]; + } + if (policyInit && policyInit[key] !== dataRequest[key]) { + notEmptyPolicy[key] = dataRequest[key]; + } + }); + if (Object.keys(notEmptyPolicy).length) { + if (!policyInit) { + return fetchWrapper.post(`general/insurance_policy/create/`, { + ...notEmptyPolicy, + title: data.policy, + person: data.id, + }); + } else { + return fetchWrapper.post( + `general/insurance_policy/${policyInit.id}/update/`, + { + ...notEmptyPolicy, + title: data.policy, + } + ); + } + } else { + return Promise.resolve(); + } +} +export async function requestMedicalCardData(data, init) { + return Promise.all([ + updatePerson(data, init), + requestAddress(data, init), + requestContacts(data, init), + requestIdentityDoc(data, init), + requestPolicy(data, init), + ]); +} diff --git a/src/pages/medicalCard/components/MedicalBaseData.vue b/src/pages/medicalCard/components/MedicalBaseData.vue index c28bfd6..e531d52 100644 --- a/src/pages/medicalCard/components/MedicalBaseData.vue +++ b/src/pages/medicalCard/components/MedicalBaseData.vue @@ -35,11 +35,13 @@ base-input( label="Адрес регистрации", placeholder="Введите полный адрес", + v-model="clientDetail.registration_address" outlined ) base-input( label="Фактический адрес места жительства", placeholder="Введите полный адрес", + v-model="clientDetail.temporary_address" outlined ) .flex.gap-x-4 diff --git a/src/pages/medicalCard/components/MedicalIdentityDocuments.vue b/src/pages/medicalCard/components/MedicalIdentityDocuments.vue index d88763d..962a5b9 100644 --- a/src/pages/medicalCard/components/MedicalIdentityDocuments.vue +++ b/src/pages/medicalCard/components/MedicalIdentityDocuments.vue @@ -6,7 +6,8 @@ base-input( label="Серия и номер", placeholder="0000 000000", - v-model="clientDetail.identity_documents.number", + mask="#### ######", + v-model="clientDetail.identity_documents.series_number", outlined ) base-input( @@ -19,6 +20,7 @@ base-input( label="Код подразделения", placeholder="000-000", + mask="###-###", v-model="clientDetail.identity_documents.issued_by_org_code", outlined ) diff --git a/src/pages/medicalCard/components/MedicalPolicyDocuments.vue b/src/pages/medicalCard/components/MedicalPolicyDocuments.vue index 43c8ae1..6cd4d70 100644 --- a/src/pages/medicalCard/components/MedicalPolicyDocuments.vue +++ b/src/pages/medicalCard/components/MedicalPolicyDocuments.vue @@ -3,7 +3,7 @@ span.font-bold Полис base-radio-buttons-group( :items="policiesList", - v-model="policy", + v-model="clientDetail.policy", :columnGap="152", inline ) @@ -41,17 +41,21 @@ base-input( label="Код категории льготы", placeholder="000", - v-model="clientDetail.benefit_code",, + mask="###" + v-model="clientDetail.benefit_code", outlined ) base-input( label="К кому обращаться в случае необходимости", placeholder="ФИО*", + v-model="clientDetail.confidant_name", outlined ) base-input( label="Номер телефона", placeholder="+7 (915) 644–92–23", + mask="+7 (###) ###-##-##", + v-model="clientDetail.confidant_phone", outlined ) @@ -72,17 +76,12 @@ export default { props: { clientDetail: Object, }, - data() { - return { - policy: "OMS", - }; - }, computed: { policiesList() { return medicalDetailConfig.policiesList; }, selectedOMSPolicy() { - return this.policy === "OMS"; + return this.clientDetail.policy === "OMS"; }, }, };