import type { ProcessContext } from '../../types'; import helper from '../lib/helper'; import * as CRMTypes from '@/graphql/crm.types'; import { disposableReaction } from '@/utils/mobx'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import { reaction } from 'mobx'; import { round } from 'tools'; dayjs.extend(utc); export default function reactions(context: ProcessContext) { const { store, apolloClient } = context; const { $calculation, $process } = store; const { getCoefficient } = helper(context); /** * При изменении значения необходимо значение поля tbxSaleBonus сравнивать со значением из записи Коэффициент * для расчета evo_coefficient как сейчас + данная запись должна быть связана с Продуктом product * из поля Продукт selectProduct evo_evo_coefficient_evo_baseproduct * Если продукта нет или нет коэффициента по условиям, то поле tbxSaleBonus = 0 и закрыто для редактирования */ disposableReaction( () => $process.has('LoadKP'), () => $calculation.element('selectProduct').getValue(), async (productId) => { if (!productId) { $calculation.element('tbxSaleBonus').resetValue().block(); return; } const coefficient = await getCoefficient(productId); if (!coefficient?.evo_sot_coefficient) { $calculation.element('tbxSaleBonus').resetValue().block(); return; } const maxBonus = (coefficient?.evo_sot_coefficient || 0) * 100; $calculation.element('tbxSaleBonus').setValue(maxBonus).unblock(); }, { fireImmediately: true, } ); /** * если в Продукте evo_cut_proportion_bonus_director " = Да, * то tbxBonusCoefficient = tbxSaleBonus/evo_sot_coefficient, * иначе tbxBonusCoefficient = 1 * где evo_sot_coefficient ищем так: * в справочнике Коэффициент для расчета (evo_coefficient) найти запись, у которой: * * Тип коэффициента (evo_corfficient_type) = СОТ (100 000 002) * Статус (statecode) = активный (0) * Начало действия (evo_datefrom) меньше или равно текущей даты * Окончание действия (evo_dateto) больше или равно текущей даты * Должность (evo_evo_job_title_evo_coefficient_job_titleid) = Должности (evo_job_titleid) текущего пользователя (systemuser) * Тип коэффициента для СОТ (evo_sot_coefficient_typeid) = (evo_sot_coefficient_type.evo_id=BONUS_LEASING) * данная запись должна быть связана с Продуктом product из поля Продукт selectProduct */ reaction( () => $calculation.$values.getValues(['product', 'saleBonus']), async ({ product: productId, saleBonus }) => { if (!productId) { $calculation.element('tbxBonusCoefficient').resetValue(); return; } const { data: { evo_baseproduct }, } = await apolloClient.query({ query: CRMTypes.GetProductDocument, variables: { productId, }, }); if (evo_baseproduct?.evo_cut_proportion_bonus_director) { const coefficient = await getCoefficient(productId); const maxBonus = (coefficient?.evo_sot_coefficient || 0) * 100; $calculation .element('tbxBonusCoefficient') .setValue(maxBonus ? round(saleBonus / maxBonus, 4) : 0); } else { $calculation.element('tbxBonusCoefficient').resetValue(); } } ); }