{% extends "pos_base.html" %} {% block title %}Kasir POS{% endblock %} {% block head %} {% endblock %} {% block content %}
{{ pos_s.pos_struk_nama|upper }} — KASIR POS
{% if shift %} SHIFT #{{ shift.id }} {% else %} SHIFT TUTUP {% endif %} USER {{ (session.nama or session.username)|upper }} {% if shift %} {% else %} {% endif %} {% if session.role in ('ADMIN','FINANCE','MANAJER','OPERATOR','DEMO') %} App {% endif %} Keluar
{% if not shift %}
Shift Belum Dibuka

Mulai Hari
Ini Dulu.

Catat saldo awal kas tunai yang ada di laci sekarang. Semua transaksi akan tercatat di bawah shift ini, dan selisih kas akhir shift dihitung otomatis dari nilai ini.

{% else %}
{# Umpan balik hasil scan. Sengaja BUKAN alert(): kasir memakai scanner beruntun, dan kotak dialog yang harus ditutup tiap gagal justru menghentikan alur kerja. #} {% set fav_count = products|selectattr('favorit')|list|length %}
{% for c in categories %} {% endfor %}
{% set pos_icon_mode = pos_s.pos_icon_mode or 'initial' %}
{% for g in product_groups %} {% if g.members|length == 1 %}{% set p = g.members[0] %} {% else %} {# ===== kartu induk varian (banyak varian, satu nama) ===== #} {% set prices = g.members|map(attribute='harga_jual')|list %} {% set total_stok = g.members|sum(attribute='stok') %} {% set all_out = (g.members|selectattr('stok','gt',0)|list|length == 0) %} {% set any_fav = (g.members|selectattr('favorit')|list|length > 0) %} {% set first = g.members[0] %} {% endif %} {% else %} {# Pesan kosong hanya bila TIDAK ada barang jadi DAN tidak ada racikan yang tampil. Saat mode "racikan saja", product_groups kosong tapi kartu resep tetap muncul di bawah. #} {% if not recipes %}
KOSONG
Belum ada item untuk ditampilkan di kasir.
{% endif %} {% endfor %} {# ── Item resep produksi (dijual = bahan otomatis terpotong dari stok, Model B) ── #} {% for rp in recipes %} {% endfor %}
{% endif %}
{% if shift %} {% endif %} {% endblock %} {% block scripts %} {% endblock %}