specs / 010-Changes-Booking-Time-Timezone-Availability

010 - Booking time: venue wall-clock + availability full range

  • Tanggal: 2026-08-09
  • Chat/topik: POS tampil 13–15 padahal DB 06–08; member lihat 13–15 free

Ringkasan perubahan

  • POS: start_time/end_time court diparse sebagai venue wall-clock (abaikan Z / jangan toLocal). Attendance checked_in_at/checked_out_at tetap timestamptz + toLocal.
  • mpc-be: availability menandai seluruh jam [start, end) untuk booking non-Canceled (termasuk Completed).
  • Model multi-outlet: jam slot = jam di venue; branches.timezone untuk “sekarang di cabang” (Papua → Asia/Jayapura), bukan untuk menggeser digit jam slot di UI.

Impact bisnis

Kasir tidak lagi melihat jam court digeser zona HP (+7). Availability member selaras dengan rentang booking penuh. Outlet lintas zona (Jakarta/Papua) tetap book “13:00 di tempat itu”.

Epic / User stories

  • Epic: Konsistensi waktu booking court lintas POS & member app
  • US: Sebagai kasir, saya ingin jam di jadwal sama dengan jam lapangan di DB, agar tidak salah cek overlap dengan booking member.
  • US: Sebagai member, saya ingin semua jam dalam booking multi-jam terlihat sold.

User terdampak

Kasir POS, member (Android/iOS/Web via availability API).

Aplikasi terdampak

  • mpc-pos: PERLU — parse venue-local
  • mpc-be: PERLU — mark full range + api_contract
  • mpc-be-pos: TIDAK — response OK
  • mpc-android / mpc-ios / mpc-web: TIDAK untuk parse (sudah wall-clock); ikut benar setelah BE
  • mpc-admin: TIDAK kode — set branches.timezone saat outlet Papua
  • mpc-owner / ksr-sync: TIDAK

Perubahan schema

Tidak ada.

Perubahan kode

  • mpc-pos/lib/data/models.dartparseVenueLocalDateTime; DaySchedule.openTime/closeTime/hourSlots
  • mpc-pos/lib/screens/schedule_screen.dart — grid jam dari schedule API (bukan hardcoded)
  • mpc-be-pos — schedule response open_time/close_time dari branches
  • mpc-be/internal/courts/repository.gomarkBookedHours; filter deleted_at IS NULL
  • mpc-be/internal/courts/availability_test.go
  • mpc-dev/docs/api/be.md — occupancy rules