You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用langleyfoxall/xero-laravel 3.0.0向Xero传递采购单附件

在Laravel中使用langleyfoxall/xero-laravel 3.0.0向Xero采购订单添加附件的解决方案

问题描述

我在Laravel项目中使用langleyfoxall/xero-laravel 3.0.0版本包,在向Xero传递采购订单附件时遇到困难。当前调用代码如下:

$this->xero->PurcheseOrder([
    'lead' => $user,
    //'description' => isset($value['description']) ? $value['description'] :'',
    //'discount' => isset($value['discount']) ? $value['discount'] :'',
    //'tax_rate' => isset($value['tax_rate']) ? $value['tax_rate'] :'',
    'lead' => $user,
    'orders' => $updated_medicine,
    'delivery_date' => isset($input['delivery_date']) ? \Carbon\Carbon::parse($input['delivery_date'])  : null,
    'created_at' => $purchase_order->created_at,
    'purchase_order_id' => $purchase_order->id,
    'referance' => $purchase_order->referance ,    
    'note' => $purchase_order->note,    
]);

对应的PurcheseOrder函数实现:

public function PurcheseOrder($order)
{
    if(empty($order['lead']->xero_id)){
        $lead = $this->saveUserXero($order['lead']);
        $contact = $this->xero->loadByGUID(\XeroPHP\Models\Accounting\Contact::class,$lead->xero_id);
    }
    else{
        $contact = $this->xero->loadByGUID(\XeroPHP\Models\Accounting\Contact::class,$order['lead']->xero_id);
    }
    $purchese_order = new PurchaseOrder($this->xero);
    
    $purchese_order->setContact($contact);
    $purchese_order->setStatus(\XeroPHP\Models\Accounting\Invoice::INVOICE_STATUS_SUBMITTED);
    $purchese_order->setReference($order['referance']);

    $trackingCategory = new \XeroPHP\Models\Accounting\TrackingCategory($this->xero);
    $trackingCategory->setName('Deals');

    if(isset($order['note'])){
        $purchese_order->setDeliveryAddress($order['note']);
    }

    if($order['delivery_date'] != null){
        $purchese_order->setDeliveryDate($order['delivery_date']);
    }
    foreach ($order['orders'] as $ord) {
        
        $lineItem = new \XeroPHP\Models\Accounting\LineItem($this->xero);
        if(isset($ord['item_code'])){
            $lineItem->setItemCode($ord['item_code']);
        }
        $lineItem->setDescription($ord['description']);
        $lineItem->setQuantity($ord['quantity'] + $ord['free_of_goods']);
        $lineItem->setUnitAmount(($ord['amount'] * ((100 -$ord['discount'])/100)) /($ord['quantity'] + $ord['free_of_goods']));
        $lineItem->setAccountCode($ord['account']);
        if(isset($ord['item_code']) && $ord['discount'] != 0){
            //$lineItem->setDiscountAmount($ord['discount']);
        }
            if(isset($ord['deals'])){
                $trackingCategory->setOption($ord['deals']);
            }
            $lineItem->addTracking($trackingCategory);
            $purchese_order->addLineItem($lineItem);
        }

        $purchese_order->save();
        $pur_ord = AppPurchaseOrder::find($order['purchase_order_id']);
        $pur_ord->xero_id = $purchese_order->PurchaseOrderID;
        $pur_ord->order_status = 2;
        $pur_ord->po_number = $purchese_order->PurchaseOrderNumber;
        $pur_ord->save();
}

调用该函数时出现报错,如何通过这个包给Xero的采购订单添加附件?

解决方案

步骤1:修改调用参数,传入附件信息

在调用PurcheseOrder方法时,新增附件相关参数,包含文件路径、文件名和MIME类型:

$this->xero->PurcheseOrder([
    'lead' => $user,
    'orders' => $updated_medicine,
    'delivery_date' => isset($input['delivery_date']) ? \Carbon\Carbon::parse($input['delivery_date'])  : null,
    'purchase_order_id' => $purchase_order->id,
    'referance' => $purchase_order->referance ,    
    'note' => $purchase_order->note,
    // 添加附件参数
    'attachment' => [
        'file_path' => storage_path('app/purchase_orders/'.$purchase_order->id.'.pdf'),
        'file_name' => 'PO-'.$purchase_order->id.'.pdf',
        'mime_type' => 'application/pdf'
    ]
]);

步骤2:修改PurcheseOrder函数,添加附件上传逻辑

采购订单保存成功后,利用XeroPHP的Attachment模型上传附件,需确保先拿到Xero返回的采购订单ID:

public function PurcheseOrder($order)
{
    if(empty($order['lead']->xero_id)){
        $lead = $this->saveUserXero($order['lead']);
        $contact = $this->xero->loadByGUID(\XeroPHP\Models\Accounting\Contact::class,$lead->xero_id);
    }
    else{
        $contact = $this->xero->loadByGUID(\XeroPHP\Models\Accounting\Contact::class,$order['lead']->xero_id);
    }
    $purchese_order = new PurchaseOrder($this->xero);
    
    $purchese_order->setContact($contact);
    $purchese_order->setStatus(\XeroPHP\Models\Accounting\Invoice::INVOICE_STATUS_SUBMITTED);
    $purchese_order->setReference($order['referance']);

    $trackingCategory = new \XeroPHP\Models\Accounting\TrackingCategory($this->xero);
    $trackingCategory->setName('Deals');

    if(isset($order['note'])){
        $purchese_order->setDeliveryAddress($order['note']);
    }

    if($order['delivery_date'] != null){
        $purchese_order->setDeliveryDate($order['delivery_date']);
    }
    foreach ($order['orders'] as $ord) {
        
        $lineItem = new \XeroPHP\Models\Accounting\LineItem($this->xero);
        if(isset($ord['item_code'])){
            $lineItem->setItemCode($ord['item_code']);
        }
        $lineItem->setDescription($ord['description']);
        $lineItem->setQuantity($ord['quantity'] + $ord['free_of_goods']);
        $lineItem->setUnitAmount(($ord['amount'] * ((100 -$ord['discount'])/100)) /($ord['quantity'] + $ord['free_of_goods']));
        $lineItem->setAccountCode($ord['account']);
        if(isset($ord['item_code']) && $ord['discount'] != 0){
            //$lineItem->setDiscountAmount($ord['discount']);
        }
            if(isset($ord['deals'])){
                $trackingCategory->setOption($ord['deals']);
            }
            $lineItem->addTracking($trackingCategory);
            $purchese_order->addLineItem($lineItem);
        }

        $purchese_order->save();
        $pur_ord = AppPurchaseOrder::find($order['purchase_order_id']);
        $pur_ord->xero_id = $purchese_order->PurchaseOrderID;
        $pur_ord->order_status = 2;
        $pur_ord->po_number = $purchese_order->PurchaseOrderNumber;
        $pur_ord->save();

        // 新增附件上传逻辑
        if(isset($order['attachment'])){
            $attachment = new \XeroPHP\Models\Accounting\Attachment($this->xero);
            $attachment->setFileName($order['attachment']['file_name']);
            $attachment->setMimeType($order['attachment']['mime_type']);
            $attachment->setContent(file_get_contents($order['attachment']['file_path']));
            
            // 将附件关联到采购订单
            $purchese_order->attachAttachment($attachment);
        }
}

注意事项

  • 确保文件路径正确,且Laravel拥有该文件的读取权限
  • Xero对附件大小有限制(最大5MB),需保证上传文件符合要求
  • 若需上传多个附件,可将attachment参数改为数组,循环处理每个附件

内容的提问来源于stack exchange,提问作者ilham zacky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:07:01