140 lines
4.2 KiB
TypeScript
140 lines
4.2 KiB
TypeScript
import type { ApolloClient } from '@apollo/client';
|
||
import { gql } from '@apollo/client';
|
||
import { reaction } from 'mobx';
|
||
import type RootStore from 'stores/root';
|
||
import { normalizeOptions } from 'tools/entity';
|
||
import type { GetLeadidByOpportunity } from './__generated__/GetLeadidByOpportunity';
|
||
import type { GetOpportunityByLead } from './__generated__/GetOpportunityByLead';
|
||
import type { GetQuotesByLead } from './__generated__/GetQuotesByLead';
|
||
|
||
export default function commonReactions(store: RootStore, apolloClient: ApolloClient<object>) {
|
||
const { $calculation } = store;
|
||
|
||
/**
|
||
* Если lead содержит данные, то в opportunity подгружается значение из поля Интереса
|
||
* Лизинговая сделка (lead.evo_opportunityid → opportunity),
|
||
* и в списке для выбора только эта ЛС указывается
|
||
* Иначе ничего не указывается
|
||
*/
|
||
|
||
const QUERY_GET_OPPORTUNITY_BY_LEAD = gql`
|
||
query GetOpportunityByLead($leadid: Uuid!) {
|
||
lead(leadid: $leadid) {
|
||
evo_opportunityidData {
|
||
label: name
|
||
value: opportunityid
|
||
}
|
||
}
|
||
}
|
||
`;
|
||
|
||
reaction(
|
||
() => $calculation.getElementValue('selectLead'),
|
||
async (leadid) => {
|
||
if (!leadid) {
|
||
$calculation.resetElementValue('selectOpportunity');
|
||
|
||
return;
|
||
}
|
||
|
||
const {
|
||
data: { lead },
|
||
} = await apolloClient.query<GetOpportunityByLead>({
|
||
query: QUERY_GET_OPPORTUNITY_BY_LEAD,
|
||
variables: {
|
||
leadid,
|
||
},
|
||
});
|
||
|
||
if (lead?.evo_opportunityidData?.value) {
|
||
$calculation.setElementValue('selectOpportunity', lead?.evo_opportunityidData?.value);
|
||
} else {
|
||
$calculation.resetElementValue('selectOpportunity');
|
||
}
|
||
}
|
||
);
|
||
|
||
/**
|
||
* если opportunity содержит данные,
|
||
то в lead подгружается значение из поля Интерес
|
||
выбранной карточки Лизинговая сделка (opportunity.evo_leadid)
|
||
иначе ничего не делать
|
||
*/
|
||
const QUERY_GET_LEADID_BY_OPPORTUNITY = gql`
|
||
query GetLeadidByOpportunity($opportunityid: Uuid!) {
|
||
opportunity(opportunityid: $opportunityid) {
|
||
evo_leadid
|
||
}
|
||
}
|
||
`;
|
||
|
||
reaction(
|
||
() => $calculation.getElementValue('selectOpportunity'),
|
||
async (opportunityid) => {
|
||
const leadid = $calculation.getElementValue('selectLead');
|
||
|
||
if (leadid) {
|
||
const {
|
||
data: { lead },
|
||
} = await apolloClient.query<GetOpportunityByLead>({
|
||
query: QUERY_GET_OPPORTUNITY_BY_LEAD,
|
||
variables: {
|
||
leadid,
|
||
},
|
||
});
|
||
|
||
if (!opportunityid && lead?.evo_opportunityidData?.value) {
|
||
$calculation.resetElementValue('selectLead');
|
||
}
|
||
}
|
||
|
||
if (opportunityid) {
|
||
const { data } = await apolloClient.query<GetLeadidByOpportunity>({
|
||
query: QUERY_GET_LEADID_BY_OPPORTUNITY,
|
||
variables: {
|
||
opportunityid,
|
||
},
|
||
});
|
||
|
||
$calculation.setElementValue('selectLead', data.opportunity?.evo_leadid);
|
||
}
|
||
}
|
||
);
|
||
|
||
/**
|
||
* Если lead содержит данные,
|
||
То в quote подгружается список Предложений CRM (сущность quote),
|
||
у которых в поле Интерес (quote.evo_leadid) записана ссылка на выбранный интерес.
|
||
Иначе очищать поле калькулятора quote.
|
||
*/
|
||
|
||
const QUERY_GET_QUOTES_BY_LEAD = gql`
|
||
query GetQuotesByLead($leadid: Uuid!) {
|
||
quotes(evo_leadid: $leadid) {
|
||
label: evo_quotename
|
||
value: quoteid
|
||
}
|
||
}
|
||
`;
|
||
|
||
reaction(
|
||
() => $calculation.getElementValue('selectLead'),
|
||
async (leadid) => {
|
||
if (leadid) {
|
||
const {
|
||
data: { quotes },
|
||
} = await apolloClient.query<GetQuotesByLead>({
|
||
query: QUERY_GET_QUOTES_BY_LEAD,
|
||
variables: {
|
||
leadid,
|
||
},
|
||
});
|
||
|
||
$calculation.setElementOptions('selectQuote', normalizeOptions(quotes));
|
||
} else {
|
||
$calculation.resetElement('selectQuote');
|
||
}
|
||
}
|
||
);
|
||
}
|