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