779 lines
21 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.

/* eslint-disable sonarjs/cognitive-complexity */
/* eslint-disable complexity */
import type { RequestEltKasko, RequestEltOsago } from '@/api/elt/types';
import type { Row } from '@/Components/Calculation/Form/ELT/types';
import * as CRMTypes from '@/graphql/crm.types';
import type { ProcessContext } from '@/process/types';
import { getCurrentDateString } from '@/utils/date';
import dayjs from 'dayjs';
import { first, sort } from 'radash';
export async function ownOsagoRequest(
{ store, apolloClient }: Pick<ProcessContext, 'apolloClient' | 'store'>,
row: Row
): Promise<NonNullable<CRMTypes.GetOsagoAddproductTypesQuery['evo_addproduct_types']>[number]> {
const currentDate = getCurrentDateString();
const {
data: { evo_addproduct_types },
} = await apolloClient.query({
query: CRMTypes.GetOsagoAddproductTypesDocument,
variables: { currentDate },
});
if (!evo_addproduct_types) return null;
const { leaseObjectCategory, leaseObjectMotorPower, countSeats, maxMass } =
store.$calculation.$values.getValues([
'leaseObjectCategory',
'leaseObjectMotorPower',
'countSeats',
'maxMass',
]);
const filteredTypes = evo_addproduct_types.filter(
(type) =>
type?.evo_accountid === row.key &&
type.evo_visible_calc &&
type.evo_category === leaseObjectCategory &&
type.evo_min_power !== null &&
type.evo_max_power !== null &&
type.evo_min_power <= leaseObjectMotorPower &&
type.evo_max_power >= leaseObjectMotorPower &&
type.evo_min_seats_count !== null &&
type.evo_max_seats_count !== null &&
type.evo_min_seats_count <= countSeats &&
type.evo_max_seats_count >= countSeats &&
type.evo_min_mass !== null &&
type.evo_max_mass !== null &&
type.evo_min_mass <= maxMass &&
type.evo_max_mass >= maxMass
);
const sortedTypes = sort(filteredTypes, (type) => dayjs(type?.createdon).date());
return first(sortedTypes) || null;
}
const getSpecified = (value: unknown) => value !== null && value !== undefined;
export async function makeEltOsagoRequest(
{ store, apolloClient }: Pick<ProcessContext, 'apolloClient' | 'store'>,
row: Row
): Promise<RequestEltOsago> {
const { $calculation, $tables } = store;
const currentDate = dayjs().toDate();
let kladr = '7700000000000';
if ($calculation.element('radioObjectRegistration').getValue() === 100_000_001) {
const townRegistrationId = $calculation.element('selectTownRegistration').getValue();
if (townRegistrationId) {
const {
data: { evo_town },
} = await apolloClient.query({
query: CRMTypes.GetTownDocument,
variables: { townId: townRegistrationId },
});
kladr = evo_town?.evo_kladr_id || kladr;
}
} else {
const {
data: { account: insuranceCompany },
} = await apolloClient.query({
query: CRMTypes.GetInsuranceCompanyDocument,
variables: { accountId: row.key },
});
if (insuranceCompany?.evo_legal_region_calc === true) {
const regionId = $calculation.element('selectLegalClientRegion').getValue();
let evo_region: CRMTypes.GetRegionQuery['evo_region'] = null;
if (regionId) {
const { data } = await apolloClient.query({
query: CRMTypes.GetRegionDocument,
variables: { regionId },
});
({ evo_region } = data);
}
const townId = $calculation.element('selectLegalClientTown').getValue();
let evo_town: CRMTypes.GetTownQuery['evo_town'] = null;
if (townId) {
const { data } = await apolloClient.query({
query: CRMTypes.GetTownDocument,
variables: { townId },
});
({ evo_town } = data);
}
kladr = evo_town?.evo_kladr_id || evo_region?.evo_kladr_id || kladr;
}
}
let brandId = '';
const brand = $calculation.element('selectBrand').getValue();
if (brand) {
const {
data: { evo_brand },
} = await apolloClient.query({
query: CRMTypes.GetBrandDocument,
variables: { brandId: brand },
});
if (evo_brand?.evo_id) {
brandId = evo_brand.evo_id;
}
}
let modelId = '';
const model = $calculation.element('selectModel').getValue();
if (model) {
const {
data: { evo_model },
} = await apolloClient.query({
query: CRMTypes.GetModelDocument,
variables: { modelId: model },
});
if (evo_model?.evo_id) {
modelId = evo_model.evo_id;
}
}
let gpsMark = '';
const gpsBrandId = $calculation.element('selectGPSBrand').getValue();
if (gpsBrandId) {
const {
data: { evo_gps_brands },
} = await apolloClient.query({
query: CRMTypes.GetGpsBrandsDocument,
});
gpsMark = evo_gps_brands?.find((x) => x?.value === gpsBrandId)?.evo_id || gpsMark;
}
let gpsModel = '';
const gpsModelId = $calculation.element('selectGPSModel').getValue();
if (gpsModelId) {
const {
data: { evo_gps_models },
} = await apolloClient.query({
query: CRMTypes.GetGpsModelsDocument,
});
gpsModel = evo_gps_models?.find((x) => x?.value === gpsModelId)?.evo_id || gpsModel;
}
const vehicleYear = $calculation.element('tbxLeaseObjectYear').getValue().toString();
const leaseObjectCategory = $calculation.element('selectLeaseObjectCategory').getValue();
const vehiclePower = $calculation.element('tbxLeaseObjectMotorPower').getValue() || 0;
const mapCategory: Record<number, string> = {
100_000_000: 'A',
100_000_001: 'B',
100_000_002: 'C',
100_000_003: 'D',
100_000_004: 'ПРОЧИЕ ТС',
};
const category = (leaseObjectCategory && mapCategory[leaseObjectCategory]) || '0';
const leaseObjectUseFor = $calculation.element('selectLeaseObjectUseFor').getValue();
const maxMass = $calculation.element('tbxMaxMass').getValue();
const countSeats = $calculation.element('tbxCountSeats').getValue();
let subCategory = '0';
switch (leaseObjectCategory) {
case 100_000_001: {
if (leaseObjectUseFor === 100_000_001) {
subCategory = '11';
}
subCategory = '10';
break;
}
case 100_000_002: {
if (maxMass <= 16_000) {
subCategory = '20';
}
subCategory = '21';
break;
}
case 100_000_003: {
if (leaseObjectUseFor === 100_000_001) {
subCategory = '32';
}
if (countSeats <= 20) {
subCategory = '30';
}
subCategory = '31';
break;
}
case 100_000_004: {
subCategory = '22';
break;
}
case 100_000_000:
default: {
subCategory = '0';
break;
}
}
let seatingCapacity = 0;
if (leaseObjectCategory === 100_000_003) {
seatingCapacity = countSeats;
}
const seatingCapacitySpecified = getSpecified(seatingCapacity);
let maxAllowedMass = 0;
if (leaseObjectCategory === 100_000_002) {
maxAllowedMass = maxMass;
}
const maxAllowedMassSpecified = getSpecified(maxAllowedMass);
const useWithTrailer = $calculation.element('cbxWithTrailer').getValue();
const useWithTrailerSpecified = true;
const address = {
// district: '0',
city: 'Москва',
cityKladr: '7700000000000',
country: 'Россия',
house: '52',
korpus: '5',
region: 'Москва',
resident: 1,
street: 'Космодамианская наб',
};
const owner = {
JuridicalName: 'ООО "ЛК "ЭВОЛЮЦИЯ"',
email: 'client@evoleasing.ru',
factAddress: address,
inn: '9724016636',
kpp: '770501001',
ogrn: '1207700245037',
opf: 1,
opfSpecified: true,
phone: '8 (800) 333-75-75',
registrationAddress: address,
subjectType: 1,
subjectTypeSpecified: true,
};
let inn = '9724016636';
const insured = $tables.insurance.row('osago').getValue('insured');
const leadid = $calculation.element('selectLead').getValue();
if (insured === 100_000_000 && leadid) {
const {
data: { lead },
} = await apolloClient.query({
query: CRMTypes.GetLeadDocument,
variables: { leadid },
});
inn = lead?.evo_inn || inn;
}
return {
companyId: row.id,
params: {
FullDriversInfo: [
{
kbm: '3',
},
],
carInfo: {
mark: gpsMark,
model: gpsModel,
tsType: { category, subCategory },
useWithTrailer,
useWithTrailerSpecified,
vehicle: {
maxAllowedMass,
maxAllowedMassSpecified,
seatingCapacity,
seatingCapacitySpecified,
},
vehiclePower,
vehicleYear,
},
contractBeginDate: currentDate,
contractOptionId: 1,
contractStatusId: 13,
driversCount: 0,
duration: 12,
insurer: {
INN: inn,
SubjectType: 1,
SubjectTypeSpecified: true,
},
insurerType: 1,
lessee: {
SubjectType: 1,
SubjectTypeSpecified: true,
inn,
},
owner,
ownerType: 1,
tsToRegistrationPlace: 0,
},
preparams: {
brandId,
kladr,
modelId,
},
};
}
export async function makeEltKaskoRequest(
{ store, apolloClient }: Pick<ProcessContext, 'apolloClient' | 'store'>,
row: Row
): Promise<RequestEltKasko> {
const { $calculation } = store;
const currentDate = dayjs().toDate();
const regionId = $calculation.element('selectLegalClientRegion').getValue();
let evo_region: CRMTypes.GetRegionQuery['evo_region'] = null;
if (regionId) {
const { data } = await apolloClient.query({
query: CRMTypes.GetRegionDocument,
variables: { regionId },
});
({ evo_region } = data);
}
const townId = $calculation.element('selectLegalClientTown').getValue();
let evo_town: CRMTypes.GetTownQuery['evo_town'] = null;
if (townId) {
const { data } = await apolloClient.query({
query: CRMTypes.GetTownDocument,
variables: { townId },
});
({ evo_town } = data);
}
const kladr = evo_town?.evo_kladr_id || evo_region?.evo_kladr_id || '';
const leaseObjectTypeId = $calculation.element('selectLeaseObjectType').getValue();
let evo_leasingobject_type: CRMTypes.GetLeaseObjectTypeQuery['evo_leasingobject_type'] = null;
if (leaseObjectTypeId) {
const { data } = await apolloClient.query({
query: CRMTypes.GetLeaseObjectTypeDocument,
variables: { leaseObjectTypeId },
});
({ evo_leasingobject_type } = data);
}
const leaseObjectCategory = $calculation.element('selectLeaseObjectCategory').getValue();
const brand = $calculation.element('selectBrand').getValue();
let evo_brand: CRMTypes.GetBrandQuery['evo_brand'] = null;
if (brand) {
const { data } = await apolloClient.query({
query: CRMTypes.GetBrandDocument,
variables: { brandId: brand },
});
({ evo_brand } = data);
}
const brandId = evo_brand?.evo_id || '';
const model = $calculation.element('selectModel').getValue();
let evo_model: CRMTypes.GetModelQuery['evo_model'] = null;
if (model) {
const { data } = await apolloClient.query({
query: CRMTypes.GetModelDocument,
variables: { modelId: model },
});
({ evo_model } = data);
}
const modelId = evo_model?.evo_id || '';
const leaseObjectUsed = $calculation.element('cbxLeaseObjectUsed').getValue();
const productId = $calculation.element('selectProduct').getValue();
const partialVAT = $calculation.element('cbxPartialVAT').getValue();
const leaseObjectYear = $calculation.element('tbxLeaseObjectYear').getValue();
let isNew = true;
if (
leaseObjectUsed === true ||
(leaseObjectUsed === false &&
productId &&
partialVAT &&
leaseObjectYear < currentDate.getFullYear() - 1)
) {
isNew = false;
}
const vehicleYear = leaseObjectYear;
let vehicleDate;
if (
leaseObjectUsed === true ||
(leaseObjectUsed === false &&
productId &&
partialVAT &&
leaseObjectYear < currentDate.getFullYear() - 1)
) {
vehicleDate = new Date(`${vehicleYear}-01-01`);
}
const vehicleDateSpecified = getSpecified(vehicleDate);
const power = $calculation.element('tbxLeaseObjectMotorPower').getValue();
const powerSpecified = getSpecified(power);
let country = 0;
let countrySpecified = false;
if (
(leaseObjectCategory === 100_000_002 ||
(evo_leasingobject_type?.evo_id &&
['6', '9', '10', '8'].includes(evo_leasingobject_type?.evo_id))) &&
evo_brand?.evo_brand_owner === 100_000_001
) {
country = 1;
countrySpecified = true;
}
const mapEngineType: Record<number, string> = {
100_000_000: '0',
100_000_001: '1',
100_000_003: '2',
100_000_004: '3',
};
let engineType = '5';
const engineTypeValue = $calculation.element('selectEngineType').getValue();
if (engineTypeValue) {
engineType = mapEngineType[engineTypeValue] || '5';
}
const leasingPeriod = $calculation.element('tbxLeasingPeriod').getValue();
const duration = leasingPeriod < 12 ? 12 : leasingPeriod;
const cost =
$calculation.$values.getValue('plPriceRub') -
$calculation.$values.getValue('discountRub') -
$calculation.$values.getValue('importProgramSum') +
$calculation.$values.getValue('addEquipmentPrice');
let notConfirmedDamages = 0;
let notConfirmedDamagesSpecified = false;
let notConfirmedGlassesDamages = 0;
let notConfirmedGlassesDamagesSpecified = false;
let outsideRoads = false;
let outsideRoadsSpecified = false;
let selfIgnition = false;
let selfIgnitionSpecified = false;
if (
leaseObjectCategory === 100_000_002 ||
(evo_leasingobject_type?.evo_id &&
['6', '8', '9', '10'].includes(evo_leasingobject_type?.evo_id))
) {
notConfirmedGlassesDamages = 3;
notConfirmedGlassesDamagesSpecified = true;
notConfirmedDamages = 2;
notConfirmedDamagesSpecified = true;
selfIgnition = true;
selfIgnitionSpecified = getSpecified(selfIgnition);
outsideRoads = true;
outsideRoadsSpecified = true;
}
const franchise = $calculation.element('tbxInsFranchise').getValue();
const franchiseSpecified = getSpecified(franchise);
let puuMark = '';
const gpsBrandId = $calculation.element('selectGPSBrand').getValue();
if (gpsBrandId) {
const {
data: { evo_gps_brands },
} = await apolloClient.query({
query: CRMTypes.GetGpsBrandsDocument,
});
puuMark = evo_gps_brands?.find((x) => x?.value === gpsBrandId)?.evo_id || puuMark;
}
let puuModel = '';
const gpsModelId = $calculation.element('selectGPSModel').getValue();
if (gpsModelId) {
const {
data: { evo_gps_models },
} = await apolloClient.query({
query: CRMTypes.GetGpsModelsDocument,
});
puuModel = evo_gps_models?.find((x) => x?.value === gpsModelId)?.evo_id || puuModel;
}
const puuModelSpecified = getSpecified(puuModel);
let age = $calculation.element('tbxInsAgeDrivers').getValue();
let experience = $calculation.element('tbxInsExpDrivers').getValue();
const sex = '0';
let driversCount = 1;
const risk =
evo_leasingobject_type?.evo_id && ['6', '9', '10'].includes(evo_leasingobject_type?.evo_id)
? 3
: 0;
if ($calculation.element('cbxInsUnlimitDrivers').getValue()) {
age = 18;
experience = 0;
driversCount = 0;
}
const sexSpecified = getSpecified(sex);
let maxAllowedMass = 0;
if (leaseObjectCategory === 100_000_002) {
maxAllowedMass = $calculation.element('tbxMaxMass').getValue();
}
const maxAllowedMassSpecified = getSpecified(maxAllowedMass);
let mileage = 0;
if (leaseObjectUsed === true) {
mileage = $calculation.element('tbxMileage').getValue();
}
if (
leaseObjectUsed === false &&
productId &&
partialVAT &&
leaseObjectYear < currentDate.getFullYear() - 1
) {
mileage = 0;
}
let vin = '';
if (leaseObjectUsed === true) {
vin = $calculation.element('tbxVIN').getValue() || vin;
}
const mileageSpecified = getSpecified(mileage);
let vehicleUsage = 0;
const mapVehicleUsage: Record<number, number> = {
100_000_000: 0,
100_000_001: 1,
100_000_002: 5,
100_000_003: 5,
100_000_004: 2,
100_000_005: 6,
100_000_006: 5,
100_000_007: 4,
100_000_008: 4,
100_000_009: 0,
100_000_010: 0,
100_000_011: 3,
100_000_012: 3,
100_000_013: 9,
100_000_020: 10,
};
const leaseObjectUseFor = $calculation.element('selectLeaseObjectUseFor').getValue();
if (leaseObjectUseFor) {
vehicleUsage = mapVehicleUsage[leaseObjectUseFor] || 0;
}
const vehicleUsageSpecified = getSpecified(vehicleUsage);
let seatingCapacity = 0;
if (leaseObjectCategory === 100_000_003) {
seatingCapacity = $calculation.element('tbxCountSeats').getValue();
}
const seatingCapacitySpecified = getSpecified(seatingCapacity);
const mapCategory: Record<number, string> = {
100_000_000: 'A',
100_000_001: 'B',
// 100000002: 'C2',
100_000_003: 'D',
100_000_004: 'E1',
};
let category = '';
if (leaseObjectCategory) {
category = mapCategory[leaseObjectCategory];
}
if (leaseObjectCategory === 100_000_002)
switch (evo_leasingobject_type?.evo_id) {
case '7': {
category = 'C1';
break;
}
case '3': {
category = 'C3';
break;
}
default: {
category = 'C2';
break;
}
}
let classification = '11606';
switch (evo_leasingobject_type?.evo_id) {
case '7': {
classification = '11611';
break;
}
case '3': {
classification = '11607';
break;
}
case '8': {
classification = '11650';
break;
}
default: {
classification = '11606';
break;
}
}
let INN = '';
const leadid = $calculation.element('selectLead').getValue();
if (leadid) {
const {
data: { lead },
} = await apolloClient.query({
query: CRMTypes.GetLeadDocument,
variables: { leadid },
});
INN = lead?.evo_inn || INN;
}
const lesseSubjectType = (INN.length === 10 && 1) || (INN.length === 12 && 2) || 0;
const mapLeaseObjectUseForToIndustry: Record<number, number> = {
100_000_014: 30,
100_000_015: 15,
100_000_016: 3,
100_000_017: 26,
100_000_018: 2,
100_000_019: 6,
};
let specialMachineryIndustry = 0;
let specialMachineryMover = 0;
let specialMachineryType = 0;
if (evo_leasingobject_type?.evo_id && ['6', '9', '10'].includes(evo_leasingobject_type?.evo_id)) {
specialMachineryType = Number(evo_model?.evo_vehicle_body_typeidData?.evo_id_elt || 0);
specialMachineryIndustry = leaseObjectUseFor
? mapLeaseObjectUseForToIndustry[leaseObjectUseFor]
: specialMachineryIndustry;
specialMachineryMover = evo_model?.evo_running_gear === 100_000_001 ? 2 : 1;
}
return {
companyId: row.id,
params: {
Insurer: {
SubjectType: 1,
SubjectTypeSpecified: true,
},
Lessee: {
INN,
SubjectType: lesseSubjectType,
SubjectTypeSpecified: true,
},
OfficialDealer: true,
OfficialDealerSpecified: true,
Owner: {
SubjectType: 1,
SubjectTypeSpecified: true,
},
PUUs: puuMark
? [
{
mark: puuMark,
model: puuModel,
modelSpecified: puuModelSpecified,
},
]
: [],
STOA: '0',
approvedDriving: 2,
approvedDrivingSpecified: true,
bankId: '245',
cost,
currency: 'RUR',
drivers: [{ age, experience, sex, sexSpecified }],
driversCount,
duration,
franchise,
franchiseSpecified,
isNew,
modification: {
KPPTypeId: 1,
country,
countrySpecified,
engineType,
engineVolume: 0,
engineVolumeSpecified: true,
power,
powerSpecified,
},
notConfirmedDamages,
notConfirmedDamagesSpecified,
notConfirmedGlassesDamages,
notConfirmedGlassesDamagesSpecified,
outsideRoads,
outsideRoadsSpecified,
payType: '0',
risk,
selfIgnition,
selfIgnitionSpecified,
ssType: '1',
usageStart: currentDate,
vehicle: {
category,
classification,
maxAllowedMass,
maxAllowedMassSpecified,
mileage,
mileageSpecified,
seatingCapacity,
seatingCapacitySpecified,
vehicleUsage,
vehicleUsageSpecified,
vin,
},
vehicleDate,
vehicleDateSpecified,
vehicleYear,
// FullDriversInfo: [
// {
// surname,
// name,
// patronymic,
// sex,
// sexSpecified,
// expertienceStart,
// },
// ],
},
preparams: {
brandId,
kladr,
modelId,
specialMachinery: {
industry: specialMachineryIndustry,
industrySpecified: getSpecified(specialMachineryIndustry),
mover: specialMachineryMover,
moverSpecified: getSpecified(specialMachineryMover),
type: specialMachineryType,
typeSpecified: getSpecified(specialMachineryType),
},
},
};
}