Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Description

This article describes how to create a voice pick code or voiceCode on a label used for shipping produce using field level scripting.

The Voice Pick standard calculation developed by YottaMark, Inc. for the voice data entry code is outlined in this document. 

Background

The PMA (Produce Marketing Association), CPMA (Canadian Produce Marketing Association), United Fresh, retailers, and dozens of shippers have endorsed the Produce Traceability Initiative (PTI) to implement a whole chain traceability system for produce supply chains.

The PTI requires that every case of produce have a label with a barcode incorporating a 14 digit GTIN, a Lot Code, and an optional date code.

However, in practice it is difficult for larger distribution centers to scan each barcode label on each case as the cases are received or picked for shipping.

The Voice Pick Code was developed to eliminate the need for scanning barcodes while picking cases for palletizing or receiving, and relies on the GTINs and Lot Codes being pre-entered into the Warehouse Management System (WMS) using an advanced shipping notice, or Hybrid Pallet Tag. Then when the individual cases are loaded the voice code alone is sufficient to identify the case, GTIN, and Lot Code.  

The voice code is a verbal data entry system to identify the carton being picked from pre-entered data.

When all cases on a pallet have the same GTIN and Lot Code, then it is sufficient to confirm the quantity of cases picked.

If cases are picked from a mixed pallet containing multiple GTIN and Lot Codes, then the Voice Code can be used to identify which GTIN and Lot Code is being picked without the need to scan the barcode. 

On the sample label below, the warehouse worker would speak the number "59", or on a mixed pallet possibly the code "98 59" and the quantity of the cases being picked to update their pick list.

The code generating script:

//////////////////////////////////////////////////////////////////////////////////////////////
// VoiceCode Calculation
//
// A VoiceCode is a 4 digit number computed using the GTIN, Lot, and optional Date from a PTI Case Label representing a hash of this information.
//
// This computation is performed as follows:
// PlainText is the 14 digit GTIN appended by the Lot Code and the Date (YYMMDD) in that order.
//  - Do not include the application identifier, prefixes or parentheses, spaces or date formatting characters
//
// Compute ANSI CRCX16 Hash of the PlainText ASCII bytes using the standard ANSI CRCX16 hash with the polynomial of X16 + X15 + X2 + 1
// Compute the VoiceCode  from the Hash 

//Print the two least significant digits large, and the two most significant digits small
// Example:
// GTIN = (01) 10850510002011
// Lot = (10) 46587443HG234
// PlainText = 1085051000201146587443HG234
// CRCX16 Hash = 26359
// VoiceCode = 6359
// Large Digits = 59
// Small Digits = 63
//
//
// Label Assumptions (case sensitive label field names)
// 1) There are three fields on your label named GTIN, LOT and PTIDATE to get the data to be used in this calculation
// 2) There are two fields on your label named largeDigits, smallDigits to set your voice pick values
//
//////////////////////////////////////////////////////////////////////////////////////////////

// set cyclic redundancy check table
var crcTable = new Array(
0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,
0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,
0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,
0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,
0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,
0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,
0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,
0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,
0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,
0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,
0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,
0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,
0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,
0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,
0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,
0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,
0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,
0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,
0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040);

// get label data GTIN & LOT & PTI DATE
var plainText = String(label.fields.field.(@name == 'GTIN').@data) + String(label.fields.field.(@name == 'LOT').@data) + String(label.fields.field.(@name == 'PTIDATE').@data);

var len = plainText.length;
var n;
var crc;

// set crc
crc = 0;

// calculate crc 
for (n = 0; n < len; n++)
{
crc = crcAdd(crc, plainText.charCodeAt(n));
}

// set small and large digits on your label
var voiceCode = crc.toString();

label.fields.field.(@name =='largeDigits').@data = voiceCode.slice(-2);
label.fields.field.(@name =='smallDigits').@data = voiceCode.slice(1,3);

function crcAdd(crc,c)
{
return crcTable[(crc ^ c) & 0xFF] ^ ((crc >> 8) & 0xFF);
}

More Information
Info

For additional information into the Voice Pick code standard and the Produce Traceability Initiative,

consult these resources:

see http://www.producetraceability.org/resources/voicecode.

Additional

For additional information on CRC check calculations

:

, see http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks.

Content by Label
showLabelsfalse
max5
spacesETSLPSKB
sortmodified
showSpacefalse
reversetrue
typepage
labelsvoicePick voice pick code PTI Milestone 7

Article Number

2014036

Versions

All versions that support field level scripting

Environment

This table provides information that is visible only to Loftware users.Any supported LPS family product environment

Page properties
hiddentrue

This table provides information that is visible only to Loftware users.

Linked Jira
JIRA
serverJira
serverIdb694bd2b-f495-3baf-a460-a9c93a1d1de3
keyOOB-413
Incident Number 
AuthorJohn MacDonald
Review Date