process:subsidy: fix subsidySum ,importProgramSum

This commit is contained in:
vchikalkin 2023-06-06 12:23:45 +03:00
parent e9edf189e7
commit 4a65a39ba3
3 changed files with 161 additions and 69 deletions

View File

@ -1,9 +1,13 @@
import type { GetQuoteInputData, GetQuoteProcessData } from '../load-kp/types';
import helper from './lib/helper';
import initializeApollo from '@/apollo/client';
import defaultValues from '@/config/default-values';
import * as CRMTypes from '@/graphql/crm.types';
import { getKPData as getKPDataPrice } from '@/process/price/get-kp-data';
import { createCurrencyUtility } from '@/utils/currency';
import { gql } from '@apollo/client';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const QUERY_GET_QUOTE_SUBSIDY_DATA = gql`
query GetQuoteSubsidyData($quoteId: Uuid!) {
quote(quoteId: $quoteId) {
@ -13,11 +17,11 @@ const QUERY_GET_QUOTE_SUBSIDY_DATA = gql`
}
`;
export async function getKPData({
values: { quote: quoteId },
}: GetQuoteInputData): Promise<GetQuoteProcessData> {
export async function getKPData({ values }: GetQuoteInputData): Promise<GetQuoteProcessData> {
const apolloClient = initializeApollo();
const { quote: quoteId } = values;
const {
data: { quote },
} = await apolloClient.query({
@ -27,10 +31,55 @@ export async function getKPData({
},
});
const kpDataPrice = await getKPDataPrice({ values });
const { RUB } = createCurrencyUtility({ apolloClient });
const supplierCurrency = kpDataPrice.values?.supplierCurrency ?? defaultValues.supplierCurrency;
const leaseObjectPrice = kpDataPrice.values?.leaseObjectPrice ?? defaultValues.leaseObjectPrice;
const supplierDiscountRub =
kpDataPrice.values?.supplierDiscountRub ?? defaultValues.supplierDiscountRub;
let plPriceRub = 0;
if (supplierCurrency && leaseObjectPrice) {
plPriceRub = await RUB({
currencyid: supplierCurrency,
value: leaseObjectPrice,
});
}
let discountRub = 0;
if (supplierCurrency && supplierDiscountRub) {
discountRub = await RUB({
currencyid: supplierCurrency,
value: supplierDiscountRub,
});
}
const importProgram = quote?.evo_program_import_subsidyid ?? defaultValues.importProgram;
const subsidy = quote?.evo_subsidyid ?? defaultValues.subsidy;
const { getSubsidySum } = helper({ apolloClient });
const subsidySum = await getSubsidySum({
addEquipmentPrice: kpDataPrice.values?.addEquipmentPrice ?? 0,
discountRub,
importProgramSum: kpDataPrice.values?.importProgramSum ?? 0,
plPriceRub,
subsidy: quote?.evo_subsidyid ?? defaultValues.subsidy,
});
const { getImportProgramSum } = helper({ apolloClient });
const importProgramSum = await getImportProgramSum({
discountRub,
importProgram,
plPriceRub,
});
return {
values: {
importProgram: quote?.evo_program_import_subsidyid ?? defaultValues.importProgram,
subsidy: quote?.evo_subsidyid ?? defaultValues.subsidy,
importProgram,
importProgramSum,
subsidy,
subsidySum,
},
};
}

View File

@ -0,0 +1,80 @@
import type { ProcessContext } from '../../types';
import * as CRMTypes from '@/graphql/crm.types';
import type { CalculationValues } from '@/stores/calculation/values/types';
type GetSubsidySumInput = Pick<
CalculationValues,
'addEquipmentPrice' | 'discountRub' | 'importProgramSum' | 'plPriceRub' | 'subsidy'
>;
type GetImportProgramSumInput = Pick<
CalculationValues,
'discountRub' | 'importProgram' | 'plPriceRub'
>;
export default function helper({ apolloClient }: Pick<ProcessContext, 'apolloClient'>) {
return {
async getImportProgramSum({
importProgram: importProgramId,
plPriceRub,
discountRub,
}: GetImportProgramSumInput) {
if (!importProgramId) {
return 0;
}
const {
data: { evo_subsidy: importProgram },
} = await apolloClient.query({
query: CRMTypes.GetSubsidyDocument,
variables: {
subsidyId: importProgramId,
},
});
if (importProgram?.evo_subsidy_summ && importProgram?.evo_subsidy_summ > 0) {
return importProgram?.evo_subsidy_summ;
} else {
const subsidyPercent = (importProgram?.evo_percent_subsidy || 0) / 100;
const sum = (plPriceRub - discountRub) * subsidyPercent;
const maxSum = importProgram?.evo_max_subsidy_summ || 0;
return Math.min(sum, maxSum);
}
},
async getSubsidySum({
subsidy: subsidyId,
plPriceRub,
discountRub,
addEquipmentPrice,
importProgramSum,
}: GetSubsidySumInput) {
if (!subsidyId) {
return 0;
}
const {
data: { evo_subsidy },
} = await apolloClient.query({
query: CRMTypes.GetSubsidyDocument,
variables: {
subsidyId,
},
});
if (evo_subsidy?.evo_subsidy_summ) {
return evo_subsidy?.evo_subsidy_summ;
}
const price = plPriceRub - discountRub - importProgramSum + addEquipmentPrice;
let sum = (price * (evo_subsidy?.evo_percent_subsidy ?? 0)) / 100;
const maxSum = evo_subsidy?.evo_max_subsidy_summ ?? 0;
if (sum > maxSum) sum = maxSum;
return sum;
},
};
}

View File

@ -1,6 +1,7 @@
import * as CRMTypes from '@/graphql/crm.types';
import helper from './lib/helper';
import type { ProcessContext } from '@/process/types';
import { reaction } from 'mobx';
import { disposableReaction } from '@/utils/mobx';
import { comparer } from 'mobx';
/**
* При изменении "Программа от производителя" selectImportProgram , Стоимости ПЛ tbxLeaseObjectPrice, Валюты selectSupplierCurrency, Скидка от поставщика, в валюте поставщика (tbxSupplierDiscountRub)
@ -19,39 +20,28 @@ import { reaction } from 'mobx';
*/
/* eslint-enable */
export function common({ store, apolloClient }: ProcessContext) {
const { $calculation } = store;
export function common(context: ProcessContext) {
const { store } = context;
const { $calculation, $process } = store;
reaction(
() => $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,
},
});
const { getSubsidySum, getImportProgramSum } = helper(context);
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;
disposableReaction(
() => $process.has('LoadKP'),
() => $calculation.$values.getValues(['importProgram', 'plPriceRub', 'discountRub']),
async (values) => {
const importProgramSum = await getImportProgramSum(values);
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);
}
$calculation.element('tbxImportProgramSum').setValue(importProgramSum);
},
{
delay: 5,
equals: comparer.shallow,
}
);
reaction(
disposableReaction(
() => $process.has('LoadKP'),
() =>
$calculation.$values.getValues([
'subsidy',
@ -59,42 +49,15 @@ export function common({ store, apolloClient }: ProcessContext) {
'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);
async (values) => {
const subsidySum = await getSubsidySum(values);
$calculation.element('tbxSubsidySum').setValue(subsidySum);
},
{
delay: 5,
equals: comparer.shallow,
}
);
}