أدوات MCP
المنافسات اليدوية والبنود والمشاركة
أدوات MCP لإنشاء منافسات يدوية وإدارة بنودها، وتحديد البنود المشارك فيها، واختيار المنتج المقابل لكل بند.
المنافسة اليدوية منافسة تدخلها بنفسك لطلب لم يظهر على اعتماد ولا نوبكو. تملكها مؤسستك وحدها ولا تراها مؤسسة أخرى، وهي النوع الوحيد من المنافسات الذي تعدله هذه الأدوات أو تحذفه. أما منافسات اعتماد ونوبكو فمشتركة وللقراءة فقط.
المشاركة واختيار المنتج وأسعار الموردين تعمل على أي منافسة تراها، يدوية أو منشورة، وتخص المؤسسة كلها: ما يحدده زميلك تراه أنت. وتأتي معرفات المنافسات والبنود من tenders_get وtenders_search.
| الأداة | ما تفعله |
|---|---|
| tenders_create | إنشاء منافسة يدوية |
| tenders_update | تعديل منافسة يدوية |
| tenders_delete | حذف منافسة يدوية |
| tender_items_create | إضافة بند إلى منافسة يدوية |
| tender_items_update | تعديل بند |
| tender_items_delete | إزالة بند |
| tender_item_participation_list | عرض البنود المشارك فيها |
| tender_item_participation_set_batch | تحديد مشاركة عدة بنود |
| tenders_product_links_list | عرض المنتجات المرتبطة بالمنافسة |
| tender_item_product_selection_set | اختيار منتج لبند |
| tender_item_price_levels_set | تحديد وحدة عدة بنود |
| tender_item_product_selection_clear | إلغاء اختيار منتج لبند |
| tenders_product_links_auto_link | ربط المنتجات بالبنود تلقائيا |
| tenders_catalog_pricing | تسعير المنافسة من الكتالوج |
| tenders_create_products_from_items | إنشاء منتجات من البنود |
| tenders_sourcing_price_add | تسجيل سعر توريد لبند |
| tenders_badail_poa_import | استيراد طلبات Badail POA من نوبكو |
المنافسات اليدوية
ثلاث أدوات تنشئ المنافسة اليدوية وتعدلها وتحذفها، وتحتاج دور المالك أو المدير.
tenders_create
ينشئ منافسة تدخلها بيدك، ومعها بنودها إن أرسلتها. استخدمه لطلب لم يظهر على اعتماد ولا نوبكو، لتعد عليه العطاءات وطلبات التسعير وعروض الأسعار كما على أي منافسة أخرى. والمنافسة خاصة بمؤسستك.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_name | string | نعم | اسم المنافسة، من حرف واحد إلى 500 حرف. |
agency_name | string | نعم | الجهة الحكومية التي طرحت المنافسة، حتى 300 حرف. |
branch_name | string | لا | فرع الجهة أو إدارتها، حتى 200 حرف. |
tender_number | string | لا | رقم المنافسة كما تذكره الجهة، حتى 100 حرف. يجد البحث المنافسة بهذا الرقم. |
reference_number | string | لا | الرقم المرجعي، حتى 100 حرف. يجد البحث المنافسة به أيضا. |
tender_type | string | لا | نوع المنافسة نصا حرا، حتى 100 حرف. |
tender_status | string | لا | حالة المنافسة نصا حرا، حتى 100 حرف. |
source_url | string | لا | رابط إعلان المنافسة الأصلي، حتى 2000 حرف. |
last_enquiries_date | string | لا | آخر موعد للاستفسارات. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. |
last_offer_date | string | لا | آخر موعد لتقديم العروض: وقت إغلاق المنافسة. عليه تعتمد عمود الموعد والأيام المتبقية والتقويم والتنبيهات. وأي موعد واحد يعطى للمنافسة يوضع هنا لا في submission_date. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. |
offers_opening_date | string | لا | موعد فتح العروض. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. |
submission_date | string | لا | تاريخ نشر المنافسة أو الإعلان عنها، وهو ليس آخر موعد للتقديم، فذلك في last_offer_date. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. |
booklet_price | number | لا | سعر الكراسة. بالريال السعودي، صفر أو أكثر. إن لم ترسله أو أرسلت null حفظ صفرا. |
financial_fees | number | لا | الرسوم المالية. بالريال السعودي، صفر أو أكثر. إن لم ترسله أو أرسلت null حفظ صفرا. |
invitation_cost | number | لا | تكلفة الدعوة. بالريال السعودي، صفر أو أكثر. إن لم ترسله أو أرسلت null حفظ صفرا. |
buying_cost | number | لا | رسوم الشراء. بالريال السعودي، صفر أو أكثر. إن لم ترسله أو أرسلت null حفظ صفرا. |
items | object[] | لا | البنود الأولية للمنافسة، حتى 2000 بند. تضاف كلها بنودا جديدة بالترتيب. |
items[].id | integer | لا | لا يستخدم عند الإنشاء: كل بند يضاف جديدا. |
items[].item_name | string | نعم | اسم البند، من حرف واحد إلى 1000 حرف. |
items[].description | string | لا | وصف البند، حتى 4000 حرف. |
items[].quantity | number | لا | الكمية المطلوبة، صفر أو أكثر. |
items[].unit | string | لا | وحدة القياس، حتى 50 حرفا. |
items[].estimated_price | number | لا | السعر التقديري للوحدة بالريال السعودي، صفر أو أكثر. |
items[].material_code | string | لا | كود مادة نوبكو، حتى 100 حرف. به تطابق المنصة البند مع منتجات الكتالوج وسجل الأسعار. |
{
"tender_name": "Supply of disposable syringes",
"agency_name": "Eastern Region Health Cluster",
"tender_number": "ERHC-2026-0457",
"last_offer_date": "2026-11-18T12:00:00",
"items": [
{
"item_name": "Syringe 5 ml with needle, sterile",
"quantity": 20000,
"unit": "Piece",
"material_code": "4111610529900"
},
{
"item_name": "Examination gloves, nitrile, medium",
"quantity": 500,
"unit": "Box"
}
]
}ما يعيده: معرف المنافسة الجديدة id ورابط صفحتها في التطبيق web_url.
- ينشئ المنافسة اليدوية ويعدلها ويحذفها المالك والمدير وحدهما. ويستطيع عضو المبيعات أو المشتريات إضافة بنودها وتعديلها بأدوات البنود أدناه.
- تحفظ المنافسة مع كل بنودها أو لا تحفظ: إن تعذر حفظ البنود لا تنشأ منافسة.
tenders_update
يعدل منافسة يدوية: بياناتها الأساسية، وقائمة بنودها كلها إن أرسلت items. الحقل الذي لا ترسله يبقى كما هو وnull يمسحه، لكن اسم المنافسة واسم الجهة مطلوبان في كل استدعاء. ولا تعدل منافسات اعتماد ونوبكو.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. يجب أن تكون منافسة يدوية لمؤسستك. |
tender_name | string | نعم | اسم المنافسة، من حرف واحد إلى 500 حرف. مطلوب في كل استدعاء: أرسل القيمة الحالية إن لم تغيرها. |
agency_name | string | نعم | الجهة الحكومية التي طرحت المنافسة، حتى 300 حرف. مطلوب في كل استدعاء: أرسل القيمة الحالية إن لم تغيرها. |
branch_name | string | لا | فرع الجهة أو إدارتها، حتى 200 حرف. أرسل null لمسحه. |
tender_number | string | لا | رقم المنافسة كما تذكره الجهة، حتى 100 حرف. يجد البحث المنافسة بهذا الرقم. أرسل null لمسحه. |
reference_number | string | لا | الرقم المرجعي، حتى 100 حرف. يجد البحث المنافسة به أيضا. أرسل null لمسحه. |
tender_type | string | لا | نوع المنافسة نصا حرا، حتى 100 حرف. أرسل null لمسحه. |
tender_status | string | لا | حالة المنافسة نصا حرا، حتى 100 حرف. أرسل null لمسحه. |
source_url | string | لا | رابط إعلان المنافسة الأصلي، حتى 2000 حرف. أرسل null لمسحه. |
last_enquiries_date | string | لا | آخر موعد للاستفسارات. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. أرسل null لمسحه. |
last_offer_date | string | لا | آخر موعد لتقديم العروض: وقت إغلاق المنافسة. عليه تعتمد عمود الموعد والأيام المتبقية والتقويم والتنبيهات. وأي موعد واحد يعطى للمنافسة يوضع هنا لا في submission_date. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. أرسل null لمسحه. |
offers_opening_date | string | لا | موعد فتح العروض. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. أرسل null لمسحه. |
submission_date | string | لا | تاريخ نشر المنافسة أو الإعلان عنها، وهو ليس آخر موعد للتقديم، فذلك في last_offer_date. بصيغة ISO 8601، والقيمة بلا منطقة زمنية تقرأ بتوقيت السعودية. أرسل null لمسحه. |
booklet_price | number | لا | سعر الكراسة. بالريال السعودي، صفر أو أكثر. إن لم ترسله بقي كما هو، وnull يحفظ صفرا. |
financial_fees | number | لا | الرسوم المالية. بالريال السعودي، صفر أو أكثر. إن لم ترسله بقي كما هو، وnull يحفظ صفرا. |
invitation_cost | number | لا | تكلفة الدعوة. بالريال السعودي، صفر أو أكثر. إن لم ترسله بقي كما هو، وnull يحفظ صفرا. |
buying_cost | number | لا | رسوم الشراء. بالريال السعودي، صفر أو أكثر. إن لم ترسله بقي كما هو، وnull يحفظ صفرا. |
items | object[] | لا | قائمة البنود كاملة، حتى 2000 بند. تستبدل القائمة المحفوظة: البند الذي يحمل id يعدل، وبلا id يضاف، وما غاب عنها يزال. لا ترسلها إن لم ترد المساس بالبنود، و[] يزيل كلها. |
items[].id | integer | لا | معرف بند محفوظ في هذه المنافسة ليعدل في مكانه. احذفه لإضافة بند جديد. والمعرف الذي لا يخص هذه المنافسة يعامل كبند جديد. |
items[].item_name | string | نعم | اسم البند، من حرف واحد إلى 1000 حرف. |
items[].description | string | لا | وصف البند، حتى 4000 حرف. أرسل null لمسحه. |
items[].quantity | number | لا | الكمية المطلوبة، صفر أو أكثر. أرسل null لمسحه. |
items[].unit | string | لا | وحدة القياس، حتى 50 حرفا. أرسل null لمسحه. |
items[].estimated_price | number | لا | السعر التقديري للوحدة بالريال السعودي، صفر أو أكثر. أرسل null لمسحه. |
items[].material_code | string | لا | كود مادة نوبكو، حتى 100 حرف. به تطابق المنصة البند مع منتجات الكتالوج وسجل الأسعار. أرسل null لمسحه. |
{
"id": 4412,
"tender_name": "Supply of disposable syringes",
"agency_name": "Eastern Region Health Cluster",
"last_offer_date": "2026-11-25T12:00:00"
}ما يعيده: معرف المنافسة id ورابط صفحتها web_url.
itemsيستبدل القائمة: البند الذي يحملidبند محفوظ يعدل في مكانه، والبند بلاidيضاف، وكل بند محفوظ غاب عن القائمة يزال، و[]يزيلها كلها. والبند المزال يخفى ولا يمحى: تبقى أسعاره وأسطر طلبات التسعير وعلامات المشاركة المرتبطة به، ويعود بإرسالidمن جديد أو بـtender_items_update معrestore.- يرد بـ404 إن لم توجد المنافسة أو كانت لمؤسسة أخرى، وبـ403 إن كانت منشورة وليست يدوية.
tenders_delete
يحذف منافسة يدوية نهائيا مع بنودها وعطاءاتها وملاحظاتها وطلبات التسعير وعروض الأسعار واختيارات المنتجات المرتبطة بها. لا رجوع عنه، ولا تحذف منافسات اعتماد ونوبكو. ولإزالة بعض البنود فقط استخدم tender_items_delete.
يحذف بيانات أو يستبدلها · الصلاحية tenders.write · الأدوار: المالك، المدير · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. يجب أن تكون منافسة يدوية لمؤسستك. |
ما يعيده: تأكيد الحذف success: true.
- أوامر البيع وأوامر الشراء والتسليمات والفواتير التي أشارت إلى المنافسة تبقى، ويزول رابطها بها فقط.
- يرد بـ404 لمنافسة غير موجودة أو لمؤسسة أخرى، وبـ403 لمنافسة منشورة.
بنود المنافسة اليدوية
إضافة بنود المنافسة اليدوية وتعديلها وإزالتها واحدا واحدا. والإزالة تخفي البند فقط، فتبقى الأسعار والعلامات المرتبطة به.
tender_items_create
يضيف بندا واحدا إلى منافسة يدوية. يحدد النظام رقم البند: أعلى رقم استخدم في المنافسة زائد واحد، فلا يتكرر رقم بند أزيل. ولإرسال القائمة كلها دفعة واحدة استخدم tenders_update.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_id | integer | نعم | معرف المنافسة. يجب أن تكون منافسة يدوية لمؤسستك. |
item_name | string | نعم | اسم البند، من حرف واحد إلى 1000 حرف. |
description | string | لا | وصف البند، حتى 4000 حرف. |
quantity | number | لا | الكمية المطلوبة، صفر أو أكثر. |
unit | string | لا | وحدة القياس، حتى 50 حرفا. |
estimated_price | number | لا | السعر التقديري للوحدة بالريال السعودي، صفر أو أكثر. |
material_code | string | لا | كود مادة نوبكو، حتى 100 حرف. به تطابق المنصة البند مع منتجات الكتالوج وسجل الأسعار. |
{
"tender_id": 4412,
"item_name": "IV cannula 20G, sterile",
"quantity": 3000,
"unit": "Piece",
"material_code": "4111610530118"
}ما يعيده: البند المحفوظ في الحقل item، وفيه id وitem_number.
- يرد بـ404 إن لم توجد المنافسة أو كانت لمؤسسة أخرى، وبـ403 إن كانت منشورة وليست يدوية.
tender_items_update
يعدل بندا واحدا من منافسة يدوية. لا يتغير إلا ما ترسله، وnull يمسح حقلا اختياريا. وأرسل restore: true لإعادة بند أزيل.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف البند، ويأتي من tenders_get. |
item_name | string | لا | الاسم الجديد، من حرف واحد إلى 1000 حرف. لا يمكن مسحه. |
description | string | لا | وصف البند، حتى 4000 حرف. أرسل null لمسحه. |
quantity | number | لا | الكمية المطلوبة، صفر أو أكثر. أرسل null لمسحه. |
unit | string | لا | وحدة القياس، حتى 50 حرفا. أرسل null لمسحه. |
estimated_price | number | لا | السعر التقديري للوحدة بالريال السعودي، صفر أو أكثر. أرسل null لمسحه. |
material_code | string | لا | كود مادة نوبكو، حتى 100 حرف. به تطابق المنصة البند مع منتجات الكتالوج وسجل الأسعار. أرسل null لمسحه. |
restore | boolean | لا | true يعيد البند الذي أزيل إلى قائمة المنافسة. |
{
"id": 902114,
"quantity": 3500,
"estimated_price": 1.8
}ما يعيده: البند بعد التعديل في الحقل item.
- يرفض الطلب بـ400 إن لم يحمل أي حقل للتعديل.
- يرد بـ404 إن لم يوجد البند أو كانت منافسته لمؤسسة أخرى، وبـ403 إن كانت منافسته منشورة وليست يدوية.
tender_items_delete
يزيل بندا من قائمة منافسة يدوية بإخفائه، ولا يمحوه. وتبقى أسعار البند وأسطر طلبات التسعير وعلامات المشاركة المرتبطة به. وللتراجع استخدم tender_items_update مع restore: true.
يحذف بيانات أو يستبدلها · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف البند. |
ما يعيده: تأكيد الإزالة success: true.
- يرد بـ404 إن لم يوجد البند أو كانت منافسته لمؤسسة أخرى، وبـ403 إن كانت منافسته منشورة وليست يدوية.
المشاركة في البنود
المشاركة تحدد البنود التي تقدم عليها مؤسستك. هي مشتركة بين أعضاء المؤسسة، وعليها تعتمد ملفات العطاء. وتعمل هذه الأدوات على أي منافسة تراها.
tender_item_participation_list
يعرض البنود التي علمتها مؤسستك كمشاركة، الأحدث أولا، من منافسة واحدة أو من كل المنافسات. العلامات هي علامات المؤسسة كلها، أيا كان من وضعها.
للقراءة فقط · الصلاحية tenders.read · كل الأدوار · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_id | integer | لا | يقصر النتائج على بنود هذه المنافسة. إن غاب جاءت علامات كل المنافسات. |
ما يعيده: قائمة العلامات، لكل علامة id وtender_id وtender_item_id وcreated_at.
- القائمة بلا ترقيم صفحات. مرر
tender_idلتقصرها على منافسة واحدة.
tender_item_participation_set_batch
يحدد المشاركة أو يلغيها لما يصل إلى 500 بند من منافسة واحدة في استدعاء واحد. استخدمه لتحديد منافسة كاملة أو استبعاد مجموعة بنود دفعة واحدة.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_id | integer | نعم | معرف المنافسة. |
item_ids | integer[] | نعم | معرفات البنود، من 1 إلى 500. التكرار يحتسب مرة واحدة. |
participating | boolean | نعم | true يحدد البنود كمشاركة، وfalse يزيل العلامة عنها. |
{
"tender_id": 48213,
"item_ids": [
902114,
902115,
902118
],
"participating": true
}ما يعيده: updated بمعرفات البنود التي طبق عليها الحكم، وfailed بالمعرفات التي ليست بنودا قائمة في المنافسة.
- البنود الصحيحة تحفظ ولو فشل بعضها، فافحص
failedبعد كل استدعاء. - يرد بـ404 إن لم تكن المنافسة ظاهرة لك. ويرد بـ403 عند التحديد إن كان من أنشأ المفتاح قد حذف.
المنتجات المقابلة للبنود
المنتج مرشح لكود مادة نوبكو حين يكون مرتبطا بذلك الكود في كتالوجك. والاختيار هو المنتج الوحيد الذي ستورده مؤسستك لبند بعينه.
tenders_product_links_list
يعرض لمنافسة واحدة المنتجات المرشحة في كتالوجك لكل كود مادة نوبكو في بنودها، والمنتج الذي اختارته مؤسستك لكل بند. شغله قبل الربط التلقائي أو إنشاء المنتجات لتعرف ما ربط سلفا.
للقراءة فقط · الصلاحية tenders.read · كل الأدوار · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. |
ما يعيده: links: مدخل لكل كود مادة له مرشحون (nupco_code وproducts، ولكل منتج id وproduct_name وdescription وnupco_product_code وmanufacturers وis_default وpacking)، وselections: مدخل لكل بند له اختيار (tender_item_id وproduct_id وproduct_name وcatalogue_number وarchived وpacking ومستوى البند المحفوظ وlevel وconversion). ويحمل كل منتج مرشح وكل اختيار تكلفة المنتج في الكتالوج (cost_price بعملة cost_currency، وتكون null إن لم تسجل) إذا كان دورك يسمح برؤية التكلفة، ويحمل الاختيار عندها cost_sar_per_tender_unit أيضا. ويحملان سعر البيع (sale_price_sar) إذا كان دورك يسمح برؤية أسعار العطاء، ويحمل الاختيار عندها sale_price_per_tender_unit أيضا.
- الكود الذي لا مرشح له لا يظهر في
links. والقيمةarchived: trueتعني أن المنتج المختار نقل إلى المهملات بعد اختياره. packingمستويات المنتج: الوحدة (unit_of_measure)، والعبوة (package_typeوفيهاpackage_sizeوحدة)، والكرتون (case_typeوفيهunits_per_caseوحدة)، وما تحويه الوحدة (content_quantityمنcontent_unit)، ومعهاprice_basis، وهو المستوى الذي يذكر به سعرا التكلفة والبيع. والقيمةnullتعني أنه غير محدد، فيستخدم السعر كما هو.levelيقول ما تساويه وحدة واحدة من البند من المنتج المختار: المستوىlevel(unitأوpackأوcaseأوcontent) مضروبا فيcount، وبقياسmeasureللمحتوى. والحالةstatusإماset(اختاره شخص بـtender_item_price_levels_set أو tender_item_product_selection_set)، أوmatched(قرئ من وحدة البند واسمه ووصفه)، أوcheck(غير مؤكد، فيسعر بوحدة واحدة من المنتج حتى يراجع، ومعهsuggestion). وstated_countعدد العبوة الذي يذكره وصف البند إن وجد.- المستوى المحفوظ للبند في
price_levelوprice_level_countوprice_level_measureوprice_level_product_id، والقيمةnullتعني تلقائيا، ولا يطبق إلا ما دامprice_level_product_idهو المنتج المختار. وsale_price_per_tender_unitسعر بيع المنتج لوحدة واحدة من البند بأربع خانات عشرية، وهو ما يسعر به tenders_catalog_pricing، وcost_sar_per_tender_unitتكلفة المنتج بالريال لوحدة واحدة من البند. وconversionيكونnullحين يمكن تحويل سعر المنتج إلى وحدة البند، وإلا كانno_conversionومعهmissing(package_sizeأوunits_per_caseأوcontent_quantityأوmeasure_family)، فأكمل العدد بـproducts_update أو حدد مستوى البند. - المرشحون يأتون من روابط المنتجات بأكواد نوبكو، وتضيفها وتزيلها product_nupco_link وproduct_nupco_unlink.
tender_item_product_selection_set
يختار المنتج الوحيد من كتالوجك الذي ستورده مؤسستك لبند من بنود المنافسة، ويحل محل أي اختيار سابق. ويربط المنتج أيضا بكود مادة نوبكو للبند، فيظهر مرشحا حيثما تكرر الكود.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_id | integer | نعم | معرف المنافسة. |
tender_item_id | integer | نعم | معرف البند، ويجب أن يكون بندا قائما في المنافسة المذكورة. |
product_id | integer | نعم | معرف منتج في كتالوج مؤسستك لم ينقل إلى المهملات، ويأتي من products_list. |
price_level | string | لا | ما تساويه وحدة واحدة من البند من هذا المنتج: unit (وحدة واحدة من المنتج)، أو pack (عبوة من package_size وحدة)، أو case (كرتون من units_per_case وحدة)، أو content (واحد من content_unit مما تحويه الوحدة)، مضروبا في price_level_count. إن لم ترسله بقي كما هو ما دام المنتج نفسه، وعاد تلقائيا إذا تغير المنتج. وnull يعيده تلقائيا. |
price_level_count | number | لا | كم من price_level تساوي وحدة واحدة من البند، من 0.0001 إلى 1000000 بأربع منازل عشرية على الأكثر. الافتراضي 1، ولا يرسل إلا مع price_level. |
price_level_measure | string | لا | مع content فقط: القياس الذي تعد به وحدة البند حين يختلف عن content_unit للمنتج وهو من نوعه، مثل l لمنتج تحوي وحدته 500 ml. إن لم ترسله عدت بـcontent_unit للمنتج. |
{
"tender_id": 48213,
"tender_item_id": 902114,
"product_id": 3071,
"price_level": "pack"
}ما يعيده: الاختيار المحفوظ: id وtender_id وtender_item_id وproduct_id وnupco_code والمستوى المحفوظ (price_level وprice_level_count وprice_level_measure وprice_level_product_id)، وlevel بما تساويه وحدة البند كما يقرؤها الخادم (كما في tenders_product_links_list).
- يرد بـ400 مع
product_not_foundإن لم يكن المنتج منتجا قائما في كتالوج مؤسستك، وبـ400 معitem_not_foundإن لم يكن البند قائما في المنافسة، وبـ404 إن لم تكن المنافسة ظاهرة لك. - يرد بـ400 مع
level_missingإن لم يكن للمنتج العدد الذي يحتاجه المستوى، ومعهfieldباسم الحقل الذي يملأ بـproducts_update. والمستوى لا يغير سعرا محفوظا، بل ما يحول إليه سعر المنتج وتكلفته عند التسعير من الكتالوج أو بالهامش. ولعدة بنود معا استخدم tender_item_price_levels_set.
tender_item_price_levels_set
يحدد لما يصل إلى 500 بند من منافسة واحدة ما تساويه وحدة واحدة من كل بند من المنتج المختار له، أو يعيده تلقائيا. لا يغير المنتج ولا السعر المحفوظ، بل ما يحول إليه سعر المنتج وتكلفته عند التسعير من الكتالوج أو بالهامش.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_id | integer | نعم | معرف المنافسة. |
items | object[] | نعم | البنود، من 1 إلى 500، وكل بند مرة واحدة. |
items[].tender_item_id | integer | نعم | معرف البند. |
items[].price_level | string | نعم | ما تساويه وحدة واحدة من البند من منتجه المختار: unit أو pack أو case أو content، مضروبا في price_level_count. وnull يعيده تلقائيا. |
items[].price_level_count | number | لا | كم من price_level تساوي وحدة واحدة من البند، من 0.0001 إلى 1000000 بأربع منازل عشرية على الأكثر. الافتراضي 1. |
items[].price_level_measure | string | لا | مع content فقط: القياس الذي تعد به وحدة البند حين يختلف عن content_unit للمنتج وهو من نوعه. |
{
"tender_id": 48213,
"items": [
{
"tender_item_id": 902114,
"price_level": "pack"
},
{
"tender_item_id": 902115,
"price_level": "unit",
"price_level_count": 2
},
{
"tender_item_id": 902118,
"price_level": null
}
]
}ما يعيده: updated: البنود التي حفظ مستواها، لكل منها tender_item_id وproduct_id وprice_level وprice_level_count وprice_level_measure وprice_level_product_id. وfailed: البنود التي لم تحفظ، لكل منها tender_item_id وreason وerror. ومعهما updated_count وfailed_count.
- أسباب الفشل:
item_not_foundلبند ليس قائما في المنافسة، وno_selectionلبند بلا منتج مختار (اختره بـtender_item_product_selection_set، فهو يأخذ المستوى أيضا)، وproduct_not_foundلبند منتجه المختار لم يعد في الكتالوج (اختر منتجا قائما)، وlevel_missingلمستوى ليس للمنتج عدده، ومعهfieldباسم الحقل الذي يملأ بـproducts_update، وselection_changedلبند تغير منتجه أثناء الاستدعاء. - البنود الصحيحة تحفظ ولو فشل بعضها، وتكرار
tender_item_idيرفض الطلب كله. وبعد تحديد الوحدات شغل tenders_catalog_pricing معreplace_existing: trueلإعادة التسعير. - يرد بـ404 إن لم تكن المنافسة ظاهرة لك.
tender_item_product_selection_clear
يزيل المنتج الذي اختارته مؤسستك لبند. ويبقى رابط المنتج بكود نوبكو للبند، فيظل مرشحا لذلك الكود.
يحذف بيانات أو يستبدلها · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
tender_item_id | integer | نعم | معرف البند. |
ما يعيده: تأكيد الإزالة success: true.
- ينجح الاستدعاء ولو لم يكن للبند اختيار.
tenders_product_links_auto_link
يختار منتجا لكل بند يكون اختياره واضحا: كود نوبكو للبند له مرشح واحد بالضبط في كتالوجك. لا يستبدل اختيارا قائما، ويترك الأكواد ذات المرشحين المتعددين، ويمكن تشغيله مرة أخرى بأمان.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. |
ما يعيده: linked بعدد الاختيارات التي تمت، وselections وفي كل منها tender_item_id وproduct_id وnupco_code.
- يتخطى البنود المزالة والبنود بلا كود مادة والبنود التي لها اختيار. وللبنود ذات المرشحين المتعددين اختر بنفسك بـtender_item_product_selection_set.
tenders_catalog_pricing
يسعر كل بند يجد له كتالوجك منتجا بسعر بيع المنتج (sale_price_sar) محولا إلى وحدة البند، ويعلم البند مشاركا. وهو زر «التسعير من الكتالوج» في صفحة المنافسة.
يغير البيانات · الصلاحية bids.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. |
dry_run | boolean | لا | true يعرض ما سيسعر دون أن يكتب شيئا. الافتراضي false. |
replace_existing | boolean | لا | true يعيد تسعير البنود التي لها سعر أيضا، والصفر منها. الافتراضي false، فيبقى كل سعر مدخل كما هو. |
{
"id": 48213,
"dry_run": true
}ما يعيده: priced: البنود المسعرة (أو التي ستسعر في التجربة)، لكل منها tender_item_id وproduct_id وunit_price (لوحدة واحدة من البند) وsource (selected أو only أو default أو lowest) وcatalog_price (سعر البيع كما في الكتالوج) وbasis وprice_level وlevel_count وlevel_measure وlevel_status وlevel_reason وsuggestion وfactor. وunit_check بالبنود المسعرة التي وحدتها غير مؤكدة، وalready_priced بعدد البنود التي أبقي سعرها، وskipped بعدد البنود المتروكة لكل سبب (ambiguous وno_sale_price وno_product وno_conversion وrounds_to_zero)، وskipped_items بها، وmessages بما يفعل في كل حالة، وlowest_price_allowed.
- المنتج لكل بند: المنتج المختار للبند، وإلا المنتج الوحيد المرتبط بكود نوبكو للبند، وإلا المنتج الافتراضي للكود (يحدد بـproduct_nupco_link مع
is_default: true)، وإلا أقل سعر بيع بين منتجات الكود، ما لم يوقف المالك ذلك في إعدادات المؤسسة (يعمل افتراضيا). وما عدا ذلك يترك بسببambiguous. - المنتج الذي لا سعر بيع له يترك بسبب
no_sale_priceولا يستبدل بمنتج آخر. والمنتج الذي يختاره الاستدعاء يصبح المنتج المختار للبند. - سعر البيع في الكتالوج يذكر لمستوى
price_basisللمنتج، فيحول إلى ما تساويه وحدة واحدة من البند ويقرب إلى أربع منازل عشرية: المستوى الذي حدد للبند، وإلا ما يقرأ من وحدة البند واسمه ووصفه. والمنتج الذي لاprice_basisله يستخدم سعره كما هو. وأقل سعر يقارن بعد التحويل، بين المنتجات التي وحدتها للبند مؤكدة أولا. - البند الذي وحدته غير مؤكدة يسعر بوحدة واحدة من المنتج ويذكر في
unit_checkمع اقتراح، فراجعه وحدد وحدته بـtender_item_price_levels_set ثم أعد التسعير معreplace_existing: true. والبند الذي يتعذر تحويل سعره لنقص عدد في بيانات التعبئة (no_conversion، ومعهmissing) أو يصبح سعره 0.0000 بعد التقريب (rounds_to_zero) يترك. - شغله أولا بـ
dry_run: trueواعرض النتيجة على الشخص، ثم شغله فعليا حين يوافق.
tenders_create_products_from_items
ينشئ في الكتالوج منتجا لكل بند تحدده، آخذا اسم المنتج ووصفه وكود نوبكو من البند نفسه، ويختاره منتجا لذلك البند. وهكذا يحصل البند الذي لا كود له على منتج مرتبط. وكل استدعاء ينشئ منتجات جديدة.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. |
item_ids | integer[] | نعم | معرفات البنود، من 1 إلى 500. يصبح كل بند منتجا واحدا. لا يقبل نصا للمنتج، فبياناته من البند وحده. |
{
"id": 48213,
"item_ids": [
902114,
902115
]
}ما يعيده: created: المنتجات المنشأة، لكل منها tender_item_id وproduct_id وproduct_name وdescription وnupco_code، وcreated_count بعددها.
- لا يصلح للتكرار: تشغيله مرتين ينشئ منتجات مكررة. افحص tenders_product_links_list قبله.
- يستبدل المنتج المختار سلفا لهذه البنود. ويبقى المنتج السابق في الكتالوج مرشحا للكود.
- يفحص الطلب كله قبل أن ينشئ شيئا. يرد بـ400 مع
items_not_foundإن لم يكن أحد المعرفات بندا قائما في المنافسة، وبـ400 معitem_unnamedلبند بلا اسم، وبـ402 معplan_limit_reached(ومعهlimitوcurrent) إن كان عدد المنتجات سيتجاوز حد خطتك. - إن عاد
selections_failed: trueفالمنتجات أنشئت لكن اختيارها للبنود تعذر. لا تعد التشغيل، واختر المنتجات بـtender_item_product_selection_set.
أسعار الموردين
تسجيل ما عرضه مورد لبند دون إرسال طلب تسعير. وللطلبات الكاملة راجع طلبات التسعير وعروض الموردين.
tenders_sourcing_price_add
يسجل السعر الذي عرضه مورد لبند من بنود المنافسة، تدخله بيدك دون إرسال طلب تسعير. سم المورد بـmanufacturer_id من دليلك أو بـsupplier_name. كل استدعاء يضيف عرضا جديدا، ويدخل العرض في سجل التوريد للبنود التي تحمل المنتج أو كود نوبكو نفسه في منافسات أخرى.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنافسة. |
tender_item_id | integer | نعم | معرف البند، ويجب أن يكون بندا قائما في هذه المنافسة. |
unit_price | number | نعم | سعر الوحدة كما عرضه المورد وبعملته، صفر أو أكثر. لا تحوله بنفسك. |
currency | string | لا | رمز العملة بثلاثة أحرف (ISO 4217) مثل SAR وEUR وCNY. الافتراضي USD. وقائمة العملات المدعومة في fx_rates_get. |
fx_rate | number | لا | عدد وحدات العملة في الدولار الواحد. إن غاب استخدمت المنصة سعرا افتراضيا: USD وSAR ثابتان (1 و3.75) وعملات الخليج المربوطة بالدولار بسعر ربطها وغيرها بآخر سعر للبنك المركزي الأوروبي. وعملة بلا سعر معروف (مثل KWD وEGP) تطلب هذا الحقل. |
manufacturer_id | integer | لا | معرف الشركة المصنعة في دليلك التي جاء منها العرض، ويأتي من manufacturers_list. أرسل null لتركه فارغا. |
supplier_name | string | لا | اسم المورد نصا حرا، حتى 200 حرف. مطلوب إن لم ترسل manufacturer_id. احذف الحقل ولا ترسل null. |
supplier_company | string | لا | شركة المورد، حتى 200 حرف. |
supplier_email | string | لا | البريد الإلكتروني للمورد. يجب أن يكون عنوانا صحيحا، وحده 320 حرفا. |
supplier_phone | string | لا | هاتف المورد، حتى 50 حرفا. |
incoterms | string | لا | شرط التسليم الدولي مثل CIF أو EXW، حتى 100 حرف. |
lead_time_days | integer | لا | مدة التوريد بالأيام، من 0 إلى 3650. أرسل null لتركها فارغة. |
catalog_no | string | لا | رقم الكتالوج عند المورد، حتى 100 حرف. أرسل null لتركه فارغا. |
weight_kg | number | لا | وزن الوحدة بالكيلوغرام، صفر أو أكثر. أرسل null لتركه فارغا. |
units_per_case | integer | لا | عدد الوحدات في الكرتونة، عدد صحيح موجب. أرسل null لتركه فارغا. |
product_id | integer | لا | معرف منتج الكتالوج الذي يخصه العرض، ويأتي من products_list. أرسل null لتركه فارغا. |
notes | string | لا | ملاحظات على العرض، حتى 2000 حرف. أرسل null لتركها فارغة. |
{
"id": 48213,
"tender_item_id": 902114,
"unit_price": 0.34,
"currency": "EUR",
"supplier_name": "Medline Europe GmbH",
"incoterms": "CIF",
"lead_time_days": 60,
"units_per_case": 1000
}ما يعيده: العرض المسجل: rfq_id (سجل التوريد الخاص بالمنافسة الذي يحفظ العرض) وresponse_id وsupplier_name وcurrency وfx_rate.
- يحفظ السعر كما عرضه المورد وبعملته، مع سعر الصرف الذي استخدم وقت التسجيل. وتقارن التحليلات بالدولار وتعرض السعر الأصلي بجانبه.
- الحقل
manufacturer_idأوsupplier_nameمطلوب، وأحدهما كاف. وحقول المورد النصية الاختيارية تحذف عند عدم الحاجة ولا ترسلnull. - يرد بـ400 مع
invalid_itemsإن لم يكن البند قائما في هذه المنافسة، وبـ400 معmanufacturer_not_foundإن لم تكن الشركة في دليلك. وعملة غير مدعومة أو بلا سعر صرف تردان بـ400 برسالة تسمي ما يلزم إرساله. - يرد بـ403 إن كان من أنشأ المفتاح قد حذف.
استيراد طلبات Badail POA
الأداة الوحيدة في هذه الصفحة التي تكتب خارج مؤسستك: تنشئ منافسات نوبكو مشتركة تراها كل المؤسسات.
tenders_badail_poa_import
يقرأ ملف طلبات الدفع على الحساب (Pay On Account) من برنامج Badail في بوابة نوبكو، وينشئ منافسة نوبكو لكل طلب مع منتجاته بنودا. تنضم المنافسات إلى قائمة نوبكو المشتركة التي تراها كل المؤسسات. ولذلك تقتصر الأداة على مديري المنصة ومن منحوا صلاحية جمع منافسات اعتماد. يقرأ الخادم الملف كله، فأرسل الملف نفسه لا صفوفا نقلتها منه.
يغير البيانات · الصلاحية tenders.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
content_base64 | string | لا | ملف .xlsx واحد منزل من قائمة طلبات POA في بوابة نوبكو، بترميز base64. حجمه بعد فك الترميز حتى 5 ميغابايت، ويرفض الخادم أي طلب يتجاوز نحو 4.5 ميغابايت. أرسل الملف الحقيقي دائما. أرسل هذا الحقل أو files، ولا تجمع بينهما. |
filename | string | لا | اسم ملف content_base64 الأصلي، حتى 300 حرف. يظهر في الرد بجانب الصفوف، ولا يؤثر في الاستيراد. |
files | object[] | لا | عدة ملفات تستورد معا بدل content_base64، من 1 إلى 20، وتقرأ بالترتيب المرسل. مجموع أحجامها بعد فك الترميز حتى 5 ميغابايت. |
files[].content_base64 | string | نعم | ملف .xlsx بترميز base64. أرسل الملف الحقيقي دائما. |
files[].filename | string | لا | اسم الملف الأصلي، حتى 300 حرف. يسمى الملف في الرد به، وإن غاب سمي file 1 وfile 2 وهكذا. |
statuses | string[] | لا | حالات البوابة المراد استيرادها مثل PAY_ON_ACCOUNT_BY_BADAIL، حتى 50 حالة، ولا يفرق بين الأحرف الكبيرة والصغيرة. إن غاب استوردت كل الصفوف. |
dry_run | boolean | لا | true يعرض ما سينشأ أو يحدث ولا يكتب شيئا. الافتراضي false. |
{
"content_base64": "UEsDBBQABgAIAAAAIQ...",
"filename": "poaRequest_12.xlsx",
"statuses": [
"PAY_ON_ACCOUNT_BY_BADAIL"
],
"dry_run": true
}ما يعيده: العدادات created وupdated وfailed وdry_run، وقائمة requests لكل طلب فيها poa_request وtender_id وoutcome (إحدى created وupdated وwould_create وwould_update وfailed) وitems وdeadline وstatus وfile وweb_url، وقائمتا skipped وwarnings برقم الصف واسم الملف file ورسالة، وfiltered_out وstatus_counts بعدد الطلبات لكل حالة، وfiles بكل ملف وعدد الطلبات المأخوذة منه.
- كود مادة كل بند هو النصف الأول من الكود العام في البوابة (
4111610529900_4111610529905يصبح4111610529900). وتاريخ الطلب يقرأ بصيغة يوم-شهر-سنة. وآخر موعد للتقديمlast_offer_dateهو نهاية اليوم الخامس من أيام العمل السعودية (الأحد إلى الخميس) بعد يوم الطلب، ولا تحتسب العطل الرسمية. - إعادة استيراد ملف أحدث تحدث الطلبات الموجودة في بياناتها الأساسية فقط (الحالة والعميل وأمر الشراء والاسم)، ولا تمس بنودها ولا مواعيدها، فتبقى الأسعار وعروض الأسعار المبنية عليها سليمة.
- الصفوف التي ينقصها رقم الطلب أو اسم العميل أو تاريخ صحيح أو الكود العام، وأرقام الطلبات المكررة، تدرج في
skippedولا يستورد منها شيء. والصفوف التي لا تتطابق قوائمها المجمعة تستورد مع ملاحظة فيwarnings. - مع عدة ملفات يؤخذ الطلب المتكرر من أول ملف ورد فيه، ويدرج تكراره في الملفات التالية في
skippedباسم الملف الأول. والملف الذي لا يقرأ يرفض الاستيراد كله برد 422 يذكر اسمه، قبل كتابة أي شيء. - فوق الصلاحية، يجب أن يكون من أنشأ المفتاح أو الاتصال مدير منصة أو ممن منحوا صلاحية جمع منافسات اعتماد. دور المؤسسة لا يمنحها، وبدونها يرد الاستدعاء بـ403. والملف الذي ليس تصديرا صحيحا لطلبات POA يرد بـ422.