EspertoMagento.it

Soluzioni e strategie per e-commerce Magento!

Disabilitare l’auto-invoice di PayPal

Per qualsiasi ragione è possibile voler disabilitare la fatturazione automatica di Paypal. Per far questo è necessario modificare la funzione registerCaptureNotification che si occupa della creazione della notifica PayPal e della creazione dell’invoice. Questa funzione la potete trovare nel file app/code/core/Mage/Sales/Model/Order/Payment.php alla riga 283.

Modificate la dichiarazione della funzione aggiungendo il parametro $create_invoice (impostandolo di default a true):

public function registerCaptureNotification($amount, $create_invoice = true)

Ora sostituite il seguente codice php:

$invoice = $order->prepareInvoice()->register()->pay();
$order->addRelatedObject($invoice);
$this->setCreatedInvoice($invoice);

con:

if( $create_invoice === true ) {
$invoice = $order->prepareInvoice()->register()->pay();
$order->addRelatedObject($invoice);
$this->setCreatedInvoice($invoice);
}

else {
$order->sendNewOrderEmail();
}

Il parametro $create_invoice impostato a true di default permette alla funzione di non perdere le funzionalità base che potrebbero essere state usate in altre parti dell’applicazione e di cui non siamo a conoscenza.

Il passo successivo è modificare la chiamata della funzione registerCaptureNotification nel modulo PayPal. La funzione sulla quale agire è _registerPaymentCapture presente alla riga 291 del file app/code/core/Mage/Paypal/Model/Ipn.php.

L’operazione da fare è molto semplice, basta sostituire il seguente pezzo di codice:

->registerCaptureNotification($this->getIpnFormData('mc_gross'));

con:

->registerCaptureNotification($this->getIpnFormData('mc_gross'), false);

Nel caso in cui vogliate ripristinare la funzione di auto-invoice dovrete semplicemente rimuovere la variabile false presente nella chiamata della funzione registerCaptureNotification.

Adesso il vostro modulo PayPal non genererà più automaticamente le invoice!

 

Tags:

21 commenti per “Disabilitare l’auto-invoice di PayPal

  1. Leo
    17 marzo 2015 at 12:19

    Ciao

    stavo seguendo il tuo tutorial ma ho trovato che nel file in oggetto il codice non è esattamente come da te indicato.

    Nei due punti da te indicati io trovo questo

    public function registerCaptureNotification($amount, $skipFraudDetection = false, $create_invoice = true)
    {
    $this->_generateTransactionId(Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE,
    $this->getAuthorizationTransaction()
    );

    $order = $this->getOrder();
    $amount = (float)$amount;
    $invoice = $this->_getInvoiceForTransactionId($this->getTransactionId());

    // register new capture
    if (!$invoice) {
    $isSameCurrency = $this->_isSameCurrency();
    if ($isSameCurrency && $this->_isCaptureFinal($amount)) {
    $invoice = $order->prepareInvoice()->register();
    $order->addRelatedObject($invoice);
    $this->setCreatedInvoice($invoice);
    } else {
    if (!$skipFraudDetection || !$isSameCurrency) {
    $this->setIsFraudDetected(true);
    }
    $this->_updateTotals(array(‘base_amount_paid_online’ => $amount));
    }
    }

    Puoi aiutarmi a capire come intervenire su questo codice per bloccare l’auto invoice?

    • Daniele
      17 marzo 2015 at 13:09

      Ciao Leo,
      1- che versione di Magento utilizzi?
      2- cosa vedi all’interno del file app/code/core/Mage/Paypal/Model/Ipn.php dentro la funzione _registerPaymentCapture($skipFraudDetection = false) ?

      • Leo
        17 marzo 2015 at 13:47

        Ciao

        scusa hai ragione mi sono dimenticato di dirti che sono su magento 1.9.0.1

        Questo il contenuto del file da te indicato

        protected function _registerPaymentCapture($skipFraudDetection = false)
        {
        if ($this->getRequestData(‘transaction_entity’) == ‘auth’) {
        return;
        }
        $parentTransactionId = $this->getRequestData(‘parent_txn_id’);
        $this->_importPaymentInformation();
        $payment = $this->_order->getPayment();
        $payment->setTransactionId($this->getRequestData(‘txn_id’))
        ->setCurrencyCode($this->getRequestData(‘mc_currency’))
        ->setPreparedMessage($this->_createIpnComment(”))
        ->setParentTransactionId($parentTransactionId)
        ->setShouldCloseParentTransaction(‘Completed’ === $this->getRequestData(‘auth_status’))
        ->setIsTransactionClosed(0)
        ->registerCaptureNotification(
        $this->getRequestData(‘mc_gross’),
        $skipFraudDetection && $parentTransactionId
        );
        $this->_order->save();

        // notify customer
        $invoice = $payment->getCreatedInvoice();
        if ($invoice && !$this->_order->getEmailSent()) {
        $this->_order->sendNewOrderEmail()->addStatusHistoryComment(
        Mage::helper(‘paypal’)->__(‘Notified customer about invoice #%s.’, $invoice->getIncrementId())
        )
        ->setIsCustomerNotified(true)
        ->save();
        }
        }

  2. Daniele
    17 marzo 2015 at 14:36

    Ok. Prova allora a sostituire questa funzione:

    ->registerCaptureNotification(
    $this->getRequestData(‘mc_gross’),
    $skipFraudDetection && $parentTransactionId
    );

    con

    ->registerCaptureNotification(
    $this->getRequestData(‘mc_gross’),
    $skipFraudDetection && $parentTransactionId,
    false
    );

    Fammi sapere se funziona.

    • Leo
      17 marzo 2015 at 14:41

      Ok provo.

      Ma le modifiche al file Payment.php non vanno fatte?

      Ti do conferma al primo ordine che mi fanno pagato con paypal

      Grazie 😉

  3. Daniele
    17 marzo 2015 at 14:49

    Guarda ho visto dal tuo codice che mi hai mandato che nella tua funzione in Payment.php hai già il parametro che stabilisce la creazione della fattura:
    public function registerCaptureNotification($amount, $skipFraudDetection = false, $create_invoice = true)
    Se non dovesse bastare dovresti modificare questa funzione come segue:

    // register new capture
    if (!$invoice && $create_invoice === true) {
    $isSameCurrency = $this->_isSameCurrency();
    if ($isSameCurrency && $this->_isCaptureFinal($amount)) {
    $invoice = $order->prepareInvoice()->register();
    $order->addRelatedObject($invoice);
    $this->setCreatedInvoice($invoice);
    } else {
    if (!$skipFraudDetection || !$isSameCurrency) {
    $this->setIsFraudDetected(true);
    }
    $this->_updateTotals(array(‘base_amount_paid_online’ => $amount));
    }
    }

    • Leo
      17 marzo 2015 at 15:03

      Ok

      ti faccio sapere appena riesco a testarlo con un ordine fittizio

      Grazie mille ancora

  4. Leo
    18 marzo 2015 at 19:17

    Mi ha generato un ordine “fraud suspect” che invece era corretto e non mi ha mandato l’ordine via mail, la fattura però non me la ha generata

    • Daniele
      26 marzo 2015 at 15:38

      Dovresti allora modificare la funzione registerCaptureNotification($amount, $skipFraudDetection = false, $create_invoice = true) come segue:

      // register new capture
      if (!$invoice && $create_invoice === true) {
      $isSameCurrency = $this->_isSameCurrency();
      if ($isSameCurrency && $this->_isCaptureFinal($amount)) {
      $invoice = $order->prepareInvoice()->register();
      $order->addRelatedObject($invoice);
      $this->setCreatedInvoice($invoice);
      } else {
      if (!$skipFraudDetection || !$isSameCurrency) {
      $this->setIsFraudDetected(true);
      }
      $this->_updateTotals(array(‘base_amount_paid_online’ => $amount));
      }
      } else if (!$invoice && $create_invoice === false) {
      $isSameCurrency = $this->_isSameCurrency();
      $this->_updateTotals(array(‘base_amount_paid_online’ => $amount));
      $order->sendNewOrderEmail();
      }

      • 24 febbraio 2016 at 16:19

        Ciao,
        Il mio sito e’ online e non posso effettuare dei test, gli accessi li ha solo il cliente, gira su magento 1.9.2,
        anche io ho riscontrato lo stesso problema, le modifiche descritte nell’utimo commento hanno funzionato ?
        e’ possibile omettere la linea $order->sendNewOrderEmail(); senza avere side effects ?

        Grazie

        • Daniele
          24 febbraio 2016 at 16:30

          Ciao Marco,
          la persona che ha scritto prima (@Leo) non mi ha fatto più sapere niente.
          Sicuramente commentando, o eliminando la riga che dici tu, l’email dell’ordine non viene inviata, ma non avresti effetti contrari.

          • 24 febbraio 2016 at 17:04

            Ciao,
            tu non hai la possibilita’ di fare un test su una versione non ancora online ?

            Grazie

          • Daniele
            24 febbraio 2016 at 17:24

            Ok, provo nei prossimi giorni e ti faccio sapere.
            Per informazione si potrebbe anche provare questa estensione: disable automatic generation of invoice

          • 25 febbraio 2016 at 10:35

            purtroppo l’estensione non funziona con la versione 1.9.2 di magento

  5. 25 febbraio 2016 at 11:18

    ciao, abbiamo fatto le modifiche al file Payment.php e la chiamata nel file Ipn.php ma purtroppo la fattura viene generata ugualmente.

  6. 13 ottobre 2016 at 9:19

    Salve, anche io avrei la necessità di fermare le fatture automatiche con paypal, uso magento 1.9.2 e paypa express checkout qualcuno ha poi trovato la soluzione?
    sembra che su questo argomento abbia soluzioni è così difficile togliere questa funzione?.
    Grazie per l’aiuto.

    • 13 ottobre 2016 at 14:39

      Salve,
      ho messo a punto un’estensione gratuita che disabilita l’auto invoice di Paypal.
      L’estensione è scaricabile a questo indirizzo Auto Invoice Paypal.
      C’è da provarla con Paypal Express e con le versioni più aggiornate di Magento. Fatemi sapere se i test danno esito positivo. Grazie.

      • Andrea
        6 novembre 2016 at 9:35

        Ciao, grazie mille per l’estensione.
        L’ho provata con Magento 1.9 e PayPal Express e purtroppo non funziona.
        Hai qualche suggerimento per fare funzionare l’estensione o per disabilitare l’auto-invoice su PayPal Express?

        • 13 novembre 2016 at 12:20

          Salve,
          noi lo abbiamo provato con Paypal Standard e funziona.

  7. Daniele
    6 marzo 2017 at 19:02

    Ciao, avrei la necessità di bloccare le fatture automatiche di Paypal Express Checkout su Magento 2.
    E’ possibile adattare la tua soluzione?

    Grazie

    • 7 marzo 2017 at 10:51

      No, non è possibile. Hai provato però a impostare come Azione Pagamento: “Autorizzazione” ?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Autorizzo il trattamento dei miei dati personali, ai sensi degli art. 13 e 14 del GDPR - Regolamento UE 2016/679

Inline
Inline

iscriviti alla nostra Newsletter per ottenere sconti e promozioni sui nostri prodotti ed essere sempre aggiornato sulle novità del mondo Magento!