Files
magico.prototype/prototype/travel/app-invoice.php
2026-04-29 00:04:44 +02:00

1531 lines
87 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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">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 WarszawaZakopane</td>
<td class="text-end">2 808,00 PLN</td>
</tr>
<tr>
<td>Przejazd autokarowy ZakopaneWarszawa</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">
<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"
id="invoiceGrossAmount" 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>
<!-- 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 WarszawaZakopane (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 ZakopaneWarszawa (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">
<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>
<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');
}
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();
</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>