/* eslint-disable sonarjs/cognitive-complexity */ /* eslint-disable complexity */ import type { ValidationContext } from '../types'; import ValuesSchema from '@/config/schema/values'; import { MAX_MASS, VEHICLE_SEATS } from '@/constants/values'; import * as CRMTypes from '@/graphql/crm.types'; import { z } from 'zod'; export function createValidationSchema({ apolloClient }: ValidationContext) { return ValuesSchema.pick({ addEquipmentPrice: true, countSeats: true, dealerPerson: true, discountRub: true, firstPaymentPerc: true, importProgramSum: true, lastPaymentPerc: true, leaseObjectCategory: true, leaseObjectCount: true, leaseObjectPriceWthtVAT: true, leaseObjectUsed: true, leaseObjectYear: true, maxMass: 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; } if (!quoteId) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Не указано предложение, по которому осуществляется Пересчет без пересмотра', path: ['selectQuote'], }); } if (dealerPersonId && quoteId && productId) { const { data: { dealer_person }, } = await apolloClient.query({ query: CRMTypes.GetDealerPersonDocument, variables: { dealerPersonId }, }); const { data: { quote }, } = await apolloClient.query({ query: CRMTypes.GetQuoteDocument, variables: { quoteId }, }); const maxCondition1 = leaseObjectUsed === false && dealer_person?.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 && dealer_person?.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 || dealer_person?.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'], }); } } } ); }