Merge branch 'development' into master

This commit is contained in:
vchikalkin 2022-08-05 14:34:04 +03:00
commit c89dd55302
14 changed files with 746 additions and 424 deletions

View File

@ -0,0 +1,72 @@
import { IAccount } from 'core/services/CrmService/types/entities';
import { ICalculationStore } from 'core/types/Calculation/Store';
import { reaction } from 'mobx';
import { ElementStatus } from 'types/elements';
export default function leasebackReactions($calculation: ICalculationStore) {
/**
* Дополнить реакцию на изменение поля Салон приобретения selectDealer:
если в поле selectDealer указан account, у которого evo_return_leasing_dealer = true, то
1) поле selectDealerPerson обнулять и закрывать для редактирования,
иначе формировать список связанных значений
2) в таблице страхования в столбце Плательщик в строках ОСАГО и КАСКО указывать "Лизингополучатель" (100 000 000) и закрывать для редактирования ,
иначе открывать данные поля для редактирования
3) ПЛ БУ cbxLeaseObjectUsed = true
*/
reaction(
() => {
return $calculation.getOption('selectDealer') as IAccount;
},
dealer => {
if (dealer.evo_return_leasing_dealer === true) {
// TODO: мб сбрасывать dealerPerson и dealerBroker
$calculation.setTableRow('tableInsurance', rows =>
rows.findIndex(x => x.key === 'kasko'),
)({
insured: { value: 100_000_000, status: ElementStatus.Disabled },
});
$calculation.setValue('leaseObjectUsed', true);
} else {
$calculation.setTableRow('tableInsurance', rows =>
rows.findIndex(x => x.key === 'kasko'),
)({
insured: { status: ElementStatus.Default },
});
}
},
);
// объединили реакцию для прицепа и возвратного лизинга
reaction(
() => {
return {
dealer: $calculation.getOption('selectDealer') as IAccount,
leaseObjectCategory: $calculation.getValue('leaseObjectCategory'),
};
},
({ dealer, leaseObjectCategory }) => {
const isTrailer = leaseObjectCategory === 100000004;
const returnLeasing = dealer.evo_return_leasing_dealer === true;
if (isTrailer || returnLeasing) {
$calculation.setTableRow('tableInsurance', rows =>
rows.findIndex(x => x.key === 'osago'),
)({
insured: { value: 100_000_000, status: ElementStatus.Disabled },
});
} else {
$calculation.setTableRow('tableInsurance', rows =>
rows.findIndex(x => x.key === 'osago'),
)({
insured: { status: ElementStatus.Default },
});
}
},
);
}

View File

@ -18,14 +18,19 @@ export default function ($calculation: ICalculationStore) {
() => {
const product = $calculation.getOption('selectProduct');
const { subsidy, importProgram } = $calculation.values;
return { product, subsidy, importProgram };
const dealer = $calculation.getOption('selectDealer');
return { product, subsidy, importProgram, dealer };
},
({ product, subsidy, importProgram }) => {
({ product, subsidy, importProgram, dealer }) => {
const supplierCurrency =
$calculation.options.selectSupplierCurrency?.find(
x => x.isocurrencycode === 'RUB',
);
if (subsidy || importProgram) {
if (
subsidy ||
importProgram ||
dealer?.evo_return_leasing_dealer === true
) {
$calculation.setValue(
'supplierCurrency',
supplierCurrency?.transactioncurrencyid,
@ -48,24 +53,26 @@ export default function ($calculation: ICalculationStore) {
/**
* @description
* на изменение selectProduct, selectSubsidy или selectImportProgram
если selectSusidy или selectItProgram содержит данные, то selectSupplierCurrency = RUB,
* на изменение selectProduct, selectSubsidy или selectImportProgram или selectDealer
если selectSusidy или selectItProgram содержит данные или в поле selectDealer указан account, у которого evo_return_leasing_dealer = true, то selectSupplierCurrency закрыта для редактирования,
иначе
если selectProduct не содержит данные, то selectSupplierCurrency = RUB, иначе
если (в поле Продукт selectProduct выбрана запись, у которой БУбезНДС evo_sale_without_nds = True),
то selectSupplierCurrency = RUB
иначе без изменения
если selectProduct не содержит данные, то selectSupplierCurrency закрыта для редактирования, иначе
если (в поле Продукт selectProduct выбрана запись, у которой БУбезНДС evo_sale_without_nds = True), то selectSupplierCurrency закрыта для редактирования
иначе selectSupplierCurrency открыто для редактирования
*/
reaction(
() => {
const product = $calculation.getOption('selectProduct');
const { subsidy, importProgram } = $calculation.values;
return { product, subsidy, importProgram };
const dealer = $calculation.getOption('selectDealer');
return { product, subsidy, importProgram, dealer };
},
({ product, subsidy, importProgram }) => {
if (subsidy || importProgram) {
({ product, subsidy, importProgram, dealer }) => {
if (
subsidy ||
importProgram ||
dealer?.evo_return_leasing_dealer === true
) {
$calculation.setStatus(
'selectSupplierCurrency',
ElementStatus.Disabled,

View File

@ -282,8 +282,10 @@ export default function ($calculation: ICalculationStore) {
/**
* @description
* реакция на ПЛ БУ, Субсидию и Продукт
* если ПЛ БУ = Да или Субсидия содержит данные или в Продукте БУбезНДС = Да,
* реакция на ПЛ БУ, Субсидию и Продукт и Салон
* если ПЛ БУ = Да или Субсидия содержит данные
* или в Продукте БУбезНДС = Да,
* или в selectDealer указан account, у которого evo_return_leasing_dealer === true
* то поле Срок поставки = 100 000 000 и закрыто для редактирования, иначе открыто для редактирования
*/
reaction(
@ -291,15 +293,22 @@ export default function ($calculation: ICalculationStore) {
const { leaseObjectUsed } = $calculation.values;
const sudsidy = $calculation.getOption('selectSubsidy');
const product = $calculation.getOption('selectProduct');
const dealer = $calculation.getOption('selectDealer');
return {
leaseObjectUsed,
sudsidy,
product,
dealer,
};
},
({ leaseObjectUsed, sudsidy, product }) => {
if (leaseObjectUsed || sudsidy || product?.evo_sale_without_nds) {
({ leaseObjectUsed, sudsidy, product, dealer }) => {
if (
leaseObjectUsed ||
sudsidy ||
product?.evo_sale_without_nds ||
dealer?.evo_return_leasing_dealer
) {
$calculation.setValue('deliveryTime', 100_000_000);
$calculation.setStatus('radioDeliveryTime', ElementStatus.Disabled);
} else {

View File

@ -0,0 +1,164 @@
import { ICalculationStore } from 'core/types/Calculation/Store';
/**
* Добавить валидацию на кнопку Рассчитать:
если 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
*/
export default function customValidation($calculation: ICalculationStore) {
const dealerRewardSumm = $calculation.getValue('dealerRewardSumm');
const dealerBrokerRewardSumm = $calculation.getValue(
'dealerBrokerRewardSumm',
);
const indAgentRewardSumm = $calculation.getValue('indAgentRewardSumm');
const calcDoubleAgentRewardSumm = $calculation.getValue(
'calcDoubleAgentRewardSumm',
);
const calcBrokerRewardSum = $calculation.getValue('calcBrokerRewardSum');
const finDepartmentRewardSumm = $calculation.getValue(
'finDepartmentRewardSumm',
);
const dealerPerson = $calculation.getValue('dealerPerson');
const dealerBroker = $calculation.getValue('dealerBroker');
const indAgent = $calculation.getValue('indAgent');
const calcDoubleAgent = $calculation.getValue('calcDoubleAgent');
const calcBroker = $calculation.getValue('calcBroker');
const calcFinDepartment = $calculation.getValue('calcFinDepartment');
/**
* В валидацию на кнопку Рассчитать внести изменение:
1) поле selectDealerPerson убрать из списка обязательных для расчета полей
2) добавить валидацию на поле selectDealerPerson :
Если в поле selectDealer указан account, у которого evo_return_leasing_dealer = False (или null) и поле selectDealerPerson = null, то выводить ошибку и поле selectDealerPerson обводить красной рамкой, иначе все ок
*/
const dealer = $calculation.getOption('selectDealer');
const isReturnLeasing = dealer?.evo_return_leasing_dealer;
if (
(dealerRewardSumm > 0 &&
dealerPerson &&
((dealerPerson === dealerBroker && dealerBrokerRewardSumm > 0) ||
(dealerPerson === indAgent && indAgentRewardSumm > 0) ||
(dealerPerson === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
(dealerPerson === calcBroker && calcBrokerRewardSum > 0) ||
(dealerPerson === calcFinDepartment && finDepartmentRewardSumm > 0))) ||
// TODO: последнее условие сделать отдельно
(!isReturnLeasing && !dealerPerson)
) {
$calculation.setValidation('selectDealerPerson', false);
} else {
$calculation.setValidation('selectDealerPerson', undefined);
}
if (
dealerBrokerRewardSumm > 0 &&
dealerBroker &&
((dealerBroker === dealerPerson && dealerRewardSumm > 0) ||
(dealerBroker === indAgent && indAgentRewardSumm > 0) ||
(dealerBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
(dealerBroker === calcBroker && calcBrokerRewardSum > 0) ||
(dealerBroker === calcFinDepartment && finDepartmentRewardSumm > 0))
) {
$calculation.setValidation('selectDealerBroker', false);
} else {
$calculation.setValidation('selectDealerBroker', undefined);
}
if (
indAgentRewardSumm > 0 &&
indAgent &&
((indAgent === dealerPerson && dealerRewardSumm > 0) ||
(indAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
(indAgent === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
(indAgent === calcBroker && calcBrokerRewardSum > 0) ||
(indAgent === calcFinDepartment && finDepartmentRewardSumm > 0))
) {
$calculation.setValidation('selectIndAgent', false);
} else {
$calculation.setValidation('selectIndAgent', undefined);
}
if (
calcDoubleAgentRewardSumm > 0 &&
calcDoubleAgent &&
((calcDoubleAgent === dealerPerson && dealerRewardSumm > 0) ||
(calcDoubleAgent === dealerBroker && dealerBrokerRewardSumm > 0) ||
(calcDoubleAgent === indAgent && indAgentRewardSumm > 0) ||
(calcDoubleAgent === calcBroker && calcBrokerRewardSum > 0) ||
(calcDoubleAgent === calcFinDepartment && finDepartmentRewardSumm > 0))
) {
$calculation.setValidation('selectCalcDoubleAgent', false);
} else {
$calculation.setValidation('selectCalcDoubleAgent', undefined);
}
if (
calcBrokerRewardSum > 0 &&
calcBroker &&
((calcBroker === dealerPerson && dealerRewardSumm > 0) ||
(calcBroker === dealerBroker && dealerBrokerRewardSumm > 0) ||
(calcBroker === indAgent && indAgentRewardSumm > 0) ||
(calcBroker === calcDoubleAgent && calcDoubleAgentRewardSumm > 0) ||
(calcBroker === calcFinDepartment && finDepartmentRewardSumm > 0))
) {
$calculation.setValidation('selectCalcBroker', false);
} else {
$calculation.setValidation('selectCalcBroker', undefined);
}
if (
finDepartmentRewardSumm > 0 &&
calcFinDepartment &&
((calcFinDepartment === dealerPerson && dealerRewardSumm > 0) ||
(calcFinDepartment === dealerBroker && dealerBrokerRewardSumm > 0) ||
(calcFinDepartment === indAgent && indAgentRewardSumm > 0) ||
(calcFinDepartment === calcDoubleAgent &&
calcDoubleAgentRewardSumm > 0) ||
(calcFinDepartment === calcBroker && calcBrokerRewardSum > 0))
) {
$calculation.setValidation('selectCalcFinDepartment', false);
} else {
$calculation.setValidation('selectCalcFinDepartment', undefined);
}
}

View File

@ -145,7 +145,7 @@ const elementsValidations: Partial<
selectModel: CONDITIONS.IS_NULL,
selectLeaseObjectUseFor: CONDITIONS.IS_NULL,
selectDealer: CONDITIONS.IS_NULL,
selectDealerPerson: CONDITIONS.IS_NULL,
// selectDealerPerson: CONDITIONS.IS_NULL,
selectRegionRegistration: CONDITIONS.IS_NULL,
selectTarif: CONDITIONS.IS_NULL,
// selectRate: VALIDATIONS.IS_NULL,

View File

@ -1,8 +1,10 @@
import { ICalculationStore } from 'core/types/Calculation/Store';
import customValidation from './custom';
import validateElements from './elements';
import validateTables from './tables';
export default function (this: ICalculationStore) {
customValidation(this);
validateElements.call(this);
validateTables.call(this);
}

View File

@ -1,9 +1,10 @@
import { gql } from '@apollo/client';
import { message } from 'antd';
import { resetIns } from 'client/Containers/Calculation/Components/ELT/lib/resetIns';
import { numberElementsProps } from 'client/Containers/Calculation/Elements/props/common';
import {
getTitle,
getValueName
getValueName,
} from 'client/Containers/Calculation/Elements/tools';
import { ElementsNames } from 'client/Containers/Calculation/types/elements';
import { openNotification } from 'client/Elements/Notification';
@ -13,7 +14,7 @@ import {
mainOptionsForQuoteQuery,
quoteQuery,
secondaryOptionsForQuoteQuery,
singleOptionsForQuoteQuery
singleOptionsForQuoteQuery,
} from 'core/services/CrmService/graphql/query/quote';
import { TOptionizedEntity } from 'core/services/CrmService/types/common';
import {
@ -21,7 +22,7 @@ import {
IAccount,
IEvoGraph,
IEvoTown,
IQuote
IQuote,
} from 'core/services/CrmService/types/entities';
import { currentISODate } from 'core/tools/date';
import { NIL } from 'core/tools/uuid';
@ -165,6 +166,7 @@ const loadKpReaction: IReactionEffect = calculationStore => ({
//TODO: refactor
const { indAgent, calcBroker, calcFinDepartment } =
calculationStore.values;
let {
indAgentRewardCondition,
indAgentRewardSumm,
@ -199,6 +201,85 @@ const loadKpReaction: IReactionEffect = calculationStore => ({
};
// agents
// dealer
let { dealerPerson } = calculationStore.values;
// TODO: сделать запрос на account
const dealer = calculationStore.getOption('selectDealer', {
accountid: quote.evo_supplier_accountid,
});
if (dealer?.evo_return_leasing_dealer) {
calculationStore.setOptions('selectDealerPerson', []);
calculationStore.setValue('dealerPerson', null);
calculationStore.setStatus(
'selectDealerPerson',
ElementStatus.Disabled,
);
} else {
const { selectDealerPerson: dealerPersonOptions } =
await CrmService.getCRMOptions<'selectDealerPerson', IAccount>({
query: gql`
query GetSelectDealerPersonByQuote($dealerId: Uuid!) {
selectDealerPerson: salon_providers(
statecode: 0
salonaccountid: $dealerId
) {
accountid
name
evo_broker_accountid
evo_kpp
evo_inn
}
}
`,
variables: {
dealerId: quote.evo_supplier_accountid,
},
});
const dealer_broker_accountid =
dealerPersonOptions &&
dealerPersonOptions?.length > 0 &&
dealerPersonOptions[0].evo_broker_accountid;
if (dealer_broker_accountid) {
const { selectDealerBroker: dealerBrokerOptions } =
await CrmService.getCRMOptions<'selectDealerBroker', IAccount>({
query: gql`
query GetDealerBrokerByDealerPerson($brokerid: Uuid!) {
selectDealerBroker: account(accountid: $brokerid) {
accountid
name
}
}
`,
variables: {
brokerid: dealer_broker_accountid,
},
});
if (dealerBrokerOptions)
calculationStore.setOptions(
'selectDealerBroker',
dealerBrokerOptions,
);
}
if (dealerPersonOptions?.length) {
calculationStore.setOptions(
'selectDealerPerson',
dealerPersonOptions,
);
dealerPerson = quote.evo_dealer_person_accountid;
calculationStore.setStatus(
'selectDealerPerson',
ElementStatus.Default,
);
}
}
// dealer
// fill insurance table
calculationStore.setTableRows(
'tableInsurance',
@ -601,6 +682,7 @@ const loadKpReaction: IReactionEffect = calculationStore => ({
engineHours,
leasingPeriod,
objectRegistration,
dealerPerson,
};
// check min max number values

View File

@ -44,7 +44,7 @@ const mapKPtoValues: Partial<Record<keyof IQuote | string, ValuesNames>> = {
evo_seats: 'countSeats',
evo_max_speed: 'maxSpeed',
evo_supplier_accountid: 'dealer',
evo_dealer_person_accountid: 'dealerPerson',
// evo_dealer_person_accountid: 'dealerPerson',
evo_dealer_reward_conditionid: 'dealerRewardCondition',
evo_dealer_reward_total: 'dealerRewardSumm',
evo_dealer_broker_accountid: 'dealerBroker',

View File

@ -539,7 +539,7 @@ export default [
const dealer = calculationStore.getOption('selectDealer', {
accountid: dealerId,
});
if (dealer) {
if (dealer && !dealer.evo_return_leasing_dealer) {
CrmService.getCRMOptions<'salon_providers', ISalonProvider>({
query: gql`
query selectDealerPerson(

View File

@ -744,14 +744,13 @@ export default [
const { leaseObjectCategory } = calculationStore.values;
return leaseObjectCategory;
},
effect: (nextLeaseObjectCategory, prevLeaseObjectCategory) => {
effect: leaseObjectCategory => {
if (calculationProcess.hasProcess(Process.LoadKp)) {
return;
}
const nextIsTrailer = nextLeaseObjectCategory === 100000004;
const prevIsTrailer = prevLeaseObjectCategory === 100000004;
const isTrailer = leaseObjectCategory === 100000004;
if (nextIsTrailer) {
if (isTrailer) {
const otherInsuranceCompany =
calculationStore.tables.tableInsurance.options?.insuranceCompany?.find(
x => x.name?.includes('ПРОЧИЕ'),
@ -774,10 +773,6 @@ export default [
value: 0,
status: ElementStatus.Disabled,
},
insured: {
value: 100000000,
status: ElementStatus.Disabled,
},
});
}
} else {
@ -788,15 +783,12 @@ export default [
)({
insuranceCompany: {
filter: insuranceOsagoDefaultFilter,
value: prevIsTrailer ? null : undefined,
value: isTrailer ? null : undefined,
status: ElementStatus.Default,
},
insCost: {
status: ElementStatus.Default,
},
insured: {
status: ElementStatus.Default,
},
});
}
},

View File

@ -1,3 +1,4 @@
import leasebackReactions from 'client/process/agents/leaseback';
import injectBonusesReaction from 'client/process/bonuses/reactions';
import { injectConfiguratorReactions } from 'client/process/configurator/reactions';
import { injectFinGapReactions } from 'client/process/fingap/reactions';
@ -43,6 +44,7 @@ injectUsedWhthVATReactions(CalculationStore);
injectConfiguratorReactions(CalculationStore);
injectSubsidyReactions(CalculationStore);
injectBonusesReaction(CalculationStore);
leasebackReactions(CalculationStore);
whenEffects.map(whenEffectBuilder => {
const whenEffect = whenEffectBuilder(CalculationStore);

View File

@ -34,6 +34,7 @@ query GetMainOptions(
) {
name
accountid
evo_return_leasing_dealer
}
selectGPSBrand: evo_gps_brands(statecode: $statecode) {
evo_name

File diff suppressed because it is too large Load Diff

View File

@ -43,6 +43,7 @@ export interface BaseEntity {
}
export interface IAccount extends BaseEntity {
evo_return_leasing_dealer?: boolean;
name?: string;
accountid?: string;
evo_inn?: string;