Create Purchase order from Sales order.

Jira code: UMAR 65

This code is for to create a purchase order from sales order using a custom button which is in the sales order. This will copy all the values and item line from the SO and create a new PO based on that.

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

/**
 * Script Description: This script for Creating the Quotation From Purchase requisition
 */

/*******************************************************************************
 * * UMAR WSR * *
 * **************************************************************************
 * Date:13/2/18 Script name: NetU SL Create PO Script id:
 * customscript_netu_sl_create_po Deployment id: customdeploynetu_sl_create_po
 * REvised on 26/5/18 for setting sales values
 * REvised on 28/5/18 for changing to search from load
 * using json method(response)
 ******************************************************************************/

define(['N/record', 'N/search', 'N/url', 'N/https', 'N/error', 'N/currency',
				'N/redirect', 'N/error', 'N/ui/serverWidget' ],

		function(record, search, url, https, e, currency, redirect, error,
				serverWidget) {

			/**
			 * Definition of the Suitelet script trigger point.
			 * 
			 * @param {Object}
			 *            context
			 * @param {ServerRequest}
			 *            context.request - Encapsulation of the incoming
			 *            request
			 * @param {ServerResponse}
			 *            context.response - Encapsulation of the Suitelet
			 *            response
			 * @Since 2015.2
			 */
			
	
			
			function onRequest(context) {

				try {

					var soId = context.request.parameters.quoteID;
					
						
					var soCustomValuesSearchObj = search.create({
						   type: "salesorder",
						   filters:
						   [
						      ["type","anyof","SalesOrd"], 
						      "AND", 
						      ["internalidnumber","equalto",soId]
						   ],
						   columns:
						   [
						      search.createColumn({name: "custbody_netu_vendor", label: "Vendor"}),
						      search.createColumn({name: "custbody_netu_main_job", label: "Main Job"}),
						      search.createColumn({name: "custbody_netu_subjob", label: "Sub Job Number"}),
						      search.createColumn({name: "custbody_netu_purchase_requisition", label: "Purchase Requ. #"}),
						      search.createColumn({name: "internalid", label: "Internal ID"}),
						      search.createColumn({name: "class", label: "Class"}),
						      search.createColumn({name: "location", label: "Location"}),
						      search.createColumn({name: "department", label: "Department"}),
						      search.createColumn({name: "custbody_netu_vessel", label: "Vessel"}),
						      search.createColumn({name: "custbody_netu_quotation_number", label: "Quotation #"}),
						      
						      search.createColumn({name: "custbody_netu_cost_gross_amount", label: "Cost Gross Amount"}),
						      search.createColumn({name: "custbody_netu_cost_discount_amount", label: "Cost Discount Amount"}),
						      search.createColumn({name: "custbody_netu_scale_commission", label: "Scale Commission"}),
						      search.createColumn({name: "custbody_netu_cost_commission_amount", label: "Cost Commission Amount"}),
						      search.createColumn({name: "custbody_netu_cost_net_amount", label: "Cost Net Amount"}),
						      search.createColumn({name: "custbody_netu_v_packing_charges", label: "V.Packing / Handling Charges"}),
						      search.createColumn({name: "custbody_netu_v_freight", label: "V.Freight"}),
						      search.createColumn({name: "custbody_netu_cost_net_amnt_charges", label: "Cost Net Amount after charges"}),
						      search.createColumn({name: "custbody_netu_sales_gross_amount", label: "Sales Gross Amount"}),
						      search.createColumn({name: "custbody_netu_sales_discount_amount", label: "Sales Discount Amount"}),
						      search.createColumn({name: "custbody_netu_sales_net_amount", label: "Sales Net Amount"}),
						      search.createColumn({name: "custbody_netu_packing_charges", label: "Packing / Handling Charges"}),
						      search.createColumn({name: "custbody_netu_freight", label: "Freight"}),
						      search.createColumn({name: "custbody_netu_sales_net_amnt_charges", label: "Sales Net Amount after charges"}),
						      search.createColumn({name: "custbody_netu_profit_amount", label: "Profit Amount"}),
						      
						      search.createColumn({name: "custbody_netu_invoicing_company", label: "Invoicing Company"}),
						      search.createColumn({name: "custbody_netu_invoiced_customer", label: "Invoiced Customer"}),
						      search.createColumn({name: "custbody_netu_invoiced_vendor", label: "Invoiced Vendor"}),
						      search.createColumn({name: "custbodynetu_invoiced_owner", label: "Invoiced Owner"}),
						      search.createColumn({name: "custbody_netu_vessel_agent", label: "Vessel Agent"}),
						      search.createColumn({name: "custbody_netu_agent_primary_contact", label: "Vessel Agent Primary Contact"}),
						      search.createColumn({name: "custbody_netu_agent_delivery_address", label: "Agent Delivery Address"}),
						      
						      search.createColumn({name: "custbody_netu_v_discount_perc", label: "V.Discount %"}),
						      search.createColumn({name: "custbody_netu_v_commission_perc", label: "V.Commission %"}),
						      search.createColumn({name: "custbody_netu_c_discount_perc", label: "C.Discount %"}),
						      search.createColumn({name: "custbody_netu_profit_perc", label: "Profit%"}),
						      search.createColumn({name: "currency", label: "Currency"}),
                              search.createColumn({name: "createdfrom", label: "Created From"}),
						      search.createColumn({name: "custrecord_netu_subjob_subsidiary",join: "CUSTBODY_NETU_SUBJOB",label: "Subsidiary"}),
						      search.createColumn({name: "custbody_netu_vessel_tba", label: "Vessel TBA"})
						   ]
						});
					
	

					
					var soCustomValueResultCount = soCustomValuesSearchObj.runPaged().count;
					
					
					var rcdMandDtls=[];
					var rcdDtls=[];
					var setRcdValues=[];
			
					if(soCustomValueResultCount>0)
					{
					
						var custValues = soCustomValuesSearchObj.run().getRange({                			
							start:0,
							end:1
						});
							
						var rcdMandValues=['custbody_netu_vendor','custbody_netu_main_job','custbody_netu_subjob',
											'class','location','department','custbody_netu_vessel'];
						
						var recordTitle=['vendor','Mainjob','subjob','class','location','department','vessel'];
						
						quotationNo = custValues[0].getValue({
                            name: 'custbody_netu_quotation_number'
				        })
                        quotationNo = custValues[0].getValue({
                            name: 'createdfrom'
				        })
				        var subsidiary = custValues[0].getValue({
				        	name: "custrecord_netu_subjob_subsidiary",
				        	join: "CUSTBODY_NETU_SUBJOB"
				        })
						
						for(var n=0;n<7;n++)
							{
							rcdMandDtls[n] = custValues[0].getValue({
		                            name: rcdMandValues[n]
						    })
						        
						    if((rcdMandDtls[n] == null) || (rcdMandDtls[n] == "") || (rcdMandDtls[n] == undefined)) 
						 	  	{
						    	context.response.write(JSON.stringify('Missing the value for: '+recordTitle[n]));
						 	  	}
							
							}
						
								
						var recordValues=['custbody_netu_main_job','custbody_netu_subjob','custbody_netu_purchase_requisition',
							'internalid','class','location','department','custbody_netu_vessel',
							'custbody_netu_cost_gross_amount','custbody_netu_cost_discount_amount','custbody_netu_scale_commission','custbody_netu_cost_commission_amount',
							'custbody_netu_cost_net_amount','custbody_netu_v_packing_charges','custbody_netu_v_freight','custbody_netu_cost_net_amnt_charges',
							'custbody_netu_sales_gross_amount','custbody_netu_sales_discount_amount','custbody_netu_sales_net_amount','custbody_netu_packing_charges',
							'custbody_netu_freight','custbody_netu_sales_net_amnt_charges','custbody_netu_profit_amount',
							'custbody_netu_invoicing_company','custbody_netu_invoiced_customer','custbody_netu_invoiced_vendor','custbodynetu_invoiced_owner',
							'custbody_netu_vessel_agent','custbody_netu_agent_primary_contact','custbody_netu_agent_delivery_address','custbody_netu_vessel_tba',
							'custbody_netu_v_discount_perc','custbody_netu_v_commission_perc','custbody_netu_c_discount_perc','custbody_netu_profit_perc'];
						
						var setFileds=['custbody_netu_main_job','custbody_netu_subjob','custbody_netu_purchase_requisition',
							'createdfrom','class','location','department','custbody_netu_vessel',
							'custbody_netu_cost_gross_amount','custbody_netu_cost_discount_amount','custbody_netu_scale_commission','custbody_netu_cost_commission_amount',
							'custbody_netu_cost_net_amount','custbody_netu_v_packing_charges','custbody_netu_v_freight','custbody_netu_cost_net_amnt_charges',
							'custbody_netu_sales_gross_amount','custbody_netu_sales_discount_amount','custbody_netu_sales_net_amount','custbody_netu_packing_charges',
							'custbody_netu_freight','custbody_netu_sales_net_amnt_charges','custbody_netu_profit_amount',
							'custbody_netu_invoicing_company','custbody_netu_invoiced_customer','custbody_netu_invoiced_vendor','custbodynetu_invoiced_owner',
							'custbody_netu_vessel_agent','custbody_netu_agent_primary_contact','custbody_netu_agent_delivery_address','custbody_netu_vessel_tba',
							'custbody_netu_v_discount_perc','custbody_netu_v_commission_perc','custbody_netu_c_discount_perc','custbody_netu_profit_perc'];
						
						

						var rec = record.create({
							type : record.Type.PURCHASE_ORDER,
							isDynamic : true,
							defaultValues : {
							entity : rcdMandDtls[0] 
							}
						});
						
						rec.setValue({
							fieldId : 'subsidiary',
							value : subsidiary
						});
						
					
						for(var k=0;k<35;k++)
						{
							
							rcdDtls[k] = custValues[0].getValue({
								name : recordValues[k]
							});
							
							if(k>=31)
								{
								var Perc = rcdDtls[k].split("%");
								rcdDtls[k]=Perc[0];
								}
							
								rec.setValue({
									fieldId : setFileds[k],
									value : rcdDtls[k]
								});
							
						}
						
						rcdcurrency = custValues[0].getValue({
							name : 'currency'
						});
						
						rec.setValue({
							fieldId : 'currency',
							value : rcdcurrency
						});
						
						rec.setValue({
							fieldId : 'custbody_netu_subjob_status',
							value : 9
						});
						rec.setValue({
							fieldId : 'custbody6',
							value : soId
						});
						rec.setValue({
							fieldId : 'custbody_netu_quotation_number',
							value : quotationNo
						});
						
					}
					
						
					
					//getting item lines
					var salesorderSearchObj = search.create({
						   type: "salesorder",
						   filters:
						   [
						      ["type","anyof","SalesOrd"], 
						      "AND", 
						      ["internalidnumber","equalto",soId], 
						      "AND", 
						      ["mainline","is","F"], 
						      "AND", 
						      ["taxline","is","F"],
						      "AND", 
						      ["item.name","doesnotcontain","discount"]
						   ],
						   columns:
						   [
						      search.createColumn({name: "item", label: "Item"}),
						      search.createColumn({name: "quantity", label: "Quantity"}),
						      search.createColumn({name: "memo", label: "Memo"}),
						     // search.createColumn({name: "rate", label: "Item Rate"}),
						     // search.createColumn({name: "taxcode", label: "Tax Item"}),
						      search.createColumn({name: "amount", label: "Amount"}),
						      search.createColumn({name: "custcol_netu_purch_price", label: "Cost Price"}),
						      search.createColumn({name: "custcol_netu_purch_gross_amount", label: "Cost Gross Amount"}),
						      search.createColumn({name: "class", label: "Class"}),
						      //search.createColumn({name: "grossamount", label: "Amount (Gross)"}),
						      search.createColumn({name: "custcol_netu_incomeid", label: "IncomeId"})
						   ]
						});
					
					var soItemLineResultCount = salesorderSearchObj.runPaged().count;
								
					itemDtls=[];
					if(soItemLineResultCount>0)
						{
						
						var itemLineResults = salesorderSearchObj.run().getRange({                			
							start:0,
							end:1000
						});
						
							
						var column=['item','quantity','memo','custcol_netu_purch_price','custcol_netu_purch_gross_amount','class','custcol_netu_increment','custcol_netu_incomeid','amount'];
						
						var setColumn=['item','quantity','description','rate','amount','class','custcol_netu_increment','custcol_netu_incomeid','custcol_netu_actual_cost_price'];
						
						for(i = 0; i < soItemLineResultCount; i++)
							{
							
							rec.selectNewLine({
								sublistId : 'item'
							});
							
							for(j=0;j<9;j++)
								{
								itemDtls[j] = itemLineResults[i].getValue({
									name : column[j]
								});
									
								rec.setCurrentSublistValue({
									sublistId : 'item',
									fieldId : setColumn[j],
									value : itemDtls[j]
								});
								}
							
							rec.commitLine({
								sublistId : 'item'
							});
			
							}
						}		
					
					//**************************************************
				
					//setting the vendor discount item based on the class revenue map
					var customrecord_netu_class_revenue_mapSearchObj = search.create({
						   type: "customrecord_netu_class_revenue_map",
						   filters:
						   [
						      ["custrecord_netu_map_class.internalidnumber","equalto",rcdDtls[4]], 
						      "AND", 
						      ["custrecord_netu_vendor_discount","is","T"]
						   ],
						   columns:
						   [
						      search.createColumn({name: "internalid", label: "Internal ID"}),
						      search.createColumn({name: "custrecord_netu_item_code", label: "Item Code"}),
						      search.createColumn({
						         name: "internalid",
						         join: "CUSTRECORD_NETU_ITEM_CODE",
						         label: "Internal ID"
						      })
						   ]
						});
		          		var resultCount = customrecord_netu_class_revenue_mapSearchObj.runPaged().count;
		          		
		          		if(resultCount > 0){
		          			
		          			
		          			
		          			var classRevenueCountinResults = customrecord_netu_class_revenue_mapSearchObj.run().getRange({                			
		          				start:0,
		          				end:1
		          			});
		          			vendorDiscount = classRevenueCountinResults[0].getValue({
		                    	   name: "internalid",
						           join: "CUSTRECORD_NETU_ITEM_CODE"
		                     });
		          			
		          			log.debug('vendorDiscount',vendorDiscount);
		          			
		          			//setting item code in a new line
		          			rec.selectNewLine({
								sublistId : 'item'
							});
	                     	rec.setCurrentSublistValue({
								sublistId : 'item',
								fieldId : 'item',
								value : vendorDiscount
							});
	                     	rec.setCurrentSublistValue({
								sublistId : 'item',
								fieldId : 'rate',//'grossamt',amount,rate
								value : -rcdDtls[9]
							});
	                     	rec.setCurrentSublistValue({
								sublistId : 'item',
								fieldId : 'custcol_netu_incomeid',
								value : '1'
							});
							rec.commitLine({
								sublistId : 'item'
							});
		          		}
	                 	
					//**************************************************
					
					var recordId = rec.save({
						enableSourcing : true,
						ignoreMandatoryFields : false
					});
					
					//setting the status in subjob,pr,quotation,so
					if (recordId != null) {

                       
						record.submitFields({
							type : 'customrecord_netu_sub_job',
							id : rcdMandDtls[2],
							values : {
								'custrecord_netu_subjob_status' : '9'
							},
							options : {
								enableSourcing : false,
								ignoreMandatoryFields : true
							}
						});

						record.submitFields({
							type : 'customrecord_netu_purchase_requisition',
							id : rcdDtls[2],
							values : {
								'custrecord_netu_req_sub_job_status' : '9'
							},
							options : {
								enableSourcing : false,
								ignoreMandatoryFields : true
							}
						});

						record.submitFields({
							type : record.Type.ESTIMATE,
							id : quotationNo,
							values : {
								'custbody_netu_subjob_status' : '9'
							},
							options : {
								enableSourcing : false,
								ignoreMandatoryFields : true
							}
						});

						record.submitFields({
							type : record.Type.SALES_ORDER,
							id : rcdDtls[3],
							values : {
								'custbody_netu_subjob_status' : '9'
							}
						});
						
						redirect.toRecord({
							type : record.Type.PURCHASE_ORDER,
							id : recordId,
							isEditMode : true

						});
						
					}
				

				} catch (e) {

					context.response.write(JSON.stringify(e.message));
					log.debug({    
						title: e.name,
						details: e.message
					});
				}

			}

			return {
				onRequest : onRequest
			};

		});

Leave a comment

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