import * as CRMTypes from '@/graphql/crm.types'; import type { ProcessContext } from '@/process/types'; import { normalizeOptions } from '@/utils/entity'; import { disposableReaction } from '@/utils/mobx'; import { reaction } from 'mobx'; export default function reactions({ store, apolloClient }: ProcessContext) { const { $calculation, $process } = store; /** * Если lead содержит данные, то в opportunity подгружается значение из поля Интереса * Лизинговая сделка (lead.evo_opportunityid → opportunity), * и в списке для выбора только эта ЛС указывается * Иначе ничего не указывается */ disposableReaction( () => $process.has('LoadKP'), () => $calculation.element('selectLead').getValue(), async (leadid) => { if (!leadid) { $calculation.element('selectOpportunity').resetValue(); return; } const { data: { lead }, } = await apolloClient.query({ query: CRMTypes.GetLeadDocument, variables: { leadid, }, }); if (lead?.evo_opportunityidData?.value) { $calculation.element('selectOpportunity').setValue(lead?.evo_opportunityidData?.value); } else { $calculation.element('selectOpportunity').resetValue(); } } ); reaction( () => $calculation.element('selectOpportunity').getValue(), async (opportunityid) => { const leadid = $calculation.element('selectLead').getValue(); if (leadid) { const { data: { lead }, } = await apolloClient.query({ query: CRMTypes.GetLeadDocument, variables: { leadid, }, }); if (!opportunityid && lead?.evo_opportunityidData?.value) { $calculation.element('selectLead').resetValue(); } } if (opportunityid) { const { data: { opportunity }, } = await apolloClient.query({ query: CRMTypes.GetOpportunityDocument, variables: { opportunityid, }, }); if (opportunity?.evo_leadid) { $calculation.element('selectLead').setValue(opportunity.evo_leadid); } else { $calculation.element('selectLead').resetValue(); } } } ); /** * Если lead содержит данные, * То в quote подгружается список Предложений CRM (сущность quote), * у которых в поле Интерес (quote.evo_leadid) записана ссылка на выбранный интерес. * Иначе очищать поле калькулятора quote. */ reaction( () => $calculation.$values.getValues(['recalcWithRevision', 'lead']), async ({ lead: leadid, recalcWithRevision }) => { if (leadid) { const { data: { quotes }, } = await apolloClient.query({ fetchPolicy: 'network-only', query: CRMTypes.GetQuotesDocument, variables: { leadid, }, }); if (recalcWithRevision) { const filteredQuotes = quotes?.filter( (quote) => quote?.evo_recalc_limit && quote.evo_recalc_limit > 0 && quote.evo_statuscodeidData?.evo_id === '2.3' && !quote.evo_purchases_participation ); $calculation.element('selectQuote').setOptions(normalizeOptions(filteredQuotes)); } else { $calculation.element('selectQuote').setOptions(normalizeOptions(quotes)); } } else { $calculation.element('selectQuote').reset(); } } ); }