4N335
4N335

Reputation: 251

Error in generating invoice from sales order in suitescript 2.0?

I tried to include a button (created from user event) on Sales order. Upon clicking it, Invoice will be generated. As soon as the button is hit, ther comes an error and invoice doesnt get generated. Can anyone help me with this?

    //Client script
  function pageInit() { 
  }

    function csForButton(ctx) {

        var rec = curr.get();
        var customer = rec.getValue({ "fieldId": "customer" });
        log.error({
          title: 'customer',
          details: customer
        });

        var scriptURL = url.resolveScript({
          "scriptId": "customscript_button_task_sl",
          "deploymentId": "customdeploy_button_task_sl"
        });
        console.log('scriptURL', scriptURL);
        window.onbeforeunload = null;
        window.open(scriptURL + '&id=' + rec.id);

      }

      return {
        pageInit: pageInit,
        csForButton: csForButton
      };

//User Event Script

function beforeLoad(ctx) {
    //if (context.type == context.UserEventType.VIEW) {
    addbutton(ctx);
   // }
  }


  function addbutton(ctx) {
        try {
      var rec = ctx.newRecord;//record object, now we can get its properties through it(e.g. fields)
      var statusOfTrans = rec.getValue({ fieldId: 'status' });
      log.error('statusOfTrans', statusOfTrans);

      ctx.form.clientScriptFileId = "16474"

      if (ctx.type == "view" && statusOfTrans == 'Pending Fulfillment') {
        ctx.form.addButton({
          id: 'custpage_make_invoice',
          label: 'create invoice!',
          functionName: 'csForButton'
        });
      }

    }
        catch (error) {
            log.error('addbutton', error);
        }
    }
    return {
        beforeLoad: beforeLoad,
    }

//Suitelet Script

  function onRequest(ctx) {
    try {
      var req = ctx.request;
      var res = ctx.response;

      if (req.method == 'GET') {

        var objRecord = rec.transform({
          fromType: rec.Type.SALES_ORDER,
          fromId: req.parameters.id,
          toType: rec.Type.INVOICE,
          isDynamic: true,
        });

        objRecord.save({
          ignoreMandatoryFields: true
        });

        res.write({output: 'Invoice created'});

      }
    } catch (error) {
      log.error('onRequest', error);
    }
  }
  return {
    'onRequest': onRequest
  }

error (in suitelet):

{"type":"error.SuiteScriptError","name":"USER_ERROR","message":"You must enter at least one line item for this transaction.","stack":["anonymous(N/serverRecordService)","onRequest(/SuiteScripts/button SL.js:39)"],"cause":{"type":"internal error","code":"USER_ERROR","details":"You must enter at least one line item for this transaction.","userEvent":null,"stackTrace":["anonymous(N/serverRecordService)","onRequest(/SuiteScripts/button SL.js:39)"],"notifyOff":false},"id":"","notifyOff":false,"userFacing":false}

As Error says to include atleast 1 line but i wanted it to be generated automatically. I am new in suitescript and taking all the help from the documentation. Can anyone jst guide me what is wrong i m doing? Thank u

Upvotes: 2

Views: 1128

Answers (1)

Nathan Sutherland
Nathan Sutherland

Reputation: 1270

You need the SO status to be Pending Billing. If the status of the SO is Pending Fulfillment, then no line items are ready to be invoiced.

Upvotes: 2

Related Questions