diff --git a/api/patients.php b/api/patients.php index 52f8ad4..6674cc6 100644 --- a/api/patients.php +++ b/api/patients.php @@ -1,5 +1,5 @@ prepare("SELECT id, name, phone FROM patients WHERE name LIKE ? OR phone LIKE ? LIMIT 20"); + + // Search by name or phone + $sql = "SELECT id, name_en as name, phone FROM patients WHERE name_en LIKE ? OR name_ar LIKE ? OR phone LIKE ? LIMIT 20"; + $stmt = $pdo->prepare($sql); $term = "%$q%"; - $stmt->execute([$term, $term]); + $stmt->execute([$term, $term, $term]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode($results); break; @@ -27,4 +32,4 @@ try { } catch (Exception $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); -} +} \ No newline at end of file diff --git a/api/pharmacy.php b/api/pharmacy.php index 8d96340..c30cb91 100644 --- a/api/pharmacy.php +++ b/api/pharmacy.php @@ -1,5 +1,5 @@ 0 AND pb.expiry_date >= CURDATE() ORDER BY pb.expiry_date ASC LIMIT 1) as batch_price, COALESCE(SUM(b.quantity), 0) as stock FROM drugs d LEFT JOIN pharmacy_batches b ON d.id = b.drug_id AND b.quantity > 0 AND b.expiry_date >= CURDATE() - WHERE d.name_en LIKE ? OR d.name_ar LIKE ? + WHERE (d.name_en LIKE ? OR d.name_ar LIKE ? OR d.sku LIKE ?) GROUP BY d.id LIMIT 20"; $stmt = $pdo->prepare($sql); $term = "%$q%"; - $stmt->execute([$term, $term]); + $stmt->execute([$term, $term, $term]); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); break; @@ -135,7 +136,7 @@ try { case 'get_sales': // List recent sales - $sql = "SELECT s.*, p.name_en as patient_name + $sql = "SELECT s.*, p.name as patient_name FROM pharmacy_sales s LEFT JOIN patients p ON s.patient_id = p.id ORDER BY s.created_at DESC LIMIT 50"; @@ -147,7 +148,7 @@ try { $sale_id = $_GET['sale_id'] ?? 0; if (!$sale_id) throw new Exception("Sale ID required"); - $stmt = $pdo->prepare("SELECT s.*, p.name_en as patient_name FROM pharmacy_sales s LEFT JOIN patients p ON s.patient_id = p.id WHERE s.id = ?"); + $stmt = $pdo->prepare("SELECT s.*, p.name as patient_name FROM pharmacy_sales s LEFT JOIN patients p ON s.patient_id = p.id WHERE s.id = ?"); $stmt->execute([$sale_id]); $sale = $stmt->fetch(PDO::FETCH_ASSOC); diff --git a/api/pharmacy_lpo.php b/api/pharmacy_lpo.php new file mode 100644 index 0000000..733502b --- /dev/null +++ b/api/pharmacy_lpo.php @@ -0,0 +1,93 @@ +beginTransaction(); + + $stmt = $pdo->prepare("INSERT INTO pharmacy_lpos (supplier_id, lpo_date, status, total_amount, notes) VALUES (?, ?, 'Draft', ?, ?)"); + $stmt->execute([ + $data['supplier_id'], + $data['lpo_date'] ?? date('Y-m-d'), + $data['total_amount'] ?? 0, + $data['notes'] ?? '' + ]); + $lpoId = $pdo->lastInsertId(); + + $stmtItem = $pdo->prepare("INSERT INTO pharmacy_lpo_items (lpo_id, drug_id, quantity, cost_price, total_cost) VALUES (?, ?, ?, ?, ?)"); + + foreach ($data['items'] as $item) { + $stmtItem->execute([ + $lpoId, + $item['drug_id'], + $item['quantity'], + $item['cost_price'], + $item['total_cost'] + ]); + } + + $pdo->commit(); + echo json_encode(['success' => true, 'message' => 'LPO created successfully']); + + } elseif ($action === 'update_status') { + $data = json_decode(file_get_contents('php://input'), true); + if (empty($data['id']) || empty($data['status'])) { + throw new Exception("ID and Status are required"); + } + + $stmt = $pdo->prepare("UPDATE pharmacy_lpos SET status = ? WHERE id = ?"); + $stmt->execute([$data['status'], $data['id']]); + + echo json_encode(['success' => true]); + } + } elseif ($_SERVER['REQUEST_METHOD'] === 'GET') { + if ($action === 'get_lpos') { + $stmt = $pdo->query(" + SELECT l.*, s.name_en as supplier_name + FROM pharmacy_lpos l + LEFT JOIN suppliers s ON l.supplier_id = s.id + ORDER BY l.created_at DESC + "); + echo json_encode($stmt->fetchAll()); + + } elseif ($action === 'get_lpo_details') { + $id = $_GET['id'] ?? 0; + $stmt = $pdo->prepare(" + SELECT i.*, d.name_en as drug_name, d.sku + FROM pharmacy_lpo_items i + LEFT JOIN drugs d ON i.drug_id = d.id + WHERE i.lpo_id = ? + "); + $stmt->execute([$id]); + echo json_encode($stmt->fetchAll()); + + } elseif ($action === 'get_suppliers') { + $stmt = $pdo->query("SELECT id, name_en, name_ar FROM suppliers ORDER BY name_en ASC"); + echo json_encode($stmt->fetchAll()); + + } elseif ($action === 'get_drugs') { + $stmt = $pdo->query("SELECT id, name_en, name_ar, sku, price FROM drugs ORDER BY name_en ASC"); + echo json_encode($stmt->fetchAll()); + } + } + +} catch (Exception $e) { + if ($pdo->inTransaction()) { + $pdo->rollBack(); + } + http_response_code(500); + echo json_encode(['error' => $e->getMessage()]); +} diff --git a/db/migrations/20260321_add_sku_to_drugs.sql b/db/migrations/20260321_add_sku_to_drugs.sql new file mode 100644 index 0000000..d6f86b2 --- /dev/null +++ b/db/migrations/20260321_add_sku_to_drugs.sql @@ -0,0 +1,2 @@ +ALTER TABLE drugs ADD COLUMN sku VARCHAR(50) DEFAULT NULL AFTER id; +CREATE INDEX idx_drugs_sku ON drugs(sku); diff --git a/db/migrations/20260321_create_pharmacy_lpo.sql b/db/migrations/20260321_create_pharmacy_lpo.sql new file mode 100644 index 0000000..a86bf3e --- /dev/null +++ b/db/migrations/20260321_create_pharmacy_lpo.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS `pharmacy_lpos` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `supplier_id` INT NOT NULL, + `lpo_date` DATE NOT NULL, + `status` ENUM('Draft', 'Sent', 'Received', 'Cancelled') DEFAULT 'Draft', + `total_amount` DECIMAL(10, 2) DEFAULT 0.00, + `notes` TEXT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`supplier_id`) REFERENCES `suppliers`(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `pharmacy_lpo_items` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `lpo_id` INT NOT NULL, + `drug_id` INT NOT NULL, + `quantity` INT NOT NULL, + `cost_price` DECIMAL(10, 2) NOT NULL, + `total_cost` DECIMAL(10, 2) NOT NULL, + FOREIGN KEY (`lpo_id`) REFERENCES `pharmacy_lpos`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`drug_id`) REFERENCES `drugs`(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/includes/layout/header.php b/includes/layout/header.php index 699bc91..394df57 100644 --- a/includes/layout/header.php +++ b/includes/layout/header.php @@ -131,15 +131,16 @@ $site_favicon = !empty($site_settings['company_favicon']) ? $site_settings['comp - + -
+