* order -> invoice cycle). This adds 4 more direct orders (no quotation) to * give the Orders list page realistic volume and status variety: * - 2 left in Draft (status=0) — never confirmed * - 2 Confirmed (status=1) — stock-out auto-approved via FIFO bin selection * * All writes go through OrderManager (the same class the app itself uses), * wrapped in dbTransaction(). Safe to re-run: guarded by order.notes markers. */ if (PHP_SAPI !== 'cli') { http_response_code(403); exit('Run via CLI only: php demo_seed_more_orders.php'); } $_SESSION = []; require __DIR__ . '/app/config.php'; require __DIR__ . '/app/dbconn.php'; require __DIR__ . '/app/assets/utils/db_helpers.php'; require __DIR__ . '/app/assets/utils/classes/WarehouseManager.php'; require __DIR__ . '/app/assets/utils/classes/StockManager.php'; require __DIR__ . '/app/assets/utils/classes/OrderManager.php'; function info(string $msg): void { echo "\033[36m •\033[0m {$msg}\n"; } function ok(string $msg): void { echo "\033[32m ✓\033[0m {$msg}\n"; } function skip(string $msg): void { echo "\033[33m –\033[0m {$msg}\n"; } function buildLineItem(array $products, string $sku, float $qty): array { $p = $products[$sku]; $unit_price = (float)$p['price']; $total_price = round($qty * $unit_price, 4); $tax_rate = 7.0; $tax_amount = round($total_price * $tax_rate / 100, 4); return [ 'product_sku' => $sku, 'product_name' => $p['product_name'], 'quantity' => $qty, 'unit_price' => $unit_price, 'total_price' => $total_price, 'tax_amount' => $tax_amount, 'tax_rate' => $tax_rate, ]; } echo "\n\033[1m=== brnwms Demo Data Seeder — more sales orders ===\033[0m\n\n"; // ── Resolve shared context (company, warehouse, products, customers, dept) ──── $sth = $pdo1->prepare("SELECT company_id FROM company_list WHERE channel_name = 'demo' LIMIT 1"); $sth->execute(); $company_id = (int)$sth->fetchColumn(); if (!$company_id) { exit("ERROR: demo company not found — run demo_seed.php first.\n"); } $sth = $pdo1->prepare("SELECT user_id FROM user WHERE username = 'admin' LIMIT 1"); $sth->execute(); $owner_user_id = (int)$sth->fetchColumn(); $sth = $pdo2->prepare("SELECT id FROM md_warehouse WHERE company_id = :c AND warehouse_name = 'Main Warehouse' LIMIT 1"); $sth->execute([':c' => $company_id]); $main_wh = (int)$sth->fetchColumn(); $sth = $pdo2->prepare("SELECT id FROM md_department WHERE company_id = :c AND dept_code = 'SALES' LIMIT 1"); $sth->execute([':c' => $company_id]); $sales_dept_id = (int)$sth->fetchColumn(); if (!$sales_dept_id) { exit("ERROR: SALES department not found — run demo_seed_transactions.php first.\n"); } $sth = $pdo2->prepare("SELECT sku, product_name, price FROM md_product WHERE company_id = :c"); $sth->execute([':c' => $company_id]); $products = $sth->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE); // contact_type holds an md_contact_type id — resolve 'Customer' by name, not by a fixed id. $sth = $pdo2->prepare( "SELECT c.id, c.contact_name FROM md_contact c JOIN md_contact_type t ON t.company_id = c.company_id AND t.id = c.contact_type WHERE c.company_id = :c AND t.contact_type = 'Customer' ORDER BY c.id" ); $sth->execute([':c' => $company_id]); $customers = $sth->fetchAll(PDO::FETCH_ASSOC); $customer_ids = array_column($customers, 'id'); $logging = ['user_id' => $owner_user_id, 'dt' => date('Y-m-d H:i:s'), 'login' => null, 'action' => 'seed_more_orders']; $orderMgmt = new OrderManager($pdo2, $company_id); // ── Order definitions ────────────────────────────────────────────────────── $order_defs = [ ['marker' => 'Demo seed extra order 1', 'customer_idx' => 1, 'confirm' => false, 'items' => [['sku' => 'EL-001', 'qty' => 10], ['sku' => 'PK-002', 'qty' => 5]]], ['marker' => 'Demo seed extra order 2', 'customer_idx' => 2, 'confirm' => true, 'items' => [['sku' => 'BV-003', 'qty' => 20], ['sku' => 'OF-002', 'qty' => 8]]], ['marker' => 'Demo seed extra order 3', 'customer_idx' => 3, 'confirm' => true, 'items' => [['sku' => 'EL-004', 'qty' => 5], ['sku' => 'PK-003', 'qty' => 30]]], ['marker' => 'Demo seed extra order 4', 'customer_idx' => 0, 'confirm' => false, 'items' => [['sku' => 'OF-004', 'qty' => 10], ['sku' => 'BV-001', 'qty' => 15]]], ]; echo "--- Sales orders ---\n"; foreach ($order_defs as $d) { $sth = $pdo2->prepare("SELECT id, status FROM td_order WHERE company_id = :c AND notes = :n LIMIT 1"); $sth->execute([':c' => $company_id, ':n' => $d['marker']]); $existing = $sth->fetch(PDO::FETCH_ASSOC); if ($existing) { skip("{$d['marker']} already exists (id={$existing['id']}, status={$existing['status']})"); continue; } $customer_id = $customer_ids[$d['customer_idx']]; $items = array_map( fn($it) => buildLineItem($products, $it['sku'], $it['qty']) + ['warehouse_id' => $main_wh], $d['items'] ); $order_id = dbTransaction($pdo2, function ($pdo2) use ($orderMgmt, $customer_id, $sales_dept_id, $items, $logging, $d) { // No 'source' -> direct WMS order -> starts as Draft (status=0) immediately. $oid = $orderMgmt->saveOrder([ 'id' => 0, 'contact_id' => $customer_id, 'department_id' => $sales_dept_id, 'order_date' => date('Y-m-d'), 'items' => $items, 'discount' => 0, 'shipping_fee' => 0, 'notes' => $d['marker'], ], $logging); if ($d['confirm']) { $orderMgmt->confirmOrder($oid, bin2hex(random_bytes(16)), $logging, true); // auto-approve stock-out } return $oid; }); $state = $d['confirm'] ? 'confirmed (stock-out auto-approved)' : 'left as draft'; ok("Created order {$d['marker']} (id={$order_id}), {$state}"); } echo "\n\033[1m=== Done ===\033[0m\n\n";