80 lines
13 KiB
HTML
80 lines
13 KiB
HTML
{% extends 'base.html' %}
|
||
{% block title %}Firmy i karty{% endblock %}
|
||
{% block content %}
|
||
<div class="d-flex flex-column flex-lg-row justify-content-between align-items-lg-center gap-3 mb-3">
|
||
<div><h1 class="h2 mb-1">Administracja</h1><p class="text-body-secondary mb-0">Firmy, karty paliwowe i firmowe ulubione stacje.</p></div>
|
||
{% if current_user.role == 'admin' %}<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#createCompanyModal">Dodaj firmę</button>{% endif %}
|
||
</div>
|
||
{% include '_admin_nav.html' %}
|
||
|
||
{% if current_user.role == 'admin' %}
|
||
<div class="card mb-4 border-warning"><div class="card-header"><strong>Globalny, czasowy VAT</strong></div><div class="card-body">
|
||
<form action="{{ url_for('main.update_global_vat') }}" method="post" class="ajax-form row g-3">
|
||
<div class="col-12"><div class="form-check form-switch"><input class="form-check-input" type="checkbox" name="enabled" id="global-vat-enabled" {% if vat_override.enabled %}checked{% endif %}><label class="form-check-label" for="global-vat-enabled">Nadpisz VAT we wszystkich firmach</label></div></div>
|
||
<div class="col-md-4"><label class="form-label">Nazwa projektu</label><input class="form-control" name="name" value="{{ vat_override.name }}" placeholder="Np. CPN"></div>
|
||
<div class="col-md-2"><label class="form-label">VAT (%)</label><input class="form-control" type="number" min="0" max="100" step="0.01" name="rate" value="{{ vat_override.rate if vat_override.rate is not none else '' }}" placeholder="8"></div>
|
||
<div class="col-md-3"><label class="form-label">Obowiązuje od</label><input class="form-control" type="date" name="start" value="{{ vat_override.start.isoformat() if vat_override.start else '' }}"></div>
|
||
<div class="col-md-3"><label class="form-label">Obowiązuje do</label><input class="form-control" type="date" name="end" value="{{ vat_override.end.isoformat() if vat_override.end else '' }}"></div>
|
||
<div class="col-12 d-flex justify-content-between align-items-center"><small class="text-body-secondary">Stawka zastępuje VAT każdej firmy wyłącznie w podanym okresie. Odliczenie 50% przy VAT 8% oznacza odliczenie połowy podatku, czyli 4% podstawy netto.</small><button class="btn btn-warning">Zapisz globalny VAT</button></div>
|
||
</form></div></div>
|
||
{% endif %}
|
||
<div class="row g-4">
|
||
<div class="col-xl-4 col-xxl-3">
|
||
<div class="card h-100">
|
||
<div class="card-header"><strong>Firmy</strong></div>
|
||
<div class="card-body border-bottom">
|
||
<form method="get" action="{{ url_for('main.admin_companies') }}" class="ajax-nav-form">
|
||
<div class="input-group"><input class="form-control" name="q" value="{{ q }}" placeholder="Szukaj firmy"><button class="btn btn-secondary">Szukaj</button></div>
|
||
</form>
|
||
</div>
|
||
<div class="list-group list-group-flush">
|
||
{% for c in companies_page.items %}
|
||
<a href="{{ url_for('main.admin_companies', company_id=c.id, q=q, page=companies_page.page) }}" class="list-group-item list-group-item-action ajax-nav-link {% if selected_company and selected_company.id == c.id %}active{% endif %}">
|
||
<div class="d-flex justify-content-between gap-2"><strong class="text-truncate">{{ c.name }}</strong><span class="badge {% if c.active %}text-bg-success{% else %}text-bg-secondary{% endif %}">{{ 'aktywna' if c.active else 'wyłączona' }}</span></div>
|
||
<div class="small {% if selected_company and selected_company.id == c.id %}text-white-50{% else %}text-body-secondary{% endif %}">{{ c.entity_type }} · {{ c.region }} · {{ c.users|length }} użytk.</div>
|
||
</a>
|
||
{% else %}<div class="p-4 text-center text-body-secondary">Brak firm.</div>{% endfor %}
|
||
</div>
|
||
{% if companies_page.pages > 1 %}
|
||
<div class="card-footer"><nav><ul class="pagination pagination-sm mb-0 justify-content-center">
|
||
{% for p in companies_page.iter_pages() %}{% if p %}<li class="page-item {% if p == companies_page.page %}active{% endif %}"><a class="page-link ajax-nav-link" href="{{ url_for('main.admin_companies', page=p, q=q, company_id=selected_company.id if selected_company else none) }}">{{ p }}</a></li>{% else %}<li class="page-item disabled"><span class="page-link">…</span></li>{% endif %}{% endfor %}
|
||
</ul></nav></div>{% endif %}
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-xl-8 col-xxl-9">
|
||
{% if selected_company %}
|
||
<div class="card mb-4"><div class="card-header d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-2"><div><strong>{{ selected_company.name }}</strong><div class="small text-body-secondary">Ustawienia firmy</div></div><div class="d-flex align-items-center gap-2"><span class="badge text-bg-secondary">ID {{ selected_company.id }}</span>{% if current_user.role == 'admin' %}<form action="/api/companies/{{ selected_company.id }}" data-method="DELETE" class="ajax-form d-inline" onsubmit="return confirm('Usunąć firmę {{ selected_company.name|e }}? Tej operacji nie można cofnąć.')"><button type="submit" class="btn btn-sm btn-danger">Usuń firmę</button></form>{% else %}<span class="small text-body-secondary" title="Usuwanie firmy jest dostępne tylko dla administratora systemu">Usuwanie: tylko administrator</span>{% endif %}</div></div>
|
||
<div class="card-body">
|
||
<form action="/api/companies/{{ selected_company.id }}" data-method="PUT" class="ajax-form row g-3">
|
||
<div class="col-lg-5"><label class="form-label">Nazwa firmy</label><input class="form-control" name="name" value="{{ selected_company.name }}" required></div>
|
||
<div class="col-md-4 col-lg-3"><label class="form-label">Forma prawna</label><select class="form-select" name="entity_type"><option {% if selected_company.entity_type=='JDG' %}selected{% endif %}>JDG</option><option {% if selected_company.entity_type=='Sp. z o.o.' %}selected{% endif %}>Sp. z o.o.</option><option {% if selected_company.entity_type=='Inna' %}selected{% endif %}>Inna</option></select></div>
|
||
<div class="col-md-8 col-lg-4"><label class="form-label">Województwo</label><select class="form-select" name="region">{% for r in regions %}<option value="{{r}}" {% if selected_company.region==r %}selected{% endif %}>{{r}}</option>{% endfor %}</select></div>
|
||
<div class="col-md-4"><label class="form-label">Stawka VAT (%)</label><input class="form-control" type="number" min="0" step="0.01" name="vat_rate" value="{{ selected_company.vat_rate }}"></div>
|
||
<div class="col-md-4"><label class="form-label">Odliczenie VAT (%)</label><input class="form-control" type="number" min="0" max="100" step="0.01" name="vat_deduction_percent" value="{{ selected_company.vat_deduction_percent }}"></div>
|
||
<div class="col-md-4"><label class="form-label">Podział faktury po dniu</label><input class="form-control" type="number" min="1" max="28" name="invoice_split_day" value="{{ selected_company.invoice_split_day }}"></div>
|
||
<div class="col-12 d-flex justify-content-between align-items-center"><div class="form-check"><input class="form-check-input" name="active" type="checkbox" id="company-active" {% if selected_company.active %}checked{% endif %}><label class="form-check-label" for="company-active">Firma aktywna</label></div><button class="btn btn-primary">Zapisz ustawienia</button></div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card mb-4"><div class="card-body d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3">
|
||
<div><h2 class="h5 mb-1">Dostęp do stacji</h2><p class="text-body-secondary mb-0">{% if selected_company.station_access_mode == 'allowed_only' %}Tylko stacje z listy dozwolonych ({{ selected_company.allowed_stations|length }}).{% elif selected_company.station_access_mode == 'favorites_allowed_only' %}Tylko ulubione i stacje z listy dozwolonych.{% elif selected_company.station_access_mode == 'all' %}Wszystkie stacje, bez preferowania ulubionych.{% else %}Wszystkie stacje są dozwolone, ulubione są preferowane.{% endif %}</p></div>
|
||
<a class="btn btn-secondary ajax-nav-link" href="{{ url_for('main.stations', company_id=selected_company.id) }}">Konfiguruj dostęp</a>
|
||
</div></div>
|
||
|
||
<div class="card mb-4"><div class="card-header"><strong>Karty paliwowe</strong></div><div class="card-body">
|
||
<form action="/api/fuel-cards" method="post" class="ajax-form row g-3 mb-4"><input type="hidden" name="company_id" value="{{selected_company.id}}"><div class="col-md-4"><label class="form-label">Nazwa karty</label><input class="form-control" name="name" placeholder="Np. UTA – flota główna" required></div><div class="col-md-3"><label class="form-label">Operator karty</label><input class="form-control" name="provider" placeholder="UTA, DKV, Orlen" required></div><div class="col-md-3"><label class="form-label">Opis</label><input class="form-control" name="description" placeholder="Opcjonalnie"></div><div class="col-md-2 d-flex align-items-end"><button class="btn btn-primary w-100">Dodaj kartę</button></div></form>
|
||
<div class="table-responsive"><table class="table table-hover align-middle mb-0"><thead><tr><th>Karta</th><th>Operator karty</th><th>Opis</th><th>Status</th></tr></thead><tbody>{% for card in fuel_cards %}<tr><td><strong>{{card.name}}</strong></td><td>{{card.provider}}</td><td>{{card.description or '—'}}</td><td><span class="badge {% if card.active %}text-bg-success{% else %}text-bg-secondary{% endif %}">{{'aktywna' if card.active else 'wyłączona'}}</span></td></tr>{% else %}<tr><td colspan="4" class="text-center text-body-secondary py-4">Brak kart paliwowych.</td></tr>{% endfor %}</tbody></table></div>
|
||
</div></div>
|
||
|
||
<div class="card"><div class="card-body d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3"><div><h2 class="h5 mb-1">Ulubione stacje firmy</h2><p class="text-body-secondary mb-0">Do 25 stacji. Pusta lista oznacza 10 największych sieci w Polsce.</p></div><button class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#companyFavoritesModal">Edytuj ulubione</button></div></div>
|
||
|
||
<div class="modal fade" id="companyFavoritesModal" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-scrollable"><div class="modal-content"><form action="/api/companies/{{selected_company.id}}/favorite-stations" data-method="PUT" class="ajax-form favorite-station-form" data-max-favorites="25" data-page-size="10"><div class="modal-header"><h2 class="modal-title fs-5">Ulubione stacje: {{selected_company.name}}</h2><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><p class="text-body-secondary">Ulubione wpływają tylko na kolejność propozycji i nie blokują pozostałych stacji.</p><input class="form-control mb-3 station-modal-search" type="search" placeholder="Szukaj po nazwie sieci, firmy lub punktu"><div class="table-responsive"><table class="table table-hover align-middle mb-2"><thead><tr><th></th><th>Nazwa</th><th class="text-end">Punkty</th></tr></thead><tbody>{% for s in stations %}<tr data-station-name="{{(s.display_name ~ ' ' ~ s.company_name ~ ' ' ~ (s.station_name_list|join(' ')))|lower}}"><td><input class="form-check-input" type="checkbox" name="station_ids" value="{{s.id}}" {% if s in selected_company.favorite_stations %}checked{% endif %}></td><td><strong>{{s.display_name}}</strong>{% if s.company_name != s.display_name %}<div class="small text-body-secondary">{{s.company_name}}</div>{% endif %}</td><td class="text-end">{{s.station_count}}</td></tr>{% endfor %}</tbody></table></div><div class="d-flex flex-column flex-sm-row justify-content-between align-items-sm-center gap-2"><small class="text-body-secondary favorite-pagination-summary"></small><nav aria-label="Strony stacji"><ul class="pagination pagination-sm mb-0 favorite-pagination"></ul></nav></div></div><div class="modal-footer position-sticky bottom-0 bg-body border-top"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button><button type="submit" class="btn btn-primary">Zapisz ulubione</button></div></form></div></div></div>
|
||
{% else %}<div class="card"><div class="card-body text-center text-body-secondary py-5">Dodaj lub wybierz firmę.</div></div>{% endif %}
|
||
</div>
|
||
</div>
|
||
|
||
{% if current_user.role == 'admin' %}<div class="modal fade" id="createCompanyModal" tabindex="-1"><div class="modal-dialog"><div class="modal-content"><form action="/api/companies" method="post" class="ajax-form"><div class="modal-header"><h2 class="modal-title fs-5">Dodaj firmę</h2><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><div class="mb-3"><label class="form-label">Nazwa firmy</label><input class="form-control" name="name" required></div><div class="row g-3"><div class="col-md-6"><label class="form-label">Forma prawna</label><select class="form-select" name="entity_type"><option>JDG</option><option>Sp. z o.o.</option><option>Inna</option></select></div><div class="col-md-6"><label class="form-label">Województwo</label><select class="form-select" name="region">{% for r in regions %}<option value="{{r}}">{{r}}</option>{% endfor %}</select></div><div class="col-md-6"><label class="form-label">Stawka VAT (%)</label><input class="form-control" type="number" name="vat_rate" value="23" step="0.01"></div><div class="col-md-6"><label class="form-label">Odliczenie VAT (%)</label><input class="form-control" type="number" name="vat_deduction_percent" value="50" step="0.01"></div></div></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button><button class="btn btn-primary">Dodaj firmę</button></div></form></div></div></div>{% endif %}
|
||
{% endblock %}
|