# Checkout, Payment, and Receipt Print Requirements

Dokumen ini menjelaskan boundary FE vs BE untuk flow:

- klik `PAY`
- isi modal payment
- klik `Save`
- langsung buka browser print struk thermal 80mm

## FE vs BE (Siapa Mengerjakan Apa)

## FE (sudah diimplementasikan)

- menampilkan modal payment
- hitung `change` realtime di UI
- buka browser print dialog saat Save
- render template struk ukuran:
  - `.container { width: 76.2mm; max-width: 76.2mm; }`
  - `@page { size: 3in auto; margin: 0; }`

Catatan: ukuran ini cocok dengan thermal 80mm class (printable area sekitar 72-76mm).

## BE (perlu update)

BE harus menjadi sumber data transaksi final agar struk valid dan audit-safe.

## Endpoint yang Dibutuhkan

## 1) Checkout Final

`POST /api/v1/pos/checkout`

Request minimal:

```json
{
  "member_id": null,
  "payment_method": "cash",
  "paid_amount": 289000,
  "items": [
    {
      "product_id": 1513,
      "qty": 1,
      "unit_price": 289000,
      "discount_type": "percentage",
      "discount_value": 0
    }
  ],
  "customer_origin": {
    "country": "Indonesia",
    "age": "28",
    "gender": "Man"
  }
}
```

Response minimal:

```json
{
  "sale_id": 91231,
  "bill_no": "BJ2626030800228002",
  "created_at": "2026-03-08T02:28:01+07:00",
  "cashier_name": "trialars",
  "subtotal": 289000,
  "discount_total": 0,
  "grand_total": 289000,
  "paid_amount": 289000,
  "change_amount": 0,
  "payment_method": "cash",
  "items": [
    {
      "name": "RYCROFT BASIC",
      "qty": 1,
      "unit": "pcs",
      "unit_price": 289000
    }
  ]
}
```

## 2) Reprint Endpoint (Opsional tapi disarankan)

`GET /api/v1/pos/sales/:id/receipt`

Tujuan:

- reprint struk dari transaksi lama
- FE tinggal render ulang template print dari data BE

## Rule Validasi BE (Wajib)

- server recalculate subtotal/discount/grand total (jangan percaya total dari FE)
- validasi stock sebelum finalisasi transaksi
- generate `bill_no` unik di server
- simpan `payment_method`, `paid_amount`, `change_amount`, `customer_origin`

## Kenapa Ini Penting

Walau template print ada di FE/browser, data struk tetap harus authoritative dari BE supaya:

- angka struk konsisten dengan DB
- bisa reprint kapan saja
- audit transaksi aman

## File Kandidat Implementasi BE

- `internal/modules/pos/handler.go`
- `internal/modules/pos/service.go`
- `internal/modules/pos/repository.go`
- `internal/server/http.go`

Tambahkan route:

- `POST /api/v1/pos/checkout`
- `GET /api/v1/pos/sales/:id/receipt` (opsional)

