1

Sage アカウンティングにインポートするために、すべての請求書を特定の形式でエクスポートしようとしています。顧客 ID (不思議なことに利用できません) をエクスポートする必要があるため、Dataflow 経由でエクスポートできませんでした。また、税コードなどを示すいくつかの静的フィールドも…</p>

これにより、API を使用してデータをエクスポートし、CSV に書き込むという選択肢が残りました。私が見つけたサンプル スクリプトを使用し (申し訳ありませんが、クレジットをどこに記載したか思い出せません...)、いくつかの修正を加えて、次のようにしました。

<?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');
}
?> 

これは問題なく動作しているように見えますが、非常に遅く、もっと効率的で良い方法があるに違いないと考えずにはいられません…</p>

誰かアイデアはありますか?

ありがとう

マルク

4

1 に答える 1

0

私は休憩を取ると思います。大丈夫でしょう。order_id を持つキーは 1 つだけなので、order_id キーが見つかった後にループする必要はありません。

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

すべての呼び出しを収集して、例として multicall で呼び出すことができます。

$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);

ソース

于 2012-08-24T15:35:46.860 に答える