Изменение метода отправки при выполнении в SuiteScript

#javascript #suitescript

#javascript #suitescript

Вопрос:

Итак, у нас есть ситуация, когда для заказа создается выполнение, а внешняя компания фактически обрабатывает выполнение и доставку заказа. Данные экспортируются в них, а для выполненных заказов эта информация импортируется обратно. Иногда, однако, используется другой перевозчик, чем тот, который ожидался людьми, создающими первоначальные заказы, поэтому перевозчик должен быть изменен. Однако при использовании SuiteScript NetSuite может быть немного неумолимым, если вам нужно изменить методы доставки. В зависимости от того, что необходимо изменить, вы можете столкнуться со следующей ошибкой:

Ошибка: Переключение метода доставки на другого перевозчика является неподдерживаемой операцией, поскольку для этого требуется перезагрузить форму выполнения товара для этого перевозчика.

По моему опыту, это означает необходимость удаления выполнения, изменения параметров доставки в заказе (что может испортить существующие расчеты затрат), а затем создания нового выполнения. Этот маршрут нежелателен, поскольку он прерывает цепочку данных со сторонним хранилищем. Этот метод также необходим, поскольку система третьей стороны не допускает обратных заказов, и попытка управлять отправкой данных о том, что может быть выполнено из заказа до создания выполнения, оказалась кошмаром.

Например, эта проблема возникает из-за того, что принимающий заказ предполагает, что перевозчиком будет UPS, а методом — UPS Freight. Реальность может заключаться в том, что вместо этого перевозчиком будет, возможно, YRC или Old Dominion, для которых требуется другая структура записи. Но также нельзя предполагать, что это не будет перевозка UPS, поскольку она также используется сторонним складом. Они выбирают разных перевозчиков, исходя из наименьшей стоимости доставки до пункта назначения. Я думаю, что все сводится к тому, как NetSuite управляет чем-то вроде трех или четырех разных подсписков пакетов на основе метода carrier / ship. Когда вы внесете изменение через пользовательский интерфейс, оно перезагрузит выполнение с необходимыми изменениями, и вы сможете перейти оттуда.

Для тех, кому нужен пример кода, на данный момент это лучший пример, который я могу предоставить, который завершится неудачей, если NetSuite определит, что для изменения требуется другой подсписок пакета:

 var recId = 1234;
var shipMethod = 5678;
var ifRec = nlapiLoadRecord("itemfulfillment", recId, { recordmode : "dynamic" });
ifRec.setFieldValue("shipcarrier", "nonups");
ifRec.setFieldValue("shipmethod", shipMethod);
nlapiSubmitRecord(ifRec);
  

Я предположил, что, возможно, это можно было бы сделать с помощью значения инициализации при загрузке выполнения, но, похоже, ничто из того, что я пробовал, не разрешено в качестве значения инициализации. Мои попытки включали следующие параметры:

  • форма носителя
  • перевозчик
  • shipmethod
  • nsi (отображается в URL-адресе при изменении перевозчика / метода отправки в пользовательском интерфейсе)

Ответ №1:

Я случайно нашел ответ на свою проблему…

 nlapiSubmitField("itemfulfillment", fulfillmentId,
    ["carrierform", "shipcarrier", "shipmethod"],
    ["ns", "nonups", shipMethod]
);
  

Значения, передаваемые для «carrierform» и «shipcarrier», различаются в зависимости от целевого метода отправки. Учитывая, что NetSuite имеет разную «форму» в зависимости от того, является ли перевозчик UPS, FedEx, USPS или другим, в зависимости от того, какой подсписк упаковки фактически будет доступен в записи о выполнении товара, значение «carrierform» необходимо будет найти. Я знаю только, что значение равно «ups» для доставки UPS и «ns» для другой доставки. Я еще не нашел значения для того, когда используются подсписки упаковки FedEx или USPS.

Ответ №2:

Я столкнулся с той же проблемой, но я использовал Suitescript 2.0 и должен был загрузить запись по другим причинам и обнаружил, что пока вы устанавливаете эти поля, вы не получите ошибку, и вы можете установить shipmethod на то, что вам нравится. Мой код выглядел примерно так…

         ifRec.setValue({ fieldId: 'carrierform', value: carrierForm, ignoreFieldChange: false });

        ifRec.setValue({ fieldId: 'shipcarrier', value: shipCarrier, ignoreFieldChange: false });

        ifRec.setValue({ fieldId: 'shipmethod', value: shipMethod, ignoreFieldChange: false });

        ifId = ifRec.save({ enableSourcing: true, ignoreMandatoryFields: true });
  

Это прекрасно работает.

Кроме того, получить значение для поля carrierform не сложно. Все, что вам нужно сделать, это:

  1. Откройте запись выполнения товара в режиме редактирования.

  2. Откройте консоль инструментов разработчика в окне (f12)

  3. В раскрывающемся списке Способ доставки при выполнении товара выберите нужный способ доставки

  4. В окне консоли введите nlapiGetFieldValue(‘carrierform’);

  5. Нажмите enter, и вот оно!

  6. Вы также можете получить внутренние идентификаторы полей для двух других полей также таким образом