From a04c756913c1987b1eb2fa730f42bc37dbc8d083 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Sun, 10 Dec 2017 18:54:08 +0100 Subject: [PATCH] - validate EAN or UPC-A code - made Item Barcode Doctpye standard - added stdnum to requirements --- erpnext/stock/doctype/item/item.py | 12 ++- .../stock/doctype/item_barcode/__init__.py | 0 .../doctype/item_barcode/item_barcode.json | 102 ++++++++++++++++++ .../doctype/item_barcode/item_barcode.py | 10 ++ requirements.txt | 1 + 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 erpnext/stock/doctype/item_barcode/__init__.py create mode 100644 erpnext/stock/doctype/item_barcode/item_barcode.json create mode 100644 erpnext/stock/doctype/item_barcode/item_barcode.py diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 8871ba385c..8ccca7aa88 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -483,12 +483,18 @@ class Item(WebsiteGenerator): check_list.append(d.tax_type) def validate_barcode(self): + from stdnum import ean if len(self.barcodes) > 0: - for barcode in self.barcodes: - duplicate = frappe.db.sql("""select name from `tabItem Barcode` where barcode = %s and parent != %s""", (barcode, self.name)) + for item_barcode in self.barcodes: + duplicate = frappe.db.sql("""select name from `tabItem Barcode` where barcode = %s and parent != %s""", (item_barcode.barcode, self.name)) if duplicate: frappe.throw(_("Barcode {0} already used in Item {1}").format( - self.barcode, duplicate[0][0])) + item_barcode.barcode, duplicate[0][0])) + + if item_barcode.barcode_type: + if not ean.is_valid(item_barcode.barcode): + frappe.throw(_("Barcode {0} is not a valid {1} code").format( + item_barcode.barcode, item_barcode.barcode_type)) def validate_warehouse_for_reorder(self): '''Validate Reorder level table for duplicate and conditional mandatory''' diff --git a/erpnext/stock/doctype/item_barcode/__init__.py b/erpnext/stock/doctype/item_barcode/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/stock/doctype/item_barcode/item_barcode.json b/erpnext/stock/doctype/item_barcode/item_barcode.json new file mode 100644 index 0000000000..76cd061a2b --- /dev/null +++ b/erpnext/stock/doctype/item_barcode/item_barcode.json @@ -0,0 +1,102 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2017-12-09 18:54:50.562438", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "barcode", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Barcode", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 1 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "barcode_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Barcode Type", + "length": 0, + "no_copy": 0, + "options": "\nEAN\nUPC-A", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2017-12-10 18:39:10.566172", + "modified_by": "Administrator", + "module": "Stock", + "name": "Item Barcode", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/stock/doctype/item_barcode/item_barcode.py b/erpnext/stock/doctype/item_barcode/item_barcode.py new file mode 100644 index 0000000000..29d47f9968 --- /dev/null +++ b/erpnext/stock/doctype/item_barcode/item_barcode.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class ItemBarcode(Document): + pass diff --git a/requirements.txt b/requirements.txt index a6cfaf2ce4..7b5d8da616 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ frappe unidecode pygithub googlemaps +python-stdnum