From 44050895e36b53fdce5c12900df4af4d3c52c62c Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Tue, 25 May 2021 13:47:11 +0300 Subject: [PATCH] merge release/calc-72_registation-gibdd --- .../Components/Calculation/ELT/index.jsx | 9 +- src/client/Components/Spinner.jsx | 18 +- .../Calculation/Sections/sectionsList.ts | 34 +- src/client/Containers/Calculation/index.jsx | 7 +- .../Calculation/lib/elements/components.ts | 8 + .../lib/elements/computedValues.ts | 1 + .../Calculation/lib/elements/elementsProps.ts | 21 + .../Calculation/lib/elements/titles.ts | 8 + .../Calculation/lib/elements/types.ts | 1 + .../Calculation/lib/elements/values.ts | 7 + .../lib/fetchData/queries/optionsQuery.ts | 20 + src/client/Elements/InputNumber.jsx | 28 +- src/client/Elements/Wrapper.jsx | 13 + src/client/Layout/routes.jsx | 13 +- src/client/hooks/Calculation/useAction.js | 4 +- .../stores/CalculationStore/Data/values.js | 17 +- .../actions/calculate/additionalData.ts | 14 - .../actions/calculate/checkValidation.ts | 12 +- .../actions/calculate/{index.js => index.ts} | 73 ++-- .../Effects/actions/calculate/prepareData.ts | 131 +++--- .../Effects/actions/calculate/results.ts | 64 +-- .../actions/calculate/validate/elements.ts | 106 +++++ .../actions/calculate/validate/index.ts | 8 + .../{validate.ts => validate/tables.ts} | 116 +---- .../actions/{createKP.js => createKP.ts} | 35 +- .../actions/{createLead.js => createLead.ts} | 66 +-- .../CalculationStore/Effects/autorun.ts | 4 - .../CalculationStore/Effects/computed.js | 6 + .../Effects/reactions/gibddReactions.ts | 413 ++++++++++++++++++ .../Effects/reactions/index.ts | 10 +- .../Effects/reactions/loadKpReaction/index.ts | 51 --- .../reactions/loadKpReaction/mapKpToValues.ts | 5 + .../reactions/loadKpReaction/quoteQuery.js | 5 + .../Effects/reactions/otherReactions.ts | 158 ++----- .../Effects/reactions/requestReactions.ts | 3 + .../CalculationStore/config/initialOptions.ts | 71 +++ .../config/initialStatuses.ts | 7 +- .../CalculationStore/config/initialValues.ts | 5 + .../subStores/calculationUrls.ts | 2 +- src/core/constants/urls.js | 1 + src/core/services/1CService/index.js | 3 + src/core/services/1CService/leasingTrial.ts | 23 + src/core/services/CrmService/index.ts | 4 +- src/core/services/CrmService/propsMap.ts | 23 +- src/core/services/CrmService/tools/entity.ts | 17 +- src/core/types/Calculation/Requests.ts | 12 +- src/core/types/Calculation/Responses.ts | 7 +- src/core/types/Calculation/Store/elements.ts | 10 +- src/core/types/Calculation/Store/index.ts | 1 + src/core/types/Calculation/Store/values.ts | 12 +- src/core/types/Entities/crmEntities.ts | 16 + 51 files changed, 1185 insertions(+), 518 deletions(-) create mode 100644 src/client/Elements/Wrapper.jsx delete mode 100644 src/client/stores/CalculationStore/Effects/actions/calculate/additionalData.ts rename src/client/stores/CalculationStore/Effects/actions/calculate/{index.js => index.ts} (60%) create mode 100644 src/client/stores/CalculationStore/Effects/actions/calculate/validate/elements.ts create mode 100644 src/client/stores/CalculationStore/Effects/actions/calculate/validate/index.ts rename src/client/stores/CalculationStore/Effects/actions/calculate/{validate.ts => validate/tables.ts} (58%) rename src/client/stores/CalculationStore/Effects/actions/{createKP.js => createKP.ts} (80%) rename src/client/stores/CalculationStore/Effects/actions/{createLead.js => createLead.ts} (62%) create mode 100644 src/client/stores/CalculationStore/Effects/reactions/gibddReactions.ts create mode 100644 src/core/services/1CService/index.js create mode 100644 src/core/services/1CService/leasingTrial.ts diff --git a/src/client/Components/Calculation/ELT/index.jsx b/src/client/Components/Calculation/ELT/index.jsx index 37f6b02..28e6c2f 100644 --- a/src/client/Components/Calculation/ELT/index.jsx +++ b/src/client/Components/Calculation/ELT/index.jsx @@ -1,6 +1,7 @@ import { Modal } from 'antd'; import { Outlined as SpinnerOutlined } from 'client/Components/Spinner'; import Button from 'client/Elements/Button'; +import { CenterContent } from 'client/Elements/Wrapper'; import { Box } from 'client/UIKit/grid'; import { lazy, Suspense, useState } from 'react'; @@ -32,7 +33,13 @@ const ELT = ({ title }) => { width="max-content" centered > - }> + + + + } + > diff --git a/src/client/Components/Spinner.jsx b/src/client/Components/Spinner.jsx index dba70d7..cf4acd9 100644 --- a/src/client/Components/Spinner.jsx +++ b/src/client/Components/Spinner.jsx @@ -1,21 +1,7 @@ import LoadingOutlined from '@ant-design/icons/lib/icons/LoadingOutlined'; import { Spin } from 'antd'; -import { Flex } from 'client/UIKit/grid'; -const Wrapper = props => ( - - {props.children} - -); - -const Spinner = props => ( - - - -); - -export default Spinner; +export default Spin; const loadingOutlined = ; - -export const Outlined = () => ; +export const Outlined = () => ; diff --git a/src/client/Containers/Calculation/Sections/sectionsList.ts b/src/client/Containers/Calculation/Sections/sectionsList.ts index 5d6a465..e9481fa 100644 --- a/src/client/Containers/Calculation/Sections/sectionsList.ts +++ b/src/client/Containers/Calculation/Sections/sectionsList.ts @@ -317,11 +317,43 @@ const sections: ISection[] = [ title: 'Доп. продукты', groups: [ { + title: 'Регистрация', + blocks: [ + { + elements: [ + 'radioObjectRegistration', + 'selectRegionRegistration', + 'selectTownRegistration', + 'selectObjectRegionRegistration', + 'tbxLeaseObjectYear', + 'tbxLeaseObjectMotorPower', + ], + }, + { + elements: [ + 'radioTypePTS', + 'selectObjectCategoryTax', + 'selectObjectTypeTax', + 'tbxVehicleTaxInYear', + 'tbxVehicleTaxInLeasingPeriod', + ], + }, + ], + }, + { + style: { columnsNumber: 1 }, + blocks: [ + { + elements: ['selectRegistration', 'labelRegistrationDescription'], + }, + ], + }, + { + title: 'Доп. продукты', style: { columnsNumber: 1 }, blocks: [ { elements: [ - 'selectRegistration', 'selectTechnicalCard', 'selectInsNSIB', 'radioRequirementTelematic', diff --git a/src/client/Containers/Calculation/index.jsx b/src/client/Containers/Calculation/index.jsx index 5717e49..e14131b 100644 --- a/src/client/Containers/Calculation/index.jsx +++ b/src/client/Containers/Calculation/index.jsx @@ -1,5 +1,6 @@ import Result from 'client/Components/Result'; import Spinner from 'client/Components/Spinner'; +import { CenterContent } from 'client/Elements/Wrapper'; import { useFetch } from 'client/hooks/Calculation/useFetch'; import { Box, Flex } from 'client/UIKit/grid'; import mq from 'client/UIKit/mq'; @@ -35,7 +36,11 @@ const Calculation = () => { const { isLoading, error } = useFetch({ fetchData }); if (isLoading) { - return ; + return ( + + + + ); } if (error) { diff --git a/src/client/Containers/Calculation/lib/elements/components.ts b/src/client/Containers/Calculation/lib/elements/components.ts index f02d322..c342466 100644 --- a/src/client/Containers/Calculation/lib/elements/components.ts +++ b/src/client/Containers/Calculation/lib/elements/components.ts @@ -162,6 +162,14 @@ const elementsComponents: TElements = { radioCalcType: Radio, tbxTotalPayments: InputNumber, componentElt: ELT, + radioObjectRegistration: Radio, + selectObjectRegionRegistration: Select, + tbxVehicleTaxInYear: InputNumber, + tbxVehicleTaxInLeasingPeriod: InputNumber, + selectObjectCategoryTax: Select, + selectObjectTypeTax: Select, + radioTypePTS: Radio, + labelRegistrationDescription: Label, }; const tablesComponents: StoreTables = { diff --git a/src/client/Containers/Calculation/lib/elements/computedValues.ts b/src/client/Containers/Calculation/lib/elements/computedValues.ts index c82db2c..e6bd180 100644 --- a/src/client/Containers/Calculation/lib/elements/computedValues.ts +++ b/src/client/Containers/Calculation/lib/elements/computedValues.ts @@ -5,6 +5,7 @@ const elementsComputedValues: TElements = { labelLeaseObjectRisk: 'leaseObjectRiskName', tbxInsKaskoPriceLeasePeriod: 'insKaskoPriceLeasePeriod', labelIrrInfo: 'irrInfo', + labelRegistrationDescription: 'registrationDescription', }; export default elementsComputedValues; diff --git a/src/client/Containers/Calculation/lib/elements/elementsProps.ts b/src/client/Containers/Calculation/lib/elements/elementsProps.ts index 255d3da..7ae99df 100644 --- a/src/client/Containers/Calculation/lib/elements/elementsProps.ts +++ b/src/client/Containers/Calculation/lib/elements/elementsProps.ts @@ -339,6 +339,27 @@ const elementsProps: TElements = { componentElt: { title: 'Расчет страховки в ЭЛТ', }, + radioObjectRegistration: { + style: 'button', + }, + radioTypePTS: { + style: 'button', + }, + tbxVehicleTaxInYear: { + min: 0, + step: 100, + max: 9999999, + precision: 2, + }, + tbxVehicleTaxInLeasingPeriod: { + min: 0, + step: 100, + max: 9999999, + precision: 2, + }, + selectObjectRegionRegistration: { + showSearch: true, + }, }; const resultElementsProps: TElements = [ diff --git a/src/client/Containers/Calculation/lib/elements/titles.ts b/src/client/Containers/Calculation/lib/elements/titles.ts index f6584bc..da1c2f8 100644 --- a/src/client/Containers/Calculation/lib/elements/titles.ts +++ b/src/client/Containers/Calculation/lib/elements/titles.ts @@ -125,6 +125,14 @@ export const elementsTitles: TElements = { tbxMileage: 'Пробег, км', radioCalcType: 'Расчет от', tbxTotalPayments: 'Сумма платежей', + radioObjectRegistration: 'На кого регистрируется ТС', + selectObjectRegionRegistration: 'Регион регистрации в ГИБДД', + tbxVehicleTaxInYear: 'Транспортный налог, в год', + tbxVehicleTaxInLeasingPeriod: 'Транспортный налог на срок ДЛ', + selectObjectCategoryTax: 'Категория в соответствии с ТР ТС 018/2011', + selectObjectTypeTax: 'Тип ТС для ТН', + radioTypePTS: 'Тип ПТС', + labelRegistrationDescription: 'Описание регистрации', }; const resultsTitles: TElements = { diff --git a/src/client/Containers/Calculation/lib/elements/types.ts b/src/client/Containers/Calculation/lib/elements/types.ts index 8254285..2df55a2 100644 --- a/src/client/Containers/Calculation/lib/elements/types.ts +++ b/src/client/Containers/Calculation/lib/elements/types.ts @@ -12,6 +12,7 @@ const elementsTypes: TElements = { labelIrrInfo: ElementType.Computed, linkDownloadKp: ElementType.Link, componentElt: ElementType.Custom, + labelRegistrationDescription: ElementType.Computed, }; const tablesTypes: StoreTables = { diff --git a/src/client/Containers/Calculation/lib/elements/values.ts b/src/client/Containers/Calculation/lib/elements/values.ts index 13010ac..8a12aec 100644 --- a/src/client/Containers/Calculation/lib/elements/values.ts +++ b/src/client/Containers/Calculation/lib/elements/values.ts @@ -126,6 +126,13 @@ export const elementsValues: TElements = { tbxMileage: 'mileage', radioCalcType: 'calcType', tbxTotalPayments: 'totalPayments', + radioObjectRegistration: 'objectRegistration', + selectObjectRegionRegistration: 'objectRegionRegistration', + tbxVehicleTaxInYear: 'vehicleTaxInYear', + tbxVehicleTaxInLeasingPeriod: 'vehicleTaxInLeasingPeriod', + selectObjectCategoryTax: 'objectCategoryTax', + selectObjectTypeTax: 'objectTypeTax', + radioTypePTS: 'typePTS', }; const resultElementsValues: TElements = { diff --git a/src/client/Containers/Calculation/lib/fetchData/queries/optionsQuery.ts b/src/client/Containers/Calculation/lib/fetchData/queries/optionsQuery.ts index c74573c..8602bcc 100644 --- a/src/client/Containers/Calculation/lib/fetchData/queries/optionsQuery.ts +++ b/src/client/Containers/Calculation/lib/fetchData/queries/optionsQuery.ts @@ -56,6 +56,8 @@ const query = gql` evo_name evo_regionid evo_fias_id + evo_businessunit_evolution + evo_oktmo } selectAccount: accounts( evo_account_type: $account_account_type @@ -71,6 +73,7 @@ const query = gql` evo_brandid evo_importer_reward_perc evo_importer_reward_rub + evo_vehicle_type } selectProduct: evo_baseproducts( statecode: $statecode @@ -109,6 +112,11 @@ const query = gql` evo_max_period evo_min_period evo_controls_program + evo_towtruck + evo_pts_type + evo_description + evo_gibdd_region + evo_whom_register } selectInsNSIB: evo_addproduct_types( statecode: $statecode @@ -258,6 +266,17 @@ const query = gql` evo_expluatation_period1 evo_expluatation_period2 evo_type_code + evo_category + evo_category_tr + evo_vehicle_type_tax + evo_vehicle_type + } + selectObjectRegionRegistration: evo_regions(statecode: $statecode) { + evo_name + evo_regionid + evo_fias_id + evo_businessunit_evolution + evo_oktmo } } `; @@ -297,6 +316,7 @@ const toOptions = [ 'selectTarif', 'selectRate', 'selectLeaseObjectType', + 'selectObjectRegionRegistration', ]; export default { diff --git a/src/client/Elements/InputNumber.jsx b/src/client/Elements/InputNumber.jsx index 364e666..6629a8b 100644 --- a/src/client/Elements/InputNumber.jsx +++ b/src/client/Elements/InputNumber.jsx @@ -1,5 +1,22 @@ import { Form, InputNumber as AntInputNumber } from 'antd'; +import { Outlined } from 'client/Components/Spinner'; import { ElementStatus } from 'core/types/statuses'; +import styled from 'styled-components'; + +const { Disabled, Loading } = ElementStatus; + +const FormWrapper = styled(Form.Item)` + ${props => + props.withSpinner && + ` + .ant-form-item-control-input-content { + display: grid; + grid-template-columns: 9fr 1fr; + align-items: center; + gap:2px; + } + `} +`; const InputNumber = ({ value, @@ -10,7 +27,11 @@ const InputNumber = ({ ...props }) => { return ( - + { @@ -20,12 +41,13 @@ const InputNumber = ({ } return value; }} - disabled={status === ElementStatus.Disabled} + disabled={[Disabled, Loading].includes(status)} style={styles} onChange={value => setCurrentValue(value)} value={value} /> - + {status === ElementStatus.Loading && } + ); }; diff --git a/src/client/Elements/Wrapper.jsx b/src/client/Elements/Wrapper.jsx new file mode 100644 index 0000000..4d366a5 --- /dev/null +++ b/src/client/Elements/Wrapper.jsx @@ -0,0 +1,13 @@ +import { Flex } from 'client/UIKit/grid'; + +export const CenterContent = props => ( + + {props.children} + +); diff --git a/src/client/Layout/routes.jsx b/src/client/Layout/routes.jsx index 377f63b..e827b50 100644 --- a/src/client/Layout/routes.jsx +++ b/src/client/Layout/routes.jsx @@ -1,11 +1,18 @@ -import paths from 'core/common/paths'; import Spinner from 'client/Components/Spinner'; +import { CenterContent } from 'client/Elements/Wrapper'; +import paths from 'core/common/paths'; +import { container as resolveContainer } from 'core/tools/resolve'; import { Suspense } from 'react'; import { Route, Switch } from 'react-router-dom'; -import { container as resolveContainer } from 'core/tools/resolve'; export default () => ( - }> + + + + } + > {paths.map((path, i) => ( { + const { calculationStore } = useStores(); const action = () => { resolveAction({ storeName: 'CalculationStore', actionName }).then( ({ default: resolvedAction }) => { - resolvedAction(); + resolvedAction.call(calculationStore); }, ); }; diff --git a/src/client/stores/CalculationStore/Data/values.js b/src/client/stores/CalculationStore/Data/values.js index 711d540..4a6375b 100644 --- a/src/client/stores/CalculationStore/Data/values.js +++ b/src/client/stores/CalculationStore/Data/values.js @@ -3,7 +3,7 @@ import initialFilters from 'client/stores/CalculationStore/config/initialFilters import initialOptions from 'client/stores/CalculationStore/config/initialOptions'; import initialStatuses from 'client/stores/CalculationStore/config/initialStatuses'; import initialValues from 'client/stores/CalculationStore/config/initialValues'; -import { isNil, mergeWith } from 'lodash'; +import { isNil, mergeWith, pick } from 'lodash'; const valuesData = { values: initialValues, @@ -17,6 +17,9 @@ const valuesActions = { getValue(sourceValueName) { return this.values[sourceValueName]; }, + getValues(valuesNames) { + return pick(this.values, valuesNames); + }, setValue(sourceValueName, newValue) { this.values[sourceValueName] = newValue; }, @@ -94,8 +97,16 @@ const valuesActions = { getFilter(elementName) { return this.filters[elementName]; }, - setFilter(elementName, filters) { - this.filters[elementName] = filters; + setFilter(elementName, filter) { + const valueName = elementsValues[elementName]; + const value = this.getValue(valueName); + if ( + filter && + !filter(this.getOptions(elementName)).some(x => x.value === value) + ) { + this.setValue(valueName, null); + } + this.filters[elementName] = filter; }, // applyFilters(filters) { // this.filters = { ...this.filters, ...filters }; diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/additionalData.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/additionalData.ts deleted file mode 100644 index a43631a..0000000 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/additionalData.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ICalculationStore } from 'core/types/Calculation/Store/index'; -export default ({ - calculationStore, -}: { - calculationStore: ICalculationStore; -}): any => { - const tarif = calculationStore.getOption('selectTarif'); - if (tarif) { - return { - minCashflowMSFONominal: tarif.evo_min_irr, - maxCashflowMSFONominal: tarif.evo_max_irr, - }; - } -}; diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/checkValidation.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/checkValidation.ts index 4359f3d..69d21f5 100644 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/checkValidation.ts +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/checkValidation.ts @@ -1,14 +1,14 @@ import elementsTitles, { - tablesTitles + tablesTitles, } from 'client/Containers/Calculation/lib/elements/titles'; -import CalculationStore from 'client/stores/CalculationStore'; +import { ICalculationStore } from 'core/types/Calculation/Store'; import { TableNames } from 'core/types/Calculation/Store/tables'; import { omit } from 'lodash'; import { toJS } from 'mobx'; -export default () => { +export default function (this: ICalculationStore) { const invalidElements: string[] = []; - const { validations: storeValidations } = CalculationStore; + const { validations: storeValidations } = this; const validations = toJS(storeValidations); Object.keys(validations).forEach(elementName => { if (validations[elementName] === false) { @@ -17,7 +17,7 @@ export default () => { }); const invalidTables: string[] = []; - const { tables: storeTables } = CalculationStore; + const { tables: storeTables } = this; const tables = omit(toJS(storeTables), tablesExclusion); Object.keys(tables).forEach(tableName => { if ( @@ -32,6 +32,6 @@ export default () => { }); return { invalidElements, invalidTables }; -}; +} const tablesExclusion: TableNames[] = ['tableResults']; diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/index.js b/src/client/stores/CalculationStore/Effects/actions/calculate/index.ts similarity index 60% rename from src/client/stores/CalculationStore/Effects/actions/calculate/index.js rename to src/client/stores/CalculationStore/Effects/actions/calculate/index.ts index 45458bc..731aa37 100644 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/index.js +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/index.ts @@ -1,40 +1,39 @@ import { message } from 'antd'; import { openNotification } from 'client/Elements/Notification'; import CalculationService from 'core/services/CalculationService'; +import { ICalculationStore } from 'core/types/Calculation/Store'; import { resultsValues } from 'core/types/Calculation/Store/values'; import { ElementStatus } from 'core/types/statuses'; -import CalculationStore from '../../..'; -import getAdditionalData from './additionalData'; import checkValidation from './checkValidation'; import prepareCalculationData from './prepareData'; import results from './results'; import validate from './validate'; -const cleanResults = () => { - for (let resultValue of resultsValues) { - CalculationStore.setValue(resultValue, ''); - } -}; - const BUTTONS_TIMEOUT = 500; -function blockButtons() { - CalculationStore.setStatus('btnCreateKP', ElementStatus.Loading); - CalculationStore.setStatus('btnCalculate', ElementStatus.Loading); -} +export default function (this: ICalculationStore) { + const cleanResults = () => { + for (let resultValue of resultsValues) { + this.setValue(resultValue, ''); + } + }; -function unlockButtons() { - setTimeout(() => { - CalculationStore.setStatus('btnCreateKP', ElementStatus.Default); - }, BUTTONS_TIMEOUT); - setTimeout(() => { - CalculationStore.setStatus('btnCalculate', ElementStatus.Default); - }, BUTTONS_TIMEOUT); -} + const blockButtons = () => { + this.setStatus('btnCreateKP', ElementStatus.Loading); + this.setStatus('btnCalculate', ElementStatus.Loading); + }; -export default async () => { - validate(); - const { invalidElements, invalidTables } = checkValidation(); + const unlockButtons = () => { + setTimeout(() => { + this.setStatus('btnCreateKP', ElementStatus.Default); + }, BUTTONS_TIMEOUT); + setTimeout(() => { + this.setStatus('btnCalculate', ElementStatus.Default); + }, BUTTONS_TIMEOUT); + }; + + validate.call(this); + const { invalidElements, invalidTables } = checkValidation.call(this); if (invalidElements.length > 0 || invalidTables.length > 0) { if (invalidElements.length > 0) openNotification({ @@ -56,17 +55,23 @@ export default async () => { blockButtons(); - var preparedData = prepareCalculationData({ - calculationStore: CalculationStore, - }); + var preparedData = prepareCalculationData.call(this); console.log('preparedData', preparedData); - var additionalData = getAdditionalData({ - calculationStore: CalculationStore, - }); + const getAdditionalData = () => { + const tarif = this.getOption('selectTarif'); + if (tarif) { + return { + minCashflowMSFONominal: tarif.evo_min_irr, + maxCashflowMSFONominal: tarif.evo_max_irr, + }; + } + }; + + var additionalData = getAdditionalData.call(this); console.log('additionalData', additionalData); - CalculationStore.cleanTable('tableResults'); + this.cleanTable('tableResults'); cleanResults(); return CalculationService.calculate( @@ -79,9 +84,9 @@ export default async () => { content: 'Расчет завершен успешно!', }); - results.showResultsTable(preparedData, res); - results.showResults(preparedData, res); - results.setResValues(res); + results.showResultsTable.call(this, preparedData, res); + results.showResults.call(this, preparedData, res); + results.setResValues.call(this, res); return Object.assign(preparedData, res); }) @@ -102,4 +107,4 @@ export default async () => { .finally(() => { unlockButtons(); }); -}; +} diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/prepareData.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/prepareData.ts index 3098d35..65a4d48 100644 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/prepareData.ts +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/prepareData.ts @@ -6,12 +6,8 @@ import { ICalculationStore } from 'core/types/Calculation/Store'; import NIL from 'uuid/dist/nil'; import { convertPrice } from '../../lib/tools'; -export default ({ - calculationStore, -}: { - calculationStore: ICalculationStore; -}): IPreparedData => { - const { values, options, tables } = calculationStore; +export default function (this: ICalculationStore): IPreparedData { + const { values, options, tables } = this; const preparedPaymentsRows: PaymentRow[] = Array.from( { length: values.leasingPeriod }, @@ -125,10 +121,11 @@ export default ({ preparedValues.carCarrying = values.maxMass; preparedValues.bonus = (values.saleBonus as number) / 100; preparedValues.bonusFix = 0; - preparedValues.transTax = 0; - preparedValues.transIncludeGr = false; - preparedValues.transportTaxGrYear = 0; - preparedValues.transportTaxGr = 0; + + preparedValues.transTax = values.vehicleTaxInYear; + preparedValues.transIncludeGr = values.vehicleTaxInYear > 0; + preparedValues.transportTaxGrYear = values.vehicleTaxInYear; + preparedValues.transportTaxGr = values.vehicleTaxInLeasingPeriod; const insuranceKaskoRow = tables.tableInsurance.rows.find( x => x.policyType?.value === 'КАСКО', @@ -177,16 +174,14 @@ export default ({ preparedValues.repayment = 0.25; if (values.firstPaymentPerc < 30) { - const evo_coefficient_season = calculationStore - .getStaticData('evo_coefficient') - .filter( - x => - x.evo_corfficient_type === 100000000 && - x.evo_min_period && - x.evo_min_period <= values.leasingPeriod && - x.evo_max_period && - x.evo_max_period >= values.leasingPeriod, - ); + const evo_coefficient_season = this.getStaticData('evo_coefficient').filter( + x => + x.evo_corfficient_type === 100000000 && + x.evo_min_period && + x.evo_min_period <= values.leasingPeriod && + x.evo_max_period && + x.evo_max_period >= values.leasingPeriod, + ); switch (values.graphType) { case 100000003: if (evo_coefficient_season && evo_coefficient_season.length > 0) { @@ -231,9 +226,7 @@ export default ({ x => x.transactioncurrencyid === values.supplierCurrency, ); - const evo_currencychanges = calculationStore.getStaticData( - 'evo_currencychange', - ); + const evo_currencychanges = this.getStaticData('evo_currencychange'); const evo_currencychange = evo_currencychanges.find( x => x.evo_ref_transactioncurrency === values.supplierCurrency, ); @@ -290,12 +283,10 @@ export default ({ (values.importerRewardPerc / 100) * preparedValues.acceptSum; } - const evo_coefficient_bonuses = calculationStore - .getStaticData('evo_coefficient') - .filter( - x => x.evo_corfficient_type === 100000002 && x.evo_sot_coefficient_typeid, - ); - const systemuser = calculationStore.getStaticData('systemuser')[0]; + const evo_coefficient_bonuses = this.getStaticData('evo_coefficient').filter( + x => x.evo_corfficient_type === 100000002 && x.evo_sot_coefficient_typeid, + ); + const systemuser = this.getStaticData('systemuser')[0]; if ( evo_coefficient_bonuses && @@ -303,9 +294,9 @@ export default ({ systemuser && !Array.isArray(systemuser) ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'EXTRA_BONUS'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'EXTRA_BONUS'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -324,9 +315,9 @@ export default ({ evo_coefficient_bonuses.length > 0 && systemuser ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'DIRECTOR_BONUS'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'DIRECTOR_BONUS'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -344,9 +335,9 @@ export default ({ evo_coefficient_bonuses.length > 0 && systemuser ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'MARKET_RATE'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'MARKET_RATE'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -367,9 +358,9 @@ export default ({ evo_coefficient_bonuses.length > 0 && systemuser ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'DISTRICT_RATE'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'DISTRICT_RATE'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -390,9 +381,9 @@ export default ({ evo_coefficient_bonuses.length > 0 && systemuser ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'SALARY_RATE'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'SALARY_RATE'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -442,7 +433,7 @@ export default ({ (preparedValues.registration || 0) + (preparedValues.trackerCost || 0) + (preparedValues.tLMCost || 0) + - preparedValues.transportTaxGr + + (preparedValues.transportTaxGr || 0) + (preparedValues.tlmCostPaymentSum || 0) + (preparedValues.gpsCostPaymentSum || 0)) * preparedValues.leasing0K - @@ -480,9 +471,9 @@ export default ({ systemuser && !Array.isArray(systemuser) ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'BONUS_RAT_PR'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'BONUS_RAT_PR'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -503,9 +494,9 @@ export default ({ systemuser && !Array.isArray(systemuser) ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'BONUS_NSIB_PR'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'BONUS_NSIB_PR'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -527,9 +518,9 @@ export default ({ systemuser && !Array.isArray(systemuser) ) { - const evo_sot_coefficient_type = calculationStore - .getStaticData('evo_sot_coefficient_type') - .find(x => x.evo_id === 'BONUS_NS_PR'); + const evo_sot_coefficient_type = this.getStaticData( + 'evo_sot_coefficient_type', + ).find(x => x.evo_id === 'BONUS_NS_PR'); const evo_coefficient = evo_coefficient_bonuses.find( x => @@ -554,22 +545,20 @@ export default ({ preparedValues.irr_MSFO_Plan = (tarif.evo_irr_plan || 0) / 100; } - const evo_coefficient_risk = calculationStore - .getStaticData('evo_coefficient') - ?.find( - x => - x.evo_corfficient_type === 100000001 && - x.evo_min_period && - x.evo_min_period <= values.leasingPeriod && - x.evo_max_period && - x.evo_max_period >= values.leasingPeriod, - // x.evo_client_riskid === values.clientRisk, - // x.evo_leasingobject_types && - // x.evo_leasingobject_types.length > 0 && - // x.evo_leasingobject_types.filter( - // z => z.evo_leasingobject_typeid === values.leaseObjectType, - // ).length > 0, - ); + const evo_coefficient_risk = this.getStaticData('evo_coefficient')?.find( + x => + x.evo_corfficient_type === 100000001 && + x.evo_min_period && + x.evo_min_period <= values.leasingPeriod && + x.evo_max_period && + x.evo_max_period >= values.leasingPeriod, + // x.evo_client_riskid === values.clientRisk, + // x.evo_leasingobject_types && + // x.evo_leasingobject_types.length > 0 && + // x.evo_leasingobject_types.filter( + // z => z.evo_leasingobject_typeid === values.leaseObjectType, + // ).length > 0, + ); if (evo_coefficient_risk) preparedValues.npvniDelta = evo_coefficient_risk.evo_risk_delta || 0; @@ -619,4 +608,4 @@ export default ({ preparedPayments: { rows: preparedPaymentsRows }, preparedValues, }; -}; +} diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/results.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/results.ts index 8bd2bbb..112f565 100644 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/results.ts +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/results.ts @@ -1,14 +1,15 @@ -import CalculationStore from 'client/stores/CalculationStore'; import valuesConstants from 'core/constants/values'; import { IPreparedData } from 'core/types/Calculation/Requests'; import { IGetCalculationResponse } from 'core/types/Calculation/Responses'; +import { ICalculationStore } from 'core/types/Calculation/Store'; import { ITableCell, TableProps } from 'core/types/Calculation/Store/tables'; export default { - showResultsTable: ( + showResultsTable: function ( + this: ICalculationStore, preparedData: IPreparedData, res: IGetCalculationResponse, - ) => { + ) { if (preparedData.preparedValues.nmper) { const { sumWithVatColumn, vatColumn, sumRepaymentColumn } = res.columns; const results: TableProps[] = []; @@ -23,45 +24,46 @@ export default { }); } //TODO: speed up table render - CalculationStore.setTableRows('tableResults', 0)(results); + this.setTableRows('tableResults', 0)(results); } }, - showResults: (preparedData: IPreparedData, res: IGetCalculationResponse) => { + showResults: function ( + this: ICalculationStore, + preparedData: IPreparedData, + res: IGetCalculationResponse, + ) { const { sumWithVatColumn } = res.columns; - CalculationStore.setValue( - 'resultTotalGraphwithNDS', - sumWithVatColumn?.values[0] || 0, - ); - CalculationStore.setValue( + this.setValue('resultTotalGraphwithNDS', sumWithVatColumn?.values[0] || 0); + this.setValue( 'resultPlPrice', (preparedData?.preparedValues?.acceptSum || 0) * (1 + valuesConstants.VAT), ); - CalculationStore.setValue( + this.setValue( 'resultPriceUpPr', (res?.postValues?.priceUP_Year_PR || 0) * 100, ); - CalculationStore.setValue( + this.setValue( 'resultIRRGraphPerc', (res?.columns?.cashflowColumn?.irr || 0) * 100, ); - CalculationStore.setValue( + this.setValue( 'resultIRRNominalPerc', (res?.columns?.cashflowMsfoColumn?.nominal || 0) * 100, ); - CalculationStore.setValue( + this.setValue( 'resultInsKasko', preparedData?.preparedValues?.insuranceKasko || 0, ); - CalculationStore.setValue( + this.setValue( 'resultInsOsago', preparedData?.preparedValues?.insuranceOsago || 0, ); - CalculationStore.setValue( + this.setValue( 'resultInsOsago', preparedData?.preparedValues?.insuranceOsago || 0, ); - CalculationStore.setValue( + this.setValue( 'resultDopProdSum', (preparedData?.preparedValues?.rats || 0) + (preparedData?.preparedValues?.registration || 0) + @@ -69,29 +71,26 @@ export default { (preparedData?.preparedValues?.tLMCost || 0) + (preparedData?.preparedValues?.nsibBrutto || 0), ); - CalculationStore.setValue( + this.setValue( 'resultFirstPayment', (preparedData?.preparedValues?.firstPaymentSum || 0) * (1 + valuesConstants.VAT), ); - CalculationStore.setValue( + this.setValue( 'resultLastPayment', (preparedData?.preparedValues?.lastPaymentSum || 0) * (1 + valuesConstants.VAT), ); - CalculationStore.setValue( - 'resultTerm', - preparedData?.preparedValues?.nmper || '', - ); - CalculationStore.setValue( + this.setValue('resultTerm', preparedData?.preparedValues?.nmper || ''); + this.setValue( 'resultAB_FL', (((preparedData?.preparedValues?.agentsSum || 0) + (preparedData?.preparedValues?.doubleAgentsSum || 0)) / valuesConstants.ESN) * (1 - valuesConstants.NDFL), ); - CalculationStore.setValue( + this.setValue( 'resultAB_UL', ((preparedData?.preparedValues?.deliverySum || 0) + (preparedData?.preparedValues?.brokerSum || 0) + @@ -99,7 +98,7 @@ export default { (preparedData?.preparedValues?.financialDeptOfDeliverySum || 0)) * (1 + valuesConstants.VAT), ); - CalculationStore.setValue( + this.setValue( 'resultBonusMPL', Math.abs( ((res?.columns?.npvBonusExpensesColumn?.values[2] || 0) / @@ -107,7 +106,7 @@ export default { (1 - valuesConstants.NDFL), ), ); - CalculationStore.setValue( + this.setValue( 'resultDopMPLLeasing', Math.abs( ((res?.columns?.extraBonusSumColumn?.values[2] || 0) / @@ -115,7 +114,7 @@ export default { (1 - valuesConstants.NDFL), ), ); - CalculationStore.setValue( + this.setValue( 'resultBonusDopProd', Math.abs( ((res?.columns?.npvBonusExpensesColumn?.values[1] || 0) / @@ -124,12 +123,15 @@ export default { ), ); }, - setResValues: (res: IGetCalculationResponse) => { - CalculationStore.setValue( + setResValues: function ( + this: ICalculationStore, + res: IGetCalculationResponse, + ) { + this.setValue( 'IRR_Perc', (res?.columns?.cashflowMsfoColumn?.nominal || 0) * 100, ); - CalculationStore.setValue( + this.setValue( 'totalPayments', res?.columns?.sumWithVatColumn?.values[0] || 0, ); diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/validate/elements.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/elements.ts new file mode 100644 index 0000000..298ce8c --- /dev/null +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/elements.ts @@ -0,0 +1,106 @@ +import { elementsValues } from 'client/Containers/Calculation/lib/elements/values'; +import { ICalculationStore } from 'core/types/Calculation/Store'; +import { TElements } from 'core/types/Calculation/Store/elements'; + +const CONDITIONS = { + IS_NULL: value => value === undefined || value === null, + LESS_ZERO: value => value < 0, + LESS_OR_EQUALS_ZERO: value => value <= 0, +}; + +const CUSTOM_CONDITIONS: TElements< + (calculationStore: ICalculationStore) => boolean +> = { + selectLeaseObjectCategory: calculationStore => { + return ( + calculationStore.values['selectLeaseObjectCategory'] && + ['6', '9', '10'].includes( + calculationStore.getOption('selectLeaseObjectType')?.evo_id || '', + ) + ); + }, + selectQuote: calculationStore => { + const quote = calculationStore.getValue('quote'); + return ( + calculationStore.getValue('recalcWithRevision') === true && + !CONDITIONS.IS_NULL(quote) + ); + }, + tbxVehicleTaxInYear: calculationStore => { + const objectRegistration = calculationStore.getValue('objectRegistration'); + if (objectRegistration === 100000001) { + const vehicleTaxInYear = calculationStore.getValue('vehicleTaxInYear'); + return CONDITIONS.LESS_OR_EQUALS_ZERO(vehicleTaxInYear); + } + return true; + }, + radioTypePTS: calculationStore => { + const objectRegistration = calculationStore.getValue('objectRegistration'); + if (objectRegistration === 100000001) { + const typePTS = calculationStore.getValue('typePTS'); + return CONDITIONS.IS_NULL(typePTS); + } + return true; + }, + selectObjectRegionRegistration: calculationStore => { + const objectRegistration = calculationStore.getValue('objectRegistration'); + if (objectRegistration === 100000001) { + const objectRegionRegistration = calculationStore.getValue( + 'objectRegionRegistration', + ); + return CONDITIONS.IS_NULL(objectRegionRegistration); + } + return true; + }, +}; + +const elementsValidations: TElements = { + selectLead: CONDITIONS.IS_NULL, + selectProduct: CONDITIONS.IS_NULL, + selectSupplierCurrency: CONDITIONS.IS_NULL, + selectLeaseObjectType: CONDITIONS.IS_NULL, + selectBrand: CONDITIONS.IS_NULL, + selectModel: CONDITIONS.IS_NULL, + selectLeaseObjectUseFor: CONDITIONS.IS_NULL, + selectDealer: CONDITIONS.IS_NULL, + selectDealerPerson: CONDITIONS.IS_NULL, + selectRegionRegistration: CONDITIONS.IS_NULL, + selectTownRegistration: CONDITIONS.IS_NULL, + selectTarif: CONDITIONS.IS_NULL, + // selectRate: VALIDATIONS.IS_NULL, + selectRegistration: CONDITIONS.IS_NULL, + selectLeaseObjectCategory: CUSTOM_CONDITIONS.selectLeaseObjectCategory, + // selectSeasonType: valueName => + // CalculationStore.getValue('graphType') === 100000003 && + // VALIDATIONS.IS_NULL(valueName), + // selectHighSeasonStart: valueName => + // CalculationStore.getValue('graphType') === 100000003 && + // VALIDATIONS.IS_NULL(valueName), + tbxLeaseObjectPrice: CONDITIONS.LESS_OR_EQUALS_ZERO, + // tbxLastPaymentPerc: VALIDATIONS.IS_NULL, + // tbxLastPaymentRub: VALIDATIONS.IS_NULL, + // tbxFirstPaymentPerc: VALIDATIONS.IS_NULL, + // tbxFirstPaymentRub: VALIDATIONS.IS_NULL, + tbxLeaseObjectCount: CONDITIONS.LESS_OR_EQUALS_ZERO, + selectQuote: CUSTOM_CONDITIONS.selectQuote, + tbxVehicleTaxInYear: CUSTOM_CONDITIONS.tbxVehicleTaxInYear, + radioTypePTS: CUSTOM_CONDITIONS.radioTypePTS, + selectObjectRegionRegistration: + CUSTOM_CONDITIONS.selectObjectRegionRegistration, +}; + +export default function (this: ICalculationStore) { + Object.keys(elementsValidations).forEach(elementName => { + const valueName = elementsValues[elementName]; + const value = this.getValue(valueName); + const condition = elementsValidations[elementName]; + let conditionRes; + if (Object.keys(CUSTOM_CONDITIONS).includes(elementName)) { + conditionRes = condition(this); + } else { + conditionRes = condition(value); + } + //@ts-ignore + this.setValidation(elementName, !conditionRes); + }); +} diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/validate/index.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/index.ts new file mode 100644 index 0000000..907029c --- /dev/null +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/index.ts @@ -0,0 +1,8 @@ +import { ICalculationStore } from 'core/types/Calculation/Store'; +import validateElements from './elements'; +import validateTables from './tables'; + +export default function (this: ICalculationStore) { + validateElements.call(this); + validateTables.call(this); +} diff --git a/src/client/stores/CalculationStore/Effects/actions/calculate/validate.ts b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/tables.ts similarity index 58% rename from src/client/stores/CalculationStore/Effects/actions/calculate/validate.ts rename to src/client/stores/CalculationStore/Effects/actions/calculate/validate/tables.ts index b91f34d..7949f12 100644 --- a/src/client/stores/CalculationStore/Effects/actions/calculate/validate.ts +++ b/src/client/stores/CalculationStore/Effects/actions/calculate/validate/tables.ts @@ -1,78 +1,11 @@ -import { elementsValues } from 'client/Containers/Calculation/lib/elements/values'; import valuesConstants from 'core/constants/values'; import { shiftRight } from 'core/tools/array'; -import { TElements } from 'core/types/Calculation/Store/elements'; +import { ICalculationStore } from 'core/types/Calculation/Store'; import { isEqual, isNil } from 'lodash'; -import CalculationStore from '../../..'; const { PERIODS_NUMBER } = valuesConstants; -const VALIDATIONS = { - IS_NULL: valueName => - CalculationStore.getValue(valueName) === undefined || - CalculationStore.getValue(valueName) === null, - LESS_ZERO: valueName => CalculationStore.getValue(valueName) < 0, - LESS_OR_EQUALS_ZERO: valueName => CalculationStore.getValue(valueName) <= 0, -}; - -const elementsValidations: TElements = { - selectLead: VALIDATIONS.IS_NULL, - selectProduct: VALIDATIONS.IS_NULL, - selectSupplierCurrency: VALIDATIONS.IS_NULL, - selectLeaseObjectType: VALIDATIONS.IS_NULL, - selectBrand: VALIDATIONS.IS_NULL, - selectModel: VALIDATIONS.IS_NULL, - selectLeaseObjectUseFor: VALIDATIONS.IS_NULL, - selectDealer: VALIDATIONS.IS_NULL, - selectDealerPerson: VALIDATIONS.IS_NULL, - selectRegionRegistration: VALIDATIONS.IS_NULL, - selectTownRegistration: VALIDATIONS.IS_NULL, - selectTarif: VALIDATIONS.IS_NULL, - // selectRate: VALIDATIONS.IS_NULL, - selectRegistration: VALIDATIONS.IS_NULL, - selectLeaseObjectCategory: valueName => { - return ( - !CalculationStore.values[valueName] && - !['6', '9', '10'].includes( - CalculationStore.getOption('selectLeaseObjectType')?.evo_id || '', - ) - ); - }, - // selectSeasonType: valueName => - // CalculationStore.getValue('graphType') === 100000003 && - // VALIDATIONS.IS_NULL(valueName), - // selectHighSeasonStart: valueName => - // CalculationStore.getValue('graphType') === 100000003 && - // VALIDATIONS.IS_NULL(valueName), - tbxLeaseObjectPrice: VALIDATIONS.LESS_OR_EQUALS_ZERO, - // tbxLastPaymentPerc: VALIDATIONS.IS_NULL, - // tbxLastPaymentRub: VALIDATIONS.IS_NULL, - // tbxFirstPaymentPerc: VALIDATIONS.IS_NULL, - // tbxFirstPaymentRub: VALIDATIONS.IS_NULL, - tbxLeaseObjectCount: VALIDATIONS.LESS_OR_EQUALS_ZERO, - selectQuote: valueName => - CalculationStore.getValue('recalcWithRevision') === true && - VALIDATIONS.IS_NULL(valueName), -}; - -const validateElement = (elementName, condition) => { - if (condition) { - CalculationStore.setValidation(elementName, false); - } else { - CalculationStore.setValidation(elementName, true); - } -}; - -const validateElements = () => { - Object.keys(elementsValidations).forEach(elementName => { - validateElement( - elementName, - elementsValidations[elementName](elementsValues[elementName]), - ); - }); -}; - -const validateInsuranceTable = () => { - const tableInsurance = CalculationStore.tables.tableInsurance; +function validateInsuranceTable(this: ICalculationStore) { + const tableInsurance = this.tables.tableInsurance; const kaskoRowIndex = tableInsurance.rows.findIndex( x => x.policyType?.value === 'КАСКО', @@ -81,7 +14,7 @@ const validateInsuranceTable = () => { x => x.policyType?.value === 'ОСАГО', ); - CalculationStore.setTableRows( + this.setTableRows( 'tableInsurance', 0, )([ @@ -106,14 +39,14 @@ const validateInsuranceTable = () => { }, }, ]); -}; +} -const validatePaymentsTable = () => { - const { graphType } = CalculationStore.values; - const payments = CalculationStore.tables.tablePayments.rows.map( +function validatePaymentsTable(this: ICalculationStore) { + const { graphType } = this.values; + const payments = this.tables.tablePayments.rows.map( x => x.paymentRelation?.value, ); - const rows = CalculationStore.tables.tablePayments.rows; + const rows = this.tables.tablePayments.rows; const isValidRows = () => !rows.some(x => x.paymentRelation?.validation === false); @@ -123,7 +56,7 @@ const validatePaymentsTable = () => { const areMiddleRowsEqual = new Set(payments.slice(1, payments.length - 1)).size === 1; - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 1, )( @@ -141,7 +74,7 @@ const validatePaymentsTable = () => { const max = Math.max(...target_payments); const areInvalidRows = max - min > 10; - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 1, )( @@ -168,7 +101,7 @@ const validatePaymentsTable = () => { } }); - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 2, )( @@ -184,7 +117,7 @@ const validatePaymentsTable = () => { payments.forEach((x, i) => { if (i > 1 && i < rows.length - 1) { const isInvalidValue = x > payments[i - 1] || x < 3; - CalculationStore.setTableRow( + this.setTableRow( 'tablePayments', i, )({ @@ -200,18 +133,18 @@ const validatePaymentsTable = () => { } case 100000003: { - const { highSeasonStart: highSeasonStartId } = CalculationStore.values; + const { highSeasonStart: highSeasonStartId } = this.values; if (!highSeasonStartId) { return; } const highSeasonStart = parseInt( - CalculationStore.getOption('selectHighSeasonStart')?.name || '2', + this.getOption('selectHighSeasonStart')?.name || '2', ); const shiftNumber = highSeasonStart - 2; const middleRows = payments.slice(1, PERIODS_NUMBER + 1); const unshiftedMiddleRows = shiftRight(middleRows, shiftNumber); - const seasonTypeOptions = CalculationStore.getOption('selectSeasonType'); + const seasonTypeOptions = this.getOption('selectSeasonType'); if (!seasonTypeOptions) { return; } @@ -228,7 +161,7 @@ const validatePaymentsTable = () => { stepsValues, [...stepsValues].sort((a, b) => b - a), ); - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 1, )( @@ -244,7 +177,7 @@ const validatePaymentsTable = () => { case 100000004: { const targetRows = payments.slice(1, 4); const areEqual3MiddleRows = new Set(targetRows).size === 1; - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 1, )( @@ -260,7 +193,7 @@ const validatePaymentsTable = () => { targetRows.slice(0).sort((a, b) => a - b), targetRows, ); - CalculationStore.setTableRows( + this.setTableRows( 'tablePayments', 1, )( @@ -274,10 +207,9 @@ const validatePaymentsTable = () => { break; } } -}; +} -export default () => { - validateElements(); - validateInsuranceTable(); - validatePaymentsTable(); -}; +export default function (this: ICalculationStore) { + validateInsuranceTable.call(this); + validatePaymentsTable.call(this); +} diff --git a/src/client/stores/CalculationStore/Effects/actions/createKP.js b/src/client/stores/CalculationStore/Effects/actions/createKP.ts similarity index 80% rename from src/client/stores/CalculationStore/Effects/actions/createKP.js rename to src/client/stores/CalculationStore/Effects/actions/createKP.ts index 441d97d..d6f376b 100644 --- a/src/client/stores/CalculationStore/Effects/actions/createKP.js +++ b/src/client/stores/CalculationStore/Effects/actions/createKP.ts @@ -4,16 +4,16 @@ import { openNotification } from 'client/Elements/Notification'; import UserStore from 'client/stores/UserStore'; import { CRM_PROXY_URL } from 'core/constants/urls'; import CrmService from 'core/services/CrmService'; +import { ICalculationStore } from 'core/types/Calculation/Store'; import { toJS } from 'mobx'; -import CalculationStore from '../..'; import customValues from '../lib/customValues'; import { quoteFields } from '../lib/queries'; import calculate from './calculate'; -export default async () => { - const { values, tables } = CalculationStore; - const { calculationUrls } = CalculationStore.stores; - const calculationRes = await calculate(); +export default async function (this: ICalculationStore) { + const { values, tables } = this; + const { calculationUrls } = this.stores; + const calculationRes = await calculate.call(this); if (!calculationRes) { return; @@ -38,14 +38,10 @@ export default async () => { } = calculationRes; const domainname = UserStore.getDomainName(); - // if (process.env.NODE_ENV === 'development') { console.log('domainname', domainname); console.log('values', values); - console.log( - 'insKaskoPriceLeasePeriod', - CalculationStore.insKaskoPriceLeasePeriod(), - ); - // } + //@ts-ignore + console.log('insKaskoPriceLeasePeriod', this.insKaskoPriceLeasePeriod()); CrmService.createKp({ domainName: domainname, @@ -58,7 +54,7 @@ export default async () => { calculationValues: { ...values, insKaskoPriceLeasePeriod: customValues.insKaskoPriceLeasePeriod.call( - CalculationStore, + this, ), }, }, @@ -92,11 +88,12 @@ export default async () => { ), }); } - CalculationStore.setValue('recalcWithRevision', false); - let quotes = toJS(CalculationStore.getOptions('selectQuote')); + this.setValue('recalcWithRevision', false); + let quotes = toJS(this.getOptions('selectQuote')) || []; + //@ts-ignore quotes = [new_quote].concat(quotes); - const { quote: selected_quoteid } = CalculationStore.values; + const { quote: selected_quoteid } = this.values; const { entities: { quote: updated_quote }, } = await CrmService.crmgqlquery({ @@ -113,14 +110,14 @@ export default async () => { toOptions: ['quote'], }); - if (updated_quote) { + if (updated_quote && !Array.isArray(updated_quote)) { const qIndex = quotes.findIndex( quote => quote.quoteid === updated_quote.quoteid, ); - quotes.splice(qIndex, 1, updated_quote); + if (qIndex) quotes.splice(qIndex, 1, updated_quote); } - CalculationStore.setOptions('selectQuote', quotes); + this.setOptions('selectQuote', quotes); } }); }) @@ -134,4 +131,4 @@ export default async () => { throw err.response.data; }); -}; +} diff --git a/src/client/stores/CalculationStore/Effects/actions/createLead.js b/src/client/stores/CalculationStore/Effects/actions/createLead.ts similarity index 62% rename from src/client/stores/CalculationStore/Effects/actions/createLead.js rename to src/client/stores/CalculationStore/Effects/actions/createLead.ts index a59055b..fcc6d72 100644 --- a/src/client/stores/CalculationStore/Effects/actions/createLead.js +++ b/src/client/stores/CalculationStore/Effects/actions/createLead.ts @@ -1,7 +1,7 @@ import { openNotification } from 'client/Elements/Notification'; -import CalculationStore from '../..'; +import { ICalculationStore } from 'core/types/Calculation/Store'; -export default () => { +export default function (this: ICalculationStore) { const { contactClient, contact, @@ -9,10 +9,10 @@ export default () => { account, commentLead, phoneNumber, - } = CalculationStore.values; + } = this.values; if (!contactClient && !contact) { - CalculationStore.setValidation('selectContactClient', false); - CalculationStore.setValidation('tbxContact', false); + this.setValidation('selectContactClient', false); + this.setValidation('tbxContact', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -20,8 +20,8 @@ export default () => { })(); } if (!newClient && !account) { - CalculationStore.setValidation('tbxNewClient', false); - CalculationStore.setValidation('selectAccount', false); + this.setValidation('tbxNewClient', false); + this.setValidation('selectAccount', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -29,7 +29,7 @@ export default () => { })(); } if (!commentLead) { - CalculationStore.setValidation('tbxCommentLead', false); + this.setValidation('tbxCommentLead', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -37,7 +37,7 @@ export default () => { })(); } if (contact && !phoneNumber) { - CalculationStore.setValidation('tbxPhoneNumber', false); + this.setValidation('tbxPhoneNumber', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -45,22 +45,22 @@ export default () => { })(); } - const { channel } = CalculationStore.values; + const { channel } = this.values; if (!channel) { - CalculationStore.setValidation('selectChannel', false); + this.setValidation('selectChannel', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', description: 'Не указан канал привлечения', })(); } else { - const { supplier, agent, finDepartment, broker } = CalculationStore.values; + const { supplier, agent, finDepartment, broker } = this.values; switch (channel) { case 100000000: { - CalculationStore.setValidation('selectFinDepartment', true); - CalculationStore.setValidation('selectBroker', true); + this.setValidation('selectFinDepartment', true); + this.setValidation('selectBroker', true); if (!supplier) { - CalculationStore.setValidation('selectSupplier', false); + this.setValidation('selectSupplier', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -68,7 +68,7 @@ export default () => { })(); } if (!agent) { - CalculationStore.setValidation('selectAgent', false); + this.setValidation('selectAgent', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -78,10 +78,10 @@ export default () => { break; } case 100000001: { - CalculationStore.setValidation('selectAgent', true); - CalculationStore.setValidation('selectBroker', true); + this.setValidation('selectAgent', true); + this.setValidation('selectBroker', true); if (!supplier) { - CalculationStore.setValidation('selectSupplier', false); + this.setValidation('selectSupplier', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -89,7 +89,7 @@ export default () => { })(); } if (!finDepartment) { - CalculationStore.setValidation('selectFinDepartment', false); + this.setValidation('selectFinDepartment', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -99,11 +99,11 @@ export default () => { break; } case 100000002: { - CalculationStore.setValidation('selectFinDepartment', true); - CalculationStore.setValidation('selectSupplier', true); - CalculationStore.setValidation('selectBroker', true); + this.setValidation('selectFinDepartment', true); + this.setValidation('selectSupplier', true); + this.setValidation('selectBroker', true); if (!agent) { - CalculationStore.setValidation('selectAgent', false); + this.setValidation('selectAgent', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -113,11 +113,11 @@ export default () => { break; } case 100000003: { - CalculationStore.setValidation('selectFinDepartment', true); - CalculationStore.setValidation('selectSupplier', true); - CalculationStore.setValidation('selectAgent', true); + this.setValidation('selectFinDepartment', true); + this.setValidation('selectSupplier', true); + this.setValidation('selectAgent', true); if (!broker) { - CalculationStore.setValidation('selectBroker', false); + this.setValidation('selectBroker', false); openNotification({ type: 'error', title: 'Ошибка во время создания интереса', @@ -128,12 +128,12 @@ export default () => { } case 100000004: default: { - CalculationStore.setValidation('selectFinDepartment', true); - CalculationStore.setValidation('selectSupplier', true); - CalculationStore.setValidation('selectAgent', true); - CalculationStore.setValidation('selectBroker', true); + this.setValidation('selectFinDepartment', true); + this.setValidation('selectSupplier', true); + this.setValidation('selectAgent', true); + this.setValidation('selectBroker', true); break; } } } -}; +} diff --git a/src/client/stores/CalculationStore/Effects/autorun.ts b/src/client/stores/CalculationStore/Effects/autorun.ts index 8d192e7..2a244f7 100644 --- a/src/client/stores/CalculationStore/Effects/autorun.ts +++ b/src/client/stores/CalculationStore/Effects/autorun.ts @@ -138,10 +138,6 @@ const autorunEffects: IAutorunEffect[] = [ calculationStore => () => { const { leaseObjectType: leaseObjectTypeId } = calculationStore.values; if (!leaseObjectTypeId) { - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Default, - ); return; } diff --git a/src/client/stores/CalculationStore/Effects/computed.js b/src/client/stores/CalculationStore/Effects/computed.js index 9fc6fb5..f8cfe17 100644 --- a/src/client/stores/CalculationStore/Effects/computed.js +++ b/src/client/stores/CalculationStore/Effects/computed.js @@ -55,6 +55,12 @@ const computedEffects = { } return '-'; }, + registrationDescription() { + const registration = this.getOption('selectRegistration'); + if (registration && registration.evo_description) { + return registration.evo_description; + } + }, }; export default computedEffects; diff --git a/src/client/stores/CalculationStore/Effects/reactions/gibddReactions.ts b/src/client/stores/CalculationStore/Effects/reactions/gibddReactions.ts new file mode 100644 index 0000000..d62fec5 --- /dev/null +++ b/src/client/stores/CalculationStore/Effects/reactions/gibddReactions.ts @@ -0,0 +1,413 @@ +import { elementsValues } from 'client/Containers/Calculation/lib/elements/values'; +import { openNotification } from 'client/Elements/Notification'; +import _1CService from 'core/services/1CService'; +import { currentDate } from 'core/tools/date'; +import { IReactionEffect } from 'core/types/Calculation/Store/effect'; +import { TElements } from 'core/types/Calculation/Store/elements'; +import { Process } from 'core/types/Calculation/Store/process'; +import { ElementStatus } from 'core/types/statuses'; +import { get } from 'lodash'; + +const v = { + tbxVehicleTaxInYear: { value: 0, validator: value => value === 0 }, + radioTypePTS: { value: null, validator: value => value === null }, + selectObjectRegionRegistration: { + value: null, + validator: value => value === null, + }, +} as TElements; + +const gibddReactions: IReactionEffect[] = [ + calculationStore => ({ + expression: () => { + return calculationStore.getOption('selectLeaseObjectType'); + }, + effect: leaseObjectType => { + if (['6', '9', '10', '11'].includes(leaseObjectType.evo_id)) { + calculationStore.setStatus( + 'radioObjectRegistration', + ElementStatus.Disabled, + ); + calculationStore.setValue('objectRegistration', 100000000); + } else { + calculationStore.setStatus( + 'radioObjectRegistration', + ElementStatus.Default, + ); + } + }, + options: { + fireImmediately: true, + }, + }), + + ...Object.keys(v).map(elementName => { + const valueName = elementsValues[elementName]; + const value = v[elementName].value; + const validator = v[elementName].validator; + + return calculationStore => ({ + expression: () => { + return calculationStore.getValues([valueName, 'objectRegistration']); + }, + effect: values => { + calculationStore.setValidation(elementName, undefined); + if (values.objectRegistration === 100000001) { + calculationStore.setStatus(elementName, ElementStatus.Default); + calculationStore.setValidation( + elementName, + !validator(values[valueName]), + ); + } else { + calculationStore.setStatus(elementName, ElementStatus.Disabled); + calculationStore.setValue(valueName, value); + } + }, + options: { + fireImmediately: true, + }, + }); + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getValues(['leasingPeriod', 'vehicleTaxInYear']); + }, + effect: ({ vehicleTaxInYear, leasingPeriod }) => { + if (vehicleTaxInYear > 0) { + calculationStore.setValue( + 'vehicleTaxInLeasingPeriod', + (vehicleTaxInYear / 12) * leasingPeriod, + ); + } else { + calculationStore.setValue('vehicleTaxInLeasingPeriod', 0); + } + }, + options: { + fireImmediately: true, + }, + }), + + (calculationStore, calculationProcess) => ({ + expression: () => { + return calculationStore.getValues([ + 'leaseObjectType', + 'objectCategoryTax', + 'objectRegistration', + ]); + }, + effect: ({ objectRegistration, objectCategoryTax }) => { + if (calculationProcess.process === Process.LoadKp) { + return; + } + if (objectRegistration === 100000001) { + if ([100000006, 100000009].includes(objectCategoryTax)) { + calculationStore.setValue('objectTypeTax', 100000002); + } else { + const leaseObjectType = calculationStore.getOption( + 'selectLeaseObjectType', + ); + if (leaseObjectType && leaseObjectType.evo_vehicle_type_tax) { + calculationStore.setValue( + 'objectTypeTax', + leaseObjectType.evo_vehicle_type_tax, + ); + } + } + } else { + calculationStore.setValue('objectTypeTax', null); + } + }, + options: { + fireImmediately: true, + }, + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getValues(['leaseObjectCategory', 'maxMass']); + }, + effect: ({ leaseObjectCategory, maxMass }) => { + calculationStore.setValidation('tbxMaxMass', undefined); + switch (leaseObjectCategory) { + case 100000001: { + if (maxMass > 3500) { + calculationStore.setValidation('tbxMaxMass', false); + openNotification({ + type: 'error', + title: 'Ошибка', + description: + 'При категории ТС = В Разерешенная макс.масс не может быть больше 3500кг', + })(); + } + break; + } + case 100000002: { + if (maxMass <= 3500) { + calculationStore.setValidation('tbxMaxMass', false); + openNotification({ + type: 'error', + title: 'Ошибка', + description: 'Разерешенная макс.масс не может быть меньше 3500кг', + })(); + } + break; + } + } + }, + options: { + fireImmediately: true, + }, + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getOption('selectLeaseObjectType'); + }, + effect: ({ evo_category }) => { + calculationStore.setValue('leaseObjectCategory', evo_category); + }, + options: { + fireImmediately: true, + }, + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getValues([ + 'leaseObjectType', + 'leaseObjectCategory', + 'typePTS', + 'objectRegistration', + ]); + }, + effect: ({ leaseObjectCategory, typePTS, objectRegistration }) => { + calculationStore.setStatus( + 'selectObjectCategoryTax', + ElementStatus.Disabled, + ); + if (objectRegistration === 100000001 && typePTS === 100000001) { + calculationStore.setStatus( + 'selectObjectCategoryTax', + ElementStatus.Default, + ); + const leaseObjectType = calculationStore.getOption( + 'selectLeaseObjectType', + ); + if (leaseObjectCategory === leaseObjectType?.evo_category) { + calculationStore.setFilter('selectObjectCategoryTax', options => + options.filter(option => + //@ts-ignore + leaseObjectType?.evo_category_tr?.includes(option.value), + ), + ); + } + } else { + calculationStore.setValue('objectCategoryTax', null); + } + }, + }), + + calculationStore => ({ + expression: () => { + return { + ...calculationStore.getValues([ + 'typePTS', + 'objectRegistration', + 'objectCategoryTax', + ]), + leaseObjectType: calculationStore.getOption('selectLeaseObjectType'), + }; + }, + effect: ({ + leaseObjectType, + typePTS, + objectRegistration, + objectCategoryTax, + }) => { + if ( + objectRegistration === 100000001 && + typePTS === 100000001 && + objectCategoryTax === null && + leaseObjectType && + leaseObjectType.evo_category_tr && + leaseObjectType.evo_category_tr.length + ) { + calculationStore.setValidation('selectObjectCategoryTax', false); + openNotification({ + type: 'error', + title: 'Ошибка', + description: + 'Необходимо из ЭПТС указать Категорию в соответствии с ТР ТС 018/2011', + })(); + } else { + calculationStore.setValidation('selectObjectCategoryTax', undefined); + } + }, + }), + + calculationStore => ({ + expression: () => { + return { + leaseObjectType: calculationStore.getOption('selectLeaseObjectType'), + ...calculationStore.getValues(['insNSIB']), + }; + }, + effect: ({ leaseObjectType }) => { + if ( + leaseObjectType.evo_id === '11' && + calculationStore.getValue('insNSIB') === null + ) { + calculationStore.setValidation('selectInsNSIB', false); + openNotification({ + type: 'error', + title: 'Ошибка', + description: 'Страхование НСИБ обязательно для мотоциклистов', + })(); + } else { + calculationStore.setValidation('selectInsNSIB', undefined); + } + }, + }), + + (calculationStore, calculationProcess) => ({ + expression: () => { + return calculationStore.getValues([ + 'objectRegistration', + 'objectTypeTax', + 'regionRegistration', + 'leaseObjectYear', + 'leaseObjectMotorPower', + ]); + }, + effect: ({ + objectRegistration, + objectTypeTax, + regionRegistration, + leaseObjectYear, + leaseObjectMotorPower, + }) => { + if (calculationProcess.process !== Process.Default) { + return; + } + if ( + objectRegistration === null || + objectRegistration !== 100000001 || + objectTypeTax === null || + regionRegistration === null || + leaseObjectYear === 0 || + leaseObjectMotorPower === 0 + ) { + calculationStore.setValue('vehicleTaxInYear', 0); + return; + } + + calculationStore.setStatus('tbxVehicleTaxInYear', ElementStatus.Loading); + const regionRegistrationOption = calculationStore.getOption( + 'selectRegionRegistration', + ); + const objectTypeTaxOption = calculationStore.getOption( + 'selectObjectTypeTax', + ); + _1CService.leasingTrial + .getTransTax({ + calcDate: currentDate, + power: leaseObjectMotorPower, + year: leaseObjectYear, + OKTMO: regionRegistrationOption?.evo_oktmo || '', + //@ts-ignore + carCategory: objectTypeTaxOption.type, + }) + .then(res => { + calculationStore.setValue('vehicleTaxInYear', res.tax || 0); + }) + .finally(() => { + calculationStore.setStatus( + 'tbxVehicleTaxInYear', + ElementStatus.Default, + ); + }); + }, + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getValues([ + 'objectRegistration', + 'objectRegionRegistration', + 'regionRegistration', + 'typePTS', + ]); + }, + effect: ({ + objectRegistration, + objectRegionRegistration, + regionRegistration, + typePTS, + }) => { + calculationStore.setFilter('selectRegistration', options => + options.filter( + x => + x.evo_whom_register === objectRegistration && + x.evo_pts_type && + x.evo_pts_type.includes(typePTS) && + x.evo_gibdd_region === + (objectRegionRegistration === regionRegistration), + ), + ); + }, + }), + + (calculationStore, calculationProcess) => ({ + expression: () => { + return { + lead: calculationStore.getOption('selectLead'), + opportunity: calculationStore.getOption('selectOpportunity'), + objectRegistration: calculationStore.getValue('objectRegistration'), + }; + }, + effect: ({ lead, opportunity, objectRegistration }) => { + if (calculationProcess.process !== Process.Default) { + return; + } + calculationStore.setFilter('selectRegionRegistration', undefined); + calculationStore.setStatus( + 'selectRegionRegistration', + ElementStatus.Default, + ); + calculationStore.setValue('regionRegistration', null); + + if (objectRegistration === 100000001) { + calculationStore.setFilter('selectRegionRegistration', options => + options.filter(x => x.evo_businessunit_evolution === true), + ); + } else { + const evo_region_fias_id = get( + lead.accountidData || opportunity.accountidData, + 'evo_address_legalidData.evo_region_fias_id', + undefined, + ); + if (evo_region_fias_id) { + calculationStore.setStatus( + 'selectRegionRegistration', + ElementStatus.Disabled, + ); + const targetObjectRegistration = calculationStore.getOption( + 'selectRegionRegistration', + { + evo_fias_id: evo_region_fias_id, + }, + ); + if (targetObjectRegistration) { + calculationStore.setValue( + 'regionRegistration', + targetObjectRegistration.evo_regionid, + ); + } + } + } + }, + }), +]; + +export default gibddReactions; diff --git a/src/client/stores/CalculationStore/Effects/reactions/index.ts b/src/client/stores/CalculationStore/Effects/reactions/index.ts index 00e787e..10d208b 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/index.ts +++ b/src/client/stores/CalculationStore/Effects/reactions/index.ts @@ -1,10 +1,11 @@ -import requestReactions from './requestReactions'; +import gibddReactions from './gibddReactions'; +import loadKpReaction from './loadKpReaction'; import otherReactions from './otherReactions'; import priceReactions from './priceReactions'; -import tablesReactions from './tablesReactions'; -import loadKpReaction from './loadKpReaction'; -import statusReactions from './statusReactions'; import recalcWoRevisionReactions from './recalcWoRevisionReactions'; +import requestReactions from './requestReactions'; +import statusReactions from './statusReactions'; +import tablesReactions from './tablesReactions'; export default [ ...otherReactions, @@ -13,5 +14,6 @@ export default [ ...tablesReactions, ...statusReactions, ...recalcWoRevisionReactions, + ...gibddReactions, loadKpReaction, ]; diff --git a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/index.ts b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/index.ts index 9dac562..caecce9 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/index.ts +++ b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/index.ts @@ -87,48 +87,6 @@ const loadKpReaction: IReactionEffect = calculationStore => ({ let regionRegistration = quote.evo_regionid, townRegistration = quote.evo_townid; - let accountidData; - if (lead) { - const selected_lead = calculationStore.getOption('selectLead', { - value: lead, - }); - - if (selected_lead && selected_lead.accountidData) { - accountidData = selected_lead.accountidData; - } - } - - if (opportunity) { - const selected_opportunity = calculationStore.getOption( - 'selectOpportunity', - { - value: opportunity, - }, - ); - if (selected_opportunity && selected_opportunity.accountidData) { - accountidData = selected_opportunity.accountidData; - } - } - - let evo_region_fias_id, evo_city_fias_id; - if (accountidData) { - const { evo_address_legalidData } = accountidData; - evo_region_fias_id = evo_address_legalidData.evo_region_fias_id; - evo_city_fias_id = evo_address_legalidData.evo_city_fias_id; - } - - if (evo_region_fias_id) { - const region = calculationStore.getOption( - 'selectRegionRegistration', - { - evo_fias_id: evo_region_fias_id, - }, - ); - if (region) { - regionRegistration = region.evo_regionid; - } - } - const { entities: options, }: IGetCRMEntitiesResponse & { @@ -210,15 +168,6 @@ const loadKpReaction: IReactionEffect = calculationStore => ({ }, ]); - if (evo_city_fias_id) { - const city = calculationStore.getOption('selectTownRegistration', { - evo_fias_id: evo_city_fias_id, - }); - if (city) { - townRegistration = city.evo_townid; - } - } - let evo_graph: IEvoGraph = {}; if (quote.evo_graphs) { evo_graph = quote.evo_graphs.sort( diff --git a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/mapKpToValues.ts b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/mapKpToValues.ts index 45f9a14..b50dee5 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/mapKpToValues.ts +++ b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/mapKpToValues.ts @@ -86,6 +86,11 @@ const mapKPtoValues: TValues = { requirementTelematic: 'evo_req_telematic_accept', mileage: 'evo_mileage', fullPriceWithDiscount: 'evo_price_without_discount_quote', + objectRegistration: 'evo_object_registration', + objectRegionRegistration: 'evo_registration_regionid', + vehicleTaxInYear: 'evo_vehicle_tax_approved', + objectCategoryTax: 'evo_category_tr', + objectTypeTax: 'evo_vehicle_type_tax', }; export default mapKPtoValues; diff --git a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/quoteQuery.js b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/quoteQuery.js index 7eb1ff1..b45b3ce 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/quoteQuery.js +++ b/src/client/stores/CalculationStore/Effects/reactions/loadKpReaction/quoteQuery.js @@ -32,6 +32,11 @@ export default gql` evo_client_riskid evo_regionid evo_townid + evo_object_registration + evo_registration_regionid + evo_vehicle_tax_approved + evo_category_tr + evo_vehicle_type_tax } } `; diff --git a/src/client/stores/CalculationStore/Effects/reactions/otherReactions.ts b/src/client/stores/CalculationStore/Effects/reactions/otherReactions.ts index a07bdd3..3bbf069 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/otherReactions.ts +++ b/src/client/stores/CalculationStore/Effects/reactions/otherReactions.ts @@ -2,7 +2,7 @@ import { openNotification } from 'client/Elements/Notification'; import { IReactionEffect } from 'core/types/Calculation/Store/effect'; import { Process } from 'core/types/Calculation/Store/process'; import { ElementStatus } from 'core/types/statuses'; -import { round } from 'lodash'; +import { intersection, round } from 'lodash'; const reactionEffects: IReactionEffect[] = [ // calculationStore => ({ @@ -1361,34 +1361,6 @@ const reactionEffects: IReactionEffect[] = [ // }, // }), - calculationStore => ({ - expression: () => { - const { product } = calculationStore.values; - return product; - }, - effect: productId => { - if (productId) { - const product = calculationStore.getOption('selectProduct', { - evo_id: productId, - }); - if (product) { - const registraction_2020_3 = calculationStore.getOption( - 'selectRegistration', - { - evo_id: '2020_3', - }, - ); - if (registraction_2020_3) { - calculationStore.setValue( - 'registration', - registraction_2020_3.evo_addproduct_typeid, - ); - } - } - } - }, - }), - calculationStore => ({ expression: () => { const { product, leasingPeriod } = calculationStore.values; @@ -1513,24 +1485,6 @@ const reactionEffects: IReactionEffect[] = [ }, }), - //TODO: global setFilter => reset Value - calculationStore => ({ - expression: () => { - const { selectLeaseObjectCategory } = calculationStore.filters; - return selectLeaseObjectCategory; - }, - effect: selectLeaseObjectCategoryFilter => { - const { leaseObjectCategory } = calculationStore.values; - if ( - !selectLeaseObjectCategoryFilter( - calculationStore.getOptions('selectLeaseObjectCategory'), - ).some(x => x.value === leaseObjectCategory) - ) { - calculationStore.setValue('leaseObjectCategory', null); - } - }, - }), - calculationStore => ({ expression: () => { const { @@ -1560,12 +1514,6 @@ const reactionEffects: IReactionEffect[] = [ if (leaseObjectType) { switch (leaseObjectType.evo_id) { case '1': { - calculationStore.setValue('leaseObjectCategory', 100000001); - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Disabled, - ); - const { countSeats } = calculationStore.values; if (countSeats && countSeats >= 9) { calculationStore.setValidation('tbxCountSeats', false); @@ -1579,16 +1527,6 @@ const reactionEffects: IReactionEffect[] = [ } case '2': { - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Default, - ); - calculationStore.setFilter('selectLeaseObjectCategory', options => - options.filter( - x => x.value === 100000001 || x.value === 100000002, - ), - ); - const { maxMass } = calculationStore.values; if (!maxMass) { calculationStore.setValidation('tbxMaxMass', false); @@ -1604,16 +1542,6 @@ const reactionEffects: IReactionEffect[] = [ case '4': case '5': { - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Default, - ); - calculationStore.setFilter('selectLeaseObjectCategory', options => - options.filter( - x => x.value === 100000001 || x.value === 100000003, - ), - ); - const { countSeats } = calculationStore.values; if (countSeats <= 8) { calculationStore.setValidation('tbxCountSeats', false); @@ -1625,43 +1553,6 @@ const reactionEffects: IReactionEffect[] = [ } break; } - case '6': - case '9': - case '10': { - calculationStore.setValue('leaseObjectCategory', null); - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Disabled, - ); - break; - } - - case '3': - case '7': { - calculationStore.setValue('leaseObjectCategory', 100000002); - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Disabled, - ); - break; - } - - case '8': { - calculationStore.setValue('leaseObjectCategory', 100000004); - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Disabled, - ); - break; - } - - default: { - calculationStore.setStatus( - 'selectLeaseObjectCategory', - ElementStatus.Default, - ); - break; - } } } }, @@ -1780,6 +1671,53 @@ const reactionEffects: IReactionEffect[] = [ ); }, }), + + calculationStore => ({ + expression: () => { + return calculationStore.getOption('selectLeaseObjectType'); + }, + effect: leaseObjectType => { + calculationStore.setStatus( + 'selectBrand', + leaseObjectType ? ElementStatus.Default : ElementStatus.Disabled, + ); + calculationStore.setValue('brand', null); + + calculationStore.setFilter('selectBrand', options => + options.filter( + option => + option.evo_vehicle_type && + intersection( + option.evo_vehicle_type?.filter(x => x > 0), + leaseObjectType.evo_vehicle_type, + ).length > 0, + ), + ); + }, + options: { + fireImmediately: true, + }, + }), + + calculationStore => ({ + expression: () => { + return calculationStore.getOption('selectBrand'); + }, + effect: () => { + const leaseObjectType = calculationStore.getOption( + 'selectLeaseObjectType', + ); + calculationStore.setFilter('selectModel', options => + options.filter( + option => + option.evo_vehicle_type && + leaseObjectType && + leaseObjectType.evo_vehicle_type && + leaseObjectType.evo_vehicle_type.includes(option.evo_vehicle_type), + ), + ); + }, + }), ]; export default reactionEffects; diff --git a/src/client/stores/CalculationStore/Effects/reactions/requestReactions.ts b/src/client/stores/CalculationStore/Effects/reactions/requestReactions.ts index 7abea0c..07d1c33 100644 --- a/src/client/stores/CalculationStore/Effects/reactions/requestReactions.ts +++ b/src/client/stores/CalculationStore/Effects/reactions/requestReactions.ts @@ -819,6 +819,8 @@ export default [ evo_importer_reward_perc evo_importer_reward_rub evo_impairment_groupid + evo_vehicle_type + evo_gps } } `, @@ -1040,6 +1042,7 @@ export default [ ) { evo_name evo_gps_modelid + evo_moto } } `, diff --git a/src/client/stores/CalculationStore/config/initialOptions.ts b/src/client/stores/CalculationStore/config/initialOptions.ts index 920cd3f..42eea06 100644 --- a/src/client/stores/CalculationStore/config/initialOptions.ts +++ b/src/client/stores/CalculationStore/config/initialOptions.ts @@ -334,6 +334,77 @@ const initialOptions: TElements = { value: 100000002, }, ], + radioObjectRegistration: [ + { + name: 'Лизингополучатель', + value: 100000000, + }, + { + name: 'Лизингодатель', + value: 100000001, + }, + ], + radioTypePTS: [ + { + name: 'Бумажный', + value: 100000000, + }, + { + name: 'Электронный', + value: 100000001, + }, + ], + selectObjectCategoryTax: [ + 'M1', + 'M2', + 'M3', + 'M1G', + 'M2G', + 'M3G', + 'N1', + 'N2', + 'N3', + 'N1G', + 'N2G', + 'N3G', + 'O1', + 'O2', + 'O3', + 'O4', + 'L1', + 'L2', + 'L3', + 'L4', + 'L5', + ].map((name, i) => ({ + name, + value: 100000000 + i, + })), + selectObjectTypeTax: [ + { + name: 'Автобус', + type: 'D', + }, + { + name: 'Легковой', + type: 'B', + }, + { + name: 'Грузовой', + type: 'C', + }, + { + name: 'Спецтехника', + type: 'T', + }, + { + name: 'Мотоцикл', + type: 'A', + }, + ].map((v, i) => ({ + ...v, + value: 100000000 + i, + })), }; export default initialOptions; diff --git a/src/client/stores/CalculationStore/config/initialStatuses.ts b/src/client/stores/CalculationStore/config/initialStatuses.ts index 89bc610..ea62083 100644 --- a/src/client/stores/CalculationStore/config/initialStatuses.ts +++ b/src/client/stores/CalculationStore/config/initialStatuses.ts @@ -1,5 +1,5 @@ -import { ElementStatus } from 'core/types/statuses'; import { TElements } from 'core/types/Calculation/Store/elements'; +import { ElementStatus } from 'core/types/statuses'; const initialStatuses: TElements = { selectIndAgent: ElementStatus.Disabled, @@ -34,8 +34,11 @@ const initialStatuses: TElements = { tbxCommentLead: ElementStatus.Disabled, btnCreateLead: ElementStatus.Disabled, - selectRegistration: ElementStatus.Disabled, selectTracker: ElementStatus.Disabled, + + tbxVehicleTaxInLeasingPeriod: ElementStatus.Disabled, + selectObjectTypeTax: ElementStatus.Disabled, + selectLeaseObjectCategory: ElementStatus.Disabled, }; export default initialStatuses; diff --git a/src/client/stores/CalculationStore/config/initialValues.ts b/src/client/stores/CalculationStore/config/initialValues.ts index cd352cc..c5e1684 100644 --- a/src/client/stores/CalculationStore/config/initialValues.ts +++ b/src/client/stores/CalculationStore/config/initialValues.ts @@ -82,5 +82,10 @@ const initialValues: TValues = { rate: 'BASE', calcType: 100000000, totalPayments: 0, + vehicleTaxInYear: 0, + vehicleTaxInLeasingPeriod: 0, + objectRegistration: 100000000, + typePTS: 100000001, + insNSIB: null, }; export default initialValues; diff --git a/src/client/stores/CalculationStore/subStores/calculationUrls.ts b/src/client/stores/CalculationStore/subStores/calculationUrls.ts index 513c696..9a9217b 100644 --- a/src/client/stores/CalculationStore/subStores/calculationUrls.ts +++ b/src/client/stores/CalculationStore/subStores/calculationUrls.ts @@ -3,7 +3,7 @@ import { makeAutoObservable } from 'mobx'; const calculationUrls = makeAutoObservable({ urls: {}, - setUrl({ name, url }: { name: LinksNames; url: string }) { + setUrl({ name, url }: { name: LinksNames; url?: string }) { this.urls[name] = url; }, }); diff --git a/src/core/constants/urls.js b/src/core/constants/urls.js index 849907e..d6765b7 100644 --- a/src/core/constants/urls.js +++ b/src/core/constants/urls.js @@ -2,3 +2,4 @@ export const CRM_PROXY_URL = '/crmgraphql'; export const CORE_PROXY_URL = '/core'; export const AUTH_PROXY_URL = '/auth-srv'; export const ELT_PROXY_URL = '/elt'; +export const _1C_PROXY_URL = '/1c'; diff --git a/src/core/services/1CService/index.js b/src/core/services/1CService/index.js new file mode 100644 index 0000000..8db7e56 --- /dev/null +++ b/src/core/services/1CService/index.js @@ -0,0 +1,3 @@ +import leasingTrial from './leasingTrial'; + +export default { leasingTrial }; diff --git a/src/core/services/1CService/leasingTrial.ts b/src/core/services/1CService/leasingTrial.ts new file mode 100644 index 0000000..af823bc --- /dev/null +++ b/src/core/services/1CService/leasingTrial.ts @@ -0,0 +1,23 @@ +import axios from 'axios'; +import { _1C_PROXY_URL } from 'core/constants/urls'; +import { IGetTransTaxRequest } from 'core/types/Calculation/Requests'; +import { IGetTransTaxResponse } from 'core/types/Calculation/Responses'; + +export default class { + static getTransTax = ( + payload: IGetTransTaxRequest, + ): Promise => + new Promise((resolve, reject) => { + axios + .post( + String.prototype.concat(_1C_PROXY_URL, '/leasingTrial', '/transTax'), + payload, + ) + .then(res => { + resolve(res.data); + }) + .catch(err => { + reject(err); + }); + }); +} diff --git a/src/core/services/CrmService/index.ts b/src/core/services/CrmService/index.ts index 7d17072..3efd825 100644 --- a/src/core/services/CrmService/index.ts +++ b/src/core/services/CrmService/index.ts @@ -4,7 +4,7 @@ import { CRM_PROXY_URL } from 'core/constants/urls'; import { ICreateKpRequest, IMutateToCRMGQL, - IQueryToCRMGQL + IQueryToCRMGQL, } from 'core/types/Calculation/Requests'; import { IGetCRMEntitiesResponse } from 'core/types/Calculation/Responses'; import { IBaseOption } from 'core/types/Calculation/Store/options'; @@ -45,6 +45,7 @@ export default class { const optionatedEntities: (TCRMEntity & IBaseOption)[] = []; for (const entity of targetEnt) { const entityOption = convertEntityToOption( + targetName, entity, entity.__typename, ); @@ -58,6 +59,7 @@ export default class { ] = optionatedEntities; } else { const entityOption = convertEntityToOption( + targetName, targetEnt, targetEnt.__typename, ); diff --git a/src/core/services/CrmService/propsMap.ts b/src/core/services/CrmService/propsMap.ts index 9836bb1..baee9ab 100644 --- a/src/core/services/CrmService/propsMap.ts +++ b/src/core/services/CrmService/propsMap.ts @@ -2,11 +2,12 @@ import { TCRMEntity } from 'core/types/Entities/crmEntities'; import { TEntities } from 'core/types/Entities/crmEntityNames'; const propsMap: TEntities<{ - name: keyof TCRMEntity | (keyof TCRMEntity)[]; + name?: keyof TCRMEntity; value: keyof TCRMEntity; + getName?: (entity: TCRMEntity, targetName: string) => string | undefined; }> = { account: { - name: ['name', 'evo_kpp'], + getName: account => `${account.name} ${account.evo_kpp || ''}`, value: 'accountid', }, lead: { @@ -54,7 +55,8 @@ const propsMap: TEntities<{ value: 'evo_modelid', }, evo_equipment: { - name: ['evo_name', 'evo_start_production_year'], + getName: equipment => + `${equipment.evo_name} (${equipment.evo_start_production_year})`, value: 'evo_equipmentid', }, evo_reward_condition: { @@ -94,7 +96,20 @@ const propsMap: TEntities<{ value: 'evo_coefficientid', }, evo_addproduct_type: { - name: 'evo_name', + getName: (productType, targetName) => { + if ( + [ + 'selectRegistration', + 'selectTechnicalCard', + 'selectTelematic', + 'selectTracker', + ].includes(targetName) && + productType.evo_graph_price !== undefined + ) { + return `${productType.evo_name} (${productType.evo_graph_price} руб.)`; + } + return productType.evo_name; + }, value: 'evo_addproduct_typeid', }, evo_planpayment: { diff --git a/src/core/services/CrmService/tools/entity.ts b/src/core/services/CrmService/tools/entity.ts index f22abed..5c148eb 100644 --- a/src/core/services/CrmService/tools/entity.ts +++ b/src/core/services/CrmService/tools/entity.ts @@ -4,8 +4,9 @@ import { CRMEntityNames } from 'core/types/Entities/crmEntityNames'; import propsMap from '../propsMap'; export function convertEntityToOption( + targetName: string, entity: TCRMEntity, - entityName?: CRMEntityNames + entityName?: CRMEntityNames, ): (TCRMEntity & IBaseOption) | undefined { if (!entityName) { throw new Error('entityName is missing'); @@ -17,20 +18,24 @@ export function convertEntityToOption( const entityPropsMap = propsMap[entityName]; if (entityPropsMap) { - const { name: propName, value: propValue } = entityPropsMap; + const { name: propName, getName, value: propValue } = entityPropsMap; let name; const value = entity[propValue]; - if (!Array.isArray(propName)) { + if (propName) { name = entity[propName]; - } else { - name = propName.map(field => entity[field]).join(' '); + } + if (getName) { + name = getName(entity, targetName); + } + + if (targetName) { } const optionatedObject = { ...entity, name, - value + value, }; return optionatedObject; } diff --git a/src/core/types/Calculation/Requests.ts b/src/core/types/Calculation/Requests.ts index 8931755..8957c33 100644 --- a/src/core/types/Calculation/Requests.ts +++ b/src/core/types/Calculation/Requests.ts @@ -1,7 +1,7 @@ import { ColumnsNames, IColumn, PostValues } from 'core/types/Calculation/Core'; import { PreparedPayments, - PreparedValues + PreparedValues, } from 'core/types/Calculation/Prepare'; import { ElementsNames } from 'core/types/Calculation/Store/elements'; import { TableProps } from 'core/types/Calculation/Store/tables'; @@ -33,8 +33,16 @@ export interface ICreateKpRequest { insurances: TableProps[]; preparedValues: PreparedValues; preparedPayments: PreparedPayments; - calculationColumns: { [column in ColumnsNames]?: IColumn }; postValues: PostValues; calculationValues: TValues; + columns: { [column in ColumnsNames]?: IColumn }; }; } + +export interface IGetTransTaxRequest { + calcDate: Date; + OKTMO: string; + carCategory: string; + power: number; + year: number; +} diff --git a/src/core/types/Calculation/Responses.ts b/src/core/types/Calculation/Responses.ts index 35e6b2f..b69b4a3 100644 --- a/src/core/types/Calculation/Responses.ts +++ b/src/core/types/Calculation/Responses.ts @@ -1,7 +1,7 @@ -import { PreparedValues } from './Prepare'; import { TCRMEntity } from '../Entities/crmEntities'; import { TEntities } from '../Entities/crmEntityNames'; import { ColumnsNames, IColumn, PostValues } from './Core'; +import { PreparedValues } from './Prepare'; export interface IGetCRMEntitiesResponse { entities: TEntities; @@ -12,3 +12,8 @@ export interface IGetCalculationResponse { postValues: PostValues; preparedValues: PreparedValues; } + +export interface IGetTransTaxResponse { + tax: number; + error: string; +} diff --git a/src/core/types/Calculation/Store/elements.ts b/src/core/types/Calculation/Store/elements.ts index fbc6d7c..4422715 100644 --- a/src/core/types/Calculation/Store/elements.ts +++ b/src/core/types/Calculation/Store/elements.ts @@ -135,7 +135,15 @@ export type ElementsNames = | 'labelIrrInfo' | 'tbxMileage' | 'radioCalcType' - | 'tbxTotalPayments'; + | 'tbxTotalPayments' + | 'radioObjectRegistration' + | 'selectObjectRegionRegistration' + | 'tbxVehicleTaxInYear' + | 'tbxVehicleTaxInLeasingPeriod' + | 'selectObjectCategoryTax' + | 'selectObjectTypeTax' + | 'radioTypePTS' + | 'labelRegistrationDescription'; export type LinkElementsNames = 'linkDownloadKp'; diff --git a/src/core/types/Calculation/Store/index.ts b/src/core/types/Calculation/Store/index.ts index 084fc86..b7e7efe 100644 --- a/src/core/types/Calculation/Store/index.ts +++ b/src/core/types/Calculation/Store/index.ts @@ -56,6 +56,7 @@ interface ICalculationValues { values: TValues; getValue: (sourceValueName: ValuesNames) => TValue; + getValues: (valuesNames: ValuesNames[]) => TValues; setValue: ( sourceValueName: ValuesNames | ResultValuesNames, newValue: TValue, diff --git a/src/core/types/Calculation/Store/values.ts b/src/core/types/Calculation/Store/values.ts index 9f4cf7a..b496c39 100644 --- a/src/core/types/Calculation/Store/values.ts +++ b/src/core/types/Calculation/Store/values.ts @@ -122,14 +122,22 @@ export type ValuesNames = | 'tracker' | 'mileage' | 'calcType' - | 'totalPayments'; + | 'totalPayments' + | 'objectRegistration' + | 'objectRegionRegistration' + | 'vehicleTaxInYear' + | 'vehicleTaxInLeasingPeriod' + | 'objectCategoryTax' + | 'objectTypeTax' + | 'typePTS'; export type ComputedValuesNames = | 'leadName' | 'opportunityName' | 'leaseObjectRiskName' | 'insKaskoPriceLeasePeriod' - | 'irrInfo'; + | 'irrInfo' + | 'registrationDescription'; export const resultsValues = [ 'resultTotalGraphwithNDS', diff --git a/src/core/types/Entities/crmEntities.ts b/src/core/types/Entities/crmEntities.ts index ffd3f2a..0dda14c 100644 --- a/src/core/types/Entities/crmEntities.ts +++ b/src/core/types/Entities/crmEntities.ts @@ -133,6 +133,10 @@ export interface IEvoLeasingObjectType { evo_expluatation_period2?: number; evo_type_code?: string; evo_baseproduct?: any; + evo_category?: number; + evo_category_tr?: number[]; + evo_vehicle_type_tax?: number; + evo_vehicle_type?: number[]; } export interface IEvoBrand { @@ -141,6 +145,7 @@ export interface IEvoBrand { evo_importer_reward_perc?: number; evo_importer_reward_rub?: number; statecode?: number; + evo_vehicle_type?: number[]; } export interface IEvoModel { @@ -153,6 +158,8 @@ export interface IEvoModel { evo_importer_reward_rub?: number; statecode?: number; evo_baseproduct?: any; + evo_vehicle_type?: number; + evo_gps?: boolean; } export interface IEvoEquipment { @@ -166,6 +173,7 @@ export interface IEvoEquipment { evo_supplier_accountid?: string; evo_dealer_person_accountid?: string; evo_dealer_broker_accountid?: string; + evo_vehicle_type?: number; } export interface IEvoRewardCondition { @@ -190,12 +198,15 @@ export interface IEvoGPSModel { evo_name?: string; evo_gps_brandid?: string; statecode?: number; + evo_moto?: boolean; } export interface IEvoRegion { evo_name?: string; evo_regionid?: string; evo_fias_id?: string; statecode?: number; + evo_businessunit_evolution?: boolean; + evo_oktmo?: string; } export interface IEvoTown { evo_name?: string; @@ -301,6 +312,11 @@ export interface IEvoAddproductType { evo_cost_equipment?: number; evo_controls_program?: number[]; evo_helpcard_type?: number; + evo_towtruck?: boolean; + evo_pts_type?: number[]; + evo_description?: string; + evo_whom_register?: number; + evo_gibdd_region?: boolean; } export interface IEvoTarif {