process/payments: add validation

This commit is contained in:
Chika 2022-10-05 16:41:21 +03:00
parent 8f47cc44f8
commit 6107e0c15f
3 changed files with 115 additions and 28 deletions

View File

@ -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);
}
}
);
}

View File

@ -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<CalculationValues>,
payments: ReadonlyArray<number>
) {
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;
}

View File

@ -29,6 +29,7 @@ export default class Validation {
const removeError = () => {
this.messages.delete(message);
notification.close(this.params.err_key);
};
notification.error({