Files
magico.prototype/prototype/travel/app-invoice.php
2026-05-07 19:20:10 +02:00

2181 lines
132 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 zlecenia</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">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">Zaliczkowane</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">Zaliczkowane</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 style="width: 48px;"><input class="form-check-input" type="checkbox" id="selectAllInvoices"></th>
<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>Źródło dokumentu</th>
<th class="text-end">Akcje</th>
</tr>
</thead>
<tbody class="table-border-bottom-0">
<tr>
<td><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bxs-file-pdf text-danger fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">FV/2026/05/1234</span>
<small class="text-muted">Faktura VAT</small>
</div>
</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>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-secondary"><i class="bx bx-user fs-6"></i></span>
</span>
<span class="small">Anna Kowalska</span>
</div>
</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><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bx-receipt text-success fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">F-2026-999</span>
<small class="text-muted">Faktura VAT z KSeF</small>
</div>
</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>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-info"><i class="bx bx-cloud-download fs-6"></i></span>
</span>
<span class="small">KSeF</span>
</div>
</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><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<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>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">Paragon/FV 12</span>
<small class="text-muted">Faktura zaliczkowa</small>
</div>
</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>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-warning"><i class="bx bx-walk fs-6"></i></span>
</span>
<div class="d-flex flex-column">
<span class="small">Pilot</span>
<small class="text-muted">Jan Kowalski</small>
</div>
</div>
</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>
<tr>
<td><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bxs-file-pdf text-danger fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">PRF/2026/05/088</span>
<small class="text-muted">Proforma</small>
</div>
</div>
</td>
<td>
<div class="d-flex flex-column">
<span>Hotel Colosseum Roma</span>
<small class="text-muted">NIP: 5566778899</small>
</div>
</td>
<td><span class="text-muted">02.05.2026</span></td>
<td class="text-end fw-bold">12 500,00 PLN</td>
<td class="text-center">
<span class="badge bg-label-danger">Nieprzypisana</span>
</td>
<td>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-secondary"><i class="bx bx-user fs-6"></i></span>
</span>
<span class="small">Anna Kowalska</span>
</div>
</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><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bx-receipt text-primary fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">FVZ/2026/04/311</span>
<small class="text-muted">Faktura zaliczkowa</small>
</div>
</div>
</td>
<td>
<div class="d-flex flex-column">
<span>Air Corsica S.A.</span>
<small class="text-muted">NIP: 3344556677</small>
</div>
</td>
<td><span class="text-muted">22.04.2026</span></td>
<td class="text-end fw-bold">8 760,00 PLN</td>
<td class="text-center">
<span class="badge bg-label-success">Przypisana (1:1)</span>
</td>
<td>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-info"><i class="bx bx-cloud-download fs-6"></i></span>
</span>
<span class="small">KSeF</span>
</div>
</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>
</td>
</tr>
<tr>
<td><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bxs-file-pdf text-info fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">KSEF/2026/05/0042</span>
<small class="text-muted">Faktura VAT z KSeF</small>
</div>
</div>
</td>
<td>
<div class="d-flex flex-column">
<span>TAP Air Portugal</span>
<small class="text-muted">NIP: 9988776655</small>
</div>
</td>
<td><span class="text-muted">18.05.2026</span></td>
<td class="text-end fw-bold">5 400,00 PLN</td>
<td class="text-center">
<span class="badge bg-label-warning">Zaliczkowana</span>
</td>
<td>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-warning"><i class="bx bx-walk fs-6"></i></span>
</span>
<div class="d-flex flex-column">
<span class="small">Pilot</span>
<small class="text-muted">Tomasz S.</small>
</div>
</div>
</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><input class="form-check-input invoice-checkbox" type="checkbox"></td>
<td>
<div class="d-flex align-items-center">
<i class="bx bx-receipt text-secondary fs-4 me-2"></i>
<div class="d-flex flex-column">
<span class="fw-semibold text-dark">PRF/2026/05/102</span>
<small class="text-muted">Proforma</small>
</div>
</div>
</td>
<td>
<div class="d-flex flex-column">
<span>Venezia Apartments S.r.l.</span>
<small class="text-muted">NIP: 1122334455</small>
</div>
</td>
<td><span class="text-muted">08.05.2026</span></td>
<td class="text-end fw-bold">3 680,00 EUR</td>
<td class="text-center">
<span class="badge bg-label-info" data-bs-toggle="tooltip"
title="Przypisano do 2 zleceń">Rozksięgowana (1:N)</span>
</td>
<td>
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-secondary"><i class="bx bx-user fs-6"></i></span>
</span>
<span class="small">Anna Kowalska</span>
</div>
</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>
</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">
<!-- 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 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" 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');
}
});
// Zaznacz / odznacz wszystkie faktury
const selectAll = document.getElementById('selectAllInvoices');
if (selectAll) {
selectAll.addEventListener('change', function () {
document.querySelectorAll('.invoice-checkbox').forEach(cb => {
cb.checked = this.checked;
});
});
document.querySelectorAll('.invoice-checkbox').forEach(cb => {
cb.addEventListener('change', function () {
const all = document.querySelectorAll('.invoice-checkbox');
const checked = document.querySelectorAll('.invoice-checkbox:checked');
selectAll.indeterminate = checked.length > 0 && checked.length < all.length;
selectAll.checked = checked.length === all.length;
});
});
}
</script>
<?php include '../../footer.php'; ?>
</body>