update logika pemanggilan admin loket by payment
This commit is contained in:
@@ -1,97 +0,0 @@
|
||||
# Panduan Alur Pemrosesan Pasien - Admin Klinik Ruang
|
||||
|
||||
## Overview
|
||||
Halaman Admin Klinik Ruang digunakan untuk mengelola antrian pasien di setiap ruang klinik. Pasien yang sudah dibuat antrean klinik ruang dari Admin Loket atau Admin Klinik akan muncul di halaman ini untuk di-generate tiket baru.
|
||||
|
||||
## Alur Pemrosesan Pasien
|
||||
|
||||
### 1. Daftar Pasien Perlu Generate Tiket
|
||||
- Pasien yang sudah dibuat antrean klinik ruang dari **Admin Loket** atau **Admin Klinik** akan muncul di bagian "DAFTAR PASIEN PERLU GENERATE TIKET"
|
||||
- Pasien dikelompokkan berdasarkan **ruang** yang telah dipilih sebelumnya oleh admin
|
||||
- Hanya menampilkan **nomor antrian** untuk menghemat tempat
|
||||
- Klik ikon **mata (👁️)** untuk melihat detail lengkap pasien
|
||||
- Klik tombol **"Generate"** untuk mengisi field generate tiket dengan nomor antrian pasien tersebut
|
||||
|
||||
### 2. Generate Tiket Baru
|
||||
- Setelah klik tombol "Generate", nomor antrian pasien akan otomatis terisi di field "Masukan Barcode"
|
||||
- Atau scan barcode/nomor antrian pasien secara manual di field "Masukan Barcode" lalu tekan **Enter**
|
||||
- Sistem akan menampilkan dialog untuk memilih:
|
||||
- **Ruang**: Pilih ruang tujuan (jika ada beberapa ruang)
|
||||
- **Tipe Layanan**: Pilih antara "Pemeriksaan Awal" atau "Tindakan"
|
||||
- Setelah konfirmasi, sistem akan generate nomor antrian baru:
|
||||
- **PA001, PA002, ...** untuk Pemeriksaan Awal
|
||||
- **TD001, TD002, ...** untuk Tindakan
|
||||
- Nomor antrian baru akan di-generate otomatis per ruang dan tipe layanan
|
||||
|
||||
### 3. Proses Antrian
|
||||
- Setelah generate tiket, pasien akan muncul di antrian sesuai **tipe layanan** (Pemeriksaan Awal atau Tindakan)
|
||||
- Klik **"Proses Antrian Berikutnya"** untuk memproses antrian pertama yang menunggu
|
||||
- Atau klik langsung pada **card pasien** untuk memproses pasien tertentu
|
||||
|
||||
### 4. Panggil & Proses Pasien
|
||||
- Pasien yang sedang diproses akan muncul di bagian **"SEDANG DIPROSES"**
|
||||
- Admin dapat:
|
||||
- **Pilih Tipe Layanan**: Ubah antara "Pemeriksaan Awal" atau "Tindakan" dengan klik tombol
|
||||
- **Panggil**: Klik tombol "Panggil" untuk memanggil pasien (dapat dipanggil berkali-kali)
|
||||
- **Selesai**: Tandai pasien selesai diproses
|
||||
- **Terlambat**: Tandai pasien terlambat
|
||||
- **Pending**: Tandai pasien pending
|
||||
|
||||
### 5. Panggil Antrian Berikutnya
|
||||
- Untuk setiap tipe layanan (Pemeriksaan Awal/Tindakan), admin dapat memanggil antrian berikutnya
|
||||
- Klik tombol **"Panggil"** di header section setiap tipe layanan
|
||||
- Pasien dapat dipanggil **berkali-kali** tanpa batas
|
||||
- Pasien yang dipanggil akan muncul di layar **Anjungan Klinik Ruang**
|
||||
|
||||
## Tips & Catatan Penting
|
||||
|
||||
### Tips:
|
||||
- ✅ Pasien yang sudah dibuat antrean klinik ruang akan **otomatis dikelompokkan** berdasarkan ruang yang dipilih
|
||||
- ✅ Nomor antrian baru (PA/TD) akan di-generate **otomatis per ruang dan tipe layanan**
|
||||
- ✅ Setiap pasien dapat dipanggil **berkali-kali tanpa batas**
|
||||
- ✅ Informasi pasien yang dipanggil akan muncul di **layar Anjungan Klinik Ruang**
|
||||
- ✅ Gunakan tombol **"Generate"** untuk mempercepat proses generate tiket
|
||||
|
||||
### Catatan:
|
||||
- Pasien yang sudah di-generate tiket akan pindah dari "Daftar Pasien Perlu Generate Tiket" ke antrian sesuai tipe layanan
|
||||
- Status pasien dapat berubah: waiting → di-loket → processed
|
||||
- Setiap ruang memiliki antrian terpisah untuk Pemeriksaan Awal dan Tindakan
|
||||
|
||||
## Struktur Data Pasien
|
||||
|
||||
### Pasien Belum Generate Tiket:
|
||||
- `processStage`: "klinik" atau "klinik-ruang"
|
||||
- `tipeLayanan`: null (belum ada)
|
||||
- `ruang`: nama ruang yang dipilih
|
||||
- `nomorRuang`: nomor ruang
|
||||
- `status`: "waiting", "di-loket", "terlambat", atau "pending"
|
||||
|
||||
### Pasien Sudah Generate Tiket:
|
||||
- `processStage`: "klinik-ruang"
|
||||
- `tipeLayanan`: "Pemeriksaan Awal" atau "Tindakan"
|
||||
- `noAntrian`: format "PA001" atau "TD001" + info klinik dan ruang
|
||||
- `status`: "waiting", "di-loket", "terlambat", atau "pending"
|
||||
|
||||
## Fitur Utama
|
||||
|
||||
1. **Scan Barcode**: Auto-detect barcode dengan mengabaikan huruf di depan (jika ada)
|
||||
2. **Generate Tiket**: Generate nomor antrian baru per ruang dan tipe layanan
|
||||
3. **Panggil Pasien**: Panggil pasien berkali-kali tanpa batas
|
||||
4. **Lihat Detail**: Lihat detail lengkap pasien dengan klik ikon mata
|
||||
5. **Kelola Antrian**: Proses, selesai, terlambat, atau pending pasien
|
||||
6. **Pisah Tipe Layanan**: Antrian terpisah untuk Pemeriksaan Awal dan Tindakan
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Q: Pasien tidak muncul di daftar?**
|
||||
A: Pastikan pasien sudah dibuat antrean klinik ruang dari Admin Loket/Admin Klinik dan ruang yang dipilih sesuai.
|
||||
|
||||
**Q: Nomor antrian tidak ter-generate?**
|
||||
A: Pastikan sudah memilih ruang dan tipe layanan di dialog, lalu klik "Buat Antrean".
|
||||
|
||||
**Q: Pasien tidak bisa dipanggil?**
|
||||
A: Pastikan pasien sudah di-generate tiket dan status-nya "waiting" atau "di-loket".
|
||||
|
||||
**Q: Pasien muncul di ruang yang salah?**
|
||||
A: Pastikan ruang yang dipilih saat create antrean klinik ruang sesuai dengan ruang yang diinginkan.
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, watch, onMounted, onUnmounted } from "vue";
|
||||
import { ref, computed, watch, onMounted, onUnmounted, nextTick } from "vue";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import { useQueue } from "@/composables/useQueue";
|
||||
import { useQueueStore } from "@/stores/queueStore";
|
||||
@@ -617,12 +617,14 @@ const handlePatientAction = (action) => {
|
||||
}
|
||||
};
|
||||
|
||||
const handleCall = (count) => {
|
||||
const handleCall = async (count) => {
|
||||
if (count === 1) {
|
||||
callNext(loketId.value);
|
||||
} else {
|
||||
callMultiplePatients(count, loketId.value);
|
||||
}
|
||||
// Force Vue to process reactivity updates
|
||||
await nextTick();
|
||||
};
|
||||
|
||||
const handleTableAction = (item, action) => {
|
||||
|
||||
+35
-12
@@ -1000,7 +1000,7 @@ export const useQueueStore = defineStore('queue', () => {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
idtiket: nextPatient.barcode || "",
|
||||
barcode: nextPatient.barcode || "",
|
||||
statuspasien: "3",
|
||||
statuspasien2: "4",
|
||||
idklinikstatus: "1",
|
||||
@@ -1096,7 +1096,7 @@ export const useQueueStore = defineStore('queue', () => {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
idtiket: patient.barcode || "",
|
||||
barcode: patient.barcode || "",
|
||||
statuspasien: "3",
|
||||
statuspasien2: "4",
|
||||
idklinikstatus: "1",
|
||||
@@ -1938,18 +1938,41 @@ export const useQueueStore = defineStore('queue', () => {
|
||||
const registerRegulerPatientViaApi = async (clinic, paymentType, visitType = 'SEKARANG', isFastTrack = false, fastTrackData = null) => {
|
||||
try {
|
||||
console.log('🔄 [queueStore] Generating ticket via API for REGULER patient...');
|
||||
console.log('📋 [queueStore] Payment Type:', paymentType, '| Clinic:', clinic.name, '| Clinic Code:', clinic.kode);
|
||||
|
||||
// 1. Find appropriate idloket based on BOTH clinic code AND payment type
|
||||
const allLokets = loketStore.lokets || [];
|
||||
|
||||
// Determine payment type for matching (normalize BPJS to JKN for API compatibility)
|
||||
const paymentTypeForMatching = paymentType === "BPJS" ? "JKN" : paymentType;
|
||||
|
||||
// Find loket that handles BOTH the clinic AND the payment type
|
||||
const targetLoket = allLokets.find(l => {
|
||||
// Check if loket handles the clinic
|
||||
const handlesClinic = l.pelayanan && Array.isArray(l.pelayanan) && l.pelayanan.includes(clinic.kode);
|
||||
if (!handlesClinic) return false;
|
||||
|
||||
// 1. Find appropriate idloket
|
||||
const allLokets = loketStore.lokets || [];
|
||||
const targetLoket = allLokets.find(l =>
|
||||
l.pelayanan && Array.isArray(l.pelayanan) && l.pelayanan.includes(clinic.kode)
|
||||
);
|
||||
// Check if loket accepts the payment type
|
||||
const acceptsPayment = l.pembayaran && Array.isArray(l.pembayaran) &&
|
||||
l.pembayaran.some(p => {
|
||||
// Handle case-insensitive matching and common variations
|
||||
const normalizedP = String(p).toUpperCase().trim();
|
||||
const normalizedPayment = String(paymentTypeForMatching).toUpperCase().trim();
|
||||
return normalizedP === normalizedPayment ||
|
||||
(normalizedPayment === "JKN" && normalizedP === "BPJS") ||
|
||||
(normalizedPayment === "BPJS" && normalizedP === "JKN");
|
||||
});
|
||||
|
||||
const idloket = targetLoket ? String(targetLoket.id) : "2"; // Default fallback to "2" if not found
|
||||
|
||||
// 2. Determine idpembayaran based on paymentType
|
||||
// BPJS (JKN) = "2", UMUM and others = "1"
|
||||
const idpembayaran = paymentType === "BPJS" ? "2" : "1";
|
||||
return handlesClinic && acceptsPayment;
|
||||
});
|
||||
|
||||
const idloket = targetLoket ? String(targetLoket.id) : "2"; // Default fallback to "2" if not found
|
||||
|
||||
console.log('🎯 [queueStore] Target Loket:', targetLoket ? `${targetLoket.namaLoket} (ID: ${targetLoket.id})` : 'Not found (using fallback)', '| Accepts Payment:', targetLoket?.pembayaran);
|
||||
|
||||
// 2. Determine idpembayaran based on paymentType
|
||||
// BPJS (JKN) = "2", UMUM and others = "1"
|
||||
const idpembayaran = paymentType === "BPJS" ? "2" : "1";
|
||||
|
||||
// 3. Prepare API Body
|
||||
const body = {
|
||||
|
||||
Reference in New Issue
Block a user