Files
magico.prototype/prototype/travel/app-invoice.php

1140 lines
66 KiB
PHP

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