/* 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: if (!values.seasonType) { return 'Не выбран тип дегрессии'; } /** * в таблице платежей в столбце Соотношение платежей для строк с 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_003: { if (!values.seasonType) { return 'Не выбран тип сезонности'; } if (!values.highSeasonStart) { return 'Не выбрано смещение сезонности'; } 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; } return null; }