templates/operacje/wydatki.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Operacje - Wydatki{% endblock %}
  3. {% block body %}
  4. <div class="container-fluid pt-4 px-4">
  5.     <div class="row">
  6.         <div class="col-12">
  7.             <div class="bg-secondary rounded p-4">
  8.                 <div class="d-flex justify-content-between align-items-center mb-3">
  9.                     <h4 class="mb-4">
  10.                         <i class="fa fa-arrow-up btn-outline-primary"></i>
  11.                         <i class="fa fa-coins btn-outline-primary"></i> &nbsp;
  12.                         Operacje - Wydatki
  13.                     </h4>
  14.                     <a href="{{ path('operacje_wydatki_new') }}" class="btn btn-primary">Dodaj nowy Wydatek</a>
  15.                 </div>
  16.                 <!-- Wybór roku i miesiąca -->
  17.                 <div class="row mb-4">
  18.                     <div class="col-md-4">
  19.                         <form method="get" class="form-inline">
  20.                             <div class="input-group">
  21.                                 <select name="rok" id="rok" class="form-select" style="width: auto;" onchange="this.form.submit()">
  22.                                     {% for rok in dostepneLata %}
  23.                                         <option value="{{ rok }}" {{ rok == wybranyRok ? 'selected' : '' }}>{{ rok }}</option>
  24.                                     {% endfor %}
  25.                                 </select> &nbsp;
  26.                                 <select name="miesiac" id="miesiac" class="form-select" style="width: auto;" onchange="this.form.submit()">
  27.                                     {% set miesiace = ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'] %}
  28.                                     {% for i in 1..12 %}
  29.                                         <option value="{{ i }}" {{ i == wybranyMiesiac ? 'selected' : '' }}>{{ miesiace[i-1] }}</option>
  30.                                     {% endfor %}
  31.                                 </select>
  32.                             </div>
  33.                         </form>
  34.                     </div>
  35.                 </div>
  36.                 <!-- Tabela z operacjami -->
  37.                 <div class="table-responsive">
  38.                     <table id="sortTable" class="table display">
  39.                         <thead>
  40.                         <tr class="text-white">
  41.                             <th>#</th>
  42.                             <th class="sort text-end filtr">Data</th>
  43.                             <th class="sort text-end filtr">Kategoria</th>
  44.                             <th class="sort text-end filtr">Nazwa</th>
  45.                             <th class="text-end sort filtr">Opis</th>
  46.                             <th class="text-end sort filtr">Kto</th>
  47.                             <th class="sort text-end filtr">Kwota</th>
  48.                             <th class="text-end">Akcje</th>
  49.                         </tr>
  50.                         </thead>
  51.                         <tbody>
  52.                         {% for rozchod in rozchodyZOperacjami %}
  53.                             <tr>
  54.                                 <td>{{ loop.index }}</td>
  55.                                 <td class="text-end">{{ rozchod.data_operacji|date('Y-m-d') }}</td>
  56.                                 <td class="text-end"><p class="text-warning">{{ rozchod.kategoria_nazwa ?? 'Brak kategorii' }}</p></td>
  57.                                 <td class="text-end"><p class="text-info">{{ rozchod.nazwa }}</p></td>
  58.                                 <td class="text-end" style="width: 20%">{{ rozchod.opis ?? '-' }}</td>
  59.                                 <td class="text-end">{{ rozchod.kto ?? '-' }}</td>
  60.                                 <td class="text-end">{{ rozchod.kwota|number_format(2, ',', ' ') }} zł</td>
  61.                                 <td class="text-end">
  62.                                     <a class="btn btn-sm btn-info" href="{{ path('operacje_wydatki_edit', {'id': rozchod.operacja_id}) }}">Edytuj</a>
  63.                                     <a class="btn btn-sm btn-primary" href="#" onclick="confirmDelete('{{ path('operacje_wydatki_delete', {'id': rozchod.operacja_id})  }}', {{ rozchod.operacja_id }})">
  64.                                         Usuń
  65.                                     </a>
  66.                                     {# Dodaj ukryty formularz POST #}
  67.                                     <form id="delete-form{{ rozchod.operacja_id }}" action="{{ path('operacje_wydatki_delete', {'id': rozchod.operacja_id}) }}" method="post" style="display: none;">
  68.                                         <input type="hidden" name="_method" value="POST">
  69.                                         <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ rozchod.operacja_id) }}">
  70.                                     </form>
  71.                                     {#                                        <a href="{{ path('operacje_rozchody_edit', {'id': rozchod.operacja_id}) }}" class="btn btn-sm btn-outline-primary me-1" title="Edytuj">#}
  72.                                     {#                                            <i class="bi bi-pencil"></i>#}
  73.                                     {#                                        </a>#}
  74.                                     {#                                        <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?');">#}
  75.                                     {#                                            <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ rozchod.operacja_id) }}">#}
  76.                                     {#                                            <button type="submit" class="btn btn-sm btn-outline-danger" title="Usuń">#}
  77.                                     {#                                                <i class="bi bi-trash"></i>#}
  78.                                     {#                                            </button>#}
  79.                                     {#                                        </form>#}
  80.                                 </td>
  81.                             </tr>
  82.                         {% else %}
  83.                             <tr>
  84.                                 <td colspan="8" class="text-center">Brak operacji dla wybranego okresu</td>
  85.                             </tr>
  86.                         {% endfor %}
  87.                         </tbody>
  88.                         <tfoot>
  89.                         <tr>
  90.                             <th></th>
  91.                             <th></th>
  92.                             <th></th>
  93.                             <th></th>
  94.                             <th></th>
  95.                             <th></th>
  96.                             <th></th>
  97.                             <th></th>
  98.                         </tr>
  99.                         </tfoot>
  100.                     </table>
  101.                 </div>
  102.             </div>
  103.         </div>
  104.     </div>
  105. </div>
  106.                 <div class="container-fluid pt-4 px-4">
  107.                     <div class="row">
  108.                         <div class="col-12">
  109.                             <div class="bg-secondary rounded p-3">
  110.                                 <div class="d-flex justify-content-between align-items-center">
  111.                                     <h4 class="mb-0">Podsumowanie</h4>
  112.                                     <div>
  113.                                         <span class="me-4">Suma: <strong id="totalSum" class="text-success">0.00 zł</strong></span>
  114.                                         <span>Liczba rekordów: <strong id="recordCount">0</strong></span>
  115.                                     </div>
  116.                                 </div>
  117.                             </div>
  118.                         </div>
  119.                     </div>
  120.                 </div>
  121. {% endblock %}
  122. {% block javascripts %}
  123.     {{ parent() }}
  124.     <script src="https://cdn.datatables.net/plug-ins/1.10.25/api/sum().js"></script>
  125.     <script>
  126.         function formatCurrency(value) {
  127.             // Konwertuj na liczbę, formatuj z dwoma miejscami po przecinku
  128.             const num = parseFloat(value).toFixed(2);
  129.             // Podziel na część całkowitą i ułamkową
  130.             const parts = num.toString().split('.');
  131.             // Dodaj spacje jako separatory tysięcy
  132.             parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
  133.             // Połącz części, zamieniając kropkę na przecinek
  134.             return parts.join(',');
  135.         }
  136.         function updateSummary() {
  137.             const table = $('#sortTable').DataTable();
  138.             let sum = 0;
  139.             // Iteruj przez widoczne wiersze
  140.             table.rows({search: 'applied'}).every(function () {
  141.                 const rowData = this.data();
  142.                 // Pobierz wartość z kolumny kwoty (indeks 6, licząc od 0)
  143.                 const kwotaText = rowData[6].toString().trim();
  144.                 // Zamień polski format liczby na format JavaScript
  145.                 const kwota = parseFloat(
  146.                     kwotaText
  147.                         .replace(/\s/g, '')  // Usuń spacje (tysiące)
  148.                         .replace(',', '.')   // Zamień przecinek na kropkę
  149.                         .replace(/[^\d.-]/g, '') // Zostaw tylko cyfry, kropkę i minus
  150.                 ) || 0;
  151.                 sum += kwota;
  152.             });
  153.             const recordCount = table.rows({search: 'applied'}).count();
  154.             $('#totalSum').text(formatCurrency(sum) + ' zł');
  155.             $('#recordCount').text(recordCount);
  156.         }
  157.         // Pobierz instancję DataTable
  158.         const table = $('#sortTable').DataTable();
  159.         const recordCount = table.rows({search: 'applied'}).count();
  160.         if (recordCount === 0) {
  161.             // Jeśli nie ma danych, zaktualizuj podsumowanie zerami
  162.             $('#totalSum').text('0,00 zł');
  163.             $('#recordCount').text('0');
  164.         } else {
  165.             // Zaktualizuj ustawienia DataTable
  166.             table.order([[1, 'desc']]).draw();
  167.             // Dodajemy nasze funkcje do wywołania po narysowaniu tabeli
  168.             table.on('draw', function () {
  169.                 updateSummary();
  170.             });
  171.             // Inicjalne wywołanie podsumowania
  172.             updateSummary();
  173.             // Aktualizuj podsumowanie przy wyszukiwaniu
  174.             $('.dataTables_filter input').on('keyup', function () {
  175.                 setTimeout(updateSummary, 300);
  176.             });
  177.             // Aktualizuj podsumowanie przy zmianie strony
  178.             $('.dataTables_paginate a').on('click', function () {
  179.                 setTimeout(updateSummary, 100);
  180.             });
  181.         }
  182.     </script>
  183. {% endblock %}