curaflow/backend/pharmacyManager.js

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();