Я играл с соответствующим методом sales_order_invoice.create и столкнулся с той же проблемой, что и вы.Я только что обнаружил, что по какой-то причине мне пришлось вставить дополнительный элемент в массив аргументов, передаваемых на сервер, если я включил комментарий в счет-фактуру.
Я использую Magento EE ver.1.11.0.2 использование C # и библиотеки XML-RPC.Net v2 (CookComputing.XmlRpcV2.dll) для интеграции данных с Magento.
Я наткнулся на это решение, заметив, что комментарий к пустым счетам был «0», которое было значением, которое я указывал для поля Send invoice on email (optional)
, и решил попробовать вставить пустой элемент перед комментарием, и комментарий появился, но по-прежнему не было выставлено счетов.Затем я переместил пустой элемент перед списком элементов, и все заработало.Я проверил код для API /app/code/core/Mage/Sales/Model/Order/Invoice/Api.php, но не смог найти, где и почему это будет иметь место.Я могу только предположить, что это как-то связано с библиотекой, которая разбирает запрос XML-RPC, что-то не так, поскольку этот вызов имеет массив в середине других аргументов.
При попыткедиагностируйте это, я использовал регистратор XML-RPC
logger = new RequestResponseLogger();
logger.Directory = "C:\Temp\";
magentoProxy.AttachLogger(logger);
logger.UnsubscribeFrom(magentoProxy);
Затем в любое время, когда я хочу посмотреть, каковы ответы на запрос на вызов, я просто помещаю эти вызовы до и после вызова XML-RPC
logger.SubscribeTo(magentoProxy);
// call to Magento that I want to see the XML for request and responses to
logger.UnsubscribeFrom(magentoProxy);
Я не видел никаких проблем с XML, который был отправлен в Magento для вызовов API.Единственное, о чем я мог подумать, это запустить magento с подключенным отладчиком и посмотреть, что произойдет, когда он получит этот метод create, в файле Api.php или в стеке ранее, когда что-то испортится, но я этого не сделал.В то время у меня не было настроенной среды разработки для активной отладки кода Magento, и я не хотел тратить время на изучение этого аспекта прямо сейчас.
Что я сделал, чтобы обойти это, так это былопосле вызова добавьте некоторый код, чтобы создать счет-фактуру, который снова извлекает информацию из order_info из Magento и проверяет, выставлены ли все пункты заказа, и если нет, то выдает ужасную ошибку.Я полагаю, что таким образом, если в какой-то момент эта «ошибка» или что-то, из-за чего это происходит, будет исправлена или изменится, я по крайней мере буду знать, влияет ли это на элементы заказа, получающие счета из этого вызова.
// Get the order items that need to be invoiced
// this.orderInfo is the XmlRpcStruct returned from a sales_order.info call
XmlRpcStruct[] orderItems = this.orderInfo.Contains("items") ? (XmlRpcStruct[]) this.orderInfo["items"] : new XmlRpcStruct[] { };
XmlRpcStruct orderItemsToInvoice = new XmlRpcStruct();
Int32 orderItemId;
Int32 qtyOrdered;
Int32 qtyInvoiced;
Int32 qtyToInvoice;
foreach (XmlRpcStruct item in orderItems)
{
orderItemId = item.Contains("item_id") ? Convert.ToInt32(item["item_id"]) : 0;
qtyOrdered = item.Contains("qty_ordered") ? Convert.ToInt32(Convert.ToDecimal(item["qty_ordered"])) : 0;
qtyInvoiced = item.Contains("qty_invoiced") ? Convert.ToInt32(Convert.ToDecimal(item["qty_invoiced"])) : 0;
qtyToInvoice = qtyOrdered - qtyInvoiced;
orderItemsToInvoice[Convert.ToString(orderItemId)] = Convert.ToString(qtyToInvoice);
}
// Invoice This Order with a comment
String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
this.MageIncrementId, // Order increment ID
"", // this should not need to be here, but for some reason if I want to include a comment
// on the invoice I have to thave this extra empty element before the array of order items
// if no comment is included on the invoice this extra element is not needed, rather weird, I can not explain it.
orderItemsToInvoice, // array itemsQty Array of orderItemIdQty (quantity of items to invoice)
"Automatically invoiced prior to CounterPoint import." // Invoice Comment (optional)
//"0", // Send invoice on email (optional) defaults to false
//"0" // Include comments in email (optional) defaults to false
});
// Invoice This Order without a comment
String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
this.MageIncrementId, // Order increment ID
orderItemsToInvoice // array itemsQty Array of orderItemIdQty (quantity of items to invoice)
});