/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable sonarjs/no-identical-functions */ import * as createReactions from '../lib/create-reactions'; import * as fillAgentsFromLead from '../lib/fill-agents-from-lead'; 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 { makeDisposable } from 'tools/mobx'; const { fillIndAgent, fillCalcBroker, fillCalcDoubleAgent, fillFinDepartment } = fillAgentsFromLead; const { fillAgentRewardReaction, fillAgentRewardSummReaction, validateAgentRewardSumm } = createReactions; dayjs.extend(utc); class Helper { public enabled: boolean; /** * */ constructor() { this.enabled = false; } public set = (value: boolean) => { this.enabled = value; }; } export function common({ store, apolloClient }: ProcessContext) { const { $calculation, $process } = store; /** * Заполняем агентов из Интереса */ makeDisposable( () => reaction( () => $calculation.element('selectLead').getValue(), (leadid) => { fillIndAgent(store, apolloClient, leadid); fillCalcDoubleAgent(store, apolloClient, leadid); fillCalcBroker(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } ), () => $process.has('LoadKP') ); /** * IndAgent */ // Заполняем selectIndAgentRewardCondition fillAgentRewardReaction(store, apolloClient, { agentField: 'selectIndAgent', rewardConditionField: 'selectIndAgentRewardCondition', }); // Заполняем tbxIndAgentRewardSumm fillAgentRewardSummReaction(store, apolloClient, { rewardConditionField: 'selectIndAgentRewardCondition', rewardSummField: 'tbxIndAgentRewardSumm', }); /** * CalcDoubleAgent */ // Заполняем selectCalcDoubleAgentRewardCondition fillAgentRewardReaction(store, apolloClient, { agentField: 'selectCalcDoubleAgent', rewardConditionField: 'selectCalcDoubleAgentRewardCondition', }); // Заполняем tbxCalcDoubleAgentRewardSumm fillAgentRewardSummReaction(store, apolloClient, { rewardConditionField: 'selectCalcDoubleAgentRewardCondition', rewardSummField: 'tbxCalcDoubleAgentRewardSumm', }); /** * CalcBroker */ // Заполняем selectCalcBrokerRewardCondition fillAgentRewardReaction(store, apolloClient, { agentField: 'selectCalcBroker', rewardConditionField: 'selectCalcBrokerRewardCondition', }); // Заполняем tbxCalcBrokerRewardSum fillAgentRewardSummReaction(store, apolloClient, { rewardConditionField: 'selectCalcBrokerRewardCondition', rewardSummField: 'tbxCalcBrokerRewardSum', }); /** * CalcFinDepartment */ // Заполняем selectFinDepartmentRewardCondtion fillAgentRewardReaction(store, apolloClient, { agentField: 'selectCalcFinDepartment', rewardConditionField: 'selectFinDepartmentRewardCondtion', }); // Заполняем tbxCalcBrokerRewardSum fillAgentRewardSummReaction(store, apolloClient, { rewardConditionField: 'selectFinDepartmentRewardCondtion', rewardSummField: 'tbxFinDepartmentRewardSumm', }); /** * Добавить реакцию на изменение списка в поле selectDealerRewardCondition : * Если в списке selectDealerRewardCondition есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerBroker * selectIndAgent * selectCalcDoubleAgent * selectCalcBroker * selectFinDepartment */ { const helper = new Helper(); reaction( () => $calculation.element('selectDealerRewardCondition').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillIndAgent(store, apolloClient, leadid); fillCalcDoubleAgent(store, apolloClient, leadid); fillCalcBroker(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerBroker').resetValue(); $calculation.element('selectIndAgent').reset(); $calculation.element('selectCalcDoubleAgent').reset(); $calculation.element('selectCalcBroker').reset(); $calculation.element('selectCalcFinDepartment').reset(); } else { helper.set(false); fillAgents(); } } ); } /** * Добавить реакцию на изменение списка в поле selectDealerBrokerRewardCondition : * * Если в списке selectDealerBrokerRewardCondition есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerPerson (не обнуляем) * selectIndAgent * selectCalcDoubleAgent * selectCalcBroker * selectFinDepartment * иначе * * selectDealerPerson открываем для редактирования * selectIndAgent заполняется значением из Интереса * selectCalcDoubleAgent заполняется значением из Интереса * selectCalcBrokerRewardCondition заполняется значением из Интереса * selectFinDepartmentRewardCondtion заполняется значением из Интереса */ { const helper = new Helper(); reaction( () => $calculation.element('selectDealerBrokerRewardCondition').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillIndAgent(store, apolloClient, leadid); fillCalcDoubleAgent(store, apolloClient, leadid); fillCalcBroker(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerPerson').block(); $calculation.element('selectIndAgent').reset(); $calculation.element('selectCalcDoubleAgent').reset(); $calculation.element('selectCalcBroker').reset(); $calculation.element('selectCalcFinDepartment').reset(); } else { helper.set(false); $calculation.element('selectDealerPerson').unblock(); fillAgents(); } } ); } /** * Добавить реакцию на изменение списка в поле selectIndAgentRewardCondition : * * Если в списке selectIndAgentRewardCondition есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerPerson (не обнуляем) * selectDealerBroker * selectCalcDoubleAgent * selectCalcBroker * selectFinDepartment * иначе * * selectDealerPerson открываем для редактирования * selectDealerBroker открываем для редактирования * selectCalcDoubleAgent заполняется значением из Интереса * selectCalcBroker заполняется значением из Интереса * selectCalcFinDepartment заполняется значением из Интереса */ { const helper = new Helper(); reaction( () => $calculation.element('selectIndAgentRewardCondition').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillCalcDoubleAgent(store, apolloClient, leadid); fillCalcBroker(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerPerson').block(); $calculation.element('selectDealerBroker').resetValue(); $calculation.element('selectCalcDoubleAgent').reset(); $calculation.element('selectCalcBroker').reset(); $calculation.element('selectCalcFinDepartment').reset(); } else { helper.set(false); $calculation.element('selectDealerPerson').unblock(); fillAgents(); } } ); } /** * Добавить реакцию на изменение списка в поле selectCalcDoubleAgentRewardCondition : * * Если в списке selectCalcDoubleAgentRewardCondition есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerPerson (не обнуляем) * selectDealerBroker * selectIndAgent * selectCalcBroker * selectCalcFinDepartment * иначе * * selectDealerPerson открываем для редактирования * selectDealerBroker открываем для редактирования * selectIndAgent заполняется значением из Интереса * selectCalcBroker заполняется значением из Интереса * selectCalcFinDepartment заполняется значением из Интереса */ { const helper = new Helper(); reaction( () => $calculation.element('selectCalcDoubleAgentRewardCondition').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillIndAgent(store, apolloClient, leadid); fillCalcBroker(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerPerson').block(); $calculation.element('selectDealerBroker').resetValue(); $calculation.element('selectIndAgent').reset(); $calculation.element('selectCalcBroker').reset(); $calculation.element('selectCalcFinDepartment').reset(); } else { helper.set(false); $calculation.element('selectDealerPerson').unblock(); $calculation.element('selectDealerBroker').unblock(); fillAgents(); } } ); } /** * @description * Добавить реакцию на изменение списка в поле selectCalcBrokerRewardCondition: * * Если в списке selectCalcBrokerRewardCondition есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerPerson (не обнуляем) * selectDealerBroker * selectIndAgent * selectCalcDoubleAgent * selectCalcFinDepartment * иначе * * selectDealerPerson открываем для редактирования * selectDealerBroker открываем для редактирования * selectIndAgent заполняется значением из Интереса * selectCalcDoubleAgent заполняется значением из Интереса * selectCalcFinDepartment заполняется значением из Интереса */ { const helper = new Helper(); reaction( () => $calculation.element('selectCalcBrokerRewardCondition').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillIndAgent(store, apolloClient, leadid); fillCalcDoubleAgent(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerPerson').block(); $calculation.element('selectDealerBroker').resetValue(); $calculation.element('selectIndAgent').reset(); $calculation.element('selectCalcDoubleAgent').reset(); $calculation.element('selectCalcFinDepartment').reset(); } else { helper.set(false); $calculation.element('selectDealerPerson').unblock(); $calculation.element('selectDealerBroker').unblock(); fillAgents(); } } ); } /** * Добавить реакцию на изменение списка в поле selectFinDepartmentRewardCondtion: * * Если в списке selectFinDepartmentRewardCondtion есть запись, * у которой evo_reward_condition.evo_agency_agreementid. * Выплата без других агентов (evo_reward_without_other_agent) = True, * то сбрасывают значение и закрываются для выбора поля: * * selectDealerPerson (не обнуляем) * selectDealerBroker * selectIndAgent * selectCalcDoubleAgent * selectCalcBroker * иначе * * selectDealerPerson открываем для редактирования * selectDealerBroker открываем для редактирования * selectIndAgent заполняется значением из Интереса * selectCalcDoubleAgent заполняется значением из Интереса * selectCalcBroker заполняется значением из Интереса */ { const helper = new Helper(); reaction( () => $calculation.element('selectFinDepartmentRewardCondtion').getValue(), async (rewardConditionId) => { function fillAgents() { const leadid = $calculation.element('selectLead').getValue(); fillIndAgent(store, apolloClient, leadid); fillCalcDoubleAgent(store, apolloClient, leadid); fillFinDepartment(store, apolloClient, leadid); } if (!rewardConditionId) { if (helper.enabled === true) { helper.set(false); fillAgents(); } return; } const { data: { evo_reward_condition }, } = await apolloClient.query({ query: CRMTypes.GetRewardConditionDocument, variables: { conditionId: rewardConditionId, }, }); if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { helper.set(true); $calculation.element('selectDealerPerson').block(); $calculation.element('selectDealerBroker').resetValue(); $calculation.element('selectIndAgent').reset(); $calculation.element('selectCalcDoubleAgent').reset(); $calculation.element('selectCalcBroker').reset(); } else { helper.set(false); $calculation.element('selectDealerPerson').unblock(); $calculation.element('selectDealerBroker').unblock(); fillAgents(); } } ); } } 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, }); }); }