process:subsidy: fix subsidySum ,importProgramSum
This commit is contained in:
parent
e9edf189e7
commit
4a65a39ba3
@ -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,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
80
apps/web/process/subsidy/lib/helper.ts
Normal file
80
apps/web/process/subsidy/lib/helper.ts
Normal 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;
|
||||
},
|
||||
};
|
||||
}
|
||||
@ -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,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user