diff --git a/rattail_corepos/corepos/importing/db/exporters/catapult_inventory.py b/rattail_corepos/corepos/importing/db/exporters/catapult_inventory.py new file mode 100644 index 0000000..a80bdea --- /dev/null +++ b/rattail_corepos/corepos/importing/db/exporters/catapult_inventory.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8; -*- +################################################################################ +# +# Rattail -- Retail Software Framework +# Copyright © 2010-2020 Lance Edgar +# +# This file is part of Rattail. +# +# Rattail 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. +# +# Rattail 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 +# Rattail. If not, see . +# +################################################################################ +""" +CORE-POS -> Catapult Inventory Workbook +""" + +import logging + +from sqlalchemy import orm + +from corepos.db.office_op import model as corepos + +from rattail.util import OrderedDict +from rattail.importing.handlers import ToFileHandler +from rattail_corepos.corepos.importing.db.corepos import FromCoreHandler, FromCore +from rattail_onager.catapult.importing import inventory as catapult_importing + + +log = logging.getLogger(__name__) + + +class FromCoreToCatapult(FromCoreHandler, ToFileHandler): + """ + Handler for CORE -> Catapult (Inventory Workbook) + """ + host_title = "CORE-POS" + local_title = "Catapult (Inventory Workbook)" + + def get_importers(self): + importers = OrderedDict() + importers['InventoryItem'] = InventoryItemImporter + return importers + + +class InventoryItemImporter(FromCore, catapult_importing.model.InventoryItemImporter): + """ + Inventory Item data importer. + """ + host_model_class = corepos.Product + supported_fields = [ + 'item_id', + 'dept_id', + 'dept_name', + 'receipt_alias', + 'brand', + 'item_name', + 'size', + ] + + def query(self): + query = self.host_session.query(corepos.Product)\ + .order_by(corepos.Product.upc)\ + .options(orm.joinedload(corepos.Product.department)) + return query + + def normalize_host_object(self, product): + item_id = product.upc + + if not item_id: + log.warning("item_id could not be determined for product %s: %s", + product.uuid, product) + return + + if not item_id.isdigit(): + log.debug("item_id '%s' is not numeric for product %s: %s", + item_id, product.uuid, product) + return + + department = product.department + if not department: + log.warning("item_id %s has no department: %s", + item_id, product) + return + + return { + 'item_id': item_id, + 'dept_id': department.number, + 'dept_name': department.name, + 'receipt_alias': None, # TODO + 'brand': product.brand, + 'item_name': product.description, + 'size': product.size, + }