2024-07-15 11:04:47 +03:00

113 lines
2.8 KiB
TypeScript

import * as CRMTypes from '@/graphql/crm.types';
import type { GetQuoteContext } from '@/server/routers/quote/types';
type Quote = NonNullable<CRMTypes.GetQuoteDataQuery['quote']>;
type QuoteSumFields =
| 'evo_agent_reward_summ'
| 'evo_broker_reward_summ'
| 'evo_dealer_broker_reward_summ'
| 'evo_dealer_reward_summ'
| 'evo_double_agent_reward_summ'
| 'evo_fin_department_reward_summ';
type QuoteTotalFields =
| 'evo_agent_reward_total'
| 'evo_broker_reward_total'
| 'evo_dealer_broker_reward_total'
| 'evo_dealer_reward_total'
| 'evo_double_agent_reward_total'
| 'evo_fin_department_reward_total';
function makeGetRewardSum({ apolloClient }: GetQuoteContext) {
return async function (
conditionId: string | null | undefined,
quote: Quote,
quoteRewardSummField: keyof Pick<Quote, QuoteSumFields>,
quoteRewardTotalField: keyof Pick<Quote, QuoteTotalFields>
) {
if (!conditionId) return 0;
const {
data: { evo_reward_condition },
} = await apolloClient.query<
CRMTypes.GetRewardConditionQuery,
CRMTypes.GetRewardConditionQueryVariables
>({
query: CRMTypes.GetRewardConditionDocument,
variables: {
conditionId,
},
});
if (evo_reward_condition?.evo_calc_reward_rules === 100_000_001) {
return quote[quoteRewardSummField];
}
return quote[quoteRewardTotalField];
};
}
export default async function getSums(quote: Quote | null, ctx: GetQuoteContext) {
if (!quote) {
return null;
}
const getRewardSum = makeGetRewardSum(ctx);
const [
dealerRewardSumm,
dealerBrokerRewardSumm,
indAgentRewardSumm,
calcDoubleAgentRewardSumm,
calcBrokerRewardSum,
finDepartmentRewardSumm,
] = await Promise.all([
getRewardSum(
quote?.evo_dealer_reward_conditionid,
quote,
'evo_dealer_reward_summ',
'evo_dealer_reward_total'
),
getRewardSum(
quote?.evo_dealer_broker_reward_conditionid,
quote,
'evo_dealer_broker_reward_summ',
'evo_dealer_broker_reward_total'
),
getRewardSum(
quote?.evo_agent_reward_conditionid,
quote,
'evo_agent_reward_summ',
'evo_agent_reward_total'
),
getRewardSum(
quote.evo_double_agent_reward_conditionid,
quote,
'evo_double_agent_reward_summ',
'evo_double_agent_reward_total'
),
getRewardSum(
quote.evo_broker_reward_conditionid,
quote,
'evo_broker_reward_summ',
'evo_broker_reward_total'
),
getRewardSum(
quote.evo_fin_department_reward_conditionid,
quote,
'evo_fin_department_reward_summ',
'evo_fin_department_reward_total'
),
]);
return {
calcBrokerRewardSum,
calcDoubleAgentRewardSumm,
dealerBrokerRewardSumm,
dealerRewardSumm,
finDepartmentRewardSumm,
indAgentRewardSumm,
};
}