2023-03-16 15:35:44 +03:00

96 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { ProcessContext } from '../../types';
import helper from '../lib/helper';
import * as CRMTypes from '@/graphql/crm.types';
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import { reaction } from 'mobx';
import { makeDisposable } 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 и закрыто для редактирования
*/
makeDisposable(
() =>
reaction(
() => $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,
}
),
() => $process.has('LoadKP')
);
/**
* если в Продукте 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 ? saleBonus / maxBonus : 0);
} else {
$calculation.element('tbxBonusCoefficient').resetValue();
}
}
);
}