منع البيع بالسالب في أوامر البيع
أمر البيع ميتأكدش لو الكمية أكبر من المتاح في المخزن.
نسخة مجانية الكاملة 750 ج.م
المجاني ولا الكامل؟
الكامل بيعمل إيه بالتفصيل
مكان الإعداد: المبيعات ← الإعدادات ← «البيع بالسالب» ← «منع البيع بأكتر من المتاح». الإعداد لكل شركة لوحدها.
المنع:
- لما يتفعّل، تأكيد أمر البيع بيترفض لو كمية أي صنف أكبر من المتاح في مخزن الأمر.
- الرسالة بتقول أنهي صنف، والمطلوب كام، والمتاح كام.
- المتاح = الرصيد في المخزن، ناقص اللي لسه هيخرج لأوامر وتحويلات متأكدة ومتسلّمتش.
- لو نفس الصنف في أكتر من سطر، الكميات بتتجمع.
الاختيارات (لو سبت أي واحدة فاضية تبقى على الكل):
- الفئات الممنوعة: الفئات اللي تحتها داخلة معاها.
- المخازن الممنوعة: بيتشيك على مخزن الأمر.
- المسموح لهم بالبيع بالسالب: المستخدمين دول يقدروا يأكدوا عادي.
اللي مش بيتأثر:
- نقطة البيع.
- طلبات المتجر الإلكتروني والبوابة (لما العميل يدفع أو يوقّع بنفسه).
- الأصناف اللي مش متتبعة في المخزون.
التسطيب
- فعّل وضع المطوّر (الإعدادات ← تفعيل وضع المطوّر).
- ادخل التطبيقات ← «استيراد وحدة» (Import Module)، ارفع الملف، واضغط تثبيت.
- المبيعات ← الإعدادات ← «البيع بالسالب»: فعّل المنع، واختار الفئات والمخازن والمستخدمين لو محتاج، واحفظ.
ملحوظة: لو أودو أونلاين لازم تكون على باقة Custom.
تبنيها بنفسك من غير ملف
الكود والخطوات (نفس النسخة المجانية)
النسخة دي قاعدة أتمتة واحدة بتمنع في كل الأصناف وكل المخازن، من غير إعدادات. التحكم في الفئات والمخازن والمستخدمين في الموديول بس.
- الإعدادات ← تقنية ← قواعد الأتمتة ← جديد.
- الموديل: أمر البيع (Sales Order).
- المشغّل: عند التحديث (On save)، والحقل الحالة (Status).
- قبل التحديث: الحالة ≠ أمر بيع. بعد التحديث: الحالة = أمر بيع.
- الإجراء: تنفيذ كود (Execute Code)، والصق الكود.
# النسخة المجانية: قاعدة أتمتة على أمر البيع بتمنع البيع بالسالب في كل الأصناف وكل المخازن، من غير إعدادات.
# Free version: one automation rule, blocks every storable product in every warehouse, no settings.
for order in records:
if env.user.share: # website and portal orders are never blocked
continue
warehouse = order.warehouse_id
wanted = {}
for line in order.order_line:
product = line.product_id
if line.display_type or not product or not product.is_storable:
continue
wanted[product.id] = wanted.get(product.id, 0.0) + line.product_qty
short = []
for product in env['product.product'].browse(list(wanted)).with_context(warehouse_id=warehouse.id):
available = product.qty_available - product.outgoing_qty
if wanted[product.id] > available + 0.0001:
short.append('- %s: المطلوب %s · المتاح %s' % (product.display_name, wanted[product.id], available))
if short:
raise UserError('مينفعش تأكيد %s: الكمية أكبر من المتاح في مخزن %s.\n\n%s' % (order.name, warehouse.name, '\n'.join(short)))
اطلب النسخة الكاملة
750 ج.م
لو إنت من بره مصر، اكتب بلدك في الطلب ونتفق على السعر بالدولار وطريقة الدفع على واتساب.