I have rewritten the order payment model to be:
<?php class Wfh_DisableAutoInvoice_Model_Sales_Order_Payment extends Mage_Sales_Model_Order_Payment { /** * Authorize or authorize and capture payment on gateway, if applicable * This method is supposed to be called only when order is placed * * @return Mage_Sales_Model_Order_Payment */ public function place() { Mage::dispatchEvent('sales_order_payment_place_start', array('payment' => $this)); $order = $this->getOrder(); $this->setAmountOrdered($order->getTotalDue()); $this->setBaseAmountOrdered($order->getBaseTotalDue()); $this->setShippingAmount($order->getShippingAmount()); $this->setBaseShippingAmount($order->getBaseShippingAmount()); $methodInstance = $this->getMethodInstance(); $methodInstance->setStore($order->getStoreId()); $orderState = Mage_Sales_Model_Order::STATE_NEW; $stateObject = new Varien_Object(); /** * Do order payment validation on payment method level */ $methodInstance->validate(); $action = $methodInstance->getConfigPaymentAction(); if ($action) { if ($methodInstance->isInitializeNeeded()) { /** * For method initialization we have to use original config value for payment action */ $methodInstance->initialize($methodInstance->getConfigData('payment_action'), $stateObject); } else { $orderState = Mage_Sales_Model_Order::STATE_NEW; switch ($action) { case Mage_Payment_Model_Method_Abstract::ACTION_ORDER: $this->_order($order->getBaseTotalDue()); break; case Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE: $this->_authorize(true, $order->getBaseTotalDue()); // base amount will be set inside $this->setAmountAuthorized($order->getTotalDue()); break; case Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE_CAPTURE: $this->setAmountAuthorized($order->getTotalDue()); $this->setBaseAmountAuthorized($order->getBaseTotalDue()); $this->capture(null); break; default: break; } } } $this->_createBillingAgreement(); $orderIsNotified = null; if ($stateObject->getState() && $stateObject->getStatus()) { $orderState = $stateObject->getState(); $orderStatus = $stateObject->getStatus(); $orderIsNotified = $stateObject->getIsNotified(); } else { $orderStatus = $methodInstance->getConfigData('order_status'); if (!$orderStatus) { $orderStatus = $order->getConfig()->getStateDefaultStatus($orderState); } else { // check if $orderStatus has assigned a state $states = $order->getConfig()->getStatusStates($orderStatus); if (count($states) == 0) { $orderStatus = $order->getConfig()->getStateDefaultStatus($orderState); } } } $isCustomerNotified = (null !== $orderIsNotified) ? $orderIsNotified : $order->getCustomerNoteNotify(); $message = $order->getCustomerNote(); // add message if order was put into review during authorization or capture if ($order->getState() == Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW) { if ($message) { $order->addStatusToHistory($order->getStatus(), $message, $isCustomerNotified); } } elseif ($order->getState() && ($orderStatus !== $order->getStatus() || $message)) { // add message to history if order state already declared $order->setState($orderState, $orderStatus, $message, $isCustomerNotified); } elseif (($order->getState() != $orderState) || ($order->getStatus() != $orderStatus) || $message) { // set order state $order->setState($orderState, $orderStatus, $message, $isCustomerNotified); } Mage::dispatchEvent('sales_order_payment_place_end', array('payment' => $this)); return $this; } /** * Capture the payment online * Does not create invoice automatically for order * Updates transactions hierarchy, if required * Updates payment totals, updates order status and adds proper comments * * TODO: eliminate logic duplication with registerCaptureNotification() * * @return Mage_Sales_Model_Order_Payment * @throws Mage_Core_Exception */ public function capture($invoice) { $invoice = null; $order = $this->getOrder(); $amountToCapture = $this->_formatAmount($order->getBaseGrandTotal()); $paidWorkaround = (float)$amountToCapture; $this->_isCaptureFinal($paidWorkaround); $this->_generateTransactionId( Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $this->getAuthorizationTransaction() ); Mage::dispatchEvent('sales_order_payment_capture', array('payment' => $this, 'invoice' => $invoice)); $status = true; if (!$this->getIsTransactionPending()) { // attempt to capture: this can trigger "is_transaction_pending" $this->getMethodInstance()->setStore($order->getStoreId())->capture($this, $amountToCapture); $transaction = $this->_addTransaction( Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $invoice, true ); if ($this->getIsTransactionPending()) { $message = Mage::helper('sales')->__('Capturing amount of %s is pending approval on gateway.', $this->_formatPrice($amountToCapture)); $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; if ($this->getIsFraudDetected()) { $status = Mage_Sales_Model_Order::STATUS_FRAUD; } } else { // normal online capture: invoice is marked as "paid" $message = Mage::helper('sales')->__('Captured amount of %s online.', $this->_formatPrice($amountToCapture)); $state = Mage_Sales_Model_Order::STATE_NEW; $this->_updateTotals(array('base_amount_paid_online' => $amountToCapture)); } if ($order->isNominal()) { $message = $this->_prependMessage(Mage::helper('sales')->__('Nominal order registered.')); } else { $message = $this->_prependMessage($message); $message = $this->_appendTransactionToMessage($transaction, $message); } $order->setState($state, $status, $message); return $this; } Mage::throwException( Mage::helper('sales')->__('The transaction "%s" cannot be captured yet.', $amountToCapture) ); } /** * Process a capture notification from a payment gateway for specified amount * Does not create an invoice automatically if the amount if the amount covers the order base grand total completely * Updates transactions hierarchy, if required * Prevents transaction double processing * Updates payment totals, updates order status and adds proper comments * * TODO: eliminate logic duplication with capture() * * @param float $amount * @param bool $skipFraudDetection * @return Mage_Sales_Model_Order_Payment */ public function registerCaptureNotification($amount, $skipFraudDetection = false) { $this->_generateTransactionId(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $this->getAuthorizationTransaction() ); $order = $this->getOrder(); $amount = (float)$amount; $invoice = null; // register new capture if (!$invoice) { $isSameCurrency = $this->_isSameCurrency(); if (!$isSameCurrency && !$this->_isCaptureFinal($amount)) { if (!$skipFraudDetection || !$isSameCurrency) { $this->setIsFraudDetected(true); } $this->_updateTotals(array('base_amount_paid_online' => $amount)); } } $status = true; if ($this->getIsTransactionPending()) { $message = Mage::helper('sales')->__('Capturing amount of %s is pending approval on gateway.', $this->_formatPrice($amount)); $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; if ($this->getIsFraudDetected()) { $message = Mage::helper('sales')->__('Order is suspended as its capture amount %s is suspected to be fraudulent.', $this->_formatPrice($amount, $this->getCurrencyCode())); $status = Mage_Sales_Model_Order::STATUS_FRAUD; } } else { $message = Mage::helper('sales')->__('Registered notification about captured amount of %s.', $this->_formatPrice($amount)); $state = Mage_Sales_Model_Order::STATE_NEW; if ($this->getIsFraudDetected()) { $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; $message = Mage::helper('sales')->__('Order is suspended as its capture amount %s is suspected to be fraudulent.', $this->_formatPrice($amount, $this->getCurrencyCode())); $status = Mage_Sales_Model_Order::STATUS_FRAUD; } } $transaction = $this->_addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $invoice, true); $message = $this->_prependMessage($message); $message = $this->_appendTransactionToMessage($transaction, $message); $order->setState($state, $status, $message); return $this; } } ?>
This is now stopping paypal orders from being invoiced automatically. But, the order confirmation emails are not being sent now when an order is placed and paid with paypal.
Is there a way I can get the order confirmation emails to send ?
Solved! Go to Solution.
Hi @qaisar_satti I have reverted aforementioned changes and amended the registerCaptureNotification function in my payment.php to the following:
$status = true; $letsEmail = false; if ($this->getIsTransactionPending()) { $message = Mage::helper('sales')->__('Capturing amount of %s is pending approval on gateway.', $this->_formatPrice($amount)); $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; $letsEmail = true; if ($this->getIsFraudDetected()) { $message = Mage::helper('sales')->__('Order is suspended as its capture amount %s is suspected to be fraudulent.', $this->_formatPrice($amount, $this->getCurrencyCode())); $status = Mage_Sales_Model_Order::STATUS_FRAUD; $letsEmail = false; } } else { $message = Mage::helper('sales')->__('Registered notification about captured amount of %s.', $this->_formatPrice($amount)); $state = Mage_Sales_Model_Order::STATE_NEW; $letsEmail = true; if ($this->getIsFraudDetected()) { $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; $message = Mage::helper('sales')->__('Order is suspended as its capture amount %s is suspected to be fraudulent.', $this->_formatPrice($amount, $this->getCurrencyCode())); $status = Mage_Sales_Model_Order::STATUS_FRAUD; $letsEmail = false; } } $transaction = $this->_addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $invoice, true); $message = $this->_prependMessage($message); $message = $this->_appendTransactionToMessage($transaction, $message); $order->setState($state, $status, $message); if ($letsEmail === true && !$order->getEmailSent()){ $order->queueNewOrderEmail()->addStatusHistoryComment( Mage::helper('paypal')->__('Notified Customer') ) ->setIsCustomerNotified(true) ->save(); }
@qaisar_satti Came across these two lines earlier, but they are not in the original payment.php in:
MAGENTO_ROOT/app/code/core/Mage/Sales/Model/Order/payment.php
hi @vpatel93
as i mention use these methods through the object of your order: off course these are not related to payment they are related to order
hi @vpatel93
If you want to force send email i prefer add it after this code
$transaction = $this->_addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, $invoice, true); $message = $this->_prependMessage($message); $message = $this->_appendTransactionToMessage($transaction, $message); $order->setState($state, $status, $message);
Hi @qaisar_satti if avoidable I would like to avoid forcing sending of email. Regarding my previous post question, would you know at which stage magento sends an email confirmation for paypal orders ?
@qaisar_satti I went and edited /app/code/core/Mage/ipn.php
by removing $invoice && from line 493 and the if statement from line 457:
This has got emails to send for paypal orders now.
But, order comments history shows "customer is not notified". How can I correct this?
hi @vpatel93
don't edit the core files because when you update the to new version you will lost all your changes and change damage the functionality too.
This is not correct file /app/code/core/Mage/ipn.php
hi @qaisar_satti I know this is incorrect and should copy to local.
May I ask why this is not the correct file?
My edits have made it work :s