Przejdź do głównej zawartości

Planer budżetu tygodniowego

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?

  • 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

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.

  1. Formularz wprowadzania transakcji Użytkownik wybiera typ (przychód/wydatek), podaje kwotę i opcjonalnie opis oraz kategorię.

  2. Walidacja danych System sprawdza poprawność wprowadzonych danych - czy kwota jest liczbą dodatnią, czy typ transakcji jest wybrany.

  3. Obliczenie salda System oblicza bieżące saldo: suma przychodów minus suma wydatków.

  4. 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:

  • Formularz z polami: typ (przychód/wydatek), kwota, opis
  • Walidacja danych w PHP (kwota > 0, typ wybrany)
  • Lista wszystkich transakcji
  • Obliczenie i wyświetlenie salda
  • Prosty interfejs CSS (kolorowanie typów)

Przykładowy scenariusz:

Uż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ł”.

Ocena: 3.0

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, ',', ' ') . '';
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 dacie
function 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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!