{% extends 'base.html.twig' %}
{% block title %}Operacje - Wydatki{% endblock %}
{% block body %}
<div class="container-fluid pt-4 px-4">
<div class="row">
<div class="col-12">
<div class="bg-secondary rounded p-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-4">
<i class="fa fa-arrow-up btn-outline-primary"></i>
<i class="fa fa-coins btn-outline-primary"></i>
Operacje - Wydatki
</h4>
<a href="{{ path('operacje_wydatki_new') }}" class="btn btn-primary">Dodaj nowy Wydatek</a>
</div>
<!-- Wybór roku i miesiąca -->
<div class="row mb-4">
<div class="col-md-4">
<form method="get" class="form-inline">
<div class="input-group">
<select name="rok" id="rok" class="form-select" style="width: auto;" onchange="this.form.submit()">
{% for rok in dostepneLata %}
<option value="{{ rok }}" {{ rok == wybranyRok ? 'selected' : '' }}>{{ rok }}</option>
{% endfor %}
</select>
<select name="miesiac" id="miesiac" class="form-select" style="width: auto;" onchange="this.form.submit()">
{% set miesiace = ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'] %}
{% for i in 1..12 %}
<option value="{{ i }}" {{ i == wybranyMiesiac ? 'selected' : '' }}>{{ miesiace[i-1] }}</option>
{% endfor %}
</select>
</div>
</form>
</div>
</div>
<!-- Tabela z operacjami -->
<div class="table-responsive">
<table id="sortTable" class="table display">
<thead>
<tr class="text-white">
<th>#</th>
<th class="sort text-end filtr">Data</th>
<th class="sort text-end filtr">Kategoria</th>
<th class="sort text-end filtr">Nazwa</th>
<th class="text-end sort filtr">Opis</th>
<th class="text-end sort filtr">Kto</th>
<th class="sort text-end filtr">Kwota</th>
<th class="text-end">Akcje</th>
</tr>
</thead>
<tbody>
{% for rozchod in rozchodyZOperacjami %}
<tr>
<td>{{ loop.index }}</td>
<td class="text-end">{{ rozchod.data_operacji|date('Y-m-d') }}</td>
<td class="text-end"><p class="text-warning">{{ rozchod.kategoria_nazwa ?? 'Brak kategorii' }}</p></td>
<td class="text-end"><p class="text-info">{{ rozchod.nazwa }}</p></td>
<td class="text-end" style="width: 20%">{{ rozchod.opis ?? '-' }}</td>
<td class="text-end">{{ rozchod.kto ?? '-' }}</td>
<td class="text-end">{{ rozchod.kwota|number_format(2, ',', ' ') }} zł</td>
<td class="text-end">
<a class="btn btn-sm btn-info" href="{{ path('operacje_wydatki_edit', {'id': rozchod.operacja_id}) }}">Edytuj</a>
<a class="btn btn-sm btn-primary" href="#" onclick="confirmDelete('{{ path('operacje_wydatki_delete', {'id': rozchod.operacja_id}) }}', {{ rozchod.operacja_id }})">
Usuń
</a>
{# Dodaj ukryty formularz POST #}
<form id="delete-form{{ rozchod.operacja_id }}" action="{{ path('operacje_wydatki_delete', {'id': rozchod.operacja_id}) }}" method="post" style="display: none;">
<input type="hidden" name="_method" value="POST">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ rozchod.operacja_id) }}">
</form>
{# <a href="{{ path('operacje_rozchody_edit', {'id': rozchod.operacja_id}) }}" class="btn btn-sm btn-outline-primary me-1" title="Edytuj">#}
{# <i class="bi bi-pencil"></i>#}
{# </a>#}
{# <form method="post" action="{{ path('operacje_rozchody_delete', {'id': rozchod.operacja_id}) }}" class="d-inline" onsubmit="return confirm('Czy na pewno chcesz usunąć ten przychód?');">#}
{# <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ rozchod.operacja_id) }}">#}
{# <button type="submit" class="btn btn-sm btn-outline-danger" title="Usuń">#}
{# <i class="bi bi-trash"></i>#}
{# </button>#}
{# </form>#}
</td>
</tr>
{% else %}
<tr>
<td colspan="8" class="text-center">Brak operacji dla wybranego okresu</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid pt-4 px-4">
<div class="row">
<div class="col-12">
<div class="bg-secondary rounded p-3">
<div class="d-flex justify-content-between align-items-center">
<h4 class="mb-0">Podsumowanie</h4>
<div>
<span class="me-4">Suma: <strong id="totalSum" class="text-success">0.00 zł</strong></span>
<span>Liczba rekordów: <strong id="recordCount">0</strong></span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="https://cdn.datatables.net/plug-ins/1.10.25/api/sum().js"></script>
<script>
function formatCurrency(value) {
// Konwertuj na liczbę, formatuj z dwoma miejscami po przecinku
const num = parseFloat(value).toFixed(2);
// Podziel na część całkowitą i ułamkową
const parts = num.toString().split('.');
// Dodaj spacje jako separatory tysięcy
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
// Połącz części, zamieniając kropkę na przecinek
return parts.join(',');
}
function updateSummary() {
const table = $('#sortTable').DataTable();
let sum = 0;
// Iteruj przez widoczne wiersze
table.rows({search: 'applied'}).every(function () {
const rowData = this.data();
// Pobierz wartość z kolumny kwoty (indeks 6, licząc od 0)
const kwotaText = rowData[6].toString().trim();
// Zamień polski format liczby na format JavaScript
const kwota = parseFloat(
kwotaText
.replace(/\s/g, '') // Usuń spacje (tysiące)
.replace(',', '.') // Zamień przecinek na kropkę
.replace(/[^\d.-]/g, '') // Zostaw tylko cyfry, kropkę i minus
) || 0;
sum += kwota;
});
const recordCount = table.rows({search: 'applied'}).count();
$('#totalSum').text(formatCurrency(sum) + ' zł');
$('#recordCount').text(recordCount);
}
// Pobierz instancję DataTable
const table = $('#sortTable').DataTable();
const recordCount = table.rows({search: 'applied'}).count();
if (recordCount === 0) {
// Jeśli nie ma danych, zaktualizuj podsumowanie zerami
$('#totalSum').text('0,00 zł');
$('#recordCount').text('0');
} else {
// Zaktualizuj ustawienia DataTable
table.order([[1, 'desc']]).draw();
// Dodajemy nasze funkcje do wywołania po narysowaniu tabeli
table.on('draw', function () {
updateSummary();
});
// Inicjalne wywołanie podsumowania
updateSummary();
// Aktualizuj podsumowanie przy wyszukiwaniu
$('.dataTables_filter input').on('keyup', function () {
setTimeout(updateSummary, 300);
});
// Aktualizuj podsumowanie przy zmianie strony
$('.dataTables_paginate a').on('click', function () {
setTimeout(updateSummary, 100);
});
}
</script>
{% endblock %}