diff --git a/apps/web/Components/Calculation/Output/Validation.jsx b/apps/web/Components/Calculation/Output/Validation.jsx index 239559f..3e775bf 100644 --- a/apps/web/Components/Calculation/Output/Validation.jsx +++ b/apps/web/Components/Calculation/Output/Validation.jsx @@ -23,73 +23,34 @@ const AlertWrapper = styled(Box)` margin: 0 0 5px 0; `; +function getAlerts(errors, title, $process) { + return errors.map(({ key, message }) => ( + + + + )); +} + function getElementsErrors({ $calculation, $process }) { return Object.values($calculation.$validation).map((validation) => { const elementErrors = validation.getErrors(); const elementTitle = validation.params.err_title; - return elementErrors.map(({ key, message }) => ( - - - - )); + return getAlerts(elementErrors, elementTitle, $process); }); } -function getPaymentsTableErrors({ $process, $tables }) { - const { payments } = $tables; - const errors = payments.validation.getErrors(); - const title = payments.validation.params.err_title; +function getTableErrors(tableName, { $process, $tables }) { + const table = $tables[tableName]; + const errors = table.validation.getErrors(); + const title = table.validation.params.err_title; - return errors.map(({ key, message }) => ( - - - - )); -} - -function getInsuranceTableErrors({ $process, $tables }) { - const { insurance } = $tables; - const errors = insurance.validation.getErrors(); - const title = insurance.validation.params.err_title; - - return errors.map(({ key, message }) => ( - - - - )); -} - -function getFingapTableErrors({ $process, $tables }) { - const { fingap } = $tables; - const errors = fingap.validation.getErrors(); - const title = fingap.validation.params.err_title; - - return errors.map(({ key, message }) => ( - - - - )); + return getAlerts(errors, title, $process); } const Errors = observer(() => { @@ -101,15 +62,16 @@ const Errors = observer(() => { ); const hasPaymentsErrors = $tables.payments.validation.hasErrors; const hasInsuranceErrors = $tables.insurance.validation.hasErrors; + const hasFingapErrors = $tables.fingap.validation.hasErrors; - if (!hasElementsErrors && !hasPaymentsErrors && !hasInsuranceErrors) { + if (!hasElementsErrors && !hasPaymentsErrors && !hasInsuranceErrors && !hasFingapErrors) { return ; } const elementsErrors = getElementsErrors(store); - const paymentsErrors = getPaymentsTableErrors(store); - const insuranceErrors = getInsuranceTableErrors(store); - const fingapErrors = getFingapTableErrors(store); + const paymentsErrors = getTableErrors('payments', store); + const insuranceErrors = getTableErrors('insurance', store); + const fingapErrors = getTableErrors('fingap', store); const errors = [...elementsErrors, ...paymentsErrors, ...insuranceErrors, ...fingapErrors]; diff --git a/apps/web/graphql/crm.query.graphql b/apps/web/graphql/crm.query.graphql index 7187b52..9c5d850 100644 --- a/apps/web/graphql/crm.query.graphql +++ b/apps/web/graphql/crm.query.graphql @@ -110,6 +110,25 @@ query GetQuote($quoteId: Uuid!) { evo_promotion evo_sale_without_nds link + evo_committee_quote + evo_msfo_irr + evo_accept_quoteid + evo_power + evo_engine_volume + evo_nsib + evo_addproduct_types { + evo_product_type + } + evo_db_accept_registration + evo_product_risks { + evo_addproduct_typeid + } + evo_fingap_payer + evo_osago_payer + evo_kasko_payer + evo_leasing_bonus_summ + evo_card_bonus_summ + evo_nsib_bonus_summ } } diff --git a/apps/web/graphql/crm.schema.graphql b/apps/web/graphql/crm.schema.graphql index 4ad3646..c9cd0e4 100644 --- a/apps/web/graphql/crm.schema.graphql +++ b/apps/web/graphql/crm.schema.graphql @@ -2523,6 +2523,7 @@ type quote { evo_coefficien_bonus_reducttion: Decimal evo_comission_perc: Decimal evo_comission_rub: Decimal + evo_committee_quote: Int evo_contact_name: String evo_cost_increace: Boolean evo_cost_increase_perc: Decimal diff --git a/apps/web/graphql/crm.types.ts b/apps/web/graphql/crm.types.ts index f195bd3..185aea7 100644 --- a/apps/web/graphql/crm.types.ts +++ b/apps/web/graphql/crm.types.ts @@ -147,7 +147,7 @@ export type GetQuoteQueryVariables = Exact<{ }>; -export type GetQuoteQuery = { __typename?: 'Query', quote: { __typename?: 'quote', evo_baseproductid: string | null, evo_one_year_insurance: boolean | null, evo_min_change_price: number | null, evo_max_price_change: number | null, evo_discount_supplier_currency: number | null, evo_equip_price: number | null, evo_program_import_subsidy_sum: number | null, evo_nds_in_price_supplier_currency: number | null, evo_supplier_currency_price: number | null, evo_approved_first_payment: number | null, evo_recalc_limit: number | null, evo_max_mass: number | null, evo_seats: number | null, evo_year: number | null, evo_last_payment_perc: number | null, evo_maximum_percentage_av: number | null, evo_untype_insurance: boolean | null, evo_percent_subsidy: number | null, evo_programsolution: number | null, evo_kasko_payer: number | null, evo_promotion: Array | null, evo_sale_without_nds: boolean | null, link: string | null } | null }; +export type GetQuoteQuery = { __typename?: 'Query', quote: { __typename?: 'quote', evo_baseproductid: string | null, evo_one_year_insurance: boolean | null, evo_min_change_price: number | null, evo_max_price_change: number | null, evo_discount_supplier_currency: number | null, evo_equip_price: number | null, evo_program_import_subsidy_sum: number | null, evo_nds_in_price_supplier_currency: number | null, evo_supplier_currency_price: number | null, evo_approved_first_payment: number | null, evo_recalc_limit: number | null, evo_max_mass: number | null, evo_seats: number | null, evo_year: number | null, evo_last_payment_perc: number | null, evo_maximum_percentage_av: number | null, evo_untype_insurance: boolean | null, evo_percent_subsidy: number | null, evo_programsolution: number | null, evo_kasko_payer: number | null, evo_promotion: Array | null, evo_sale_without_nds: boolean | null, link: string | null, evo_committee_quote: number | null, evo_msfo_irr: number | null, evo_accept_quoteid: string | null, evo_power: number | null, evo_engine_volume: number | null, evo_nsib: boolean | null, evo_db_accept_registration: number | null, evo_fingap_payer: number | null, evo_osago_payer: number | null, evo_leasing_bonus_summ: number | null, evo_card_bonus_summ: number | null, evo_nsib_bonus_summ: number | null, evo_addproduct_types: Array<{ __typename?: 'evo_addproduct_type', evo_product_type: number | null } | null> | null, evo_product_risks: Array<{ __typename?: 'evo_product_risk', evo_addproduct_typeid: string | null } | null> | null } | null }; export type GetQuoteDataQueryVariables = Exact<{ quoteId: Scalars['Uuid']['input']; @@ -478,7 +478,7 @@ export const GetLeadDocument = {"kind":"Document","definitions":[{"kind":"Operat export const GetOpportunityDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOpportunity"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"opportunityid"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"opportunity"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"opportunityid"},"value":{"kind":"Variable","name":{"kind":"Name","value":"opportunityid"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_leadid"}},{"kind":"Field","name":{"kind":"Name","value":"accountidData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_address_legalidData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_region_fias_id"}},{"kind":"Field","name":{"kind":"Name","value":"evo_city_fias_id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_okved"}}]}},{"kind":"Field","name":{"kind":"Name","value":"link"}}]}}]}}]} as unknown as DocumentNode; export const GetOpportunitiesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOpportunities"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"domainname"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"opportunities"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"owner_domainname"},"value":{"kind":"Variable","name":{"kind":"Name","value":"domainname"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"label"},"name":{"kind":"Name","value":"name"}},{"kind":"Field","alias":{"kind":"Name","value":"value"},"name":{"kind":"Name","value":"opportunityid"}}]}}]}}]} as unknown as DocumentNode; export const GetQuotesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetQuotes"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"leadid"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"quotes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"evo_leadid"},"value":{"kind":"Variable","name":{"kind":"Name","value":"leadid"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"label"},"name":{"kind":"Name","value":"evo_quotename"}},{"kind":"Field","alias":{"kind":"Name","value":"value"},"name":{"kind":"Name","value":"quoteid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_recalc_limit"}},{"kind":"Field","name":{"kind":"Name","value":"evo_statuscodeidData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_purchases_participation"}}]}}]}}]} as unknown as DocumentNode; -export const GetQuoteDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetQuote"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"quote"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quoteId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_baseproductid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_one_year_insurance"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_change_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_price_change"}},{"kind":"Field","name":{"kind":"Name","value":"evo_discount_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_equip_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_program_import_subsidy_sum"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nds_in_price_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_supplier_currency_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_approved_first_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_recalc_limit"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_mass"}},{"kind":"Field","name":{"kind":"Name","value":"evo_seats"}},{"kind":"Field","name":{"kind":"Name","value":"evo_year"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_maximum_percentage_av"}},{"kind":"Field","name":{"kind":"Name","value":"evo_untype_insurance"}},{"kind":"Field","name":{"kind":"Name","value":"evo_percent_subsidy"}},{"kind":"Field","name":{"kind":"Name","value":"evo_programsolution"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_promotion"}},{"kind":"Field","name":{"kind":"Name","value":"evo_sale_without_nds"}},{"kind":"Field","name":{"kind":"Name","value":"link"}}]}}]}}]} as unknown as DocumentNode; +export const GetQuoteDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetQuote"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"quote"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quoteId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_baseproductid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_one_year_insurance"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_change_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_price_change"}},{"kind":"Field","name":{"kind":"Name","value":"evo_discount_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_equip_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_program_import_subsidy_sum"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nds_in_price_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_supplier_currency_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_approved_first_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_recalc_limit"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_mass"}},{"kind":"Field","name":{"kind":"Name","value":"evo_seats"}},{"kind":"Field","name":{"kind":"Name","value":"evo_year"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_maximum_percentage_av"}},{"kind":"Field","name":{"kind":"Name","value":"evo_untype_insurance"}},{"kind":"Field","name":{"kind":"Name","value":"evo_percent_subsidy"}},{"kind":"Field","name":{"kind":"Name","value":"evo_programsolution"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_promotion"}},{"kind":"Field","name":{"kind":"Name","value":"evo_sale_without_nds"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"evo_committee_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_msfo_irr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_accept_quoteid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_power"}},{"kind":"Field","name":{"kind":"Name","value":"evo_engine_volume"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nsib"}},{"kind":"Field","name":{"kind":"Name","value":"evo_addproduct_types"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_product_type"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_db_accept_registration"}},{"kind":"Field","name":{"kind":"Name","value":"evo_product_risks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_addproduct_typeid"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_osago_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_leasing_bonus_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_card_bonus_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nsib_bonus_summ"}}]}}]}}]} as unknown as DocumentNode; export const GetQuoteDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetQuoteData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"quote"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"quoteId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"quoteId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_addproduct_types"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_product_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_addproduct_typeid"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_accept_control_addproduct_typeid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_sale_bonus"}},{"kind":"Field","name":{"kind":"Name","value":"evo_baseproductid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_client_typeid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_msfo_irr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_delivery_time"}},{"kind":"Field","name":{"kind":"Name","value":"evo_first_payment_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_leasingobject_typeid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_leasingobject_used"}},{"kind":"Field","name":{"kind":"Name","value":"evo_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_accept_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_rateid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_change_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_price_change"}},{"kind":"Field","name":{"kind":"Name","value":"evo_floating_rate"}},{"kind":"Field","name":{"kind":"Name","value":"evo_sale_without_nds"}},{"kind":"Field","name":{"kind":"Name","value":"evo_price_with_discount"}},{"kind":"Field","name":{"kind":"Name","value":"evo_price_without_discount_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_cost_increace"}},{"kind":"Field","name":{"kind":"Name","value":"evo_insurance"}},{"kind":"Field","name":{"kind":"Name","value":"evo_registration_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_card_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nsib_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_redemption_graph"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_quote"}},{"kind":"Field","name":{"kind":"Name","value":"evo_contact_name"}},{"kind":"Field","name":{"kind":"Name","value":"evo_gender"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_redemption"}},{"kind":"Field","name":{"kind":"Name","value":"evo_full_nds_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_id_elt_kasko"}},{"kind":"Field","name":{"kind":"Name","value":"evo_id_kasko_calc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_franchise"}},{"kind":"Field","name":{"kind":"Name","value":"evo_osago_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_id_elt_osago"}},{"kind":"Field","name":{"kind":"Name","value":"evo_osago_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_db_accept_registration"}},{"kind":"Field","name":{"kind":"Name","value":"evo_object_registration"}},{"kind":"Field","name":{"kind":"Name","value":"evo_pts_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_vehicle_tax_year"}},{"kind":"Field","name":{"kind":"Name","value":"evo_vehicle_tax_approved"}},{"kind":"Field","name":{"kind":"Name","value":"evo_category_tr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_vehicle_type_tax"}},{"kind":"Field","name":{"kind":"Name","value":"evo_regionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_townid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_legal_regionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_legal_townid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_registration_regionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_req_telematic"}},{"kind":"Field","name":{"kind":"Name","value":"evo_req_telematic_accept"}},{"kind":"Field","name":{"kind":"Name","value":"evo_osago_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_kasko_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_insurance_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_payer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fingap_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_gps_brandid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_gps_modelid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_insurance_decentral"}},{"kind":"Field","name":{"kind":"Name","value":"evo_unlimit_drivers"}},{"kind":"Field","name":{"kind":"Name","value":"evo_age_drivers"}},{"kind":"Field","name":{"kind":"Name","value":"evo_exp_drivers"}},{"kind":"Field","name":{"kind":"Name","value":"evo_brandid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_category"}},{"kind":"Field","name":{"kind":"Name","value":"evo_engine_hours"}},{"kind":"Field","name":{"kind":"Name","value":"evo_engine_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_engine_volume"}},{"kind":"Field","name":{"kind":"Name","value":"evo_equipmentid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_mass"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_speed"}},{"kind":"Field","name":{"kind":"Name","value":"evo_mileage"}},{"kind":"Field","name":{"kind":"Name","value":"evo_modelid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_object_count"}},{"kind":"Field","name":{"kind":"Name","value":"evo_power"}},{"kind":"Field","name":{"kind":"Name","value":"evo_recalc_limit"}},{"kind":"Field","name":{"kind":"Name","value":"evo_seats"}},{"kind":"Field","name":{"kind":"Name","value":"evo_trailer"}},{"kind":"Field","name":{"kind":"Name","value":"evo_use_for"}},{"kind":"Field","name":{"kind":"Name","value":"evo_vin"}},{"kind":"Field","name":{"kind":"Name","value":"evo_year"}},{"kind":"Field","name":{"kind":"Name","value":"evo_graph_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_payments_decrease_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_seasons_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_high_season"}},{"kind":"Field","name":{"kind":"Name","value":"evo_graphs"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createdon"}},{"kind":"Field","name":{"kind":"Name","value":"evo_sumpay_withnds"}},{"kind":"Field","name":{"kind":"Name","value":"evo_planpayments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_payment_ratio"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_subsidyid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_program_import_subsidyid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_supplier_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_person_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_broker_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_broker_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_broker_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_dealer_broker_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_agent_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_agent_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_agent_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_agent_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_double_agent_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_double_agent_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_double_agent_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_double_agent_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_broker_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_broker_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_broker_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_broker_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fin_department_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fin_department_reward_conditionid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fin_department_reward_total"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fin_department_reward_summ"}},{"kind":"Field","name":{"kind":"Name","value":"evo_supplier_financing"}},{"kind":"Field","name":{"kind":"Name","value":"evo_leadidData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_agent_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_double_agent_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_broker_accountid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_fin_department_accountid"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_product_risks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_addproduct_typeid"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_comission_rub"}},{"kind":"Field","name":{"kind":"Name","value":"evo_comission_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_discount_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_discount_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_first_payment_rub"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_calc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_last_payment_rub"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nds_in_price_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_price_without_nds_supplier_currency"}},{"kind":"Field","name":{"kind":"Name","value":"evo_supplier_currency_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_transactioncurrencyid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_equip_price"}},{"kind":"Field","name":{"kind":"Name","value":"evo_coefficien_bonus_reducttion"}}]}}]}}]} as unknown as DocumentNode; export const GetTarifsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTarifs"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"currentDate"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"DateTime"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_tarifs"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"statecode"},"value":{"kind":"IntValue","value":"0"}},{"kind":"Argument","name":{"kind":"Name","value":"evo_datefrom_param"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"currentDate"}}}]}},{"kind":"Argument","name":{"kind":"Name","value":"evo_dateto_param"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"currentDate"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"label"},"name":{"kind":"Name","value":"evo_name"}},{"kind":"Field","alias":{"kind":"Name","value":"value"},"name":{"kind":"Name","value":"evo_tarifid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_tarifid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_baseproductid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_period"}},{"kind":"Field","name":{"kind":"Name","value":"evo_delivery_time"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_first_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_first_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_last_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_last_payment"}},{"kind":"Field","name":{"kind":"Name","value":"evo_used"}},{"kind":"Field","name":{"kind":"Name","value":"evo_leasingobject_types"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_leasingobject_typeid"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_pl_use_type"}},{"kind":"Field","name":{"kind":"Name","value":"evo_nds_rules"}},{"kind":"Field","name":{"kind":"Name","value":"evo_floating_rate"}}]}}]}}]} as unknown as DocumentNode; export const GetTarifDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTarif"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"tarifId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_tarif"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"evo_tarifid"},"value":{"kind":"Variable","name":{"kind":"Name","value":"tarifId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"label"},"name":{"kind":"Name","value":"evo_name"}},{"kind":"Field","alias":{"kind":"Name","value":"value"},"name":{"kind":"Name","value":"evo_tarifid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_irr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_graphtype_exception"}},{"kind":"Field","name":{"kind":"Name","value":"evo_seasons_type_exception"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_decreasing_perc"}},{"kind":"Field","name":{"kind":"Name","value":"evo_min_irr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_cut_irr_with_bonus_coefficient"}},{"kind":"Field","name":{"kind":"Name","value":"evo_max_irr"}},{"kind":"Field","name":{"kind":"Name","value":"evo_rates"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evo_datefrom"}},{"kind":"Field","name":{"kind":"Name","value":"evo_rateid"}},{"kind":"Field","name":{"kind":"Name","value":"evo_type"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evo_irr_plan"}},{"kind":"Field","name":{"kind":"Name","value":"evo_margin_min"}}]}}]}}]} as unknown as DocumentNode; diff --git a/apps/web/process/recalc/reactions.ts b/apps/web/process/recalc/reactions.ts index 107a8d3..729e150 100644 --- a/apps/web/process/recalc/reactions.ts +++ b/apps/web/process/recalc/reactions.ts @@ -1,10 +1,11 @@ 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 { createValidationReaction } from '@/process/tools'; import { reaction } from 'mobx'; -export function common({ store }: ProcessContext) { +export function common({ store, apolloClient }: ProcessContext) { const { $calculation, $tables } = store; reaction( @@ -65,6 +66,7 @@ export function common({ store }: ProcessContext) { // 'tbxLastPaymentRub', 'cbxPartialVAT', ]; + reaction( () => $calculation.element('cbxRecalcWithRevision').getValue(), (recalcWithRevision) => { @@ -79,7 +81,53 @@ export function common({ store }: ProcessContext) { } } ); + } + { + /** + * Закрыть на редактирование поля при Пересчете без пересмотра recalcWithRevision = True и если в Предложении selectQuote в поле "КП по итогам КК" = Да + * Срок поставки* radioDeliveryTime + * Цель использования* selectLeaseObjectUseFor + * Тип двигателя selectEngineType + * Децентрализованное страхование cbxInsDecentral + */ + const elements: Elements[] = [ + 'radioDeliveryTime', + 'selectLeaseObjectUseFor', + 'selectEngineType', + 'cbxInsDecentral', + ]; + + reaction( + () => $calculation.$values.getValues(['recalcWithRevision', 'quote']), + async ({ recalcWithRevision, quote: quoteId }) => { + if (!recalcWithRevision || !quoteId) { + elements.forEach((elementName) => $calculation.$status.clearOverridedStatus(elementName)); + + return; + } + + const { + data: { quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { + quoteId, + }, + }); + + if (quote?.evo_committee_quote === 100_000_000) { + elements.forEach((elementName) => + $calculation.$status.overrideStatus(elementName, 'Disabled') + ); + } else { + elements.forEach((elementName) => $calculation.$status.clearOverridedStatus(elementName)); + } + } + ); + } + + { const agents: Elements[] = [ 'selectCalcBrokerRewardCondition', 'selectCalcDoubleAgentRewardCondition', diff --git a/apps/web/process/recalc/validation.ts b/apps/web/process/recalc/validation.ts index 05efd10..d35b610 100644 --- a/apps/web/process/recalc/validation.ts +++ b/apps/web/process/recalc/validation.ts @@ -1,6 +1,9 @@ /* eslint-disable sonarjs/cognitive-complexity */ /* eslint-disable complexity */ import type { ValidationContext } from '../types'; +import type { Elements } from '@/Components/Calculation/config/map/values'; +import { FinGAPSchema } from '@/config/schema/fingap'; +import { InsuranceSchema } from '@/config/schema/insurance'; import ValuesSchema from '@/config/schema/values'; import { MAX_MASS, VEHICLE_SEATS } from '@/constants/values'; import * as CRMTypes from '@/graphql/crm.types'; @@ -8,221 +11,367 @@ import { z } from 'zod'; export function createValidationSchema({ apolloClient }: ValidationContext) { return ValuesSchema.pick({ + IRR_Perc: true, addEquipmentPrice: true, countSeats: true, dealerPerson: true, discountRub: true, + engineVolume: true, firstPaymentPerc: true, importProgramSum: true, + insNSIB: true, lastPaymentPerc: true, leaseObjectCategory: true, leaseObjectCount: true, + leaseObjectMotorPower: true, leaseObjectPriceWthtVAT: true, leaseObjectUsed: true, leaseObjectYear: true, maxMass: true, + objectRegistration: true, partialVAT: true, plPriceRub: true, product: true, quote: true, recalcWithRevision: true, - }).superRefine( - async ( - { - addEquipmentPrice, - dealerPerson: dealerPersonId, - importProgramSum, - leaseObjectPriceWthtVAT, - leaseObjectUsed, - product: productId, - quote: quoteId, - recalcWithRevision, - discountRub, - plPriceRub, - firstPaymentPerc, - leaseObjectCount, - maxMass, - countSeats, - leaseObjectYear, - lastPaymentPerc, - leaseObjectCategory, - partialVAT, - }, - ctx - ) => { - if (!recalcWithRevision) { - return; - } + technicalCard: true, + }) + .extend({ + fingap: FinGAPSchema, + insurance: InsuranceSchema, + }) + .superRefine( + async ( + { + addEquipmentPrice, + dealerPerson: dealerPersonId, + importProgramSum, + leaseObjectPriceWthtVAT, + leaseObjectUsed, + product: productId, + quote: quoteId, + recalcWithRevision, + discountRub, + plPriceRub, + firstPaymentPerc, + leaseObjectCount, + maxMass, + countSeats, + leaseObjectYear, + lastPaymentPerc, + leaseObjectCategory, + partialVAT, + IRR_Perc, + leaseObjectMotorPower, + engineVolume, + insNSIB, + technicalCard, + objectRegistration, + fingap: fingapRisks, + insurance, + }, + ctx + ) => { + if (!recalcWithRevision) { + return; + } - if (!quoteId) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Не указано предложение, по которому осуществляется Пересчет без пересмотра', - path: ['selectQuote'], - }); - } - - if (dealerPersonId && quoteId && productId) { - const { - data: { account: dealerPerson }, - } = await apolloClient.query({ - query: CRMTypes.GetDealerPersonDocument, - variables: { dealerPersonId }, - }); - - const { - data: { quote }, - } = await apolloClient.query({ - query: CRMTypes.GetQuoteDocument, - variables: { quoteId }, - }); - - const maxCondition1 = - leaseObjectUsed === false && - dealerPerson?.evo_supplier_type !== 100_000_001 && - quote?.evo_max_price_change && - !partialVAT && - plPriceRub - discountRub + addEquipmentPrice - importProgramSum > - quote.evo_max_price_change; - - const maxCondition2 = - leaseObjectUsed === false && - dealerPerson?.evo_supplier_type !== 100_000_001 && - quote?.evo_max_price_change && - partialVAT && - leaseObjectPriceWthtVAT > - quote.evo_max_price_change - (quote.evo_nds_in_price_supplier_currency || 0); - - const maxCondition3 = - (leaseObjectUsed === true || dealerPerson?.evo_supplier_type === 100_000_001) && - quote?.evo_supplier_currency_price && - plPriceRub - discountRub + addEquipmentPrice - importProgramSum > - quote.evo_supplier_currency_price - - (quote.evo_discount_supplier_currency || 0) + - (quote.evo_equip_price || 0) - - (quote.evo_program_import_subsidy_sum || 0); - - const minCondition1 = - !partialVAT && - quote?.evo_min_change_price && - plPriceRub - discountRub + addEquipmentPrice - importProgramSum < - quote.evo_min_change_price; - - const minCondition2 = - partialVAT && - quote?.evo_min_change_price && - leaseObjectPriceWthtVAT < - quote.evo_min_change_price - (quote.evo_nds_in_price_supplier_currency || 0); - - if (maxCondition1 || maxCondition2) { + if (!quoteId) { ctx.addIssue({ code: z.ZodIssueCode.custom, - message: - 'Указанная стоимость предмета лизинга больше возможного изменения стоимости предмета лизинга при пересчете без пересмотра. ' + - 'Уменьшите стоимость предмета лизинга', - path: ['tbxLeaseObjectPrice'], + message: 'Не указано предложение, по которому осуществляется Пересчет без пересмотра', + path: ['selectQuote'], }); - } else if (maxCondition3) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - 'При пересчете без пересмотра КП с ПЛ БУ или с непрофессиональным поставщиком недопустимо увеличение стоимости. Создайте новое КП и отправьте его на рассмотрение андеррайтингу для повторной проверки оценщиком.', - path: ['tbxLeaseObjectPrice'], + } + + if (dealerPersonId && quoteId && productId) { + const { + data: { account: dealerPerson }, + } = await apolloClient.query({ + query: CRMTypes.GetDealerPersonDocument, + variables: { dealerPersonId }, }); - } else if (minCondition1 || minCondition2) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - 'Указанная стоимость предмета лизинга меньше возможного изменения стоимости предмета лизинга при пересчете без пересмотра. ' + - 'Увеличьте стоимость предмета лизинга', - path: ['tbxLeaseObjectPrice'], + + const { + data: { quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { quoteId }, }); + + const maxCondition1 = + leaseObjectUsed === false && + dealerPerson?.evo_supplier_type !== 100_000_001 && + quote?.evo_max_price_change && + !partialVAT && + plPriceRub - discountRub + addEquipmentPrice - importProgramSum > + quote.evo_max_price_change; + + const maxCondition2 = + leaseObjectUsed === false && + dealerPerson?.evo_supplier_type !== 100_000_001 && + quote?.evo_max_price_change && + partialVAT && + leaseObjectPriceWthtVAT > + quote.evo_max_price_change - (quote.evo_nds_in_price_supplier_currency || 0); + + const maxCondition3 = + (leaseObjectUsed === true || dealerPerson?.evo_supplier_type === 100_000_001) && + quote?.evo_supplier_currency_price && + plPriceRub - discountRub + addEquipmentPrice - importProgramSum > + quote.evo_supplier_currency_price - + (quote.evo_discount_supplier_currency || 0) + + (quote.evo_equip_price || 0) - + (quote.evo_program_import_subsidy_sum || 0); + + const minCondition1 = + !partialVAT && + quote?.evo_min_change_price && + plPriceRub - discountRub + addEquipmentPrice - importProgramSum < + quote.evo_min_change_price; + + const minCondition2 = + partialVAT && + quote?.evo_min_change_price && + leaseObjectPriceWthtVAT < + quote.evo_min_change_price - (quote.evo_nds_in_price_supplier_currency || 0); + + if (maxCondition1 || maxCondition2) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Указанная стоимость предмета лизинга больше возможного изменения стоимости предмета лизинга при пересчете без пересмотра. ' + + 'Уменьшите стоимость предмета лизинга', + path: ['tbxLeaseObjectPrice'], + }); + } else if (maxCondition3) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'При пересчете без пересмотра КП с ПЛ БУ или с непрофессиональным поставщиком недопустимо увеличение стоимости. Создайте новое КП и отправьте его на рассмотрение андеррайтингу для повторной проверки оценщиком.', + path: ['tbxLeaseObjectPrice'], + }); + } else if (minCondition1 || minCondition2) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Указанная стоимость предмета лизинга меньше возможного изменения стоимости предмета лизинга при пересчете без пересмотра. ' + + 'Увеличьте стоимость предмета лизинга', + path: ['tbxLeaseObjectPrice'], + }); + } + } + + if (quoteId) { + const { + data: { quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { quoteId }, + }); + + if ( + firstPaymentPerc < + (quote?.evo_approved_first_payment || 0) + (quote?.evo_percent_subsidy || 0) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Указанный первый платеж меньше одобренного ${quote?.evo_approved_first_payment}. При пересчете без пересмотра изменение первого платежа возможно только в большую сторону от одобренного значения`, + path: ['tbxFirstPaymentPerc'], + }); + } + + if (quote?.evo_recalc_limit && leaseObjectCount > quote.evo_recalc_limit) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Количество ПЛ превышает лимит пересчета без пересмотра', + path: ['tbxLeaseObjectCount'], + }); + } + + if ( + quote?.evo_max_mass && + ((quote.evo_max_mass < MAX_MASS && maxMass >= MAX_MASS) || + (quote?.evo_max_mass >= MAX_MASS && maxMass < MAX_MASS)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Указанная разрешенная макс. масса выходит из утвержденного диапазона. Для изменения параметра требуется пересмотр сделки', + path: ['tbxMaxMass'], + }); + } + + if ( + leaseObjectCategory === 100_000_003 && + quote?.evo_seats && + ((quote.evo_seats < VEHICLE_SEATS && countSeats >= VEHICLE_SEATS) || + (quote.evo_seats >= VEHICLE_SEATS && countSeats < VEHICLE_SEATS)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Указанное кол-во мест выходит из утвержденного диапазона. Для изменения параметра требуется пересмотр сделки', + path: ['tbxCountSeats'], + }); + } + + if (quote?.evo_year && leaseObjectYear < quote.evo_year) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'При пересчете без пересмотра год выпуска нельзя уменьшать', + path: ['tbxLeaseObjectYear'], + }); + } + + if ( + quote?.evo_last_payment_perc && + lastPaymentPerc > 1 && + lastPaymentPerc > quote.evo_last_payment_perc + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'При пересчете без пересмотра последний платеж можно уменьшать или увеличивать до 1%', + path: ['tbxLastPaymentPerc'], + }); + } + + if (partialVAT !== quote?.evo_sale_without_nds) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя менять частичный НДС при пересчете без пересмотра', + path: ['selectProduct'], + }); + } + + if (quote?.evo_committee_quote === 100_000_000 && quote.evo_accept_quoteid) { + const { + data: { quote: accept_quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { quoteId: quote.evo_accept_quoteid }, + }); + + if (accept_quote?.evo_msfo_irr && IRR_Perc - accept_quote?.evo_msfo_irr > 0.1) + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя увеличивать IRR после рассмотрения предложения на КК', + path: ['tbxIRR_Perc'] as Elements[], + }); + + if ( + accept_quote?.evo_power && + Math.abs(leaseObjectMotorPower - accept_quote.evo_power) > 10 + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Нельзя корректировать мощность более чем на 10 л.с. после рассмотрения предложения на КК', + path: ['tbxLeaseObjectMotorPower'] as Elements[], + }); + } + + if ( + accept_quote?.evo_engine_volume && + Math.abs(engineVolume - accept_quote.evo_engine_volume) > 0.1 + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Нельзя корректировать объем двигателя более чем на 0.1 л после рассмотрения предложения на КК', + path: ['tbxEngineVolume'] as Elements[], + }); + } + + if (insNSIB && !accept_quote?.evo_nsib) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя включать в график НСИБ после рассмотрения предложения на КК', + path: ['selectInsNSIB'] as Elements[], + }); + } + + if ( + technicalCard && + !accept_quote?.evo_addproduct_types?.some((x) => x?.evo_product_type === 100_000_000) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Нельзя включать в график карту тех.помощи после рассмотрения предложения на КК', + path: ['selectTechnicalCard'] as Elements[], + }); + } + + if ( + objectRegistration && + objectRegistration !== accept_quote?.evo_db_accept_registration + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя менять регистрацию после рассмотрения предложения на КК', + path: ['radioObjectRegistration'] as Elements[], + }); + } + + if ( + insurance.values.fingap.insured === 100_000_001 && + fingapRisks?.length > 0 && + fingapRisks.some( + (fingapRisk) => + !accept_quote?.evo_product_risks?.some( + (evo_product_risk) => + fingapRisk.riskId === evo_product_risk?.evo_addproduct_typeid + ) + ) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Нельзя включать новые риски Safe Finance после рассмотрения предложения на КК', + path: ['fingap'], + }); + } + + if ( + insurance.values.fingap.insured === 100_000_001 && + accept_quote?.evo_fingap_payer && + insurance.values.fingap.insured !== accept_quote?.evo_fingap_payer + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + 'Нельзя включать в график SafeFinance после рассмотрения предложения на КК', + path: ['insurance'], + }); + } + + if ( + insurance.values.osago.insured === 100_000_001 && + accept_quote?.evo_osago_payer && + insurance.values.osago.insured !== accept_quote?.evo_osago_payer + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя включать в график ОСАГО после рассмотрения предложения на КК', + path: ['insurance'], + }); + } + + if ( + insurance.values.kasko.insured === 100_000_001 && + accept_quote?.evo_kasko_payer && + insurance.values.kasko.insured !== accept_quote?.evo_kasko_payer + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Нельзя включать в график КАСКО после рассмотрения предложения на КК', + path: ['insurance'], + }); + } + } } } - - if (quoteId) { - const { - data: { quote }, - } = await apolloClient.query({ - query: CRMTypes.GetQuoteDocument, - variables: { quoteId }, - }); - - if ( - firstPaymentPerc < - (quote?.evo_approved_first_payment || 0) + (quote?.evo_percent_subsidy || 0) - ) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Указанный первый платеж меньше одобренного ${quote?.evo_approved_first_payment}. При пересчете без пересмотра изменение первого платежа возможно только в большую сторону от одобренного значения`, - path: ['tbxFirstPaymentPerc'], - }); - } - - if (quote?.evo_recalc_limit && leaseObjectCount > quote.evo_recalc_limit) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Количество ПЛ превышает лимит пересчета без пересмотра', - path: ['tbxLeaseObjectCount'], - }); - } - - if ( - quote?.evo_max_mass && - ((quote.evo_max_mass < MAX_MASS && maxMass >= MAX_MASS) || - (quote?.evo_max_mass >= MAX_MASS && maxMass < MAX_MASS)) - ) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - 'Указанная разрешенная макс. масса выходит из утвержденного диапазона. Для изменения параметра требуется пересмотр сделки', - path: ['tbxMaxMass'], - }); - } - - if ( - leaseObjectCategory === 100_000_003 && - quote?.evo_seats && - ((quote.evo_seats < VEHICLE_SEATS && countSeats >= VEHICLE_SEATS) || - (quote.evo_seats >= VEHICLE_SEATS && countSeats < VEHICLE_SEATS)) - ) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - 'Указанное кол-во мест выходит из утвержденного диапазона. Для изменения параметра требуется пересмотр сделки', - path: ['tbxCountSeats'], - }); - } - - if (quote?.evo_year && leaseObjectYear < quote.evo_year) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'При пересчете без пересмотра год выпуска нельзя уменьшать', - path: ['tbxLeaseObjectYear'], - }); - } - - if ( - quote?.evo_last_payment_perc && - lastPaymentPerc > 1 && - lastPaymentPerc > quote.evo_last_payment_perc - ) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - 'При пересчете без пересмотра последний платеж можно уменьшать или увеличивать до 1%', - path: ['tbxLastPaymentPerc'], - }); - } - - if (partialVAT !== quote?.evo_sale_without_nds) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Нельзя менять частичный НДС при пересчете без пересмотра', - path: ['selectProduct'], - }); - } - } - } - ); + ); } diff --git a/apps/web/server/routers/calculate/index.ts b/apps/web/server/routers/calculate/index.ts index b664075..903268a 100644 --- a/apps/web/server/routers/calculate/index.ts +++ b/apps/web/server/routers/calculate/index.ts @@ -1,4 +1,5 @@ import { router } from '../../trpc'; +import { validateResults } from './lib/post-validation'; import { createRequestData } from './lib/request'; import { transformCalculateResults } from './lib/transform'; import { validate } from './lib/validation'; @@ -52,6 +53,20 @@ export const calculateRouter = router({ const calculateResult = await calculate(requestData); + const postValidationResult = await validateResults({ + calculateResult, + context: { + apolloClient, + queryClient, + user: ctx.user, + }, + input, + }); + + if (postValidationResult.success === false) { + throw new HttpError(postValidationResult.message, 400); + } + const result = transformCalculateResults({ calculateInput: input, requestCalculate: requestData, diff --git a/apps/web/server/routers/calculate/lib/post-validation.ts b/apps/web/server/routers/calculate/lib/post-validation.ts new file mode 100644 index 0000000..9e96e3d --- /dev/null +++ b/apps/web/server/routers/calculate/lib/post-validation.ts @@ -0,0 +1,55 @@ +import type { CalculateInput, Context } from '../types'; +import type { ResponseCalculate } from '@/api/core/types'; +import * as CRMTypes from '@/graphql/crm.types'; + +export async function validateResults({ + input, + context, + calculateResult, +}: { + calculateResult: ResponseCalculate; + context: Context; + input: CalculateInput; +}) { + const { recalcWithRevision, quote: quoteId } = input.values; + if (recalcWithRevision && quoteId) { + const { apolloClient } = context; + + const { + data: { quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { + quoteId, + }, + }); + + if (quote?.evo_committee_quote === 100_000_000 && quote.evo_accept_quoteid) { + const { preparedValues } = calculateResult; + const { npvBonusExpensesColumn } = calculateResult.columns; + + const { + data: { quote: accept_quote }, + } = await apolloClient.query({ + query: CRMTypes.GetQuoteDocument, + variables: { quoteId: quote.evo_accept_quoteid }, + }); + + if ( + Math.abs(npvBonusExpensesColumn.values.at(2) || 0) / (1 + preparedValues.salaryRate) - + (accept_quote?.evo_leasing_bonus_summ || 0) > + 100 + ) { + return { + message: 'Нельзя увеличивать бонус МПЛ после рассмотрения предложения на КК', + success: false, + }; + } + } + } + + return { + message: '', + success: true, + }; +} diff --git a/apps/web/server/routers/quote/index.ts b/apps/web/server/routers/quote/index.ts index 247642b..03e1216 100644 --- a/apps/web/server/routers/quote/index.ts +++ b/apps/web/server/routers/quote/index.ts @@ -1,6 +1,7 @@ /* eslint-disable canonical/sort-keys */ import { protectedProcedure } from '../../procedure'; import { router } from '../../trpc'; +import { validateResults } from '../calculate/lib/post-validation'; import { createRequestData } from '../calculate/lib/request'; import { transformCalculateResults } from '../calculate/lib/transform'; import { validate } from '../calculate/lib/validation'; @@ -147,6 +148,20 @@ export const quoteRouter = router({ const calculateResult = await calculate(requestData); + const postValidationResult = await validateResults({ + calculateResult, + context: { + apolloClient, + queryClient, + user: ctx.user, + }, + input, + }); + + if (postValidationResult.success === false) { + throw new HttpError(postValidationResult.message, 400); + } + const requestCreateKP = compatRequestCreateKP({ domainName: user.domainName, finGAP: input.fingap,