npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@janiscommerce/picking-helpers

v2.4.0

Published

Janis Picking Services helpers

Downloads

284

Readme

Picking Helpers

Build Status Coverage Status npm version

:warning:

Node 18 is required for this package's dependencies.

This package provides controllers to help process a picked item.

📦 Installation

npm install @janiscommerce/picking-helpers

Barcode Type Controller

It's a controller to communicate with Catalog service and get the Barcode Types.

Methods

  • barcodeType.get(getParams): Get barcode-types from Catalog service
    • Params:
      • getParams: Model get params such as filters.
    • Returns:
      • Array of objects The obtained barcode-types
const { BarcodeType } = require('@janiscommerce/picking-helpers');

const barcodeType = this.session.getSessionInstance(BarcodeType);

const barcodeTypes = await barcodeType.get({ filters: { id: '642b45ed9abb57f2b8afb9e5' } });

/*
    response: [
        {
            id: '642b45ed9abb57f2b8afb9e5',
            name: 'SomeBarcodeType',
            type: 'ean13',
            // ...
        }
    ]
*/

Barcode Controller

It's a controller to validate and process EAN-13 and code128 barcodes.

Methods

Validate Barcode Length

  • Barcode.validateLength(barcodeToValidate, barcodeTypes): Validate the barcode length
    • Params:
      • barcodeToValidate: [String] picked Barcode
      • barcodeTypes: (optional) [Object | Array of objects] Item's Barcode Types (from Catalog service), used only for code128, if not received, it will be processed as EAN.
    • Returns:
      • Boolean
const { Barcode } = require('@janiscommerce/picking-helpers');

// EAN
Barcode.validateLength('7002454050008'); // response: true
Barcode.validateLength('7002'); // response: false

// code128
const barcodeType = {
    name: 'SomeBarcodeType',
    type: 'code128',
    length: 15,
    // ...
}

Barcode.validateLength('700245405000848', [barcodeType]); // response: true
Barcode.validateLength('7002', barcodeType); // response: false

Get SKU Identifiers

  • Barcode.getSkuIdentifiers(barcode, barcodeTypes): Returns the SKU Identifiers
    • Params:
      • barcode: String picked Barcode
      • barcodeTypes: (optional) [Object | Array of objects] Item's Barcode Types (from Catalog service), used only for code128, if not received, it will be processed as EAN.
    • Returns
      • Array of String
const { Barcode } = require('@janiscommerce/picking-helpers');

// EAN
Barcode.getSkuIdentifiers('123456789123');

/*
    response: [
        '1234567890005',
        '1234567800004',
        '1234567000008',
        '1234560000005',
        '1234500000003'
    ]
*/

// code128
const barcodeType = {
    name: 'SomeBarcodeType',
    type: 'code128',
    length: 15
    catalogation: {
        referenceIdPosition: {
            start: 0,
            end: 6
        }
    }
    // ...
}

Barcode.getSkuIdentifiers('123456000098765', [barcodeType]);

/*
    response: ['123456']
*/

Get Barcode Variables

  • Barcode.getVariables(barcode, productGroups|barcodeTypes): Returns the variables according to the barcode and its Product Group behavior or Barcode Type variables
    • Params:
      • barcode: [String] picked Barcode
      • productGroups|barcodeTypes: (optional) [Object | Array of objects] Item's Product Groups or Barcode Types. Product Groups will only work for EAN and if this parameter is not passed the barcode will be processed as EAN.
    • Returns:
      • Object with variable type as key, if there is no variable type, the key will be default.
const { Barcode } = require('@janiscommerce/picking-helpers');

// EAN
const productGroup = {
    name: 'Pets Food',
    behaviors:{
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr,
        skuIdentifierLength: 7
    }
    // ...
}

Barcode.getVariables('7002454040008');

/*
    response: {
        default: 4000
    }
*/

Barcode.getVariables('7002454009008', [productGroup]);

/*
    response: {
        quantity: 900
    }
*/

//code128
const barcodeType = {
    name: 'SomeBarcodeType',
    type:'code128',
    length: 15,
    variables: [
        {
            type: 'price',
            position: {
                start: 7,
                end: 11
            }
        },
        {
            type: 'quantity',
            position: {
                start: 12,
                end: 15
            }
        }
    ],
    catalogation: {
        referenceIdPosition: {
            start: 0,
            end: 6
        }
    }
}

Barcode.getVariables('700245407009035', [barcodeType]);

/*
    response: {
        price: 700,
        quantity: 35
    }
*/

Get Original Barcode

  • Barcode.getOriginal(barcode, productGroups|barcodeTypes, length): Identify according to the Product Groups or Barcode Types.
    • Params:
      • barcode: [String] picked Barcode
      • productGroups|barcodeTypes: (optional) [Object | Array of objects] Item's Product Groups or Barcode Types. Product Groups will only work for EAN and if this parameter is not passed the barcode will be processed as EAN.
      • length: (optional) [Number] SKU Identifier length, only for EAN, if it's not passed, will try to search it in the Product Group/Barcode Type.
    • Returns:
      • String original Barcode
const { Barcode } = require('@janiscommerce/picking-helpers');

// EAN
const productGroup = {
    name: 'Pets Food',
    behaviors:{
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr,
        skuIdentifierLength: 7
    }
    // ...
}

Barcode.getOriginal('7002454050008'); // response: 7002454050008
Barcode.getOriginal('7002454050008', [productGroup]); // response: 7002454000004

//code128
const barcodeType = {
    name: 'SomeBarcodeType',
    type:'code128',
    length: 15,
    variables: [
        {
            type: 'price',
            position: {
                start: 7,
                end: 11
            }
        },
        {
            type: 'quantity',
            position: {
                start: 12,
                end: 15
            }
        }
    ],
    catalogation: {
        referenceIdPosition: {
            start: 0,
            end: 6
        }
    }
}

Barcode.getOriginal('700245407009035', [barcodeType]);

/*
    response: 7002454
*/

// Using completeWithZero: true
const barcodeTypeNew = {
    ...barcodeType,
    catalogation: {
        referenceIdPosition: {
            start: 0
            end: 6
        },
        completeWithZero: true
    }
}

Barcode.getOriginal('700245407009035', [barcodeType]);

/*
    response: 700245400009000
*/

Totals Controller

Identifies the real totals for picked items with EAN-13 and code128 barcodes.

:new: Calculating Totals with manualTotalQuantity

In scenarios where manualTotalQuantity is provided for a Picked Item, this value will be considered as the new totalQuantity. Additionally, the quantityPerEan will be recalculated based on the specified manualTotalQuantity. See the example below for clarification.

{
  "eanCount": 2,
  "quantityPerEan": 25,
  "totalQuantity": 50,
  "manualTotalQuantity": 50
}

:new: Calculating quantityPerEan and totalQuantity when the Picked Item has no Product Groups or its config is for Unitary items

Now when the Picked Item has no Product Groups or its config is for unitary items, the totalQuantity and quantityPerEan will be calculated using the Picked Item's sellingUnitMultiplier (if available). See examples below.

  • Totals.calculate(pickedItem): Process the item and returns the totals according to the Barcode, Product Groups or BarcodeTypes and Measurement Units.
    • Params:
      • pickedItem: [Object]
      • Response: Object

:information_source: Picked item's Product Groups will only work for EAN barcodes, for code128 use Picked item's Barcode Types, EANs also work with Barcode Types that are type 'ean13'.

Response

The response will have the next fields:

  • eanCount: Total numbers of units per Barcode/Ean
  • pricePerUnit: Price per unit per Barcode (only when barcode with price and quantity variables is present)
  • quantityPerEan: Quantity per Barcode/Ean
  • totalQuantity: Total Quantity
  • error: The error message (only if cannot process the item)

Available variable types

  • expirationDate: (only for code128) Item's expiration date
  • batch: (only for code128) Item's batch
  • price: Item's price
  • quantity: Item's quantity
  • none: No behavior

:warning: Any other type not listed here will be considered unknown and cannot be processed.

Example

const { Totals } = require('@janiscommerce/picking-helpers');

// EAN
const pickedItem = {
    price: 50,
    unitMultiplier: 1,
    sellingUnitMultiplier: 1,
    measurementUnit: 'gr',
    sellingMeasurementUnit: 'gr',
    barcode: '7002454005009', // still compatible with 'ean' field
    eanCount: 2, // still compatible with 'eanCount' field
    productGroups: [{
        behaviors: {
            eanVariableType: 'quantity',
            eanMeasurementUnit: 'gr'
        }
    }]
    // ...
}

Totals.calculate(pickedItem);

/*
    response: {
        eanCount: 2,
        quantityPerEan: 500,
        totalQuantity: 1000
    }
*/

//code128
const pickedItem = {
    price: 70,
    unitMultiplier: 1,
    sellingUnitMultiplier: 1,
    measurementUnit: 'gr',
    sellingMeasurementUnit: 'gr',
    barcode: '700245407009035',
    eanCount: 2,
    barcodeTypes: [{
        name: 'SomeBarcodeType',
        type:'code128',
        length: 15,
        variables: [
            {
                type: 'price',
                position: {
                    start: 7,
                    end: 11
                }
            },
            {
                type: 'quantity',
                position: {
                    start: 12,
                    end: 15
                }
            }
        ],
        catalogation: {
            referenceIdPosition: {
                start: 0,
                end: 6
            }
        }
    }]
}

Totals.calculate(pickedItem);

/*
    response: {
        eanCount: 2,
        pricePerUnit: 10
        quantityPerEan: 35,
        totalQuantity: 70
    }
*/

// Calculating totals without Product Groups
const pickedItem = {
    price: 50,
    unitMultiplier: 1,
    sellingUnitMultiplier: 1.25,
    measurementUnit: 'gr',
    sellingMeasurementUnit: 'gr',
    barcode: '7002454005009', // still compatible with 'ean' field
    eanCount: 2, // still compatible with 'eanCount' field
    productGroups: []
    // ...
}

Totals.calculate(pickedItem);

/*
    response: {
        eanCount: 2,
        quantityPerEan: 2.5,
        totalQuantity: 2.5
    }
*/

:warning: Deprecated Controllers

These controllers are kept for retrocompatibily and they still work as exactly as they used to, including the method names, parameters and responses.

EAN Controller

:warning: Deprecated: Use Barcode controller instead.

It is a controller for validate and process EAN-13.

Methods

Validate EAN Length

  • Ean.validateEanLength(eanToValidate): Validate the EAN length
    • Params:
      • eanToValidate: String picked EAN
    • Returns:
      • Boolean
const { Ean } = require('@janiscommerce/picking-helpers');

console.log(Ean.validateEanLength('7002454050008'));// response: true
console.log(Ean.validateEanLength('7002')) // response: false

Get SKU Identifiers

  • Ean.getSkuIdentifiers(ean): Returns the SKU Identifier for many lengths
    • Params:
      • ean: String picked EAN
    • Returns:
      • Array of String
const { Ean } = require('@janiscommerce/picking-helpers');

console.log(Ean.getSkuIdentifiers('123456789123')); // response: ['1234567890005', '1234567800004', '1234567000008', '1234560000005', '1234500000003']

Get Ean Variable

  • Ean.getEanVariable(ean, productGroups): Returns the variable according to the EAN and the Product Group behavior.
    • Params:
      • ean: String picked EAN
      • productGroups: (optional) Array of Objects Item's Product Groups, if it are not passed will use only picked EAN
    • Returns:
      • Number
const { Ean } = require('@janiscommerce/picking-helpers');

const productGroup = {
    id: 'd555345345345as67a342a',
    referenceId: 'SRI-0123',
    name: 'Pets Food',
    behaviors: {
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr',
        skuIdentifierLength: 7
    }
}

console.log(Ean.getEanVariable('7002454040008')); // response: 4000
console.log(Ean.getEanVariable('7002454040008', [productGroup])); // response: 900

Get Original EAN

  • Ean.getOriginalEan(ean, productGroups, length): Identify according to the Product Groups and returns the original EAN
    • Params:
      • ean: String picked EAN
      • productGroups: (optional) Array of Objects Item's Product Groups, if it are not passed identify the original EAN with the picked EAN value
      • length: (optional) Number SKU Identifier length, if it is not passed will try to search it in the Product Group
    • Returns:
      • String original EAN

Example

const { Ean } = require('@janiscommerce/picking-helpers');

const productGroup = {
    id: 'd555345345345as67a342a',
    referenceId: 'SRI-0123',
    name: 'Pets Food',
    behaviors: {
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr',
        skuIdentifierLength: 7
    }
}

console.log(Ean.getOriginalEan('7002454050008')); // response: '7002454050008'
console.log(Ean.getOriginalEan('7002454050008', [productGroup])); // response: '7002454000004'

Totalizer Controller

:warning: Deprecated: Use Totals controller instead.

Controller for identify the real totals for a picked items.

  • Totalizer.calculate(pickedItem): Process the item, and returns the totals according with EAN, Products Groups Behaviors, Measurement Units.
    • Params:
      • pickedItem: Object
    • Response: See Next

Response

The response will have this fields

  • eanCount, Total numbers of units per EAN
  • quantityPerEan, Quantity Per EAN
  • totalQuantity, Total Quantity
  • error (only if cannot process the item)

Available EAN Variable Types

  • quantity
  • price
  • none or (no behavior)

Every other type will match as unknown and cannot be processed

Example

const { Totalizer } = require('@janiscommerce/picking-helpers');

const pickedItem = {
    // ... other fields that the controller not used
    price: 50,
	unitMultiplier: 1,
	sellingUnitMultiplier: 1,
    measurementUnit: 'gr',
	sellingMeasurementUnit: 'gr',
	ean: '7002454005009',
    eanCount: 2,
    productGroups: [{
        behaviors: {
            eanVariableType: 'quantity',
            eanMeasurementUnit: 'gr'
        }
    }]
};

console.log(Totalizer.calculate(pickedItem));

/* Response:
{
    eanCount: 2,
    quantityPerEan: 500,
    totalQuantity: 1000
}

*/

Quantity rounding

Now the quantities will be rounded taking into account the price in the EAN and the item's product group variable type

const { Totalizer } = require('@janiscommerce/picking-helpers');

const pickedItem = {
    // ... other fields that the controller not used
    price: 11.11,
	unitMultiplier: 1,
	sellingUnitMultiplier: 1,
    measurementUnit: 'un',
	sellingMeasurementUnit: 'un',
	ean: '2610610013888',
    eanCount: 1,
    productGroups: [{
        behaviors: {
            eanVariableType: 'price',
            eanDecimals: 2
        }
    }]
};

console.log(Totalizer.calculate(pickedItem));

/* Response (before changes):
{
    eanCount: 1,
    quantityPerEan: 1.2493249324932494
    totalQuantity: 1.2493249324932494
}

/* Response (after changes):
{
    eanCount: 1,
    quantityPerEan: 1.25,
    totalQuantity: 1.25
}
*/

WeighableEanGenerator

Class to generate a weighable ean from item data and item productGroups.

This class replaces the generateWeighableEan function, removed in version 1.3.0.

The usage is changed, the eanRules are replaced with the item productGroups directly and the quantity becomes inside itemData.

Before

const { generateWeighableEan } = require('@janiscommerce/picking-helpers');

const quantity = 1;

const eanRules = {
    skuIdentifierLength: 7,
    eanVariableType: 'quantity',
    eanMeasurementUnit: 'gr'
};

generateWeighableEan(quantity, eanRules, itemData);

After

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 1,
    measurementUnit: 'kg',
    ean: '1234567000001',
    sellingUnitMultiplier: 0.5
};

const productGroups = [{
    behaviors: {
        skuIdentifierLength: 7,
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr'
    }
}];

WeighableEanGenerator.generate(itemData, productGroups);

Examples

Generate ean with variableType quantity

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 1,
    measurementUnit: 'kg',
    ean: '1234567000001',
    sellingUnitMultiplier: 0.5
};

const productGroups = [{
    behaviors: {
        skuIdentifierLength: 7,
        eanVariableType: 'quantity',
        eanMeasurementUnit: 'gr'
    }
}];

console.log(WeighableEanGenerator.generate(itemData, productGroups));

// 1234567010007

Generate ean with variableType price

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 2,
    pricePerUnit: 2,
    measurementUnit: 'kg',
    ean: '1234567000001',
    sellingUnitMultiplier: 0.5
};

const productGroups = [{
    behaviors: {
        skuIdentifierLength: 7,
        eanVariableType: 'price',
        eanDecimals: 2
    }
}];

console.log(WeighableEanGenerator.generate(itemData, productGroups));

// 1234567008004

Generate ean with variableType quantity using barcode

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 1,
    measurementUnit: 'kg',
    ean: '1234567000001',
    sellingUnitMultiplier: 0.5
};

const productGroups = [{
    behaviors: {
        barcode: {
            type: 'ean13',
            length: 13,
            catalogation: {
                referenceIdPosition: {
                    start: 0,
                    end: 6
                },
                completeWithZero: true,
                useVerificationCode: true
            },
            variables: [
                {
                    type: 'quantity',
                    position: {
                        start: 7,
                        end: 11
                    },
                    features: {
                        unitMultiplier: 'gr'
                    }
                }
            ]
        }
    }
}];

console.log(WeighableEanGenerator.generate(itemData, productGroups));

// 1234567010007

Generate ean with variableType price using barcode

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 2,
    pricePerUnit: 2,
    measurementUnit: 'kg',
    ean: '1234567000001',
    sellingUnitMultiplier: 0.5
};

const productGroups = [{
    behaviors: {
        barcode: {
            type: 'ean13',
            length: 13,
            catalogation: {
                referenceIdPosition: {
                    start: 0,
                    end: 6
                },
                completeWithZero: true,
                useVerificationCode: true
            },
            variables: [
                {
                    type: 'price',
                    position: {
                        start: 7,
                        end: 11
                    },
                    features: {
                        decimals: 2
                    }
                }
            ]
        }
    }
}];

console.log(WeighableEanGenerator.generate(itemData, productGroups));

// 1234567008004

Generate ean with multiple variable types using barcode

const { WeighableEanGenerator } = require('@janiscommerce/picking-helpers');

const itemData = {
    quantity: 2,
    pricePerUnit: 2,
    sellingUnitMultiplier: 0.5,
    measurementUnit: 'kg',
    batch: '94853',
    expirationDate: '582814924',
    ean: '1234567000001'
};

const productGroups = [{
    behaviors: {
        barcode: {
            type: 'code128',
            catalogation: {
                referenceIdPosition: {
                    start: 0,
                    end: 7
                },
                completeWithZero: false,
                useVerificationCode: false
            },
            variables: [
                {
                    type: 'quantity',
                    features: {
                        unitMultiplier: 'gr'
                    },
                    position: {
                        start: 8,
                        end: 12
                    }
                },
                {
                    type: 'price',
                    features: {
                        decimals: 2
                    },
                    position: {
                        start: 14,
                        end: 18
                    }
                },
                {
                    type: 'batch',
                    position: {
                        start: 20,
                        end: 24
                    }
                },
                {
                    type: 'expirationDate',
                    position: {
                        start: 26,
                        end: 34
                    }
                }
            ]
        }
    }
}];

console.log(WeighableEanGenerator.generate(itemData, productGroups));

// 12345670020000008000948530582814924

generateBarcode

Function to generate a custom barcode from already formatted item data and barcode config

const { generateBarcode } = require('@janiscommerce/picking-helpers');

const itemData = {
    referenceId: "12345670",
    price: "0400",
    quantity: "2000",
    batch: "94853",
    expirationDate: "582814924",
};

const barcodeConfig = {
    type: 'code128',
    catalogation: {
        referenceIdPosition: {
            start: 0,
            end: 7
        },
        completeWithZero: false,
        useVerificationCode: false
    },
    variables: [
        {
            type: 'quantity',
            features: {
                unitMultiplier: 'gr'
            },
            position: {
                start: 8,
                end: 12
            }
        },
        {
            type: 'price',
            features: {
                decimals: 2
            },
            position: {
                start: 14,
                end: 18
            }
        },
        {
            type: 'batch',
            position: {
                start: 20,
                end: 24
            }
        },
        {
            type: 'expirationDate',
            position: {
                start: 26,
                end: 34
            }
        }
    ]
};

console.log(generateBarcode(itemData, barcodeConfig));

// 12345670020000004000948530582814924