The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

App::CheckDigitsUtils - Utilities related to check digits (CLI for Algorithm::CheckDigits)

VERSION

This document describes version 0.002 of App::CheckDigitsUtils (from Perl distribution App-CheckDigitsUtils), released on 2023-01-28.

SYNOPSIS

DESCRIPTION

This distribution includes several utilities related to check digits. They provide CLIs for Algorithm::CheckDigits.

FUNCTIONS

calc_check_digits

Usage:

calc_check_digits(%args) -> [$status_code, $reason, $payload, \%result_meta]

Calculate check digit(s) of number(s).

Examples:

  • Calculate a single EAN-8 number:

    calc_check_digits(numbers => ["9638-507"], method => "ean"); # -> [200, "OK", [96385074], {}]

Given a number without the check digit(s), e.g. the first 12 digits of an EAN-13, generate/complete the check digits.

Keywords: complete

This function is not exported.

Arguments ('*' denotes required arguments):

  • method* => str

    (No description)

  • numbers* => array[str]

    Numbers without the check digit(s).

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

check_check_digits

Usage:

check_check_digits(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check the check digit(s) of numbers.

Examples:

  • Check a single EAN-8 number (valid, exit code will be zero, message output to STDOUT):

    check_check_digits(numbers => ["9638-5074"], method => "ean");

    Result:

    [
      200,
      "All success",
      undef,
      {
        results => [{ item_id => 96385074, message => "OK", status => 200 }],
      },
    ]
  • Check a single EAN-8 number (valid, exit code will be zero, no message):

    check_check_digits(numbers => ["9638-5074"], method => "ean", quiet => 1);

    Result:

    [
      200,
      "All success",
      undef,
      {
        results => [{ item_id => 96385074, message => "OK", status => 200 }],
      },
    ]
  • Check a single EAN-8 number (invalid, exit code is non-zero, message output to STDOUT):

    check_check_digits(numbers => ["9638-5070"], method => "ean");

    Result:

    [
      400,
      "Incorrect check digit(s)",
      undef,
      {
        results => [
          {
            item_id => 96385070,
            message => "Incorrect check digit(s)",
            status  => 400,
          },
        ],
      },
    ]
  • Check a single EAN-8 number (invalid, exit code is non-zero, no message):

    check_check_digits(numbers => ["9638-5070"], method => "ean", quiet => 1);

    Result:

    [
      400,
      "Incorrect check digit(s)",
      undef,
      {
        results => [
          {
            item_id => 96385070,
            message => "Incorrect check digit(s)",
            status  => 400,
          },
        ],
      },
    ]

Given a list of numbers, e.g. EAN-8 numbers, will check the check digit(s) of each number.

Exit code will be non-zero all numbers are invalid. To check for individual numbers, use the JSON output.

This function is not exported.

Arguments ('*' denotes required arguments):

  • method* => str

    (No description)

  • numbers* => array[str]

    (No description)

  • quiet => bool

    If set to true, don't output message to STDOUT.

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

list_check_digits_methods

Usage:

list_check_digits_methods(%args) -> [$status_code, $reason, $payload, \%result_meta]

List methods supported by Algorithm::CheckDigits.

Examples:

  • List methods:

    list_check_digits_methods();

    Result:

    [
      200,
      "OK",
      [
        "2aus5",
        "aba_rn",
        "ahv_ch",
        "amex",
        "bahncard",
        "betriebsnummer",
        "blutbeutel",
        "bwpk_de",
        "bzue_de",
        "cas",
        "ccc_es",
        "code_39",
        "cpf",
        "cusip",
        "dem",
        "diners",
        "discover",
        "dni_es",
        "ean",
        "ecno",
        "einecs",
        "elincs",
        "enroute",
        "esr5_ch",
        "esr9_ch",
        "eurocard",
        "euronote",
        "happydigits",
        "hkid",
        "iban",
        "identcode_dp",
        "iln",
        "imei",
        "imeisv",
        "isan",
        "isbn",
        "isbn13",
        "isin",
        "ismn",
        "issn",
        "jcb",
        "klubkarstadt",
        "leitcode_dp",
        "mastercard",
        "miles&more",
        "nhs_gb",
        "nip",
        "nric_sg",
        "nve",
        "pa_de",
        "pkz",
        "postcheckkonti",
        "pzn",
        "rentenversicherung",
        "sedol",
        "sici",
        "siren",
        "siret",
        "tin_ie",
        "titulo_eleitor",
        "upc",
        "ups",
        "ustid_at",
        "ustid_be",
        "ustid_de",
        "ustid_dk",
        "ustid_fi",
        "ustid_gr",
        "ustid_ie",
        "ustid_lu",
        "ustid_nl",
        "ustid_pl",
        "ustid_pt",
        "vat_sl",
        "vatrn_at",
        "vatrn_be",
        "vatrn_dk",
        "vatrn_fi",
        "vatrn_gr",
        "vatrn_ie",
        "vatrn_lu",
        "vatrn_nl",
        "vatrn_pl",
        "vatrn_pt",
        "verhoeff",
        "visa",
        "wagonnr_br",
      ],
      {},
    ]
  • List methods with their summaries/descriptions:

    list_check_digits_methods(detail => 1);

    Result:

    [
      200,
      "OK",
      [
        { method => "2aus5", summary => "2 aus 5, 2 of 5, 2/5" },
        {
          method  => "aba_rn",
          summary => "American Bankers Association routing number (ABA RN)",
        },
        {
          method  => "ahv_ch",
          summary => "Alters- und Hinterlassenenversicherungsnummer, AHV (CH)",
        },
        { method => "amex", summary => "American Express credit cards" },
        { method => "bahncard", summary => "DB Bahncard (DE)" },
        { method => "betriebsnummer", summary => "Betriebsnummer (DE)" },
        { method => "blutbeutel", summary => "Eurocode, blood bags" },
        {
          method  => "bwpk_de",
          summary => "Personenkennummer der Bundeswehr (DE)",
        },
        {
          method  => "bzue_de",
          summary => "Beleglose Zahlschein\xC3\xBCberweisung, BZ\xC3\x9C (DE)",
        },
        { method => "cas", summary => "Chemical abstract service, CAS" },
        {
          method  => "ccc_es",
          summary => "C\xC3\xB3digo de Cuenta Corriente, CCC (ES)",
        },
        { method => "code_39", summary => "Code39, 3 of 9" },
        {
          method  => "cpf",
          summary => "Cadastro de Pessoas F\xC3\xADsicas, CPF (BR)",
        },
        {
          method  => "cusip",
          summary => "Committee on Uniform Security Identification Procedures, CUSIP (US)",
        },
        { method => "dem", summary => "Deutsche Mark Banknoten, DEM" },
        { method => "diners", summary => "Diner's club credit cards" },
        { method => "discover", summary => "Discover credit cards" },
        {
          method  => "dni_es",
          summary => "Documento nacional de identidad (ES)",
        },
        { method => "ean", summary => "European Article Number, EAN" },
        {
          method  => "ecno",
          summary => "European Commission number, EC-No (for chemicals)",
        },
        {
          method  => "einecs",
          summary => "European Inventory of Existing Commercial Chemical Substances, EINECS",
        },
        {
          method  => "elincs",
          summary => "European List of Notified Chemical Substances, ELINCS",
        },
        { method => "enroute", summary => "EnRoute credit cards" },
        {
          method  => "esr5_ch",
          summary => "Einzahlungsschein mit Referenz, ESR5 (CH)",
        },
        {
          method  => "esr9_ch",
          summary => "Einzahlungsschein mit Referenz, ESR9 (CH)",
        },
        { method => "eurocard", summary => "Eurocard credit cards" },
        { method => "euronote", summary => "Euro bank notes, EUR" },
        { method => "happydigits", summary => "Happy Digits (DE)" },
        { method => "hkid", summary => "Hong Kong Identity Card, HKID (HK)" },
        {
          method  => "iban",
          summary => "International Bank Account Number (IBAN)",
        },
        {
          method  => "identcode_dp",
          summary => "Identcode Deutsche Post AG (DE)",
        },
        { method => "iln", summary => "Global Location Number, GLN" },
        {
          method  => "imei",
          summary => "International Mobile Station Equipment Identity, IMEI",
        },
        {
          method  => "imeisv",
          summary => "International Mobile Station Equipment Identity and Software Version Number",
        },
        {
          method  => "isan",
          summary => "International Standard Audiovisual Number, ISAN",
        },
        {
          method  => "isbn",
          summary => "International Standard Book Number, ISBN10",
        },
        {
          method  => "isbn13",
          summary => "International Standard Book Number, ISBN13",
        },
        {
          method  => "isin",
          summary => "International Securities Identifikation Number, ISIN",
        },
        {
          method  => "ismn",
          summary => "International Standard Music Number, ISMN",
        },
        {
          method  => "issn",
          summary => "International Standard Serial Number, ISSN",
        },
        { method => "jcb", summary => "JCB credit cards" },
        { method => "klubkarstadt", summary => "Klub Karstadt (DE)" },
        {
          method  => "leitcode_dp",
          summary => "Leitcode Deutsche Post AG (DE)",
        },
        { method => "mastercard", summary => "Mastercard credit cards" },
        { method => "miles&more", summary => "Miles & More, Lufthansa (DE)" },
        { method => "nhs_gb", summary => "National Health Service, NHS (GB)" },
        { method => "nip", summary => "numer identyfikacji podatkowej, NIP" },
        {
          method  => "nric_sg",
          summary => "National Registration Identity Card, NRIC (SG)",
        },
        { method => "nve", summary => "Nummer der Versandeinheit, NVE, SSCC" },
        { method => "pa_de", summary => "Personalausweis (DE)" },
        { method => "pkz", summary => "Personenkennzahl der DDR" },
        { method => "postcheckkonti", summary => "Postscheckkonti (CH)" },
        { method => "pzn", summary => "Pharmazentralnummer (DE)" },
        {
          method  => "rentenversicherung",
          summary => "Rentenversicherungsnummer, VSNR (DE)",
        },
        {
          method  => "sedol",
          summary => "Stock Exchange Daily Official List, SEDOL (GB)",
        },
        { method => "sici", summary => "Value Added Tax number, VAT (DE)" },
        { method => "siren", summary => "SIREN (FR)" },
        { method => "siret", summary => "SIRET (FR)" },
        { method => "tin_ie", summary => "Tax Identification Number (IE)" },
        {
          method  => "titulo_eleitor",
          summary => "T\xC3\xADtulo Eleitoral (BR)",
        },
        { method => "upc", summary => "Universal Product Code, UPC (US, CA)" },
        { method => "ups", summary => "United Parcel Service, UPS" },
        {
          method  => "ustid_at",
          summary => "Umsatzsteuer-Identifikationsnummer (AT)",
        },
        {
          method  => "ustid_be",
          summary => "Umsatzsteuer-Identifikationsnummer (BE)",
        },
        {
          method  => "ustid_de",
          summary => "Umsatzsteuer-Identifikationsnummer (DE)",
        },
        {
          method  => "ustid_dk",
          summary => "Umsatzsteuer-Identifikationsnummer (DK)",
        },
        {
          method  => "ustid_fi",
          summary => "Umsatzsteuer-Identifikationsnummer (FI)",
        },
        {
          method  => "ustid_gr",
          summary => "Umsatzsteuer-Identifikationsnummer (GR)",
        },
        {
          method  => "ustid_ie",
          summary => "Umsatzsteuer-Identifikationsnummer (IE)",
        },
        {
          method  => "ustid_lu",
          summary => "Umsatzsteuer-Identifikationsnummer (LU)",
        },
        {
          method  => "ustid_nl",
          summary => "Umsatzsteuer-Identifikationsnummer (NL)",
        },
        {
          method  => "ustid_pl",
          summary => "Umsatzsteuer-Identifikationsnummer (PL)",
        },
        {
          method  => "ustid_pt",
          summary => "Umsatzsteuer-Identifikationsnummer (PT)",
        },
        { method => "vat_sl", summary => "Value Added Tax number, VAT (SL)" },
        { method => "vatrn_at", summary => "Value Added Tax number, VAT (AT)" },
        { method => "vatrn_be", summary => "Value Added Tax number, VAT (BE)" },
        { method => "vatrn_dk", summary => "Value Added Tax number, VAT (DK)" },
        { method => "vatrn_fi", summary => "Value Added Tax number, VAT (FI)" },
        { method => "vatrn_gr", summary => "Value Added Tax number, VAT (GR)" },
        { method => "vatrn_ie", summary => "Value Added Tax number, VAT (IE)" },
        { method => "vatrn_lu", summary => "Value Added Tax number, VAT (LU)" },
        { method => "vatrn_nl", summary => "Value Added Tax number, VAT (NL)" },
        { method => "vatrn_pl", summary => "Value Added Tax number, VAT (PL)" },
        { method => "vatrn_pt", summary => "Value Added Tax number, VAT (PT)" },
        { method => "verhoeff", summary => "Verhoeff scheme" },
        { method => "visa", summary => "VISA credit cards" },
        {
          method  => "wagonnr_br",
          summary => "Codifica\xC3\xA7\xC3\xA3o dos vag\xC3\xB5es (BR)",
        },
      ],
      { "table.fields" => ["method", "summary"] },
    ]

This function is not exported.

Arguments ('*' denotes required arguments):

  • detail => bool

    (No description)

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-CheckDigitsUtils.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-CheckDigitsUtils.

SEE ALSO

Algorithm::CheckDigits

For EAN-8 and EAN-13 only, there is App::EANUtils.

AUTHOR

perlancar <perlancar@cpan.org>

CONTRIBUTING

To contribute, you can send patches by email/via RT, or send pull requests on GitHub.

Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:

% prove -l

If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, Pod::Weaver::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE

This software is copyright (c) 2023 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-CheckDigitsUtils

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.