593 lines
18 KiB
TypeScript
593 lines
18 KiB
TypeScript
/* eslint-disable @typescript-eslint/naming-convention */
|
||
import type { ProcessContext } from '../types';
|
||
import helper from './lib/helper';
|
||
import { getTransTax } from '@/api/1c/query';
|
||
import { selectObjectCategoryTax } from '@/config/default-options';
|
||
import { STALE_TIME } from '@/constants/request';
|
||
import * as CRMTypes from '@/graphql/crm.types';
|
||
import ValidationHelper from '@/stores/validation/helper';
|
||
import type { QueryFunctionContext } from '@tanstack/react-query';
|
||
import dayjs from 'dayjs';
|
||
import utc from 'dayjs/plugin/utc';
|
||
import { reaction } from 'mobx';
|
||
import { makeDisposable, normalizeOptions } from 'tools';
|
||
|
||
dayjs.extend(utc);
|
||
|
||
export function common({ store, apolloClient, queryClient }: ProcessContext) {
|
||
const { $calculation, $process } = store;
|
||
|
||
reaction(
|
||
() => $calculation.element('selectLeaseObjectType').getValue(),
|
||
async (leaseObjectTypeId) => {
|
||
if (!leaseObjectTypeId) {
|
||
$calculation.element('radioObjectRegistration').resetValue().unblock();
|
||
|
||
return;
|
||
}
|
||
const {
|
||
data: { evo_leasingobject_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetLeaseObjectTypeDocument,
|
||
variables: { leaseObjectTypeId },
|
||
});
|
||
|
||
if (
|
||
evo_leasingobject_type?.evo_id &&
|
||
['6', '9', '10', '11'].includes(evo_leasingobject_type.evo_id)
|
||
) {
|
||
$calculation.element('radioObjectRegistration').setValue(100_000_000).block();
|
||
} else {
|
||
$calculation.element('radioObjectRegistration').unblock();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['objectRegistration', 'vehicleTaxInYear']),
|
||
({ objectRegistration, vehicleTaxInYear }) => {
|
||
if (objectRegistration === 100_000_001) {
|
||
$calculation.element('tbxVehicleTaxInYear').unblock();
|
||
} else {
|
||
$calculation.element('tbxVehicleTaxInYear').resetValue().block();
|
||
}
|
||
$calculation.element('tbxVehicleTaxInYear').validate({
|
||
invalid: objectRegistration === 100_000_001 && !(vehicleTaxInYear > 0),
|
||
message: 'Значение должно быть больше 0',
|
||
});
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['objectRegistration', 'typePTS']),
|
||
({ objectRegistration, typePTS }) => {
|
||
if (objectRegistration === 100_000_001) {
|
||
$calculation.element('radioTypePTS').unblock();
|
||
} else {
|
||
$calculation.element('radioTypePTS').resetValue().block();
|
||
}
|
||
$calculation.element('radioTypePTS').validate({
|
||
invalid: objectRegistration === 100_000_001 && !typePTS,
|
||
message: 'Не заполнено поле',
|
||
});
|
||
}
|
||
);
|
||
|
||
makeDisposable(
|
||
() =>
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'leaseObjectType',
|
||
'objectCategoryTax',
|
||
'objectRegistration',
|
||
]),
|
||
async ({ leaseObjectType: leaseObjectTypeId, objectRegistration, objectCategoryTax }) => {
|
||
if (objectRegistration === 100_000_001) {
|
||
if (objectCategoryTax && [100_000_006, 100_000_009].includes(objectCategoryTax)) {
|
||
$calculation.element('selectObjectTypeTax').setValue(100_000_002);
|
||
} else if (leaseObjectTypeId) {
|
||
const {
|
||
data: { evo_leasingobject_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetLeaseObjectTypeDocument,
|
||
variables: { leaseObjectTypeId },
|
||
});
|
||
|
||
if (evo_leasingobject_type?.evo_vehicle_type_tax) {
|
||
$calculation
|
||
.element('selectObjectTypeTax')
|
||
.setValue(evo_leasingobject_type?.evo_vehicle_type_tax);
|
||
} else {
|
||
$calculation.element('selectObjectTypeTax').resetValue();
|
||
}
|
||
}
|
||
} else {
|
||
$calculation.element('selectObjectTypeTax').resetValue();
|
||
}
|
||
}
|
||
),
|
||
() => $process.has('LoadKP')
|
||
);
|
||
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'leaseObjectType',
|
||
'leaseObjectCategory',
|
||
'typePTS',
|
||
'objectRegistration',
|
||
]),
|
||
async ({
|
||
leaseObjectType: leaseObjectTypeId,
|
||
leaseObjectCategory,
|
||
typePTS,
|
||
objectRegistration,
|
||
}) => {
|
||
if (objectRegistration === 100_000_001 && typePTS === 100_000_001) {
|
||
$calculation.element('selectObjectCategoryTax').unblock();
|
||
if (leaseObjectTypeId) {
|
||
const {
|
||
data: { evo_leasingobject_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetLeaseObjectTypeDocument,
|
||
variables: { leaseObjectTypeId },
|
||
});
|
||
if (leaseObjectCategory && leaseObjectCategory === evo_leasingobject_type?.evo_category) {
|
||
$calculation
|
||
.element('selectObjectCategoryTax')
|
||
.setOptions(
|
||
selectObjectCategoryTax.filter((option) =>
|
||
evo_leasingobject_type?.evo_category_tr?.includes(option.value)
|
||
)
|
||
);
|
||
} else {
|
||
$calculation.element('selectObjectCategoryTax').resetOptions();
|
||
}
|
||
}
|
||
} else {
|
||
$calculation.element('selectObjectCategoryTax').resetValue().block();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['leasingPeriod', 'vehicleTaxInYear']),
|
||
({ leasingPeriod, vehicleTaxInYear }) => {
|
||
if (vehicleTaxInYear > 0) {
|
||
$calculation
|
||
.element('tbxVehicleTaxInLeasingPeriod')
|
||
.setValue((vehicleTaxInYear / 12) * leasingPeriod);
|
||
} else {
|
||
$calculation.element('tbxVehicleTaxInLeasingPeriod').resetValue();
|
||
}
|
||
}
|
||
);
|
||
|
||
const mapObjectTypeTaxToCategory = {
|
||
100_000_000: 'D',
|
||
100_000_001: 'B',
|
||
100_000_002: 'C',
|
||
100_000_003: 'T',
|
||
100_000_004: 'A',
|
||
};
|
||
|
||
function getCarCategory(objectTypeTax: number) {
|
||
return mapObjectTypeTaxToCategory[objectTypeTax as keyof typeof mapObjectTypeTaxToCategory];
|
||
}
|
||
|
||
makeDisposable(
|
||
() =>
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'objectRegistration',
|
||
'objectTypeTax',
|
||
'regionRegistration',
|
||
'leaseObjectYear',
|
||
'leaseObjectMotorPower',
|
||
]),
|
||
async ({
|
||
objectRegistration,
|
||
objectTypeTax,
|
||
regionRegistration,
|
||
leaseObjectYear,
|
||
leaseObjectMotorPower,
|
||
}) => {
|
||
if (
|
||
objectRegistration === null ||
|
||
objectRegistration !== 100_000_001 ||
|
||
objectTypeTax === null ||
|
||
regionRegistration === null ||
|
||
leaseObjectYear === 0 ||
|
||
leaseObjectMotorPower === 0
|
||
) {
|
||
$calculation.element('tbxVehicleTaxInYear').resetValue();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_region },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetRegionDocument,
|
||
variables: {
|
||
regionId: regionRegistration,
|
||
},
|
||
});
|
||
|
||
const OKTMO = evo_region?.evo_oktmo;
|
||
const carCategory = getCarCategory(objectTypeTax);
|
||
|
||
if (OKTMO) {
|
||
const currentDate = dayjs().utc(false).toDate();
|
||
|
||
const request = (context: QueryFunctionContext) =>
|
||
getTransTax(
|
||
{
|
||
OKTMO,
|
||
calcDate: currentDate,
|
||
carCategory,
|
||
power: leaseObjectMotorPower,
|
||
year: leaseObjectYear,
|
||
},
|
||
context
|
||
);
|
||
const { tax, error } = await queryClient.fetchQuery(['1c', 'trans-tax'], request, {
|
||
staleTime: STALE_TIME,
|
||
});
|
||
|
||
if (!error && tax) {
|
||
$calculation.element('tbxVehicleTaxInYear').setValue(tax);
|
||
} else {
|
||
$calculation.element('tbxVehicleTaxInYear').resetValue();
|
||
}
|
||
} else {
|
||
$calculation.element('tbxVehicleTaxInYear').resetValue();
|
||
}
|
||
}
|
||
),
|
||
() => $process.has('LoadKP')
|
||
);
|
||
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'objectRegionRegistration',
|
||
'objectRegistration',
|
||
'regionRegistration',
|
||
'typePTS',
|
||
'leaseObjectCategory',
|
||
'leaseObjectType',
|
||
]),
|
||
async ({
|
||
objectRegistration,
|
||
objectRegionRegistration: objectRegionRegistrationId,
|
||
regionRegistration: regionRegistrationId,
|
||
typePTS,
|
||
leaseObjectCategory,
|
||
leaseObjectType,
|
||
}) => {
|
||
if (!objectRegionRegistrationId || !regionRegistrationId) {
|
||
$calculation.element('selectRegistration').resetValue();
|
||
|
||
return;
|
||
}
|
||
const currentDate = dayjs().utc(false).toISOString();
|
||
|
||
const {
|
||
data: { evo_region },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetRegionDocument,
|
||
variables: { regionId: objectRegionRegistrationId },
|
||
});
|
||
|
||
const {
|
||
data: { evo_addproduct_types },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetRegistrationTypesDocument,
|
||
variables: { currentDate },
|
||
});
|
||
|
||
const options = evo_addproduct_types
|
||
?.filter(
|
||
(x) =>
|
||
x?.evo_leasingobject_types?.find(
|
||
(evo_leasingobject_type) =>
|
||
evo_leasingobject_type?.evo_leasingobject_typeid === leaseObjectType
|
||
) &&
|
||
x.evo_whom_register === objectRegistration &&
|
||
Boolean(
|
||
leaseObjectCategory === 100_000_001
|
||
? x.evo_towtruck === true || x.evo_towtruck === false
|
||
: x.evo_towtruck === false
|
||
) &&
|
||
x.evo_gibdd_region === (objectRegionRegistrationId === regionRegistrationId) &&
|
||
Boolean(typePTS && x.evo_pts_type?.includes(typePTS)) &&
|
||
Boolean(
|
||
x.evo_accountid &&
|
||
evo_region?.accounts?.some(
|
||
(evo_region_account) => evo_region_account?.accountid === x.evo_accountid
|
||
)
|
||
)
|
||
)
|
||
.map((x) => ({
|
||
...x,
|
||
label: `${x?.label} (${x?.evo_graph_price} руб.)`,
|
||
}));
|
||
|
||
$calculation.element('selectRegistration').setOptions(normalizeOptions(options));
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('selectRegistration').getValue(),
|
||
async (registrationId) => {
|
||
if (!registrationId) {
|
||
$calculation.element('labelRegistrationDescription').resetValue();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_addproduct_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetAddProductTypeDocument,
|
||
variables: { addproductTypeId: registrationId },
|
||
});
|
||
|
||
if (evo_addproduct_type?.evo_description) {
|
||
$calculation
|
||
.element('labelRegistrationDescription')
|
||
.setValue(evo_addproduct_type?.evo_description);
|
||
} else {
|
||
$calculation.element('labelRegistrationDescription').resetValue();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('selectLegalClientRegion').getValue(),
|
||
async (regionId) => {
|
||
if (!regionId) {
|
||
$calculation.element('selectLegalClientTown').resetOptions();
|
||
|
||
return;
|
||
}
|
||
const {
|
||
data: { evo_towns },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetTownsDocument,
|
||
variables: { regionId },
|
||
});
|
||
|
||
$calculation.element('selectLegalClientTown').setOptions(normalizeOptions(evo_towns));
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['regionRegistration', 'objectRegistration']),
|
||
async ({ regionRegistration: regionId, objectRegistration }) => {
|
||
if (!regionId) {
|
||
$calculation.element('selectTownRegistration').resetOptions();
|
||
|
||
return;
|
||
}
|
||
const {
|
||
data: { evo_towns },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetTownsDocument,
|
||
variables: { regionId },
|
||
});
|
||
|
||
if (objectRegistration === 100_000_001) {
|
||
const towns = evo_towns?.filter((x) => x?.evo_businessunit_evolution === true);
|
||
$calculation.element('selectTownRegistration').setOptions(normalizeOptions(towns));
|
||
} else {
|
||
$calculation.element('selectTownRegistration').setOptions(normalizeOptions(evo_towns));
|
||
}
|
||
}
|
||
);
|
||
|
||
const { getLegalRegion, getLegalTown, getRegion, getTown } = helper({ apolloClient });
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['lead', 'opportunity']),
|
||
async ({ lead, opportunity }) => {
|
||
if (!lead && !opportunity) {
|
||
$calculation.element('selectLegalClientRegion').resetValue().unblock();
|
||
$calculation.element('selectRegionRegistration').resetValue().unblock();
|
||
|
||
return;
|
||
}
|
||
|
||
const quote = $calculation.element('selectQuote').getValue();
|
||
|
||
const legalRegionId = await getLegalRegion({
|
||
lead,
|
||
opportunity,
|
||
quote,
|
||
});
|
||
if (legalRegionId) {
|
||
$calculation.element('selectLegalClientRegion').setValue(legalRegionId).block();
|
||
} else {
|
||
$calculation.element('selectLegalClientRegion').resetValue().unblock();
|
||
}
|
||
|
||
const regionId = await getRegion({
|
||
lead,
|
||
opportunity,
|
||
quote,
|
||
});
|
||
if (regionId) {
|
||
$calculation.element('selectRegionRegistration').setValue(regionId).block();
|
||
} else {
|
||
$calculation.element('selectRegionRegistration').resetValue().unblock();
|
||
}
|
||
},
|
||
{
|
||
delay: 10,
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('selectLegalClientRegion').getValue(),
|
||
async (regionId) => {
|
||
if (!regionId) {
|
||
$calculation.element('selectLegalClientTown').resetValue().unblock();
|
||
|
||
return;
|
||
}
|
||
|
||
const lead = $calculation.element('selectLead').getValue();
|
||
const opportunity = $calculation.element('selectOpportunity').getValue();
|
||
const quote = $calculation.element('selectQuote').getValue();
|
||
|
||
const townId = await getLegalTown({
|
||
lead,
|
||
opportunity,
|
||
quote,
|
||
regionId,
|
||
});
|
||
if (townId) {
|
||
$calculation.element('selectLegalClientTown').setValue(townId).block();
|
||
} else {
|
||
$calculation.element('selectLegalClientTown').resetValue().unblock();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['regionRegistration', 'objectRegistration']),
|
||
async ({ regionRegistration: regionId, objectRegistration }) => {
|
||
if (!regionId) {
|
||
$calculation.element('selectTownRegistration').resetValue().unblock();
|
||
|
||
return;
|
||
}
|
||
|
||
const lead = $calculation.element('selectLead').getValue();
|
||
const opportunity = $calculation.element('selectOpportunity').getValue();
|
||
const quote = $calculation.element('selectQuote').getValue();
|
||
|
||
const townId = await getTown({
|
||
lead,
|
||
opportunity,
|
||
quote,
|
||
regionId,
|
||
});
|
||
|
||
if (townId && objectRegistration === 100_000_000) {
|
||
$calculation.element('selectTownRegistration').setValue(townId).block();
|
||
} else {
|
||
$calculation.element('selectTownRegistration').resetValue().unblock();
|
||
}
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('radioObjectRegistration').getValue(),
|
||
async (objectRegistration) => {
|
||
const {
|
||
data: { evo_regions },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetRegionsDocument,
|
||
});
|
||
|
||
if (objectRegistration === 100_000_001) {
|
||
const regions = evo_regions?.filter((x) => x?.evo_businessunit_evolution === true);
|
||
$calculation.element('selectRegionRegistration').setOptions(normalizeOptions(regions));
|
||
} else {
|
||
$calculation.element('selectRegionRegistration').setOptions(normalizeOptions(evo_regions));
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
export function validation({ store, apolloClient }: ProcessContext) {
|
||
const { $calculation } = store;
|
||
|
||
reaction(
|
||
() => $calculation.$values.getValues(['leaseObjectCategory', 'maxMass']),
|
||
({ leaseObjectCategory, maxMass }) => {
|
||
$calculation.element('tbxMaxMass').validate({
|
||
invalid: leaseObjectCategory === 100_000_001 && maxMass > 3500,
|
||
message: 'При категории ТС = В Разрешенная макс.масса не может быть больше 3500 кг',
|
||
});
|
||
$calculation.element('tbxMaxMass').validate({
|
||
invalid: leaseObjectCategory === 100_000_002 && maxMass <= 3500,
|
||
message: 'При категории ТС = С Разрешенная макс.масса не может быть меньше 3500 кг',
|
||
});
|
||
}
|
||
);
|
||
|
||
{
|
||
const validationHelper = new ValidationHelper();
|
||
reaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'typePTS',
|
||
'objectRegistration',
|
||
'objectCategoryTax',
|
||
'leaseObjectType',
|
||
]),
|
||
async ({
|
||
leaseObjectType: leaseObjectTypeId,
|
||
typePTS,
|
||
objectRegistration,
|
||
objectCategoryTax,
|
||
}) => {
|
||
if (!leaseObjectTypeId) {
|
||
validationHelper.removeErrors();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_leasingobject_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetLeaseObjectTypeDocument,
|
||
variables: { leaseObjectTypeId },
|
||
});
|
||
|
||
$calculation.element('selectObjectCategoryTax').validate({
|
||
helper: validationHelper,
|
||
invalid:
|
||
objectRegistration === 100_000_001 &&
|
||
typePTS === 100_000_001 &&
|
||
objectCategoryTax === null &&
|
||
Boolean(evo_leasingobject_type?.evo_category_tr?.length),
|
||
message: 'Необходимо из ЭПТС указать Категорию в соответствии с ТР ТС 018/2011',
|
||
});
|
||
}
|
||
);
|
||
}
|
||
|
||
{
|
||
const validationHelper = new ValidationHelper();
|
||
reaction(
|
||
() => $calculation.$values.getValues(['leaseObjectType', 'insNSIB']),
|
||
async ({ insNSIB, leaseObjectType: leaseObjectTypeId }) => {
|
||
if (!leaseObjectTypeId) {
|
||
validationHelper.removeErrors();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_leasingobject_type },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetLeaseObjectTypeDocument,
|
||
variables: { leaseObjectTypeId },
|
||
});
|
||
|
||
$calculation.element('selectInsNSIB').validate({
|
||
helper: validationHelper,
|
||
invalid: evo_leasingobject_type?.evo_id === '11' && !insNSIB,
|
||
message: 'Страхование НСИБ обязательно для мотоциклистов',
|
||
});
|
||
}
|
||
);
|
||
}
|
||
}
|