Exporting Invoices from Magento

2.2k views Asked by At

I have been trying to export all of our invoices in a specific format for importing into Sage accounting. I have been unable to export via Dataflow as I need to export the customer ID (which strangely is unavailable) and also a couple of static fields to denote tax codes etc…

This has left me with the option of using the API to export the data and write it to a CSV. I have taken an example script I found (sorry can’t remember where in order to credit it...) and made some amendments and have come up with the following:

<?php
    $website = 'www.example.com';
    $api_login = 'user';
    $api_key ='password';

function magento_soap_array($website,$api_login,$api_key,$list_type,$extra_info){
$proxy = new SoapClient('http://'.$website.'/api/soap/?wsdl');
$sessionId = $proxy->login($api_login, $api_key);

$results = $proxy->call($sessionId,$list_type,1);

if($list_type == 'order_invoice.list'){
    /***  INVOICES CSV EXPORT START ***/
    $filename = "invoices.csv";
    $data = "Type,Account Reference,Nominal A/C Ref,Date,Invoice No,Net Amount,Tax Code,Tax Amount\n";
    foreach($results as $invoice){
        foreach($invoice as $entry => $value){
            if ($entry == "order_id"){
                $orders = $proxy->call($sessionId,'sales_order.list',$value);
            }
        }
        $type = "SI";
        $nominal = "4600";
            $format = 'Y-m-d H:i:s';
            $date = DateTime::createFromFormat($format, $invoice['created_at']);
        $invoicedOn = $date->format('d/m/Y');
        $invoiceNo = $invoice['increment_id'];
            $subtotal = $invoice['base_subtotal'];
            $shipping = $invoice['base_shipping_amount'];
        $net = $subtotal+$shipping;
        $taxCode = "T1";
        $taxAmount = $invoice['tax_amount'];

        $orderNumber = $invoice['order_id'];
        foreach($orders as $order){
            if ($order['order_id'] == $orderNumber){
                $accRef = $order['customer_id'];
            }    
        }
        $data .= "$type,$accRef,$nominal,$invoicedOn,$invoiceNo,$net,$taxCode,$taxAmount\n";
    }
    file_put_contents($_SERVER['DOCUMENT_ROOT']."/var/export/" . $filename, "$header\n$data");

    /***  INVOICES CSV EXPORT END ***/    
}else{
        echo "nothing to see here";
    }/***  GENERIC PAGES END ***/
}/*** END function magento_soap_array ***/

if($_GET['p']=="1")
{
magento_soap_array($website,$api_login,$api_key,'customer.list','Customer List');
}
else if($_GET['p']=="2")
{
magento_soap_array($website,$api_login,$api_key,'order_creditmemo.list','Credit Note List');
}
else if($_GET['p']=="3")
{
magento_soap_array($website,$api_login,$api_key,'sales_order.list','Orders List');
}
else if($_GET['p']=="4")
{
magento_soap_array($website,$api_login,$api_key,'order_invoice.list','Invoice List');
}
?> 

This seems to be working fine, however it is VERY slow and I can’t help but think there must be a better, more efficient way of doing it…

Has anybody got any ideas?

Thanks

Marc

1

There are 1 answers

0
Josua Marcel C On

i think on put break; would be okey. because only one key with order_id, no need to looping after found order_id key.

if ($entry == "order_id"){
    $orders = $proxy->call($sessionId,'sales_order.list',$value);
    break;
}

and you can gather all call(s) and call it with multicall as example:

$client = new SoapClient('http://magentohost/soap/api/?wsdl');

// If somestuff requires api authentification,
// then get a session token
$session = $client->login('apiUser', 'apiKey');

$result = $client->call($session, 'somestuff.method');
$result = $client->call($session, 'somestuff.method', 'arg1');
$result = $client->call($session, 'somestuff.method', array('arg1', 'arg2', 'arg3'));
$result = $client->multiCall($session, array(
     array('somestuff.method'),
     array('somestuff.method', 'arg1'),
     array('somestuff.method', array('arg1', 'arg2'))
));


// If you don't need the session anymore
$client->endSession($session);

source