Czego się nauczysz?
- Walidacji danych liczbowych (kwoty)
- Pracy z typami transakcji (przychód/wydatek)
- Obliczania sum i sald
- Filtrowania danych po typie i kategorii
- Tworzenia raportów finansowych
This content is not available in your language yet.
Stworzysz Planer budżetu tygodniowego - aplikację umożliwiającą rejestrowanie przychodów i wydatków. System oblicza bieżące saldo, kategoryzuje transakcje i generuje podsumowania finansowe za wybrany okres.
Czego się nauczysz?
W prawdziwej pracy...
Aplikacje do zarządzania budżetem są jednymi z najpopularniejszych na rynku. Umiejętność projektowania systemów z transakcjami, saldami, kategoriami i raportami jest fundamentem dla każdego programisty tworzącego aplikacje finansowe, bankowe, e-commerce czy systemy księgowe.
Formularz wprowadzania transakcji Użytkownik wybiera typ (przychód/wydatek), podaje kwotę i opcjonalnie opis oraz kategorię.
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy kwota jest liczbą dodatnią, czy typ transakcji jest wybrany.
Obliczenie salda System oblicza bieżące saldo: suma przychodów minus suma wydatków.
Lista transakcji Użytkownik widzi wszystkie transakcje posortowane od najnowszej, z kolorowaniem (zielony = przychód, czerwony = wydatek).
Przykładowa struktura pliku JSON:
{ "transactions": [ { "id": 1, "type": "income", "amount": 500.00, "category": "kieszonkowe", "description": "Od rodziców", "date": "2026-02-10", "created_at": "2026-02-10 18:30:00" }, { "id": 2, "type": "expense", "amount": 45.50, "category": "jedzenie", "description": "Obiad w szkole", "date": "2026-02-11", "created_at": "2026-02-11 13:15:00" }, { "id": 3, "type": "expense", "amount": 120.00, "category": "rozrywka", "description": "Kino z przyjaciółmi", "date": "2026-02-12", "created_at": "2026-02-12 20:00:00" }, { "id": 4, "type": "income", "amount": 150.00, "category": "praca", "description": "Korepetycje", "date": "2026-02-14", "created_at": "2026-02-14 17:00:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wybiera “wydatek”, wpisuje 45.50 zł i opis “Obiad”. Po zapisie widzi transakcję na liście z czerwonym kolorem. Na górze strony: “Saldo: 484,50 zł”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik filtruje: “tylko wydatki” lub “kategoria: jedzenie”. Widzi podsumowanie tygodnia: “Przychody: 650 zł, Wydatki: 285,50 zł, Saldo: +364,50 zł”. Może kliknąć kategorię i zobaczyć ile wydał na jedzenie.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi wykres kołowy: “Jedzenie: 35%, Rozrywka: 25%, Transport: 20%, Inne: 20%”. Ustawia budżet na jedzenie: 200 zł/tydzień. System ostrzega gdy przekroczy 80%. Porównanie: “vs poprzedni tydzień: -50 zł wydatków”.
Walidacja danych wejściowych:
$type = $_POST['type'] ?? '';$amount = filter_var($_POST['amount'] ?? '', FILTER_VALIDATE_FLOAT);$category = trim($_POST['category'] ?? '');
if (!in_array($type, ['income', 'expense'])) { $errors[] = "Wybierz typ transakcji (przychód lub wydatek)";}
if ($amount === false || $amount <= 0) { $errors[] = "Kwota musi być liczbą dodatnią";}
if ($amount > 100000) { $errors[] = "Kwota wydaje się zbyt duża";}Obliczanie salda:
function calculateBalance(array $transactions): array { $totalIncome = 0; $totalExpense = 0;
foreach ($transactions as $t) { if ($t['type'] === 'income') { $totalIncome += $t['amount']; } else { $totalExpense += $t['amount']; } }
return [ 'income' => round($totalIncome, 2), 'expense' => round($totalExpense, 2), 'balance' => round($totalIncome - $totalExpense, 2), ];}Formatowanie kwot:
function formatAmount(float $amount, string $type = ''): string { $formatted = number_format($amount, 2, ',', ' ') . ' zł';
if ($type === 'income') { return '+' . $formatted; } elseif ($type === 'expense') { return '-' . $formatted; }
return $formatted;}
function getAmountColor(string $type): string { return $type === 'income' ? '#27ae60' : '#e74c3c';}Filtrowanie transakcji:
function filterTransactions(array $transactions, ?string $type = null, ?string $category = null): array { return array_filter($transactions, function($t) use ($type, $category) { if ($type !== null && $t['type'] !== $type) { return false; } if ($category !== null && ($t['category'] ?? '') !== $category) { return false; } return true; });}
// Filtrowanie po daciefunction filterByDateRange(array $transactions, string $from, string $to): array { return array_filter($transactions, function($t) use ($from, $to) { return $t['date'] >= $from && $t['date'] <= $to; });}Podsumowanie według kategorii:
function summarizeByCategory(array $transactions): array { $summary = [];
foreach ($transactions as $t) { $category = $t['category'] ?? 'inne';
if (!isset($summary[$category])) { $summary[$category] = ['income' => 0, 'expense' => 0, 'count' => 0]; }
$summary[$category][$t['type']] += $t['amount']; $summary[$category]['count']++; }
// Sortuj według sumy wydatków (malejąco) uasort($summary, fn($a, $b) => $b['expense'] <=> $a['expense']);
return $summary;}Sprawdzanie budżetu (wariant C):
function checkBudget(array $transactions, array $budgets): array { $warnings = []; $categoryTotals = [];
// Policz wydatki w bieżącym tygodniu $weekStart = date('Y-m-d', strtotime('monday this week')); $weekEnd = date('Y-m-d', strtotime('sunday this week'));
foreach ($transactions as $t) { if ($t['type'] !== 'expense') continue; if ($t['date'] < $weekStart || $t['date'] > $weekEnd) continue;
$category = $t['category'] ?? 'inne'; $categoryTotals[$category] = ($categoryTotals[$category] ?? 0) + $t['amount']; }
// Sprawdź przekroczenia foreach ($budgets as $category => $limit) { $spent = $categoryTotals[$category] ?? 0; $percent = ($limit > 0) ? round(($spent / $limit) * 100) : 0;
if ($percent >= 100) { $warnings[] = [ 'category' => $category, 'message' => "Przekroczono budżet ({$percent}%)", 'severity' => 'danger', ]; } elseif ($percent >= 80) { $warnings[] = [ 'category' => $category, 'message' => "Zbliżasz się do limitu ({$percent}%)", 'severity' => 'warning', ]; } }
return $warnings;}Kategorie transakcji:
function getCategories(): array { return [ 'income' => [ 'kieszonkowe' => 'Kieszonkowe', 'praca' => 'Praca/Dorywcza', 'prezent' => 'Prezent', 'inne_przychod' => 'Inne', ], 'expense' => [ 'jedzenie' => 'Jedzenie', 'transport' => 'Transport', 'rozrywka' => 'Rozrywka', 'zakupy' => 'Zakupy', 'szkola' => 'Szkoła', 'inne_wydatek' => 'Inne', ], ];}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!