process/supplier-agent: use new validation
This commit is contained in:
parent
441c19b49e
commit
007f4f1568
@ -15,14 +15,14 @@ import * as payments from '@/process/payments';
|
||||
import * as price from '@/process/price';
|
||||
import * as subsidy from '@/process/subsidy';
|
||||
import * as subsidyImportProgram from '@/process/subsidy-import-program';
|
||||
// import * as supplierAgent from '@/process/supplier-agent';
|
||||
import * as supplierAgent from '@/process/supplier-agent';
|
||||
import * as usedPl from '@/process/used-pl';
|
||||
|
||||
export default function useReactions() {
|
||||
useProcess(leadOpportunity);
|
||||
useProcess(loadKP);
|
||||
useProcess(calculate);
|
||||
// useProcess(supplierAgent);
|
||||
useProcess(supplierAgent);
|
||||
useProcess(price);
|
||||
useProcess(fingap);
|
||||
useProcess(leasingWithoutKasko);
|
||||
|
||||
@ -2,11 +2,10 @@
|
||||
import type { AgentsFields, AgentsRewardConditionsFields, AgentsSumFields } from './types';
|
||||
import * as CRMTypes from '@/graphql/crm.types';
|
||||
import type RootStore from '@/stores/root';
|
||||
import ValidationHelper from '@/stores/validation/helper';
|
||||
import type { ApolloClient } from '@apollo/client';
|
||||
import dayjs from 'dayjs';
|
||||
import utc from 'dayjs/plugin/utc';
|
||||
import { autorun, reaction } from 'mobx';
|
||||
import { reaction } from 'mobx';
|
||||
import { normalizeOptions } from 'tools/entity';
|
||||
import { makeDisposable } from 'tools/mobx';
|
||||
|
||||
@ -104,108 +103,3 @@ export function fillAgentRewardSummReaction(
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export function validateAgentRewardSumm(
|
||||
store: RootStore,
|
||||
apolloClient: ApolloClient<object>,
|
||||
agentParams: {
|
||||
rewardConditionField: AgentsRewardConditionsFields;
|
||||
rewardSummField: AgentsSumFields;
|
||||
}
|
||||
) {
|
||||
const { $calculation } = store;
|
||||
const { rewardConditionField, rewardSummField } = agentParams;
|
||||
|
||||
const validationHelper = new ValidationHelper();
|
||||
|
||||
reaction(
|
||||
() => $calculation.element(rewardSummField).getValue(),
|
||||
async (rewardSumm) => {
|
||||
const conditionId = $calculation.element(rewardConditionField).getValue();
|
||||
if (!conditionId) {
|
||||
validationHelper.removeErrors();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const {
|
||||
data: { evo_reward_condition },
|
||||
} = await apolloClient.query<
|
||||
CRMTypes.GetRewardConditionQuery,
|
||||
CRMTypes.GetRewardConditionQueryVariables
|
||||
>({
|
||||
query: CRMTypes.GetRewardConditionDocument,
|
||||
variables: {
|
||||
conditionId,
|
||||
},
|
||||
});
|
||||
|
||||
if (!evo_reward_condition) {
|
||||
validationHelper.removeErrors();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (evo_reward_condition.evo_reward_summ) {
|
||||
$calculation.element(rewardSummField).validate({
|
||||
helper: validationHelper,
|
||||
invalid: rewardSumm > evo_reward_condition?.evo_reward_summ,
|
||||
message: 'Вознаграждение указано больше условия по агентскому договору!',
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
evo_reward_condition?.evo_reduce_reward !== null &&
|
||||
evo_reward_condition.evo_reward_summ
|
||||
) {
|
||||
$calculation.element(rewardSummField).validate({
|
||||
helper: validationHelper,
|
||||
invalid:
|
||||
evo_reward_condition.evo_reduce_reward === false &&
|
||||
rewardSumm < evo_reward_condition.evo_reward_summ,
|
||||
message: 'Вознаграждение указано меньше условия по агентскому договору!',
|
||||
});
|
||||
}
|
||||
|
||||
if (evo_reward_condition?.evo_min_reward_summ !== null) {
|
||||
$calculation.element(rewardSummField).validate({
|
||||
helper: validationHelper,
|
||||
invalid: rewardSumm < evo_reward_condition?.evo_min_reward_summ,
|
||||
message: 'Вознаграждение указано меньше условия по агентскому договору!',
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
autorun(() => {
|
||||
const rewardSumm = $calculation.element(rewardSummField).getValue();
|
||||
const rewardConditionOptions = $calculation.$options.getOptions(rewardConditionField);
|
||||
|
||||
const conditionIds = rewardConditionOptions.map((x) => x.value);
|
||||
const requests = conditionIds.map(async (conditionId) => {
|
||||
const {
|
||||
data: { evo_reward_condition },
|
||||
} = await apolloClient.query<
|
||||
CRMTypes.GetRewardConditionQuery,
|
||||
CRMTypes.GetRewardConditionQueryVariables
|
||||
>({
|
||||
query: CRMTypes.GetRewardConditionDocument,
|
||||
variables: {
|
||||
conditionId,
|
||||
},
|
||||
});
|
||||
|
||||
return evo_reward_condition;
|
||||
});
|
||||
|
||||
Promise.all(requests).then((results) => {
|
||||
const required_reward = results.some(
|
||||
(x) => x?.evo_agency_agreementidData?.evo_required_reward === true
|
||||
);
|
||||
$calculation.element(rewardSummField).validate({
|
||||
invalid: rewardSumm === 0 && required_reward,
|
||||
message: 'Согласно агентскому договору обязательна выплата АВ. Заложите АВ в расчет',
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,29 +0,0 @@
|
||||
import type * as Values from '@/Components/Calculation/config/map/values';
|
||||
|
||||
export type AgentsFields = Extract<
|
||||
Values.Elements,
|
||||
| 'selectCalcBroker'
|
||||
| 'selectCalcDoubleAgent'
|
||||
| 'selectCalcFinDepartment'
|
||||
| 'selectDealerBroker'
|
||||
| 'selectDealerPerson'
|
||||
| 'selectIndAgent'
|
||||
>;
|
||||
export type AgentsRewardConditionsFields = Extract<
|
||||
Values.Elements,
|
||||
| 'selectCalcBrokerRewardCondition'
|
||||
| 'selectCalcDoubleAgentRewardCondition'
|
||||
| 'selectDealerBrokerRewardCondition'
|
||||
| 'selectDealerRewardCondition'
|
||||
| 'selectFinDepartmentRewardCondtion'
|
||||
| 'selectIndAgentRewardCondition'
|
||||
>;
|
||||
export type AgentsSumFields = Extract<
|
||||
Values.Elements,
|
||||
| 'tbxCalcBrokerRewardSum'
|
||||
| 'tbxCalcDoubleAgentRewardSumm'
|
||||
| 'tbxDealerBrokerRewardSumm'
|
||||
| 'tbxDealerRewardSumm'
|
||||
| 'tbxFinDepartmentRewardSumm'
|
||||
| 'tbxIndAgentRewardSumm'
|
||||
>;
|
||||
@ -6,12 +6,11 @@ import * as CRMTypes from '@/graphql/crm.types';
|
||||
import type { ProcessContext } from '@/process/types';
|
||||
import dayjs from 'dayjs';
|
||||
import utc from 'dayjs/plugin/utc';
|
||||
import { autorun, reaction } from 'mobx';
|
||||
import { reaction } from 'mobx';
|
||||
import { makeDisposable } from 'tools/mobx';
|
||||
|
||||
const { fillIndAgent, fillCalcBroker, fillCalcDoubleAgent, fillFinDepartment } = fillAgentsFromLead;
|
||||
const { fillAgentRewardReaction, fillAgentRewardSummReaction, validateAgentRewardSumm } =
|
||||
createReactions;
|
||||
const { fillAgentRewardReaction, fillAgentRewardSummReaction } = createReactions;
|
||||
|
||||
dayjs.extend(utc);
|
||||
|
||||
@ -521,165 +520,3 @@ export function common({ store, apolloClient }: ProcessContext) {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function validation({ store, apolloClient }: ProcessContext) {
|
||||
const { $calculation } = store;
|
||||
|
||||
validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectIndAgentRewardCondition',
|
||||
rewardSummField: 'tbxIndAgentRewardSumm',
|
||||
});
|
||||
|
||||
validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectCalcDoubleAgentRewardCondition',
|
||||
rewardSummField: 'tbxCalcDoubleAgentRewardSumm',
|
||||
});
|
||||
|
||||
validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectCalcBrokerRewardCondition',
|
||||
rewardSummField: 'tbxCalcBrokerRewardSum',
|
||||
});
|
||||
|
||||
validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectFinDepartmentRewardCondtion',
|
||||
rewardSummField: 'tbxFinDepartmentRewardSumm',
|
||||
});
|
||||
|
||||
/**
|
||||
* Добавить валидацию на кнопку Рассчитать:
|
||||
* если tbxDealerRewardSumm > 0 и
|
||||
* если selectDealerPerson = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* 2.если tbxDealerBrokerRewardSumm > 0 и
|
||||
*
|
||||
* если selectDealerBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* 3. если tbxIndAgentRewardSumm > 0 и
|
||||
*
|
||||
* если selectIndAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* 4. если tbxCalcDoubleAgentRewardSumm > 0 и
|
||||
*
|
||||
* если selectCalcDoubleAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* 5. если tbxCalcBrokerRewardSum > 0 и
|
||||
*
|
||||
* если selectCalcBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* 6. если tbxFinDepartmentRewardSumm > 0 и
|
||||
*
|
||||
* если selectFinDepartment = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectFinDepartment
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line complexity, sonarjs/cognitive-complexity
|
||||
autorun(() => {
|
||||
const dealerRewardSumm = $calculation.element('tbxDealerRewardSumm').getValue();
|
||||
const dealerBrokerRewardSumm = $calculation.element('tbxDealerBrokerRewardSumm').getValue();
|
||||
const indAgentRewardSumm = $calculation.element('tbxIndAgentRewardSumm').getValue();
|
||||
const calcDoubleAgentRewardSumm = $calculation
|
||||
.element('tbxCalcDoubleAgentRewardSumm')
|
||||
.getValue();
|
||||
const calcBrokerRewardSum = $calculation.element('tbxCalcBrokerRewardSum').getValue();
|
||||
const finDepartmentRewardSumm = $calculation.element('tbxFinDepartmentRewardSumm').getValue();
|
||||
|
||||
const dealerPerson = $calculation.element('selectDealerPerson').getValue();
|
||||
const dealerBroker = $calculation.element('selectDealerBroker').getValue();
|
||||
const indAgent = $calculation.element('selectIndAgent').getValue();
|
||||
const calcDoubleAgent = $calculation.element('selectCalcDoubleAgent').getValue();
|
||||
const calcBroker = $calculation.element('selectCalcBroker').getValue();
|
||||
const calcFinDepartment = $calculation.element('selectCalcFinDepartment').getValue();
|
||||
|
||||
const message = 'Вы закладываете вознаграждение одному и тому же агенту дважды';
|
||||
|
||||
$calculation.element('selectDealerPerson').validate({
|
||||
invalid:
|
||||
dealerRewardSumm > 0 &&
|
||||
Boolean(dealerPerson) &&
|
||||
((dealerPerson === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(dealerPerson === indAgent && indAgentRewardSumm > 0) ||
|
||||
(dealerPerson === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(dealerPerson === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(dealerPerson === calcFinDepartment && finDepartmentRewardSumm > 0)),
|
||||
message,
|
||||
});
|
||||
|
||||
$calculation.element('selectDealerBroker').validate({
|
||||
invalid:
|
||||
dealerBrokerRewardSumm > 0 &&
|
||||
Boolean(dealerBroker) &&
|
||||
((dealerBroker === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(dealerBroker === indAgent && indAgentRewardSumm > 0) ||
|
||||
(dealerBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(dealerBroker === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(dealerBroker === calcFinDepartment && finDepartmentRewardSumm > 0)),
|
||||
message,
|
||||
});
|
||||
|
||||
$calculation.element('selectIndAgent').validate({
|
||||
invalid:
|
||||
indAgentRewardSumm > 0 &&
|
||||
Boolean(indAgent) &&
|
||||
((indAgent === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(indAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(indAgent === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(indAgent === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(indAgent === calcFinDepartment && finDepartmentRewardSumm > 0)),
|
||||
message,
|
||||
});
|
||||
|
||||
$calculation.element('selectCalcDoubleAgent').validate({
|
||||
invalid:
|
||||
calcDoubleAgentRewardSumm > 0 &&
|
||||
Boolean(calcDoubleAgent) &&
|
||||
((calcDoubleAgent === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcDoubleAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcDoubleAgent === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcDoubleAgent === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(calcDoubleAgent === calcFinDepartment && finDepartmentRewardSumm > 0)),
|
||||
message,
|
||||
});
|
||||
|
||||
$calculation.element('selectCalcBroker').validate({
|
||||
invalid:
|
||||
calcBrokerRewardSum > 0 &&
|
||||
Boolean(calcBroker) &&
|
||||
((calcBroker === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcBroker === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcBroker === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(calcBroker === calcFinDepartment && finDepartmentRewardSumm > 0)),
|
||||
message,
|
||||
});
|
||||
|
||||
$calculation.element('selectCalcFinDepartment').validate({
|
||||
invalid:
|
||||
finDepartmentRewardSumm > 0 &&
|
||||
Boolean(calcFinDepartment) &&
|
||||
((calcFinDepartment === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcFinDepartment === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcFinDepartment === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcFinDepartment === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(calcFinDepartment === calcBroker && calcBrokerRewardSum > 0)),
|
||||
message,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -9,9 +9,6 @@ function common(context: ProcessContext) {
|
||||
supplier.common(context);
|
||||
}
|
||||
|
||||
function validation(context: ProcessContext) {
|
||||
agents.validation(context);
|
||||
supplier.validation(context);
|
||||
}
|
||||
export { common };
|
||||
|
||||
export { common, validation };
|
||||
export { default as validation } from './validation';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import * as CRMTypes from '@/graphql/crm.types';
|
||||
import type { ProcessContext } from '@/process/types';
|
||||
import { autorun, reaction } from 'mobx';
|
||||
import { reaction } from 'mobx';
|
||||
|
||||
export function common({ store, apolloClient }: ProcessContext) {
|
||||
const { $calculation, $tables } = store;
|
||||
@ -73,37 +73,4 @@ export function common({ store, apolloClient }: ProcessContext) {
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* В валидацию на кнопку Рассчитать внести изменение:
|
||||
* 1) поле selectDealerPerson убрать из списка обязательных для расчета полей
|
||||
* 2) добавить валидацию на поле selectDealerPerson :
|
||||
* Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null)
|
||||
* и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой,
|
||||
* иначе все ок
|
||||
*/
|
||||
|
||||
autorun(async () => {
|
||||
const dealerId = $calculation.element('selectDealer').getValue();
|
||||
const dealerPersonId = $calculation.element('selectDealerPerson').getValue();
|
||||
|
||||
let returnLeasing: boolean | null | undefined;
|
||||
|
||||
if (dealerId) {
|
||||
const {
|
||||
data: { dealer },
|
||||
} = await apolloClient.query({
|
||||
query: CRMTypes.GetDealerDocument,
|
||||
variables: {
|
||||
dealerId,
|
||||
},
|
||||
});
|
||||
returnLeasing = dealer?.evo_return_leasing_dealer;
|
||||
}
|
||||
|
||||
$calculation.element('selectDealerPerson').validate({
|
||||
invalid: Boolean(dealerId) && !dealerPersonId && !returnLeasing,
|
||||
message: 'Не заполнено поле',
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -157,15 +157,3 @@ export function common({ store, apolloClient }: ProcessContext) {
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export function validation({ store, apolloClient }: ProcessContext) {
|
||||
createReactions.validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectDealerRewardCondition',
|
||||
rewardSummField: 'tbxDealerRewardSumm',
|
||||
});
|
||||
|
||||
createReactions.validateAgentRewardSumm(store, apolloClient, {
|
||||
rewardConditionField: 'selectDealerBrokerRewardCondition',
|
||||
rewardSummField: 'tbxDealerBrokerRewardSumm',
|
||||
});
|
||||
}
|
||||
|
||||
56
apps/web/process/supplier-agent/reactions/validation.ts
Normal file
56
apps/web/process/supplier-agent/reactions/validation.ts
Normal file
@ -0,0 +1,56 @@
|
||||
import { createValidationSchema } from '../validation';
|
||||
import type { Elements } from '@/Components/Calculation/config/map/values';
|
||||
import type { ProcessContext } from '@/process/types';
|
||||
import ValidationHelper from '@/stores/validation/helper';
|
||||
import { reaction } from 'mobx';
|
||||
import { uid } from 'radash';
|
||||
|
||||
const key = uid(7);
|
||||
|
||||
export default function reactions(context: ProcessContext) {
|
||||
const { store } = context;
|
||||
const { $calculation } = store;
|
||||
const validationSchema = createValidationSchema(context);
|
||||
|
||||
const helper = new ValidationHelper();
|
||||
reaction(
|
||||
() =>
|
||||
$calculation.$values.getValues([
|
||||
'calcBrokerRewardCondition',
|
||||
'calcBrokerRewardSum',
|
||||
'calcDoubleAgentRewardCondition',
|
||||
'calcDoubleAgentRewardSumm',
|
||||
'dealer',
|
||||
'dealerBroker',
|
||||
'calcFinDepartment',
|
||||
'dealerBrokerRewardCondition',
|
||||
'dealerBrokerRewardSumm',
|
||||
'dealerPerson',
|
||||
'dealerRewardCondition',
|
||||
'dealerRewardSumm',
|
||||
'finDepartmentRewardCondtion',
|
||||
'finDepartmentRewardSumm',
|
||||
'indAgent',
|
||||
'indAgentRewardCondition',
|
||||
'indAgentRewardSumm',
|
||||
'calcDoubleAgent',
|
||||
'calcBroker',
|
||||
]),
|
||||
async (values) => {
|
||||
helper.removeErrors();
|
||||
const validationResult = await validationSchema.safeParseAsync(values);
|
||||
|
||||
if (!validationResult.success) {
|
||||
validationResult.error.errors.forEach(({ path, message }) => {
|
||||
(path as Elements[]).forEach((elementName) => {
|
||||
const removeError = $calculation.element(elementName).setError({ key, message });
|
||||
if (removeError) helper.add(removeError);
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{
|
||||
delay: 100,
|
||||
}
|
||||
);
|
||||
}
|
||||
384
apps/web/process/supplier-agent/validation.ts
Normal file
384
apps/web/process/supplier-agent/validation.ts
Normal file
@ -0,0 +1,384 @@
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
/* eslint-disable complexity */
|
||||
import type { ValidationContext } from '../types';
|
||||
import type { Elements } from '@/Components/Calculation/config/map/values';
|
||||
import ValuesSchema from '@/config/schema/values';
|
||||
import * as CRMTypes from '@/graphql/crm.types';
|
||||
import dayjs from 'dayjs';
|
||||
import utc from 'dayjs/plugin/utc';
|
||||
import { normalizeOptions } from 'tools';
|
||||
import type { RefinementCtx } from 'zod';
|
||||
import { z } from 'zod';
|
||||
|
||||
dayjs.extend(utc);
|
||||
|
||||
function helper({ apolloClient, ctx }: ValidationContext & { ctx: RefinementCtx }) {
|
||||
return {
|
||||
async validateRewardSum({
|
||||
agentid,
|
||||
conditionId,
|
||||
sumFieldName,
|
||||
sum,
|
||||
}: {
|
||||
agentid: string | null;
|
||||
conditionId: string | null;
|
||||
sum: number;
|
||||
sumFieldName: Elements;
|
||||
}) {
|
||||
if (agentid) {
|
||||
const {
|
||||
data: { evo_reward_conditions },
|
||||
} = await apolloClient.query({
|
||||
query: CRMTypes.GetRewardConditionsDocument,
|
||||
variables: {
|
||||
agentid,
|
||||
currentDate: dayjs().utc(false).format('YYYY-MM-DD'),
|
||||
},
|
||||
});
|
||||
|
||||
const requests = normalizeOptions(evo_reward_conditions)?.map(async ({ value }) => {
|
||||
const {
|
||||
data: { evo_reward_condition },
|
||||
} = await apolloClient.query<
|
||||
CRMTypes.GetRewardConditionQuery,
|
||||
CRMTypes.GetRewardConditionQueryVariables
|
||||
>({
|
||||
query: CRMTypes.GetRewardConditionDocument,
|
||||
variables: {
|
||||
conditionId: value,
|
||||
},
|
||||
});
|
||||
|
||||
return evo_reward_condition;
|
||||
});
|
||||
|
||||
const requiredReward = (await Promise.all(requests)).some(
|
||||
(x) => x?.evo_agency_agreementidData?.evo_required_reward === true
|
||||
);
|
||||
|
||||
if (sum === 0 && requiredReward) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: 'Согласно агентскому договору обязательна выплата АВ. Заложите АВ в расчет',
|
||||
path: [sumFieldName],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (conditionId) {
|
||||
const {
|
||||
data: { evo_reward_condition },
|
||||
} = await apolloClient.query<
|
||||
CRMTypes.GetRewardConditionQuery,
|
||||
CRMTypes.GetRewardConditionQueryVariables
|
||||
>({
|
||||
query: CRMTypes.GetRewardConditionDocument,
|
||||
variables: {
|
||||
conditionId,
|
||||
},
|
||||
});
|
||||
|
||||
if (evo_reward_condition?.evo_reward_summ && sum > evo_reward_condition?.evo_reward_summ) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: 'Вознаграждение указано больше условия по агентскому договору!',
|
||||
path: [sumFieldName],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
evo_reward_condition?.evo_reduce_reward === false &&
|
||||
evo_reward_condition?.evo_reward_summ &&
|
||||
sum < evo_reward_condition?.evo_reward_summ
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: 'Вознаграждение указано меньше условия по агентскому договору!',
|
||||
path: [sumFieldName],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
evo_reward_condition?.evo_min_reward_summ &&
|
||||
sum < evo_reward_condition?.evo_min_reward_summ
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: 'Вознаграждение указано меньше условия по агентскому договору!',
|
||||
path: [sumFieldName],
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
const ERR_DOUBLE_REWARD = 'Вы закладываете вознаграждение одному и тому же агенту дважды';
|
||||
|
||||
const AgentsSchema = ValuesSchema.pick({
|
||||
calcBroker: true,
|
||||
calcDoubleAgent: true,
|
||||
calcFinDepartment: true,
|
||||
dealer: true,
|
||||
dealerBroker: true,
|
||||
dealerPerson: true,
|
||||
indAgent: true,
|
||||
});
|
||||
|
||||
const ConditionsSchema = ValuesSchema.pick({
|
||||
calcBrokerRewardCondition: true,
|
||||
calcDoubleAgentRewardCondition: true,
|
||||
dealerBrokerRewardCondition: true,
|
||||
dealerRewardCondition: true,
|
||||
finDepartmentRewardCondtion: true,
|
||||
indAgentRewardCondition: true,
|
||||
});
|
||||
|
||||
const SumsSchema = ValuesSchema.pick({
|
||||
calcBrokerRewardSum: true,
|
||||
calcDoubleAgentRewardSumm: true,
|
||||
dealerBrokerRewardSumm: true,
|
||||
dealerRewardSumm: true,
|
||||
finDepartmentRewardSumm: true,
|
||||
indAgentRewardSumm: true,
|
||||
});
|
||||
|
||||
export function createValidationSchema(context: ValidationContext) {
|
||||
const { apolloClient } = context;
|
||||
|
||||
return AgentsSchema.merge(ConditionsSchema)
|
||||
.merge(SumsSchema)
|
||||
.superRefine(async (values, ctx) => {
|
||||
const {
|
||||
calcBrokerRewardCondition,
|
||||
calcBrokerRewardSum,
|
||||
calcDoubleAgentRewardCondition,
|
||||
calcDoubleAgentRewardSumm,
|
||||
dealer: dealerId,
|
||||
dealerBroker,
|
||||
calcFinDepartment,
|
||||
dealerBrokerRewardCondition,
|
||||
dealerBrokerRewardSumm,
|
||||
dealerPerson,
|
||||
dealerRewardCondition,
|
||||
dealerRewardSumm,
|
||||
finDepartmentRewardCondtion,
|
||||
finDepartmentRewardSumm,
|
||||
indAgent,
|
||||
indAgentRewardCondition,
|
||||
indAgentRewardSumm,
|
||||
calcDoubleAgent,
|
||||
calcBroker,
|
||||
} = values;
|
||||
/**
|
||||
* Добавить валидацию на кнопку Рассчитать:
|
||||
* если tbxDealerRewardSumm > 0 и
|
||||
* если selectDealerPerson = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerPerson
|
||||
* если selectDealerPerson = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerPerson
|
||||
* 2.если tbxDealerBrokerRewardSumm > 0 и
|
||||
*
|
||||
* если selectDealerBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectDealerBroker
|
||||
* если selectDealerBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectDealerBroker
|
||||
* 3. если tbxIndAgentRewardSumm > 0 и
|
||||
*
|
||||
* если selectIndAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectIndAgent
|
||||
* если selectIndAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectIndAgent
|
||||
* 4. если tbxCalcDoubleAgentRewardSumm > 0 и
|
||||
*
|
||||
* если selectCalcDoubleAgent = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectCalcDoubleAgent
|
||||
* если selectCalcDoubleAgent = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcDoubleAgent
|
||||
* 5. если tbxCalcBrokerRewardSum > 0 и
|
||||
*
|
||||
* если selectCalcBroker = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* если selectCalcBroker = selectFinDepartment и tbxFinDepartmentRewardSumm > 0, то ругаться на selectCalcBroker
|
||||
* 6. если tbxFinDepartmentRewardSumm > 0 и
|
||||
*
|
||||
* если selectFinDepartment = selectDealerPerson и tbxDealerRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectDealerBroker и tbxDealerBrokerRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = sselectIndAgent и tbxIndAgentRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectCalcDoubleAgent и tbxCalcDoubleAgentRewardSumm > 0, то ругаться на selectFinDepartment
|
||||
* если selectFinDepartment = selectCalcBroker tbxCalcBrokerRewardSum > 0, то ругаться на selectFinDepartment
|
||||
*/
|
||||
|
||||
if (
|
||||
dealerRewardSumm > 0 &&
|
||||
Boolean(dealerPerson) &&
|
||||
((dealerPerson === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(dealerPerson === indAgent && indAgentRewardSumm > 0) ||
|
||||
(dealerPerson === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(dealerPerson === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(dealerPerson === calcFinDepartment && finDepartmentRewardSumm > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectDealerPerson'],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
dealerBrokerRewardSumm > 0 &&
|
||||
Boolean(dealerBroker) &&
|
||||
((dealerBroker === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(dealerBroker === indAgent && indAgentRewardSumm > 0) ||
|
||||
(dealerBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(dealerBroker === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(dealerBroker === calcFinDepartment && finDepartmentRewardSumm > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectDealerBroker'],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
indAgentRewardSumm > 0 &&
|
||||
Boolean(indAgent) &&
|
||||
((indAgent === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(indAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(indAgent === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(indAgent === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(indAgent === calcFinDepartment && finDepartmentRewardSumm > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectIndAgent'],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
calcDoubleAgentRewardSumm > 0 &&
|
||||
Boolean(calcDoubleAgent) &&
|
||||
((calcDoubleAgent === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcDoubleAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcDoubleAgent === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcDoubleAgent === calcBroker && calcBrokerRewardSum > 0) ||
|
||||
(calcDoubleAgent === calcFinDepartment && finDepartmentRewardSumm > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectCalcDoubleAgent'],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
calcBrokerRewardSum > 0 &&
|
||||
Boolean(calcBroker) &&
|
||||
((calcBroker === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcBroker === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcBroker === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(calcBroker === calcFinDepartment && finDepartmentRewardSumm > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectCalcBroker'],
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
finDepartmentRewardSumm > 0 &&
|
||||
Boolean(calcFinDepartment) &&
|
||||
((calcFinDepartment === dealerPerson && dealerRewardSumm > 0) ||
|
||||
(calcFinDepartment === dealerBroker && dealerBrokerRewardSumm > 0) ||
|
||||
(calcFinDepartment === indAgent && indAgentRewardSumm > 0) ||
|
||||
(calcFinDepartment === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
|
||||
(calcFinDepartment === calcBroker && calcBrokerRewardSum > 0))
|
||||
) {
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: ERR_DOUBLE_REWARD,
|
||||
path: ['selectCalcFinDepartment'],
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* В валидацию на кнопку Рассчитать внести изменение:
|
||||
* 1) поле selectDealerPerson убрать из списка обязательных для расчета полей
|
||||
* 2) добавить валидацию на поле selectDealerPerson :
|
||||
* Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null)
|
||||
* и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой,
|
||||
* иначе все ок
|
||||
*/
|
||||
if (dealerId) {
|
||||
const {
|
||||
data: { dealer },
|
||||
} = await apolloClient.query({
|
||||
query: CRMTypes.GetDealerDocument,
|
||||
variables: {
|
||||
dealerId,
|
||||
},
|
||||
});
|
||||
|
||||
if (!dealerPerson && !dealer?.evo_return_leasing_dealer)
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
message: 'Не заполнено поле',
|
||||
path: ['selectDealerPerson'],
|
||||
});
|
||||
}
|
||||
|
||||
const { validateRewardSum } = helper({ ...context, ctx });
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: dealerPerson,
|
||||
conditionId: dealerRewardCondition,
|
||||
sum: dealerRewardSumm,
|
||||
sumFieldName: 'tbxDealerRewardSumm',
|
||||
});
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: dealerBroker,
|
||||
conditionId: dealerBrokerRewardCondition,
|
||||
sum: dealerBrokerRewardSumm,
|
||||
sumFieldName: 'tbxDealerBrokerRewardSumm',
|
||||
});
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: indAgent,
|
||||
conditionId: indAgentRewardCondition,
|
||||
sum: indAgentRewardSumm,
|
||||
sumFieldName: 'tbxIndAgentRewardSumm',
|
||||
});
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: calcDoubleAgent,
|
||||
conditionId: calcDoubleAgentRewardCondition,
|
||||
sum: calcDoubleAgentRewardSumm,
|
||||
sumFieldName: 'tbxCalcDoubleAgentRewardSumm',
|
||||
});
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: calcBroker,
|
||||
conditionId: calcBrokerRewardCondition,
|
||||
sum: calcBrokerRewardSum,
|
||||
sumFieldName: 'tbxCalcBrokerRewardSum',
|
||||
});
|
||||
|
||||
await validateRewardSum({
|
||||
agentid: calcFinDepartment,
|
||||
conditionId: finDepartmentRewardCondtion,
|
||||
sum: finDepartmentRewardSumm,
|
||||
sumFieldName: 'tbxFinDepartmentRewardSumm',
|
||||
});
|
||||
});
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user