4N335
4N335

Reputation: 281

Error in running scheduled script from suitelet form script in Suitescript 2.0?

I m new in suitescripts. I have made a Suitelet Form script with 3 fields which will act as filters on the scheduled script. The scheduled script in sending the PDF file to a certain email after filtering the 3 values of suit let script from my saved search. When I hit the button on suitelet form, after entering the fields, the scheduled script goes on processing for 1 hour and then gets failed. I think I have placed the wrong filters in the loading of My saved search in my scheduled script. The saved search (customsearch_mx_itemsearch) is without any filters or criteria. Please help if anyone knows. Thank you

My Suitelet form Script:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/task'],
  function (ui, search, render, runtime, file, task) {
    /**
     * main function for suitelet
     * @param {object} ctx
     */

    function onRequest(ctx) {

      var req = ctx.request;
      var res = ctx.response;
      var param = req.parameters;
      /**
       * create form is creating the UI for report generation
       */
      if (req.method === 'GET') {
        // createForm(req, res, param);
        createForm(req, res, param);
      } else {
        generateReport(req, res, param);
      }
    }

    // R E Q U E S T
    function createForm(req, res, param) {

      if (req.method === 'GET') {
        var form = ui.createForm({
          title: 'Generate Item Report'
        });

        var item = form.addField({
          id: 'custpage_selectitem',
          type: ui.FieldType.SELECT,
          label: 'Select Item',
          source: 'item'
        });
        item.isMandatory = true;

        var gender = form.addField({
          id: 'custpage_selectgender',
          type: ui.FieldType.SELECT,
          label: 'Select Gender',
          source: 'customrecord6'
        });
        gender.isMandatory = true;

        var fromDate = form.addField({
          id: 'custpage_selectdate',
          // type: ui.FieldType.DATETIME,
          type: ui.FieldType.DATE,
          label: 'Select Date/Time',
        });


        form.addSubmitButton({
          label: 'Generate Report'
        });

        res.writePage(form);
      }
    }

    // R E S P O N C E
    function generateReport(req, res, param) {
      var param = req.parameters;
      log.debug('parameters', param);
      var script = runtime.getCurrentScript();

      var filters = {
        'isgender': param.custpage_selectgender,
        'isItem': param.custpage_selectitem,
        'fromDate': param.custpage_selectdate
      };

      log.debug('filters', filters);

      var scriptTask = task.create({ taskType: task.TaskType.SCHEDULED_SCRIPT });
      // scriptTask.scriptId = 3920;
      scriptTask.scriptId = 'customscript_mx_itemreport_ss';
      scriptTask.deploymentId = 'customdeploy_mx_itemreport_ss';
      scriptTask.params = {
        custscript_searchfilter_report: JSON.stringify(filters)
      };
      log.debug('workingtillhere');
      var scriptTaskId = scriptTask.submit();
      res.write("Your report is being generated. It will be emailed to you shortly.")

    }

    return {
      onRequest: onRequest
    };
  });

My Scheduled script:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/email'],
  function (ui, search, render, runtime, file, email) {

    function execute() {
      try {
        generateReport();
      }
      catch (e) {
        log.error('generateReport ERROR', e);
      }
    }

    function generateReport(req, res, param) {

      var slfilters = runtime.getCurrentScript().getParameter({ name: 'custscript_searchfilter_report' });
      log.debug('slfilters', slfilters);

      if (!!slfilters) {
        slfilters = JSON.parse(slfilters);
      }
      log.debug('slfilters2', slfilters);

      var getUser = runtime.getCurrentUser();

      var gender = slfilters.isgender
      log.debug('gender', gender)
      var item = slfilters.isItem
      log.debug('item', item)

      var item = getItems(item, gender);
      log.debug('items table', item)

      var xmlTemplateFile = file.load(3918);
      var template = script.getParameter({ name: 'custscript_template' });
      var renderer = render.create();
      renderer.templateContent = xmlTemplateFile.getContents();
      var customSources = {
        alias: 'searchdata',
        format: render.DataSource.JSON,
        data: JSON.stringify({
          value: item,
        })
      };
      renderer.addCustomDataSource(customSources);

      var xml = renderer.renderAsString();
      var pdf = render.xmlToPdf({
        "xmlString": xml
      });

      email.send({
        author: 317,
        recipients: '[email protected]',
        subject: 'Item Report',
        body: 'Report Generated: ',
        attachments: [pdf]
      });
    }

    //
    // ─── GET RESULTS ───────────────────────────────────────────────────
    //
    const getResults = function (set) {
      var results = [];
      var i = 0;
      while (true) {
        var result = set.getRange({
          "start": i,
          "end": i + 1000
        });
        if (!result) break;
        results = results.concat(result);
        if (result.length < 1000) break;
        i += 1000;
      }
      return results;
    };

    //
    // ─── GET ITEMS ───────────────────────────────────────────────────
    //
    function getItems(item, gender) {

      try {
        var itemSearch = search.load({
          id: 'customsearch_mx_itemsearch'
        });

        var defaultFilters = itemSearch.filters;
        var arrFilters = [];

        arrFilters.push(search.createFilter({
          name: 'custitem5',//gender
          operator: 'anyof',
          values: [gender]
        }));
        arrFilters.push(search.createFilter({
          name: 'internalid',
          operator: 'anyof',
          values: [item]
        }));

        //defaultFilters.push(arrFilters)
        defaultFilters = defaultFilters.concat(arrFilters);

        var results = getResults(itemSearch.run()).map(function (x) {
          return {

            'category': x.getText({
              name: "custitem10",
              join: "parent"
            }),
            'season': x.getValue({
              name: "custitem11",
              join: "parent"
            }),
            'riselabel': x.getValue({
              name: "custitem_itemriselabel",
              join: "parent"
            }),
            'fit': x.getValue({
              name: "custitem9",
              join: "parent"
            }),
            'name': x.getValue({ //sku
              name: "itemid",
              join: "parent"
            }),
            'style': x.getValue({
              name: "custitem8",
              join: "parent"
            }),
            'inseam': x.getValue({
              name: "custitem7",
              join: "parent"
            }),
            'wash': x.getValue({
              name: "custitem_washname",
              join: "parent"
            }),
          };
        });
        return results;

      } catch (e) {
        log.error('error in getItems', e)
      }

    }
    return {
      execute: execute
    };
  });

Upvotes: 0

Views: 1901

Answers (1)

erictgrubaugh
erictgrubaugh

Reputation: 8847

You have the req, res, and param arguments defined for generateReport(), but you aren't actually populating them when you call generateReport() within execute(). You will need to pass values for those parameters.

Upvotes: 2

Related Questions