From e0de887c45b75af8d363bb93c0d89c02bb62df9a Mon Sep 17 00:00:00 2001 From: Chika Date: Mon, 17 Oct 2022 15:07:47 +0300 Subject: [PATCH] process/payments/validation: pass root store --- process/payments/reactions.ts | 4 +-- process/payments/validation.ts | 50 +++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/process/payments/reactions.ts b/process/payments/reactions.ts index 683cb84..4b9d5ac 100644 --- a/process/payments/reactions.ts +++ b/process/payments/reactions.ts @@ -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); diff --git a/process/payments/validation.ts b/process/payments/validation.ts index 08bf7d4..9fbe6c4 100644 --- a/process/payments/validation.ts +++ b/process/payments/validation.ts @@ -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, - payments: ReadonlyArray -) { - 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;