diff --git a/apps/web/config/process/default.ts b/apps/web/config/process/default.ts index fef86c0..25c9010 100644 --- a/apps/web/config/process/default.ts +++ b/apps/web/config/process/default.ts @@ -15,14 +15,14 @@ import * as payments from '@/process/payments'; import * as price from '@/process/price'; import * as subsidy from '@/process/subsidy'; import * as subsidyImportProgram from '@/process/subsidy-import-program'; -// import * as supplierAgent from '@/process/supplier-agent'; +import * as supplierAgent from '@/process/supplier-agent'; import * as usedPl from '@/process/used-pl'; export default function useReactions() { useProcess(leadOpportunity); useProcess(loadKP); useProcess(calculate); - // useProcess(supplierAgent); + useProcess(supplierAgent); useProcess(price); useProcess(fingap); useProcess(leasingWithoutKasko); diff --git a/apps/web/process/supplier-agent/lib/create-reactions.ts b/apps/web/process/supplier-agent/lib/create-reactions.ts index 9022c5d..5108e68 100644 --- a/apps/web/process/supplier-agent/lib/create-reactions.ts +++ b/apps/web/process/supplier-agent/lib/create-reactions.ts @@ -2,11 +2,10 @@ import type { AgentsFields, AgentsRewardConditionsFields, AgentsSumFields } from './types'; import * as CRMTypes from '@/graphql/crm.types'; import type RootStore from '@/stores/root'; -import ValidationHelper from '@/stores/validation/helper'; import type { ApolloClient } from '@apollo/client'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; -import { autorun, reaction } from 'mobx'; +import { reaction } from 'mobx'; import { normalizeOptions } from 'tools/entity'; import { makeDisposable } from 'tools/mobx'; @@ -104,108 +103,3 @@ export function fillAgentRewardSummReaction( } ); } - -export function validateAgentRewardSumm( - store: RootStore, - apolloClient: ApolloClient, - agentParams: { - rewardConditionField: AgentsRewardConditionsFields; - rewardSummField: AgentsSumFields; - } -) { - const { $calculation } = store; - const { rewardConditionField, rewardSummField } = agentParams; - - const validationHelper = new ValidationHelper(); - - reaction( - () => $calculation.element(rewardSummField).getValue(), - async (rewardSumm) => { - const conditionId = $calculation.element(rewardConditionField).getValue(); - if (!conditionId) { - validationHelper.removeErrors(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardConditionQuery, - CRMTypes.GetRewardConditionQueryVariables - >({ - query: CRMTypes.GetRewardConditionDocument, - variables: { - conditionId, - }, - }); - - if (!evo_reward_condition) { - validationHelper.removeErrors(); - - return; - } - - if (evo_reward_condition.evo_reward_summ) { - $calculation.element(rewardSummField).validate({ - helper: validationHelper, - invalid: rewardSumm > evo_reward_condition?.evo_reward_summ, - message: 'Вознаграждение указано больше условия по агентскому договору!', - }); - } - - if ( - evo_reward_condition?.evo_reduce_reward !== null && - evo_reward_condition.evo_reward_summ - ) { - $calculation.element(rewardSummField).validate({ - helper: validationHelper, - invalid: - evo_reward_condition.evo_reduce_reward === false && - rewardSumm < evo_reward_condition.evo_reward_summ, - message: 'Вознаграждение указано меньше условия по агентскому договору!', - }); - } - - if (evo_reward_condition?.evo_min_reward_summ !== null) { - $calculation.element(rewardSummField).validate({ - helper: validationHelper, - invalid: rewardSumm < evo_reward_condition?.evo_min_reward_summ, - message: 'Вознаграждение указано меньше условия по агентскому договору!', - }); - } - } - ); - - autorun(() => { - const rewardSumm = $calculation.element(rewardSummField).getValue(); - const rewardConditionOptions = $calculation.$options.getOptions(rewardConditionField); - - const conditionIds = rewardConditionOptions.map((x) => x.value); - const requests = conditionIds.map(async (conditionId) => { - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardConditionQuery, - CRMTypes.GetRewardConditionQueryVariables - >({ - query: CRMTypes.GetRewardConditionDocument, - variables: { - conditionId, - }, - }); - - return evo_reward_condition; - }); - - Promise.all(requests).then((results) => { - const required_reward = results.some( - (x) => x?.evo_agency_agreementidData?.evo_required_reward === true - ); - $calculation.element(rewardSummField).validate({ - invalid: rewardSumm === 0 && required_reward, - message: 'Согласно агентскому договору обязательна выплата АВ. Заложите АВ в расчет', - }); - }); - }); -} diff --git a/apps/web/process/supplier-agent/lib/types.ts b/apps/web/process/supplier-agent/lib/types.ts deleted file mode 100644 index 196c175..0000000 --- a/apps/web/process/supplier-agent/lib/types.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type * as Values from '@/Components/Calculation/config/map/values'; - -export type AgentsFields = Extract< - Values.Elements, - | 'selectCalcBroker' - | 'selectCalcDoubleAgent' - | 'selectCalcFinDepartment' - | 'selectDealerBroker' - | 'selectDealerPerson' - | 'selectIndAgent' ->; -export type AgentsRewardConditionsFields = Extract< - Values.Elements, - | 'selectCalcBrokerRewardCondition' - | 'selectCalcDoubleAgentRewardCondition' - | 'selectDealerBrokerRewardCondition' - | 'selectDealerRewardCondition' - | 'selectFinDepartmentRewardCondtion' - | 'selectIndAgentRewardCondition' ->; -export type AgentsSumFields = Extract< - Values.Elements, - | 'tbxCalcBrokerRewardSum' - | 'tbxCalcDoubleAgentRewardSumm' - | 'tbxDealerBrokerRewardSumm' - | 'tbxDealerRewardSumm' - | 'tbxFinDepartmentRewardSumm' - | 'tbxIndAgentRewardSumm' ->; diff --git a/apps/web/process/supplier-agent/reactions/agents.ts b/apps/web/process/supplier-agent/reactions/agents.ts index 000750d..c4e94be 100644 --- a/apps/web/process/supplier-agent/reactions/agents.ts +++ b/apps/web/process/supplier-agent/reactions/agents.ts @@ -6,12 +6,11 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ProcessContext } from '@/process/types'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; -import { autorun, reaction } from 'mobx'; +import { reaction } from 'mobx'; import { makeDisposable } from 'tools/mobx'; const { fillIndAgent, fillCalcBroker, fillCalcDoubleAgent, fillFinDepartment } = fillAgentsFromLead; -const { fillAgentRewardReaction, fillAgentRewardSummReaction, validateAgentRewardSumm } = - createReactions; +const { fillAgentRewardReaction, fillAgentRewardSummReaction } = createReactions; dayjs.extend(utc); @@ -521,165 +520,3 @@ export function common({ store, apolloClient }: ProcessContext) { ); } } - -export function validation({ store, apolloClient }: ProcessContext) { - const { $calculation } = store; - - validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectIndAgentRewardCondition', - rewardSummField: 'tbxIndAgentRewardSumm', - }); - - validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectCalcDoubleAgentRewardCondition', - rewardSummField: 'tbxCalcDoubleAgentRewardSumm', - }); - - validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectCalcBrokerRewardCondition', - rewardSummField: 'tbxCalcBrokerRewardSum', - }); - - validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectFinDepartmentRewardCondtion', - rewardSummField: 'tbxFinDepartmentRewardSumm', - }); - - /** - * Добавить валидацию на кнопку Рассчитать: - * если tbxDealerRewardSumm > 0 и - * если selectDealerPerson = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectDealerPerson - * если selectDealerPerson = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerPerson - * если selectDealerPerson = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerPerson - * если selectDealerPerson = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerPerson - * если selectDealerPerson = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerPerson - * 2.если tbxDealerBrokerRewardSumm > 0 и - * - * если selectDealerBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectDealerBroker - * если selectDealerBroker = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerBroker - * если selectDealerBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerBroker - * если selectDealerBroker = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerBroker - * если selectDealerBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerBroker - * 3. если tbxIndAgentRewardSumm > 0 и - * - * если selectIndAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectIndAgent - * если selectIndAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectIndAgent - * если selectIndAgent = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectIndAgent - * если selectIndAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectIndAgent - * если selectIndAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectIndAgent - * 4. если tbxCalcDoubleAgentRewardSumm > 0 и - * - * если selectCalcDoubleAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcDoubleAgent - * если selectCalcDoubleAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcDoubleAgent - * если selectCalcDoubleAgent = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcDoubleAgent - * если selectCalcDoubleAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectCalcDoubleAgent - * если selectCalcDoubleAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcDoubleAgent - * 5. если tbxCalcBrokerRewardSum > 0 и - * - * если selectCalcBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcBroker - * если selectCalcBroker = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcBroker - * если selectCalcBroker = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcBroker - * если selectCalcBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectCalcBroker - * если selectCalcBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcBroker - * 6. если tbxFinDepartmentRewardSumm > 0 и - * - * если selectFinDepartment = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectFinDepartment - * если selectFinDepartment = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectFinDepartment - * если selectFinDepartment = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectFinDepartment - * если selectFinDepartment = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectFinDepartment - * если selectFinDepartment = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectFinDepartment - */ - - // eslint-disable-next-line complexity, sonarjs/cognitive-complexity - autorun(() => { - const dealerRewardSumm = $calculation.element('tbxDealerRewardSumm').getValue(); - const dealerBrokerRewardSumm = $calculation.element('tbxDealerBrokerRewardSumm').getValue(); - const indAgentRewardSumm = $calculation.element('tbxIndAgentRewardSumm').getValue(); - const calcDoubleAgentRewardSumm = $calculation - .element('tbxCalcDoubleAgentRewardSumm') - .getValue(); - const calcBrokerRewardSum = $calculation.element('tbxCalcBrokerRewardSum').getValue(); - const finDepartmentRewardSumm = $calculation.element('tbxFinDepartmentRewardSumm').getValue(); - - const dealerPerson = $calculation.element('selectDealerPerson').getValue(); - const dealerBroker = $calculation.element('selectDealerBroker').getValue(); - const indAgent = $calculation.element('selectIndAgent').getValue(); - const calcDoubleAgent = $calculation.element('selectCalcDoubleAgent').getValue(); - const calcBroker = $calculation.element('selectCalcBroker').getValue(); - const calcFinDepartment = $calculation.element('selectCalcFinDepartment').getValue(); - - const message = 'Вы закладываете вознаграждение одному и тому же агенту дважды'; - - $calculation.element('selectDealerPerson').validate({ - invalid: - dealerRewardSumm > 0 && - Boolean(dealerPerson) && - ((dealerPerson === dealerBroker && dealerBrokerRewardSumm > 0) || - (dealerPerson === indAgent && indAgentRewardSumm > 0) || - (dealerPerson === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || - (dealerPerson === calcBroker && calcBrokerRewardSum > 0) || - (dealerPerson === calcFinDepartment && finDepartmentRewardSumm > 0)), - message, - }); - - $calculation.element('selectDealerBroker').validate({ - invalid: - dealerBrokerRewardSumm > 0 && - Boolean(dealerBroker) && - ((dealerBroker === dealerPerson && dealerRewardSumm > 0) || - (dealerBroker === indAgent && indAgentRewardSumm > 0) || - (dealerBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || - (dealerBroker === calcBroker && calcBrokerRewardSum > 0) || - (dealerBroker === calcFinDepartment && finDepartmentRewardSumm > 0)), - message, - }); - - $calculation.element('selectIndAgent').validate({ - invalid: - indAgentRewardSumm > 0 && - Boolean(indAgent) && - ((indAgent === dealerPerson && dealerRewardSumm > 0) || - (indAgent === dealerBroker && dealerBrokerRewardSumm > 0) || - (indAgent === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || - (indAgent === calcBroker && calcBrokerRewardSum > 0) || - (indAgent === calcFinDepartment && finDepartmentRewardSumm > 0)), - message, - }); - - $calculation.element('selectCalcDoubleAgent').validate({ - invalid: - calcDoubleAgentRewardSumm > 0 && - Boolean(calcDoubleAgent) && - ((calcDoubleAgent === dealerPerson && dealerRewardSumm > 0) || - (calcDoubleAgent === dealerBroker && dealerBrokerRewardSumm > 0) || - (calcDoubleAgent === indAgent && indAgentRewardSumm > 0) || - (calcDoubleAgent === calcBroker && calcBrokerRewardSum > 0) || - (calcDoubleAgent === calcFinDepartment && finDepartmentRewardSumm > 0)), - message, - }); - - $calculation.element('selectCalcBroker').validate({ - invalid: - calcBrokerRewardSum > 0 && - Boolean(calcBroker) && - ((calcBroker === dealerPerson && dealerRewardSumm > 0) || - (calcBroker === dealerBroker && dealerBrokerRewardSumm > 0) || - (calcBroker === indAgent && indAgentRewardSumm > 0) || - (calcBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || - (calcBroker === calcFinDepartment && finDepartmentRewardSumm > 0)), - message, - }); - - $calculation.element('selectCalcFinDepartment').validate({ - invalid: - finDepartmentRewardSumm > 0 && - Boolean(calcFinDepartment) && - ((calcFinDepartment === dealerPerson && dealerRewardSumm > 0) || - (calcFinDepartment === dealerBroker && dealerBrokerRewardSumm > 0) || - (calcFinDepartment === indAgent && indAgentRewardSumm > 0) || - (calcFinDepartment === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || - (calcFinDepartment === calcBroker && calcBrokerRewardSum > 0)), - message, - }); - }); -} diff --git a/apps/web/process/supplier-agent/reactions/index.ts b/apps/web/process/supplier-agent/reactions/index.ts index 52e9725..9a46f6f 100644 --- a/apps/web/process/supplier-agent/reactions/index.ts +++ b/apps/web/process/supplier-agent/reactions/index.ts @@ -9,9 +9,6 @@ function common(context: ProcessContext) { supplier.common(context); } -function validation(context: ProcessContext) { - agents.validation(context); - supplier.validation(context); -} +export { common }; -export { common, validation }; +export { default as validation } from './validation'; diff --git a/apps/web/process/supplier-agent/reactions/leaseback.ts b/apps/web/process/supplier-agent/reactions/leaseback.ts index ce8ff98..0340a81 100644 --- a/apps/web/process/supplier-agent/reactions/leaseback.ts +++ b/apps/web/process/supplier-agent/reactions/leaseback.ts @@ -1,6 +1,6 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ProcessContext } from '@/process/types'; -import { autorun, reaction } from 'mobx'; +import { reaction } from 'mobx'; export function common({ store, apolloClient }: ProcessContext) { const { $calculation, $tables } = store; @@ -73,37 +73,4 @@ export function common({ store, apolloClient }: ProcessContext) { } } ); - - /** - * В валидацию на кнопку Рассчитать внести изменение: - * 1) поле selectDealerPerson убрать из списка обязательных для расчета полей - * 2) добавить валидацию на поле selectDealerPerson : - * Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null) - * и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой, - * иначе все ок - */ - - autorun(async () => { - const dealerId = $calculation.element('selectDealer').getValue(); - const dealerPersonId = $calculation.element('selectDealerPerson').getValue(); - - let returnLeasing: boolean | null | undefined; - - if (dealerId) { - const { - data: { dealer }, - } = await apolloClient.query({ - query: CRMTypes.GetDealerDocument, - variables: { - dealerId, - }, - }); - returnLeasing = dealer?.evo_return_leasing_dealer; - } - - $calculation.element('selectDealerPerson').validate({ - invalid: Boolean(dealerId) && !dealerPersonId && !returnLeasing, - message: 'Не заполнено поле', - }); - }); } diff --git a/apps/web/process/supplier-agent/reactions/supplier.ts b/apps/web/process/supplier-agent/reactions/supplier.ts index bbb50f7..1709be1 100644 --- a/apps/web/process/supplier-agent/reactions/supplier.ts +++ b/apps/web/process/supplier-agent/reactions/supplier.ts @@ -157,15 +157,3 @@ export function common({ store, apolloClient }: ProcessContext) { } ); } - -export function validation({ store, apolloClient }: ProcessContext) { - createReactions.validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectDealerRewardCondition', - rewardSummField: 'tbxDealerRewardSumm', - }); - - createReactions.validateAgentRewardSumm(store, apolloClient, { - rewardConditionField: 'selectDealerBrokerRewardCondition', - rewardSummField: 'tbxDealerBrokerRewardSumm', - }); -} diff --git a/apps/web/process/supplier-agent/reactions/validation.ts b/apps/web/process/supplier-agent/reactions/validation.ts new file mode 100644 index 0000000..78ac525 --- /dev/null +++ b/apps/web/process/supplier-agent/reactions/validation.ts @@ -0,0 +1,56 @@ +import { createValidationSchema } from '../validation'; +import type { Elements } from '@/Components/Calculation/config/map/values'; +import type { ProcessContext } from '@/process/types'; +import ValidationHelper from '@/stores/validation/helper'; +import { reaction } from 'mobx'; +import { uid } from 'radash'; + +const key = uid(7); + +export default function reactions(context: ProcessContext) { + const { store } = context; + const { $calculation } = store; + const validationSchema = createValidationSchema(context); + + const helper = new ValidationHelper(); + reaction( + () => + $calculation.$values.getValues([ + 'calcBrokerRewardCondition', + 'calcBrokerRewardSum', + 'calcDoubleAgentRewardCondition', + 'calcDoubleAgentRewardSumm', + 'dealer', + 'dealerBroker', + 'calcFinDepartment', + 'dealerBrokerRewardCondition', + 'dealerBrokerRewardSumm', + 'dealerPerson', + 'dealerRewardCondition', + 'dealerRewardSumm', + 'finDepartmentRewardCondtion', + 'finDepartmentRewardSumm', + 'indAgent', + 'indAgentRewardCondition', + 'indAgentRewardSumm', + 'calcDoubleAgent', + 'calcBroker', + ]), + async (values) => { + helper.removeErrors(); + const validationResult = await validationSchema.safeParseAsync(values); + + if (!validationResult.success) { + validationResult.error.errors.forEach(({ path, message }) => { + (path as Elements[]).forEach((elementName) => { + const removeError = $calculation.element(elementName).setError({ key, message }); + if (removeError) helper.add(removeError); + }); + }); + } + }, + { + delay: 100, + } + ); +} diff --git a/apps/web/process/supplier-agent/validation.ts b/apps/web/process/supplier-agent/validation.ts new file mode 100644 index 0000000..22ff59c --- /dev/null +++ b/apps/web/process/supplier-agent/validation.ts @@ -0,0 +1,384 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable complexity */ +import type { ValidationContext } from '../types'; +import type { Elements } from '@/Components/Calculation/config/map/values'; +import ValuesSchema from '@/config/schema/values'; +import * as CRMTypes from '@/graphql/crm.types'; +import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import { normalizeOptions } from 'tools'; +import type { RefinementCtx } from 'zod'; +import { z } from 'zod'; + +dayjs.extend(utc); + +function helper({ apolloClient, ctx }: ValidationContext & { ctx: RefinementCtx }) { + return { + async validateRewardSum({ + agentid, + conditionId, + sumFieldName, + sum, + }: { + agentid: string | null; + conditionId: string | null; + sum: number; + sumFieldName: Elements; + }) { + if (agentid) { + const { + data: { evo_reward_conditions }, + } = await apolloClient.query({ + query: CRMTypes.GetRewardConditionsDocument, + variables: { + agentid, + currentDate: dayjs().utc(false).format('YYYY-MM-DD'), + }, + }); + + const requests = normalizeOptions(evo_reward_conditions)?.map(async ({ value }) => { + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardConditionQuery, + CRMTypes.GetRewardConditionQueryVariables + >({ + query: CRMTypes.GetRewardConditionDocument, + variables: { + conditionId: value, + }, + }); + + return evo_reward_condition; + }); + + const requiredReward = (await Promise.all(requests)).some( + (x) => x?.evo_agency_agreementidData?.evo_required_reward === true + ); + + if (sum === 0 && requiredReward) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Согласно агентскому договору обязательна выплата АВ. Заложите АВ в расчет', + path: [sumFieldName], + }); + } + } + + if (conditionId) { + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardConditionQuery, + CRMTypes.GetRewardConditionQueryVariables + >({ + query: CRMTypes.GetRewardConditionDocument, + variables: { + conditionId, + }, + }); + + if (evo_reward_condition?.evo_reward_summ && sum > evo_reward_condition?.evo_reward_summ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Вознаграждение указано больше условия по агентскому договору!', + path: [sumFieldName], + }); + } + + if ( + evo_reward_condition?.evo_reduce_reward === false && + evo_reward_condition?.evo_reward_summ && + sum < evo_reward_condition?.evo_reward_summ + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Вознаграждение указано меньше условия по агентскому договору!', + path: [sumFieldName], + }); + } + + if ( + evo_reward_condition?.evo_min_reward_summ && + sum < evo_reward_condition?.evo_min_reward_summ + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Вознаграждение указано меньше условия по агентскому договору!', + path: [sumFieldName], + }); + } + } + }, + }; +} + +const ERR_DOUBLE_REWARD = 'Вы закладываете вознаграждение одному и тому же агенту дважды'; + +const AgentsSchema = ValuesSchema.pick({ + calcBroker: true, + calcDoubleAgent: true, + calcFinDepartment: true, + dealer: true, + dealerBroker: true, + dealerPerson: true, + indAgent: true, +}); + +const ConditionsSchema = ValuesSchema.pick({ + calcBrokerRewardCondition: true, + calcDoubleAgentRewardCondition: true, + dealerBrokerRewardCondition: true, + dealerRewardCondition: true, + finDepartmentRewardCondtion: true, + indAgentRewardCondition: true, +}); + +const SumsSchema = ValuesSchema.pick({ + calcBrokerRewardSum: true, + calcDoubleAgentRewardSumm: true, + dealerBrokerRewardSumm: true, + dealerRewardSumm: true, + finDepartmentRewardSumm: true, + indAgentRewardSumm: true, +}); + +export function createValidationSchema(context: ValidationContext) { + const { apolloClient } = context; + + return AgentsSchema.merge(ConditionsSchema) + .merge(SumsSchema) + .superRefine(async (values, ctx) => { + const { + calcBrokerRewardCondition, + calcBrokerRewardSum, + calcDoubleAgentRewardCondition, + calcDoubleAgentRewardSumm, + dealer: dealerId, + dealerBroker, + calcFinDepartment, + dealerBrokerRewardCondition, + dealerBrokerRewardSumm, + dealerPerson, + dealerRewardCondition, + dealerRewardSumm, + finDepartmentRewardCondtion, + finDepartmentRewardSumm, + indAgent, + indAgentRewardCondition, + indAgentRewardSumm, + calcDoubleAgent, + calcBroker, + } = values; + /** + * Добавить валидацию на кнопку Рассчитать: + * если tbxDealerRewardSumm > 0 и + * если selectDealerPerson = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectDealerPerson + * если selectDealerPerson = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerPerson + * если selectDealerPerson = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerPerson + * если selectDealerPerson = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerPerson + * если selectDealerPerson = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerPerson + * 2.если tbxDealerBrokerRewardSumm > 0 и + * + * если selectDealerBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectDealerBroker + * если selectDealerBroker = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerBroker + * если selectDealerBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerBroker + * если selectDealerBroker = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerBroker + * если selectDealerBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerBroker + * 3. если tbxIndAgentRewardSumm > 0 и + * + * если selectIndAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectIndAgent + * если selectIndAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectIndAgent + * если selectIndAgent = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectIndAgent + * если selectIndAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectIndAgent + * если selectIndAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectIndAgent + * 4. если tbxCalcDoubleAgentRewardSumm > 0 и + * + * если selectCalcDoubleAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcDoubleAgent + * если selectCalcDoubleAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcDoubleAgent + * если selectCalcDoubleAgent = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcDoubleAgent + * если selectCalcDoubleAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectCalcDoubleAgent + * если selectCalcDoubleAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcDoubleAgent + * 5. если tbxCalcBrokerRewardSum > 0 и + * + * если selectCalcBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcBroker + * если selectCalcBroker = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcBroker + * если selectCalcBroker = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcBroker + * если selectCalcBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectCalcBroker + * если selectCalcBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcBroker + * 6. если tbxFinDepartmentRewardSumm > 0 и + * + * если selectFinDepartment = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectFinDepartment + * если selectFinDepartment = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectFinDepartment + * если selectFinDepartment = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectFinDepartment + * если selectFinDepartment = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectFinDepartment + * если selectFinDepartment = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectFinDepartment + */ + + if ( + dealerRewardSumm > 0 && + Boolean(dealerPerson) && + ((dealerPerson === dealerBroker && dealerBrokerRewardSumm > 0) || + (dealerPerson === indAgent && indAgentRewardSumm > 0) || + (dealerPerson === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || + (dealerPerson === calcBroker && calcBrokerRewardSum > 0) || + (dealerPerson === calcFinDepartment && finDepartmentRewardSumm > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectDealerPerson'], + }); + } + + if ( + dealerBrokerRewardSumm > 0 && + Boolean(dealerBroker) && + ((dealerBroker === dealerPerson && dealerRewardSumm > 0) || + (dealerBroker === indAgent && indAgentRewardSumm > 0) || + (dealerBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || + (dealerBroker === calcBroker && calcBrokerRewardSum > 0) || + (dealerBroker === calcFinDepartment && finDepartmentRewardSumm > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectDealerBroker'], + }); + } + + if ( + indAgentRewardSumm > 0 && + Boolean(indAgent) && + ((indAgent === dealerPerson && dealerRewardSumm > 0) || + (indAgent === dealerBroker && dealerBrokerRewardSumm > 0) || + (indAgent === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || + (indAgent === calcBroker && calcBrokerRewardSum > 0) || + (indAgent === calcFinDepartment && finDepartmentRewardSumm > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectIndAgent'], + }); + } + + if ( + calcDoubleAgentRewardSumm > 0 && + Boolean(calcDoubleAgent) && + ((calcDoubleAgent === dealerPerson && dealerRewardSumm > 0) || + (calcDoubleAgent === dealerBroker && dealerBrokerRewardSumm > 0) || + (calcDoubleAgent === indAgent && indAgentRewardSumm > 0) || + (calcDoubleAgent === calcBroker && calcBrokerRewardSum > 0) || + (calcDoubleAgent === calcFinDepartment && finDepartmentRewardSumm > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectCalcDoubleAgent'], + }); + } + + if ( + calcBrokerRewardSum > 0 && + Boolean(calcBroker) && + ((calcBroker === dealerPerson && dealerRewardSumm > 0) || + (calcBroker === dealerBroker && dealerBrokerRewardSumm > 0) || + (calcBroker === indAgent && indAgentRewardSumm > 0) || + (calcBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || + (calcBroker === calcFinDepartment && finDepartmentRewardSumm > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectCalcBroker'], + }); + } + + if ( + finDepartmentRewardSumm > 0 && + Boolean(calcFinDepartment) && + ((calcFinDepartment === dealerPerson && dealerRewardSumm > 0) || + (calcFinDepartment === dealerBroker && dealerBrokerRewardSumm > 0) || + (calcFinDepartment === indAgent && indAgentRewardSumm > 0) || + (calcFinDepartment === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) || + (calcFinDepartment === calcBroker && calcBrokerRewardSum > 0)) + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: ERR_DOUBLE_REWARD, + path: ['selectCalcFinDepartment'], + }); + } + + /** + * В валидацию на кнопку Рассчитать внести изменение: + * 1) поле selectDealerPerson убрать из списка обязательных для расчета полей + * 2) добавить валидацию на поле selectDealerPerson : + * Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null) + * и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой, + * иначе все ок + */ + if (dealerId) { + const { + data: { dealer }, + } = await apolloClient.query({ + query: CRMTypes.GetDealerDocument, + variables: { + dealerId, + }, + }); + + if (!dealerPerson && !dealer?.evo_return_leasing_dealer) + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Не заполнено поле', + path: ['selectDealerPerson'], + }); + } + + const { validateRewardSum } = helper({ ...context, ctx }); + + await validateRewardSum({ + agentid: dealerPerson, + conditionId: dealerRewardCondition, + sum: dealerRewardSumm, + sumFieldName: 'tbxDealerRewardSumm', + }); + + await validateRewardSum({ + agentid: dealerBroker, + conditionId: dealerBrokerRewardCondition, + sum: dealerBrokerRewardSumm, + sumFieldName: 'tbxDealerBrokerRewardSumm', + }); + + await validateRewardSum({ + agentid: indAgent, + conditionId: indAgentRewardCondition, + sum: indAgentRewardSumm, + sumFieldName: 'tbxIndAgentRewardSumm', + }); + + await validateRewardSum({ + agentid: calcDoubleAgent, + conditionId: calcDoubleAgentRewardCondition, + sum: calcDoubleAgentRewardSumm, + sumFieldName: 'tbxCalcDoubleAgentRewardSumm', + }); + + await validateRewardSum({ + agentid: calcBroker, + conditionId: calcBrokerRewardCondition, + sum: calcBrokerRewardSum, + sumFieldName: 'tbxCalcBrokerRewardSum', + }); + + await validateRewardSum({ + agentid: calcFinDepartment, + conditionId: finDepartmentRewardCondtion, + sum: finDepartmentRewardSumm, + sumFieldName: 'tbxFinDepartmentRewardSumm', + }); + }); +}