أدوات MCP
الصور والمرفقات واستيراد الجداول
أدوات MCP لصور المنتجات ومرفقاتها ومرفقات المصنعين وشعار المؤسسة وختمها وتوقيعك، واستيراد السجلات من جدول بيانات.
تجمع هذه الصفحة أدوات الملفات: صور المنتجات ومرفقاتها، ومرفقات الشركات المصنعة، وشعار المؤسسة وختمها وتوقيعك الشخصي. وفيها أيضا sheet_import، الأداة التي تحول جدول بيانات إلى سجلات.
لا يمر الملف عبر استدعاء الأداة. كل رفع خطوتان: أداة البدء، مثل product_photo_upload_url_create، تتحقق من السجل ومن الملف المعلن وتعيد رابط رفع مؤقتا upload_url، فترسل إليه محتوى الملف مباشرة بطلب PUT، من المتصفح أو من أي برنامج. ثم تتحقق أداة الإنهاء المقابلة، مثل product_photo_upload_finalize، من حجم الملف ونوعه الفعلي، وتعالج الصورة عند الحاجة، وتحفظ الملف على سجله. لذلك لا يحد حجم الطلب الملف، ولا يمر محتواه في سياق الوكيل.
const blob = await (await fetch(SOURCE_URL)).blob();
await fetch(upload_url, { method: "PUT", headers: { "Content-Type": blob.type }, body: blob });والملف الذي تحتفظ به المنصة أصلا، كملف أرسل إلى المساعد على واتساب، لا يرفع: أرسل مرجعه في الحقل staged_ref إلى أداة البدء، فينسخ إلى مكانه داخل الخادم، ثم استدع أداة الإنهاء مباشرة. وبهذا يحفظ كتالوج كامل حتى 100 ميغابايت.
| الملفات | الصيغ المقبولة | أكبر حجم |
|---|---|---|
| صور المنتجات | JPEG، PNG، WebP، GIF، وتحول AVIF وTIFF إلى JPEG أو PNG | 5 ميغابايت |
| مرفقات المنتجات والشركات المصنعة | PDF، الصور (JPEG، PNG، WebP، GIF)، مستندات Word، جداول Excel، عروض PowerPoint، النص العادي، CSV | 15 ميغابايت للملف المرفوع، وحتى 100 ميغابايت بـstaged_ref |
| الشعار والختم والتوقيع | PNG، JPEG، WebP، SVG، وتحول GIF وAVIF وTIFF إلى JPEG أو PNG | 2 ميغابايت |
sfda_cert وcatalog على المنتج هو ما يسحبه مستند المنتج في عروض الأسعار وملف مرفقات نوبكو، وخطاب التفويض في مرفقات الشركة المصنعة يرافق منتجاتها في حزم التقديم. فارفع الملف مرة واحدة بدل إرفاقه في كل عرض.صور المنتجات
تظهر صور المنتج في قائمة المنتجات وفي عروض الأسعار المطبوعة للبنود المربوطة به. وللتفاصيل في التطبيق راجع الصور والملفات.
product_photo_list
يعرض صور منتج، لكل صورة path ورابط مؤقت لمشاهدتها. استخدمه لتعرف path الذي تحتاجه product_photo_delete، فأداة `products_get` تعيد الروابط وحدها.
للقراءة فقط · الصلاحية products.read · كل الأدوار · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنتج، ويأتي من products_list. |
ما يعيده: قائمة أزواج {path, url}، زوج لكل صورة، والرابط url صالح لنحو ساعة. والمنتج بلا صور يعيد قائمة فارغة.
- المنتج الذي لا تملكه مؤسستك أو الموجود في سلة المهملات يرد بـ404.
product_photo_upload_url_create
يبدأ إضافة صورة إلى منتج في الكتالوج: يتحقق من المنتج ومن الملف المعلن، ثم يعيد رابط رفع مؤقتا ترسل إليه الصورة مباشرة بطلب PUT. وبعد الرفع استدع product_photo_upload_finalize. وكل صورة تضاف دون أن تستبدل غيرها.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنتج، ويأتي من products_list. |
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف: image/jpeg أو image/png أو image/webp أو image/gif، ويقبل image/avif وimage/tiff فيحولان عند الإنهاء. يلزم إلا مع staged_ref. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"id": 1187,
"filename": "syringe-10ml-front.jpg",
"content_type": "image/jpeg",
"size_bytes": 482113
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد الأقصى 5 ميغابايت. والمنتج الذي لا تملكه مؤسستك أو الموجود في سلة المهملات يرد بـ404.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
product_photo_upload_finalize
ينهي رفعا بدأته product_photo_upload_url_create: يتحقق من حجم الصورة ونوعها الفعلي، ويحول صيغتها أو يقص حوافها أو يصغرها عند الحاجة، ثم يضيفها إلى المنتج.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
trim_whitespace | boolean | لا | يقص الحواف البيضاء أو الشفافة حول الصورة ويترك هامشا بنحو 2% من حجم المحتوى. ولا يغير صورة SVG. |
max_width | integer | لا | يصغر الصورة إلى هذا العرض بالبكسل على الأكثر مع الحفاظ على نسبتها، ولا يكبرها أبدا. من 16 إلى 10000. |
{
"upload_id": "5b0f3c1e-8a4d-4f6b-9e2a-7c1d3e5f9a02",
"trim_whitespace": true,
"max_width": 1600
}ما يعيده: path وurl للصورة الجديدة، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes وwidth وheight، وconverted_from حين حولت الصيغة، وtrimmed وresized. احتفظ بـpath لتحذف الصورة أو تنسخها لاحقا.
- الصورة بصيغة خارج المسموح، مثل AVIF أو TIFF، تحول إلى JPEG بجودة 85، أو إلى PNG إن كانت فيها شفافية. والصورة التي لا تحتاج تحويلا ولا قصا ولا تصغيرا تحفظ كما رفعت. ولا تقبل صور HEIC، فصدرها بصيغة JPEG أو PNG.
- يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
product_photo_delete
يحذف صورة واحدة من منتج حذفا نهائيا. ولا يمكن التراجع عنه.
يحذف بيانات أو يستبدلها · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنتج. |
path | string | نعم | مسار الصورة path، ويأتي من product_photo_list أو من رد product_photo_upload_finalize. |
ما يعيده: تأكيد الحذف (success: true).
- المسار الذي ليس من صور هذا المنتج يرد بـ400، والمنتج الذي لا تملكه مؤسستك يرد بـ404.
مرفقات المنتجات
تحفظ مستندات المنتج في ثلاث فئات: sfda_cert وcatalog وother. وقائمة المرفقات مع مساراتها تعيدها `products_get` في المصفوفة attachments.
product_attachment_upload_url_create
يبدأ حفظ مستند على منتج في الكتالوج: شهادة هيئة الغذاء والدواء (SFDA) أو الكتالوج أو ملفا آخر. يعيد رابط رفع مؤقتا ترسل إليه الملف بطلب PUT، أو ينسخ ملفا تحتفظ به المنصة أصلا إن أرسلت staged_ref. ثم استدع product_attachment_upload_finalize.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنتج، ويأتي من products_list. |
category | string | نعم | فئة المرفق: sfda_cert لشهادة هيئة الغذاء والدواء، وcatalog للكتالوج أو نشرة البيانات، وother لأي ملف آخر. |
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف، ويلزم إلا مع staged_ref. المقبول: application/pdf، والصور image/jpeg وimage/png وimage/webp وimage/gif، ومستندات Office (Word، Excel، PowerPoint)، وtext/plain، وtext/csv. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"id": 1187,
"category": "catalog",
"filename": "syringe-catalog-2026.pdf",
"content_type": "application/pdf",
"size_bytes": 2864117
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد 15 ميغابايت للملف المرفوع، و100 ميغابايت للملف المرجعي. والمنتج الذي لا تملكه مؤسستك أو الموجود في سلة المهملات يرد بـ404.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
product_attachment_upload_finalize
ينهي رفعا بدأته product_attachment_upload_url_create: يتحقق من حجم الملف ونوعه الفعلي، ثم يحفظه على المنتج في الفئة التي اخترتها عند البدء.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
{
"upload_id": "0e7b2d94-3c51-4a8f-b6d2-9f4e1a7c3b58"
}ما يعيده: path وurl وname للمرفق الجديد، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes. ويحفظ الملف بالنوع الذي تثبته محتوياته.
- يستعمل المرجع
staged_refمرة واحدة: بعد نجاح الإنهاء تحذف النسخة المحتجزة، وإن رفض الملف عاد المرجع صالحا لمحاولة ثانية. - يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
product_attachment_delete
يحذف مرفقا واحدا من منتج حذفا نهائيا. ولا يمكن التراجع عنه.
يحذف بيانات أو يستبدلها · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف المنتج. |
category | string | نعم | فئة المرفق، وهي إحدى القيم نفسها في الرفع: sfda_cert أو catalog أو other. |
path | string | نعم | مسار المرفق path، ويأتي من المصفوفة attachments في products_get أو من رد الرفع. |
{
"id": 1187,
"category": "catalog",
"path": "9b2f1c0e-4d1a-4f6e-8c1b-3a7d5e2f9a10/products/1187/attachments/catalog/1791281700000-k3x9ab__syringe-catalog-2026.pdf"
}ما يعيده: تأكيد الحذف (success: true).
- المسار الذي ليس في مجلد هذه الفئة من مرفقات المنتج يرد بـ400، والمنتج الذي لا تملكه مؤسستك يرد بـ404.
product_files_copy
يضع صورة منتج أو مرفقه على منتجات أخرى في مؤسستك بنسخة داخل التخزين، بالتكلفة نفسها مهما كان حجم الملف. ارفع النشرة التي تغطي عدة منتجات مرة واحدة، ثم انسخها هنا بدل رفعها لكل منتج. ولكل منتج نسخته، فحذفها من منتج لا يمس الآخرين.
يغير البيانات · الصلاحية products.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
kind | string | نعم | photo للصورة، أو فئة المرفق التي يحفظ بها الملف المصدر وتحفظ بها النسخ: sfda_cert أو catalog أو other. |
source_product_id | integer | نعم | المنتج الذي يملك الملف الآن. |
path | string | نعم | مسار الملف المصدر: مسار الصورة من `product_photo_list` أو من رد رفعها، ومسار المرفق من attachments في products_get أو من رد رفعه. |
product_ids | integer[] | نعم | المنتجات التي يوضع عليها الملف، من 1 إلى 500. ويتخطى المنتج المصدر إن ورد. |
{
"kind": "catalog",
"source_product_id": 1187,
"path": "9b2f1c0e-4d1a-4f6e-8c1b-3a7d5e2f9a10/products/1187/attachments/catalog/1791281700000-k3x9ab__syringe-catalog-2026.pdf",
"product_ids": [
1188,
1189,
1190
]
}ما يعيده: كائن فيه copied (لكل منتج product_id والمسار الجديد path) وfailed (لكل منتج product_id وسبب الإخفاق error).
- المسار الذي ليس في مجلد هذا النوع من ملفات المنتج المصدر يرد بـ400، وأي منتج لا تملكه مؤسستك أو محذوف يرد بـ404 ولا ينسخ شيء. وإخفاق نسخة واحدة لا يوقف الباقي، فأعد المحاولة للمنتجات الواردة في
failedوحدها.
مرفقات الشركات المصنعة
لكل شركة مصنعة أربع فئات من المرفقات: catalog وsfda_ar وiso وauthorization. وتشرح مرفقات الشركة كيف تستعمل في التطبيق.
manufacturer_attachment_list
يعرض كل الملفات المحفوظة على شركة مصنعة في فئاتها الأربع، لكل ملف مساره واسمه وحجمه ورابط تنزيل مؤقت.
للقراءة فقط · الصلاحية manufacturers.read · كل الأدوار · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف الشركة المصنعة، ويأتي من manufacturers_list. |
ما يعيده: قائمة المرفقات، لكل مرفق category وpath وname وsize وuploaded_at وurl، والرابط صالح لنحو ساعة.
- الشركة المصنعة التي لا تملكها مؤسستك ترد بـ404.
manufacturer_attachment_upload_url_create
يبدأ حفظ مستند على شركة مصنعة: كتالوجها أو ترخيص ممثلها المعتمد لدى هيئة الغذاء والدواء (SFDA) أو شهادة ISO أو خطاب التفويض الذي تحمله مؤسستك منها. يعيد رابط رفع مؤقتا، أو ينسخ ملفا تحتفظ به المنصة إن أرسلت staged_ref، وبه يحفظ كتالوج المورد الكامل. ثم استدع manufacturer_attachment_upload_finalize.
يغير البيانات · الصلاحية manufacturers.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف الشركة المصنعة، ويأتي من manufacturers_list. |
category | string | نعم | فئة المرفق: catalog للكتالوج، وsfda_ar لترخيص الممثل المعتمد لدى هيئة الغذاء والدواء، وiso لشهادة ISO، وauthorization لخطاب التفويض الذي تحمله مؤسستك من الشركة، وهو ما يرافق منتجاتها في حزم التقديم. ترخيص الممثل المعتمد مكانه sfda_ar لا authorization. |
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف، ويلزم إلا مع staged_ref. المقبول: application/pdf، والصور image/jpeg وimage/png وimage/webp وimage/gif، ومستندات Office (Word، Excel، PowerPoint)، وtext/plain، وtext/csv. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"id": 214,
"category": "catalog",
"staged_ref": "wa-staged:3f9a1c52-7b1e-4d2a-9c61-5e0b2d7a8f14",
"filename": "meditech-catalog-2026.pdf"
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد 15 ميغابايت للملف المرفوع، و100 ميغابايت للملف المرجعي. والشركة المصنعة التي لا تملكها مؤسستك ترد بـ404.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
manufacturer_attachment_upload_finalize
ينهي رفعا بدأته manufacturer_attachment_upload_url_create: يتحقق من حجم الملف ونوعه الفعلي، ثم يحفظه على الشركة المصنعة في الفئة التي اخترتها عند البدء.
يغير البيانات · الصلاحية manufacturers.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
{
"upload_id": "a41c9e27-6d03-4b8e-8f15-2c7a9b0d4e61"
}ما يعيده: path وurl وname للمرفق الجديد، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes.
- يستعمل المرجع
staged_refمرة واحدة: بعد نجاح الإنهاء تحذف النسخة المحتجزة، وإن رفض الملف عاد المرجع صالحا لمحاولة ثانية. - يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
manufacturer_attachment_delete
يحذف مرفقا واحدا من شركة مصنعة حذفا نهائيا. ولا يمكن التراجع عنه.
يحذف بيانات أو يستبدلها · الصلاحية manufacturers.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف الشركة المصنعة. |
category | string | نعم | فئة المرفق، وهي إحدى القيم نفسها في الرفع: catalog أو sfda_ar أو iso أو authorization. |
path | string | نعم | مسار المرفق path، ويأتي من manufacturer_attachment_list. |
{
"id": 214,
"category": "iso",
"path": "9b2f1c0e-4d1a-4f6e-8c1b-3a7d5e2f9a10/manufacturers/214/attachments/iso/1791281700000-p7q2cd__iso-13485-certificate.pdf"
}ما يعيده: تأكيد الحذف (success: true).
- المسار الذي ليس بين مرفقات هذه الشركة في الفئة المذكورة يرد بـ400، والشركة التي لا تملكها مؤسستك ترد بـ404.
مستندات أمر البيع
يحتفظ أمر البيع بمستنداته، وأولها أمر شراء العميل بصيغة PDF. ترفع بالأداتين نفسيهما لكل رفع: بدء ثم إنهاء. وتعرض المستندات في documents ضمن `sales_orders_get`.
sales_order_document_upload_url_create
يبدأ حفظ مستند على أمر بيع: أمر شراء العميل بصيغة PDF أو صورة ممسوحة منه أو نسخة معدلة. يعيد رابط رفع مؤقتا، أو ينسخ ملفا تحتفظ به المنصة إن أرسلت staged_ref. ثم استدع sales_order_document_upload_finalize.
يغير البيانات · الصلاحية orders.write · الأدوار: المالك، المدير، المبيعات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف أمر البيع، ويأتي من sales_orders_list. |
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف، ويلزم إلا مع staged_ref. المقبول: application/pdf، والصور image/jpeg وimage/png وimage/webp وimage/gif، ومستندات Office (Word، Excel، PowerPoint)، وtext/plain، وtext/csv. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"id": 1042,
"filename": "NUPCO-PO-4300010571.pdf",
"content_type": "application/pdf",
"size_bytes": 108281
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد 15 ميغابايت للملف المرفوع، و100 ميغابايت للملف المرجعي. ويحتفظ الأمر بأي عدد من المستندات. والأمر الذي لا تملكه مؤسستك يرد بـ404.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
sales_order_document_upload_finalize
ينهي رفعا بدأته sales_order_document_upload_url_create: يتحقق من حجم الملف ونوعه الفعلي، ثم يحفظه على أمر البيع.
يغير البيانات · الصلاحية orders.write · الأدوار: المالك، المدير، المبيعات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
{
"upload_id": "a41c9e27-6d03-4b8e-8f15-2c7a9b0d4e61"
}ما يعيده: path وurl وname للمستند الجديد، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes.
- يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
sales_order_document_delete
يحذف مستندا واحدا من أمر بيع حذفا نهائيا. ولا يمكن التراجع عنه.
يحذف بيانات أو يستبدلها · الصلاحية orders.write · الأدوار: المالك، المدير، المبيعات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
id | integer | نعم | معرف أمر البيع. |
path | string | نعم | مسار المستند path، ويأتي من documents في sales_orders_get، حتى 600 حرف. |
{
"id": 1042,
"path": "9b2f1c0e-4d1a-4f6e-8c1b-3a7d5e2f9a10/sales-orders/1042/documents/1791281700000-p7q2cd__NUPCO-PO-4300010571.pdf"
}ما يعيده: تأكيد الحذف (success: true).
- المسار الذي ليس بين مستندات هذا الأمر يرد بـ400، والأمر الذي لا تملكه مؤسستك يرد بـ404.
الشعار والختم والتوقيع
ثلاث صور تطبع على عروض الأسعار. الشعار والختم للمؤسسة ولا يغيرهما إلا المالك، والتوقيع شخصي يديره العضو الذي يعمل الاتصال باسمه. والرفع يستبدل الصورة السابقة دائما.
settings_logo_upload_url_create
يبدأ ضبط شعار المؤسسة الذي يطبع في ترويسة ملفات PDF لعروض الأسعار، ويستبدل الشعار السابق عند الإنهاء. يعيد رابط رفع مؤقتا ترسل إليه الصورة بطلب PUT، ثم استدع settings_logo_upload_finalize.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف: image/png أو image/jpeg أو image/webp أو image/svg+xml، ويقبل image/gif وimage/avif وimage/tiff فتحول عند الإنهاء. يلزم إلا مع staged_ref. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"filename": "acme-logo.png",
"content_type": "image/png",
"size_bytes": 48210
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد الأقصى 2 ميغابايت. والاتصال الذي لا يعود لمالك المؤسسة يرد بـ403.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
settings_logo_upload_finalize
ينهي رفعا بدأته settings_logo_upload_url_create: يتحقق من الصورة، ويحول صيغتها أو يقص حوافها أو يصغرها عند الحاجة، ثم يضبطها شعارا للمؤسسة مكان السابق.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
trim_whitespace | boolean | لا | يقص الحواف البيضاء أو الشفافة حول الصورة ويترك هامشا بنحو 2% من حجم المحتوى. ولا يغير صورة SVG. |
max_width | integer | لا | يصغر الصورة إلى هذا العرض بالبكسل على الأكثر مع الحفاظ على نسبتها، ولا يكبرها أبدا. من 16 إلى 10000. |
{
"upload_id": "c2d8f1a0-4b7e-4e39-a5c6-1f0b9d2e7a43",
"trim_whitespace": true
}ما يعيده: path وurl للصورة المحفوظة، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes وwidth وheight، وconverted_from حين حولت الصيغة، وtrimmed وresized.
- صورة SVG تحفظ كما رفعت، فلا يغيرها
trim_whitespaceولاmax_width. وكثيرا ما يفيدtrim_whitespaceمع شعار أو ختم صدر بهامش واسع. - الاتصال الذي لا يعود لمالك المؤسسة يرد بـ403.
- الصورة بصيغة خارج المسموح، مثل AVIF أو TIFF، تحول إلى JPEG بجودة 85، أو إلى PNG إن كانت فيها شفافية. والصورة التي لا تحتاج تحويلا ولا قصا ولا تصغيرا تحفظ كما رفعت. ولا تقبل صور HEIC، فصدرها بصيغة JPEG أو PNG.
- يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
settings_logo_delete
يزيل شعار المؤسسة فتطبع ملفات PDF لعروض الأسعار بدونه. ولا يمكن التراجع عنه، وللاستعادة ارفع الشعار من جديد. للمالك وحده.
يحذف بيانات أو يستبدلها · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
لا معاملات.
ما يعيده: تأكيد الحذف (success: true).
settings_stamp_upload_url_create
يبدأ ضبط ختم المؤسسة الذي يطبع على ملفات PDF لعروض الأسعار، ويستبدل الختم السابق عند الإنهاء. يعيد رابط رفع مؤقتا ترسل إليه الصورة بطلب PUT، ثم استدع settings_stamp_upload_finalize.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف: image/png أو image/jpeg أو image/webp أو image/svg+xml، ويقبل image/gif وimage/avif وimage/tiff فتحول عند الإنهاء. يلزم إلا مع staged_ref. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"filename": "acme-stamp.png",
"content_type": "image/png",
"size_bytes": 48210
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد الأقصى 2 ميغابايت. والاتصال الذي لا يعود لمالك المؤسسة يرد بـ403.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
settings_stamp_upload_finalize
ينهي رفعا بدأته settings_stamp_upload_url_create: يتحقق من الصورة، ويحول صيغتها أو يقص حوافها أو يصغرها عند الحاجة، ثم يضبطها ختما للمؤسسة مكان السابق.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
trim_whitespace | boolean | لا | يقص الحواف البيضاء أو الشفافة حول الصورة ويترك هامشا بنحو 2% من حجم المحتوى. ولا يغير صورة SVG. |
max_width | integer | لا | يصغر الصورة إلى هذا العرض بالبكسل على الأكثر مع الحفاظ على نسبتها، ولا يكبرها أبدا. من 16 إلى 10000. |
{
"upload_id": "c2d8f1a0-4b7e-4e39-a5c6-1f0b9d2e7a43",
"trim_whitespace": true
}ما يعيده: path وurl للصورة المحفوظة، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes وwidth وheight، وconverted_from حين حولت الصيغة، وtrimmed وresized.
- صورة SVG تحفظ كما رفعت، فلا يغيرها
trim_whitespaceولاmax_width. وكثيرا ما يفيدtrim_whitespaceمع شعار أو ختم صدر بهامش واسع. - الاتصال الذي لا يعود لمالك المؤسسة يرد بـ403.
- الصورة بصيغة خارج المسموح، مثل AVIF أو TIFF، تحول إلى JPEG بجودة 85، أو إلى PNG إن كانت فيها شفافية. والصورة التي لا تحتاج تحويلا ولا قصا ولا تصغيرا تحفظ كما رفعت. ولا تقبل صور HEIC، فصدرها بصيغة JPEG أو PNG.
- يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
settings_stamp_delete
يزيل ختم المؤسسة فتطبع ملفات PDF لعروض الأسعار بدونه. ولا يمكن التراجع عنه، وللاستعادة ارفع الختم من جديد. للمالك وحده.
يحذف بيانات أو يستبدلها · الصلاحية settings.write · الأدوار: المالك · الخطة الاحترافية وخطة المؤسسات
لا معاملات.
ما يعيده: تأكيد الحذف (success: true).
settings_signature_get
يعيد صورة توقيع العضو الذي يعمل الاتصال باسمه، أو قيمتين null إن لم يحفظ له توقيع. والتوقيع ملك العضو لا المؤسسة.
للقراءة فقط · الصلاحية settings.read · كل الأدوار · الخطة الاحترافية وخطة المؤسسات
لا معاملات.
ما يعيده: path وurl للتوقيع، والرابط صالح لنحو ساعة، أو null للاثنين إن لم يوجد توقيع.
settings_signature_upload_url_create
يبدأ ضبط صورة توقيع العضو الذي يعمل الاتصال باسمه، وتطبع على عروض الأسعار المعتمدة التي يكون فيها مندوب المبيعات. ويستبدل التوقيع السابق عند الإنهاء. يعيد رابط رفع مؤقتا ترسل إليه الصورة بطلب PUT، ثم استدع settings_signature_upload_finalize.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
filename | string | لا | اسم الملف الأصلي. يلزم إلا مع staged_ref، فيستعمل حينها اسم الملف المحفوظ ما لم تغيره. |
content_type | string | لا | نوع الملف: image/png أو image/jpeg أو image/webp أو image/svg+xml، ويقبل image/gif وimage/avif وimage/tiff فتحول عند الإنهاء. يلزم إلا مع staged_ref. |
size_bytes | integer | لا | حجم الملف بالبايت إن كان معروفا. فالملف الأكبر من الحد يرفض هنا قبل رفعه، لا بعده. |
staged_ref | string | لا | مرجع إلى ملف تحتفظ به المنصة لمؤسستك أصلا، كملف أرسل إلى المساعد على واتساب، وتعرضه `whatsapp_attachments_list`. ينسخ الملف إلى مكانه داخل الخادم فلا ترفع شيئا: يعود upload_url فارغا وتنتقل إلى أداة الإنهاء مباشرة. أرسله بدل filename وcontent_type. |
{
"filename": "signature.png",
"content_type": "image/png",
"size_bytes": 48210
}ما يعيده: upload_id وupload_url وmethod (PUT) وheaders وexpires_at (الحالة 201). ومع staged_ref يعود upload_url فارغا وstaged: true.
- الحد الأقصى 2 ميغابايت.
- الرابط لرفع واحد، وينتهي عند
expires_atبعد ساعتين من إنشائه. ولا يحفظ شيء قبل أداة الإنهاء، والرفع الذي لا ينهى خلال 24 ساعة يحذف مع ملفه. - النوع غير المدعوم يرد بـ400، والحجم المعلن الأكبر من الحد يرد بـ413، ولا ينشأ رابط في الحالتين.
- تستطيع كل مؤسسة، بكل مفاتيحها وموصلاتها معا، أن تفتح 20 رفعا في الوقت نفسه على الأكثر (بدأ ولم يكتمل ورابطه لم ينته)، وأن تبدأ 500 رفع في اليوم على الأكثر بتوقيت UTC، ما لم تحدد بروكداك للمؤسسة حدودا أخرى. وإذا بلغت أحد الحدين ردت أداة البدء بـ429 مع
code: "upload_limit_reached"وretry_after_seconds، فأكمل بأداة الإنهاء الرفوع التي أرسلت ملفاتها، أو انتظر تلك المدة. والرابط الذي لم يستعمل يترك مكانه حين ينتهي.
settings_signature_upload_finalize
ينهي رفعا بدأته settings_signature_upload_url_create: يتحقق من الصورة، ويحول صيغتها أو يقص حوافها أو يصغرها عند الحاجة، ثم يضبطها توقيعا للعضو مكان السابق.
يغير البيانات · الصلاحية settings.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
upload_id | string | نعم | معرف الرفع upload_id الذي أعادته أداة البدء المقابلة. |
trim_whitespace | boolean | لا | يقص الحواف البيضاء أو الشفافة حول الصورة ويترك هامشا بنحو 2% من حجم المحتوى. ولا يغير صورة SVG. |
max_width | integer | لا | يصغر الصورة إلى هذا العرض بالبكسل على الأكثر مع الحفاظ على نسبتها، ولا يكبرها أبدا. من 16 إلى 10000. |
{
"upload_id": "c2d8f1a0-4b7e-4e39-a5c6-1f0b9d2e7a43",
"trim_whitespace": true
}ما يعيده: path وurl للصورة المحفوظة، والرابط صالح لنحو ساعة، وcontent_type وsize_bytes وwidth وheight، وconverted_from حين حولت الصيغة، وtrimmed وresized.
- يطبع التوقيع حين يكون مندوب المبيعات المربوط بعرض السعر عضوا في الفريق مرتبطا بحسابه في سجل مندوبي المبيعات، ولا يتوقف الاعتماد على وجود توقيع. والتوقيع المصور على ورق أبيض يحتاج عادة
trim_whitespace. - لا ينهي رفع التوقيع إلا العضو الذي بدأه.
- الصورة بصيغة خارج المسموح، مثل AVIF أو TIFF، تحول إلى JPEG بجودة 85، أو إلى PNG إن كانت فيها شفافية. والصورة التي لا تحتاج تحويلا ولا قصا ولا تصغيرا تحفظ كما رفعت. ولا تقبل صور HEIC، فصدرها بصيغة JPEG أو PNG.
- يقرأ الخادم الملف نفسه ولا يثق بالنوع المعلن: الملف الذي لا يطابق نوعا مقبولا أو يتجاوز الحد يحذف ويرد بـ422 أو 413 مع السبب، فابدأ رفعا جديدا.
- ينهى كل
upload_idمرة واحدة. والمعرف المجهول أو التابع لمؤسسة أخرى يرد بـ404، والمنتهي يرد بـ410، والمستعمل سابقا يرد بـ409. - إن استدعيت الإنهاء قبل الرفع رد بـ409 دون أن يضيع الرفع: ارفع الملف إلى
upload_urlثم استدعه ثانية.
settings_signature_delete
يزيل توقيع العضو الذي يعمل الاتصال باسمه. فتطبع عروض الأسعار التي يكون مندوب المبيعات فيها بلا توقيع، ولا يتوقف الاعتماد على غيابه. ولا يمكن التراجع عنه.
يحذف بيانات أو يستبدلها · الصلاحية settings.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
لا معاملات.
ما يعيده: تأكيد الحذف (success: true).
الاستيراد من جدول بيانات
تقرأ sheet_import ملف Excel أو CSV على الخادم: تحدد أي عمود يعني ماذا من عينة صغيرة منه، ثم تقرأ كل الصفوف بنفسها، فتكلف ورقة من 2000 صف ما تكلفه ورقة من 70. ولها خمسة أهداف. tender_items تنشئ منافسة يدوية لمؤسستك ببنودها. وproducts تنشئ منتجات في الكتالوج وتربط كلا منها بالشركة المصنعة المذكورة في صفه، وتنشئ الشركة إن لم تكن موجودة. وquotation_items تنشئ عرض سعر واحدا، ويلزم لكل سطر فيه سعر من الملف، فالورقة بلا عمود أسعار تعود بالحالة needs_confirmation. وbid_pricing تسعر بنود منافسة موجودة بمطابقة رمز المادة. وmanufacturers تنشئ شركة لكل صف وتتخطى الأسماء الموجودة عندك وتسردها في skipped_existing. وقائمة قصيرة أو ملف PDF أو صورة لا تحتاج هذه الأداة: أنشئ السجلات بـ`tenders_create` أو `products_bulk_create` أو `quotations_create`.
sheet_import
ينشئ سجلات من ملف Excel أو CSV دون أن تقرأ صفوفه بنفسك. يحدد الخادم من عينة أي عمود يعني ماذا، ويطبق ذلك على كل صف، ثم يعيد الربط الذي استعمله. وإن لم يكن واثقا منه لم يكتب شيئا وأعاده لتؤكده.
يغير البيانات · الصلاحية tenders.write أو products.write أو quotations.write أو bids.write أو manufacturers.write · الأدوار: المالك، المدير، المبيعات، المشتريات · الخطة الاحترافية وخطة المؤسسات
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
sheet_base64 | string | نعم | محتوى ملف .xlsx أو .csv بترميز base64. السقف العملي نحو 3 ميغابايت بعد فك الترميز لأن الخادم يرفض أي طلب يتجاوز نحو 4.5 ميغابايت. أرسل بايتات الملف نفسه، لا جدولا أعيد بناؤه من صفوفه. وعلى واتساب يمرر المساعد مرجع المرفق بدل المحتوى، فيقرأ الخادم الملف ويبقيه متاحا لنداء التأكيد التالي. |
filename | string | لا | اسم الملف الأصلي، حتى 300 حرف. |
target | string | نعم | ما تصير إليه الصفوف: tender_items بنود منافسة يدوية جديدة (أرسل معها tender)، products منتجات في الكتالوج، quotation_items سطور عرض سعر جديد (أرسل معها quotation)، bid_pricing أسعار لبنود منافسة موجودة (أرسل معها tender_id)، manufacturers شركات مصنعة في دليلك. |
instruction | string | لا | ما قاله صاحب الملف عنه بكلماته، مثل أن عمود الوصف هو اسم البند وعمود المواصفات هو الوصف. يتقدم على القراءة التلقائية للأعمدة. حتى 2000 حرف. |
sheet | string | لا | اسم ورقة العمل. تستعمل الورقة الأولى إن حذف، ويذكر الرد الأوراق الأخرى في other_sheets. والاسم غير الموجود يرد بـ400. |
layout | object | لا | الربط الذي تحدده بنفسك بدل أن يكتشفه الخادم: صف العناوين ونطاق البيانات وما يغذيه كل عمود. استعمله لتصحيح عمود بعد أن راجع صاحب الملف الربط، أو حين تعرف الربط مسبقا. ويعيد كل رد الربط المستعمل بهذه الصيغة نفسها فتستطيع إرساله بعد تعديله. والربط الذي ترسله يؤخذ كما هو ولا يحتاج تأكيدا. |
layout.sheet | string | لا | اسم الورقة التي ينطبق عليها هذا الربط، حتى 200 حرف. |
layout.header_row | integer | نعم | رقم صف العناوين بدءا من 1 كما يظهر في Excel، أو 0 إن لم تكن للورقة عناوين. يلزم عند إرسال layout. |
layout.data_start_row | integer | نعم | رقم أول صف بيانات حقيقي بدءا من 1. يلزم عند إرسال layout. |
layout.data_end_row | integer | نعم | رقم آخر صف بيانات، أو 0 ليمتد إلى نهاية الورقة. يلزم عند إرسال layout. |
layout.columns | object[] | نعم | الأعمدة والحقل الذي يغذيه كل منها، من عمود إلى 60 عمودا. يلزم عند إرسال layout. |
layout.columns[].column | string | نعم | حرف العمود في الورقة: A أو B أو AA. |
layout.columns[].field | string | نعم | الحقل الذي يغذيه العمود، أو ignore لتجاهله. حقول tender_items: item_name، description، quantity، unit، estimated_price، material_code. حقول products، ومع كل حقل عنوان العمود الذي يقرأ منه في القالب والتصدير: product_name: Product name؛ description: Description؛ nupco_product_code: NUPCO code؛ catalogue_number: Catalogue number؛ manufacturer_name: Manufacturer؛ country_of_origin_code: Country of origin؛ price_basis: Price per؛ cost_price: Cost price؛ cost_currency: Cost currency؛ sale_price_sar: Sale price (SAR)؛ vat_percent: VAT %؛ case_type: Case type؛ units_per_case: Units per case؛ min_order_qty: Minimum order quantity؛ is_medical: Medical؛ mdma_number: MDMA number؛ mdma_expiry: MDMA expiry؛ mdma_status: MDMA status؛ listing_number: Listing number؛ shelf_life_years: Shelf life (years)؛ first_delivery_days: First delivery (days)؛ order_delivery_days: Order delivery (days)؛ unit_of_measure: Unit of measure؛ weight_kg: Unit weight (kg)؛ length_cm: Unit length (cm)؛ width_cm: Unit width (cm)؛ height_cm: Unit height (cm)؛ case_weight_kg: Case weight (kg)؛ case_length_cm: Case length (cm)؛ case_width_cm: Case width (cm)؛ case_height_cm: Case height (cm)؛ package_type: Package type؛ package_size: Package size؛ inner_length_cm: Pack length (cm)؛ inner_width_cm: Pack width (cm)؛ inner_height_cm: Pack height (cm)؛ volume: Volume؛ volume_unit: Volume unit؛ content_quantity: Content per unit؛ content_unit: Content unit؛ packing_kind: Product kind؛ foc_percent: FOC %؛ additional_info: Additional info؛ search_query: Search query؛ photo_files: Photo files؛ catalog_files: Catalog files. حقول quotation_items: description، quantity، unit_price، unit، stock_no، catalog_no، vat_rate. حقول bid_pricing: material_code، unit_price، notes. حقول manufacturers: name، contact_person، country، email، phone، website، address، notes، agency_type. وقد يغذي عمودان الحقل نفسه (كمواصفات بلغتين) فيضمان بالترتيب المرسل. والحقل الذي ليس من حقول الهدف يرفض. |
layout.columns[].header | string | لا | نص عنوان العمود كما في الملف، ويعرض عند مراجعة الربط. |
confirm | boolean | لا | يقبل ربطا عاد بالحالة needs_confirmation. أرسله بعد أن يرى صاحب الملف الربط فقط. |
dry_run | boolean | لا | يقرأ الملف ويعد الصفوف دون أن يكتب شيئا، ويعيد الربط ومعاينة بالحالة preview. |
tender | object | لا | رأس المنافسة اليدوية التي ستحمل البنود. يلزم مع tender_items، ويؤخذ من كلام صاحب الملف أو من الملف نفسه. |
tender.tender_name | string | نعم | اسم المنافسة، حتى 500 حرف. يلزم عند إرسال tender. |
tender.agency_name | string | نعم | اسم الجهة الطالبة، حتى 300 حرف. يلزم عند إرسال tender. |
tender.tender_number | string | لا | رقم المنافسة، حتى 100 حرف. أرسل null لتتركه فارغا. |
tender.reference_number | string | لا | الرقم المرجعي للمنافسة، حتى 100 حرف. أرسل null لتتركه فارغا. |
tender.branch_name | string | لا | اسم الفرع، حتى 200 حرف. أرسل null لتتركه فارغا. |
tender.last_offer_date | string | لا | آخر موعد لتقديم العروض بصيغة ISO 8601، مثل 2026-11-02T12:00:00. أرسل null لتتركه فارغا. |
manufacturer_id | integer | لا | يربط كل منتج ينشأ بهذه الشركة المصنعة، مع الهدف products. يأتي من manufacturers_list. |
quotation | object | لا | رأس عرض السعر الذي ستحمله السطور، مع quotation_items: العميل وربط المنافسة والعملة والصلاحية. يؤخذ من كلام صاحب الملف، وأسعار السطور من الملف نفسه. |
quotation.tender_id | integer | لا | يربط عرض السعر بمنافسة وتصبح جهتها الجهة المخاطبة. أرسل null لعرض بلا منافسة. |
quotation.customer_name | string | لا | اسم العميل، حتى 200 حرف. أرسل null لتتركه فارغا. |
quotation.rfq_no | string | لا | رقم طلب التسعير لدى العميل، حتى 100 حرف. أرسل null لتتركه فارغا. |
quotation.quote_validity_days | integer | لا | مدة سريان عرض السعر بالأيام، من 1 إلى 3650. أرسل null لتتركها فارغة. |
quotation.delivery_period_days | integer | لا | مدة التوريد بالأيام، من 1 إلى 3650. أرسل null لتتركها فارغة. |
quotation.currency | string | لا | رمز العملة، من حرف إلى 8 أحرف. الافتراضي SAR. |
quotation.notes | string | لا | ملاحظات على عرض السعر، حتى 2000 حرف. أرسل null لتتركها فارغة. |
quotation.sales_person_id | integer | لا | مندوب المبيعات الذي يطبع اسمه على العرض، ويأتي من sales_persons_list. أرسل null لتتركه فارغا. |
tender_id | integer | لا | المنافسة التي تسعر ورقة bid_pricing بنودها. يلزم مع هذا الهدف، ويأتي من tenders_list. يطابق كل صف بندا حيا بالرمز material_code فقط، مطابقة تامة لا تفرق بين الحروف الكبيرة والصغيرة. والصف الذي لا بند له، أو الذي يشترك بندان في رمزه، لا يسعر ويعود في unmatched مع رقم صفه، فسعره بـ`bid_pricing_set_batch`. والصف المسعر بصفر يحتفظ بسعره ويزيل علامة المشاركة عن البند، كما في `bid_pricing_set_batch`. |
constants | object | لا | قيم ذكرها صاحب الملف مرة واحدة عن الورقة كلها فتطبق على كل صف، مثل {"cost_currency": "SAR"} إذا قال إن الأسعار بالريال ولا عمود للعملة. ولا يقبل ثابت لحقل يغذيه عمود، ويعيد الرد الثوابت المطبقة لتراجعها. |
files | string[] | لا | للهدف products فقط: أسماء ملفات الصور والكتالوجات التي معك لهذه الورقة، حتى 3000 اسم، والأسماء وحدها لا محتواها. يعيد الرد عندئذ في attachments أي ملف يخص أي صف: بما في خليتي Photo files و Catalog files، وإلا فبالملفات التي اسمها رقم كتالوج الصف. وبلا هذا الحقل يسرد attachments الأسماء التي تطلبها الخلايا دون مطابقتها بملفات. |
{
"sheet_base64": "UEsDBBQABgAIAAAAIQBi7p1L...",
"filename": "meditech-price-list.xlsx",
"target": "products",
"manufacturer_id": 214,
"instruction": "The price column is the cost per carton; the prices are in USD",
"constants": {
"cost_currency": "USD"
},
"dry_run": true
}ما يعيده: كائن فيه status (imported أو preview أو needs_confirmation) والربط المستعمل في mapping والأعمدة المتجاهلة وعدد الصفوف في counts وأول 20 مشكلة في issues مع أرقام صفوفها ومعاينة من 3 صفوف في preview وصيغة layout القابلة لإعادة الإرسال. وبعد الكتابة يضاف created، ومعه tender_id للمنافسة، وquotation_id وquote_number لعرض السعر، وpriced وunmatched للأسعار، وskipped_existing للشركات المصنعة. وللهدف products يعني own_headers: true أن الربط قرئ من العناوين، ويحمل attachments خطة الملفات: rows (صور كل صف photos وكتالوجاته catalogs، ومعها product_id بعد الاستيراد)، وproblems لكل صف وملف، وshared_catalogue_numbers، والملفات غير المستعملة unused.
- حالة
needs_confirmationتعني أن الخادم غير واثق من قراءته للأعمدة، أو أن حقلا لازما بلا عمود، ولا يكتب شيئا. اعرض الربط على صاحب الملف بلغته، ثم أعد الاستدعاء معconfirm: trueأو معlayoutمصححة. - لكل هدف صلاحيته:
tender_itemsتحتاجtenders.writeودور المالك أو المدير، وproductsتحتاجproducts.write، وmanufacturersتحتاجmanufacturers.write، وquotation_itemsتحتاجquotations.write، وbid_pricingتحتاجbids.write. وتصلح الأهداف الأربعة الأخيرة للمالك والمدير والمبيعات والمشتريات. - تتخطى القراءة الصفوف الفارغة وسطور العناوين المكررة والشرائط المدمجة كإجمالي الصفحة والصفوف التي ينقصها حقل لازم، وتعدها بأسبابها في
counts. وما جاوز سقف الهدف لا يكتب ويحسب فيcounts.truncated: 2000 صف لـtender_itemsوbid_pricing، و500 لـproductsوquotation_itemsوmanufacturers. - في الهدف
productsيقبل كل حقل يعدله التطبيق للمنتج عمودا، ومعها Photo files و Catalog files. والورقة التي عناوينها هي عناوين الاستيراد نفسها، كالقالب من `products_import_template` أو مخرج `products_export_csv`، تقرأ أعمدتها من عناوينها دون خطوة التعرف. والعمود الذي يحمل قائمة يفصل بفاصلة منقوطة (;): رموز نوبكو وأولها الرئيسي، والشركات المصنعة، وأسماء الملفات. - عمود Price per يقول ما يخصه السعران في الصف: Piece أو Unit للقطعة، أو Pack أو Box للعبوة، أو Carton أو Case للكرتون، أو Content لوحدة واحدة مما تحتويه القطعة، أو ما يقابلها بالعربية (قطعة ووحدة وعبوة وعلبة وكرتون ومحتوى)، أو اسم مستوى من الصف نفسه مثل Vial أو Kit. والخلية التي لا تسمي مستوى من الصف، أو تسمي مستوى لا عدد له فيه، تسقط المستوى والسعرين معا، ولكل منها مشكلة برقم صفها، لأن السعر بلا مستواه لا يعرف لأي وحدة هو. والخلية الفارغة تبقي المستوى غير محدد، فيستخدم السعران كما هما في كل بنود المنافسات. ويقرأ عمود Content unit وحدة المحتوى بأي من أسمائها (ml أو مل أو Tests)، والوحدة غير المعروفة تسقط خليتي المحتوى معا، ويقرأ عمود Product kind مفتاح النوع أو اسمه بالعربية أو الإنجليزية.
- إن رفضت الكتابة بسبب التعبئة رغم ذلك (
price_basis_level_missingأوcontent_incomplete) فلا يكتب شيء، ويسمي الحقلrowsكل صف مرفوض برقمه في الورقةrowوالحقل والإصلاح. - لإرفاق الملفات بعد الاستيراد استعمل
product_idفيattachments.rows: `product_photo_upload_url_create` للصور، و`product_attachment_upload_url_create` بالفئةcatalogللكتالوجات، ثم أداة الإنهاء المقابلة لكل منهما. والملف الذي تشترك فيه عدة صفوف ارفعه مرة ثم انسخه بـ`product_files_copy`. - الأداة للجداول فقط. ملف PDF أو Word أو PowerPoint يرد بـ400، وملف xls القديم يرد بـ400 أيضا ويلزم حفظه بصيغة xlsx أو csv. وإنشاء المنتجات فوق حد خطتك يرد بـ403، وإنشاء عرض السعر يحتسب من حد الخطة الشهري لعروض الأسعار.