Netsuite настроить сводку транзакций NetSuite - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь выяснить, как изменить сводку транзакций в пользовательском интерфейсе заказа на продажу. Я проводил некоторые исследования и у меня сложилось впечатление, что мне нужно создать сценарий пользовательских событий (?)

Например: я хочу добавить больше деталей, таких как разметка / стоимость фрахта / et c .

Я очень новичок в этом, но, пожалуйста, дайте мне знать, если я иду в правильном направлении.

/**
 * @NApiVersion 2.0
 * @NScriptType UserEventScript
 */

define([], function() {

    return {
        afterSubmit : function (context) {

            var salesorder = context.newRecord;
            var total = salesorder.getValue('total');
            var subtotal = salesorder.getValue('subtotal');

            var tbl = document.getElementById("totallingtable");


            log.debug('total', total);
            log.debug('subtotal', subtotal);


        }
    };
});

1 Ответ

0 голосов
/ 06 апреля 2020

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

  1. Создание поля HTML в записи заказа на продажу и запись HTML / CSS в mimi c поле Сводка транзакции. Вероятно, было бы лучше поместить его в свою собственную вложенную вкладку; что-то вроде «Сведения о транзакции» и запишите в него с помощью клиентского скрипта на pageInit().

  2. Добавьте кнопку в запись заказа клиента в пользовательском событии beforeLoad(). Пусть эта кнопка откроет Suitelet, который по сути имитирует всплывающее окно с HTML / CSS, чтобы имитировать c Сводку транзакций, как указано в примере 1.

Если подумать, я думаю, Второй вариант лучше.

Если вам нужна дополнительная помощь, пожалуйста, оставьте комментарий, и я буду рад помочь. У меня нет проблем с пошаговым просмотром кода, даже если ребенок делает это.

РЕДАКТИРОВАТЬ:

Исходя из приведенного ниже разговора, второй вариант кажется более подходящим для потребностей вашего бизнеса.

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

"SuiteScript не поддерживает прямой доступ к пользовательскому интерфейсу NetSuite через объектную модель документа ( DOM. Доступ к пользовательскому интерфейсу NetSuite возможен только с помощью API-интерфейсов SuiteScript. "

Справочная документация по NetSuite: пользовательские страницы SuiteScript 2.0

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

Во-первых, если вы чего-то не понимаете, не стесняйтесь задавать вопросы. Единственный глупый вопрос - тот, который вы не задаете в любое время, даже если вы задаете вопросы в i-й раз, это фундаментальная часть изучения чего-либо. Во-вторых, принимать решения по кодированию звука. У меня нет возможности узнать, является ли этот код именно тем, что вам нужно, тем более что я не знаю ваш бизнес или настройку вашей учетной записи. Но я уверен, что сделаю все возможное, чтобы помочь в духе помощи.

С учетом сказанного, для этого примера выполните следующие действия по порядку. Как только вы это освоите, вы можете работать с нюансами так, как считаете нужным. Я не буду обсуждать здесь какие-либо нюансы. Я бы sh мог бы, но это все равно, что объяснять, как ездить на велосипеде. Здесь мы go!

  1. Создаем подпапку в папке SuiteScripts под названием «Transaction_Details» (обязательно используйте подчеркивание). Мы собираемся загрузить все сюда, чтобы все было в одной папке под той папкой, в которой нам это нужно для запуска скриптов (это папка SuiteScripts). Из роли администратора это:

    • Документы> Файлы> SuiteScripts> Добавить папку
  2. Создайте файл HTML, который отображает, что вы ищу когда открывается на localhost. Назовите этот файл «Transaction_Details. html». NetSuite по умолчанию будет использовать это имя файла позже, и мы собираемся использовать его несколько раз в нашем примере. Так что не называйте файл как-нибудь иначе. Вы можете протестировать файл в нескольких браузерах, особенно если вы поддерживаете Inte rnet Explorer. Поскольку мы пытаемся имитировать c Сводка транзакций, давайте сделаем это нашей целью. Для меня это выглядит как таблица с некоторыми CSS, чтобы выделить ее. Сводка по транзакциям также является родным термином NetSuite, поэтому мы будем называть это «Детали транзакции». Таким образом, когда кто-то говорит: «Я не вижу его в Сводке транзакций», вы можете сказать «Нажмите кнопку« Детали транзакции », которая отображает больше деталей, чем сводку». Мы хотим передать в это число HTML некоторые числа, которые относятся к нашим «деталям». Нам на самом деле не нужен синтаксис, чтобы сделать это, но он может улучшить нашу читабельность, если мы, вроде как, предупреждаем себя, что все, что предполагается в этом месте go, помечено каким-то образом. Итак, мы произвольно пометим это как [VARIABLE_TO_REPLACE]. Ниже приведен пример файла, с которого можно начать. Когда у вас есть файл, который вам нравится, загрузите его в подпапку «Transaction_Details». Из роли администратора это:

    • Документы> Файлы> SuiteScripts> Transaction_Details> Добавить файл
    • Выберите Transaction_Details. html на вашем компьютере и установите в папке SuiteScripts: Transaction_Details
<!DOCTYPE html>
<html>
    <head>
        <title>Transaction Details</title>
        <style>
          <!--Any CSS you might need; background color, bold, etc.-->
        </style>
    </head>
    <body>
        <table>
        <tr>
          <td>Gross</td>
          <td>[GROSS]</td>
        </tr>
        <tr>
          <td>Discount</td>
          <td>[DISCOUNT]</td>
        </tr>
        <tr>
          <td>Variable To Replace</td>
          <td>[VARIABLE_TO_REPLACE]</td>
        </tr>
        <!--Rinse and repeat-->
        </table>
    </body>
</html>

Создайте сохраненный поиск с любой необходимой вам информацией. Давайте присвоим названию сохраненного поиска «Детали транзакции» и присвоим ему идентификатор «_transaction_details». Вам может понадобиться более одного сохраненного поиска, чтобы получить все. Но во многих ситуациях вы можете получить данные в одном сохраненном поиске. В большинстве случаев это делается с помощью SQL. К сожалению, я не знаю всего, что вам нужно здесь, поэтому я должен оставить большую часть этого шага до вас; здесь много нюансов. Однако следует учитывать, что для фильтрации результатов следует использовать фильтр, который относится только к внутреннему идентификатору записи. Это обеспечит вам поиск только информации в записи. В сохраненном поиске вы можете выбрать любой внутренний идентификатор соответствующей записи (скорее всего, заказ на продажу) и протестировать его. Как только ваши результаты будут такими, какими они вам нравятся, удалите фильтр внутренних идентификаторов, так как мы будем динамически выводить это sh как объект в нашем Suitelet (в шаге 4). В конце концов вам нужно будет предоставить доступ к сохраненному поиску. Доступ контролируется в самом сохраненном поиске с использованием таких элементов, как вложенная вкладка «Аудитория» и флажок «Publi c». Вы будете знать, какой доступ лучше всего подходит для вашего бизнеса. Но обратите внимание, что для того, чтобы любой, кто видит детали транзакции, которую мы создаем, ему, по крайней мере, потребуется доступ к поиску. Права доступа - это совсем другое с NetSuite; Нюансы. Чтобы создать сохраненный поиск из роли администратора, выполните следующие действия:

  • Список> Поиск> Сохраненные поиски> Создать> Транзакция

Предупреждение: это большой шаг, но на самом деле это все один шаг . Создайте Suitelet, который загружает наш файл HTML и заменяет текст нашего заполнителя соответствующим текстом для этого заполнителя. Назовите этот файл «Transaction_Details_Suitelet. js». Мы заменим текст, выполнив созданный нами сохраненный поиск с помощью фильтра внутренних идентификаторов, который указывает на нашу транзакцию и фильтрует данные, облегчая извлечение. Теперь я предполагаю, что нам нужны данные только в одном ряду результатов. Если есть более одной строки, это нормально, но вам придется самостоятельно отформатировать или сделать скриншот ваших результатов, чтобы я мог снова отредактировать свой ответ. Ниже приведен пример, с которого можно начать. Это займет некоторую конфигурацию, поэтому лучше всего добавить что-то в NetSuite, которое, по крайней мере, проходит проверку кода (что делается при попытке загрузить файл). Как только он загружен, вы можете открыть URL-адрес сценария из его развертывания сценариев, который, если он не содержит ошибок, отобразит HTML, который мы написали на шаге 2. Если это не так, и вы разочарованы, просто загрузите скрипт, как показано в примере 1 ниже. Все, что говорит пример 1: «render my HTML», при условии, что ваш HTML правильно отформатирован. Если это работает, вы знаете, что «Transaction_Details. html» - это хорошо, поэтому вы можете перейти к примеру 2. Если пример 2 не работает, скорее всего, это «Transaction_Details_Suitelet. js». Чтобы загрузить Suitelet из роли администратора, это:

  • Настройка> Сценарии> Сценарии> Создать> Выбрать Transaction_Details_Suitelet. js с вашего компьютера
  • Установите для папки значение SuiteScripts: Transaction_Details
  • Теперь произойдет некоторая проверка ошибок.
  • Если он пройден, назовите его «Сведения о транзакции Suitelet» и присвойте ему идентификатор «_transaction_details_sl» (sl - сокращение от Suitelet)
  • Нажмите на вложенную вкладку «Развертывания» и назовите «Развертывание» Suitelet Сведения о транзакции ». Дайте ему идентификатор "_transaction_details_sl".

Таким образом, сценарий и его развертывание должны имитировать c друг друга в своих именах. Это будет важно на следующем шаге

Пример 1:

/**
 * @NScriptType Suitelet
 * @NApiVersion 2.x
 */
define(["N/file"], function(file) {
  function onRequest(context) {
    if (context.request.method === "GET") {
      var fileTransactionDetails = file.load({
        id: "/SuiteScripts/Transaction_Details/Transaction_Details.html"
      }).getContents();

      //Tell NetSuite to take the HTML in our "Transaction_Details.html" file and render that. We'll navigate to the Suitelet which renders our HTML file in step 5.
      context.response.write(fileTransactionDetails);
    }
  }

  return {onRequest: onRequest}
})

Пример 2

/**
 * @NScriptType Suitelet
 * @NApiVersion 2.x
 */
define(["N/file"], function(file) {
  function onRequest(context) {
    if (context.request.method === "GET") {
      var fileTransactionDetails = file.load({
        id: "/SuiteScripts/Transaction_Details/Transaction_Details.html"
      }).getContents();

      var searchTransactionDetails = search.load({
        id: "customsearch_transaction_details"
      });

      searchTransactionDetails.filters.push(search.createFilter({
        name: "internalid",
        operator: search.Operator.EQUALTO,
        value: context.request.params.id
      }));

      var resultsTransactionDetails = searchTransactionDetails.run();

      resultsTransactionDetails.each(function(result) {
        // getText, if you need the text representation
        fileTransactionDetails = fileTransactionDetails.replace("[GROSS]", result.getText(resultsTransactionDetails.columns[0]);

        // getValue, if you need something that is a date, a SQL formula result, or something "behind the scenes" like the Internal ID of an element in a list/record.
        fileTransactionDetails = fileTransactionDetails.replace("[GROSS]", result.getValue(resultsTransactionDetails.columns[0]);

        // I'm intentionally commenting this line out, but if you had more than one row to consider, you would return true, which tells the search, "go to the next row". For now, don't do that.
        //return true;
      });

      //Tell NetSuite to take the HTML in our "Transaction_Details.html" file and render that. We'll navigate to the Suitelet which renders our HTML file in step 5.
      context.response.write(fileTransactionDetails);
    }
  }

  return {onRequest: onRequest}
})
Создайте сценарий пользовательского события, который помещает кнопку в транзакции, в beforeLoad, только в режиме просмотра, который открывает наш Suitelet на шаге 4, где шаг 4 запускает наш поиск на шаге 3, заменяет текст в нашем HTML файл из шага 2, и отображает все это (извините за длинное предложение. но это действительно одно краткое изложение всего предложения в любом случае). Здесь очень важное замечание: лучше всего включать кнопки только в режиме просмотра, чтобы вы могли гарантировать, что все необходимые данные записываются в базу данных.

Мы ' Вам нужно будет загрузить сценарий пользовательского события и указать, чтобы кнопка отображалась только в записях, выбранных на вкладке «Развертывание пользовательского события». Давайте пока предположим, что это заказ на продажу. Из роли администратора это:

  • Настройка> Сценарии> Сценарии> Создать> Выберите Transaction_Details_User_Event. js на вашем компьютере и установите для папки значение SuiteScripts: Transaction_Details
  • Проверка некоторых ошибок теперь происходит.
  • Если он пройден, назовите его «Transaction Details User Event» и присвойте ему идентификатор «_transaction_details_ue» (ue - сокращение от User Event).
  • Выберите вкладку Deployments > Применяется к> Заказу на продажу и присваивает этому идентификатору значение «_so_transaction_details_ue», что напоминает высказывание «Это развертывание заказа на продажу для деталей транзакции на стороне пользовательского события».
/**
 * @NScriptType UserEventScript
 * @NApiVersion 2.x
 */

define(["N/url"], function(url) {
  function beforeLoad(context) {
    if (context.type === context.UserEventType.VIEW) {

      // This gives us the link to our Suitelet.
      // We can pass any URL parameters to our Suitelet with params.
      // One param you will definitely need is id,
      // which is the id of the current record you are opening
      // the transaction details from, and is used in our
      // Saved Search in step 3.

      // Recall that we need the id's of our Suitelet and it's Script
      // Deployment to be exactly what we said above. NetSuite will prepend
      // "customscript" and "customdeploy" to the id of the Suitelet and
      // Deployment, respectively, so we need to do the same.
      // Missing this step is a common reason why links won't open as
      // expected.

      // Lastly, although returnExternalUrl defaults to false, let's
      // set it to false for peace of mind. We don't want to expose
      // anything to the outside.
      var urlTransactionDetails = url.resolveScript({
          scriptId: "customscript_transaction_details_sl",
          deploymentID: "customdeploy_transaction_details_sl",
          params: {
            id: context.newRecord.id
          },
          returnExternalUrl: false
        });

      // Because we're using at least 2.1, we can use `backticks` to
      // interpolate urlTransactionDetails into window.open, which makes
      // things much easier.
      context.form.addButton({
        id: "custpage_view_transaction_details,
        label: "Transaction Details,
        functionName: `window.open("${urlTransactionDetails}");`
      });
    }  
  }
  return {beforeLoad: beforeLoad}
}

И это все ! Надеюсь, это продвинет вас дальше. Как я уже говорил, не стесняйтесь задавать вопросы. Кроме того, практикуйте хорошие методы кодирования. Практикуйте что-нибудь хорошее в этом отношении. Я намерен помочь вам и другим здесь. К сожалению, этот пост не решит все проблемы, но я надеюсь, что он поможет вам и другим, кто заходит.

Дайте мне знать, как это происходит!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...