149 lines
6.1 KiB
HTML
149 lines
6.1 KiB
HTML
{% extends 'base.html' %}
|
|
{% block title %}<i class="fa-solid fa-file-import me-2 text-primary"></i>Faktury otrzymane{% endblock %}
|
|
|
|
{% block content %}
|
|
{% set args = request.args.to_dict() %}
|
|
{% if 'page' in args %}
|
|
{% set _ = args.pop('page') %}
|
|
{% endif %}
|
|
|
|
<div class="card mb-3 shadow-sm">
|
|
<div class="card-body">
|
|
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
|
|
<div>
|
|
<h5 class="mb-1">Faktury otrzymane</h5>
|
|
<div class="text-muted small">Tutaj widzisz tylko dokumenty kosztowe i otrzymane od kontrahentów.</div>
|
|
</div>
|
|
<a class="btn btn-outline-primary btn-sm" href="{{ url_for('invoices.issued_list') }}">
|
|
<i class="fa-solid fa-arrow-up-right-from-square me-1"></i>Przejdź do wystawionych
|
|
</a>
|
|
</div>
|
|
|
|
<form method="get" class="row g-2">
|
|
<div class="col-md-1">{{ form.month(class='form-select') }}</div>
|
|
<div class="col-md-1">{{ form.year(class='form-control', placeholder='Rok') }}</div>
|
|
<div class="col-md-2">{{ form.contractor(class='form-control', placeholder='Kontrahent') }}</div>
|
|
<div class="col-md-1">{{ form.nip(class='form-control', placeholder='NIP') }}</div>
|
|
<div class="col-md-2">{{ form.invoice_type(class='form-select') }}</div>
|
|
<div class="col-md-2">{{ form.status(class='form-select') }}</div>
|
|
<div class="col-md-1">{{ form.quick_filter(class='form-select') }}</div>
|
|
<div class="col-md-2">{{ form.search(class='form-control', placeholder='Szukaj') }}</div>
|
|
<div class="col-md-2">{{ form.min_amount(class='form-control', placeholder='Min') }}</div>
|
|
<div class="col-md-2">{{ form.max_amount(class='form-control', placeholder='Max') }}</div>
|
|
<div class="col-md-2">{{ form.submit(class='btn btn-primary w-100') }}</div>
|
|
<div class="col-md-2">
|
|
<a class="btn btn-outline-secondary w-100" href="{{ url_for('invoices.export_csv', **request.args) }}">
|
|
<i class="fa-solid fa-file-csv me-1"></i>CSV
|
|
</a>
|
|
</div>
|
|
<div class="col-md-2">
|
|
<a class="btn btn-outline-secondary w-100" href="{{ url_for('invoices.export_zip', **request.args) }}">
|
|
<i class="fa-solid fa-file-zipper me-1"></i>ZIP
|
|
</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<form method="post" action="{{ url_for('invoices.bulk_action') }}">
|
|
{{ form.csrf_token }}
|
|
|
|
<div class="d-flex gap-2 mb-2 flex-wrap">
|
|
{% if read_only_mode %}
|
|
<div class="small text-warning-emphasis align-self-center">Akcje masowe są zablokowane w trybie read only.</div>
|
|
{% endif %}
|
|
|
|
<button class="btn btn-sm btn-outline-primary" name="action" value="mark_accounted" {% if read_only_mode %}disabled{% endif %}>
|
|
<i class="fa-solid fa-book me-1"></i>Masowo zaksięguj
|
|
</button>
|
|
|
|
<button class="btn btn-sm btn-outline-warning" name="action" value="queue_accounting" {% if read_only_mode %}disabled{% endif %}>
|
|
<i class="fa-solid fa-inbox me-1"></i>Do księgowości
|
|
</button>
|
|
</div>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle">
|
|
<thead>
|
|
<tr>
|
|
<th style="width: 40px;"></th>
|
|
<th>Numer</th>
|
|
<th>KSeF</th>
|
|
<th>Kontrahent</th>
|
|
<th>NIP</th>
|
|
<th>Data</th>
|
|
<th>Netto</th>
|
|
<th>VAT</th>
|
|
<th>Brutto</th>
|
|
<th>Typ</th>
|
|
<th>Status</th>
|
|
<th class="text-end">Akcje</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for invoice in pagination.items %}
|
|
<tr>
|
|
<td>
|
|
<input type="checkbox" name="invoice_ids" value="{{ invoice.id }}" {% if read_only_mode %}disabled{% endif %}>
|
|
</td>
|
|
<td class="invoice-number-col">{{ invoice.invoice_number }}</td>
|
|
<td class="invoice-ksef-col ksef-break small">{{ invoice.ksef_number }}</td>
|
|
<td>{{ invoice.contractor_name }}</td>
|
|
<td>{{ invoice.contractor_nip }}</td>
|
|
<td>{{ invoice.issue_date }}</td>
|
|
<td>{{ invoice.net_amount|pln }}</td>
|
|
<td>{{ invoice.vat_amount|pln }}</td>
|
|
<td>{{ invoice.gross_amount|pln }}</td>
|
|
<td>{{ invoice.invoice_type_label }}</td>
|
|
<td>
|
|
<span class="badge text-bg-secondary">{{ invoice.status_label }}</span>
|
|
</td>
|
|
<td class="text-end invoice-actions-cell">
|
|
<div class="invoice-actions-stack">
|
|
<a class="btn btn-sm btn-outline-primary invoice-action-btn" href="{{ url_for('invoices.detail', invoice_id=invoice.id) }}">
|
|
<i class="fa-solid fa-folder-open me-1"></i>Otwórz
|
|
</a>
|
|
<button type="button" class="btn btn-sm btn-success invoice-action-btn" data-bs-toggle="modal" data-bs-target="#payModalReceived{{ invoice.id }}">
|
|
<i class="fa-solid fa-wallet me-1"></i>Opłać
|
|
</button>
|
|
</div>
|
|
|
|
{% set payment_details = payment_details_map.get(invoice.id, {}) %}
|
|
{% set modal_id = 'payModalReceived' ~ invoice.id %}
|
|
{% include 'partials/payment_modal.html' %}
|
|
</td>
|
|
</tr>
|
|
{% else %}
|
|
<tr>
|
|
<td colspan="12" class="text-center text-muted py-4">Brak faktur dla wybranych filtrów.</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</form>
|
|
|
|
{% if pagination.pages and pagination.pages > 1 %}
|
|
<nav aria-label="Paginacja faktur">
|
|
<ul class="pagination flex-wrap">
|
|
{% if pagination.has_prev %}
|
|
<li class="page-item">
|
|
<a class="page-link" href="{{ url_for('invoices.index', page=pagination.prev_num, **args) }}">Poprz.</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% for pg in range(1, (pagination.pages or 1) + 1) %}
|
|
<li class="page-item {{ 'active' if pg == pagination.page else '' }}">
|
|
<a class="page-link" href="{{ url_for('invoices.index', page=pg, **args) }}">{{ pg }}</a>
|
|
</li>
|
|
{% endfor %}
|
|
|
|
{% if pagination.has_next %}
|
|
<li class="page-item">
|
|
<a class="page-link" href="{{ url_for('invoices.index', page=pagination.next_num, **args) }}">Dalej</a>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
{% endif %}
|
|
{% endblock %} |