process/payments/validation: pass root store

This commit is contained in:
Chika 2022-10-17 15:07:47 +03:00
parent 9b9e27bd74
commit e0de887c45
2 changed files with 33 additions and 21 deletions

View File

@ -543,9 +543,9 @@ export default function paymentsReactions(
leasingPeriod,
};
},
({ payments }) => {
() => {
if (removeError) removeError();
const errorText = validatePaymentsTable($calculation.$values.values, payments);
const errorText = validatePaymentsTable(store);
if (errorText) {
removeError = $tables.payments.validation.addError(errorText);

View File

@ -1,17 +1,14 @@
/* 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 type RootStore from 'stores/root';
import { areEqual } from 'tools/array';
export default function validatePaymentsTable(
values: Readonly<CalculationValues>,
payments: ReadonlyArray<number>
) {
switch (values.graphType) {
export default function validatePaymentsTable({ $calculation, $tables }: RootStore) {
switch ($calculation.getElementValue('radioGraphType')) {
// Дегрессия
case 100_000_001:
if (!values.seasonType) {
if (!$calculation.getElementValue('selectSeasonType')) {
return 'Не выбран тип дегрессии';
}
/**
@ -19,7 +16,9 @@ export default function validatePaymentsTable(
*/
{
const MIN_PAYMENT = 3;
const targetPayments = payments.slice(1, values.leasingPeriod - 1);
const leasingPeriod = $calculation.getElementValue('tbxLeasingPeriod');
const targetPayments = $tables.payments.values.slice(1, leasingPeriod - 1);
if (!targetPayments.every((payment) => payment >= MIN_PAYMENT)) {
return `Минимальное значение платежа должно быть равно ${MIN_PAYMENT}`;
}
@ -29,7 +28,9 @@ export default function validatePaymentsTable(
* при Дегрессии все значения не должны быть равны друг другу + что при Легком старте 2,3 и 4 платежи не должны быть равны 100
*/
{
const targetPayments = payments.slice(1, values.leasingPeriod - 1);
const leasingPeriod = $calculation.getElementValue('tbxLeasingPeriod');
const targetPayments = $tables.payments.values.slice(1, leasingPeriod - 1);
if (new Set(targetPayments).size === 1) {
return 'Платежи не должны быть равны друг другу';
}
@ -38,12 +39,16 @@ export default function validatePaymentsTable(
/**
* Проверка на возрастание
*/
for (let i = 2; i < payments.length - 1; i += 1) {
if (payments[i] > payments[i - 1]) {
return 'Платежи должны убывать';
{
const leasingPeriod = $calculation.getElementValue('tbxLeasingPeriod');
const targetPayments = $tables.payments.values.slice(1, leasingPeriod - 1);
for (let i = 2; i < targetPayments.length - 1; i += 1) {
if (targetPayments[i] > targetPayments[i - 1]) {
return 'Платежи должны убывать';
}
}
}
/**
* Если вид графика = Дегрессия И значения в "Соотношении платежей" у 2, 3 и 4 платежа отличаются друг от друга не более чем на 10
* (т.е. берем значения в этих полях, определяем максимальное и минимальное значение и смотрим на их разницу)
@ -52,7 +57,8 @@ export default function validatePaymentsTable(
* иначе осуществлять расчет
*/
{
const targetPayments = payments.slice(1, 4);
const targetPayments = $tables.payments.values.slice(1, 4);
if (max(targetPayments) - min(targetPayments) > 10) {
return 'Указана очень жесткая дегрессия';
}
@ -65,7 +71,8 @@ export default function validatePaymentsTable(
* иначе не осуществлять Расчет графика и выводить ошибку "Нельзя осуществить расчет - указана очень жетская дегрессия. Не менее чем у 4х платежей "Соотношение платежа" должно не отличаться между самой",
*/
{
const targetPayments = payments.slice(1, values.leasingPeriod - 1);
const leasingPeriod = $calculation.getElementValue('tbxLeasingPeriod');
const targetPayments = $tables.payments.values.slice(1, leasingPeriod - 1);
const counts = counting(targetPayments, (v) => v);
if (Object.values(counts).filter((count) => count > 1).length < 2) {
return 'Указана очень жесткая дегрессия. Не менее чем у 4х платежей соотношение должно не отличаться между собой';
@ -75,24 +82,29 @@ export default function validatePaymentsTable(
break;
case 100_000_003: {
if (values.leasingPeriod < 14) {
const leasingPeriod = $calculation.getElementValue('tbxLeasingPeriod');
if (leasingPeriod < 14) {
return 'При сезонном виде графика срок лизинга должен быть больше 14 месяцев';
}
if (!values.seasonType) {
const seasonType = $calculation.getElementValue('selectSeasonType');
if (!seasonType) {
return 'Не выбран тип сезонности';
}
if (!values.highSeasonStart) {
const highSeasonStart = $calculation.getElementValue('selectHighSeasonStart');
if (!highSeasonStart) {
return 'Не выбрано смещение сезонности';
}
// TODO: seasons validation
break;
}
// Легкий старт
case 100_000_004: {
const targetPayments = payments.slice(1, 4);
const targetPayments = $tables.payments.values.slice(1, 4);
const sortedPayments = sort(targetPayments, (x) => x);
const areEqualPayments = new Set(targetPayments).size === 1;