113 lines
4.2 KiB
TypeScript
113 lines
4.2 KiB
TypeScript
import * as CRMTypes from '@/graphql/crm.types';
|
||
import type { ProcessContext } from '@/process/types';
|
||
import { queueReaction } from '@/utils/mobx';
|
||
import { comparer } from 'mobx';
|
||
|
||
/**
|
||
* При изменении "Программа от производителя" selectImportProgram , Стоимости ПЛ tbxLeaseObjectPrice, Валюты selectSupplierCurrency, Скидка от поставщика, в валюте поставщика (tbxSupplierDiscountRub)
|
||
* необходимо заполнять поле "Скидка от производителя, руб., с НДС" labelImportProgramSum:
|
||
* если поле selectImportProgram содержит данные,
|
||
* то
|
||
* если
|
||
* поле "Сумма субсидии с НДС" evo_subsidy.evo_subsidy_summ из selectImportProgram > 0,
|
||
* то указывает данное значение в поле labelImportProgramSum,
|
||
* иначе:
|
||
* 1)labelImportProgramSum = ( (Стоимость ПЛ tbxLeaseObjectPrice ), переведенные в рубли - Скидка от поставщика, в валюте поставщика (tbxSupplierDiscountRub))* "% субсидии от стоимости ПЛ" evo_subsidy.evo_percent_subsidy из selectImportProgram / 100.
|
||
* 2) Если полученное значение больше значения в поле "Максимальная сумма субсидии с НДС, руб." evo_subsidy.evo_max_subsidy_summ из записи Субсидия в поле selectImportProgram ,
|
||
* то в labelImportProgramSum указываем значение из поля "Максимальная сумма субсидии с НДС, руб." evo_subsidy.evo_max_subsidy_summ ,
|
||
* иначе результат расчета п.1
|
||
* иначе 0
|
||
*/
|
||
/* eslint-enable */
|
||
|
||
export function common({ store, apolloClient }: ProcessContext) {
|
||
const { $calculation } = store;
|
||
|
||
queueReaction(
|
||
() => $calculation.$values.getValues(['importProgram', 'plPriceRub', 'supplierDiscountRub']),
|
||
async ({ importProgram: importProgramId, plPriceRub, supplierDiscountRub }) => {
|
||
if (importProgramId) {
|
||
const {
|
||
data: { evo_subsidy: importProgram },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetSubsidyDocument,
|
||
variables: {
|
||
subsidyId: importProgramId,
|
||
},
|
||
});
|
||
|
||
if (importProgram?.evo_subsidy_summ && importProgram?.evo_subsidy_summ > 0) {
|
||
$calculation.element('tbxImportProgramSum').setValue(importProgram?.evo_subsidy_summ);
|
||
} else {
|
||
const subsidyPercent = (importProgram?.evo_percent_subsidy || 0) / 100;
|
||
|
||
const sum = (plPriceRub - supplierDiscountRub) * subsidyPercent;
|
||
const maxSum = importProgram?.evo_max_subsidy_summ || 0;
|
||
|
||
$calculation.element('tbxImportProgramSum').setValue(Math.min(sum, maxSum));
|
||
}
|
||
} else {
|
||
$calculation.element('tbxImportProgramSum').setValue(0);
|
||
}
|
||
},
|
||
{
|
||
name: 'tbxImportProgramSum',
|
||
priority: 1,
|
||
}
|
||
);
|
||
|
||
queueReaction(
|
||
() =>
|
||
$calculation.$values.getValues([
|
||
'subsidy',
|
||
'plPriceRub',
|
||
'discountRub',
|
||
'addEquipmentPrice',
|
||
'importProgramSum',
|
||
'quote',
|
||
]),
|
||
async ({
|
||
subsidy: subsidyId,
|
||
plPriceRub,
|
||
discountRub,
|
||
addEquipmentPrice,
|
||
importProgramSum,
|
||
}) => {
|
||
if (!subsidyId) {
|
||
$calculation.element('tbxSubsidySum').resetValue();
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { evo_subsidy: subsidy },
|
||
} = await apolloClient.query({
|
||
query: CRMTypes.GetSubsidyDocument,
|
||
variables: {
|
||
subsidyId,
|
||
},
|
||
});
|
||
|
||
if (subsidy?.evo_subsidy_summ) {
|
||
$calculation.element('tbxSubsidySum').setValue(subsidy?.evo_subsidy_summ);
|
||
|
||
return;
|
||
}
|
||
|
||
const price = plPriceRub - discountRub - importProgramSum + addEquipmentPrice;
|
||
|
||
let sum = (price * (subsidy?.evo_percent_subsidy ?? 0)) / 100;
|
||
const maxSum = subsidy?.evo_max_subsidy_summ ?? 0;
|
||
if (sum > maxSum) sum = maxSum;
|
||
|
||
$calculation.element('tbxSubsidySum').setValue(sum);
|
||
},
|
||
{
|
||
delay: 5,
|
||
equals: comparer.shallow,
|
||
name: 'tbxSubsidySum',
|
||
priority: 1,
|
||
}
|
||
);
|
||
}
|