Search code examples
odooxml-rpcodoo-8

How to create refund and register payment XML-RPC odoo


How can i create a refund and register payment for that refund in odoo via xml-rpc. The code that i have so far it creates the invoice for refund but it doesn't register any payment for that invoice, so the costumer refund invoice stays in open state even though a voucher is created and posted.

the invoice that is created for the customer refund

voucher for that invoice

        $invoiceData = $OERP->searchread(array(array('id','=',$invoiceId )), 'account.invoice');

        $invoiceDatas = array();
        foreach($invoiceData as $data)
        {
            $invoiceDatas["amount_total"] = $data["amount_total"];
            $invoiceDatas["partner_id"] = $data["partner_id"];
            $invoiceDatas["account_id"] = $data["account_id"];
            $invoiceDatas["invoice_line"] = $data["invoice_line"];
            $invoiceDatas["reference"] = $data["reference"];
            $invoiceDatas["period_id"] = $data["period_id"];

        }

        $invoiceLineData = $OERP->searchread(array(array('invoice_id','=', intval($invoiceId) )), 'account.invoice.line');

        foreach($invoiceLineData as $data)
        {
            $invoiceLine["product_id"] = $data["product_id"];
            $invoiceLine["price_unit"] = $data["price_unit"];
        }

        $createRefundParams = array(
            'date_invoice' => date('Y/m/d'),
            'partner_id' => $invoiceDatas["partner_id"][0],
            'journal_id' => 3,// $journalId,
            'account_id' => $invoiceDatas["account_id"][0],
            'name'=>'front end refundi',
            'type'=>'out_refund' // dallon invoicen nga refund
        );

        $createRefund = $OERP->create($createRefundParams, 'account.invoice');

        $invoiceProduct = array(
            'invoice_id'=>$createRefund,
            'product_id'=>$invoiceLine["product_id"][0],
            'name'=>'refund',
            'price_unit'=>$invoiceLine["price_unit"],
        );

        $createRefundLines = $OERP->create($invoiceProduct,"account.invoice.line");
        $validateRefund =  $OERP->workflow('account.invoice', 'invoice_open', $createRefund);


        $amount_total = -$invoiceDatas['amount_total'];

        $newInvoice = $OERP -> searchread(array(array('id','=',$createRefund)),'account.invoice' );
        $moveId = array();
        foreach($newInvoice as $data)
        {
            $moveId["move_id"] = $data["move_id"];
        }
        $createVoucher = array(
            'date' => date('Y/m/d'),
            'partner_id' => $invoiceDatas['partner_id'][0],
            'amount' =>$amount_total ,
            'journal_id' => 7,// $journalId,
            'account_id' => 25,
            'period_id' => $invoiceDatas['period_id'][0],
            'type' => 'receipt'
        );
        $voucherResult = $OERP->create($createVoucher, 'account.voucher');

        $invoice_object_line = $OERP->searchread(array(array('move_id', '=', $moveId["move_id"][0])), 'account.move.line');

        $voucherLineItems = array(
            'journal_id' => 7,// $journalId,
            'period_id' => $invoiceDatas['period_id'][0],
            'date' => date('Y/m/d'),
            'date_due' => date('Y/m/d'),
            'name' => 'Payment for refund',
            'payment_option' => 'without_writeoff',
            'amount_original' => -$amount_total,
//            'amount'=>-$amount_total,
            'amount_unreconciled' => -$amount_total,
            'voucher_id' => $voucherResult,//$voucher_id,
            'partner_id' => $invoiceDatas['partner_id'][0],
            'account_id' => $invoiceDatas['account_id'][0],
            'move_line_id' => $invoice_object_line[0]["id"],
            'type' => 'cr'
        );
        $createVoucherLine = $OERP->create($voucherLineItems, 'account.voucher.line');

        $performa_voucher_result = $OERP->workflow('account.voucher', 'proforma_voucher', intval($voucherResult));

        $invoiceMovId = $OERP->searchread(array(array('id','=',$createRefund)),'account.invoice' );

        $button_validate_result = $OERP->button_click('account.move', 'button_validate', $invoiceMovId[0]["move_id"][0]);

Solution

  • I figured it out the answer to create an invoice refund here is the code if it helps anyone

          $invoiceId = $_REQUEST["invoiceID"];
    
                $OERP = new OpenERP();
                $OERPUserID = $OERP->login($_SESSION['OERP-username'], $_SESSION['OERP-password']);
    
    
                $invoiceData = $OERP->searchread(array(array('id','=',$invoiceId )), 'account.invoice');
    
                $invoiceDatas = array();
                foreach($invoiceData as $data)
                {
                    $invoiceDatas["amount_total"] = $data["amount_total"];
                    $invoiceDatas["partner_id"] = $data["partner_id"];
                    $invoiceDatas["account_id"] = $data["account_id"];
                    $invoiceDatas["invoice_line"] = $data["invoice_line"];
                    $invoiceDatas["reference"] = $data["reference"];
                    $invoiceDatas["period_id"] = $data["period_id"];
                }
                $invoiceLineData = $OERP->searchread(array(array('invoice_id','=', intval($invoiceId) )), 'account.invoice.line');
    
                foreach($invoiceLineData as $data)
                {
                    $invoiceLine["product_id"] = $data["product_id"];
                    $invoiceLine["price_unit"] = $data["price_unit"];
                }
    
                //create Refund
                $createRefundParams = array(
                    'date_invoice' => date('Y/m/d'),
                    'partner_id' => $invoiceDatas["partner_id"][0],
                    'journal_id' => 3,// $journalId,
                    'account_id' => $invoiceDatas["account_id"][0],
        //            'reference'=>$invoiceDatas["reference"],
                    'name'=>'front end refundi',
                    'type'=>'out_refund' // dallon invoicen nga refund
                );
    
                $createRefund = $OERP->create($createRefundParams, 'account.invoice');
    
                $invoiceProduct = array(
                    'invoice_id'=>$createRefund,
                    'product_id'=>$invoiceLine["product_id"][0],
                    'name'=>'refund',//$invoiceLine["product_id"][1],
                    'account_id'=>19,
                    'price_unit'=>$invoiceLine["price_unit"]
                );
    
                $createRefundLines = $OERP->create($invoiceProduct,"account.invoice.line");
                $validateRefund =  $OERP->workflow('account.invoice', 'invoice_open', $createRefund);
    
    
                //================ Payments ===========================
                $amount_total = -$invoiceDatas['amount_total'];
    
                $newInvoice = $OERP -> searchread(array(array('id','=',$createRefund)),'account.invoice' );
                $moveId = array();
                foreach($newInvoice as $data)
                {
                    $moveId["move_id"] = $data["move_id"];
                }
                $createVoucher = array(
                    'date' => date('Y/m/d'),
                    'partner_id' => $invoiceDatas['partner_id'][0],
                    'amount' =>$amount_total ,
                    'journal_id' => 7,// $journalId,
                    'account_id' => 25,
                    'period_id' => $invoiceDatas['period_id'][0],
                    'type' => 'receipt'
                );
        //        $createRefund
                $voucherResult = $OERP->create($createVoucher, 'account.voucher');
    
                $invoice_object_line = $OERP->searchread(array(array('move_id', '=', $moveId["move_id"][0])), 'account.move.line');
    
                $voucherLineItems = array(
    //notice that amount values are positive since there is an extra minus in variable intialization
                    'journal_id' => 7,// $journalId,
                    'period_id' => $invoiceDatas['period_id'][0],
                    'date' => date('Y/m/d'),
                    'date_due' => date('Y/m/d'),
                    'name' => 'Payment for refund',
                    'payment_option' => 'without_writeoff',
                    'amount_original' => -$amount_total,
                    'amount'=>-$amount_total,
                    'amount_unreconciled' => -$amount_total,
                    'voucher_id' => $voucherResult,//$voucher_id,
                    'partner_id' => $invoiceDatas['partner_id'][0],
                    'account_id' => $invoiceDatas['account_id'][0],
                    'move_line_id' => $invoice_object_line[0]["id"],
                    'type' => 'dr'
                );
    
    
                $createVoucherLine = $OERP->create($voucherLineItems, 'account.voucher.line');
    
                $performa_voucher_result = $OERP->workflow('account.voucher', 'proforma_voucher', intval($voucherResult));
    
    
                $invoiceMovId = $OERP->searchread(array(array('id','=',$createRefund)),'account.invoice' );
    
    
                $button_validate_result = $OERP->button_click('account.move', 'button_validate', $invoiceMovId[0]["move_id"][0]);