2023-02-03 08:30:24 +03:00

101 lines
3.3 KiB
TypeScript

/* eslint-disable import/prefer-default-export */
import type { ApolloClient } from '@apollo/client';
import type { Elements } from 'Components/Calculation/config/map/values';
import * as CRMTypes from 'graphql/crm.types';
import type RootStore from 'stores/root';
import { normalizeOptions } from 'tools/entity';
type AgentsLeadProp = keyof Pick<
NonNullable<CRMTypes.GetLeadQuery['lead']>,
| 'evo_agent_accountid'
| 'evo_broker_accountid'
| 'evo_double_agent_accountid'
| 'evo_fin_department_accountid'
>;
function makeFillAgentFromLead(elementName: Elements, leadProp: AgentsLeadProp) {
return async function fillAgentFromLead(
{ $calculation }: RootStore,
apolloClient: ApolloClient<object>,
leadid: string | null
) {
if (!leadid) {
$calculation.element(elementName).reset();
return;
}
const {
data: { lead },
} = await apolloClient.query({
query: CRMTypes.GetLeadDocument,
variables: {
leadid,
},
});
const agentid = lead?.[leadProp];
if (agentid) {
const {
data: { agent },
} = await apolloClient.query({
query: CRMTypes.GetAgentDocument,
variables: {
agentid,
},
});
if (agent) {
$calculation
.element(elementName)
.setOptions(normalizeOptions([agent]))
.setValue(agent.value);
}
} else {
$calculation.element(elementName).reset();
}
};
}
/**
* Если lead содержит данные,
* то indAgent заполняется ссылкой на карточку Контрагент (account),
* записанную в поле Интереса "Агент" (lead.evo_agent_accountid → account),
* иначе очищать поле калькулятора indAgent
*/
export const fillIndAgent = makeFillAgentFromLead('selectIndAgent', 'evo_agent_accountid');
/**
* Если lead содержит данные,
* то calcDoubleAgent заполняется ссылкой на карточку Контрагент (account),
* записанную в поле Интереса "Двойной агент" (lead.evo_double_agent_accountid → account)
* иначе очищать поле калькулятора calcDoubleAgent
*/
export const fillCalcDoubleAgent = makeFillAgentFromLead(
'selectCalcDoubleAgent',
'evo_double_agent_accountid'
);
/**
* Если lead содержит данные, то calcBroker заполняется ссылкой на карточку Контрагент (account),
* записанную в поле Интереса "Брокер" (lead.evo_broker_accountid → account)
* иначе очищать поле калькулятора calcBroker
*/
export const fillCalcBroker = makeFillAgentFromLead('selectCalcBroker', 'evo_broker_accountid');
/**
* если lead содержит данные, то calcFinDepartment заполняется ссылкой
* на карточку Контрагент (account),
* записанную в поле Интереса "Финотдел" (lead.evo_fin_department_accountid → account)
* иначе очищать поле калькулятора calcFinDepartment
*/
export const fillFinDepartment = makeFillAgentFromLead(
'selectCalcFinDepartment',
'evo_fin_department_accountid'
);