{ "cells": [ { "cell_type": "code", "execution_count": null, "source": [ "from spielbergerscripts.spielbergerscripts.storageunit import Product, Bundle, NVE\r\n", "from spielbergerscripts.spielbergerscripts.connector import IBMConnector" ], "outputs": [], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "ibmconnect = IBMConnector(True)\r\n", "nveDict = ibmconnect.getNVETable()\r\n", "prodDict = ibmconnect.getProductsTable()" ], "outputs": [], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "extResource = dict()\r\n", "\r\n", "for nve in nveDict.values():\r\n", " prod = prodDict.get(nve.article)\r\n", "\r\n", " if not prod is None:\r\n", " if nve.area != '01' and nve.area != '02' and nve.area != prod.pickArea:\r\n", " extResource[(nve.article, nve.area, nve.vq)] = (prod.name, prod.bundle, extResource.get((nve.article, nve.area, nve.vq), ('', '', 0))[2] + nve.amount)" ], "outputs": [], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "ART_WU = set()\r\n", "\r\n", "for (pNr, area, vq), (pName, bundle, amount) in extResource.items():\r\n", " if area != '36' or bundle.strip() == \"25 KG\" or bundle.strip() == \"BIG-BAG\" or bundle.strip() == \"1000 ST\":\r\n", " continue\r\n", " print(f\"Lager {area}\\t{amount}x {pName.strip()} (#{pNr} / VQ{vq}) {bundle} auf Vorrat\")\r\n", " ART_WU.add(pNr)\r\n", "\r\n", "# zusätzlich\r\n", "ART_WU.union({\"062346\", \"062356\", \"062306\", \"062416\", \"104406\", \"104409\"})\r\n", "\r\n", "ART_WU = list(ART_WU)\r\n", "ART_WU.sort()" ], "outputs": [], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "\r\n", "from openpyxl import load_workbook\r\n", "from openpyxl.styles import Color, PatternFill\r\n", "\r\n", "from dataclasses import dataclass\r\n", "from datetime import date, datetime, timedelta\r\n", "\r\n", "@dataclass\r\n", "class Request:\r\n", " ordernr: str\r\n", " cust_name: str\r\n", " delivdate: date\r\n", " artnr: str\r\n", " artname: str\r\n", " bundle: str\r\n", " stock: int\r\n", " ordered: int\r\n", " ord_rem: int\r\n", " available: int\r\n", " avail_wo_36:int\r\n", " upcoming: int\r\n", " upc_date: str\r\n", " upc_area: str\r\n", " stock00: int\r\n", " stock01: int\r\n", " stock33: int\r\n", " stock36: int\r\n", "\r\n", " def from_tuple(t):\r\n", " d = str(t[2])\r\n", " szd = f\"20{d[-2:]}-{d[-4:-2]}-{int(d[:-4]):02d}\"\r\n", " return Request(\r\n", " ordernr=str(t[0]),\r\n", " cust_name=str(t[1]).strip(),\r\n", " delivdate=date.fromisoformat(szd),\r\n", " artnr=str(t[3]),\r\n", " artname=str(t[4]),\r\n", " bundle=str(t[5]),\r\n", " stock=int(t[6]),\r\n", " ordered=int(t[7]),\r\n", " ord_rem=int(t[23]),\r\n", " available=int(t[9]),\r\n", " avail_wo_36=int(t[28]),\r\n", " upcoming=int(t[10]),\r\n", " upc_date=date.fromisoformat(f\"20{str(t[11])[-2:]}-{str(t[11])[-4:-2]}-{int(str(t[11])[:-4]):02d}\") if int(t[10]) > 0 else None,\r\n", " upc_area=str(t[12]),\r\n", " stock00=int(t[24]),\r\n", " stock01=int(t[25]),\r\n", " stock33=int(t[26]),\r\n", " stock36=int(t[27]),\r\n", " )\r\n", "\r\n", "\r\n", "RED = Color(rgb='E6B8B7')\r\n", "\r\n", "FROM = datetime.now().date()\r\n", "TO = FROM + timedelta(days=14)\r\n", "\r\n", "if FROM.month == TO.month and FROM.year == TO.year:\r\n", " aufbes = list(map(lambda t: Request.from_tuple(t), ibmconnect.getNegAvail(FROM.day, TO.day, FROM.month, FROM.year)))\r\n", "else:\r\n", " temp_to = FROM + timedelta(days = 31 if FROM.day >= 15 else 20)\r\n", " temp_to = temp_to.replace(day = 1)\r\n", " print(f\"Temp to = {temp_to}\")\r\n", " temp_to = temp_to - timedelta(days=1)\r\n", " print(f\"Temp to = {temp_to}\")\r\n", " aufbes = list(map(lambda t: Request.from_tuple(t), ibmconnect.getNegAvail(FROM.day, temp_to.day, FROM.month, FROM.year)))\r\n", " temp_from = temp_to + timedelta(days=1)\r\n", " print(f\"Temp from = {temp_from}\")\r\n", " while temp_from.month < TO.month:\r\n", " temp_to = FROM + timedelta(days = 31 if FROM.day >= 15 else 20)\r\n", " temp_to = temp_to.replace(day=1)\r\n", " temp_to = temp_to - timedelta(days=1)\r\n", " aufbes.extend(map(lambda t: Request.from_tuple(t), ibmconnect.getNegAvail(temp_from.day, temp_to.day, temp_from.month, temp_from.year)))\r\n", " temp_from = temp_to + timedelta(days=1)\r\n", " \r\n", " # last month. temp_from is the current TO month\r\n", " aufbes.extend(map(lambda t: Request.from_tuple(t), ibmconnect.getNegAvail(temp_from.day, TO.day, temp_from.month, temp_from.year)))\r\n", " \r\n", "\r\n", "\r\n", "aufbes.sort(key = lambda a: a.delivdate)\r\n", "\r\n", "vorlage = load_workbook(\"Umfuhrplanung_Vorlage.xlsx\")\r\n", "\r\n", "for prodNr in ART_WU:\r\n", " aufbes_filt = [t for t in aufbes if t.artnr == prodNr]\r\n", "\r\n", " if len(aufbes_filt) > 0:\r\n", " prod = prodDict.get(prodNr)\r\n", " sheet = vorlage.copy_worksheet(vorlage[\"Vorlage\"])\r\n", " sheet.title = prodNr\r\n", " sheet['A1'] = f\"{prod.name.strip()} (#{prodNr})\"\r\n", " sheet['N1'] = f\"vom {FROM} bis inklussive {TO}\\n\\n\"\r\n", "\r\n", " first = aufbes_filt[0]\r\n", " bestand_00 = first.stock00\r\n", " bestand_01 = first.stock01\r\n", " bestand_33 = first.stock33\r\n", " bestand_36 = first.stock36\r\n", " \r\n", "\r\n", " we = first.upcoming\r\n", " we_dat = first.upc_date\r\n", " we_area = first.upc_area\r\n", " we_done = False\r\n", "\r\n", " sheet['C2'] = bestand_00\r\n", " sheet['E2'] = bestand_33\r\n", " sheet['G2'] = bestand_36\r\n", " sheet['B3'] = we\r\n", " sheet['D3'] = we_dat\r\n", "\r\n", " verbleibend = bestand_00\r\n", " bedarf_am = \"\"\r\n", " bedarf_durch = \"\"\r\n", " bedarf_auftrag = \"\"\r\n", " umfuhrmenge = 0\r\n", " umfuhr_an = \"\"\r\n", " auftrag = 0\r\n", " auftr_dennree = 0\r\n", " for t in aufbes_filt:\r\n", " if we > 0 and t.delivdate > we_dat:\r\n", " if we_area == \"00\":\r\n", " verbleibend += we\r\n", " \r\n", " sheet.append([\"\", \"Produktion\", we_dat, t.delivdate, t.artnr, t.artname, t.bundle, \"\", f\"+{we}\", verbleibend, t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\r\n", " we = 0\r\n", " if t.cust_name.strip() == \"dennree GmbH\":\r\n", " sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, t.ord_rem, verbleibend, t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\r\n", " for row in sheet.iter_cols(min_col=1, max_col=16, min_row=sheet.max_row, max_row=sheet.max_row):\r\n", " for cell in row:\r\n", " cell.fill = PatternFill(fgColor=RED, fill_type = 'solid')\r\n", " elif t.cust_name.strip() == \"Interne Umlagerung\":\r\n", " verbleibend += t.ordered\r\n", " sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, f\"+{t.ordered}\", verbleibend, t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\r\n", " else:\r\n", " verbleibend -= t.ord_rem\r\n", " sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, t.ord_rem, verbleibend, t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\r\n", " \r\n", " if we > 0:\r\n", " if we_area == \"00\":\r\n", " verbleibend += we\r\n", " \r\n", " sheet.append([\"\", \"Produktion\", we_dat, t.delivdate, t.artnr, t.artname, t.bundle, \"\", f\"+{we}\", verbleibend, t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\r\n", "\r\n", "vorlage.save(f\"Umfuhrplanung_{FROM}.xlsx\")" ], "outputs": [], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [], "outputs": [], "metadata": {} } ], "metadata": { "orig_nbformat": 4, "language_info": { "name": "python", "version": "3.9.7", "mimetype": "text/x-python", "codemirror_mode": { "name": "ipython", "version": 3 }, "pygments_lexer": "ipython3", "nbconvert_exporter": "python", "file_extension": ".py" }, "kernelspec": { "name": "python3", "display_name": "Python 3.9.7 64-bit" }, "interpreter": { "hash": "032eb40c1682b1e6109824d577ff4427b0bbc2f8ebe1487b7b1be524c4843266" } }, "nbformat": 4, "nbformat_minor": 2 }