1945 lines
117 KiB
PHP
1945 lines
117 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">
|
||
<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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal"
|
||
data-bs-target="#modalLinkedInvoicePreview"
|
||
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" data-bs-toggle="modal" data-bs-target="#modalLinkExistingInvoice">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="modalLinkedInvoicePreview" tabindex="-1" aria-hidden="true">
|
||
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||
<div class="modal-content border-0 shadow-lg">
|
||
<div class="modal-header border-bottom">
|
||
<h5 class="modal-title"><i class="bx bx-receipt text-primary me-2"></i>Podgląd powiązanej faktury</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body p-4">
|
||
<div class="card shadow-none border mb-3">
|
||
<div class="card-body">
|
||
<div class="row g-3">
|
||
<div class="col-md-6">
|
||
<div class="small text-muted">Numer faktury</div>
|
||
<div class="fw-semibold">FV/2026/05/1234</div>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<div class="small text-muted">Dostawca</div>
|
||
<div class="fw-semibold">Flixbus Polska Sp. z o.o.</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="small text-muted">Data wystawienia</div>
|
||
<div class="fw-semibold">04.05.2026</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="small text-muted">Kwota brutto</div>
|
||
<div class="fw-bold text-primary">4 200,00 PLN</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="small text-muted">Status</div>
|
||
<span class="badge bg-label-success">Powiązana</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h6 class="mb-2">Pozycje faktury</h6>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm modal-linked-table">
|
||
<thead class="table-light">
|
||
<tr>
|
||
<th>Pozycja</th>
|
||
<th class="text-end">Kwota brutto</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Przejazd autokarowy Warszawa–Zakopane</td>
|
||
<td class="text-end">2 808,00 PLN</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Przejazd autokarowy Zakopane–Warszawa</td>
|
||
<td class="text-end">648,00 PLN</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Opłata za rezerwację + obsługa</td>
|
||
<td class="text-end">744,00 PLN</td>
|
||
</tr>
|
||
</tbody>
|
||
<tfoot>
|
||
<tr>
|
||
<th>Razem</th>
|
||
<th class="text-end text-primary">4 200,00 PLN</th>
|
||
</tr>
|
||
</tfoot>
|
||
</table>
|
||
</div>
|
||
|
||
<h6 class="mb-2 mt-4">Powiązane zlecenia</h6>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm modal-linked-table">
|
||
<thead class="table-light">
|
||
<tr>
|
||
<th>Zlecenie / Wycieczka</th>
|
||
<th>Data realizacji</th>
|
||
<th class="text-end">Przypisana kwota</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<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>05.05.2026</td>
|
||
<td class="text-end">2 100,00 PLN</td>
|
||
</tr>
|
||
<tr>
|
||
<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">2 100,00 PLN</td>
|
||
</tr>
|
||
</tbody>
|
||
<tfoot>
|
||
<tr>
|
||
<th colspan="2">Razem przypisano</th>
|
||
<th class="text-end text-primary">4 200,00 PLN</th>
|
||
</tr>
|
||
</tfoot>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button type="button" class="btn btn-label-secondary" data-bs-dismiss="modal">Zamknij</button>
|
||
<button type="button" class="btn btn-primary">Przejdź do faktury</button>
|
||
</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">
|
||
<!-- Lewa kolumna: Podgląd PDF -->
|
||
<div class="col-lg-5">
|
||
<div class="card shadow-none border h-100 bg-lighter d-flex flex-column">
|
||
<div
|
||
class="card-header py-3 border-bottom bg-white d-flex justify-content-between align-items-center">
|
||
<h6 class="mb-0"><i class="bx bxs-file-pdf text-danger me-2"></i>Podgląd
|
||
dokumentu</h6>
|
||
<div class="badge bg-label-secondary">faktura_transport.pdf</div>
|
||
</div>
|
||
<div class="card-body p-0 flex-grow-1 d-flex align-items-center justify-content-center"
|
||
style="min-height: 450px; background-color: #525659; border-bottom-left-radius: 0.375rem; border-bottom-right-radius: 0.375rem;">
|
||
<!-- Placeholder for PDF viewer -->
|
||
<div class="text-center text-white p-4">
|
||
<i class="bx bx-file-blank" style="font-size: 4rem; opacity: 0.5;"></i>
|
||
<p class="mt-2 mb-0">Podgląd pliku PDF</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Prawa kolumna: Formularz (Dane dostawcy + Szczegóły) -->
|
||
<div class="col-lg-7">
|
||
<div class="row g-3">
|
||
<div class="col-12">
|
||
<div class="card shadow-none border">
|
||
<div class="card-header bg-lighter py-2 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 pb-2">
|
||
<div class="row g-2">
|
||
<div class="col-md-6 mb-2">
|
||
<label class="form-label small mb-1">Nazwa dostawcy <span
|
||
class="text-danger">*</span></label>
|
||
<input type="text" class="form-control form-control-sm"
|
||
value="Flixbus Polska Sp. z o.o.">
|
||
</div>
|
||
<div class="col-md-6 mb-2">
|
||
<label
|
||
class="form-label small mb-1 d-flex justify-content-between w-100">
|
||
<span>NIP <span class="text-danger">*</span></span>
|
||
<span class="text-success" style="font-size: 0.75rem;"><i
|
||
class="bx bx-check-circle"></i> W bazie</span>
|
||
</label>
|
||
<input type="text"
|
||
class="form-control form-control-sm border-success"
|
||
value="1234567890">
|
||
</div>
|
||
<div class="col-12">
|
||
<label class="form-label small mb-1">Adres</label>
|
||
<textarea class="form-control form-control-sm"
|
||
rows="1">ul. Przykładowa 12, Warszawa</textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-12">
|
||
<div class="card shadow-none border">
|
||
<div class="card-header bg-lighter py-2 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 pb-2">
|
||
<div class="row g-2">
|
||
<div class="col-sm-6 mb-2">
|
||
<label class="form-label small mb-1">Nr faktury <span
|
||
class="text-danger">*</span></label>
|
||
<input type="text" class="form-control form-control-sm"
|
||
value="FV/2026/05/123">
|
||
</div>
|
||
<div class="col-sm-6 mb-2">
|
||
<label class="form-label small mb-1">Data wystawienia <span
|
||
class="text-danger">*</span></label>
|
||
<input type="date" class="form-control form-control-sm"
|
||
value="2026-05-04">
|
||
</div>
|
||
<div class="col-sm-4 mb-2">
|
||
<label class="form-label small mb-1">Kwota netto</label>
|
||
<input type="number" class="form-control form-control-sm"
|
||
value="3414.63">
|
||
</div>
|
||
<div class="col-sm-4 mb-2">
|
||
<label class="form-label small mb-1">Kwota VAT</label>
|
||
<input type="number" class="form-control form-control-sm"
|
||
value="785.37">
|
||
</div>
|
||
<div class="col-sm-4 mb-2">
|
||
<label class="form-label small mb-1">Waluta</label>
|
||
<select class="form-select form-select-sm">
|
||
<option value="PLN" selected>PLN</option>
|
||
<option value="EUR">EUR</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-sm-12">
|
||
<label class="form-label small mb-1">Kwota brutto <span
|
||
class="text-danger">*</span></label>
|
||
<input type="number"
|
||
class="form-control form-control-lg fw-bold text-primary"
|
||
id="invoiceGrossAmount" value="4200.00">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-12">
|
||
<div class="card shadow-none border">
|
||
<div
|
||
class="card-header bg-lighter py-2 border-bottom d-flex justify-content-between align-items-center">
|
||
<h6 class="mb-0"><i class="bx bx-list-ul me-2"></i>Pozycje z faktury
|
||
(OCR)</h6>
|
||
<button type="button" class="btn btn-xs btn-outline-primary"><i
|
||
class="bx bx-plus"></i> Dodaj</button>
|
||
</div>
|
||
<div class="card-body p-0">
|
||
<div class="table-responsive">
|
||
<table class="table table-sm table-hover mb-0"
|
||
style="font-size: 0.75rem;">
|
||
<thead class="table-light">
|
||
<tr>
|
||
<th style="width: 45%;" class="px-2">Nazwa</th>
|
||
<th style="width: 10%;" class="px-1 text-center">Ilość
|
||
</th>
|
||
<th style="width: 15%;" class="px-1 text-end">Cena netto
|
||
</th>
|
||
<th style="width: 15%;" class="px-1 text-end">Kwota
|
||
netto</th>
|
||
<th style="width: 10%;" class="px-1">VAT</th>
|
||
<th style="width: 5%;" class="px-2 text-center"></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="px-2 py-1"><input type="text"
|
||
class="form-control form-control-sm px-2 py-1"
|
||
style="font-size: 0.75rem;"
|
||
value="Przejazd autokarowy WWA-ZAK"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-center"
|
||
style="font-size: 0.75rem;" value="24"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="108.33"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="2600.00">
|
||
</td>
|
||
<td class="px-1 py-1">
|
||
<select class="form-select form-select-sm px-1 py-1"
|
||
style="font-size: 0.75rem;">
|
||
<option value="8" selected>8%</option>
|
||
<option value="23">23%</option>
|
||
<option value="0">0%</option>
|
||
</select>
|
||
</td>
|
||
<td class="px-2 py-1 text-center">
|
||
<button class="btn btn-xs btn-icon text-danger"
|
||
title="Usuń"><i
|
||
class="bx bx-trash"></i></button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="px-2 py-1"><input type="text"
|
||
class="form-control form-control-sm px-2 py-1"
|
||
style="font-size: 0.75rem;"
|
||
value="Przejazd autokarowy ZAK-WWA"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-center"
|
||
style="font-size: 0.75rem;" value="24"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="25.00"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="600.00"></td>
|
||
<td class="px-1 py-1">
|
||
<select class="form-select form-select-sm px-1 py-1"
|
||
style="font-size: 0.75rem;">
|
||
<option value="8" selected>8%</option>
|
||
<option value="23">23%</option>
|
||
<option value="0">0%</option>
|
||
</select>
|
||
</td>
|
||
<td class="px-2 py-1 text-center">
|
||
<button class="btn btn-xs btn-icon text-danger"
|
||
title="Usuń"><i
|
||
class="bx bx-trash"></i></button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="px-2 py-1"><input type="text"
|
||
class="form-control form-control-sm px-2 py-1"
|
||
style="font-size: 0.75rem;"
|
||
value="Opłata za rezerwację + obsługa"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-center"
|
||
style="font-size: 0.75rem;" value="1"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="214.63"></td>
|
||
<td class="px-1 py-1"><input type="number"
|
||
class="form-control form-control-sm px-1 py-1 text-end"
|
||
style="font-size: 0.75rem;" value="214.63"></td>
|
||
<td class="px-1 py-1">
|
||
<select class="form-select form-select-sm px-1 py-1"
|
||
style="font-size: 0.75rem;">
|
||
<option value="8">8%</option>
|
||
<option value="23" selected>23%</option>
|
||
<option value="0">0%</option>
|
||
</select>
|
||
</td>
|
||
<td class="px-2 py-1 text-center">
|
||
<button class="btn btn-xs btn-icon text-danger"
|
||
title="Usuń"><i
|
||
class="bx bx-trash"></i></button>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</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-3">
|
||
<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">Faktura na jedno zlecenie.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="col-md-3">
|
||
<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 na kilka zleceń.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="col-md-3">
|
||
<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 do zlecenia.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="col-md-3">
|
||
<label class="card border shadow-none cursor-pointer h-100 option-card bg-lighter"
|
||
for="assignGeneral">
|
||
<div class="card-body text-center p-3">
|
||
<input type="radio" name="assignType" id="assignGeneral" value="general"
|
||
class="form-check-input mb-3" onchange="toggleAssignType('general')">
|
||
<h6 class="mb-1"><i
|
||
class="bx bx-buildings fs-4 d-block mb-2 text-primary"></i>Koszty
|
||
ogólne</h6>
|
||
<small class="text-muted">Bez przypisania do zlecenia.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Card: Podsumowanie odczytanej faktury -->
|
||
<div class="card shadow-none border mb-3" id="invoiceSummaryCard">
|
||
<div class="card-header py-2 px-3 d-flex align-items-center justify-content-between"
|
||
style="background: linear-gradient(135deg, #f0f4ff 0%, #e8f0fe 100%); border-bottom: 1px solid #d0deff;">
|
||
<div class="d-flex align-items-center gap-2">
|
||
<i class="bx bx-receipt text-primary fs-5"></i>
|
||
<span class="fw-semibold text-dark small">Dane odczytane z faktury</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-3">
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Nr faktury:</span>
|
||
<span class="badge bg-label-primary fw-semibold">FV/2026/05/123</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Dostawca:</span>
|
||
<span class="fw-semibold small text-dark">Flixbus Polska Sp. z o.o.</span>
|
||
</div>
|
||
<div class="vr opacity-25"></div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Netto:</span>
|
||
<span class="fw-semibold small">3 414,63 PLN</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">VAT:</span>
|
||
<span class="fw-semibold small">785,37 PLN</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Brutto:</span>
|
||
<span class="fw-bold text-primary">4 200,00 PLN</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm mb-0" style="font-size: 0.82rem;">
|
||
<thead style="background-color: #f8f9ff;">
|
||
<tr>
|
||
<th class="px-3 py-2 text-muted fw-semibold" style="width: 40%;">Nazwa
|
||
pozycji</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-center" style="width: 8%;">
|
||
Ilość</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-center" style="width: 8%;">
|
||
J.m.</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-end" style="width: 13%;">
|
||
Cena netto</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-center" style="width: 6%;">
|
||
VAT</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-end" style="width: 12%;">
|
||
Kwota VAT</th>
|
||
<th class="px-3 py-2 text-muted fw-semibold text-end" style="width: 13%;">
|
||
Kwota brutto</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr class="border-top">
|
||
<td class="px-3 py-2">Przejazd autokarowy Warszawa–Zakopane (gr. 24 os.)
|
||
</td>
|
||
<td class="px-3 py-2 text-center">24</td>
|
||
<td class="px-3 py-2 text-center text-muted">os.</td>
|
||
<td class="px-3 py-2 text-end">2 600,00</td>
|
||
<td class="px-3 py-2 text-center"><span
|
||
class="badge bg-label-secondary">8%</span></td>
|
||
<td class="px-3 py-2 text-end">208,00</td>
|
||
<td class="px-3 py-2 text-end fw-semibold">2 808,00</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="px-3 py-2">Przejazd autokarowy Zakopane–Warszawa (gr. 24 os.)
|
||
</td>
|
||
<td class="px-3 py-2 text-center">24</td>
|
||
<td class="px-3 py-2 text-center text-muted">os.</td>
|
||
<td class="px-3 py-2 text-end">600,00</td>
|
||
<td class="px-3 py-2 text-center"><span
|
||
class="badge bg-label-secondary">8%</span></td>
|
||
<td class="px-3 py-2 text-end">48,00</td>
|
||
<td class="px-3 py-2 text-end fw-semibold">648,00</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="px-3 py-2">Opłata za rezerwację + obsługa</td>
|
||
<td class="px-3 py-2 text-center">1</td>
|
||
<td class="px-3 py-2 text-center text-muted">szt.</td>
|
||
<td class="px-3 py-2 text-end">214,63</td>
|
||
<td class="px-3 py-2 text-center"><span
|
||
class="badge bg-label-secondary">23%</span></td>
|
||
<td class="px-3 py-2 text-end">49,37</td>
|
||
<td class="px-3 py-2 text-end fw-semibold">264,00</td>
|
||
</tr>
|
||
<tr class="table-light border-top">
|
||
<td class="px-3 py-2 fw-semibold" colspan="3">Razem</td>
|
||
<td class="px-3 py-2 text-end fw-semibold">3 414,63</td>
|
||
<td class="px-3 py-2"></td>
|
||
<td class="px-3 py-2 text-end fw-semibold">785,37</td>
|
||
<td class="px-3 py-2 text-end fw-bold text-primary">4 200,00 PLN</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<!-- /Card: Podsumowanie odczytanej faktury -->
|
||
|
||
<div class="card shadow-sm border" id="ordersListCard">
|
||
<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 text-nowrap">
|
||
<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 class="assign-order-row" data-order-amount="4200.00">
|
||
<td><input class="form-check-input" type="checkbox" name="orderSelect"></td>
|
||
<td>
|
||
<div class="d-flex flex-column">
|
||
<span
|
||
class="fw-semibold text-primary d-flex align-items-center gap-2">ZL/2026/05/089
|
||
<span
|
||
class="badge bg-label-success order-suggestion-badge">Sugerowane
|
||
zlecenie</span>
|
||
</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 split-amount-input"
|
||
placeholder="0.00" min="0" step="0.01">
|
||
</td>
|
||
</tr>
|
||
<tr class="assign-order-row" data-order-amount="2100.00">
|
||
<td><input class="form-check-input" type="checkbox" name="orderSelect"></td>
|
||
<td>
|
||
<div class="d-flex flex-column">
|
||
<span
|
||
class="fw-semibold text-primary d-flex align-items-center gap-2">ZL/2026/05/156
|
||
<span
|
||
class="badge bg-label-success order-suggestion-badge d-none">Sugerowane
|
||
zlecenie</span>
|
||
</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 split-amount-input"
|
||
placeholder="0.00" min="0" step="0.01">
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
<tfoot>
|
||
<tr id="splitTotalRow" class="table-light d-none">
|
||
<td colspan="4" class="text-end fw-semibold">Suma przypisanych kwot:</td>
|
||
<td class="text-end fw-bold" id="splitTotalValue">0,00 PLN</td>
|
||
</tr>
|
||
</tfoot>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="alert alert-danger d-none mt-3 mb-0" id="splitValidationAlert" role="alert">
|
||
Suma przypisanych pozycji musi być równa kwocie faktury.
|
||
</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" id="btnSaveAssign">
|
||
<i class="bx bx-check me-1"></i> Zapisz i Powiąż
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Modal: Połącz istniejącą fakturę ze zleceniem -->
|
||
<div class="modal fade" id="modalLinkExistingInvoice" tabindex="-1" aria-hidden="true">
|
||
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-header border-bottom pb-3">
|
||
<h5 class="modal-title d-flex align-items-center">
|
||
<i class="bx bx-link text-primary fs-4 me-2"></i>
|
||
Połącz fakturę ze zleceniem (lub w Koszty ogólne)
|
||
</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body p-4">
|
||
<h6 class="mb-3">Wybierz sposób rozliczenia dokumentu</h6>
|
||
<div class="row g-3 mb-4">
|
||
<div class="col-md-3">
|
||
<label class="card border border-2 shadow-none cursor-pointer h-100 option-card-existing border-primary" for="assignSingleExisting">
|
||
<div class="card-body text-center p-3">
|
||
<input type="radio" name="assignTypeExisting" id="assignSingleExisting" value="single" class="form-check-input mb-3" checked onchange="toggleAssignTypeExisting('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">Faktura na jedno zlecenie.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label class="card border shadow-none cursor-pointer h-100 option-card-existing bg-lighter" for="assignSplitExisting">
|
||
<div class="card-body text-center p-3">
|
||
<input type="radio" name="assignTypeExisting" id="assignSplitExisting" value="split" class="form-check-input mb-3" onchange="toggleAssignTypeExisting('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 na kilka zleceń.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label class="card border shadow-none cursor-pointer h-100 option-card-existing bg-lighter" for="assignPartialExisting">
|
||
<div class="card-body text-center p-3">
|
||
<input type="radio" name="assignTypeExisting" id="assignPartialExisting" value="partial" class="form-check-input mb-3" onchange="toggleAssignTypeExisting('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 do zlecenia.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label class="card border shadow-none cursor-pointer h-100 option-card-existing bg-lighter" for="assignGeneralExisting">
|
||
<div class="card-body text-center p-3">
|
||
<input type="radio" name="assignTypeExisting" id="assignGeneralExisting" value="general" class="form-check-input mb-3" onchange="toggleAssignTypeExisting('general')">
|
||
<h6 class="mb-1"><i class="bx bx-buildings fs-4 d-block mb-2 text-primary"></i>Koszty ogólne</h6>
|
||
<small class="text-muted">Bez przypisania do zlecenia.</small>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Podsumowanie faktury -->
|
||
<div class="card shadow-none border mb-3">
|
||
<div class="card-header py-2 px-3 d-flex align-items-center justify-content-between" style="background: linear-gradient(135deg, #f0f4ff 0%, #e8f0fe 100%); border-bottom: 1px solid #d0deff;">
|
||
<div class="d-flex align-items-center gap-2">
|
||
<i class="bx bx-receipt text-primary fs-5"></i>
|
||
<span class="fw-semibold text-dark small">Szczegóły wybranej faktury</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-3">
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Nr faktury:</span>
|
||
<span class="badge bg-label-primary fw-semibold">FV/2026/05/1234</span>
|
||
</div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Dostawca:</span>
|
||
<span class="fw-semibold small text-dark">Flixbus Polska Sp. z o.o.</span>
|
||
</div>
|
||
<div class="vr opacity-25"></div>
|
||
<div class="d-flex align-items-center gap-2">
|
||
<span class="text-muted small">Brutto:</span>
|
||
<span class="fw-bold text-primary">4 200,00 PLN</span>
|
||
<input type="hidden" id="invoiceGrossAmountExisting" value="4200.00">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card shadow-sm border" id="ordersListCardExisting">
|
||
<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 text-nowrap">
|
||
<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-existing d-none">Przypisz kwotę</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr class="assign-order-row-existing" data-order-amount="4200.00">
|
||
<td><input class="form-check-input" type="radio" name="orderSelectExisting"></td>
|
||
<td>
|
||
<div class="d-flex flex-column">
|
||
<span class="fw-semibold text-primary d-flex align-items-center gap-2">ZL/2026/05/089
|
||
<span class="badge bg-label-success order-suggestion-badge">Sugerowane zlecenie</span>
|
||
</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-existing d-none text-end"><input type="number" class="form-control form-control-sm text-end split-amount-input-existing" placeholder="0.00" min="0" step="0.01"></td>
|
||
</tr>
|
||
<tr class="assign-order-row-existing" data-order-amount="2100.00">
|
||
<td><input class="form-check-input" type="radio" name="orderSelectExisting"></td>
|
||
<td>
|
||
<div class="d-flex flex-column">
|
||
<span class="fw-semibold text-primary d-flex align-items-center gap-2">ZL/2026/05/156
|
||
<span class="badge bg-label-success order-suggestion-badge d-none">Sugerowane zlecenie</span>
|
||
</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-existing d-none text-end"><input type="number" class="form-control form-control-sm text-end split-amount-input-existing" placeholder="0.00" min="0" step="0.01"></td>
|
||
</tr>
|
||
</tbody>
|
||
<tfoot>
|
||
<tr id="splitTotalRowExisting" class="table-light d-none">
|
||
<td colspan="4" class="text-end fw-semibold">Suma przypisanych kwot:</td>
|
||
<td class="text-end fw-bold" id="splitTotalValueExisting">0,00 PLN</td>
|
||
</tr>
|
||
</tfoot>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="alert alert-danger d-none mt-3 mb-0" id="splitValidationAlertExisting" role="alert">
|
||
Suma przypisanych pozycji musi być równa kwocie faktury.
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer border-top pt-3">
|
||
<button type="button" class="btn btn-label-secondary" data-bs-dismiss="modal">Anuluj</button>
|
||
<button type="button" class="btn btn-success" id="btnSaveAssignExisting"><i class="bx bx-check me-1"></i> Zapisz powiązanie</button>
|
||
</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');
|
||
|
||
// Pokaz/ukryj listę zleceń w przypadku kosztów ogólnych
|
||
const ordersListCard = document.getElementById('ordersListCard');
|
||
if (ordersListCard) {
|
||
if (type === 'general') {
|
||
ordersListCard.classList.add('d-none');
|
||
} else {
|
||
ordersListCard.classList.remove('d-none');
|
||
}
|
||
}
|
||
|
||
// 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');
|
||
}
|
||
|
||
updateSplitAmountSummary();
|
||
}
|
||
|
||
function formatPln(value) {
|
||
return value.toLocaleString('pl-PL', {
|
||
minimumFractionDigits: 2,
|
||
maximumFractionDigits: 2
|
||
}) + ' PLN';
|
||
}
|
||
|
||
function getInvoiceGrossAmount() {
|
||
const invoiceInput = document.getElementById('invoiceGrossAmount');
|
||
const amount = parseFloat(invoiceInput ? invoiceInput.value : 0);
|
||
return Number.isFinite(amount) ? amount : 0;
|
||
}
|
||
|
||
function updateSplitAmountSummary() {
|
||
const isSplit = document.getElementById('assignSplit')?.checked;
|
||
const totalRow = document.getElementById('splitTotalRow');
|
||
const totalValue = document.getElementById('splitTotalValue');
|
||
const alertBox = document.getElementById('splitValidationAlert');
|
||
const saveBtn = document.getElementById('btnSaveAssign');
|
||
|
||
if (!isSplit) {
|
||
totalRow?.classList.add('d-none');
|
||
alertBox?.classList.add('d-none');
|
||
if (saveBtn) saveBtn.disabled = false;
|
||
return;
|
||
}
|
||
|
||
let sum = 0;
|
||
document.querySelectorAll('#step-assign .table-responsive table tbody tr').forEach(function (row) {
|
||
const selector = row.querySelector('input[name="orderSelect"]');
|
||
const amountInput = row.querySelector('.split-amount-input');
|
||
if (!selector || !amountInput || !selector.checked) return;
|
||
const value = parseFloat(amountInput.value);
|
||
if (Number.isFinite(value)) sum += value;
|
||
});
|
||
|
||
const invoiceAmount = getInvoiceGrossAmount();
|
||
const isMatch = Math.abs(sum - invoiceAmount) < 0.01;
|
||
|
||
totalRow?.classList.remove('d-none');
|
||
if (totalValue) {
|
||
totalValue.textContent = formatPln(sum);
|
||
totalValue.classList.toggle('text-danger', !isMatch);
|
||
totalValue.classList.toggle('text-success', isMatch);
|
||
}
|
||
|
||
alertBox?.classList.toggle('d-none', isMatch);
|
||
if (saveBtn) saveBtn.disabled = !isMatch;
|
||
}
|
||
|
||
function updateSuggestedOrder() {
|
||
const tbody = document.querySelector('#step-assign .table-responsive table tbody');
|
||
if (!tbody) return;
|
||
|
||
const rows = Array.from(tbody.querySelectorAll('.assign-order-row'));
|
||
if (!rows.length) return;
|
||
|
||
const invoiceAmount = getInvoiceGrossAmount();
|
||
let bestRow = null;
|
||
let bestDiff = Number.POSITIVE_INFINITY;
|
||
|
||
rows.forEach(function (row) {
|
||
row.classList.remove('table-success');
|
||
row.querySelectorAll('.order-suggestion-badge').forEach(function (badge) {
|
||
badge.classList.add('d-none');
|
||
});
|
||
|
||
const orderAmount = parseFloat(row.dataset.orderAmount || '0');
|
||
const diff = Math.abs(orderAmount - invoiceAmount);
|
||
if (diff < bestDiff) {
|
||
bestDiff = diff;
|
||
bestRow = row;
|
||
}
|
||
});
|
||
|
||
if (!bestRow) return;
|
||
tbody.prepend(bestRow);
|
||
bestRow.classList.add('table-success');
|
||
bestRow.querySelectorAll('.order-suggestion-badge').forEach(function (badge) {
|
||
badge.classList.remove('d-none');
|
||
});
|
||
}
|
||
|
||
document.querySelectorAll('input[name="orderSelect"], .split-amount-input').forEach(function (el) {
|
||
el.addEventListener('change', updateSplitAmountSummary);
|
||
el.addEventListener('input', updateSplitAmountSummary);
|
||
});
|
||
|
||
document.querySelectorAll('.split-amount-input').forEach(function (input) {
|
||
input.addEventListener('input', function () {
|
||
const row = input.closest('tr');
|
||
const selector = row ? row.querySelector('input[name="orderSelect"]') : null;
|
||
const value = parseFloat(input.value);
|
||
if (selector && Number.isFinite(value) && value > 0) {
|
||
selector.checked = true;
|
||
}
|
||
});
|
||
});
|
||
|
||
document.getElementById('invoiceGrossAmount')?.addEventListener('input', function () {
|
||
updateSplitAmountSummary();
|
||
updateSuggestedOrder();
|
||
});
|
||
updateSuggestedOrder();
|
||
updateSplitAmountSummary();
|
||
|
||
// --- JS DLA MODALA: Połącz istniejącą fakturę ze zleceniem ---
|
||
function toggleAssignTypeExisting(type) {
|
||
document.querySelectorAll('.option-card-existing').forEach(card => {
|
||
card.classList.remove('border-2', 'border-primary');
|
||
card.classList.add('bg-lighter');
|
||
});
|
||
|
||
const activeInput = document.querySelector(`input[id="assign${type.charAt(0).toUpperCase() + type.slice(1)}Existing"]`);
|
||
if (activeInput) {
|
||
const activeCard = activeInput.closest('.option-card-existing');
|
||
activeCard.classList.add('border-2', 'border-primary');
|
||
activeCard.classList.remove('bg-lighter');
|
||
}
|
||
|
||
const ordersListCard = document.getElementById('ordersListCardExisting');
|
||
if (ordersListCard) {
|
||
ordersListCard.classList.toggle('d-none', type === 'general');
|
||
}
|
||
|
||
const splitCols = document.querySelectorAll('.split-col-existing');
|
||
if (type === 'split') {
|
||
splitCols.forEach(col => col.classList.remove('d-none'));
|
||
document.querySelectorAll('input[name="orderSelectExisting"]').forEach(el => el.type = 'checkbox');
|
||
} else {
|
||
splitCols.forEach(col => col.classList.add('d-none'));
|
||
document.querySelectorAll('input[name="orderSelectExisting"]').forEach(el => el.type = 'radio');
|
||
}
|
||
|
||
updateSplitAmountSummaryExisting();
|
||
}
|
||
|
||
function updateSplitAmountSummaryExisting() {
|
||
const isSplit = document.getElementById('assignSplitExisting')?.checked;
|
||
const totalRow = document.getElementById('splitTotalRowExisting');
|
||
const alertBox = document.getElementById('splitValidationAlertExisting');
|
||
const saveBtn = document.getElementById('btnSaveAssignExisting');
|
||
|
||
if (!isSplit) {
|
||
totalRow?.classList.add('d-none');
|
||
alertBox?.classList.add('d-none');
|
||
if (saveBtn) saveBtn.disabled = false;
|
||
return;
|
||
}
|
||
|
||
totalRow?.classList.remove('d-none');
|
||
let sum = 0;
|
||
document.querySelectorAll('.split-amount-input-existing').forEach(input => {
|
||
const val = parseFloat(input.value);
|
||
if (!isNaN(val)) sum += val;
|
||
});
|
||
|
||
const totalValueEl = document.getElementById('splitTotalValueExisting');
|
||
if (totalValueEl) totalValueEl.textContent = formatPln(sum);
|
||
|
||
const invoiceInput = document.getElementById('invoiceGrossAmountExisting');
|
||
const invoiceGross = parseFloat(invoiceInput ? invoiceInput.value : 0) || 0;
|
||
|
||
if (Math.abs(sum - invoiceGross) > 0.01) {
|
||
alertBox?.classList.remove('d-none');
|
||
if (saveBtn) saveBtn.disabled = true;
|
||
} else {
|
||
alertBox?.classList.add('d-none');
|
||
if (saveBtn) saveBtn.disabled = false;
|
||
}
|
||
}
|
||
|
||
document.querySelectorAll('input[name="orderSelectExisting"], .split-amount-input-existing').forEach(el => {
|
||
el.addEventListener('change', updateSplitAmountSummaryExisting);
|
||
el.addEventListener('input', updateSplitAmountSummaryExisting);
|
||
});
|
||
|
||
document.querySelectorAll('.split-amount-input-existing').forEach(input => {
|
||
input.addEventListener('input', function () {
|
||
const row = input.closest('tr');
|
||
const selector = row ? row.querySelector('input[name="orderSelectExisting"]') : null;
|
||
const value = parseFloat(input.value);
|
||
if (selector && Number.isFinite(value) && value > 0) {
|
||
selector.checked = true;
|
||
}
|
||
});
|
||
});
|
||
|
||
toggleAssignTypeExisting('single'); // inicjalizacja
|
||
</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;
|
||
}
|
||
|
||
/* Spójne rozmiary i odstępy dla tabel w podglądzie powiązanej faktury */
|
||
#modalLinkedInvoicePreview .modal-linked-table {
|
||
font-size: 0.82rem;
|
||
}
|
||
|
||
#modalLinkedInvoicePreview .modal-linked-table th,
|
||
#modalLinkedInvoicePreview .modal-linked-table td {
|
||
padding: 0.5rem 0.75rem;
|
||
vertical-align: middle;
|
||
}
|
||
</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>
|