Creating Shipment from a Screen based API - acumatica

I am creating a Shipment using Screen based Web Service call in Acumatica. The Program executes without errors and gives error Sales Order # does not exist (even if it does exist).
The program goes till the end and for some orders create a Shipment ! How do I check only specific Lines be included in the shipment in this code ??
` PSOrders.Current = psorderrec;
if (psorderrec.Status == PSOrderStatus.Hold)
{
throw new PXException(String.Format(
"Preshipment(0) is On Hold and cannot be generated.",
psorderrec.PSOrderNbr));
}
else if (psorderrec.Status != PSOrderStatus.Open)
{
throw new PXException(String.Format(
"Vendor {0} is already Processed.", psorderrec.PSOrderNbr));
}
so302000.Screen scr = new so302000.Screen();
scr.CookieContainer = new System.Net.CookieContainer();
so302000.LoginResult lr = scr.Login("USERNAME#COMPANYNAME:BRANCHNAME", "Password");
if (lr != null && lr.Code == so302000.ErrorCode.OK)
{
so302000.Content schema = scr.GetSchema();
var selectSOWithCommit = schema.Actions.SelectSO;
selectSOWithCommit.Commit = true;
var addSOWithCommit = schema.Actions.AddSO;
addSOWithCommit.Commit = true;
List<so302000.Command> commands = new List<so302000.Command>();
commands.Add(schema.Actions.Insert);
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.Customer,
Value = psorderrec.CustomerCD
});
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.Location,
Value = psorderrec.Location
});
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.WarehouseID,
Value = psorderrec.Warehouse
});
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.NoteText,
Value = psorderrec.PSOrderType+ "/" + psorderrec.PSOrderNbr
});
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.ControlQuantity,
Value = psorderrec.ControlQty.ToString()
});
commands.Add(new so302000.Value
{
LinkedCommand = schema.ShipmentSummary.Operation,
Value = "Issue"
});
commands.Add(new so302000.Value
{
Value = "OK",
LinkedCommand =
schema.AddSalesOrderOperation.ServiceCommands.DialogAnswer,
Commit = true
});
string pstype = psorderrec.PSOrderType;
string psordernbr = psorderrec.PSOrderNbr;
foreach (PSLine pslinerec in
PXSelect<PSLine,
Where<PSLine.pSOrderType, Equal<Required<PSLine.pSOrderType>>,
And<PSLine.pSOrderNbr, Equal<Required<PSLine.pSOrderNbr>>>>>.Select(this, pstype, psordernbr))
{
commands.Add(addSOWithCommit);
commands.Add(new so302000.Value
{
Value = pslinerec.SOOrderType,
LinkedCommand = schema.AddSalesOrderOperation.OrderType
});
commands.Add(new so302000.Value
{
Value = pslinerec.SOOrderNbr,
LinkedCommand = schema.AddSalesOrderOperation.OrderNbr
});
commands.Add(new so302000.Value
{
Value = "True",
LinkedCommand = schema.AddSalesOrder.Selected
});
commands.Add(schema.AddSalesOrder.InventoryID);
commands.Add(schema.AddSalesOrder.Quantity);
commands.Add(schema.AddSalesOrder.LineDescription);
var soLines = scr.Submit(commands.ToArray());
// List commandList = new List();
for (int index = 0; index < soLines.Length; index++)
{
commands.Add(addSOWithCommit);
commands.Add(new so302000.Value
{
Value = index.ToString(),
LinkedCommand =
schema.AddSalesOrder.ServiceCommands.RowNumber
});
commands.Add(new so302000.Value
{
Value = "True",
LinkedCommand = schema.AddSalesOrder.Selected,
Commit = index < soLines.Length - 1
});
}
}
commands.Add(schema.Actions.Save);
// commandList.Add(schema.Actions.Save);
scr.Submit(commands.ToArray());
scr.Logout();`

Below is a code sample that will create a shipment using Screen-Based API.
It's a bit more verbose that your example - but I think you will see some similarities to your example as well. This code starts just after the Login.
There is a section that Adds the SO, and then iterates through each line in the SO in order to update the values.
I hope this helps!
var schema = shipScreen.GetSchema();
var SelectSO = schema.Actions.SelectSO;
SelectSO.Commit = true;
var AddSO = schema.Actions.AddSO;
AddSO.Commit = true;
var Allocation = schema.Actions.LSSOShipLineBinLotSerial;
Allocation.Commit = true;
var commands = new Command[] {
//first specify keys
new Value { Value = "Shipment", LinkedCommand = schema.ShipmentSummary.Type },
new Value { Value = OrderID.Trim(), LinkedCommand = schema.ShipmentSummary.ShipmentNbr },
//header
new Value { Value = CustID, LinkedCommand = schema.ShipmentSummary.Customer },
new Value { Value = ShipName, LinkedCommand = schema.ShipmentSummary.Location },
new Value { Value = SiteID, LinkedCommand = schema.ShipmentSummary.WarehouseID },
new Value { Value = ShipDate.ToString(), LinkedCommand = schema.ShipmentSummary.ShipmentDate },
new Value { Value = "False", LinkedCommand = schema.ShipmentSummary.Hold },
//Add sales order
new Value { Value = "OK", LinkedCommand = schema.AddSalesOrderOperation.ServiceCommands.DialogAnswer, Commit = true }, SelectSO,
new Value { Value = OrderType, LinkedCommand = schema.AddSalesOrderOperation.OrderType }, // setting filter
new Value { Value = OrderID, LinkedCommand = schema.AddSalesOrderOperation.OrderNbr }, schema.AddSalesOrder.InventoryID
};
var soLines = shipScreen.Submit(commands.ToArray()); // get list of SO lines
List<Command> cmdList = new List<Command>();
for (int i = 0; i < soLines.Length; i++) // select each line
{
cmdList.Add(new Value { Value = i.ToString(), LinkedCommand = schema.AddSalesOrder.ServiceCommands.RowNumber });
cmdList.Add(new Value { Value = "True", LinkedCommand = schema.AddSalesOrder.Selected, Commit = true });
}
cmdList.Add(AddSO); //add selected lines to shipment
shipScreen.Submit(cmdList.ToArray());
//dt is the datatable with the fields that need to be entered - from the outside (non-acumatica) database
//There is one row in dt for each line needed in the shipment.
LineCounter = 0;
foreach (DataRow dr in dt.Rows)
{
ProductID = dr.Field<string>("ProductID").Trim();
LotNumber = dr.Field<string>("LotNumber").Trim();
LineNum = dr.Field<int>("LineNumber").ToString();
LinePickQty = dr.Field<Int32>("PickQty").ToString();
SiteID = dr.Field<string>("SiteID").Trim();
LocationID = dr.Field<string>("LocationID").Trim();
UOM = dr.Field<string>("UOM").Trim();
LotPickQty = dr.Field<Int32>("LotQty").ToString();
if (LineCounter == 0)
{
cmdList.Clear();
}
cmdList.Add(new Key { Value = "='" + LineNum + "'", FieldName = schema.DocumentDetails.OrderLineNbr.FieldName, ObjectName = schema.DocumentDetails.OrderLineNbr.ObjectName });
cmdList.Add(new Value { Value = SiteID, LinkedCommand = schema.DocumentDetails.Warehouse });
cmdList.Add(new Value { Value = LocationID, LinkedCommand = schema.DocumentDetails.Location });
cmdList.Add(new Value { Value = UOM, LinkedCommand = schema.DocumentDetails.UOM });
cmdList.Add(new Value { Value = LinePickQty, LinkedCommand = schema.DocumentDetails.ShippedQty, Commit = true });
cmdList.Add(new Value { Value = LinePickQty, LinkedCommand = schema.Allocations.Quantity });
cmdList.Add(new Value { Value = "OK", LinkedCommand = schema.Allocations.ServiceCommands.DialogAnswer, Commit = true });
LineCounter = LineCounter + 1;
}
//Save
cmdList.Add(schema.Actions.Save);
cmdList.Add(schema.ShipmentSummary.ShipmentNbr);
var shipment = shipScreen.Submit(cmdList.ToArray());

Related

NodeJS await request returns body instead of function result

I want to console.log(price) print the return value of the function wraped after the '=>', but I'm printing the body of the request.
"use strict";
const request = require('request-promise');
const PromedioPonderado = require('../PromedioPonderado.js');
var exports = module.exports = {};
exports.GetPrices = async function(){
var price = await request('https://www.okex.com/api/v1/depth.do?symbol=btc_usdt', { json: true }, (err, res, body) => {
if (err) { return console.log(err); }
var promedio = new PromedioPonderado();
var bids = body.bids;
for (var i = 0, len = bids.length; i < len; i++) {
var row = bids[i];
var bid = {Price: row[0], Amount: row[1]}
promedio.bid(bid);
}
var asks = body.asks;
for (var i = 0, len = asks.length; i < len; i++) {
var row = asks[i];
var ask = {Price: row[0], Amount: row[1]}
promedio.ask(ask);
}
var askReturn = promedio.askAverage(); //sync function
var bidReturn = promedio.bidAverage(); // sync function
console.log(askReturn)
return {Ask: askReturn, Bid: bidReturn}; //I want to return this value
});
console.log(price);
}
This is PromedioPonderado.js, just in case
"use strict";
class PromedioPonderado {
constructor() {
this._bid = [];
this._ask = [];
}
bid(bid) {
this._bid.push(bid);
}
ask(ask){
this._ask.push(ask);
}
bidAverage(){
var totalAmount = 0;
var i = 0;
var average = 0;
while(totalAmount < 10){
totalAmount = totalAmount + this._bid[i].Amount;
average = average + (this._bid[i].Price * this._bid[i].Amount);
i++;
}
average = average / (totalAmount);
return average.toFixed(2);
}
askAverage(){
var totalAmount = 0;
var i = 0;
var average = 0;
while(totalAmount < 10){
totalAmount = totalAmount + this._ask[i].Amount;
average = average + (this._ask[i].Price * this._ask[i].Amount);
i++;
}
average = average / (totalAmount);
return average.toFixed(2);
}
}
module.exports = PromedioPonderado;
var body = await request('https://www.okex.com/api/v1/depth.do?symbol=btc_usdt', { json: true }
and then you can use the response from the request.
exports.GetPrices = async function(){
var price = await new Promise((resolve, reject) => {
request('https://www.okex.com/api/v1/depth.do?symbol=btc_usdt', { json: true }, (err, res, body) => {
if (err) { reject(err); }
var promedio = new PromedioPonderado();
var bids = body.bids;
for (var i = 0, len = bids.length; i < len; i++) {
var row = bids[i];
var bid = {Price: row[0], Amount: row[1]}
promedio.bid(bid);
}
var asks = body.asks;
for (var i = 0, len = asks.length; i < len; i++) {
var row = asks[i];
var ask = {Price: row[0], Amount: row[1]}
promedio.ask(ask);
}
var askReturn = promedio.askAverage(); //sync function
var bidReturn = promedio.bidAverage(); // sync function
console.log(askReturn)
resolve({Ask: askReturn, Bid: bidReturn}); //I want to return this value
});
})
console.log(price);
}

Downloading Docusign Signed File, but file data is encrypted

When I am trying to download the DocuSign Signed File, it is being downloaded but
the issue is that the file had some dropdowns and textboxes, and in downloaded file, the dropdowns and textboxes display encrypted data and not the real filled data, and one more issue is there, after the completion of document, I received the signed file on my email but the selected dropdown value overlaps over the following textbox and the signed pdf becomes non-readable.
The code for downloading the file goes like this
// read how many documents are in the envelope
int docCount = docsList.EnvelopeDocuments.Count;
string filePath = null;
FileStream fs = null;
// loop through the envelope's documents and download each doc
for (int i = 0; i < docCount; i++)
{
// GetDocument() API call returns a MemoryStream
MemoryStream docStream = (MemoryStream)envelopesApi.GetDocument(accountId, envelopeId, docsList.EnvelopeDocuments[i].DocumentId);
// let's save the document to local file system
filePath = Path.GetTempPath() + Path.GetRandomFileName() + ".pdf";
fs = new FileStream(filePath, FileMode.Create);
docStream.Seek(0, SeekOrigin.Begin);
docStream.CopyTo(fs);
fs.Close();
Console.WriteLine("Envelope Document {0} has been downloaded to: {1}", i, filePath);
}
But the downloaded file will look like this with encrypted data
And this is the following document which I received on email after completion of the document, the first column is dropdown selected value which overlaps
This is how envelope request is created
EnvelopeDefinition envDef = new EnvelopeDefinition();
envDef.EmailSubject = _objLOA.Subject;
envDef.EmailBlurb = _objLOA.EmailBody;
string recipientEmail = _objLOA.ToEmail;
if(string.IsNullOrEmpty(_objLOA.RecipientName))
{
_objLOA.RecipientName = "Animesh";
}
string recipientName = _objLOA.RecipientName;
string templateRoleName = "Customer";
string TemplateId = "xxxxxx";
// assign recipient to template role by setting name, email, and role name. Note that the
// template role name must match the placeholder role name saved in your account template.
TemplateRole tRole = new TemplateRole();
var dropdownItems1 = new List<ListItem>();
var dropdownItems2 = new List<ListItem>();
var dropdownItems3 = new List<ListItem>();
var dropdownItems4 = new List<ListItem>();
var dropdownItems5 = new List<ListItem>();
var dropdownItems6 = new List<ListItem>();
var dropdownItems7 = new List<ListItem>();
var dropdownItems8 = new List<ListItem>();
var dropdownItems9 = new List<ListItem>();
var dropdownItems10 = new List<ListItem>();
dropdownItems1.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems2.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems3.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems4.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems5.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems6.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems7.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems8.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems9.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
dropdownItems10.Add(new ListItem()
{
Text = "Select",
Value = "-1",
Selected = "true"
});
foreach (Utility itemUtility in _objutilityList)
{
dropdownItems1.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems2.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems3.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems4.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems5.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems6.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems7.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems8.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems9.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
dropdownItems10.Add(new ListItem()
{
Text = itemUtility.Name,
Value = itemUtility.Id.ToString()
});
}
List<Text> _listText = new List<Text>();
int rowNumber = 1;
foreach(LOACustomerData _loaresponseitem in _objLOA.LOACustomerData)
{
Text itemTextESI = new Text();
Text itemTextAddress = new Text();
itemTextESI.TabLabel = "txtESI" + rowNumber;
itemTextESI.OriginalValue = _loaresponseitem.AccountNumber;
itemTextESI.Value = _loaresponseitem.AccountNumber;
itemTextAddress.TabLabel = "txtServiceAddress" + rowNumber;
itemTextAddress.OriginalValue = _loaresponseitem.ServiceAddress;
itemTextAddress.Value = _loaresponseitem.ServiceAddress;
_listText.Add(itemTextAddress);
_listText.Add(itemTextESI);
if (rowNumber == 1)
{
ListItem item = dropdownItems1.Find(x => x.Value == _loaresponseitem.UtilityId.ToString());
if(item!=null)
item.Selected = "true";
}
else if (rowNumber == 2)
{
dropdownItems2.Find(x => x.Value == "-1").Selected = "false";
dropdownItems2.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
}
else if (rowNumber == 3)
dropdownItems3.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 4)
dropdownItems4.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 5)
dropdownItems5.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 6)
dropdownItems6.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 7)
dropdownItems7.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 8)
dropdownItems8.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 9)
dropdownItems9.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
else if (rowNumber == 10)
dropdownItems10.Find(x => x.Value == _loaresponseitem.UtilityId.ToString()).Selected = "true";
rowNumber++;
if (rowNumber > 10)
break;
}
tRole.Tabs = new Tabs()
{
TextTabs = _listText,
ListTabs = new List<List>()
{
new List(){ TabLabel = "ddlUtility1", ListItems = dropdownItems1 },
new List(){ TabLabel = "ddlUtility2", ListItems = dropdownItems2 },
new List(){ TabLabel = "ddlUtility3", ListItems = dropdownItems3 },
new List(){ TabLabel = "ddlUtility4", ListItems = dropdownItems4 },
new List(){ TabLabel = "ddlUtility5", ListItems = dropdownItems5 },
new List(){ TabLabel = "ddlUtility6", ListItems = dropdownItems6 },
new List(){ TabLabel = "ddlUtility7", ListItems = dropdownItems7 },
new List(){ TabLabel = "ddlUtility8", ListItems = dropdownItems8 },
new List(){ TabLabel = "ddlUtility9", ListItems = dropdownItems9 },
new List(){ TabLabel = "ddlUtility10", ListItems = dropdownItems10 }
}
};
tRole.Email = recipientEmail;
tRole.Name = recipientName;
tRole.RoleName = templateRoleName;
List<TemplateRole> rolesList = new List<TemplateRole>() { tRole };
envDef.TemplateRoles = rolesList;
envDef.TemplateId = TemplateId;
envDef.Status = "sent";
EnvelopesApi envelopesApi = new EnvelopesApi(cfi);
EnvelopeSummary envelopeSummary = envelopesApi.CreateEnvelope(accountID, envDef);

How to handle the node server side with react

Im working on react and node project. Im new to both technologies, and i developed a system for my internship. But I feel like, I didn't handle the server side (Node part) properly. This is my server side file. It container almost 700 lines. Do I have to break this page in to several pages? If so, how exactly I should do it? Can someone give me a suggestion please. The application is working as expected. I just want to clean the code in the server side. I used express framework with node.
var express = require('express');
var mysql = require('mysql');
var _ = require('underscore');
var crypto = require('crypto');
var app = express();
var connections = [];
var title = 'Fishery Logistics';
var flds = [];
var currentFld = '';
var fldDetails = [];
var lfrSaved = false;
var userSiteInfoSaved = false;
var userList = [];
var userTypes = [];
var validUserName = false;
var fldNumbers = [];
var productCodes = [];
var containerTypes = [];
var areaCodes = [];
var fldRows = 0;
var fldInfo = {};
var productInfo = {};
var weighInList = {};
var weighInSaved = false;
var weighInNumbers = [];
var weighInWeights = [];
var fldHeaderInfo = [];
var weighInHeaderInfo = [];
var fldWeights = [];
var userDeleted = false;
// From where express should access our files
app.use(express.static('./public'));
app.use(express.static('./node_modules/bootstrap/dist'));
var server = app.listen(process.env.PORT || 3000);
// Creating a socket server which is also listeing to localhost:<port>
var io = require('socket.io').listen(server);
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: '',
database: 'fish_landing'
});
io.sockets.on('connection', function(socket) {
// Load fld list relevant to a LFR
socket.on('lfrFldListLoad', function(payload) {
var lfr_id = payload.lfrId;
var sql_lfr_fld_list = 'SELECT F.fld_id, F.fld_number, DATE_FORMAT(F.landed_date, "%Y-%m-%d") AS "landed_date", F.vessel_name, F.port_name, F.transport_company_name, F.driver_name, truck_number, FS.status ' +
'FROM fld F, fld_status FS, lfr L ' +
'WHERE F.status_id = FS.status_id ' +
'AND F.lfr_id = L.lfr_id ' +
'AND L.lfr_id = ' + lfr_id +
' ORDER BY F.fld_id DESC';
connection.query(sql_lfr_fld_list, function(error, result) {
if (error) {
console.log(error);
}
if (result.length !== 0) {
flds = result;
io.sockets.emit('lfrFldListLoaded', flds);
} else {
console.log('No Records Found')
}
});
});
// Load fld with all the details
socket.on('fldViewLoad', function(payload) {
var fld_id = payload.fldId;
var sql_fld_by_id =
'SELECT F.fld_id, F.fld_number, DATE_FORMAT(F.landed_date, "%Y-%m-%d") AS "landed_date", DATE_FORMAT(F.landed_date, "%T") AS "landed_time", ' +
'F.port_name, F.vessel_name, F.skipper_name, F.transport_company_name, F.truck_number, F.driver_name, F.driver_license, F.vehicle_clean, ' +
'F.vehicle_refrigerated, F.containers_clean, F.containers_iced, F.skipper_signature, F.supervisor_signature, F.lfr_staff_signature, ' +
'F.skipper_signature_time, F.supervisor_signature_time, F.lfr_staff_signature_time, F.comment, FS.status, CONCAT(U.first_name, " ", U.last_name) AS "full_name", ' +
'DATE_FORMAT(F.fld_created_time, "%Y-%m-%d") AS "fld_created_date", DATE_FORMAT(F.fld_created_time, "%T") AS "fld_created_time" ' +
'FROM fld F, fld_status FS, user_personal_info U ' +
'WHERE F.status_id = FS.status_id ' +
'AND F.fld_created_user_id = U.user_id ' +
'AND F.fld_id = "' + fld_id + '"';
var sql_fld_detail_list =
'SELECT FD.fld_detail_id, SP.species, PS.state, C.container, FD.no_of_containers, FD.fld_id ' +
'FROM fld_details FD, species SP, processed_state PS, container C, fld F ' +
'WHERE F.fld_id = FD.fld_id ' +
'AND SP.species_id = FD.species_id ' +
'AND PS.state_id = FD.state_id ' +
'AND C.container_id = FD.container_id ' +
'AND F.fld_id = "' + fld_id + '"';
connection.query(sql_fld_by_id, function(errorFld, resultFld) {
if (errorFld) {
console.log(errorFld);
}
if (resultFld.length !== 0) {
currentFld = resultFld;
connection.query(sql_fld_detail_list, function(errorFldDetails, resultFldDetails) {
if (errorFldDetails) {
console.log(errorFldDetails);
} else {
fldDetails = resultFldDetails;
io.sockets.emit('fldViewLoaded', currentFld, fldDetails);
}
});
} else {
console.log('Fld Length Error')
}
});
});
// Save company info
socket.on('saveCompanyInfo', function(payload) {
var companyName = payload.companyName;
var registrationNo = payload.registrationNo;
var landlineNo = payload.landlineNo;
var mobileNo = payload.mobileNo;
var emailAddress = payload.emailAddress;
var companyLogo = payload.companyLogo;
var jsonFile = payload.jsonFile;
var sql_save_company_info =
`INSERT INTO lfr (lfr_name, registration_number, landline_number, mobile_number, email_address, lfr_logo, json_file)
VALUES ('${companyName}', '${registrationNo}', '${landlineNo}', '${mobileNo}', '${emailAddress}', '${companyLogo}', '${jsonFile}')`;
connection.query(sql_save_company_info, function(errorLfrInfo, resultLfrInfo) {
if (errorLfrInfo) {
lfrSaved = false;
console.log(errorLfrInfo);
}
if (resultLfrInfo) {
lfrSaved = true;
} else {
lfrSaved = false;
}
io.sockets.emit('companyInfoSaved', lfrSaved);
});
});
// Load user list for lfr
socket.on('userListLoad', function(payload) {
var lfrId = payload.lfrId;
var load_user_list =
`SELECT USI.user_id, USI.user_name, UT.user_type, USI.email_address, USI.passcord, US.status_type
FROM user_site_info USI, user_types UT, user_status US
WHERE USI.user_type_id = UT.user_type_id
AND USI.user_status_id = US.user_status_id
AND lfr_id = ${lfrId}`;
connection.query(load_user_list, function(errorUserList, resultUserList) {
if (errorUserList) {
console.log(errorUserList);
} else {
userList = resultUserList;
io.sockets.emit('userListLoaded', userList);
}
});
});
// Load organization form
socket.on('loadOrganization', function() {
io.sockets.emit('organizationLoaded');
});
// Load main form
socket.on('loadMain', function() {
io.sockets.emit('mainLoaded');
});
// Delete user
socket.on('deleteUser', function(payload) {
var lfrId = payload.lfrId;
var userId = payload.userId;
var delete_user =
`UPDATE user_site_info
SET user_status_id = '2'
WHERE user_id = ${userId}`;
var load_user_list =
`SELECT USI.user_id, USI.user_name, UT.user_type, USI.email_address, USI.passcord, US.status_type
FROM user_site_info USI, user_types UT, user_status US
WHERE USI.user_type_id = UT.user_type_id
AND USI.user_status_id = US.user_status_id
AND lfr_id = ${lfrId}`;
connection.query(delete_user, function(error, result) {
if (error) {
console.log(error);
}
if (result) {
connection.query(load_user_list, function(errorUserList, resultUserList) {
if (errorUserList) {
console.log(errorUserList);
} else {
userDeleted = true;
userList = resultUserList;
io.sockets.emit('userDeleted', userDeleted, userList);
}
});
} else {
userDeleted = false;
}
});
});
// Delete weigh in
socket.on('deleteWeighIn', function(payload) {
var weighInId = payload.weighInId;
var sql_delete_weigh_in =
`DELETE FROM weigh_in
WHERE weigh_in_id = ${weighInId}`;
var sql_delete_weigh_in_details =
`DELETE FROM weigh_in_details
WHERE weigh_in_id = ${weighInId}`;
connection.query(sql_delete_weigh_in, function(errorDeleteWightIn, resultDeleteWightIn) {
if (errorDeleteWightIn) {
console.log(errorDeleteWightIn);
}
connection.query(sql_delete_weigh_in_details, function(errorDeleteWightInDetails, resultDeleteWightInDetails) {
if (errorDeleteWightInDetails) {
console.log(errorDeleteWightInDetails);
}
if (resultDeleteWightInDetails) {
io.sockets.emit('weighInDeleted');
} else {
console.log('Weigh-In Deletion Error');
}
});
});
});
// Reset weigh-in list
socket.on('resetWeighInList', function() {
io.sockets.emit('weighInListReset');
});
// Save user site info
socket.on('saveUserSiteInfo', function(payload) {
var userName = payload.userName;
var userTypeId = payload.userType;
var emailAddress = payload.emailAddress;
var passcord = crypto.createHash('sha1').update(payload.passcord).digest("hex");
var userStatusId = 1;
var lfrId = payload.lfrId;
var sql_user_site_info =
`INSERT INTO user_site_info (user_name, user_type_id, email_address, passcord, user_status_id, lfr_id)
VALUES ('${userName}','${userTypeId}', '${emailAddress}', '${(passcord)}','${userStatusId}', '${lfrId}')`;
var load_user_list =
`SELECT USI.user_id, USI.user_name, UT.user_type, USI.email_address, USI.passcord, US.status_type
FROM user_site_info USI, user_types UT, user_status US
WHERE USI.user_type_id = UT.user_type_id
AND USI.user_status_id = US.user_status_id
AND lfr_id = ${lfrId}`;
connection.query(sql_user_site_info, function(errorUserInfo, resultUserInfo) {
if (errorUserInfo) {
userSiteInfoSaved = false;
console.log(errorUserInfo);
}
if (resultUserInfo) {
userSiteInfoSaved = true;
connection.query(load_user_list, function(errorUserList, resultUserList) {
if (errorUserList) {
console.log(errorUserList);
} else {
userList = resultUserList;
io.sockets.emit('userSiteInfoSaved', userSiteInfoSaved, userList);
}
});
} else {
console.log('User Info Saving Error')
}
});
});
// Save weigh in info
socket.on('saveWeighInRecord', function(payload) {
var fldId = payload.fldId;
var weighInId = payload.fldId;
var productId = payload.productId;
var containerId = payload.containerId;
var amount = payload.amount;
var netWeight = payload.netWeight;
var areaId = payload.areaId;
var userId = payload.userId;
// Check if the record is the first of the weigh in id,
var sql_check_weigh_in =
`SELECT * FROM weigh_in
WHERE weigh_in_id = '${weighInId}'`;
connection.query(sql_check_weigh_in, function(errorCheck, resultCheck) {
if (errorCheck) {
console.log(errorCheck);
}
// If there is no recrod related to weigh in id, create the weigh in id
if (resultCheck.length === 0) {
var sql_weigh_in_header =
`INSERT INTO weigh_in (weigh_in_id, fld_id, logged_user_id, created_time)
VALUES('${weighInId}', '${fldId}', '${userId}', NOW())`;
connection.query(sql_weigh_in_header, function(errorHeader, resultHeader) {
if (errorHeader) {
console.log(errorHeader);
}
});
}
});
var sql_weigh_in_record =
`INSERT INTO weigh_in_details (product_id, container_id, number_of_containers, net_weight, area_id, weigh_in_id)
VALUES ('${productId}', '${containerId}','${amount}','${netWeight}','${areaId}','${weighInId}')`;
var sql_load_records =
`SELECT P.product_code, C.container, WD.number_of_containers, WD.net_weight, S.species_code, PS.state_code, G.grade, A.area_code
FROM product P, container C, species S, processed_state PS, grade G, area A, weigh_in_details WD
WHERE WD.product_id = P.product_id
AND WD.container_id = C.container_id
AND WD.area_id = A.area_id
AND P.species_id = S.species_id
AND P.state_id = PS.state_id
AND P.grade_id = G.grade_id
AND weigh_in_id = '${weighInId}'
ORDER BY weigh_in_detail_id ASC`;
connection.query(sql_weigh_in_record, function(errorRecord, resultRecord) {
if (errorRecord) {
console.log(errorRecord);
}
if (resultRecord) {
connection.query(sql_load_records, function(errorList, resultList) {
if (errorList) {
console.log(errorList);
} else {
weighInList = resultList;
io.sockets.emit('weighInRecordSaved', weighInList);
}
});
} else {
console.log('Weigh In Saving Error')
}
});
});
// Load user types
socket.on('loadUserTypes', function() {
var sql_user_types =
`SELECT user_type_id, user_type FROM user_types
ORDER BY user_type ASC`;
connection.query(sql_user_types, function(error, result) {
if (error) {
console.log(error);
}
if (result.length !== 0) {
userTypes = result;
io.sockets.emit('userTypesLoaded', userTypes);
} else {
console.log('User Type Error')
}
});
});
// Load weigh-in numbers
socket.on('loadWeighInNumbers', function(payload) {
var lfrId = payload.lfrId
var sql_load_weigh_in =
`SELECT W.weigh_in_id
FROM weigh_in W, fld F
WHERE W.weigh_in_id = F.fld_id
AND F.lfr_id = ${lfrId}`;
connection.query(sql_load_weigh_in, function(error, result) {
if (error) {
console.log(error);
}
if (result.length !== 0) {
weighInNumbers = result;
io.sockets.emit('weighInNumbersLoaded', weighInNumbers);
} else {
console.log('Weigh-In Error')
}
});
});
// Load fld, weigh-in weights
socket.on('loadWeighInWeights', function(payload) {
// weigh_in table weigh_in_id and fld table fld_id are same
var weighInId = payload.weighInId;
var sql_load_fld_weights =
`SELECT S.species, S.species_code, SUM(FD.no_of_containers * C.content_weight) AS 'fld_weight'
FROM fld_details FD, species S, container C
WHERE S.species_id = FD.species_id
AND FD.container_id = C.container_id
AND FD.fld_id = '${weighInId}'
GROUP BY S.species_code, 'fld_weight'
ORDER BY S.species_code`;
var sql_load_weigh_in_weights =
`SELECT S.species, S.species_code, SUM(WD.net_weight) AS 'weigh_in_weight'
FROM weigh_in_details WD, species S, product P, container C
WHERE P.species_id = S.species_id
AND WD.product_id = P.product_id
AND WD.container_id = C.container_id
AND WD.weigh_in_id = '${weighInId}'
GROUP BY S.species_code, 'weigh_in_weight'
ORDER BY S.species_code`;
var sql_load_fld_info =
`SELECT DATE_FORMAT(F.fld_created_time, "%Y-%m-%d") AS "fld_created_date", CONCAT(U.first_name, " ", U.last_name) AS "fld_created_by", COUNT(FD.fld_id) AS "fld_records"
FROM fld F, user_personal_info U, fld_details FD
WHERE F.fld_created_user_id = U.user_id
AND F.fld_id = FD.fld_id
AND F.fld_id = '${weighInId}'`;
var sql_load_weigh_info =
`SELECT DATE_FORMAT(created_time, "%Y-%m-%d") AS "weigh_in_created_date", CONCAT(U.first_name, " ", U.last_name) AS "weigh_in_created_by", COUNT(WD.weigh_in_id) AS "weigh_in_records"
FROM weigh_in W, user_personal_info U, weigh_in_details WD
WHERE W.logged_user_id = U.user_id
AND W.weigh_in_id = WD.weigh_in_id
AND W.weigh_in_id = '${weighInId}'`;
connection.query(sql_load_fld_weights, function(errorFldWeights, resultFldWeights) {
if (errorFldWeights) {
console.log(errorFldWeights);
}
if (resultFldWeights.length !== 0) {
connection.query(sql_load_weigh_in_weights, function(errorweighInWeights, resultWeighInWeights) {
if (errorweighInWeights) {
console.log(errorweighInWeights);
}
if (resultWeighInWeights.length !== 0) {
connection.query(sql_load_fld_info, function(errorFldInfo, resultFldInfo) {
connection.query(sql_load_weigh_info, function(errorWeighInInfo, resultWeighInInfo) {
fldWeights = resultFldWeights;
weighInWeights = resultWeighInWeights;
fldHeaderInfo = resultFldInfo;
weighInHeaderInfo = resultWeighInInfo;
io.sockets.emit('weighInWeightsLoaded', fldWeights, weighInWeights, fldHeaderInfo, weighInHeaderInfo);
});
});
} else {
console.log('Weigh-In Weights Error')
}
});
}
});
});
// Load weigh in combo boxes
socket.on('loadWeighInComboBoxes', function(payload) {
var lfr_id = payload.lfr_id;
var sql_load_fld_numbers = `
SELECT fld_id, fld_number FROM fld WHERE lfr_id = '${lfr_id}'
ORDER BY fld_number DESC `;
var sql_load_product_codes = `
SELECT product_id, product_code FROM product ORDER BY product_code ASC `;
var sql_load_containers = `
SELECT container_id, container FROM container WHERE lfr_id = ${lfr_id} ORDER BY container ASC`;
var sql_load_area_codes = `
SELECT area_id, area_code FROM area ORDER BY area_code ASC `;
connection.query(sql_load_fld_numbers, function(errorFld, resultFld) {
if (errorFld) {
console.log(errorFld);
}
connection.query(sql_load_product_codes, function(errorProducts, resultProducts) {
if (errorProducts) {
console.log(errorProducts);
}
connection.query(sql_load_containers, function(errorContainer, resultContainer) {
if (errorContainer) {
console.log(errorContainer);
}
connection.query(sql_load_area_codes, function(errorArea, resultArea) {
if (errorArea) {
console.log(errorArea);
}
fldNumbers = resultFld;
productCodes = resultProducts;
containerTypes = resultContainer;
areaCodes = resultArea;
io.sockets.emit('weighInComboBoxesLoaded', fldNumbers, productCodes, containerTypes, areaCodes);
});
});
});
});
});
// Get fld info and weigh in records that are relavent to weighInId
socket.on('loadFldWeighInInfo', function(payload) {
var fldId = payload.fldId;
var weighInId = payload.fldId;
var sql_get_fld_count =
`SELECT COUNT( * ) AS 'fld_rows'
FROM fld_details WHERE fld_id = '${fldId}'`;
var sql_get_fld_info =
`SELECT DATE_FORMAT(F.fld_created_time, "%Y-%m-%d") AS "fld_created_date", DATE_FORMAT(F.fld_created_time, "%T") AS "fld_created_time", CONCAT(U.first_name, " ", U.last_name) AS "created_by"
FROM fld F, user_personal_info U
WHERE F.fld_created_user_id = U.user_id
AND F.fld_id = '${fldId}'`;
var sql_load_records =
`SELECT P.product_code, C.container, WD.number_of_containers, WD.net_weight, S.species_code, PS.state_code, G.grade, A.area_code
FROM product P, container C, species S, processed_state PS, grade G, area A, weigh_in_details WD
WHERE WD.product_id = P.product_id
AND WD.container_id = C.container_id
AND WD.area_id = A.area_id
AND P.species_id = S.species_id
AND P.state_id = PS.state_id
AND P.grade_id = G.grade_id
AND weigh_in_id = '${weighInId}'
ORDER BY weigh_in_detail_id ASC `;
connection.query(sql_get_fld_count, function(errorFldCount, resultFldCount) {
if (errorFldCount) {
console.log(errorFldCount);
}
connection.query(sql_get_fld_info, function(errorFldInfo, resultFldInfo) {
if (errorFldInfo) {
console.log(errorFldInfo);
}
connection.query(sql_load_records, function(errorList, resultList) {
if (errorList) {
console.log(errorList);
} else {
fldRows = resultFldCount;
fldInfo = resultFldInfo;
weighInList = resultList;
io.sockets.emit('fldWeighInInfoLoaded', fldRows, fldInfo, weighInList);
}
});
});
});
});
// Get product info
socket.on('loadProductInfo', function(payload) {
var productId = payload.productId;
var sql_get_product_info =
`SELECT P.product_code, S.species_code, PS.state_code, G.grade
FROM product P, species S, processed_state PS, grade G
WHERE P.species_id = S.species_id
AND P.state_id = PS.state_id
AND P.grade_id = G.grade_id
AND P.product_id = '${productId}'`;
connection.query(sql_get_product_info, function(error, result) {
if (error) {
console.log(error);
}
if (result.length !== 0) {
productInfo = result;
io.sockets.emit('productInfoLoaded', productInfo);
} else {
console.log('No Records Found')
}
});
});
// Load user types
socket.on('checkUserName', function(payload) {
var userName = payload.userName;
var sql_check_user_name =
`SELECT * from user_site_info
WHERE user_name = '${userName}'`;
connection.query(sql_check_user_name, function(error, result) {
if (error) {
console.log(error);
}
if (result.length !== 0) {
validUserName = false;
} else {
validUserName = true;
}
io.sockets.emit('userNameChecked', validUserName);
});
});
// socket.emit => emit events that are handled by the client
socket.emit('welcome', {
title: title,
flds: flds,
currentFld: currentFld,
fldDetails: fldDetails,
lfrSaved: lfrSaved,
userSiteInfoSaved: userSiteInfoSaved,
userList: userList,
userTypes: userTypes,
fldNumbers: fldNumbers,
productCodes: productCodes,
containerTypes: containerTypes,
areaCodes: areaCodes,
fldRows: fldRows,
fldInfo: fldInfo,
productInfo: productInfo,
weighInList: weighInList,
weighInNumbers: weighInNumbers,
weighInWeights: weighInWeights,
fldHeaderInfo: fldHeaderInfo,
weighInHeaderInfo: weighInHeaderInfo,
fldWeights: fldWeights,
userDeleted: userDeleted
});
connections.push(socket);
});
console.log(`Fishery Logistics is running at port ${ server.address().port }`);
You should definitely break this into several modules. Rule of thumb is to have controller modules and models.

How do you create a bank deposit using the Screen based API

I am currently in need of automating the creation of bank deposits using the screen based API.
What would be the best way of doing this?
This is how I managed to do it:
class Payment
{
public string Module;
public string Type;
public string RefNbr;
public decimal Amount;
}
class Program
{
static void Main(string[] args)
{
var paymentsToDeposit = new Payment[]
{
new Payment { Module = "AR", Type = "Payment", RefNbr = "000483", Amount = 100 },
new Payment { Module = "AR", Type = "Payment", RefNbr = "000484", Amount = 200 },
};
Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/bankDeposits/(W(53))/Soap/CA305000.asmx";
context.Login("admin", "admin");
Content bankDepositSchema = context.GetSchema();
List<Command> commands = new List<Command>();
commands.Add(new Value { Value = "<NEW>", LinkedCommand = bankDepositSchema.DepositSummary.ReferenceNbr });
commands.Add(new Value { Value = "102000", LinkedCommand = bankDepositSchema.DepositSummary.CashAccount });
commands.Add(new Value { Value = "test2", LinkedCommand = bankDepositSchema.DepositSummary.DocumentRef });
commands.Add(new Value { Value = "OK", LinkedCommand = bankDepositSchema.AddPaymentToDeposit.ServiceCommands.DialogAnswer, Commit = true });
decimal total = 0;
foreach(Payment pmt in paymentsToDeposit)
{
commands.Add(new Key { Value = "='" + pmt.Module + "'", FieldName = bankDepositSchema.AddPaymentToDeposit.DocModule.FieldName, ObjectName = bankDepositSchema.AddPaymentToDeposit.DocModule.ObjectName });
commands.Add(new Key { Value = "='" + pmt.Type + "'", FieldName = bankDepositSchema.AddPaymentToDeposit.Type.FieldName, ObjectName = bankDepositSchema.AddPaymentToDeposit.Type.ObjectName });
commands.Add(new Key { Value = "='" + pmt.RefNbr + "'", FieldName = bankDepositSchema.AddPaymentToDeposit.ReferenceNbr.FieldName, ObjectName = bankDepositSchema.AddPaymentToDeposit.ReferenceNbr.ObjectName });
commands.Add(new Value { Value = "True", LinkedCommand = bankDepositSchema.AddPaymentToDeposit.Selected, Commit = true });
total += pmt.Amount;
}
commands.Add(bankDepositSchema.Actions.AddPayment);
commands.Add(new Value { Value = total.ToString(System.Globalization.CultureInfo.InvariantCulture), LinkedCommand = bankDepositSchema.DepositSummary.ControlTotal });
commands.Add(bankDepositSchema.Actions.Save);
context.Submit(commands.ToArray());
context.Logout();
}
}

Enter Serial No In Shipment Document (SO302000) In Acumatica Using API

Can anyone help me with the following code which is trying to enter a Shipment with a mix of Serial and Non-Serial items. The error I am receiving says "PX.Data.PXException: Error #246: Failed to commit splits row." which would have something to do with the Serial allocation but I can't point out where the issue is coming from.
SO302000Content SO302000 = oScreen.SO302000GetSchema();
oScreen.SO302000Clear();
SO302000.Actions.AddSO.Commit = true;
SO302000.AddSalesOrder.Selected.LinkedCommand = null;
SO302000.DocumentDetails.InventoryID.LinkedCommand = null;
List<Command> oCmds = new List<Command>();
//Create Header.
oCmds.Add(SO302000.Actions.Insert);
oCmds.Add(new Value { Value = sCardCode, LinkedCommand = SO302000.ShipmentSummary.Customer, Commit = true });
oCmds.Add(new Value { Value = sCardLocation, LinkedCommand = SO302000.ShipmentSummary.Location });
oCmds.Add(new Value { Value = sWhsCode, LinkedCommand = SO302000.ShipmentSummary.WarehouseID });
oCmds.Add(SO302000.Actions.Save);
//Create Lines.
foreach (DataRow dR in ds.Tables[0].Rows)
{
dPackQty = Convert.ToDouble(dR["QtyPacked"]);
if (sSONbr == dR["SONbr"].ToString() && sItemCode == dR["ItemCode"].ToString())
{
dCount = dCount + 1;
}
else
{
sSONbr = dR["SONbr"].ToString();
sItemCode = dR["ItemCode"].ToString().Trim();
dCount = 0;
//oCmds.Add(new Value { Value = "OK", LinkedCommand = SO302000.AddSalesOrderOperation.ServiceCommands.DialogAnswer, Commit = true });
oCmds.Add(new Value { Value = "SO", LinkedCommand = SO302000.AddSalesOrderOperation.OrderType });
oCmds.Add(new Value { Value = sSONbr, LinkedCommand = SO302000.AddSalesOrderOperation.OrderNbr });
oCmds.Add(new Value { Value = "OK", LinkedCommand = SO302000.AddSalesOrder.ServiceCommands.DialogAnswer, Commit = true });
oCmds.Add(new Key { Value = sItemCode, FieldName = SO302000.AddSalesOrder.InventoryID.FieldName, ObjectName = SO302000.AddSalesOrder.InventoryID.ObjectName });
oCmds.Add(new Value { Value = "True", LinkedCommand = SO302000.AddSalesOrder.Selected, Commit = true });
oCmds.Add(SO302000.Actions.AddSO);
oCmds.Add(new Key { Value = "='" + sSONbr + "'", FieldName = SO302000.DocumentDetails.OrderNbr.FieldName, ObjectName = SO302000.DocumentDetails.OrderNbr.ObjectName });
oCmds.Add(new Key { Value = "='" + sItemCode + "'", FieldName = SO302000.DocumentDetails.InventoryID.FieldName, ObjectName = SO302000.DocumentDetails.InventoryID.ObjectName });
oCmds.Add(new Value { Value = "0", LinkedCommand = SO302000.DocumentDetails.ShippedQty, Commit = true });
}
if (dR["IsSerial"].ToString() == "Y")
{
oCmds.Add(new Value { Value = "OK", LinkedCommand = SO302000.Allocations.ServiceCommands.DialogAnswer, Commit = true });
oCmds.Add(new Value { Value = dCount.ToString(), LinkedCommand = SO302000.Allocations.ServiceCommands.RowNumber, Commit = true });
oCmds.Add(new Value { Value = dR["Serial"].ToString(), LinkedCommand = SO302000.Allocations.LotSerialNbr, Commit = true });
oCmds.Add(new Value { Value = dPackQty.ToString(), LinkedCommand = SO302000.Allocations.Quantity, Commit = true });
}
else
{
oCmds.Add(new Value { Value = "OK", LinkedCommand = SO302000.Allocations.ServiceCommands.DialogAnswer, Commit = true });
oCmds.Add(new Value { Value = dPackQty.ToString(), LinkedCommand = SO302000.Allocations.Quantity, Commit = true });
}
}
oCmds.Add(SO302000.Actions.Save);
//oCmds.Add(PO302000.DocumentSummary.TotalQty);
//oCmds.Add(PO302000.DocumentSummary.TotalAmt);
oScreen.SO302000Submit(oCmds.ToArray());
While trying to change the code that handles Non Serial item to use SO302000.DocumentDetails.ShippedQty instead of SO302000.Allocations.Quantity, it returns another error:
"PX.Data.PXRowPersistingException: Error #4: 'LineType' may not be empty."
Not sure what this one means.
Help is greatly appreciated :)
G
Please take a look
Content SO302000 = context.GetSchema();
context.Clear();
Content[] result = context.Submit(
new Command[]
{
new Value { Value = "001043", LinkedCommand = SO302000.ShipmentSummary.ShipmentNbr, Commit = true },
new Value { Value = "000819", LinkedCommand = SO302000.DocumentDetails.OrderNbr, Commit = true},
new Value { Value = "OK", LinkedCommand = SO302000.BinLotSerialNumbers.ServiceCommands.DialogAnswer, Commit = true },
SO302000.BinLotSerialNumbers.ServiceCommands.NewRow,
new Value { Value = "0-_", LinkedCommand = SO302000.BinLotSerialNumbers.Subitem },
new Value { Value = "WR01", LinkedCommand = SO302000.BinLotSerialNumbers.Location },
new Value { Value = "17SNR000751", LinkedCommand = SO302000.BinLotSerialNumbers.LotSerialNbr },
SO302000.Actions.LSSOShipLineBinLotSerial,
SO302000.Actions.Save
}
);
Console.WriteLine();

Resources