From 6107e0c15fb0d9101e35d66ad3bd8bc5bb728c88 Mon Sep 17 00:00:00 2001 From: Chika Date: Wed, 5 Oct 2022 16:41:21 +0300 Subject: [PATCH] process/payments: add validation --- process/payments/reactions.ts | 52 +++++++++----------- process/payments/validation.ts | 90 ++++++++++++++++++++++++++++++++++ stores/tables/validation.ts | 1 + 3 files changed, 115 insertions(+), 28 deletions(-) create mode 100644 process/payments/validation.ts diff --git a/process/payments/reactions.ts b/process/payments/reactions.ts index 133216c..38ae867 100644 --- a/process/payments/reactions.ts +++ b/process/payments/reactions.ts @@ -4,10 +4,10 @@ import type { ApolloClient } from '@apollo/client'; import type { QueryClient } from '@tanstack/react-query'; import { selectSeasonType } from 'config/default-options'; import { reaction, toJS } from 'mobx'; -import { last, sort } from 'radash/dist/array'; +import { last } from 'radash/dist/array'; import type RootStore from 'stores/root'; import type { Row } from 'stores/tables/payments/types'; -import { areEqual } from 'tools/array'; +import validatePaymentsTable from './validation'; export default function paymentsReactions( store: RootStore, @@ -185,32 +185,6 @@ export default function paymentsReactions( } ); - const errorText = 'При виде графика "Легкий старт" 2, 3, 4 платежи должны возрастать'; - let removeError: () => void; - - reaction( - () => { - const graphType = $calculation.getElementValue('radioGraphType'); - const payments = $tables.payments.values; - - return { - payments: toJS(payments), - graphType, - }; - }, - ({ payments, graphType }) => { - if (graphType === 100_000_004) { - const targetPayments = payments.slice(1, 4); - const sortedPayments = sort(targetPayments, (x) => x); - const areEqualPayments = new Set(targetPayments).size === 1; - - if (!areEqual(targetPayments, sortedPayments) || areEqualPayments) { - removeError = $tables.payments.validation.addError(errorText); - } else if (removeError) removeError(); - } else if (removeError) removeError(); - } - ); - /** * Дегрессия */ @@ -334,4 +308,26 @@ export default function paymentsReactions( } } ); + + let removeError: () => void; + + reaction( + () => { + const graphType = $calculation.getElementValue('radioGraphType'); + const payments = toJS($tables.payments.values); + + return { + graphType, + payments, + }; + }, + ({ payments }) => { + if (removeError) removeError(); + const errorText = validatePaymentsTable($calculation.$values.values, payments); + + if (errorText) { + removeError = $tables.payments.validation.addError(errorText); + } + } + ); } diff --git a/process/payments/validation.ts b/process/payments/validation.ts new file mode 100644 index 0000000..2dc4e6b --- /dev/null +++ b/process/payments/validation.ts @@ -0,0 +1,90 @@ +/* eslint-disable max-len */ +/* eslint-disable no-case-declarations */ +import { counting, max, min, sort } from 'radash/dist/array'; +import type { CalculationValues } from 'stores/calculation/values/types'; +import { areEqual } from 'tools/array'; + +export default function validatePaymentsTable( + values: Readonly, + payments: ReadonlyArray +) { + switch (values.graphType) { + // Дегрессия + case 100_000_001: + /** + * в таблице платежей в столбце Соотношение платежей для строк с 2 до "Срок лизинга-1" минимальное значение должно быть равно 3 + */ + { + const MIN_PAYMENT = 3; + const targetPayments = payments.slice(1, values.leasingPeriod - 1); + if (!targetPayments.every((payment) => payment >= MIN_PAYMENT)) { + return `Минимальное значение платежа должно быть равно ${MIN_PAYMENT}`; + } + } + + /** + * при Дегрессии все значения не должны быть равны друг другу + что при Легком старте 2,3 и 4 платежи не должны быть равны 100 + */ + { + const targetPayments = payments.slice(1, values.leasingPeriod - 1); + if (new Set(targetPayments).size === 1) { + return 'Платежи не должны быть равны друг другу'; + } + } + + /** + * Проверка на возрастание + */ + for (let i = 2; i < payments.length - 1; i += 1) { + if (payments[i] > payments[i - 1]) { + return 'Платежи должны убывать'; + } + } + + /** + * Если вид графика = Дегрессия И значения в "Соотношении платежей" у 2, 3 и 4 платежа отличаются друг от друга не более чем на 10 + * (т.е. берем значения в этих полях, определяем максимальное и минимальное значение и смотрим на их разницу) + * то не осуществлять Расчет графика и выводить ошибку "Нельзя осуществить расчет - указана очень жетская дегрессия. + * На 2-4 платежах Соотношение платежа должен отличаться не более чем на 10%", + * иначе осуществлять расчет + */ + { + const targetPayments = payments.slice(1, 4); + if (max(targetPayments) - min(targetPayments) > 10) { + return 'Указана очень жесткая дегрессия'; + } + } + + /** + * Если вид графика = Дегрессия И значения в "Соотношении платежей" для строк с 2 До "Срок лизинга-1" как минимум 2 раза по 2 платежа должны между собой быть равны + * (т.е. берем значения "Соотношения платежей" для строк с 2 до "Срок лизинга-1" и делаем сводную таблицу - если кол-во одинаковых значение больше 2 встречаются 2 и более раза), + * то осуществлять расчет, + * иначе не осуществлять Расчет графика и выводить ошибку "Нельзя осуществить расчет - указана очень жетская дегрессия. Не менее чем у 4х платежей "Соотношение платежа" должно не отличаться между самой", + */ + { + const targetPayments = payments.slice(1, values.leasingPeriod - 1); + const counts = counting(targetPayments, (v) => v); + if (Object.values(counts).filter((count) => count > 1).length < 2) { + return 'Указана очень жесткая дегрессия. Не менее чем у 4х платежей соотношение должно не отличаться между собой'; + } + } + + break; + + // Легкий старт + case 100_000_004: { + const targetPayments = payments.slice(1, 4); + const sortedPayments = sort(targetPayments, (x) => x); + const areEqualPayments = new Set(targetPayments).size === 1; + + if (!areEqual(targetPayments, sortedPayments) || areEqualPayments) { + return '2, 3, 4 платежи должны возрастать'; + } + + break; + } + default: + } + + return null; +} diff --git a/stores/tables/validation.ts b/stores/tables/validation.ts index fb4b6b9..3b504da 100644 --- a/stores/tables/validation.ts +++ b/stores/tables/validation.ts @@ -29,6 +29,7 @@ export default class Validation { const removeError = () => { this.messages.delete(message); + notification.close(this.params.err_key); }; notification.error({