+
+
Medication Label
+
${label.itemCode} - ${label.itemName}
+
Dosage: ${label.dosage}
+
Frequency: ${label.frequency}
+
Batch No: ${label.batchNo}
+
Expiry Date: ${label.expiryDate}
+
+
+`);
+
+ const printWindow = window.open("", "_blank");
+ if (!printWindow) {
+ toast.error("Unable to open print window. Please allow popups and try again.");
+ return;
+ }
+
+ printWindow.document.write(
+ "" +
+ pages.join("") +
+ ''
+ );
+ printWindow.document.close();
+ };
+
+ const showPostDispenseActions =
+ isHospitalPharmacy &&
+ !!lastDispensedSalesOrder &&
+ !!lastDispensedCartSignature &&
+ lastDispensedCartSignature === getCartSignature(cartItems);
+
const handleDispense = async () => {
if (!validateCustomer()) return;
if (!selectedCustomer) return;
@@ -1939,6 +2020,26 @@ export default function OrderSummary({
setShowPaymentDialog(true);
return;
}
+ const missingMedicationDetails = cartItems
+ .map((item) => {
+ const lineKey = getLineKey(item);
+ const lineDiscount = ((itemDiscounts[item.id] || itemDiscounts[lineKey]) || {}) as { dosage?: string; prescriptionDosage?: string };
+ const dosageRaw = lineDiscount.dosage;
+ const frequencyRaw = lineDiscount.prescriptionDosage;
+ const hasDosage = dosageRaw !== null && dosageRaw !== undefined && String(dosageRaw).trim() !== "";
+ const hasFrequency = typeof frequencyRaw === "string" && frequencyRaw.trim() !== "";
+ if (hasDosage && hasFrequency) return null;
+ return item.name || item.item_code || item.id;
+ })
+ .filter(Boolean) as string[];
+
+ if (missingMedicationDetails.length > 0) {
+ const uniqueItems = Array.from(new Set(missingMedicationDetails));
+ toast.error(
+ `Missing dosage or prescription frequency for: ${uniqueItems.join(", ")}. Kindly update Patient Medication Order items before dispensing.`
+ );
+ return;
+ }
try {
setIsDispensing(true);
const allMedicationOrders = Array.from(new Set(
@@ -1992,7 +2093,58 @@ export default function OrderSummary({
toast.error("Dispense failed. Sales Order was not created.");
return;
}
+ const dispensedCartSignature = getCartSignature(cartItems);
+
+ const labelsFromCart: DispensedLabelItem[] = cartItems.map((item) => {
+ const lineKey = getLineKey(item);
+ const lineDiscount = ((itemDiscounts[item.id] || itemDiscounts[lineKey]) || {}) as {
+ dosage?: string;
+ prescriptionDosage?: string;
+ batchNumber?: string;
+ };
+ const dosage = lineDiscount.dosage;
+ const frequency = lineDiscount.prescriptionDosage;
+ const batchNo =
+ lineDiscount.batchNumber ||
+ (item as CartItem & { batch_no?: string }).batch_no ||
+ "N/A";
+
+ return {
+ itemCode: item.item_code || item.id,
+ itemName: item.name,
+ dosage: dosage === null || dosage === undefined || String(dosage).trim() === "" ? "N/A" : String(dosage),
+ frequency: typeof frequency === "string" && frequency.trim() ? frequency : "N/A",
+ batchNo,
+ expiryDate: "N/A",
+ };
+ });
+
+ const batchNumbers = Array.from(
+ new Set(labelsFromCart.map((label) => label.batchNo).filter((batchNo) => batchNo && batchNo !== "N/A"))
+ );
+
+ if (batchNumbers.length > 0) {
+ try {
+ const batchDetails = await getBatchLabelDetails(batchNumbers);
+ const labelsWithExpiry = labelsFromCart.map((label) => {
+ const matchedBatch = batchDetails[label.batchNo];
+ return {
+ ...label,
+ expiryDate: matchedBatch?.expiry_date || "N/A",
+ batchNo: matchedBatch?.batch_no || label.batchNo,
+ };
+ });
+ setLastDispensedLabelItems(labelsWithExpiry);
+ } catch (batchError) {
+ console.error("Failed to fetch batch expiry details for labels:", batchError);
+ setLastDispensedLabelItems(labelsFromCart);
+ }
+ } else {
+ setLastDispensedLabelItems(labelsFromCart);
+ }
+
setLastDispensedSalesOrder(soName);
+ setLastDispensedCartSignature(dispensedCartSignature);
toast.success(`Dispensed successfully. Sales Order: ${soName}`);
} catch (error) {
toast.error(extractErrorFromException(error, "Failed to dispense items"));
@@ -2878,7 +3030,8 @@ const handleSetSerial = (event: CustomEvent) => {
serialNumber: "",
availableQuantity: 150,
prescriptionDosage: "",
- dosage: 0,
+ dosage: "",
+ ...(itemDiscounts[item.id] || {}),
...(itemDiscounts[lineKey] || {}),
// Persisted batch survives refresh
...(cartItemBatch !== undefined && cartItemBatch !== "" ? { batchNumber: cartItemBatch } : {}),
@@ -3338,12 +3491,14 @@ const handleSetSerial = (event: CustomEvent) => {
Hold
)}
-