312 lines
13 KiB
TypeScript
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 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);