/* eslint-disable @typescript-eslint/naming-convention */ import type { ApolloClient } from '@apollo/client'; import { gql } from '@apollo/client'; import type * as Values from 'Components/Calculation/config/map/values'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import type * as CRMTypes from 'graphql/crm.types'; import { reaction } from 'mobx'; import type RootStore from 'stores/root'; import ValidationHelper from 'stores/validation/helper'; import { normalizeOptions } from 'tools/entity'; import { makeDisposable } from 'tools/mobx'; dayjs.extend(utc); const QUERY_GET_REWARD_CONDITIONS = gql` query GetRewardConditions($agentid: Uuid!, $currentDate: DateTime) { evo_reward_conditions( evo_agent_accountid: $agentid evo_datefrom_param: { lte: $currentDate } evo_dateto_param: { gte: $currentDate } statecode: 0 evo_agency_agreementid_param: { has: true } ) { label: evo_name value: evo_reward_conditionid evo_reward_summ } } `; export function fillAgentRewardReaction( store: RootStore, apolloClient: ApolloClient, agentParams: { agentField: Values.Elements; rewardConditionField: Values.Elements; } ) { const { $calculation, $process } = store; const { agentField, rewardConditionField } = agentParams; reaction( () => $calculation.element(agentField).getValue(), async (agentId) => { if (!agentId) { $calculation.element(rewardConditionField).reset(); return; } const { data: { evo_reward_conditions }, } = await apolloClient.query< CRMTypes.GetRewardConditionsQuery, CRMTypes.GetRewardConditionsQueryVariables >({ query: QUERY_GET_REWARD_CONDITIONS, variables: { agentid: agentId, currentDate: dayjs().toISOString(), }, }); if (evo_reward_conditions?.length) { $calculation .element(rewardConditionField) .setOptions(normalizeOptions(evo_reward_conditions)); } } ); } const QUERY_GET_REWARD_SUMM = gql` query GetRewardSumm($conditionId: Uuid!) { evo_reward_condition(evo_reward_conditionid: $conditionId) { evo_reward_summ } } `; export function fillAgentRewardSummReaction( store: RootStore, apolloClient: ApolloClient, agentParams: { rewardConditionField: Values.Elements; rewardSummField: Values.Elements; } ) { const { $calculation, $process } = store; const { rewardConditionField, rewardSummField } = agentParams; makeDisposable( () => reaction( () => $calculation.element(rewardConditionField).getValue(), async (rewardConditionId) => { if (!rewardConditionId) { $calculation.element(rewardSummField).reset(); return; } const { data: { evo_reward_condition }, } = await apolloClient.query< CRMTypes.GetRewardSummQuery, CRMTypes.GetRewardSummQueryVariables >({ query: QUERY_GET_REWARD_SUMM, variables: { conditionId: rewardConditionId, }, }); $calculation.element(rewardSummField).setValue(evo_reward_condition?.evo_reward_summ); } ), () => $process.has('LoadKP') ); reaction( () => $calculation.element(rewardConditionField).getValue(), (rewardConditionId) => { if (!rewardConditionId) { $calculation.element(rewardSummField).block(); } else { $calculation.element(rewardSummField).unblock(); } } ); } const QUERY_GET_REWARD_CONDITION = gql` query GetRewardCondition($conditionId: Uuid!) { evo_reward_condition(evo_reward_conditionid: $conditionId) { evo_reward_summ evo_reduce_reward evo_min_reward_summ } } `; export function validateAgentRewardSumm( store: RootStore, apolloClient: ApolloClient, agentParams: { rewardConditionField: Values.Elements; rewardSummField: Values.Elements; } ) { const { $calculation } = store; const { rewardConditionField, rewardSummField } = agentParams; const validationHelper = new ValidationHelper(); reaction( () => $calculation.element(rewardSummField).getValue() as number, 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: QUERY_GET_REWARD_CONDITION, variables: { conditionId, }, }); $calculation .element(rewardSummField) .validate({ invalid: evo_reward_condition?.evo_reward_summ && rewardSumm > evo_reward_condition.evo_reward_summ, message: 'Вознаграждение указано больше условия по агентскому договору!', }) .err((removeError) => { validationHelper.add(removeError); }); $calculation .element(rewardSummField) .validate({ invalid: !evo_reward_condition?.evo_reduce_reward && evo_reward_condition?.evo_reward_summ && rewardSumm < evo_reward_condition.evo_reward_summ, message: 'Вознаграждение указано меньше условия по агентскому договору!', }) .err((removeError) => { validationHelper.add(removeError); }); $calculation .element(rewardSummField) .validate({ invalid: evo_reward_condition?.evo_min_reward_summ && rewardSumm < evo_reward_condition?.evo_min_reward_summ, message: 'Вознаграждение указано меньше условия по агентскому договору!', }) .err((removeError) => { validationHelper.add(removeError); }); } ); }