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?

    • 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. 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. 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

    • 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

        • 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

          • 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.

      • 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” ?

Rispondi a Leo Annulla risposta

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

Time limit is exhausted. Please reload CAPTCHA.

Inline

Vuoi rimanere sempre aggiornato sulle ultime novità Magento? Metti Mi piace alla nostra pagina Facebook!

Inline

Vuoi rimanere sempre aggiornato sulle ultime novità Magento? Metti Mi piace alla nostra pagina Facebook!

Inline

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