import type { ProcessContext } from '../types'; import { createValidationSchema } from './validation'; import * as CRMTypes from '@/graphql/crm.types'; import { createValidationReaction } from '@/process/tools'; import { disposableReaction } from '@/utils/mobx'; import { reaction } from 'mobx'; export function common({ store, apolloClient }: ProcessContext) { const { $calculation, $process } = store; /** * Создаем реакцию на выбор Продукта selectProduct: * * Если в поле Продукт selectProduct значение не выбрано, то * поле Валюта поставщика selectSupplierCurrency закрыть для редактирования и сделать равным RUB * поле Скидка от поставщика tbxSupplierDiscountRub закрыть для редактирования и сделать равным 0 * поле Скидка от поставщика, % tbxSupplierDiscountPerc закрыть для редактирования и сделать равным 0 * поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice закрыть для редактирования * поле Стоимость предмета лизинга без НДС xxx закрыть для редактирования * поле НДС в стоимости предмета лизинга xxx закрыть для редактирования * * Если в поле Продукт selectProduct выбрана запись, у которой БУбезНДС evo_sale_without_nds = True, то: * поле ПЛ БУ cbxLeaseObjectUsed =True и закрыто для редактирования * поле Валюта поставщика selectSupplierCurrency закрыть для редактирования и сделать равным RUB * поле Скидка от поставщика tbxSupplierDiscountRub закрыть для редактирования и сделать равным 0 * поле Скидка от поставщика, % tbxSupplierDiscountPerc закрыть для редактирования и сделать равным 0 * поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice закрыть для редактирования * поле Стоимость предмета лизинга без НДС xxx открыть для редактирования * поле НДС в стоимости предмета лизинга xxx открыть для редактирования * * Если в поле Продукт selectProduct выбрана запись, у которой БУбезНДС evo_sale_without_nds != True, то: * поле ПЛ БУ cbxLeaseObjectUsed открыто для редактирования (проверить на другие реакции открывающие/закрывающие это поле) * поле Валюта поставщика selectSupplierCurrency открыто для редактирования * поле Скидка от поставщика tbxSupplierDiscountRub открыто для редактирования * поле Скидка от поставщика, % tbxSupplierDiscountPerc открыто для редактирования * поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice открыто для редактирования * поле Стоимость предмета лизинга без НДС xxx закрыть для редактирования * поле НДС в стоимости предмета лизинга xxx закрыть для редактирования */ reaction( () => $calculation.$values.getValues(['product', 'recalcWithRevision', 'partialVAT']), async ({ product: productId, partialVAT }) => { if (!productId) { $calculation.element('tbxSupplierDiscountRub').block(); $calculation.element('tbxSupplierDiscountPerc').block(); $calculation.element('tbxLeaseObjectPrice').block(); $calculation.element('tbxVATInLeaseObjectPrice').block(); $calculation.element('selectImportProgram').unblock(); return; } if (productId && partialVAT) { $calculation.element('tbxSupplierDiscountRub').block(); $calculation.element('tbxSupplierDiscountPerc').block(); $calculation.element('tbxLeaseObjectPrice').unblock(); $calculation.element('tbxVATInLeaseObjectPrice').unblock(); $calculation.element('selectImportProgram').block(); } else { $calculation.element('tbxSupplierDiscountRub').unblock(); $calculation.element('tbxSupplierDiscountPerc').unblock(); $calculation.element('tbxLeaseObjectPrice').unblock(); $calculation.element('tbxVATInLeaseObjectPrice').block(); $calculation.element('selectImportProgram').unblock(); } }, { fireImmediately: true, } ); disposableReaction( () => $process.has('LoadKP'), () => $calculation.$values.getValues(['product', 'partialVAT']), async ({ product: productId, partialVAT }) => { if (!productId) { $calculation.element('tbxSupplierDiscountRub').resetValue(); $calculation.element('tbxSupplierDiscountPerc').resetValue(); $calculation.element('tbxLeaseObjectPrice').resetValue(); $calculation.element('tbxLeaseObjectPriceWthtVAT').resetValue(); $calculation.element('tbxVATInLeaseObjectPrice').resetValue(); $calculation.element('selectImportProgram').resetValue(); return; } if (productId && partialVAT) { $calculation.element('tbxSupplierDiscountRub').resetValue(); $calculation.element('tbxSupplierDiscountPerc').resetValue(); $calculation.element('selectImportProgram').resetValue(); } // if ( // productId && // partialVAT && // $calculation.element('cbxRecalcWithRevision').getValue() === false // ) { // $calculation.element('cbxLeaseObjectUsed').setValue(true); // } } ); /** * Добавить реакцию на изменение поля Пересчет без пересмотра cbxRecalcWithRevision и загрузку КП: * ЕСЛИ в поле Продукт selectProduct выбрана запись и поле БУбезНДС evo_sale_without_nds = True * и Пересчет без пересмотра cbxRecalcWithRevision = True, * * то поля "Первый платеж, руб." tbxFirstPaymentRub * и "Первый платеж %" tbxFirstPaymentPerc закрыты для редактирования, * иначе открыты для редактирования */ reaction( () => $calculation.$values.getValues(['recalcWithRevision', 'product', 'partialVAT']), async ({ recalcWithRevision, product: productId, partialVAT }) => { if (!productId) { $calculation.element('tbxFirstPaymentPerc').unblock(); $calculation.element('tbxFirstPaymentRub').unblock(); return; } if (productId && partialVAT && recalcWithRevision) { $calculation.element('tbxFirstPaymentPerc').block(); $calculation.element('tbxFirstPaymentRub').block(); } else { $calculation.element('tbxFirstPaymentPerc').unblock(); $calculation.element('tbxFirstPaymentRub').unblock(); } } ); /** * Реакция на изменение ПЛ БУ cbxLeaseObjectUsed и Тип ПЛ selectLeaseObjectType * Если ПЛ БУ cbxLeaseObjectUsed = True и Тип ПЛ selectLeaseObjectType = Спецтехника (id=9) , * то поле Моточасы tbxEngineHours открыто для редактирования, иначе закрыто и равно 0. */ reaction( () => $calculation.$values.getValues(['leaseObjectUsed', 'leaseObjectType']), async ({ leaseObjectUsed, leaseObjectType: leaseObjectTypeId }) => { if (!leaseObjectTypeId) { $calculation.element('tbxEngineHours').resetValue().unblock(); return; } const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId }, }); if (leaseObjectUsed && evo_leasingobject_type?.evo_id === '9') { $calculation.element('tbxEngineHours').unblock(); } else { $calculation.element('tbxEngineHours').resetValue().block(); } }, { fireImmediately: true, } ); reaction( () => $calculation.element('cbxLeaseObjectUsed').getValue(), (leaseObjectUsed) => { if (leaseObjectUsed) { $calculation.element('tbxMileage').unblock(); } else { $calculation.element('tbxMileage').resetValue().block(); } }, { fireImmediately: true, } ); reaction( () => $calculation.element('cbxLeaseObjectUsed').getValue(), (leaseObjectUsed) => { if (leaseObjectUsed === true) { $calculation.element('selectSubsidy').resetValue().block(); } else { $calculation.element('selectSubsidy').unblock(); } } ); /** * реакция на ПЛ БУ, Субсидию и Продукт и Салон * если ПЛ БУ = Да или Субсидия содержит данные * или в Продукте БУбезНДС = Да, * или в selectDealer указан account, у которого evo_return_leasing_dealer === true * то поле Срок поставки = 100 000 000 и закрыто для редактирования, иначе открыто для редактирования */ reaction( () => $calculation.$values.getValues([ 'leaseObjectUsed', 'subsidy', 'product', 'dealer', 'supplierFinancing', 'partialVAT', ]), async ({ leaseObjectUsed, subsidy: subsidyId, product: productId, dealer: dealerId, supplierFinancing, partialVAT, }) => { let dealer: CRMTypes.GetDealerQuery['dealer'] = null; let evo_subsidy: CRMTypes.GetSubsidyQuery['evo_subsidy'] = null; if (dealerId) { const { data } = await apolloClient.query({ query: CRMTypes.GetDealerDocument, variables: { dealerId }, }); ({ dealer } = data); } if (subsidyId) { const { data } = await apolloClient.query({ query: CRMTypes.GetSubsidyDocument, variables: { subsidyId }, }); ({ evo_subsidy } = data); } const evo_subsidy_evo_delivery_time = evo_subsidy?.evo_delivery_time?.filter((x) => x > 0); if ( leaseObjectUsed || (evo_subsidy_evo_delivery_time?.length === 1 && evo_subsidy_evo_delivery_time.includes(100_000_000)) || (productId && partialVAT) || dealer?.evo_return_leasing_dealer ) { $calculation.element('radioDeliveryTime').setValue(100_000_000).block(); } else if ( (evo_subsidy_evo_delivery_time?.length === 1 && evo_subsidy_evo_delivery_time.includes(100_000_001)) || supplierFinancing ) { $calculation.element('radioDeliveryTime').setValue(100_000_001).block(); } else { $calculation.element('radioDeliveryTime').unblock(); } } ); reaction( () => $calculation.$values.getValues(['subsidy', 'supplierFinancing']), ({ subsidy: subsidyId, supplierFinancing }) => { if (subsidyId) { $calculation.element('tbxLeaseObjectCount').setValue(1).block(); } else { $calculation.element('tbxLeaseObjectCount').unblock(); } if (subsidyId || supplierFinancing) { $calculation.element('cbxLeaseObjectUsed').setValue(false).block(); } else { $calculation.element('cbxLeaseObjectUsed').unblock(); } } ); reaction( () => $calculation.element('cbxLeaseObjectUsed').getValue(), (leaseObjectUsed) => { if (leaseObjectUsed) { $calculation.element('tbxVIN').unblock(); } else { $calculation.element('tbxVIN').resetValue().block(); } } ); /** * Если Продукт selectProduct в "ID" содержит "IZT" * то поле "ПЛ БУ" leaseObjectUsed = true Да и закрыто для редактирования, * иначе открыто для редактирования */ reaction( () => $calculation.element('selectProduct').getValue(), async (productId) => { let izt = false; if (productId) { const { data: { evo_baseproduct }, } = await apolloClient.query({ query: CRMTypes.GetProductDocument, variables: { productId }, }); if (evo_baseproduct?.evo_product_properties) izt = evo_baseproduct?.evo_product_properties?.includes(100_000_000); } if (izt) $calculation.element('cbxLeaseObjectUsed').setValue(true).block(); else $calculation.element('cbxLeaseObjectUsed').unblock(); } ); } export const validation = createValidationReaction(createValidationSchema);