اذهب إلى المحتوى
  • 0

[php mysql] إعداد صفحة تسمى رصيد العميل

محمد المصري12

السؤال

المهمة التي أنا بصددها مركبة و شديدة التعقيد

أولا شرح الفكرة بشكل عام : 

انا اقوم بعمل موديول مخازن متقدم يعمل على بيئة dolibarr erp و يستخدم هذا الموديول مصنع يعمل في مجال تصنيع القماش

حيث يقوم العميل بتسليم الغزل إلى المصنع ثم يقوم المصنع بخدمة التصنيع و تحويل الغزل إلى قماش و إعادة تسليمه للعميل مرة أخرى

و تتم هذه العملية عبر موديول اسمه أوامر التصنيع ، و يحتوي على اسم القماش (المنتج التام) و الغزل المطلوب لانتاج هذا النوع من القماش (المواد الخام )

ما أقوم بفعله الآن هو إعداد صفحة تسمى رصيد العميل

الغرض منها هو معرفة المواد الخام التي قام العميل بتوريدها للمصنع

و معرفة القماش (المنتج التام الذي قام المصنع بتسليمه للعميل)

و يقوم بحساب الاستهلاكات و المرتجعات (و هذا سنتطرق إليه لاحقاً)

*المنطق البرمجي*
1- الجدول الاساسي الذي سأقوم بجلب البيانات منه هو جدول الحركات المخزنية و اسمه stock_mouvement
2- الجدول الذي من خلاله سأقوم باستدعاء اسم المنتج سواء كان منتج تام او مواد خام هو product
3- كيف نقوم بتمييز المادة الخام من المنتج التام ؟ نقوم بذلك من خلال عمود finished في جدول product حيث يرمز رقم 3 الى الغزول(المواد الخام) و يرمز الرقم 4 إلى المنتج التام (القماش)
4- جدول c_product_nature اقوم من خلاله بإستدعاء مسمى نوع المنتج و ذلك للمعلومات فقط

ملحوظات : هناك عمليات كثيرة تحدث في جدول stock_mouvement منها استلام مواد خام و مرتجعات و نقل داخلي و لكي اقوم بتمييز العمليات التي أحتاجها هناك حقل يسمى type_mouvement
يحيث ترمز القيمة 100 إلى المواد الخام التي تم استلامها و هي دائما قيمة موجبة
و القيمة 200 إلى مرتجع المواد الخام و قطعا هي قيمة سالبة 
و القيمة 300 ترمز لحركة استهلاك مواد خام و هي قطعا قيمة سالبة
و القيمة 500 ترمز الى إضافة منتج تام تم تصنيعه و بالطبع هي قيمة موجبة
و القيمة 600 ترمز لحركة تسليم المنتج التام إلى العميل و هي قيمة سالبة
أما القيمة 700 فهي ترمز لحركة مرتجع المنتج التام من العميل إلى المصنع و هي حركة إضافة ذات قيمة موجبة


و الآن نتطرق إلى الأمور البرمجية

الكود الحالي كاملا

    if (!empty($_POST['sCustomer'])) {
            $customerId = GETPOST('sCustomer', 'alpha');
            $data = array();

// Retrieve the thread types without duplicates
//$sql = "SELECT DISTINCT itemName a FROM ".MAIN_DB_PREFIX."reyadastocks a JOIN product b ON a.itemName = b.rowid WHERE a.sCustomer = '".$customerId."'";
         $sql = "SELECT a.fk_product as ProductID,b.finished as typeID, b.label AS itemLabel, c.label as itemType, MAX(a.rowid) as rowid 
        FROM ".MAIN_DB_PREFIX."stock_mouvement a
        JOIN ".MAIN_DB_PREFIX."product b ON a.fk_product = b.rowid
        JOIN ".MAIN_DB_PREFIX."c_product_nature c ON b.finished = c.rowid
        WHERE (a.type_mouvement = '100' OR a.type_mouvement = '500') AND a.fk_soc = '".$customerId."'
        GROUP BY a.fk_product, c.label
        ORDER BY MAX(a.rowid) ASC";


            $resql = $reyadastocks->db->query($sql);
			$rawMaterials = array();
			$finishedGoods = array();
            while ($obj = $reyadastocks->db->fetch_object($resql)) {
                $ProductID = $obj->ProductID; // Product ID
                $itemLabel = $obj->itemLabel; // Product Label
                $itemType = $obj->itemType;   // Product Type lABEL
                $itemTypeID = $obj->typeID; //Product Type ID

                $data[] = array(
                    'type' => $itemLabel,
                    'itemType' => $itemType,
                    'received' => $received,

                );
            }

            // Send the data back to the client
            echo json_encode(array('data' => $data));
        }

 

 $sql = "SELECT a.fk_product as ProductID,b.finished as typeID, b.label AS itemLabel, c.label as itemType, MAX(a.rowid) as rowid 
        FROM ".MAIN_DB_PREFIX."stock_mouvement a
        JOIN ".MAIN_DB_PREFIX."product b ON a.fk_product = b.rowid
        JOIN ".MAIN_DB_PREFIX."c_product_nature c ON b.finished = c.rowid
        WHERE (a.type_mouvement = '100' OR a.type_mouvement = '500') AND a.fk_soc = '".$customerId."'
        GROUP BY a.fk_product, c.label
        ORDER BY MAX(a.rowid) ASC";


الإستعلام السابق من خلاله أحصل على الحركات المخزنية ذات type_mouvement = '100'  و التي ترمز إلى المواد الخام التي تم استلامها  و رقم 500 و هو المنتج التام الذي تم تصنيعه بالفعل 

            $resql = $reyadastocks->db->query($sql);
            while ($obj = $reyadastocks->db->fetch_object($resql)) {
                $ProductID = $obj->ProductID; // Product ID
                $itemLabel = $obj->itemLabel; // Product Label
                $itemType = $obj->itemType;   // Product Type lABEL
                $itemTypeID = $obj->typeID; //Product Type ID
}

هذا النتائج تحتوي على بيانات بشكل عام لكنها غير مشروطة بشرط هام جدا جدا

قد يكون هناك في تلك النتائج منتج تام (قماش) و ليس فيها مواد خام ضرورية لانتاج هذا القماش و هذا يحسب رصيدا سالبا على العميل من المفترض ان اطالبة به

لذا فمن الضروري جدا ان تتم عملية فحص للنتائج للتأكد من وجود مواد خام لانتاج هذا المنتج

الشرط : ان يكون في النتائج منتج تام  itemTypeID = 4

يقوم النظام بعملية فحص من خلال جدول اسمه mrp_production عن مطابقة حقل fk_product بمعرف المنتج ProductID الذي قيمة itemTypeID هي 4

ثم إحضار رقم أمر التصنيع الخاص به و هو الرقم الموجود في حقل fk_mo و لنفترض انه 1

الان اريد ان احضر اسماء المواد الخام المستخدمة في انتاج هذا المنتج 

 أقوم بالبحث في نفس الجدول مرة اخرى عن جميع بقيمة fk_mo و التي احضرناها للتو و فرضنا انها 1 لكن بشرط ان تكون قيمة حقل origin_type هي 'bomline'

ثم نقوم بفحص ناتج fk_product و الذي سيكون هو نفسه ارقام المواد الخام المستخدمه لانتاج هذا القماش 

و مقارنته مع نتائج الاستعلام الأول

عندي حالتين : عندما تتم المقارنة نجد أن النتائج الوادرة من الاستعلام الأول الاساسي تحتوي بالفعل على ارقام مطابقة للاستعلام الثاني و هنا لن نقوم باي شئ ، فقط سنقوم بجلب البيانات من الاستعلام الأول بشكل طبيعي (يشمل المواد الخام و المنتج التام ان وجد )

الحالة التانية : عندما قارنت وجدت بالاستعلام الاول مواد خام لكنها ليست تابعه لهذا المنتج التام 
يبقى من الاستعلام الأول هاجيب كل البيانات حتى لو مواد خام غير تابعه 
و أيضا بيانات المنتج التام 
ثم اقوم من الاستعلام الثاني باضافة المواد الخام التي تستخدم في انتاج هذا المنتج


أعملها ازااااي فضلا


 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

لا توجد أي إجابات على هذا السؤال بعد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...