Source code for checkdigit.gs1

# /usr/bin/env python

# This file is part of checkdigit.

# checkdigit is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# checkdigit is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with checkdigit.  If not, see <http://www.gnu.org/licenses/>.

"""Global Standards One.

GS1 provides a variety of different standards

This implementation includes support for the following:

- GSIN
- GLN
- GRAI
- GTIN-8/12/13/14
    - EAN-8
    - EAN-13
    - UPC-A
    - UPC-E
- SSCC
- etc. (all fixed length numeric GS1 data structures with a check digit)
"""

import math

from checkdigit._data import cleanse, convert, missing_template


[docs]def calculate(data: str) -> str: """Calculates GS1 Check Digit. This method works for all fixed length numeric GS1 data structures (including GDTI, GLN, GRAI, etc.) that require a check digit. Args: data: A string of characters Returns: str: The check digit that was missing Examples: >>> from checkdigit import gs1 >>> gs1.calculate("00199999980000110") '7' >>> gs1.calculate("67368623738347505") '1' """ data = cleanse(data) data = data[::-1] # Reverse the barcode, as last digit is always multiplied by 3 # Follows order 3, 1, 3, etc. # Use ceil to ensure all digits of data are matched with a weight (round up division) weights = (3, 1) * math.ceil(len(data) / 2) # Multiply each digit by its weight total_sum = sum(int(digit) * weight for digit, weight in zip(data, weights)) # Return final check digit and type of barcode return convert(10 - (total_sum % 10), False)
[docs]def validate(data: str) -> bool: """Validates GS1. This method works for all fixed length numeric GS1 data structures (including GDTI, GLN, GRAI, etc.) that require a check digit. Args: data: A string of characters representing a full GS1 code Returns: bool: A boolean representing whether the check digit validates the data or not Examples: >>> from checkdigit import gs1 >>> gs1.validate("224245438987081447") False >>> gs1.validate("961552634342856982") True """ # Data is cleansed by the calculate function return calculate(data[:-1]) == data[-1]
[docs]def missing(data: str) -> str: """Calculates a missing digit in a GS1 Code. This method works for all fixed length numeric GS1 data structures (including GDTI, GLN, GRAI, etc.) that require a check digit. Args: data: A string of characters representing a full ISBN code with a question mark representing a missing character Returns: str: The missing value that should've been where the question mark was Examples: >>> from checkdigit import gs1 >>> gs1.missing("?8945528") '9' >>> gs1.missing("992802?035392") '2' >>> gs1.missing("084085752492131?31") '7' >>> gs1.missing("846684302750007275") 'Invalid' """ return missing_template(data, "gs1")