Automated Intercompany Update

Department field on the header of the supplier invoice to populate the department field on every line item of the IC journal. Populates the Department selected in Vendor Bill to the Department Field on all the Intercompany Journal Lines. Also, we can set the Journal date to the vendor Bill date(Trandate). So the Posting period will be updated automatically according to the Transaction date. Set the status of the Journal to Approved.

UserEventScript

/**
 *@NApiVersion 2.x
 *@NScriptType UserEventScript
 * @NModuleScope SameAccount
 */


/************************************************************************************************
* * Macrofin Developers| MAC-67 | Intercompany JE Creation on Vendor Bill Creation   *
* **********************************************************************************************
*
*
*
* Date Created : 24-Jan-2020
*
* Created By: Macrofin Developers
*
* REVISION HISTORY
* 
*
***********************************************************************************************/

define(['N/search', 'N/ui/serverWidget', 'N/record'], function (search, serverWidget, record) {
  /**
   * Function definition to be triggered before record is loaded.
   *
   * @param {Object} scriptContext
   * @param {Record} scriptContext.newRecord - New record
   * @param {Record} scriptContext.oldRecord - Old record
   * @param {string} scriptContext.type - Trigger type
   * @param {form} scriptContext.form - Current Form
   * @Since 2015.2
   */
  var main = {
    beforeLoad: function (scriptcontext) {
      if (scriptcontext.type == 'create') {
        try {
          main.beforeLoadSetValue(scriptcontext);
        }
        catch (err) {
          log.error('ERROR@beforeLoadCreate', JSON.stringify(err));
        }
      }
      if (scriptcontext.type == 'edit') {
        try {
          var tempArray = main.beforeLoadSetValue(scriptcontext);
          tempArray[0].defaultValue = tempArray[1];
        }
        catch (err) {
          log.error('ERROR@beforeLoad', JSON.stringify(err));
        }
      }
    },
    beforeSubmit: function (scriptcontext) {
      if (scriptcontext.type == 'create' || scriptcontext.type == 'edit') {
        try {
          log.debug("beforeSubmit");
          var new_record = scriptcontext.newRecord;
          var internal_id = new_record.id;
          log.debug("new_record");
          log.debug("internal id", internal_id);
          var amortization = new_record.getValue({
            fieldId: 'custpage_ic_amortisation_schedule'
          })
          //created custom field value is set to another field(hidden)
          new_record.setValue({
            fieldId: 'custbody_mac_ic_amortisation_hidden',
            value: amortization,
            ignoreFieldChange: true
          });
        }
        catch (err) {
          log.error('ERROR@beforeSubmit', JSON.stringify(err));
        }
      }
    },
    afterSubmit: function (scriptcontext) {
      if (scriptcontext.type == 'create' || scriptcontext.type == 'approve' || scriptcontext.type == 'edit') {
        try {
          log.debug("afterSubmit");
          var new_record = scriptcontext.newRecord;
          var internal_id = new_record.id;
          log.debug("internal id", internal_id);
          var status = new_record.getValue({
            fieldId: 'approvalstatus'
          });
          log.debug("status", status);
          var intercompany_subsidiary = new_record.getValue({
            fieldId: 'custbody_mac_intercompany_subsidiary'
          });
          log.debug("intercompany_subsidiary", intercompany_subsidiary);
          if (intercompany_subsidiary != '' && status == 2) {
            var currency = new_record.getValue({
              fieldId: 'currency'
            })
            var id = new_record.id
            var subsidiary = new_record.getValue({
              fieldId: 'subsidiary'
            });
            var ic_amortisation = new_record.getValue({
              fieldId: 'custbody_mac_ic_amortisation_hidden'
            });
            log.debug("ic_amortisation hidden", ic_amortisation);
            var ic_amortisation_start_date = new_record.getValue({
              fieldId: 'custbody_mac_ic_amortisation_start'
            });
            var ic_amortisation_end_date = new_record.getValue({
              fieldId: 'custbody_mac_ic_amortisation_end'
            });
            var n_lines = scriptcontext.newRecord.getLineCount({
              sublistId: 'item'
            });
            log.debug("n_lines", n_lines);
            if (n_lines != '' || 0) {
              //create new Advanced Inter Company JE
              var journalRecord = record.create({
                type: record.Type.ADV_INTER_COMPANY_JOURNAL_ENTRY,
                isDynamic: true,
              });
              journalRecord.setValue({                //set values to the fields
                fieldId: 'subsidiary',
                value: subsidiary,
              });
              journalRecord.setValue({
                fieldId: 'currency',
                value: currency,
              });
              journalRecord.setValue({
                fieldId: 'custbody_mac_related_bill',
                value: id,
              });

              for (var i = 0; i < n_lines; i++) {
                var item = scriptcontext.newRecord.getSublistValue({
                  sublistId: 'item',
                  fieldId: 'item',
                  line: i
                });
                var itemAmount = scriptcontext.newRecord.getSublistValue({
                  sublistId: 'item',
                  fieldId: 'amount',
                  line: i
                });
                var fieldLookUp = search.lookupFields({
                  type: search.Type.ITEM,
                  id: item,
                  columns: ['expenseaccount']
                });

                log.debug('fieldLookUp', fieldLookUp)

                var expenseAccountObj = fieldLookUp.expenseaccount;
                var expenseAccount = expenseAccountObj[0].value;
                log.debug("expenseAccount", expenseAccount);
                main.setJEItemCreditLine(journalRecord, subsidiary, expenseAccount, itemAmount, intercompany_subsidiary);     //for credit line
                main.setJEItemDebitLine(journalRecord, intercompany_subsidiary, expenseAccount, itemAmount, ic_amortisation, ic_amortisation_start_date, ic_amortisation_end_date, subsidiary);  //for debit line
              }
              var j_Rec = journalRecord.save({
                enableSourcing: true,
                ignoreMandatoryFields: true
              });
              log.debug("journalRecord", j_Rec);
            }
          }
        }
        catch (err) {
          log.error('ERROR@afterSubmit', JSON.stringify(err));
        }
      }
    },
    beforeLoadSetValue: function (scriptcontext) {
      var new_record = scriptcontext.newRecord;
      var internal_id = new_record.id;
      log.debug("internal id", internal_id);
      var form = scriptcontext.form;
      //new field
      var amortization_template = form.addField({
        id: 'custpage_ic_amortisation_schedule',
        type: serverWidget.FieldType.SELECT,
        label: 'PREPAYMENT SCHEDULE (ONLY IF USING INTRAGROUP RECHARGE)'
      });
      //search for Amortization Templates with Term Source“Transaction Date”
      var amortizationtemplateSearchObj = search.create({
        type: "amortizationtemplate",
        filters:
          [
            ["amortermsrc", "anyof", "USERDEFINED"], //Term Source is USERDEFINED
            "AND",
            ["isinactive", "is", "F"] //Inactive is false
          ],
        columns:
          [
            search.createColumn({ name: "internalid", label: "Internal ID" }),
            search.createColumn({
              name: "name",
              sort: search.Sort.ASC,
              label: "Name"
            })
          ]
      });
      var amortization_list = {};
      var searchResultCount = amortizationtemplateSearchObj.runPaged().count;
      log.debug("amortizationtemplateSearchObj result count", searchResultCount);
      amortizationtemplateSearchObj.run().each(function (result) {
        var amortization_id = result.getValue(amortizationtemplateSearchObj.columns[0]);
        var amortization = result.getValue(amortizationtemplateSearchObj.columns[1]);
        amortization_list[amortization_id] = amortization;
        return true;
      });
      log.debug("ic amortization list", amortization_list);
      amortization_template.addSelectOption({       //add select options to the field              
        value: 0,
        text: ''
      });
      for (var key in amortization_list) {
        amortization_template.addSelectOption({       //add select options to the field              
          value: key,
          text: amortization_list[key]
        });
      }
      var defaultValue = new_record.getValue({
        fieldId: 'custbody_mac_ic_amortisation_hidden'
      });;
      var temp = [amortization_template, defaultValue]
      return temp;

    },

    /* Function to set advanced intercompany JE Credit Line*/
    setJEItemCreditLine: function (journalRecord, subsidiary, expenseAccount, itemAmount, intercompany_subsidiary) {
      try {
        log.debug("intercompany journal record", journalRecord);
        journalRecord.selectNewLine({
          sublistId: 'line',
        });
        var fieldObj = {};
        fieldObj['linesubsidiary'] = subsidiary;
        fieldObj['account'] = expenseAccount;
        fieldObj['credit'] = itemAmount;
        //log.debug('fieldObj', fieldObj);
        for (var key in fieldObj) {
          journalRecord.setCurrentSublistValue({
            fieldId: key,
            sublistId: 'line',
            value: fieldObj[key],
          });
        }
        // journalRecord.setCurrentSublistValue({
        //     fieldId: 'debit',
        //     sublistId: 'line',
        //     value: 0,
        // });
        journalRecord.commitLine({
          sublistId: 'line',
        });
        journalRecord.selectNewLine({
          sublistId: 'line',
        });
        var subsidiaryFieldLookUp = search.lookupFields({
          type: search.Type.SUBSIDIARY,
          id: intercompany_subsidiary,
          columns: ['custrecord1']
        });
        log.debug('test', subsidiaryFieldLookUp);
        var interCompanyAccountObj = subsidiaryFieldLookUp.custrecord1;
        var interCompanyAccount = interCompanyAccountObj[0].value;
        log.debug('test1',interCompanyAccount);
        var fieldObj2 = {};
        fieldObj2['linesubsidiary'] = subsidiary;
        fieldObj2['account'] = interCompanyAccount;
        fieldObj2['debit'] = itemAmount;
        fieldObj2['duetofromsubsidiary'] = intercompany_subsidiary;
        //log.debug('fieldObj2', fieldObj2);
        for (var key in fieldObj2) {
          log.debug("key", key);
          log.debug("fieldObj2[key]", fieldObj2[key]);
          journalRecord.setCurrentSublistValue({
            fieldId: key,
            sublistId: 'line',
            value: fieldObj2[key],
          });
        }
        // journalRecord.setCurrentSublistValue({
        //     fieldId: 'credit',
        //     sublistId: 'line',
        //     value: 0,
        // });
        journalRecord.commitLine({
          sublistId: 'line',
        });
      }
      catch (err) {
        log.error('ERROR@setJEItemCreditLine', JSON.stringify(err));
      }
    },
    /* Function to set advanced intercompany JE Debit Line*/
    setJEItemDebitLine: function (journalRecord, intercompany_subsidiary, expenseAccount, itemAmount, ic_amortisation, ic_amortisation_start_date, ic_amortisation_end_date, subsidiary) {
      try {
        log.debug("setJEItemDebitLine");
        journalRecord.selectNewLine({
          sublistId: 'line',
        });
        var fieldObj = {};
        fieldObj['linesubsidiary'] = intercompany_subsidiary;
        fieldObj['account'] = expenseAccount;
        fieldObj['debit'] = itemAmount;
        fieldObj['schedule'] = ic_amortisation;
        fieldObj['startdate'] = ic_amortisation_start_date;
        fieldObj['enddate'] = ic_amortisation_end_date;
        //log.debug("fieldObj", fieldObj)
        log.debug("ic_amortisation", ic_amortisation);
        if (ic_amortisation == 0) {
          log.debug("true", true);
          delete fieldObj.schedule;
          delete fieldObj.startdate;
          delete fieldObj.enddate
        }
        // log.debug("fieldObj", fieldObj);
        for (var key in fieldObj) {
          journalRecord.setCurrentSublistValue({
            fieldId: key,
            sublistId: 'line',
            value: fieldObj[key],
          });
        }
        // journalRecord.setCurrentSublistValue({
        //     fieldId: 'credit',
        //     sublistId: 'line',
        //     value: 0,
        // });
        journalRecord.commitLine({
          sublistId: 'line',
        });
        journalRecord.selectNewLine({
          sublistId: 'line',
        });
        var subsidiaryFieldLookUp = search.lookupFields({
          type: search.Type.SUBSIDIARY,
          id:  subsidiary,
          columns: ['custrecord1']
        });
        log.debug('anu', subsidiaryFieldLookUp);
        var interCompanyAccountObj = subsidiaryFieldLookUp.custrecord1;
        var interCompanyAccount = interCompanyAccountObj[0].value;
        log.debug('anu11',interCompanyAccount);
        var fieldObj2 = {};
        fieldObj2['linesubsidiary'] = intercompany_subsidiary;
        fieldObj2['account'] = interCompanyAccount;
        fieldObj2['credit'] = itemAmount;
        // fieldObj2['schedule'] = ic_amortisation;
        // fieldObj2['startdate'] = ic_amortisation_start_date;
        // fieldObj2['enddate'] = ic_amortisation_end_date;
        //log.debug("fieldObj2", fieldObj2);
        //log.debug("ic_amortisation", ic_amortisation);
        // if (ic_amortisation == 0) {
        //     log.debug("true", true);
        //     delete fieldObj2.schedule;
        //     delete fieldObj2.startdate;
        //     delete fieldObj2.enddate
        // }
        //log.debug("fieldObj2", fieldObj2);
        for (var key in fieldObj2) {
          journalRecord.setCurrentSublistValue({
            fieldId: key,
            sublistId: 'line',
            value: fieldObj2[key],
          });
        }
        // journalRecord.setCurrentSublistValue({
        //     fieldId: 'debit',
        //     sublistId: 'line',
        //     value: 0,
        // });
        journalRecord.commitLine({
          sublistId: 'line',
        });
      }
      catch (err) {
        log.error('ERROR@setJEItemDebitLine', JSON.stringify(err));
      }
    }
  }
  return main;
});


Leave a comment

Your email address will not be published. Required fields are marked *