125 lines
4.6 KiB
JavaScript
125 lines
4.6 KiB
JavaScript
/**
|
|
* PharmacyManager: Handles inventory, prescriptions, and billing.
|
|
*/
|
|
|
|
class PharmacyManager {
|
|
constructor() {
|
|
this.inventory = [
|
|
{ id: 'M01', name: 'Paracetamol 500mg', stock: 120, price: 5, batch: 'B2201', expiry: '2026-12-30', hsn: '3004', gst: 12 },
|
|
{ id: 'M02', name: 'Amoxicillin 250mg', stock: 45, price: 12, batch: 'B2205', expiry: '2026-06-15', hsn: '3004', gst: 12 },
|
|
{ id: 'M03', name: 'Cough Syrup', stock: 104, price: 85, batch: 'S881', expiry: '2026-04-10', hsn: '3004', gst: 12 },
|
|
{ id: 'M04', name: 'Vitamin C', stock: 200, price: 3, batch: 'V009', expiry: '2027-01-01', hsn: '2936', gst: 18 },
|
|
{ id: 'M05', name: 'Azithromycin', stock: 30, price: 150, batch: 'A772', expiry: '2026-08-20', hsn: '3004', gst: 12 },
|
|
{ id: 'M06', name: 'Insulin Glargine', stock: 12, price: 450, batch: 'I110', expiry: '2026-05-25', hsn: '3004', gst: 5 }
|
|
];
|
|
this.lowStockThreshold = 10;
|
|
this.pendingOrders = [
|
|
{ id: 'ORD-901', patientName: 'Rahul Verma', medicines: 'Paracetamol, Cough Syrup', status: 'PENDING', timestamp: '2026-05-13T09:15:00Z' },
|
|
{ id: 'ORD-902', patientName: 'Anjali Singh', medicines: 'Amoxicillin', status: 'READY', timestamp: '2026-05-13T09:45:00Z' }
|
|
];
|
|
}
|
|
|
|
getInventory() {
|
|
return this.inventory;
|
|
}
|
|
|
|
addPendingOrder(patientName, medicines) {
|
|
this.pendingOrders.push({
|
|
id: `ORD-${Date.now()}`,
|
|
patientName,
|
|
medicines,
|
|
status: 'PENDING',
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
}
|
|
|
|
processOrder(orderId) {
|
|
const order = this.pendingOrders.find(o => o.id === orderId);
|
|
if (order) {
|
|
order.status = 'READY';
|
|
// Deduct stock (simplified for now)
|
|
const meds = order.medicines.split(', ');
|
|
meds.forEach(m => this.deductStock(m, 1));
|
|
return { success: true, message: `Order for ${order.patientName} is ready for pickup.` };
|
|
}
|
|
return { success: false, message: "Order not found." };
|
|
}
|
|
|
|
deductStock(medName, qty) {
|
|
const med = this.inventory.find(i => i.name.includes(medName));
|
|
if (med) {
|
|
med.stock -= qty;
|
|
if (med.stock < this.lowStockThreshold) {
|
|
console.log(`[Pharmacy] ⚠️ ALERT: Low stock for ${med.name} (${med.stock} left)`);
|
|
return { lowStock: true, medName: med.name };
|
|
}
|
|
}
|
|
return { lowStock: false };
|
|
}
|
|
|
|
restock(medName, qty) {
|
|
const med = this.inventory.find(i => i.name.includes(medName));
|
|
if (med) {
|
|
med.stock += qty;
|
|
console.log(`[Pharmacy] ✅ Restocked ${med.name}. New stock: ${med.stock}`);
|
|
}
|
|
}
|
|
|
|
calculateBill(medId, qty) {
|
|
const item = this.inventory.find(i => i.id === medId);
|
|
if (!item) return null;
|
|
|
|
const subtotal = item.price * qty;
|
|
const gstAmount = (subtotal * item.gst) / 100;
|
|
const total = subtotal + gstAmount;
|
|
|
|
return {
|
|
itemName: item.name,
|
|
qty,
|
|
rate: item.price,
|
|
subtotal,
|
|
gstRate: item.gst,
|
|
gstAmount,
|
|
total,
|
|
hsn: item.hsn
|
|
};
|
|
}
|
|
|
|
fulfillPrescription(prescription) {
|
|
console.log(`[Pharmacy] Fulfilling Rx: ${prescription.id} for Patient ${prescription.patientId}`);
|
|
|
|
const billItems = [];
|
|
let totalBill = 0;
|
|
|
|
prescription.medicines.forEach(m => {
|
|
const med = this.inventory.find(i => i.name.toLowerCase().includes(m.name.toLowerCase()));
|
|
if (med) {
|
|
const itemBill = this.calculateBill(med.id, m.qty || 10);
|
|
billItems.push(itemBill);
|
|
totalBill += itemBill.total;
|
|
this.deductStock(med.name, m.qty || 10);
|
|
}
|
|
});
|
|
|
|
// Forward Lab Tests
|
|
if (prescription.labTests && prescription.labTests.length > 0) {
|
|
this.forwardToLab(prescription.patientId, prescription.labTests);
|
|
}
|
|
|
|
return {
|
|
billItems,
|
|
totalBill,
|
|
labStatus: prescription.labTests.length > 0 ? "FORWARDED" : "NONE"
|
|
};
|
|
}
|
|
|
|
forwardToLab(patientId, tests) {
|
|
console.log(`[Pharmacy] 🔬 AUTONOMOUS ACTION: Forwarding ${tests.length} tests to Lab for Patient ${patientId}`);
|
|
tests.forEach(t => {
|
|
console.log(`[Lab] 📥 Received Request: ${t.testName} for Patient ${patientId}`);
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = new PharmacyManager();
|