0 && $rawProductId === $finishedProductId) { $errors[] = 'لا يمكن أن تكون المادة الخام والمنتج النهائي نفس الصنف.'; } if ($finishedQty <= 0 || $actualRawQty <= 0) { $errors[] = 'أدخل كميات صحيحة للإنتاج والاستهلاك الفعلي.'; } if (!array_key_exists($qualityStatus, $qualityOptions)) { $errors[] = 'حالة الجودة غير صحيحة.'; } if (!in_array($status, ['draft', 'completed'], true)) { $errors[] = 'حالة أمر التصنيع غير صحيحة.'; } if (!$errors && $rawProduct && $finishedProduct) { $rawPayload = $rawProduct['payload_data']; $finishedPayload = $finishedProduct['payload_data']; $producedQty = $qualityStatus === 'rejected' ? 0.0 : $finishedQty; db()->beginTransaction(); try { $manufacturingId = create_record('manufacturing_order', 'أمر تصنيع ' . $finishedProduct['title'], next_code('MO', 'manufacturing_order'), [ 'raw_product_id' => (int)$rawProduct['id'], 'raw_product_name' => $rawProduct['title'], 'raw_sku' => $rawPayload['sku'] ?? $rawProduct['code'], 'raw_unit' => $rawPayload['unit'] ?? 'وحدة', 'finished_product_id' => (int)$finishedProduct['id'], 'finished_product_name' => $finishedProduct['title'], 'finished_sku' => $finishedPayload['sku'] ?? $finishedProduct['code'], 'finished_unit' => $finishedPayload['unit'] ?? 'وحدة', 'finished_qty' => $finishedQty, 'actual_raw_qty' => $actualRawQty, 'produced_qty' => $producedQty, 'quality_status' => $qualityStatus, 'quality_label' => manufacturing_quality_label($qualityStatus), 'conversion_ratio' => $actualRawQty > 0 ? round($finishedQty / $actualRawQty, 4) : 0, 'notes' => $notes, 'created_date' => date('Y-m-d H:i'), 'completed_at' => $status === 'completed' ? date('Y-m-d H:i') : null, 'created_by' => current_user()['username'] ?? 'system', ], $status); $order = fetch_record('manufacturing_order', $manufacturingId); if ($status === 'completed' && $order) { $rawStock = adjust_product_stock($rawProduct, -$actualRawQty, 'manufacturing_consume', $order['code'], 'manufacturing_order', $manufacturingId, 'استهلاك خامات لأمر التصنيع ' . $order['code']); $payload = $order['payload_data']; $payload['raw_stock_after'] = $rawStock['after']; if ($producedQty > 0) { $finishedStock = adjust_product_stock($finishedProduct, $producedQty, 'manufacturing_output', $order['code'], 'manufacturing_order', $manufacturingId, 'إضافة إنتاج نهائي لأمر التصنيع ' . $order['code']); $payload['finished_stock_after'] = $finishedStock['after']; } else { $currentFinishedStock = (float)($finishedPayload['stock_qty'] ?? 0); $payload['finished_stock_after'] = $currentFinishedStock; } update_record_payload($manufacturingId, $payload, 'completed'); } db()->commit(); set_flash('success', $status === 'completed' ? 'تم إكمال أمر التصنيع وتحديث المخزون تلقائيًا.' : 'تم حفظ أمر التصنيع كمسودة.'); redirect('manufacturing.php?id=' . $manufacturingId); } catch (Throwable $e) { db()->rollBack(); $errors[] = 'تعذر حفظ أمر التصنيع، تأكد من توفر المخزون الخام ثم حاول مرة أخرى.'; } } } $rawMaterials = raw_material_dataset(); $finishedProducts = finished_product_dataset(); $orders = fetch_records('manufacturing_order'); $detail = isset($_GET['id']) ? fetch_record('manufacturing_order', (int)$_GET['id']) : null; $todayCount = today_record_count('manufacturing_order'); $completedCount = 0; $draftCount = 0; $totalProducedQty = 0.0; foreach ($orders as $order) { $payload = $order['payload_data']; if (($order['status'] ?? '') === 'completed') { $completedCount++; } if (($order['status'] ?? '') === 'draft') { $draftCount++; } $totalProducedQty += (float)($payload['produced_qty'] ?? 0); } render_header('التصنيع', 'تسجيل أوامر تصنيع تخصم الخامات وتضيف المنتجات النهائية تلقائيًا مع متابعة الجودة.', 'manufacturing'); ?>
اختر الخامة والمنتج النهائي وسجّل الكمية الفعلية المستخدمة وحالة الجودة.
الأوامر المكتملة تخصم الخامات وتضيف المنتجات النهائية مباشرة.
| الرقم | المنتج النهائي | الخامة | الناتج | الحالة |
|---|---|---|---|---|
| = e($order['code']) ?> | = e($payload['finished_product_name'] ?? '') ?> = e((string)($payload['finished_qty'] ?? 0)) ?> = e($payload['finished_unit'] ?? '') ?> |
= e($payload['raw_product_name'] ?? '') ?> = e((string)($payload['actual_raw_qty'] ?? 0)) ?> = e($payload['raw_unit'] ?? '') ?> |
= e((string)($payload['produced_qty'] ?? 0)) ?> = e($payload['finished_unit'] ?? '') ?> = e(manufacturing_quality_label((string)($payload['quality_status'] ?? 'accepted'))) ?> |
= e(order_status_label((string)$order['status'])) ?> |
يعرض أثر العملية على المخزون الفعلي لكل صنف.