如何用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
相关产品推荐
相关产品推荐

