From d6db50a5824c53780f7f7b3f2c8bef39ce4178e6 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Wed, 18 Jan 2023 15:44:15 +0300 Subject: [PATCH] merge migration/fix/agents --- apps/web/process/payments/validation.ts | 17 +- .../supplier-agent/lib/create-reactions.ts | 54 +- apps/web/process/supplier-agent/lib/query.ts | 9 +- .../supplier-agent/reactions/agents.ts | 696 ++++++++++++------ .../supplier-agent/reactions/leaseback.ts | 56 +- .../supplier-agent/reactions/supplier.ts | 27 +- apps/web/stores/calculation/options/types.ts | 2 +- 7 files changed, 579 insertions(+), 282 deletions(-) diff --git a/apps/web/process/payments/validation.ts b/apps/web/process/payments/validation.ts index d84231b..00b2d34 100644 --- a/apps/web/process/payments/validation.ts +++ b/apps/web/process/payments/validation.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ /* eslint-disable no-case-declarations */ import { counting, max, min, shift, sort } from 'radash'; @@ -9,12 +8,13 @@ import { SEASONS_PERIODS, SEASONS_PERIOD_NUMBER } from './lib/seasons-constants' export default function validatePaymentsTable({ $calculation, $tables }: RootStore) { switch ($calculation.element('radioGraphType').getValue()) { // Дегрессия - case 100_000_001: + case 100_000_001: { if (!$calculation.element('selectSeasonType').getValue()) { return 'Не выбран тип дегрессии'; } /** - * в таблице платежей в столбце Соотношение платежей для строк с 2 до "Срок лизинга-1" минимальное значение должно быть равно 3 + * в таблице платежей в столбце Соотношение платежей + * для строк с 2 до "Срок лизинга-1" минимальное значение должно быть равно 3 */ { const MIN_PAYMENT = 3; @@ -27,7 +27,8 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto } /** - * при Дегрессии все значения не должны быть равны друг другу + что при Легком старте 2,3 и 4 платежи не должны быть равны 100 + * при Дегрессии все значения не должны быть равны друг другу + * + что при Легком старте 2,3 и 4 платежи не должны быть равны 100 */ { const leasingPeriod = $calculation.element('tbxLeasingPeriod').getValue(); @@ -51,6 +52,7 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto } } } + /* eslint-disable max-len */ /** * Если вид графика = Дегрессия И значения в "Соотношении платежей" у 2, 3 и 4 платежа отличаются друг от друга не более чем на 10 * (т.е. берем значения в этих полях, определяем максимальное и минимальное значение и смотрим на их разницу) @@ -58,6 +60,7 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto * На 2-4 платежах Соотношение платежа должен отличаться не более чем на 10%", * иначе осуществлять расчет */ + /* eslint-enable */ { const targetPayments = $tables.payments.values.slice(1, 4); @@ -66,12 +69,14 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto } } + /* eslint-disable max-len */ /** * Если вид графика = Дегрессия И значения в "Соотношении платежей" для строк с 2 До "Срок лизинга-1" как минимум 2 раза по 2 платежа должны между собой быть равны * (т.е. берем значения "Соотношения платежей" для строк с 2 до "Срок лизинга-1" и делаем сводную таблицу - если кол-во одинаковых значение больше 2 встречаются 2 и более раза), * то осуществлять расчет, * иначе не осуществлять Расчет графика и выводить ошибку "Нельзя осуществить расчет - указана очень жетская дегрессия. Не менее чем у 4х платежей "Соотношение платежа" должно не отличаться между самой", */ + /* eslint-enable */ { const leasingPeriod = $calculation.element('tbxLeasingPeriod').getValue(); const targetPayments = $tables.payments.values.slice(1, leasingPeriod - 1); @@ -82,6 +87,7 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto } break; + } case 100_000_003: { const leasingPeriod = $calculation.element('tbxLeasingPeriod').getValue(); @@ -127,8 +133,9 @@ export default function validatePaymentsTable({ $calculation, $tables }: RootSto break; } - default: + default: { return null; + } } return null; diff --git a/apps/web/process/supplier-agent/lib/create-reactions.ts b/apps/web/process/supplier-agent/lib/create-reactions.ts index 281676b..ad72e5e 100644 --- a/apps/web/process/supplier-agent/lib/create-reactions.ts +++ b/apps/web/process/supplier-agent/lib/create-reactions.ts @@ -4,7 +4,7 @@ import { gql } from '@apollo/client'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import type * as CRMTypes from 'graphql/crm.types'; -import { reaction } from 'mobx'; +import { autorun, reaction } from 'mobx'; import type RootStore from 'stores/root'; import ValidationHelper from 'stores/validation/helper'; import { normalizeOptions } from 'tools/entity'; @@ -65,6 +65,8 @@ export function fillAgentRewardReaction( $calculation .element(rewardConditionField) .setOptions(normalizeOptions(evo_reward_conditions)); + } else { + $calculation.element(rewardConditionField).reset(); } } ); @@ -125,10 +127,10 @@ export function fillAgentRewardSummReaction( reaction( () => $calculation.element(rewardConditionField).getValue(), (rewardConditionId) => { - if (!rewardConditionId) { - $calculation.element(rewardSummField).block(); - } else { + if (rewardConditionId) { $calculation.element(rewardSummField).unblock(); + } else { + $calculation.element(rewardSummField).block(); } } ); @@ -228,18 +230,38 @@ export function validateAgentRewardSumm( validationHelper.add(removeError); }); } - - $calculation - .element(rewardSummField) - .validate({ - invalid: - evo_reward_condition?.evo_agency_agreementidData?.evo_required_reward === true && - rewardSumm === 0, - message: 'Согласно агентскому договору обязательна выплата АВ. Заложите АВ в расчет', - }) - .err((removeError) => { - validationHelper.add(removeError); - }); } ); + + 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: QUERY_GET_REWARD_CONDITION, + 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/query.ts b/apps/web/process/supplier-agent/lib/query.ts index 79482d8..e487114 100644 --- a/apps/web/process/supplier-agent/lib/query.ts +++ b/apps/web/process/supplier-agent/lib/query.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/prefer-default-export */ import { gql } from '@apollo/client'; export const QUERY_GET_AGENT = gql` @@ -9,3 +8,11 @@ export const QUERY_GET_AGENT = gql` } } `; + +export const QUERY_GET_DEALER_RETURN_LEASING = gql` + query GetDealerReturnLeasing($dealerId: Uuid!) { + dealer: account(accountid: $dealerId) { + evo_return_leasing_dealer + } + } +`; diff --git a/apps/web/process/supplier-agent/reactions/agents.ts b/apps/web/process/supplier-agent/reactions/agents.ts index b000f47..77c082d 100644 --- a/apps/web/process/supplier-agent/reactions/agents.ts +++ b/apps/web/process/supplier-agent/reactions/agents.ts @@ -3,7 +3,7 @@ import { gql } from '@apollo/client'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import type * as CRMTypes from 'graphql/crm.types'; -import { reaction } from 'mobx'; +import { autorun, reaction } from 'mobx'; import type { ReactionsContext } from 'process/types'; import { makeDisposable } from 'tools/mobx'; import * as createReactions from '../lib/create-reactions'; @@ -92,6 +92,20 @@ export function fillReactions({ store, apolloClient }: ReactionsContext) { }); } +class Helper { + enabled: boolean; + /** + * + */ + constructor() { + this.enabled = false; + } + + set = (value: boolean) => { + this.enabled = value; + }; +} + export function commonReactions({ store, apolloClient }: ReactionsContext) { const { $calculation } = store; @@ -119,47 +133,56 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectFinDepartment */ - reaction( - () => $calculation.element('selectDealerRewardCondition').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectDealerRewardCondition').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerBroker').reset(); - $calculation.element('selectIndAgent').reset(); - $calculation.element('selectCalcDoubleAgent').reset(); - $calculation.element('selectCalcBroker').reset(); - $calculation.element('selectCalcFinDepartment').reset(); - } else { - fillAgents(); - } - } - ); - + ); + } /** * Добавить реакцию на изменение списка в поле selectDealerBrokerRewardCondition : @@ -181,48 +204,58 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectCalcBrokerRewardCondition заполняется значением из Интереса selectFinDepartmentRewardCondtion заполняется значением из Интереса */ - reaction( - () => $calculation.element('selectDealerBrokerRewardCondition').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectDealerBrokerRewardCondition').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerPerson').block(); - $calculation.element('selectIndAgent').reset(); - $calculation.element('selectCalcDoubleAgent').reset(); - $calculation.element('selectCalcBroker').reset(); - $calculation.element('selectCalcFinDepartment').reset(); - } else { - $calculation.element('selectDealerPerson').unblock(); - fillAgents(); - } - } - ); - + ); + } /** * Добавить реакцию на изменение списка в поле selectIndAgentRewardCondition : @@ -245,46 +278,56 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectCalcFinDepartment заполняется значением из Интереса */ - reaction( - () => $calculation.element('selectIndAgentRewardCondition').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectIndAgentRewardCondition').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerPerson').block(); - $calculation.element('selectDealerBroker').reset(); - $calculation.element('selectCalcDoubleAgent').reset(); - $calculation.element('selectCalcBroker').reset(); - $calculation.element('selectCalcFinDepartment').reset(); - } else { - $calculation.element('selectDealerPerson').unblock(); - fillAgents(); - } - } - ); + ); + } /** * Добавить реакцию на изменение списка в поле selectCalcDoubleAgentRewardCondition : @@ -308,48 +351,57 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectCalcFinDepartment заполняется значением из Интереса */ - reaction( - () => $calculation.element('selectCalcDoubleAgentRewardCondition').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectCalcDoubleAgentRewardCondition').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcBroker(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerPerson').block(); - $calculation.element('selectDealerBroker').reset(); - $calculation.element('selectIndAgent').reset(); - $calculation.element('selectCalcBroker').reset(); - $calculation.element('selectCalcFinDepartment').reset(); - } else { - $calculation.element('selectDealerPerson').unblock(); - $calculation.element('selectDealerBroker').unblock(); - fillAgents(); - } - } - ); - + ); + } /** * @description * Добавить реакцию на изменение списка в поле selectCalcBrokerRewardCondition: @@ -372,47 +424,57 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectCalcDoubleAgent заполняется значением из Интереса selectCalcFinDepartment заполняется значением из Интереса */ - reaction( - () => $calculation.element('selectCalcBrokerRewardCondition').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectCalcBrokerRewardCondition').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerPerson').block(); - $calculation.element('selectDealerBroker').reset(); - $calculation.element('selectIndAgent').reset(); - $calculation.element('selectCalcDoubleAgent').reset(); - $calculation.element('selectCalcFinDepartment').reset(); - } else { - $calculation.element('selectDealerPerson').unblock(); - $calculation.element('selectDealerBroker').unblock(); - fillAgents(); - } - } - ); + ); + } /** * Добавить реакцию на изменение списка в поле selectFinDepartmentRewardCondtion: @@ -436,50 +498,61 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { selectCalcBroker заполняется значением из Интереса */ - reaction( - () => $calculation.element('selectFinDepartmentRewardCondtion').getValue(), - async (rewardConditionId) => { - function fillAgents() { - const leadid = $calculation.element('selectLead').getValue(); - fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); - fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + { + const helper = new Helper(); + reaction( + () => $calculation.element('selectFinDepartmentRewardCondtion').getValue(), + async (rewardConditionId) => { + function fillAgents() { + const leadid = $calculation.element('selectLead').getValue(); + fillAgentsFromLead.fillIndAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillCalcDoubleAgent(store, apolloClient, leadid); + fillAgentsFromLead.fillFinDepartment(store, apolloClient, leadid); + } + + if (!rewardConditionId) { + if (helper.enabled === true) { + helper.set(false); + fillAgents(); + } + + return; + } + const { + data: { evo_reward_condition }, + } = await apolloClient.query< + CRMTypes.GetRewardWithoutOtherAgentQuery, + CRMTypes.GetRewardWithoutOtherAgentQueryVariables + >({ + query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, + 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(); + } } - - if (!rewardConditionId) { - fillAgents(); - - return; - } - - const { - data: { evo_reward_condition }, - } = await apolloClient.query< - CRMTypes.GetRewardWithoutOtherAgentQuery, - CRMTypes.GetRewardWithoutOtherAgentQueryVariables - >({ - query: QUERY_GET_REWARD_WITHOUT_OTHER_AGENT, - variables: { - conditionId: rewardConditionId, - }, - }); - - if (evo_reward_condition?.evo_agency_agreementidData?.evo_reward_without_other_agent) { - $calculation.element('selectDealerPerson').block(); - $calculation.element('selectDealerBroker').reset(); - $calculation.element('selectIndAgent').reset(); - $calculation.element('selectCalcDoubleAgent').reset(); - $calculation.element('selectCalcBroker').reset(); - } else { - $calculation.element('selectDealerPerson').unblock(); - $calculation.element('selectDealerBroker').unblock(); - fillAgents(); - } - } - ); + ); + } } export function validationReactions({ store, apolloClient }: ReactionsContext) { + const { $calculation } = store; + createReactions.validateAgentRewardSumm(store, apolloClient, { rewardConditionField: 'selectIndAgentRewardCondition', rewardSummField: 'tbxIndAgentRewardSumm', @@ -499,4 +572,143 @@ export function validationReactions({ store, apolloClient }: ReactionsContext) { rewardConditionField: 'selectFinDepartmentRewardCondtion', rewardSummField: 'tbxFinDepartmentRewardSumm', }); + + /* eslint-disable max-len */ + /** * Добавить валидацию на кнопку Рассчитать: + если tbxDealerRewardSumm > 0 и + если selectDealerPerson = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectDealerPerson + если selectDealerPerson = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerPerson + // eslint-disable-next-line max-len + если 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-enable */ + + 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 && + !!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 && + !!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 && + !!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 && + !!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 && + !!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 && + !!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/leaseback.ts b/apps/web/process/supplier-agent/reactions/leaseback.ts index fb644f9..b9dd393 100644 --- a/apps/web/process/supplier-agent/reactions/leaseback.ts +++ b/apps/web/process/supplier-agent/reactions/leaseback.ts @@ -1,7 +1,7 @@ -import { gql } from '@apollo/client'; import type * as CRMTypes from 'graphql/crm.types'; -import { reaction } from 'mobx'; +import { autorun, reaction } from 'mobx'; import type { ReactionsContext } from 'process/types'; +import * as query from '../lib/query'; export default function leasebackReactions({ store, apolloClient }: ReactionsContext) { const { $calculation, $tables } = store; @@ -20,14 +20,6 @@ export default function leasebackReactions({ store, apolloClient }: ReactionsCon 3) ПЛ БУ cbxLeaseObjectUsed = true */ - const QUERY_GET_DEALER_RETURN_LEASING = gql` - query GetDealerReturnLeasing($dealerId: Uuid!) { - dealer: account(accountid: $dealerId) { - evo_return_leasing_dealer - } - } - `; - reaction( () => $calculation.element('selectDealer').getValue(), async (dealerId) => { @@ -39,16 +31,18 @@ export default function leasebackReactions({ store, apolloClient }: ReactionsCon CRMTypes.GetDealerReturnLeasingQuery, CRMTypes.GetDealerReturnLeasingQueryVariables >({ - query: QUERY_GET_DEALER_RETURN_LEASING, + query: query.QUERY_GET_DEALER_RETURN_LEASING, variables: { dealerId, }, }); if (dealer?.evo_return_leasing_dealer === true) { + $calculation.element('selectDealerPerson').block().resetValue(); $tables.insurance.row('kasko').setValue('insured', 100_000_000).block('insured'); $calculation.element('cbxLeaseObjectUsed').setValue(true); } else { + $calculation.element('selectDealerPerson').unblock(); $tables.insurance.row('kasko').resetStatus('insured'); } } @@ -71,7 +65,7 @@ export default function leasebackReactions({ store, apolloClient }: ReactionsCon CRMTypes.GetDealerReturnLeasingQuery, CRMTypes.GetDealerReturnLeasingQueryVariables >({ - query: QUERY_GET_DEALER_RETURN_LEASING, + query: query.QUERY_GET_DEALER_RETURN_LEASING, variables: { dealerId, }, @@ -86,4 +80,42 @@ export default function leasebackReactions({ store, apolloClient }: ReactionsCon } } ); + + /* eslint-disable max-len */ + /** + * В валидацию на кнопку Рассчитать внести изменение: + 1) поле selectDealerPerson убрать из списка обязательных для расчета полей + 2) добавить валидацию на поле selectDealerPerson : + Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null) + и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой, + иначе все ок + */ + /* eslint-enable */ + + 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< + CRMTypes.GetDealerReturnLeasingQuery, + CRMTypes.GetDealerReturnLeasingQueryVariables + >({ + query: query.QUERY_GET_DEALER_RETURN_LEASING, + variables: { + dealerId, + }, + }); + returnLeasing = dealer?.evo_return_leasing_dealer; + } + + $calculation.element('selectDealerPerson').validate({ + invalid: !!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 435cadb..738fc9f 100644 --- a/apps/web/process/supplier-agent/reactions/supplier.ts +++ b/apps/web/process/supplier-agent/reactions/supplier.ts @@ -38,11 +38,26 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { async (dealerId) => { if (!dealerId) { $calculation.element('selectDealerPerson').reset(); - $calculation.element('selectDealerBroker').reset(); return; } + const { + data: { dealer }, + } = await apolloClient.query< + CRMTypes.GetDealerReturnLeasingQuery, + CRMTypes.GetDealerReturnLeasingQueryVariables + >({ + query: query.QUERY_GET_DEALER_RETURN_LEASING, + variables: { + dealerId, + }, + }); + + if (dealer?.evo_return_leasing_dealer) { + return; + } + const { data: { salon_providers }, } = await apolloClient.query< @@ -91,6 +106,8 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { () => $calculation.element('selectDealerPerson').getValue(), async (dealerPersonId) => { if (!dealerPersonId) { + $calculation.element('selectDealerBroker').reset(); + return; } @@ -163,10 +180,10 @@ export function commonReactions({ store, apolloClient }: ReactionsContext) { ); reaction( - () => $calculation.element('selectDealerBrokerRewardCondition').getValue(), - (dealerBrokerRewardConditionId) => { - if (dealerBrokerRewardConditionId) { - $calculation.element('selectDealerPerson').resetValue(); + () => $calculation.element('selectDealerBroker').getValue(), + (dealerBroker) => { + if (dealerBroker) { + $calculation.element('selectDealerRewardCondition').resetValue(); } } ); diff --git a/apps/web/stores/calculation/options/types.ts b/apps/web/stores/calculation/options/types.ts index c5ffdde..130f1a9 100644 --- a/apps/web/stores/calculation/options/types.ts +++ b/apps/web/stores/calculation/options/types.ts @@ -2,5 +2,5 @@ import type { Elements, ElementsTypes } from 'Components/Calculation/config/map/ import type { BaseOption } from 'ui/elements/types'; export type CalculationOptions = { - [ElementName in Elements]: BaseOption[]; + [ElementName in Elements]: BaseOption>[]; };