$tree Активные статьи пользователя, сгруппированные по group_id (0 — без группы) * @var object[] $groups Активные группы пользователя (App\Repositories\CategoryGroupRepository) * @var array $plan [categorie_id => [month => ['plan_summ'=>float,'formula_pct_used'=>?float]]] * @var int $year * @var object[] $archived Архивные статьи пользователя — для модалки «Статьи» → архив * @var object[] $archived_groups Архивные группы пользователя — туда же */ use System\Classes\CSRF; $months = [ 1 => 'Янв', 2 => 'Фев', 3 => 'Мар', 4 => 'Апр', 5 => 'Май', 6 => 'Июн', 7 => 'Июл', 8 => 'Авг', 9 => 'Сен', 10 => 'Окт', 11 => 'Ноя', 12 => 'Дек', ]; $sections = [ 'income' => 'Доходы', 'expense' => 'Расходы', ]; // Плоский список активных статей (группа — отдельная сущность, сюда не входит) — для select'а // формулы в модалке «Статьи» (только статьи расхода могут быть целью формулы, не группы). $all = []; foreach ($tree as $items) { $all = array_merge($all, $items); } // Категории, чей план считается автоматически по формуле связанной income-статьи — // у них своя ячейка readonly (см. CategoriesController::parseFormulaLink()). $formula_targets = []; foreach ($tree as $items) { foreach ($items as $c) { if ($c->linked_expense_categorie_id) { $formula_targets[(int)$c->linked_expense_categorie_id] = true; } } } /** * Одна ячейка ввода — общая и для карточек (комп/планшет), и для аккордeона (телефон), * чтобы имя поля/значение/readonly не разъезжались между двумя разметками одних данных. */ $planInput = static function (int $categorie_id, int $month, array $plan, bool $readonly) { $value = $plan[$categorie_id][$month]['plan_summ'] ?? ''; echo ''; }; $this->setScript('budgets.js'); $this->setScript('categories.js'); ?>
План бюджета на год
←
→
$label): ?>
$g->type === $type); $ungrouped = array_filter($tree[0] ?? [], static fn ($c) => $c->type === $type); ?>
Нет статей — сначала добавьте их на странице «Статьи»
id] ?? []; ?>
title, ENT_QUOTES, 'UTF-8') ?>
id]); ?>
title, ENT_QUOTES, 'UTF-8') ?>
$mlabel): ?>
id, $m, $plan, $is_target); ?>
id]); ?>
title, ENT_QUOTES, 'UTF-8') ?>
$mlabel): ?>
id, $m, $plan, $is_target); ?>
id] ?? []; $year_sum = 0.0; foreach ($children as $row_category) { foreach ($months as $m => $_) { $year_sum += (float)($plan[$row_category->id][$m]['plan_summ'] ?? 0); } } ?>
title, ENT_QUOTES, 'UTF-8') ?> ₽/год id]); ?>
title, ENT_QUOTES, 'UTF-8') ?>
$mlabel): ?>
id, $m, $plan, $is_target); ?>
id]); $year_sum = 0.0; foreach ($months as $m => $_) { $year_sum += (float)($plan[$category->id][$m]['plan_summ'] ?? 0); } ?>
title, ENT_QUOTES, 'UTF-8') ?> ₽/год
$mlabel): ?>
id, $m, $plan, $is_target); ?>