111 lines
4.1 KiB
TypeScript
111 lines
4.1 KiB
TypeScript
import type { ProcessContext } from '../../types';
|
||
import helper from '../lib/helper';
|
||
import * as CRMTypes from '@/graphql/crm.types';
|
||
import { disposableReaction } from '@/utils/mobx';
|
||
import { reaction } from 'mobx';
|
||
import { round } from 'tools';
|
||
|
||
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();
|
||
|
||
return;
|
||
}
|
||
|
||
const coefficient = await getCoefficient(productId);
|
||
|
||
if (!coefficient?.evo_sot_coefficient) {
|
||
$calculation.element('tbxSaleBonus').resetValue();
|
||
|
||
return;
|
||
}
|
||
|
||
const maxBonus = (coefficient?.evo_sot_coefficient || 0) * 100;
|
||
$calculation.element('tbxSaleBonus').setValue(maxBonus);
|
||
},
|
||
{
|
||
fireImmediately: true,
|
||
}
|
||
);
|
||
|
||
reaction(
|
||
() => $calculation.element('selectProduct').getValue(),
|
||
async (productId) => {
|
||
if (!productId) {
|
||
$calculation.element('tbxSaleBonus').block();
|
||
|
||
return;
|
||
}
|
||
|
||
const coefficient = await getCoefficient(productId);
|
||
|
||
if (coefficient?.evo_sot_coefficient) {
|
||
$calculation.element('tbxSaleBonus').unblock();
|
||
} else {
|
||
$calculation.element('tbxSaleBonus').block();
|
||
}
|
||
}
|
||
);
|
||
|
||
/**
|
||
* если в Продукте 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();
|
||
}
|
||
}
|
||
);
|
||
}
|