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'); ?>
أوامر التصنيع
إجمالي السجل
اليوم
أوامر اليوم
مكتملة
تم ترحيلها للمخزون
الإنتاج الناتج
إجمالي الكمية المقبولة

إنشاء أمر تصنيع

اختر الخامة والمنتج النهائي وسجّل الكمية الفعلية المستخدمة وحالة الجودة.

يلزم وجود مادة خام ومنتج نهائي واحد على الأقل في صفحة الأصناف قبل بدء التصنيع.

سجل أوامر التصنيع

الأوامر المكتملة تخصم الخامات وتضيف المنتجات النهائية مباشرة.

الرقمالمنتج النهائيالخامةالناتجالحالة
لا توجد أوامر تصنيع بعد.

تفاصيل أمر التصنيع

يعرض أثر العملية على المخزون الفعلي لكل صنف.

رقم الأمر
الحالة
الجودة
المنشئ
المادة الخام
الاستهلاك الفعلي
المخزون بعد الخصم
المنتج النهائي
الكمية المنتجة
الكمية المرحلة فعليًا
المخزون بعد الإضافة
تاريخ الإنشاء
تاريخ الإكمال
نسبة التحويل
مسودات
اختر أمر تصنيع من الجدول لعرض التفاصيل.