/* eslint-disable @typescript-eslint/naming-convention */ import * as CRMTypes from '@/graphql/crm.types'; import type { ProcessContext } from '@/process/types'; import { reaction } from 'mobx'; import { intersects } from 'radash'; import { normalizeOptions } from 'tools'; export default function reactions({ store, apolloClient }: ProcessContext) { const { $calculation } = store; reaction( () => $calculation.$values.getValues(['brand', 'importProgram', 'leaseObjectType', 'subsidy']), async ({ brand: brandId, importProgram: importProgramId, leaseObjectType: leaseObjectTypeId, subsidy: subsidyId, // eslint-disable-next-line sonarjs/cognitive-complexity }) => { if (!brandId) { $calculation.element('selectModel').reset(); return; } const { data: { evo_models }, } = await apolloClient.query({ query: CRMTypes.GetModelsDocument, variables: { brandId }, }); let models = evo_models; if (!models) { $calculation.element('selectModel').reset(); return; } if (leaseObjectTypeId) { const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId }, }); models = models?.filter((model) => { if ( model?.evo_vehicle_type && evo_leasingobject_type?.evo_vehicle_type?.includes(model.evo_vehicle_type) ) { return model; } return false; }); } if (subsidyId) { const { data: { evo_subsidy: subsidy }, } = await apolloClient.query({ query: CRMTypes.GetSubsidyDocument, variables: { subsidyId }, }); models = models?.filter((model) => { if ( model && (!subsidy?.evo_models?.length || subsidy?.evo_models?.filter( (subsidy_evo_model) => subsidy_evo_model?.evo_modelid === model.evo_modelid )?.length) ) { return model; } return false; }); } if (importProgramId) { const { data: { importProgram }, } = await apolloClient.query({ query: CRMTypes.GetImportProgramDocument, variables: { importProgramId }, }); models = models?.filter((model) => { if ( model && (!importProgram?.evo_models?.length || importProgram?.evo_models?.filter( (importProgram_evo_model) => importProgram_evo_model?.evo_modelid === model.evo_modelid )?.length) ) { return model; } return false; }); } $calculation.element('selectModel').setOptions(normalizeOptions(models)); } ); reaction( () => $calculation.$values.getValues(['importProgram', 'leaseObjectType', 'product', 'subsidy']), async ({ importProgram: importProgramId, leaseObjectType: leaseObjectTypeId, product: productId, subsidy: subsidyId, }) => { const { data: { evo_brands }, } = await apolloClient.query({ query: CRMTypes.GetBrandsDocument, }); let brands = evo_brands; if (!brands) { $calculation.element('selectBrand').reset(); return; } if (productId) { const { data: { evo_baseproduct }, } = await apolloClient.query({ query: CRMTypes.GetProductDocument, variables: { productId }, }); brands = brands?.filter( (brand) => !evo_baseproduct?.evo_brands?.length || evo_baseproduct.evo_brands.filter( (baseproduct_evo_brand) => baseproduct_evo_brand?.evo_brandid === brand?.evo_brandid )?.length ); } if (leaseObjectTypeId) { const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId }, }); brands = brands?.filter( (brand) => brand?.evo_vehicle_type?.length && evo_leasingobject_type?.evo_vehicle_type && intersects( brand.evo_vehicle_type?.filter((x) => x > 0), evo_leasingobject_type?.evo_vehicle_type ) ); } if (subsidyId) { const { data: { evo_subsidy: subsidy }, } = await apolloClient.query({ query: CRMTypes.GetSubsidyDocument, variables: { subsidyId }, }); brands = brands?.filter( (brand) => !subsidy?.evo_brands?.length || subsidy?.evo_brands?.filter( (subsidy_evo_brand) => subsidy_evo_brand?.evo_brandid === brand?.evo_brandid )?.length ); } if (importProgramId) { const { data: { importProgram }, } = await apolloClient.query({ query: CRMTypes.GetImportProgramDocument, variables: { importProgramId }, }); brands = brands?.filter( (brand) => !importProgram?.evo_brands?.length || importProgram?.evo_brands?.filter( (importProgram_evo_brand) => importProgram_evo_brand?.evo_brandid === brand?.evo_brandid )?.length ); } $calculation.element('selectBrand').setOptions(normalizeOptions(brands)); } ); reaction( () => $calculation.element('selectLeaseObjectType').getValue(), (leaseObjectTypeId) => { if (!leaseObjectTypeId) { $calculation.element('selectBrand').resetValue(); } } ); reaction( () => $calculation.element('selectModel').getValue(), async (modelId) => { if (!modelId) { $calculation.element('selectConfiguration').reset(); return; } const { data: { evo_equipments }, } = await apolloClient.query({ query: CRMTypes.GetConfigurationsDocument, variables: { modelId }, }); $calculation.element('selectConfiguration').setOptions(normalizeOptions(evo_equipments)); } ); reaction( () => $calculation.element('cbxLeaseObjectUsed').getValue(), (leaseObjectUsed) => { if (leaseObjectUsed) { $calculation.element('tbxLeaseObjectCount').setValue(1).block(); } else { $calculation.element('tbxLeaseObjectCount').unblock(); } } ); reaction( () => $calculation.element('selectLeaseObjectType').getValue(), async (leaseObjectTypeId) => { if (!leaseObjectTypeId) { $calculation.element('cbxWithTrailer').resetValue(); return; } const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId }, }); $calculation.element('cbxWithTrailer').setValue(evo_leasingobject_type?.evo_id === '7'); } ); reaction( () => $calculation.$values.getValues(['model', 'configuration']), async ({ model: modelId, configuration: configurationId }) => { $calculation.element('labelDepreciationGroup').resetValue(); if (configurationId) { const { data: { evo_equipment }, } = await apolloClient.query({ query: CRMTypes.GetConfigurationDocument, variables: { configurationId }, }); if (evo_equipment?.evo_impairment_groupidData?.evo_name) { $calculation .element('labelDepreciationGroup') .setValue(evo_equipment?.evo_impairment_groupidData?.evo_name); return; } } if (modelId) { const { data: { evo_model }, } = await apolloClient.query({ query: CRMTypes.GetModelDocument, variables: { modelId }, }); if (evo_model?.evo_impairment_groupidData?.evo_name) { $calculation .element('labelDepreciationGroup') .setValue(evo_model?.evo_impairment_groupidData?.evo_name); } } } ); reaction( () => $calculation.element('selectLeaseObjectCategory').getValue(), (leaseObjectCategory) => { if ( leaseObjectCategory !== null && [100_000_001, 100_000_003].includes(leaseObjectCategory) ) { $calculation.element('cbxWithTrailer').setValue(false).block(); } else { $calculation.element('cbxWithTrailer').unblock(); } } ); reaction( () => $calculation.$values.getValues(['brand', 'model', 'leaseObjectUsed']), async ({ brand: brandId, model: modelId, leaseObjectUsed }) => { const tbxImporterRewardPerc = $calculation.element('tbxImporterRewardPerc'); const tbxImporterRewardRub = $calculation.element('tbxImporterRewardRub'); if (leaseObjectUsed) { tbxImporterRewardPerc.resetValue(); tbxImporterRewardRub.resetValue(); return; } if (modelId) { const { data: { evo_model }, } = await apolloClient.query({ query: CRMTypes.GetModelDocument, variables: { modelId }, }); if (evo_model?.evo_importer_reward_perc) { tbxImporterRewardPerc.setValue(evo_model?.evo_importer_reward_perc); } else { tbxImporterRewardPerc.resetValue(); } if (evo_model?.evo_importer_reward_rub) { tbxImporterRewardRub.setValue(evo_model?.evo_importer_reward_rub); } else { tbxImporterRewardRub.resetValue(); } } else if (brandId) { const { data: { evo_brand }, } = await apolloClient.query({ query: CRMTypes.GetBrandDocument, variables: { brandId }, }); if (evo_brand?.evo_importer_reward_perc) { tbxImporterRewardPerc.setValue(evo_brand?.evo_importer_reward_perc); } else { tbxImporterRewardPerc.resetValue(); } if (evo_brand?.evo_importer_reward_rub) { tbxImporterRewardRub.setValue(evo_brand?.evo_importer_reward_rub); } else { tbxImporterRewardRub.resetValue(); } } else { tbxImporterRewardPerc.resetValue(); tbxImporterRewardRub.resetValue(); } } ); reaction( () => $calculation.element('selectLeaseObjectType').getValue(), async (leaseObjectTypeId) => { if (!leaseObjectTypeId) { $calculation.element('selectLeaseObjectCategory').resetValue(); return; } const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId, }, }); if (evo_leasingobject_type?.evo_category) { $calculation .element('selectLeaseObjectCategory') .setValue(evo_leasingobject_type?.evo_category); } else { $calculation.element('selectLeaseObjectCategory').resetValue(); } } ); }