281 lines
12 KiB
TypeScript
281 lines
12 KiB
TypeScript
import type { ProcessContext } from '../types';
|
||
import { createValidationSchema } from './validation';
|
||
import type { Elements } from '@/Components/Calculation/config/map/values';
|
||
import * as CRMTypes from '@/graphql/crm.types';
|
||
import ValidationHelper from '@/stores/validation/helper';
|
||
import { reaction } from 'mobx';
|
||
import { uid } from 'radash';
|
||
|
||
export function common({ store, apolloClient }: ProcessContext) {
|
||
const { $calculation } = 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']),
|
||
async ({ product: productId }) => {
|
||
if (!productId) {
|
||
$calculation.element('tbxSupplierDiscountRub').block().resetValue();
|
||
$calculation.element('tbxSupplierDiscountPerc').block().resetValue();
|
||
$calculation.element('tbxLeaseObjectPrice').block().resetValue();
|
||
$calculation.element('tbxVATInLeaseObjectPrice').block().resetValue();
|
||
$calculation.element('selectImportProgram').unblock().resetValue();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_baseproduct },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetProductDocument,
|
||
variables: {
|
||
productId,
|
||
},
|
||
});
|
||
|
||
if (evo_baseproduct?.evo_sale_without_nds) {
|
||
$calculation.element('tbxSupplierDiscountRub').block().resetValue();
|
||
$calculation.element('tbxSupplierDiscountPerc').block().resetValue();
|
||
$calculation.element('tbxLeaseObjectPrice').unblock();
|
||
$calculation.element('tbxVATInLeaseObjectPrice').unblock();
|
||
$calculation.element('selectImportProgram').block().resetValue();
|
||
$calculation.element('cbxLeaseObjectUsed').setValue(true);
|
||
} else {
|
||
$calculation.element('tbxSupplierDiscountRub').unblock();
|
||
$calculation.element('tbxSupplierDiscountPerc').unblock();
|
||
$calculation.element('tbxLeaseObjectPrice').unblock();
|
||
$calculation.element('tbxVATInLeaseObjectPrice').block();
|
||
$calculation.element('selectImportProgram').unblock();
|
||
}
|
||
},
|
||
{
|
||
fireImmediately: true,
|
||
}
|
||
);
|
||
|
||
/**
|
||
* Добавить реакцию на изменение поля Пересчет без пересмотра cbxRecalcWithRevision и загрузку КП:
|
||
* ЕСЛИ в поле Продукт selectProduct выбрана запись и поле БУбезНДС evo_sale_without_nds = True
|
||
* и Пересчет без пересмотра cbxRecalcWithRevision = True,
|
||
*
|
||
* то поля "Первый платеж, руб." tbxFirstPaymentRub
|
||
* и "Первый платеж %" tbxFirstPaymentPerc закрыты для редактирования,
|
||
* иначе открыты для редактирования
|
||
*/
|
||
reaction(
|
||
() => $calculation.$values.getValues(['recalcWithRevision', 'quote']),
|
||
async ({ recalcWithRevision }) => {
|
||
const productId = $calculation.element('selectProduct').getValue();
|
||
|
||
if (!productId) {
|
||
$calculation.element('tbxFirstPaymentPerc').unblock();
|
||
$calculation.element('tbxFirstPaymentRub').unblock();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_baseproduct },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetProductDocument,
|
||
variables: {
|
||
productId,
|
||
},
|
||
});
|
||
|
||
if (evo_baseproduct?.evo_sale_without_nds && 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();
|
||
}
|
||
}
|
||
);
|
||
|
||
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']),
|
||
async ({ leaseObjectUsed, subsidy, product: productId, dealer: dealerId }) => {
|
||
if (!productId || !dealerId) {
|
||
$calculation.element('radioDeliveryTime').unblock();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_baseproduct },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetProductDocument,
|
||
variables: { productId },
|
||
});
|
||
|
||
const {
|
||
data: { dealer },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetDealerDocument,
|
||
variables: { dealerId },
|
||
});
|
||
|
||
if (
|
||
leaseObjectUsed ||
|
||
subsidy ||
|
||
evo_baseproduct?.evo_sale_without_nds ||
|
||
dealer?.evo_return_leasing_dealer
|
||
) {
|
||
$calculation.element('radioDeliveryTime').setValue(100_000_000).block();
|
||
} else {
|
||
$calculation.element('radioDeliveryTime').unblock();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('selectSubsidy').getValue(),
|
||
(subsidyId) => {
|
||
if (subsidyId) {
|
||
$calculation.element('tbxLeaseObjectCount').setValue(1).block();
|
||
$calculation.element('cbxLeaseObjectUsed').setValue(false).block();
|
||
} else {
|
||
$calculation.element('tbxLeaseObjectCount').unblock();
|
||
$calculation.element('cbxLeaseObjectUsed').unblock();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('cbxLeaseObjectUsed').getValue(),
|
||
(leaseObjectUsed) => {
|
||
if (leaseObjectUsed) {
|
||
$calculation.element('tbxVIN').unblock();
|
||
} else {
|
||
$calculation.element('tbxVIN').resetValue().block();
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
const key = uid(7);
|
||
|
||
export function validation(context: ProcessContext) {
|
||
const { store } = context;
|
||
const { $calculation } = store;
|
||
const validationSchema = createValidationSchema(context);
|
||
|
||
const helper = new ValidationHelper();
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'engineHours',
|
||
'leaseObjectCategory',
|
||
'leaseObjectType',
|
||
'leaseObjectUsed',
|
||
'mileage',
|
||
'vin',
|
||
]),
|
||
async (values) => {
|
||
helper.removeErrors();
|
||
const validationResult = await validationSchema.safeParseAsync(values);
|
||
|
||
if (!validationResult.success) {
|
||
validationResult.error.errors.forEach(({ path, message }) => {
|
||
(path as Elements[]).forEach((elementName) => {
|
||
const removeError = $calculation.element(elementName).setError({ key, message });
|
||
if (removeError) helper.add(removeError);
|
||
});
|
||
});
|
||
}
|
||
},
|
||
{
|
||
delay: 100,
|
||
}
|
||
);
|
||
}
|