أين يتم إنشاء فواتير الدفع الجزئية الصفرية؟

magento.stackexchange https://magento.stackexchange.com//questions/64738

  •  12-12-2019
  •  | 
  •  

سؤال

المشكلة الأساسية هي هذه: لقد قمنا بتمكين إنشاء فواتير للطلبات المجانية (الإجمالي الفرعي صفر).يعمل هذا بشكل جيد، ويتم إنشاء الفاتورة، باستثناء أنه لا يتم إرسال الفاتورة عبر البريد الإلكتروني.

توقعت أنني بحاجة فقط إلى تجاوز الطريقة أينما تم إنشاؤها، ربما فقط لإضافة $invoice->sendEmail(), ، لكني أواجه مشكلة في العثور على مكان هذا بالضبط.

هل كانت مفيدة؟

المحلول

على افتراض أنك قمت بإعداد عناوين البريد الإلكتروني الصادرة بشكل صحيح في Menu > System > Configuration :عناوين البريد الإلكتروني للمتجر:

Menu  loading= System > Configuration : Store Email Addresses Configuration">

تصفح للمبيعات:علامة التبويب رسائل البريد الإلكتروني الخاصة بالمبيعات في نفس الواجهة المذكورة أعلاه وقم بتوسيع قائمة الأكورديون الفاتورة:Sales : Sales Emails tab Invoice Email Settings

سوف تحتاج إلى التأكد من:

  1. تم تمكين رسائل البريد الإلكتروني الخاصة بالفاتورة
  2. أنك قمت بتحديد عنوان "من" بناءً على العنوان الذي قمت بتكوينه أعلاه.يستخدم هذا المثال مندوب المبيعات، ولكن يمكنك تحديد أي عنوان بريد إلكتروني تم تكوينه بشكل صحيح.
  3. أنه تم تحديد القالب للمستخدمين المسجلين (إذا كنت تختبر المستخدمين المسجلين)
  4. أنه تم تحديد قالب للمستخدمين الضيوف (إذا كنت تختبر المستخدمين الضيوف)

لقد التقطت لقطات الشاشة هذه على الإصدار CE 1.9.1، ولكن يجب أن تكون الإعدادات متشابهة في EE.إصدار Magento EE الذي تستخدمه لا يستخدم نظام قائمة الانتظار الجديد، طالما قمت بتكوين هذه الإعدادات بشكل صحيح، وقمت بتنفيذ مراقب مخصص مشابه للكود الموجود في منشور المدونة هذا, ، يجب إرسال رسائل البريد الإلكتروني الخاصة بالفاتورة.

المفتاح هو أن تقوم الوحدة المخصصة الخاصة بك بإرفاق مراقب بـ sales_order_invoice_save_after الحدث - بعد حفظ الفاتورة، يمكنك الاستعلام عن محتويات الفاتورة وإرسال بريد إلكتروني.

* ملاحظات هامة *

إذا كان هدفك هو التأكد من تطبيق هذه الوظيفة على المنتجات القابلة للتنزيل في فواتير الدفع الجزئية الصفرية، فقد يكون الأمر كذلك بالنسبة للمنتجات العادية، مثل @xinqiu وأشار في التعليقات, ، ربما ينبغي عليك إرفاق المراقب الخاص بك بـ sales_order_invoice_save_commit_after الحدث بدلا من ذلك.

متى sales_order_invoice_save_after تم إطلاق عملية الكتابة التي تحتوي على تفاصيل رابط المنتج الذي تم شراؤه القابل للتنزيل، ولم يتم حفظها بعد في قاعدة البيانات، على الرغم من احتمال وجود معلومات الطلب/الفاتورة الأخرى ومعلومات البند الأخرى.

على الرغم من أن هذا المجال ليس لدي أي خبرة مباشرة فيه، فإن ما أفهمه هو أنه إذا كان هناك بعض الفشل على مستوى قاعدة البيانات وتم التراجع عن المعاملة بواسطة MySQL، فسيتم إعادة إنشاء عنوان URL الذي تم إنشاؤه في الأصل لرابط المنتج الفريد القابل للتنزيل بواسطة Magento عندما يعيد محاولة عملية الحفظ/الالتزام

وبعبارة أكثر إيجازًا، لا يمكن للمرء أن يعرف أن عنوان URL الفريد قد تم الاحتفاظ به بأمان في قاعدة البيانات وتم الالتزام به بنجاح في معاملة قاعدة البيانات حتى يتم sales_order_invoice_save_commit_after يتم تشغيل الحدث (حتى لو تم تنفيذ تفاصيل طلب عالية المستوى أخرى في MySQL بالفعل مثل الإجماليات ورقم الطلب/الفاتورة وما إلى ذلك...)

على الرغم من أنه لم تتح لي الفرصة لتجربتها بمفردي حتى الآن، إلا أنه لا يبدو أنني أجد عيبًا في منطق تلك الإستراتيجية (على الرغم من أن هذا ربما يكون أحد المجالات التي لدي خبرة أقل بكثير منها) انا افضل).أعتقد أنك يجب أن تكون قادرًا على تأكيد ذلك بعد قليل من البحث والتجربة - عند إجراء التجارب لفترة وجيزة بمفردي، يجب أن أعترف بأنني أشعر أنه قد يكون من الحكمة الاستخدام sales_order_invoice_save_commit_after...

...بغض النظر عن نوع المنتجات التي تتعامل معها في متجر Magento Store الخاص بك...نظرًا لتسلسلها (اللاحق) في سير عمل الطلب/الفوترة الشامل في Magento، على الأقل ستعرف على الأقل في هذه المرحلة أن كل ما هو ذي صلة تم تخزين تفاصيل الطلب والعنصر وإما إنشاء استثناء من نوع ما وتم التراجع عنه وإعادة المحاولة بشكل مناسب/أو أنه يتصرف كما هو متوقع عادةً.

بافتراض أنك تريد تضمين الرابط الخاص بمنتجك القابل للتنزيل في القالب الذي تستخدمه لإنشاء البريد الإلكتروني الخاص بالفاتورة، فيجب عليك تعديل الكود الذي أدرجه أدناه لإرفاقه sales_order_invoice_save_commit_after مما يضمن حفظ جميع المعلومات ذات الصلة بالطلب وأي منتجات قابلة للتنزيل في قاعدة البيانات والالتزام بها في المعاملة (إن أمكن).

لا أستطيع أن أرى لماذا استخدام sales_order_invoice_save_commit_after قد يسبب أي مشاكل أخرى، على الرغم من أنه يرجى ملاحظة التحذير بأنني لم أفعل ذلك بنفسي مطلقًا وأن الكود الذي أقدمه أدناه قد استخدمته عدة مرات بنجاح لذا قد أكون مخطئًا و"قد يختلف عدد الأميال الخاصة بك."

* ملاحظات هامة *

رمز الوحدة في هذا المثال بسيط جدًا.افتراضيًا، يتم تشغيل وظيفة إرسال الفاتورة عبر البريد الإلكتروني فقط مقابل فاتورة بقيمة 0.00 دولار أمريكي عند النقر فوق الزر الموجود في واجهة المسؤول لإرسال رسالة بريد إلكتروني تحتوي على الفاتورة يدويًا إلى العميل (يتم إرسالها تلقائيًا إذا كان الإجمالي <0).

يطلق الكود أعلاه نفس منطق الزر، ولكن يتم تشغيله عندما يقوم الحدث بتشغيل المراقب.الحل هو 3 مكونات أساسية :

تكوين الوحدة النمطية.xml :

<config>
  <modules>
    <Havsund_Autoorder>
      <version>1.0.0</version>
    </Havsund_Autoorder>
  </modules>
  <global>
  <events>
    <sales_order_invoice_save_after>
      <observers>
        <havsund_autoorder_observer>
          <type>singleton</type>
          <class>Havsund_Autoorder_Model_Observer</class>
          <method>automaticallyInvoiceShipCompleteOrder</method>
        </havsund_autoorder_observer>
       </observers>
     </sales_order_invoice_save_after>
    </events>
  </global>
</config>

كود المراقب :

class Havsund_Autoorder_Model_Observer
{

/* @var Magento_Sales_Model_Order_Invoice */
var $_invoice;

/**
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
* protected $_eventPrefix = 'sales_order';
* protected $_eventObject = 'order';
* event: sales_order_save_after
*/
public function automaticallyInvoiceShipCompleteOrder($observer)
{
   try {
      /* @var $order Magento_Sales_Model_Order_Invoice */
      $this->_invoice = $observer->getEvent()->getInvoice();
      $this->_invoice->sendEmail();

   } catch (Mage_Core_Exception $e) {
       Mage::log("HAVSUND AUTOORDER: Fehler #58 " . $e->getMessage());
   }

   return $this;
}

}

تكوين تنشيط الوحدة:

<?xml version="1.0"?>
  <config>
    <modules>
      <Havsund_Autoorder>
        <active>true</active>
        <version>1.0.0</version>
        <codePool>local</codePool>
        <depends>
        </depends>
      </Havsund_Autoorder>
    </modules>
   </config>

ملحوظة:إذا قمت بتمكين الترجمة، فسيتعين عليك تعطيل/إعادة الترجمة بعد نشر التخصيص الخاص بك ليتم تنفيذه، أو قد تحصل على خطأ يحب:

Warning: get_class() expects parameter 1 to be object, boolean given in /app/code/core/Mage/Core/Model/App.php on line 1340

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top