1140 lines
66 KiB
PHP
1140 lines
66 KiB
PHP
<?php
|
|
$enablePrototypeComments = true;
|
|
include '../../header-travel.php';
|
|
?>
|
|
|
|
<div class="container-xxl flex-grow-1 container-p-y" style="padding-top: 1rem!important">
|
|
<div
|
|
class="d-flex flex-column flex-md-row justify-content-between align-items-start align-items-md-center mb-4 gap-3">
|
|
<div>
|
|
<h4 class="fw-bold mb-1">
|
|
<span class="text-muted fw-light">Koszty /</span> Faktury Zakupowe
|
|
</h4>
|
|
<p class="text-muted small mb-0">Zarządzaj fakturami od dostawców i przypisuj je do wycieczek.</p>
|
|
</div>
|
|
<div class="d-flex gap-2">
|
|
<button class="btn btn-label-secondary btn-icon" data-bs-toggle="tooltip" title="Ustawienia integracji">
|
|
<i class="bx bx-cog"></i>
|
|
</button>
|
|
<div class="btn-group" id="filtersButtonGroup">
|
|
<button class="btn btn-outline-secondary d-flex align-items-center position-relative"
|
|
id="btnToggleFilters" onclick="toggleFilters()">
|
|
<i class="bi bi-funnel me-2"></i> Filtry
|
|
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger d-none"
|
|
id="filtersActiveBadge">0</span>
|
|
</button>
|
|
<button type="button" class="btn btn-outline-secondary px-2" title="Filtry - wyczyść"
|
|
onclick="clearFilters()">
|
|
<i class="bi bi-x fs-5"></i>
|
|
</button>
|
|
</div>
|
|
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalUploadInvoice">
|
|
<i class="bx bx-plus me-1"></i> Wgraj fakturę
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="alert alert-primary d-flex align-items-center" role="alert">
|
|
<i class="bx bx-move-vertical fs-4 me-2"></i>
|
|
<div>
|
|
<strong>Wskazówka:</strong> Możesz przypisywać faktury do zleceń korzystając z metody "Przeciągnij i upuść"
|
|
(Drag & Drop) pomiędzy oknami, lub używając przycisków akcji w tabeli.
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Panel filtrów: Zlecenia -->
|
|
<div class="card mb-3 shadow-sm" id="filtersCard-zlecenia">
|
|
<div class="card-header bg-lighter px-3 d-flex align-items-center gap-2 border-bottom">
|
|
<h5 class="mb-0 text-primary"><i class="bi bi-sliders me-2"></i>Zaawansowane szukanie</h5>
|
|
</div>
|
|
<div class="card-body p-3">
|
|
<div class="row g-3">
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Wycieczka</label>
|
|
<input type="text" class="form-control " placeholder="Szukaj po ID / Nazwie">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Dostawca</label>
|
|
<select class="form-select">
|
|
<option value="">Wszyscy dostawcy</option>
|
|
<option value="1">Hotel Colosseum (Włochy)</option>
|
|
<option value="2">Flixbus Polska</option>
|
|
<option value="3">Przewodnik Jan Kowalski</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Data realizacji (Od - Do)</label>
|
|
<input type="text" class="form-control " placeholder="Wybierz zakres dat">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Status rozliczenia</label>
|
|
<div class="dropdown w-100" id="statusDropdown">
|
|
<button class="btn btn-white border form-select text-start fw-normal d-flex align-items-center justify-content-between w-100"
|
|
type="button" id="statusDropdownBtn"
|
|
onclick="toggleStatusDropdown(event)"
|
|
style="background-color:#fff;">
|
|
<span id="statusDropdownLabel" class="text-truncate">Wszystkie statusy</span>
|
|
</button>
|
|
<ul class="dropdown-menu w-100 p-2 shadow-sm" id="statusDropdownMenu" style="min-width:100%;">
|
|
<li>
|
|
<label class="dropdown-item d-flex align-items-center gap-2 py-1 px-2 rounded cursor-pointer">
|
|
<input type="checkbox" class="status-check form-check-input mt-0" value="settled"> Rozliczone
|
|
</label>
|
|
</li>
|
|
<li>
|
|
<label class="dropdown-item d-flex align-items-center gap-2 py-1 px-2 rounded cursor-pointer">
|
|
<input type="checkbox" class="status-check form-check-input mt-0" value="partial"> Częściowo rozliczone
|
|
</label>
|
|
</li>
|
|
<li>
|
|
<label class="dropdown-item d-flex align-items-center gap-2 py-1 px-2 rounded cursor-pointer">
|
|
<input type="checkbox" class="status-check form-check-input mt-0" value="unsettled"> Nierozliczone
|
|
</label>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Panel filtrów: Faktury -->
|
|
<div class="card mb-3 shadow-sm d-none" id="filtersCard-faktury">
|
|
<div class="card-header bg-lighter px-3 d-flex align-items-center gap-2 border-bottom">
|
|
<h5 class="mb-0 text-primary"><i class="bi bi-sliders me-2"></i>Zaawansowane szukanie</h5>
|
|
</div>
|
|
<div class="card-body p-3">
|
|
<div class="row g-3">
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Dostawca / NIP</label>
|
|
<input type="text" class="form-control" placeholder="Szukaj...">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Numer faktury</label>
|
|
<input type="text" class="form-control" placeholder="Wpisz numer">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Status powiązania</label>
|
|
<select class="form-select">
|
|
<option value="">Wszystkie</option>
|
|
<option value="unassigned">Nieprzypisane</option>
|
|
<option value="assigned">Przypisane (1:1)</option>
|
|
<option value="split">Rozksięgowane (1:N)</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label small mb-1">Źródło</label>
|
|
<select class="form-select">
|
|
<option value="">Wszystkie</option>
|
|
<option value="fakturownia">Fakturownia</option>
|
|
<option value="invoice">Invoice.Travel</option>
|
|
<option value="pilot">Aplikacja Pilota</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="nav-align-top mb-4">
|
|
<ul class="nav nav-tabs nav-fill invoice-tabs" role="tablist">
|
|
<li class="nav-item">
|
|
<button type="button" class="nav-link active" role="tab" data-bs-toggle="tab"
|
|
data-bs-target="#navs-zlecenia">
|
|
<i class="bx bx-list-check me-1"></i> Zlecenia do ofakturowania
|
|
<span class="badge rounded-pill badge-center h-px-20 w-px-20 bg-danger ms-1">3</span>
|
|
</button>
|
|
</li>
|
|
<li class="nav-item">
|
|
<button type="button" class="nav-link" role="tab" data-bs-toggle="tab" data-bs-target="#navs-faktury">
|
|
<i class="bx bx-file me-1"></i> Baza faktur
|
|
</button>
|
|
</li>
|
|
</ul>
|
|
|
|
<div class="tab-content px-0 pb-0 shadow-none border-0">
|
|
|
|
<div class="tab-pane fade show active" id="navs-zlecenia" role="tabpanel">
|
|
|
|
<div class="card shadow-sm">
|
|
<div class="table-responsive text-nowrap">
|
|
<table class="table table-hover">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>Zlecenie / Wycieczka</th>
|
|
<th>Dostawca</th>
|
|
<th>Data realizacji</th>
|
|
<th class="text-end">Kwota zlecenia</th>
|
|
<th class="text-center">Status faktury</th>
|
|
<th class="text-end">Akcje</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="table-border-bottom-0">
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/142</span>
|
|
<small class="text-muted">#WYC-102 (Rzym na Weekend)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-primary">HC</span>
|
|
</div><span>Hotel Colosseum</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">12.05.2026</span></td>
|
|
<td class="text-end fw-semibold">12 500,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-danger" data-bs-toggle="tooltip"
|
|
title="Brak przypiętej faktury">Nierozliczone</span></td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-primary" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</button>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/089</span>
|
|
<small class="text-muted">#WYC-098 (Tatry Maj)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-info">FL</span></div>
|
|
<span>Flixbus Polska</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">05.05.2026</span></td>
|
|
<td class="text-end fw-semibold">4 200,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-warning"
|
|
data-bs-toggle="tooltip"
|
|
title="Faktura zaliczkowa. Brakuje końcowej.">Częściowo rozliczone</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary"
|
|
href="javascript:void(0);"><i class="bx bx-show me-1"></i>
|
|
Szczegóły</button>
|
|
<button type="button"
|
|
class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split"
|
|
data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/112</span>
|
|
<small class="text-muted">#WYC-102 (Rzym na Weekend)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-secondary">MW</span>
|
|
</div><span>Muzeum Watykańskie</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">14.05.2026</span></td>
|
|
<td class="text-end fw-semibold">850,00 EUR</td>
|
|
<td class="text-center"><span class="badge bg-label-success">Rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary" href="javascript:void(0);"><i class="bx bx-show me-1"></i> Szczegóły</button>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item disabled" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/04/201</span>
|
|
<small class="text-muted">#WYC-091 (Paryż Średn.)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-danger">AC</span>
|
|
</div><span>Air Corsica</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">22.04.2026</span></td>
|
|
<td class="text-end fw-semibold">8 760,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-success">Rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary" href="javascript:void(0);"><i class="bx bx-show me-1"></i> Szczegóły</button>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item disabled" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/158</span>
|
|
<small class="text-muted">#WYC-105 (Kraków Wiosna)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-warning">HW</span>
|
|
</div><span>Hotel Wawel</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">18.05.2026</span></td>
|
|
<td class="text-end fw-semibold">5 400,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-danger">Nierozliczone</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-primary" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</button>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/077</span>
|
|
<small class="text-muted">#WYC-095 (Barcelona)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-success">RS</span>
|
|
</div><span>Restauracja Sol</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">02.05.2026</span></td>
|
|
<td class="text-end fw-semibold">1 920,00 EUR</td>
|
|
<td class="text-center"><span class="badge bg-label-warning"
|
|
data-bs-toggle="tooltip" title="Rozliczono 60% kwoty zlecenia">Częściowo
|
|
rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary"
|
|
href="javascript:void(0);"><i class="bx bx-show me-1"></i>
|
|
Szczegóły</button>
|
|
<button type="button"
|
|
class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split"
|
|
data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/04/188</span>
|
|
<small class="text-muted">#WYC-088 (Madera)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-info">TN</span></div>
|
|
<span>TAP Air Portugal</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">10.04.2026</span></td>
|
|
<td class="text-end fw-semibold">14 300,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-success">Rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary" href="javascript:void(0);"><i class="bx bx-show me-1"></i> Szczegóły</button>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item disabled" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/199</span>
|
|
<small class="text-muted">#WYC-108 (Zakopane Weekend)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-primary">PJ</span>
|
|
</div><span>Przewodnik Jan Kowalski</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">24.05.2026</span></td>
|
|
<td class="text-end fw-semibold">750,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-danger">Nierozliczone</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-primary" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</button>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/034</span>
|
|
<small class="text-muted">#WYC-099 (Wenecja)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-secondary">VA</span>
|
|
</div><span>Venezia Apartments</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">08.05.2026</span></td>
|
|
<td class="text-end fw-semibold">3 680,00 EUR</td>
|
|
<td class="text-center"><span class="badge bg-label-warning"
|
|
data-bs-toggle="tooltip"
|
|
title="Faktura zaliczkowa zaksięgowana. Oczekiwanie na końcową.">Częściowo
|
|
rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary"
|
|
href="javascript:void(0);"><i class="bx bx-show me-1"></i>
|
|
Szczegóły</button>
|
|
<button type="button"
|
|
class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split"
|
|
data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i
|
|
class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/04/155</span>
|
|
<small class="text-muted">#WYC-082 (Wiednia Klasyk)</small>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="avatar avatar-xs me-2"><span
|
|
class="avatar-initial rounded-circle bg-label-danger">OB</span>
|
|
</div><span>ÖBB Rail</span>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">18.04.2026</span></td>
|
|
<td class="text-end fw-semibold">6 120,00 PLN</td>
|
|
<td class="text-center"><span class="badge bg-label-success">Rozliczone</span></td>
|
|
<td class="text-end">
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-outline-secondary" href="javascript:void(0);"><i class="bx bx-show me-1"></i> Szczegóły</button>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><a class="dropdown-item disabled" href="javascript:void(0);"><i class="bx bx-link me-1"></i> Przypisz fakturę</a></li>
|
|
<li><a class="dropdown-item" href="javascript:void(0);"><i class="bx bx-edit me-1"></i> Edytuj</a></li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-pane fade" id="navs-faktury" role="tabpanel">
|
|
|
|
<div class="card shadow-sm">
|
|
<div class="table-responsive text-nowrap">
|
|
<table class="table table-hover">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>Numer Faktury</th>
|
|
<th>Dostawca (Triada)</th>
|
|
<th>Data wyst.</th>
|
|
<th class="text-end">Kwota Brutto</th>
|
|
<th class="text-center">Status powiązania</th>
|
|
<th class="text-end">Akcje</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="table-border-bottom-0">
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<i class="bx bxs-file-pdf text-danger fs-4 me-2"></i>
|
|
<span class="fw-semibold text-dark">FV/2026/05/1234</span>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span>Flixbus Polska</span>
|
|
<small class="text-muted">NIP: 1234567890</small>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">04.05.2026</span></td>
|
|
<td class="text-end fw-bold">4 200,00 PLN</td>
|
|
<td class="text-center">
|
|
<span class="badge bg-label-danger">Nieprzypisana</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-icon btn-text-secondary" data-bs-toggle="tooltip"
|
|
title="Podgląd dokumentu"><i class="bx bx-show"></i></button>
|
|
<button class="btn btn-sm btn-primary ms-1">Połącz ze zleceniem</button>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<i class="bx bx-receipt text-success fs-4 me-2"></i>
|
|
<span class="fw-semibold text-dark">F-2026-999</span>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span>Przewodnik Jan Kowalski</span>
|
|
<small class="text-muted">NIP: 0987654321</small>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">10.05.2026</span></td>
|
|
<td class="text-end fw-bold">3 000,00 PLN</td>
|
|
<td class="text-center">
|
|
<span class="badge bg-label-info" data-bs-toggle="tooltip"
|
|
title="Przypisano do 3 różnych zleceń/wycieczek">Rozksięgowana (1:N)</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-icon btn-text-secondary" data-bs-toggle="tooltip"
|
|
title="Szczegóły rozksięgowania"><i class="bx bx-list-ul"></i></button>
|
|
<button class="btn btn-sm btn-icon btn-text-secondary"><i
|
|
class="bx bx-show"></i></button>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<i class="bx bx-image text-warning fs-4 me-2" data-bs-toggle="tooltip"
|
|
title="Skan z aplikacji pilota"></i>
|
|
<span class="fw-semibold text-dark">Paragon/FV 12</span>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span>Muzeum Watykańskie</span>
|
|
<small class="text-muted">Pilot: Tomasz S.</small>
|
|
</div>
|
|
</td>
|
|
<td><span class="text-muted">14.05.2026</span></td>
|
|
<td class="text-end fw-bold">850,00 EUR</td>
|
|
<td class="text-center">
|
|
<span class="badge bg-label-success">Przypisana (1:1)</span>
|
|
</td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-icon btn-text-secondary" data-bs-toggle="tooltip"
|
|
title="Podgląd skanu"><i class="bx bx-show"></i></button>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="modal fade" id="modalUploadInvoice" tabindex="-1" aria-hidden="true" data-bs-backdrop="static">
|
|
<div class="modal-dialog modal-xl modal-dialog-centered">
|
|
<div class="modal-content border-0 shadow-lg">
|
|
|
|
<div class="modal-header border-bottom pb-3">
|
|
<h5 class="modal-title">
|
|
<i class="bx bx-receipt text-primary me-2 fs-4"></i>
|
|
Dodaj i przypisz fakturę
|
|
</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
|
|
<div class="modal-body p-4">
|
|
|
|
<ul class="nav nav-pills nav-fill mb-4" id="invoiceWizard" role="tablist">
|
|
<li class="nav-item" role="presentation">
|
|
<button class="nav-link active" id="step-upload-tab" data-bs-toggle="tab"
|
|
data-bs-target="#step-upload" type="button" role="tab">
|
|
<i class="bx bx-upload me-1"></i> 1. Wgraj dokument
|
|
</button>
|
|
</li>
|
|
<li class="nav-item" role="presentation">
|
|
<button class="nav-link disabled" id="step-validate-tab" data-bs-toggle="tab"
|
|
data-bs-target="#step-validate" type="button" role="tab">
|
|
<i class="bx bx-check-shield me-1"></i> 2. Weryfikacja danych
|
|
</button>
|
|
</li>
|
|
<li class="nav-item" role="presentation">
|
|
<button class="nav-link disabled" id="step-assign-tab" data-bs-toggle="tab"
|
|
data-bs-target="#step-assign" type="button" role="tab">
|
|
<i class="bx bx-link me-1"></i> 3. Przypisz do zlecenia
|
|
</button>
|
|
</li>
|
|
</ul>
|
|
|
|
<div class="tab-content p-0 border-0 shadow-none">
|
|
|
|
<div class="tab-pane fade show active" id="step-upload" role="tabpanel">
|
|
<div class="text-center mb-4">
|
|
<h5 class="mb-1">Wgraj dokument faktury</h5>
|
|
<p class="text-muted small">System automatycznie odczyta dane z dokumentu (OCR)</p>
|
|
</div>
|
|
|
|
<div class="border border-2 border-dashed rounded p-5 text-center bg-lighter mb-4"
|
|
id="invoiceDropzone" style="cursor: pointer; border-color: #d9dee3 !important;">
|
|
<div id="dropzoneContent">
|
|
<div class="avatar avatar-xl mx-auto mb-3">
|
|
<span class="avatar-initial rounded-circle bg-label-primary"><i
|
|
class="bx bx-cloud-upload fs-1"></i></span>
|
|
</div>
|
|
<h5 class="mb-1">Kliknij, aby wybrać plik</h5>
|
|
<p class="text-muted small mb-0">Obsługiwane formaty: PDF, JPG, PNG (max. 10MB)</p>
|
|
<input type="file" id="fileInput" class="d-none" accept=".pdf,.jpg,.jpeg,.png">
|
|
</div>
|
|
|
|
<div id="filePreview" class="d-none">
|
|
<div
|
|
class="d-inline-flex align-items-center bg-white p-3 rounded border shadow-sm mx-auto">
|
|
<i class="bx bxs-file-pdf text-danger fs-1 me-3"></i>
|
|
<div class="text-start me-4">
|
|
<div class="fw-semibold text-dark" id="fileName">faktura_transport.pdf</div>
|
|
<small class="text-muted" id="fileSize">2.4 MB</small>
|
|
</div>
|
|
<button type="button" class="btn btn-sm btn-icon btn-label-danger rounded-circle"
|
|
id="btnRemoveFile" data-bs-toggle="tooltip" title="Usuń plik">
|
|
<i class="bx bx-trash"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="mt-4" id="ocrLoader">
|
|
<div class="spinner-border spinner-border-sm text-primary me-2" role="status"></div>
|
|
<span class="text-muted">Trwa rozpoznawanie danych (OCR)...</span>
|
|
</div>
|
|
<div class="mt-4 d-none text-success fw-semibold" id="ocrSuccess">
|
|
<i class="bx bx-check-circle me-1"></i> Dane odczytane pomyślnie!
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="text-center">
|
|
<button type="button" class="btn btn-link text-muted" onclick="skipUpload()">
|
|
<i class="bx bx-edit me-1"></i> Lub wprowadź dane ręcznie bez pliku
|
|
</button>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-end gap-2 mt-4 pt-3 border-top">
|
|
<button type="button" class="btn btn-label-secondary"
|
|
data-bs-dismiss="modal">Anuluj</button>
|
|
<button type="button" class="btn btn-primary" id="btnNextToValidate" disabled
|
|
onclick="nextTab('step-validate-tab')">
|
|
Dalej: Weryfikacja <i class="bx bx-chevron-right ms-1"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-pane fade" id="step-validate" role="tabpanel">
|
|
|
|
<div class="alert alert-danger d-flex align-items-baseline d-none" role="alert">
|
|
<span class="alert-icon alert-icon-lg text-danger me-2"><i
|
|
class="bx bx-error-circle fs-4"></i></span>
|
|
<div>
|
|
<h6 class="alert-heading fw-bold mb-1">Możliwy duplikat!</h6>
|
|
<p class="mb-0 small">Faktura o tym samym numerze i kwocie od tego dostawcy już istnieje
|
|
w systemie.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-4">
|
|
<div class="col-md-6">
|
|
<div class="card shadow-none border h-100">
|
|
<div class="card-header bg-lighter py-3 border-bottom">
|
|
<h6 class="mb-0"><i class="bx bx-building-house me-2"></i>Dane dostawcy</h6>
|
|
</div>
|
|
<div class="card-body pt-3">
|
|
<div class="mb-3">
|
|
<label class="form-label">Nazwa dostawcy <span
|
|
class="text-danger">*</span></label>
|
|
<input type="text" class="form-control" value="Flixbus Polska Sp. z o.o.">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label d-flex justify-content-between">
|
|
<span>NIP <span class="text-danger">*</span></span>
|
|
<span class="text-success small"><i class="bx bx-check-circle"></i>
|
|
Znaleziono w bazie</span>
|
|
</label>
|
|
<input type="text" class="form-control border-success" value="1234567890">
|
|
</div>
|
|
<div class="mb-0">
|
|
<label class="form-label">Adres</label>
|
|
<textarea class="form-control"
|
|
rows="2">ul. Przykładowa 12, Warszawa</textarea>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card shadow-none border h-100">
|
|
<div class="card-header bg-lighter py-3 border-bottom">
|
|
<h6 class="mb-0"><i class="bx bx-receipt me-2"></i>Szczegóły dokumentu</h6>
|
|
</div>
|
|
<div class="card-body pt-3">
|
|
<div class="row g-3">
|
|
<div class="col-sm-6">
|
|
<label class="form-label">Nr faktury <span
|
|
class="text-danger">*</span></label>
|
|
<input type="text" class="form-control" value="FV/2026/05/123">
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<label class="form-label">Data wystawienia <span
|
|
class="text-danger">*</span></label>
|
|
<input type="date" class="form-control" value="2026-05-04">
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<label class="form-label">Kwota netto</label>
|
|
<input type="number" class="form-control" value="3414.63">
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<label class="form-label">Kwota VAT</label>
|
|
<input type="number" class="form-control" value="785.37">
|
|
</div>
|
|
<div class="col-sm-8">
|
|
<label class="form-label">Kwota brutto <span
|
|
class="text-danger">*</span></label>
|
|
<input type="number" class="form-control fw-bold text-primary"
|
|
value="4200.00">
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<label class="form-label">Waluta</label>
|
|
<select class="form-select">
|
|
<option value="PLN" selected>PLN</option>
|
|
<option value="EUR">EUR</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-between mt-4 pt-3 border-top">
|
|
<button type="button" class="btn btn-label-secondary" onclick="prevTab('step-upload-tab')">
|
|
<i class="bx bx-chevron-left me-1"></i> Wróć
|
|
</button>
|
|
<button type="button" class="btn btn-primary" onclick="nextTab('step-assign-tab')">
|
|
Dalej: Przypisz <i class="bx bx-chevron-right ms-1"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-pane fade" id="step-assign" role="tabpanel">
|
|
|
|
<h6 class="mb-3">Wybierz sposób rozliczenia dokumentu</h6>
|
|
|
|
<div class="row g-3 mb-4">
|
|
|
|
<div class="col-md-4">
|
|
<label class="card border border-2 shadow-none cursor-pointer h-100 option-card"
|
|
for="assignSingle">
|
|
<div class="card-body text-center p-3">
|
|
<input type="radio" name="assignType" id="assignSingle" value="single"
|
|
class="form-check-input mb-3" checked onchange="toggleAssignType('single')">
|
|
<h6 class="mb-1"><i
|
|
class="bx bx-link-alt fs-4 d-block mb-2 text-primary"></i>Pojedyncze
|
|
(1:1)</h6>
|
|
<small class="text-muted">Jedna faktura na jedno zlecenie.</small>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="card border shadow-none cursor-pointer h-100 option-card bg-lighter"
|
|
for="assignSplit">
|
|
<div class="card-body text-center p-3">
|
|
<input type="radio" name="assignType" id="assignSplit" value="split"
|
|
class="form-check-input mb-3" onchange="toggleAssignType('split')">
|
|
<h6 class="mb-1"><i
|
|
class="bx bx-git-branch fs-4 d-block mb-2 text-primary"></i>Rozksięgowanie
|
|
(1:N)</h6>
|
|
<small class="text-muted">Faktura zbiorcza na kilka zleceń.</small>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="card border shadow-none cursor-pointer h-100 option-card bg-lighter"
|
|
for="assignPartial">
|
|
<div class="card-body text-center p-3">
|
|
<input type="radio" name="assignType" id="assignPartial" value="partial"
|
|
class="form-check-input mb-3" onchange="toggleAssignType('partial')">
|
|
<h6 class="mb-1"><i
|
|
class="bx bx-layer-plus fs-4 d-block mb-2 text-primary"></i>Cząstkowe
|
|
(N:1)</h6>
|
|
<small class="text-muted">Zaliczka/Dopłata do zlecenia.</small>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card shadow-sm border">
|
|
<div
|
|
class="card-header bg-label-secondary d-flex justify-content-between align-items-center py-3">
|
|
<h6 class="mb-0">Dostępne zlecenia dla: Flixbus Polska</h6>
|
|
<div class="input-group input-group-sm w-auto">
|
|
<span class="input-group-text"><i class="bx bx-search"></i></span>
|
|
<input type="text" class="form-control" placeholder="Szukaj wycieczki...">
|
|
</div>
|
|
</div>
|
|
<div class="table-responsive" style="max-height: 300px;">
|
|
<table class="table table-hover mb-0">
|
|
<thead class="table-light sticky-top">
|
|
<tr>
|
|
<th width="40"></th>
|
|
<th>Zlecenie / Wycieczka</th>
|
|
<th>Data real.</th>
|
|
<th class="text-end">Kwota zlecenia</th>
|
|
<th width="150" class="text-end split-col d-none">Przypisz kwotę</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><input class="form-check-input" type="checkbox" name="orderSelect"></td>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/089</span>
|
|
<small class="text-muted">#WYC-098 (Tatry)</small>
|
|
</div>
|
|
</td>
|
|
<td>05.05.2026</td>
|
|
<td class="text-end fw-semibold">4 200,00 PLN</td>
|
|
<td class="split-col d-none text-end"><input type="number"
|
|
class="form-control form-control-sm text-end" placeholder="0.00">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><input class="form-check-input" type="checkbox" name="orderSelect"></td>
|
|
<td>
|
|
<div class="d-flex flex-column">
|
|
<span class="fw-semibold text-primary">ZL/2026/05/156</span>
|
|
<small class="text-muted">#WYC-103 (Kraków)</small>
|
|
</div>
|
|
</td>
|
|
<td>08.05.2026</td>
|
|
<td class="text-end fw-semibold">2 100,00 PLN</td>
|
|
<td class="split-col d-none text-end"><input type="number"
|
|
class="form-control form-control-sm text-end" placeholder="0.00">
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-between mt-4 pt-3 border-top">
|
|
<button type="button" class="btn btn-label-secondary"
|
|
onclick="prevTab('step-validate-tab')">
|
|
<i class="bx bx-chevron-left me-1"></i> Wróć
|
|
</button>
|
|
<button type="button" class="btn btn-success">
|
|
<i class="bx bx-check me-1"></i> Zapisz i Powiąż
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// --- OBSŁUGA PANELU FILTRÓW ---
|
|
var filtersVisible = true; // początkowo widoczne
|
|
|
|
function getActiveFilterCard() {
|
|
var activeTab = document.querySelector('.invoice-tabs .nav-link.active');
|
|
if (!activeTab) return null;
|
|
var target = activeTab.getAttribute('data-bs-target');
|
|
if (target === '#navs-zlecenia') return document.getElementById('filtersCard-zlecenia');
|
|
if (target === '#navs-faktury') return document.getElementById('filtersCard-faktury');
|
|
return null;
|
|
}
|
|
|
|
function toggleFilters() {
|
|
filtersVisible = !filtersVisible;
|
|
var card = getActiveFilterCard();
|
|
if (card) card.classList.toggle('d-none', !filtersVisible);
|
|
var btn = document.getElementById('btnToggleFilters');
|
|
btn.classList.toggle('btn-secondary', filtersVisible);
|
|
btn.classList.toggle('btn-outline-secondary', !filtersVisible);
|
|
}
|
|
|
|
function updateFilterBadge() {
|
|
var count = 0;
|
|
document.querySelectorAll('.filter-input').forEach(function (el) {
|
|
if (el.value && el.value !== '') count++;
|
|
});
|
|
var badge = document.getElementById('filtersActiveBadge');
|
|
badge.textContent = count;
|
|
badge.classList.toggle('d-none', count === 0);
|
|
}
|
|
|
|
function clearFilters() {
|
|
document.querySelectorAll('.filter-input').forEach(function (el) {
|
|
el.tagName === 'SELECT' ? (el.selectedIndex = 0) : (el.value = '');
|
|
});
|
|
updateFilterBadge();
|
|
}
|
|
|
|
// Przy przełączeniu zakładki — pokazuj/chowaj właściwy panel
|
|
document.querySelectorAll('.invoice-tabs .nav-link').forEach(function (tabEl) {
|
|
tabEl.addEventListener('shown.bs.tab', function (e) {
|
|
// Schowaj oba
|
|
document.getElementById('filtersCard-zlecenia').classList.add('d-none');
|
|
document.getElementById('filtersCard-faktury').classList.add('d-none');
|
|
// Pokaż właściwy tylko jeśli filtry są widoczne
|
|
if (filtersVisible) {
|
|
var target = e.target.getAttribute('data-bs-target');
|
|
document.getElementById('filtersCard-zlecenia').classList.toggle('d-none', target !== '#navs-zlecenia');
|
|
document.getElementById('filtersCard-faktury').classList.toggle('d-none', target !== '#navs-faktury');
|
|
}
|
|
});
|
|
});
|
|
|
|
// Obserwuj zmiany pól filtrów
|
|
document.addEventListener('change', function (e) {
|
|
if (e.target.classList.contains('filter-input')) updateFilterBadge();
|
|
});
|
|
document.addEventListener('input', function (e) {
|
|
if (e.target.classList.contains('filter-input')) updateFilterBadge();
|
|
});
|
|
|
|
// --- OBSŁUGA WIZARDA (Zakładek) ---
|
|
function nextTab(tabId) {
|
|
// Aktywuj zakładkę, żeby można było w nią kliknąć
|
|
document.getElementById(tabId).classList.remove('disabled');
|
|
// Przejdź do zakładki
|
|
var tab = new bootstrap.Tab(document.getElementById(tabId));
|
|
tab.show();
|
|
}
|
|
|
|
function prevTab(tabId) {
|
|
var tab = new bootstrap.Tab(document.getElementById(tabId));
|
|
tab.show();
|
|
}
|
|
|
|
// --- SYMULACJA WGRYWANIA PLIKU (Kliknięcie w obszar) ---
|
|
const dropzone = document.getElementById('invoiceDropzone');
|
|
const fileInput = document.getElementById('fileInput');
|
|
const btnNextUpload = document.getElementById('btnNextToValidate');
|
|
|
|
dropzone.addEventListener('click', function (e) {
|
|
if (e.target.id !== 'btnRemoveFile' && !e.target.closest('#btnRemoveFile')) {
|
|
fileInput.click();
|
|
}
|
|
});
|
|
|
|
fileInput.addEventListener('change', function (e) {
|
|
if (e.target.files.length > 0) {
|
|
document.getElementById('dropzoneContent').classList.add('d-none');
|
|
document.getElementById('filePreview').classList.remove('d-none');
|
|
|
|
// Symulacja ładowania OCR
|
|
document.getElementById('ocrLoader').classList.remove('d-none');
|
|
document.getElementById('ocrSuccess').classList.add('d-none');
|
|
btnNextUpload.disabled = true;
|
|
|
|
setTimeout(function () {
|
|
document.getElementById('ocrLoader').classList.add('d-none');
|
|
document.getElementById('ocrSuccess').classList.remove('d-none');
|
|
btnNextUpload.disabled = false;
|
|
|
|
// Automatyczne przejście do kroku 2 po 2 sekundach
|
|
setTimeout(function () {
|
|
nextTab('step-validate-tab');
|
|
}, 2000);
|
|
}, 1500);
|
|
}
|
|
});
|
|
|
|
// Usuwanie pliku
|
|
document.getElementById('btnRemoveFile').addEventListener('click', function () {
|
|
document.getElementById('dropzoneContent').classList.remove('d-none');
|
|
document.getElementById('filePreview').classList.add('d-none');
|
|
fileInput.value = '';
|
|
btnNextUpload.disabled = true;
|
|
});
|
|
|
|
// Pomiń wgranie pliku
|
|
function skipUpload() {
|
|
btnNextUpload.disabled = false;
|
|
nextTab('step-validate-tab');
|
|
}
|
|
|
|
// --- OBSŁUGA STYLOWANIA TYPÓW PRZYPISANIA ---
|
|
function toggleAssignType(type) {
|
|
// Reset stylowania kart
|
|
document.querySelectorAll('.option-card').forEach(card => {
|
|
card.classList.remove('border-2', 'border-primary');
|
|
card.classList.add('bg-lighter');
|
|
});
|
|
|
|
// Ostylowanie aktywnej karty
|
|
const activeInput = document.querySelector(`input[value="${type}"]`);
|
|
const activeCard = activeInput.closest('.option-card');
|
|
activeCard.classList.add('border-2', 'border-primary');
|
|
activeCard.classList.remove('bg-lighter');
|
|
|
|
// Pokaż/ukryj kolumnę z kwotami w tabeli (dla 1:N)
|
|
const splitCols = document.querySelectorAll('.split-col');
|
|
if (type === 'split') {
|
|
splitCols.forEach(col => col.classList.remove('d-none'));
|
|
// Zmiana radio na checkboxy w tabeli
|
|
document.querySelectorAll('input[name="orderSelect"]').forEach(el => el.type = 'checkbox');
|
|
} else {
|
|
splitCols.forEach(col => col.classList.add('d-none'));
|
|
// Zmiana na radio w tabeli, aby można było wybrać tylko jedno
|
|
document.querySelectorAll('input[name="orderSelect"]').forEach(el => el.type = 'radio');
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
/* Poprawa kontrastu dla aktywnych tabów głównych */
|
|
.invoice-tabs .nav-link {
|
|
color: #697a8d;
|
|
background-color: #f5f5f9;
|
|
border: 1px solid #d9dee3;
|
|
margin: 0 2px;
|
|
border-radius: 0.375rem 0.375rem 0 0;
|
|
}
|
|
|
|
.invoice-tabs .nav-link:hover {
|
|
color: #696cff;
|
|
background-color: #fff;
|
|
}
|
|
|
|
.invoice-tabs .nav-link.active {
|
|
color: #696cff;
|
|
background-color: #fff;
|
|
border-bottom-color: #fff;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Poprawa kontrastu dla wizarda w modalu */
|
|
#invoiceWizard .nav-link {
|
|
color: #697a8d !important;
|
|
background-color: #f5f5f9 !important;
|
|
border: 1px solid #d9dee3 !important;
|
|
}
|
|
|
|
#invoiceWizard .nav-link:hover {
|
|
color: #696cff !important;
|
|
background-color: #fff !important;
|
|
border-color: #696cff !important;
|
|
}
|
|
|
|
#invoiceWizard .nav-link.active {
|
|
color: #696cff !important;
|
|
background-color: #fff !important;
|
|
border-color: #696cff !important;
|
|
font-weight: 600 !important;
|
|
}
|
|
|
|
#invoiceWizard .nav-link.disabled {
|
|
opacity: 0.5;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Drobne poprawki wizualne dla kart wyboru w modalu */
|
|
.option-card {
|
|
transition: all 0.2s ease-in-out;
|
|
}
|
|
|
|
.option-card:hover {
|
|
border-color: #696cff !important;
|
|
}
|
|
</style>
|
|
|
|
<script>
|
|
// --- Checkbox dropdown: Status rozliczenia ---
|
|
function toggleStatusDropdown(e) {
|
|
e.stopPropagation();
|
|
var menu = document.getElementById('statusDropdownMenu');
|
|
menu.classList.toggle('show');
|
|
}
|
|
|
|
function updateStatusLabel() {
|
|
var checks = document.querySelectorAll('.status-check:checked');
|
|
var label = document.getElementById('statusDropdownLabel');
|
|
if (checks.length === 0) {
|
|
label.textContent = 'Wszystkie statusy';
|
|
} else {
|
|
var names = Array.from(checks).map(function(c) {
|
|
return c.closest('label').textContent.trim();
|
|
});
|
|
label.textContent = names.join(', ');
|
|
}
|
|
}
|
|
|
|
document.querySelectorAll('.status-check').forEach(function(cb) {
|
|
cb.addEventListener('change', updateStatusLabel);
|
|
});
|
|
|
|
// Zamknij po kliknięciu poza dropdownem
|
|
document.addEventListener('click', function(e) {
|
|
var dropdown = document.getElementById('statusDropdown');
|
|
if (dropdown && !dropdown.contains(e.target)) {
|
|
document.getElementById('statusDropdownMenu').classList.remove('show');
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<?php include '../../footer.php'; ?>
|
|
|
|
</body>
|