beginTransaction(); try { $purchaseId = create_record('purchase_order', 'أمر شراء ' . $supplier['title'], next_code('PO', 'purchase_order'), [ 'supplier_id' => (int)$supplier['id'], 'supplier_name' => $supplier['title'], 'product_id' => (int)$product['id'], 'product_name' => $product['title'], 'sku' => $sku, 'unit' => $productPayload['unit'] ?? 'وحدة', 'qty' => $qty, 'unit_cost' => $unitCost, 'subtotal' => $subtotal, 'vat' => $vat, 'grand_total' => $grand, 'notes' => $notes, 'created_date' => date('Y-m-d H:i'), 'received_at' => $status === 'received' ? date('Y-m-d H:i') : null, 'created_by' => current_user()['username'] ?? 'system', ], $status); $purchase = fetch_record('purchase_order', $purchaseId); if ($status === 'received' && $purchase) { $stock = adjust_product_stock($product, $qty, 'purchase_receive', $purchase['code'], 'purchase_order', $purchaseId, 'استلام شراء من المورد ' . $supplier['title']); $payload = $purchase['payload_data']; $payload['stock_after'] = $stock['after']; update_record_payload($purchaseId, $payload, 'received'); } db()->commit(); set_flash('success', $status === 'received' ? 'تم إنشاء أمر الشراء واستلامه وتحديث المخزون.' : 'تم حفظ أمر الشراء كمسودة.'); redirect('purchases.php?id=' . $purchaseId); } catch (Throwable $e) { db()->rollBack(); $errors[] = 'تعذر حفظ أمر الشراء، حاول مرة أخرى.'; } } } $suppliers = supplier_dataset(); $products = product_dataset(); $orders = fetch_records('purchase_order'); $detail = isset($_GET['id']) ? fetch_record('purchase_order', (int)$_GET['id']) : null; render_header('أوامر الشراء', 'إنشاء أوامر شراء وربطها بالموردين وتحديث المخزون عند الاستلام.', 'purchases'); ?>
اختر المورد والصنف ثم قرر هل هو استلام مباشر أم مسودة معلقة.
الأوامر المستلمة ترفع المخزون تلقائيًا، والمسودات تبقى دون تأثير.
| الرقم | المورد | الصنف | الإجمالي | الحالة |
|---|---|---|---|---|
| = e($order['code']) ?> | = e($payload['supplier_name'] ?? '') ?> | = e($payload['product_name'] ?? '') ?> = e((string)($payload['qty'] ?? 0)) ?> = e($payload['unit'] ?? '') ?> |
= e(format_money((float)($payload['grand_total'] ?? 0))) ?> | = e(order_status_label((string)$order['status'])) ?> |