SuiteScript 2 Email Invoices - netsuite

Hi and I I am not a pain, I got help on sending a statement and that worked perfectly, but I need to send invoices with it but I can't find a method for that like I did for the statement. I find references to using a template file, then you have to store the file in the cabinet. I have to attach there to emails, what would you think the best way to do this?
Here is the other link, he gave a very helpful complete answer about sending statements. I should have asked him about invoices at the same time but I didn't think of it, apologies.
SuiteScript 2 can send pdf statements
added additional info
Ok I tried this but I am getting an error that doesn't make sense as I am using their templates.
"error.SuiteScriptError","name":"USER_ERROR","message":"Error Parsing XML: The reference to entity \"c\" must end with the ';' delimiter.",
require(['N/render', 'N/file', 'N/record'],
function(render, file, record) {
function renderRecordToPdfWithTemplate() {
var renderer = render.create();
renderer.setTemplateByScriptId("STDTMPLCUSTINVC");
var xml = renderer.renderAsString();
renderer.addRecord(record.Type.INVOICE, record.create({
type: record.Type.INVOICE,
id:415619
}));
var invoicePdf = renderer.renderAsPdf();
var foo = this;
}
renderRecordToPdfWithTemplate();
});
thanks for any help with this

Ok I found it thanks if anyone was looking for this for me. It is pretty straightforward, but like NetSuite always is, you have to find it. :)
the entityid is the invoice internalid the rest is easy, then just pass the file object to the email.
require( [ 'N/render', 'N/file', 'N/record' ],
function( render, file, record ) {
function renderRecordToPdfWithTemplate() {
var transactionFile = render.transaction({
entityId: 415619,
printMode: render.PrintMode.PDF
});
var foo = this;
}
renderRecordToPdfWithTemplate();
} );
thanks again

Related

NetSuite Client Script for Suitelet

I have a suitelet similar to:
How to add checkbox in a list (serverWidget.List) in Suitelet
what would the client script look like for something like this? I'm new to scripting so still getting my head around it. Basically what I would like to do is, if there are checks on the sublist in the suitelet, when you click submit, a couple of fields on the checked records get updated. I have the following in my client script, it seems as though the client script is not able to source the internalID of the 'checked' record from the suitelet (maybe missing something to do with context?):
function SaveRecord() {
var isChecked = "F"
var lineCount = nlapiGetLineItemCount('custpage_sublist_id')
nlapiLogExecution('DEBUG', 'Line Count', lineCount);
if (lineCount>0){
for(var line=1; line<=lineCount; line++)
isChecked =
nlapiGetLineItemValue('custpage_sublist_id','custfield_selected',line);
var siinternalid = nlapiGetLineItemValue('custpage_sublist_id',
'internalId',line);
nlapiLogExecution('DEBUG', 'Internal ID', siinternalid);
if (isChecked =="T") {
var record = nlapiLoadRecord('VendorBill',siinternalid);
record.setFieldValue('FIELD1', 'T');
record.setFieldValue('FIELD2','F')
nlapiSubmitRecord(record);
}
}
return true;
}
Thanks.
I solved the issue by removing the client script altogether and adding a POST (else) element to the suitelet to handle the submit element of the suitelet. If anyone wants to see let me know and I can post up.
Sounds like you've got a workaround. But regarding your initial question, in the context of a Client script you'll typically use:
nlapiGetCurrentLineItemValue
instead of:
nlapiGetLineItemValue

SharePoint hide spfieldurl column description(Type of description)

I am trying not to have the column description for field type "URL" in SharePoint 2016. I want to use this OOTB column URL, but not get "Type the description". The only work around i saw is using JavaScript. I wanted to know, is there any other way remove it?
Programmatically, or some property in schema.xml?
Any suggestions and help is appreciated.
Thanks,
Menon
Sample JSlink script for you.
You could upload jQuery library and the custom jslink library to SharePoint library, I upload to layouts folder just for easy testing.
script:
(function () {
var JSHyperlinkFieldCtx = {};
JSHyperlinkFieldCtx.Templates = {};
JSHyperlinkFieldCtx.Templates.Fields = {
"JSHyperlink": {
"NewForm": HideJSHyperlinkTemplate
}
};
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(JSHyperlinkFieldCtx);
})();
function HideJSHyperlinkTemplate(ctx) {
var result = SPFieldUrl_Edit(ctx);
var $f = $(result);
$f.find('span:eq(1)').css('display', 'none');
$f.find('input:eq(1)').css('display', 'none');
return $f.html();
}
use the script:
~sitecollection/_layouts/15/jslinks/jquery-1.12.4.js|~sitecollection/_layouts/15/jslinks/HyperlinkField.js

Sending email from netsuite using freemarker template engine

Can someone help me to work my task on netsuite Sending email. The email body should be generated with the freemarker template engine using nlapiCreateTemplateRenderer. I try to used the sample on the help page in netsuite but it doesnt work. Can somebody explain or give me a example on this API.
By the way i can sent email using suitelet, my problem is the email body.
Thank you.
Provided that you have your scriptable template. This should run OK.
var emailTempId = 1; // internal id of the email template
var emailTemp = nlapiLoadRecord('emailtemplate',emailTempId);
var emailSubj = emailTemp.getFieldValue('subject');
var emailBody = emailTemp.getFieldValue('content');
var records = new Object();
records['transaction'] = '1'; //internal id of Transaction
var salesOrder = nlapiLoadRecord('salesorder', 1);
var renderer = nlapiCreateTemplateRenderer();
renderer.addRecord('transaction', salesOrder );
renderer.setTemplate(emailSubj);
renderSubj = renderer.renderToString();
renderer.setTemplate(emailBody);
renderBody = renderer.renderToString();
nlapiSendEmail(-5, 'email#domain.com', renderSubj, renderBody , null, null, records);
The new Scriptable Template that is using the FreeMarker only supports Entity, Transaction, Custom Record, Case, & Project Record. Other records might work but based on Answer Id: 32621 from the SuiteAnswers those record are the ones that will be supported.

Accessing current user information for a netsuite html form using suitescript

I've been trying to figure auto-complete some values from netsuite onto our custom html form.
After a bit of researching, I found this gem: nlapiGetContext (http://www.netsuite.com/portal/developers/resources/APIs/Dynamic%20HTML/SuiteScriptAPI/MS_SuiteScriptAPI_WebWorks.1.1.html)
which should do exactly what it says,
However, when doing a console.log dump of nlapigetcontext()
the following information is displayed, not my current logged in user information
Here is my current test script:
if (window.addEventListener) { // Mozilla, Netscape, Firefox
window.addEventListener('load', WindowLoad, false);
} else if (window.attachEvent) { // IE
window.attachEvent('onload', WindowLoad);
}
function WindowLoad(event) {
alert(nlapiGetContext().getCompany());
console.log(nlapiGetContext());
}
Any help or guidance is appreciated!
Thank you!
Where is this form located? Context will only work if you are logged into the system, so this won't apply for online customer forms, those are considered to be "outside the system".
You can write a Suitelet to retrieve data from an external form if you are only retrieving values.
I use this to get campaign information on an external landing page.
function getCamData(request, response){
if ( request.getMethod() == 'GET' ){
response.setHeader('Custom-Header-CamID', 'CamID');
var camid = request.getParameter('camid');
var rec = nlapiLoadRecord('campaign', camid);
var o = new Object();
o.thisid = camid;
o.promocode = rec.getFieldValue('campaignid');
o.phone = rec.getFieldValue('custevent_cam_1300num');
o.family = rec.getFieldValue('family');
var myString = JSON.stringify(o);
response.write (myString);
}}
You request something like this:
https://forms.netsuite.com/app/site/hosting/scriptlet.nl?script=188&deploy=1&compid=xxxxxx&h=fb8224b74b24907a79e6&camid=8020
And returns something like this:
{"thisid":"8020","promocode":"CAM999","phone":"1800 111 222","family":"12"}
Also you can do server-side posting from an external site to a NetSuite customer online form, it will capture and validate the data as far as it has the entry fields set in NS, this is a great way to avoid using those horrible iframes.
Use these functions
nlapiGetContext().getName()
nlapiGetContext().getUser()
nlapiGetContext().getRole()
nlapiGetContext().getRoleId()
nlapiGetContext().getRoleCenter()
nlapiGetContext().getEmail()
nlapiGetContext().getContact()
nlapiGetContext().getCompany()
nlapiGetContext().getContact()
nlapiGetUser()
nlapiGetDepartment()
For details check http://suitecoder.appspot.com/static/api.html

Geocoding using Google Geocoding Web Service

I'm trying to geocode an address from Microsoft Dynamics CRM 2011 using Javascript.
I don't want to display the map, just perform the Geocoding and store the Lat / Long values in the database.
I keep getting an error message saying
"result.0 is null or not an object"
var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=39 George Street, Belmont, WA, 6104, Australia&sensor=false'
var lat = url.results[0].geometry.location.lat();
alert(lat)
what am I doing wrong?
I assume from your question that this is a complete code snippet. On that assumption your code is incomplete. Your code creates a string called url. You then attempt to access a collection in that string, called results (which does not exist - and therefore position 0 within that colelction does not exist). Basically, your code doesn't do anything.
You need to have a good read of the Google Geocode API because, I'm sorry to say, you're not even close to getting this working... https://developers.google.com/maps/documentation/javascript/geocoding
Edit:
In the interests of being more helpful - here is a walkthrough too: http://www.wikihow.com/Geocode-an-Address-in-Google-Maps-Javascript
I have to disagree with Greg...you appear to have the request URL pretty close. Check out the Google Geocoding guide for the exacts. What you will get back is a JSON string, so you should use something like jQuery to parse the string into an object.
If you are not set on using JSON, then a simple script like this will also return the Lat/Lng (adapted from Google sample):
<script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script>
var geocoder;
function initialize() {
geocoder = new google.maps.Geocoder();
}
function codeAddress() {
var address = document.getElementById("address").value;
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var addressLocation = results[0].geometry.location;
alert("Lat: " + addressLocation.lat() + " Lon: " + addressLocation.lng());
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
</script>

Resources