From efc505c12ef2b2d68348e4a5ec5b029dfd719c64 Mon Sep 17 00:00:00 2001 From: Marcus Lindvall Date: Thu, 30 Dec 2021 12:41:55 +0100 Subject: [PATCH] Warehouse module --- pyjeeves/repositories/warehouse.py | 142 +++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 pyjeeves/repositories/warehouse.py diff --git a/pyjeeves/repositories/warehouse.py b/pyjeeves/repositories/warehouse.py new file mode 100644 index 0000000..44e2466 --- /dev/null +++ b/pyjeeves/repositories/warehouse.py @@ -0,0 +1,142 @@ +from pyjeeves.models.raw import ArticleShelf, ItemReplenishmentLevels +from pyjeeves.models import db +from sqlalchemy.sql.expression import and_ +from sqlalchemy.orm.exc import NoResultFound + +from pyjeeves.repositories import Article + +from pyjeeves import logging +logger = logging.getLogger("PyJeeves." + __name__) + + +# Relocate Jeeves modules to separate folder and let a "master" module handle imports, and setup. +class Warehouse(): + """Handles articles in Jeeves, currently filters out all articles with class = 2""" + + @staticmethod + def get_shelf(shelf_id): + """ Query a shelf by id """ + try: + return db.raw_session.query(ArticleShelf).filter_by( + LagPlats=str(shelf_id) + ).one() + except NoResultFound: + raise KeyError + + @staticmethod + def get_all_shelfs(filter_=and_()): + # .filter_by(ItemStatusCode=0, ArtKod=2) + return db.raw_session.query(ArticleShelf).filter(filter_).all() + + @staticmethod + def delete_empty_shelfs(): + shelfs = db.raw_session.query(ArticleShelf).filter(and_( + ArticleShelf.LagStalle == 0, + ArticleShelf.JAPP_EWMS_zoneid.in_(['U', 'K', 'S']), + ArticleShelf.LagSaldo == 0)).all() + + for shelf in shelfs: + db.raw_db.delete(shelf) + + db.raw_db.commit() + logger.info('Deleted %s shelfs' % (len(shelfs))) + + @staticmethod + def delete_replenish(): + replenish = db.raw_session.query(ItemReplenishmentLevels).all() + + for repl in replenish: + db.raw_db.delete(repl) + + db.raw_db.commit() + logger.info('Deleted old replenishment levels') + + @staticmethod + def add_replenish(shelfs=[]): + Warehouse.delete_replenish() + + min_level = 54 # Should be how low we'd like the level to get. One layer on pallet? + max_level = 270 # How high is the roof? + + # with db.raw_session.no_autoflush: + for shelf in shelfs: + art = Article.get(shelf['article_no']) + + default_alt_unit = [unit for unit in art.ArticleUnit if unit.AltEnhetOrderStd == '1'] + if default_alt_unit and len(default_alt_unit) == 1: + if default_alt_unit[0].AltEnhetOmrFaktor is not None: + unit_multiple = default_alt_unit[0].AltEnhetOmrFaktor + else: + unit_multiple = default_alt_unit[0].ArticleAlternativeUnit.AltEnhetOmrFaktor + else: + unit_multiple = 1 + + new_level = ItemReplenishmentLevels( + LagStalle='0', LagPlats=shelf['shelf'], ArtNr=shelf['article_no'], + JAPP_EWMS_minnoofitemsonbin=min_level, + MaxNoOfItemsOnBin=max_level, + JAPP_EWMS_multipel=unit_multiple, + ForetagKod=1) + + db.raw_db.add(new_level) + db.raw_db.commit() + + +# TODO: Should be moved to separate project with Lindvalls specific code +def update_shelfs_from_csv(filename='shelf_numbers_20211217.csv'): + SHELF_TYPES = { + 'Hyllplats': 'HP', + 'Pallplats': 'PP', + 'Pallrad': 'PR' + } + SKIP_ZONES = ('U', 'K', 'KB', 'S', 'G') + + import csv + with open(filename, newline='') as csvfile: + shelfreader = csv.reader(csvfile, delimiter=',') + headers = shelfreader.__next__() + logger.info('Found these columns: %s' % (', '.join(headers))) + for row in shelfreader: + if row[3] in SKIP_ZONES: + continue + maxkg = int(row[4]) if row[4] else 0 + multiitems = '1' if row[2] == 'Pallrad' else '0' + n1 = ArticleShelf( + LagPlats=row[1], JAPP_EWMS_zoneid=row[3], LagStalle='0', + LagPlatsTyp=SHELF_TYPES.get(row[2]), MaxNoOfItemsOnBin=maxkg, + MultiItemsOnBin=multiitems, JAPP_EWMS_AllowMultipleBatchesOnBin=multiitems, + ForetagKod=1) + + db.raw_db.merge(n1) + db.raw_db.commit() + logger.info('Succesfully commited shelfs to database') + + +# TODO: Should be moved to separate project with Lindvalls specific code +def update_replenishment_levels(filename='repl_shelfs.csv'): + import csv + + repl_shelfs = [] + with open(filename, newline='') as csvfile: + shelfreader = csv.reader(csvfile, delimiter=',') + headers = shelfreader.__next__() + logger.info('Found these columns: %s' % (', '.join(headers))) + for row in shelfreader: + repl_shelfs.append({ + 'shelf': row[0], + 'article_no': str(row[1]) + }) + logger.info('Updating %d replenishment levels' % (len(repl_shelfs))) + Warehouse.add_replenish(repl_shelfs) + logger.info('Succesfully commited levels to database') + + +if __name__ == '__main__': + # from pprint import pprint + # all_shelfs = Warehouse.get_all_shelfs() + # pprint([shelf.to_dict() for shelf in all_shelfs]) + + # Warehouse.delete_empty_shelfs() + update_shelfs_from_csv() + + # update_replenishment_levels()