Compare commits

..

No commits in common. "b0d86c0cde2bcd4f7f63760dc46302cdecd3d867" and "1a1271c7e0e5b46177156bfae07d4070197f93e2" have entirely different histories.

2 changed files with 86 additions and 202 deletions

View File

@ -6,6 +6,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"import re\n",
"import math\n", "import math\n",
"import datetime\n", "import datetime\n",
"\n", "\n",
@ -46,7 +47,7 @@
"\n", "\n",
"@dataclass\n", "@dataclass\n",
"class Abpackung:\n", "class Abpackung:\n",
" artikelNummer: str # ArtNr\n", " artikelNummer: int # ArtNr\n",
" abpackMenge: int # in KG\n", " abpackMenge: int # in KG\n",
" bemerkung: str\n", " bemerkung: str\n",
" planPos: int # Wochenplannummer\n", " planPos: int # Wochenplannummer\n",
@ -66,7 +67,7 @@
"\n", "\n",
"@dataclass\n", "@dataclass\n",
"class MischBedarf:\n", "class MischBedarf:\n",
" artikelNummer: str # ArtNr\n", " artikelNummer: int # ArtNr\n",
" abpackMenge: int # in KG\n", " abpackMenge: int # in KG\n",
" kw_reich: float # KW REICH\n", " kw_reich: float # KW REICH\n",
" bem_ek: str # Bemerkung Einkauf\n", " bem_ek: str # Bemerkung Einkauf\n",
@ -259,7 +260,7 @@
"source": [ "source": [
"# read Dispo\n", "# read Dispo\n",
"\n", "\n",
"def readDispo(sheet, prodStamm, prodDict):\n", "def readDispo(sheet, prodStamm):\n",
" DISPO_DICT = {}\n", " DISPO_DICT = {}\n",
" ABPACK_DICT = {}\n", " ABPACK_DICT = {}\n",
" MISCH_DICT = {}\n", " MISCH_DICT = {}\n",
@ -274,16 +275,10 @@
" if row[0].value is None:\n", " if row[0].value is None:\n",
" break\n", " break\n",
"\n", "\n",
" product = prodDict.get(f\"s{row[0].value}\")\n", " product = prodStamm.get(row[0].value, None)\n",
" if product is None:\n",
" product = prodDict.get(f\"g{row[0].value}\")\n",
" \n",
" if product is None:\n",
" print(f\"Product {row[0].value} could neither be found in the spielberger nor gehrsitz database. Skipping!\")\n",
" continue\n",
"\n", "\n",
" d = DispoBedarf(\n", " d = DispoBedarf(\n",
" artikelNummer=product.number,\n", " artikelNummer=row[0].value,\n",
" palettenziel=row[4].value,\n", " palettenziel=row[4].value,\n",
" bestandL00=row[5].value,\n", " bestandL00=row[5].value,\n",
" bestandL01=row[6].value,\n", " bestandL01=row[6].value,\n",
@ -304,13 +299,9 @@
" DISPO_DICT[d.artikelNummer] = d\n", " DISPO_DICT[d.artikelNummer] = d\n",
" GEB_GROESSE[d.artikelNummer] = g\n", " GEB_GROESSE[d.artikelNummer] = g\n",
"\n", "\n",
" prodBase = prodStamm.get(product.number, None)\n",
"\n",
" if not (row[25].value is None):\n", " if not (row[25].value is None):\n",
" if prodBase is None:\n",
" print(f\"Product {product.number} could not be found in the production parameters database. Default parameters would be used for the production planing\")\n",
" a = Abpackung(\n", " a = Abpackung(\n",
" artikelNummer=product.number,\n", " artikelNummer=d.artikelNummer,\n",
" abpackMenge=int(row[25].value),\n", " abpackMenge=int(row[25].value),\n",
" bemerkung=\"\",\n", " bemerkung=\"\",\n",
" planPos= 999 if row[29].value is None else int(int(row[29].value)),\n", " planPos= 999 if row[29].value is None else int(int(row[29].value)),\n",
@ -323,9 +314,7 @@
"\n", "\n",
" ABPACK_DICT[d.artikelNummer]=a\n", " ABPACK_DICT[d.artikelNummer]=a\n",
"\n", "\n",
" if prodBase is None:\n", " if not product is None and product.muehleMisch == 1:\n",
" print(f\"Product {product.number} could not be found in the production parameters database. Cannot determine mixing status\")\n",
" elif prodBase.muehleMisch == 1:\n",
" MISCH_DICT[d.artikelNummer] = MischBedarf(\n", " MISCH_DICT[d.artikelNummer] = MischBedarf(\n",
" artikelNummer = d.artikelNummer,\n", " artikelNummer = d.artikelNummer,\n",
" abpackMenge = int(row[25].value) if not row[25].value is None else 0,\n", " abpackMenge = int(row[25].value) if not row[25].value is None else 0,\n",
@ -356,13 +345,8 @@
"\n", "\n",
" counter = 0\n", " counter = 0\n",
" for pack, mischDispo in [(\"Pack1\", dP1), (\"Pack2\", dP2), (\"Pack3\", dP3), (\"Pack4\", dP4)]:\n", " for pack, mischDispo in [(\"Pack1\", dP1), (\"Pack2\", dP2), (\"Pack3\", dP3), (\"Pack4\", dP4)]:\n",
" if mischDispo is None:\n",
" continue\n",
"\n",
" mischDispo = mischDispo[3]\n",
"\n",
" for d in mischDispo.values():\n", " for d in mischDispo.values():\n",
" p = prodDict.get(d.artikelNummer)\n", " p = prodDict.get(d.artikelNummer, None)\n",
" if p is None:\n", " if p is None:\n",
" print(f\"ERROR: Product {p.artikelNummer} not found\")\n", " print(f\"ERROR: Product {p.artikelNummer} not found\")\n",
" counter += 1\n", " counter += 1\n",
@ -372,7 +356,7 @@
" sheet.add_table(tab)\n", " sheet.add_table(tab)\n",
"\n", "\n",
"\n", "\n",
"def writeSchedule(vorlage, dispo, pack):\n", "def writeSchedule(vorlage, dispo, prodDict, pack):\n",
" name = f\"Schedule {pack}\"\n", " name = f\"Schedule {pack}\"\n",
"\n", "\n",
" _dispoDict, abpackDict, gebGroesse, _mischDict = dispo\n", " _dispoDict, abpackDict, gebGroesse, _mischDict = dispo\n",
@ -406,7 +390,7 @@
" print(f\"Für Produkt {pa.artikelNummer} in Pack {pack} ist keine gültige Abpackmenge eingetragen\")\n", " print(f\"Für Produkt {pa.artikelNummer} in Pack {pack} ist keine gültige Abpackmenge eingetragen\")\n",
" continue\n", " continue\n",
"\n", "\n",
" time = writePASchedule(sheet, pa, leistung, gebGroesse, pack, time)\n", " time = writePASchedule(sheet, pa, leistung, prodDict, gebGroesse, pack, time)\n",
" modus = new_modus\n", " modus = new_modus\n",
" writeEnd(sheet)\n", " writeEnd(sheet)\n",
"\n", "\n",
@ -430,9 +414,11 @@
"def prodTime(nbrBags, performance, min_t = 30):\n", "def prodTime(nbrBags, performance, min_t = 30):\n",
" return max(int(nbrBags * 60 / performance), min_t)\n", " return max(int(nbrBags * 60 / performance), min_t)\n",
"\n", "\n",
"def writePASchedule(sheet, pa, l, gebGroeDict, pack, start):\n", "def writePASchedule(sheet, pa, l, prodDict, gebGroeDict, pack, start):\n",
" row = sheet.max_row + 1\n", " row = sheet.max_row + 1\n",
" geb = gebGroeDict[pa.artikelNummer]\n", " geb = gebGroeDict[pa.artikelNummer]\n",
" prod = prodDict[pa.artikelNummer]\n",
" # t = math.ceil(60 * pa.anzBeutel(gebGroeDict) / beutelProH(pa.artikelNummer, pack))\n",
" t = prodTime(pa.anzBeutel(gebGroeDict), beutelProH(pa.artikelNummer, pack))\n", " t = prodTime(pa.anzBeutel(gebGroeDict), beutelProH(pa.artikelNummer, pack))\n",
" sheet.cell(row=row, column = 1).value = pa.artikelNummer\n", " sheet.cell(row=row, column = 1).value = pa.artikelNummer\n",
" sheet.cell(row=row, column = 2).value = shortName(pa.artikelNummer)\n", " sheet.cell(row=row, column = 2).value = shortName(pa.artikelNummer)\n",
@ -530,10 +516,10 @@
" 18,\n", " 18,\n",
" begin,\n", " begin,\n",
" (\n", " (\n",
" (\"MO\", Workday.to_holliday()),\n", " (\"MO\", Workday.to_1_schicht_WU(begin)),\n",
" (\"DI\", Workday.to_holliday()),\n", " (\"DI\", Workday.to_1_schicht_WU(begin)),\n",
" (\"MI\", Workday.to_holliday()),\n", " (\"MI\", Workday.to_1_schicht_WU(begin)),\n",
" (\"DO\", Workday.to_1_schicht_WU(begin)),\n", " (\"DO\", Workday.to_holliday()),\n",
" (\"FR\", Workday.to_1_schicht_WU(begin)),\n", " (\"FR\", Workday.to_1_schicht_WU(begin)),\n",
" (\"SA\", Workday.to_1_schicht_WU(begin))\n", " (\"SA\", Workday.to_1_schicht_WU(begin))\n",
" ),\n", " ),\n",
@ -610,12 +596,12 @@
" 36,\n", " 36,\n",
" begin,\n", " begin,\n",
" (\n", " (\n",
" (\"MO\", Workday.to_2_schicht_one_only(begin)),\n", " (\"MO\", Workday.to_2_schicht(begin)),\n",
" (\"DI\", Workday.to_2_schicht_one_only(begin)),\n", " (\"DI\", Workday.to_2_schicht(begin)),\n",
" (\"MI\", Workday.to_2_schicht_one_only(begin)),\n", " (\"MI\", Workday.to_2_schicht_one_only(begin)),\n",
" (\"DO\", Workday.to_2_schicht(begin)),\n", " (\"DO\", Workday.to_2_schicht_one_only(begin)),\n",
" (\"FR\", Workday.to_2_schicht(begin)),\n", " (\"FR\", Workday.to_2_schicht_one_only(begin)),\n",
" (\"SA\", Workday.to_2_schicht(begin)),\n", " (\"SA\", Workday.to_2_schicht_one_only(begin)),\n",
" )\n", " )\n",
" )\n", " )\n",
" \n", " \n",
@ -649,23 +635,8 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"@dataclass\n", "ibmconnect = IBMConnector(True)\n",
"class ProdDict:\n", "prodDict = ibmconnect.getProductsTable()\n"
" gProdDict: dict()\n",
" sProdDict: dict()\n",
"\n",
" def get(self, pnr):\n",
" if pnr[0] == \"s\" or len(pnr) == 6:\n",
" return self.sProdDict.get(pnr, None)\n",
" elif pnr[0] == \"g\":\n",
" return self.gProdDict.get(pnr, None)\n",
"\n",
"g_ibmconnect = IBMConnector(False)\n",
"s_ibmconnect = IBMConnector(True)\n",
"prodDict = ProdDict(\n",
" sProdDict= s_ibmconnect.getProductsTable(),\n",
" gProdDict= g_ibmconnect.getProductsTable()\n",
")"
] ]
}, },
{ {
@ -681,7 +652,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"KW = 6\n", "KW = 3\n",
"YEAR = 2022\n", "YEAR = 2022\n",
"\n", "\n",
"# ACHTUNG: Beim Lesen von der Dispo (FROM_DISPO = True) gehen alle bisherigen Planungen verloren!\n", "# ACHTUNG: Beim Lesen von der Dispo (FROM_DISPO = True) gehen alle bisherigen Planungen verloren!\n",
@ -702,7 +673,7 @@
"\n", "\n",
"WEEK_P1 = WTemplate.to_2_schicht(5, \"Pack1\")\n", "WEEK_P1 = WTemplate.to_2_schicht(5, \"Pack1\")\n",
"WEEK_P2 = WTemplate.to_2_schicht(5, \"Pack2\")\n", "WEEK_P2 = WTemplate.to_2_schicht(5, \"Pack2\")\n",
"WEEK_P3 = WTemplate.to_2_schicht(5, \"Pack3\")\n", "WEEK_P3 = WTemplate.to_1_schicht(6, \"Pack3\")\n",
"WEEK_P4 = WTemplate.to_1_schicht(7, \"Pack4\")" "WEEK_P4 = WTemplate.to_1_schicht(7, \"Pack4\")"
] ]
}, },
@ -727,7 +698,7 @@
"sheet = vorlage[\"TLeistungsdaten\"]\n", "sheet = vorlage[\"TLeistungsdaten\"]\n",
"PACK_VORLAGE = packVorlage(sheet)\n", "PACK_VORLAGE = packVorlage(sheet)\n",
"LEISTUNGS_DICT = packLeistung(sheet)\n", "LEISTUNGS_DICT = packLeistung(sheet)\n",
"#\n", "\n",
"print(\"Read Produktionsstammdaten\")\n", "print(\"Read Produktionsstammdaten\")\n",
"sheet = vorlage[\"ProduktionStammdaten\"]\n", "sheet = vorlage[\"ProduktionStammdaten\"]\n",
"PROD_STAMM = produktionStammdaten(sheet)\n", "PROD_STAMM = produktionStammdaten(sheet)\n",
@ -753,34 +724,18 @@
"# read Schedule from Dispo\n", "# read Schedule from Dispo\n",
"if FROM_DISPO:\n", "if FROM_DISPO:\n",
" dispo = load_workbook(filename = DISPO, data_only = True, read_only = True)\n", " dispo = load_workbook(filename = DISPO, data_only = True, read_only = True)\n",
" if P1:\n", " if P1: dispoP1 = readDispo(dispo[\"Dispo Abpackplanung P1\"], LEISTUNGS_DICT)\n",
" print(\"Reading Dispo P1\") \n", " if P2: dispoP2 = readDispo(dispo[\"Dispo Abpackplanung P2\"], LEISTUNGS_DICT)\n",
" dispoP1 = readDispo(dispo[\"Dispo Abpackplanung P1\"], LEISTUNGS_DICT, prodDict)\n", " if P3: dispoP3 = readDispo(dispo[\"Dispo Abpackplanung P3\"], LEISTUNGS_DICT)\n",
" if dispoP1 is None:\n", " if P4: dispoP4 = readDispo(dispo[\"Dispo Abpackplanung P4\"], LEISTUNGS_DICT)\n",
" print(\".. encountered an error. Skipping!\")\n",
" if P2: \n",
" print(\"Reading Dispo P2\") \n",
" dispoP2 = readDispo(dispo[\"Dispo Abpackplanung P2\"], LEISTUNGS_DICT, prodDict)\n",
" if dispoP2 is None:\n",
" print(\".. encountered an error. Skipping!\")\n",
" if P3: \n",
" print(\"Reading Dispo P3\") \n",
" dispoP3 = readDispo(dispo[\"Dispo Abpackplanung P3\"], LEISTUNGS_DICT, prodDict)\n",
" if dispoP3 is None:\n",
" print(\".. encountered an error. Skipping!\")\n",
" if P4: \n",
" print(\"Reading Dispo P4\") \n",
" dispoP4 = readDispo(dispo[\"Dispo Abpackplanung P4\"], LEISTUNGS_DICT, prodDict)\n",
" if dispoP4 is None:\n",
" print(\".. encountered an error. Skipping!\")\n",
" dispo.close()\n", " dispo.close()\n",
"\n", "\n",
" vorlage = load_workbook(filename = VORDEF, data_only = False, read_only = False)\n", " vorlage = load_workbook(filename = VORDEF, data_only = False, read_only = False)\n",
" writeMischDispo(vorlage, dispoP1, dispoP2, dispoP3, dispoP4, prodDict)\n", " writeMischDispo(vorlage, dispoP1[3], dispoP2[3], dispoP3[3], dispoP4[3], prodDict)\n",
" if P4: writeSchedule(vorlage, dispoP4, \"Pack4\")\n", " if P4: writeSchedule(vorlage, dispoP4, prodDict, \"Pack4\")\n",
" if P3: writeSchedule(vorlage, dispoP3, \"Pack3\")\n", " if P3: writeSchedule(vorlage, dispoP3, prodDict, \"Pack3\")\n",
" if P2: writeSchedule(vorlage, dispoP2, \"Pack2\")\n", " if P2: writeSchedule(vorlage, dispoP2, prodDict, \"Pack2\")\n",
" if P1: writeSchedule(vorlage, dispoP1, \"Pack1\")\n", " if P1: writeSchedule(vorlage, dispoP1, prodDict, \"Pack1\")\n",
" vorlage.save(PLANUNG_PATH)\n", " vorlage.save(PLANUNG_PATH)\n",
" vorlage.close() \n" " vorlage.close() \n"
] ]
@ -808,10 +763,9 @@
" marking = row[0].fill\n", " marking = row[0].fill\n",
" ))\n", " ))\n",
" else: \n", " else: \n",
" prod_nr = row[0].value\n", " l = LEISTUNGS_DICT[row[0].value]\n",
" l = LEISTUNGS_DICT[prod_nr]\n",
" pas.append(Produktionsauftrag(\n", " pas.append(Produktionsauftrag(\n",
" artikelNummer= prod_nr,\n", " artikelNummer= row[0].value,\n",
" artikelBezeichnung= row[1].value,\n", " artikelBezeichnung= row[1].value,\n",
" gebindeGroesse= row[2].value,\n", " gebindeGroesse= row[2].value,\n",
" abpackMenge= int(row[3].value),\n", " abpackMenge= int(row[3].value),\n",
@ -905,7 +859,7 @@
" marking = copy(row[0].fill)\n", " marking = copy(row[0].fill)\n",
" ))\n", " ))\n",
" else:\n", " else:\n",
" prod = prodDict.get(row[0].value)\n", " prod = prodDict.get(f\"s{row[0].value}\", None)\n",
" if prod is None:\n", " if prod is None:\n",
" print(f\"Could not find product data of {row[0].value}\")\n", " print(f\"Could not find product data of {row[0].value}\")\n",
" bundle = Bundle.fromString(prod.bundle)\n", " bundle = Bundle.fromString(prod.bundle)\n",
@ -914,7 +868,7 @@
" nbrBundles = int(nbrBags / bundle.nbrBags) if row[4].value is None else int(row[4].value)\n", " nbrBundles = int(nbrBags / bundle.nbrBags) if row[4].value is None else int(row[4].value)\n",
" performance = int(row[7].value)\n", " performance = int(row[7].value)\n",
" if performance is None:\n", " if performance is None:\n",
" l = getPackLeistung(prod.number)\n", " l = getPackLeistung(prod.number[1:])\n",
" if l.artikelNummer == \"000000\":\n", " if l.artikelNummer == \"000000\":\n",
" print(f\"Leistungsdaten für Produkt {prod.number} nicht verfügbar!\")\n", " print(f\"Leistungsdaten für Produkt {prod.number} nicht verfügbar!\")\n",
" \n", " \n",
@ -929,7 +883,7 @@
" \n", " \n",
"\n", "\n",
" pas.append(Produktionsauftrag(\n", " pas.append(Produktionsauftrag(\n",
" artikelNummer= prod.number,\n", " artikelNummer= prod.number[1:],\n",
" artikelBezeichnung= prod.name,\n", " artikelBezeichnung= prod.name,\n",
" gebindeGroesse= bundle.szBundle,\n", " gebindeGroesse= bundle.szBundle,\n",
" abpackMenge= amount,\n", " abpackMenge= amount,\n",
@ -1072,9 +1026,9 @@
" sheet.cell(row=rowOffset+startSlot, column=columnOffset+2).value = pa.gebindeGroesse\n", " sheet.cell(row=rowOffset+startSlot, column=columnOffset+2).value = pa.gebindeGroesse\n",
" sheet.cell(row=rowOffset+startSlot, column=columnOffset+4).value = pa.artikelBezeichnung\n", " sheet.cell(row=rowOffset+startSlot, column=columnOffset+4).value = pa.artikelBezeichnung\n",
" else:\n", " else:\n",
" sheet.cell(row=rowOffset+startSlot, column=columnOffset+3).value = pa.artikelNummer\n", " sheet.cell(row=rowOffset+startSlot, column=columnOffset+3).value = f\"p{pa.artikelNummer}\"\n",
" sheet.cell(row=rowOffset+startSlot, column=columnOffset+7).value = pa.abpackMenge\n", " sheet.cell(row=rowOffset+startSlot, column=columnOffset+7).value = pa.abpackMenge\n",
" prod = prodDict.get(pa.artikelNummer)\n", " prod = prodDict.get(pa.artikelNummer, None)\n",
" sheet.cell(row=rowOffset+startSlot, column=columnOffset+6).value = math.ceil(pa.anzGebinde / prod.palSize) if not prod is None else None\n", " sheet.cell(row=rowOffset+startSlot, column=columnOffset+6).value = math.ceil(pa.anzGebinde / prod.palSize) if not prod is None else None\n",
" if pa.bemerkung != \"\" and not pa.bemerkung is None and pa.pDauer >= 60:\n", " if pa.bemerkung != \"\" and not pa.bemerkung is None and pa.pDauer >= 60:\n",
" sheet.cell(row=rowOffset + startSlot + 1, column=columnOffset+4).value=pa.bemerkung\n", " sheet.cell(row=rowOffset + startSlot + 1, column=columnOffset+4).value=pa.bemerkung\n",
@ -1249,7 +1203,7 @@
" writeAbpackplan(vorlage, WEEK_P3, scheduleP3, prodDict)\n", " writeAbpackplan(vorlage, WEEK_P3, scheduleP3, prodDict)\n",
" if P2: \n", " if P2: \n",
" print(\"Updating P2 ...\")\n", " print(\"Updating P2 ...\")\n",
" scheduleP2 = updateSchedule(vorlage[\"Schedule Pack2\"], \"Pack2\")\n", " scheduleP2 = updateSchedule(vorlage[\"Schedule Pack2\"], \"Pack1\")\n",
" writeSchedule2(vorlage, scheduleP2, \"Pack2\")\n", " writeSchedule2(vorlage, scheduleP2, \"Pack2\")\n",
" writeAbpackplan(vorlage, WEEK_P2, scheduleP2, prodDict)\n", " writeAbpackplan(vorlage, WEEK_P2, scheduleP2, prodDict)\n",
" if P1:\n", " if P1:\n",
@ -1260,7 +1214,6 @@
"\n", "\n",
" sheet = vorlage[\"Mischungen\"]\n", " sheet = vorlage[\"Mischungen\"]\n",
" sheet[\"B2\"] = KW\n", " sheet[\"B2\"] = KW\n",
" sheet[\"B3\"] = YEAR\n",
" \n", " \n",
" print(\"\\nWriting to file ...\")\n", " print(\"\\nWriting to file ...\")\n",
" vorlage.save(PLANUNG_PATH)\n", " vorlage.save(PLANUNG_PATH)\n",
@ -1470,7 +1423,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.10.2" "version": "3.10.1"
}, },
"metadata": { "metadata": {
"interpreter": { "interpreter": {

View File

@ -6,13 +6,8 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"from spielbergerscripts.connector import IBMConnector\n", "from spielbergerscripts.spielbergerscripts.storageunit import Product, Bundle, NVE\n",
"from spielbergerscripts.primitives.batch import Batch\n", "from spielbergerscripts.spielbergerscripts.connector import IBMConnector"
"from spielbergerscripts.primitives.nve import NVE\n",
"from spielbergerscripts.primitives.product import Product, Bundle\n",
"from spielbergerscripts.helpers.functions import spiel_prefix\n",
"\n",
"from dataclasses import dataclass"
] ]
}, },
{ {
@ -23,8 +18,7 @@
"source": [ "source": [
"ibmconnect = IBMConnector(True)\n", "ibmconnect = IBMConnector(True)\n",
"nveDict = ibmconnect.getNVETable()\n", "nveDict = ibmconnect.getNVETable()\n",
"prodDict = ibmconnect.getProductsTable()\n", "prodDict = ibmconnect.getProductsTable()"
"batchDict = ibmconnect.getBatchData()"
] ]
}, },
{ {
@ -33,49 +27,14 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"@dataclass\n", "extResource = dict()\n",
"class ProductArea:\n",
" prod_nr: str\n",
" area: str\n",
" amount: int\n",
" batches: list()\n",
"\n", "\n",
" def from_batch(batch):\n", "for nve in nveDict.values():\n",
" return ProductArea(\n", " prod = prodDict.get(nve.article)\n",
" batch.art_nr, batch.area, 0, list()\n",
" )\n",
"\n", "\n",
" def add_batch(self, batch):\n", " if not prod is None:\n",
" assert(batch.area == batch.area)\n", " if nve.area != '01' and nve.area != '02' and nve.area != prod.pickArea:\n",
"\n", " extResource[(nve.article, nve.area, nve.vq)] = (prod.name, prod.bundle, extResource.get((nve.article, nve.area, nve.vq), ('', '', 0))[2] + nve.amount)"
" self.amount += batch.amount\n",
" self.batches.append(batch)\n",
"\n",
"\n",
"@dataclass\n",
"class ProductAreas:\n",
" prod_nr: str\n",
" areas: dict()\n",
"\n",
" def addBatch(self, batch):\n",
" parea = self.areas.get(batch.area, ProductArea.from_batch(batch))\n",
" parea.add_batch(batch)\n",
"\n",
" self.areas[batch.area] = parea\n",
"\n",
"prod_areas = dict()\n",
"for prod_nr, batches in batchDict.items():\n",
" prod = prodDict.get(prod_nr, None)\n",
" if prod is None:\n",
" # print(f\"Error on batch {batch}\")\n",
" continue\n",
"\n",
" pa = ProductAreas(prod_nr, dict())\n",
" for batch in batches:\n",
" if batch.amount > 0 and (int(batch.vq) < 30 or int(batch.vq) == 39):\n",
" pa.addBatch(batch)\n",
"\n",
" prod_areas[pa.prod_nr] = pa"
] ]
}, },
{ {
@ -84,27 +43,19 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"ART_EXT = dict()\n", "ART_WU = set()\n",
"\n", "\n",
"\n", "for (pNr, area, vq), (pName, bundle, amount) in extResource.items():\n",
"for prodarea in prod_areas.values():\n", " if area != '36' or bundle.strip() == \"25 KG\" or bundle.strip() == \"BIG-BAG\" or bundle.strip() == \"1000 ST\":\n",
" prod = prodDict[prodarea.prod_nr]\n",
" if prod.bundle.strip() == \"25 KG\" or prod.bundle.strip() == \"20 KG\" or prod.bundle.strip() == \"BIG-BAG\" or prod.bundle.strip() == \"1000 ST\" or prod.bundle.strip() == \"LOSE\":\n",
" continue\n", " continue\n",
" print(f\"Lager {area}\\t{amount}x {pName.strip()} (#{pNr} / VQ{vq}) {bundle} auf Vorrat\")\n",
" ART_WU.add(pNr)\n",
"\n", "\n",
" ext_res = []\n", "# zusätzlich\n",
" for aid, area in prodarea.areas.items():\n", "ART_WU = ART_WU.union({\"062346\", \"062356\", \"062306\", \"062349\", \"062308\", \"062358\", \"062416\", \"104405\", \"104406\", \"104407\", \"104409\"})\n",
" if aid == prod.pickArea or (aid != \"00\" and aid != \"33\" and aid != \"36\"):\n",
" continue\n",
" if area.amount > 0:\n",
" ext_res.append((aid, area))\n",
" print(f\"Lager {aid}\\t{area.amount}x {prod.name.strip()} (#{prodarea.prod_nr}) {prod.bundle} auf Vorrat\")\n",
"\n", "\n",
" if ext_res:\n", "ART_WU = list(ART_WU)\n",
" ART_EXT[prodarea.prod_nr] = ext_res\n", "ART_WU.sort()"
"\n",
"L_ART_EXT = list(ART_EXT.keys())\n",
"L_ART_EXT.sort()"
] ]
}, },
{ {
@ -127,8 +78,6 @@
"from dataclasses import dataclass\n", "from dataclasses import dataclass\n",
"from datetime import date, datetime, timedelta\n", "from datetime import date, datetime, timedelta\n",
"\n", "\n",
"from spielbergerscripts.helpers.functions import spiel_prefix\n",
"\n",
"@dataclass\n", "@dataclass\n",
"class Request:\n", "class Request:\n",
" ordernr: str\n", " ordernr: str\n",
@ -158,7 +107,7 @@
" ordernr=str(t[0]),\n", " ordernr=str(t[0]),\n",
" cust_name=str(t[1]).strip(),\n", " cust_name=str(t[1]).strip(),\n",
" delivdate=date.fromisoformat(szd),\n", " delivdate=date.fromisoformat(szd),\n",
" artnr=spiel_prefix(str(t[3]), True),\n", " artnr=str(t[3]),\n",
" artname=str(t[4]),\n", " artname=str(t[4]),\n",
" bundle=str(t[5]),\n", " bundle=str(t[5]),\n",
" stock=int(t[6]),\n", " stock=int(t[6]),\n",
@ -209,29 +158,21 @@
"\n", "\n",
"vorlage = load_workbook(\"Umfuhrplanung_Vorlage.xlsx\")\n", "vorlage = load_workbook(\"Umfuhrplanung_Vorlage.xlsx\")\n",
"\n", "\n",
"for prodNr in L_ART_EXT:\n", "for prodNr in ART_WU:\n",
" aufbes_filt = [t for t in aufbes if t.artnr == prodNr]\n", " aufbes_filt = [t for t in aufbes if t.artnr == prodNr]\n",
"\n", "\n",
" if len(aufbes_filt) > 0:\n", " if len(aufbes_filt) > 0:\n",
" prod = prodDict.get(prodNr)\n", " prod = prodDict.get(prodNr)\n",
" pareas = prod_areas.get(prodNr, None)\n",
" if pareas is None:\n",
" print(f\"Produktareas nicht gefunden: {prodNr}\")\n",
"\n",
" sheet = vorlage.copy_worksheet(vorlage[\"Vorlage\"])\n", " sheet = vorlage.copy_worksheet(vorlage[\"Vorlage\"])\n",
" sheet.title = prodNr\n", " sheet.title = prodNr\n",
" sheet['A1'] = f\"{prod.name.strip()} (#{prodNr})\"\n", " sheet['A1'] = f\"{prod.name.strip()} (#{prodNr})\"\n",
" sheet['F1'] = f\"Kommiort {prod.pickArea}\"\n",
" sheet['N1'] = f\"vom {FROM} bis inklussive {TO}\\n\\n\"\n", " sheet['N1'] = f\"vom {FROM} bis inklussive {TO}\\n\\n\"\n",
"\n", "\n",
" first = aufbes_filt[0]\n", " first = aufbes_filt[0]\n",
" verbleibend = {\n", " bestand_00 = first.stock00\n",
" \"00\": pareas.areas.get(\"00\").amount if \"00\" in pareas.areas else 0,\n", " bestand_01 = first.stock01\n",
" \"01\": pareas.areas.get(\"01\").amount if \"01\" in pareas.areas else 0,\n", " bestand_33 = first.stock33\n",
" \"05\": pareas.areas.get(\"05\").amount if \"05\" in pareas.areas else 0,\n", " bestand_36 = first.stock36\n",
" \"33\": pareas.areas.get(\"33\").amount if \"33\" in pareas.areas else 0,\n",
" \"36\": pareas.areas.get(\"36\").amount if \"36\" in pareas.areas else 0,\n",
" }\n",
" \n", " \n",
"\n", "\n",
" we = first.upcoming\n", " we = first.upcoming\n",
@ -239,13 +180,13 @@
" we_area = first.upc_area\n", " we_area = first.upc_area\n",
" we_done = False\n", " we_done = False\n",
"\n", "\n",
" sheet['C2'] = verbleibend[\"00\"]\n", " sheet['C2'] = bestand_00\n",
" sheet['E2'] = verbleibend[\"33\"]\n", " sheet['E2'] = bestand_33\n",
" sheet['G2'] = verbleibend[\"36\"]\n", " sheet['G2'] = bestand_36\n",
" sheet['B3'] = we\n", " sheet['B3'] = we\n",
" sheet['D3'] = we_dat\n", " sheet['D3'] = we_dat\n",
"\n", "\n",
" verbleibendL = verbleibend\n", " verbleibend = bestand_00\n",
" bedarf_am = \"\"\n", " bedarf_am = \"\"\n",
" bedarf_durch = \"\"\n", " bedarf_durch = \"\"\n",
" bedarf_auftrag = \"\"\n", " bedarf_auftrag = \"\"\n",
@ -255,38 +196,28 @@
" auftr_dennree = 0\n", " auftr_dennree = 0\n",
" for t in aufbes_filt:\n", " for t in aufbes_filt:\n",
" if we > 0 and t.delivdate > we_dat:\n", " if we > 0 and t.delivdate > we_dat:\n",
" if not we_area in {\"00\", \"05\", \"33\", \"36\"}:\n", " if we_area == \"00\":\n",
" print(f\"Unable to handle we of {prod_nr} in area {we_area}\")\n", " verbleibend += we\n",
" if we_area != \"05\":\n",
" verbleibendL[we_area] += we\n",
" else:\n",
" verbleibendL[prod.pickArea] += we\n",
" \n", " \n",
" sheet.append([\"\", \"Produktion\", we_dat, t.artnr, t.artname, t.bundle, \"\", f\"+{we}\", verbleibendL[\"00\"], verbleibendL[\"01\"], verbleibendL[\"33\"], verbleibendL[\"36\"], t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\n", " sheet.append([\"\", \"Produktion\", we_dat, 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])\n",
" we = 0\n", " we = 0\n",
" if t.cust_name.strip() == \"dennree GmbH\":\n", " if t.cust_name.strip() == \"dennree GmbH\":\n",
" sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, t.ord_rem, verbleibendL[\"00\"], verbleibendL[\"01\"], verbleibendL[\"33\"], verbleibendL[\"36\"], t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\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])\n",
" for row in sheet.iter_cols(min_col=1, max_col=16, min_row=sheet.max_row, max_row=sheet.max_row):\n", " for row in sheet.iter_cols(min_col=1, max_col=16, min_row=sheet.max_row, max_row=sheet.max_row):\n",
" for cell in row:\n", " for cell in row:\n",
" cell.fill = PatternFill(fgColor=RED, fill_type = 'solid')\n", " cell.fill = PatternFill(fgColor=RED, fill_type = 'solid')\n",
" elif t.cust_name.strip() == \"Interne Umlagerung\":\n", " elif t.cust_name.strip() == \"Interne Umlagerung\":\n",
" #verbleibend += t.ordered\n", " verbleibend += t.ordered\n",
" verbleibendL[\"00\"] += t.ordered\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])\n",
" sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, f\"+{t.ordered}\", verbleibendL[\"00\"], verbleibendL[\"01\"], verbleibendL[\"33\"], verbleibendL[\"36\"], t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\n",
" else:\n", " else:\n",
" #verbleibend -= t.ord_rem\n", " verbleibend -= t.ord_rem\n",
" verbleibendL[t.comm_area] -= t.ord_rem\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])\n",
" sheet.append([t.ordernr, t.cust_name, t.delivdate, t.artnr, t.artname, t.bundle, t.ordered, t.ord_rem, verbleibendL[\"00\"], verbleibendL[\"01\"], verbleibendL[\"33\"], verbleibendL[\"36\"], t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\n",
" \n", " \n",
" if we > 0:\n", " if we > 0:\n",
" if not we_area in {\"00\", \"05\", \"33\", \"36\"}:\n", " if we_area == \"00\":\n",
" print(f\"Unable to handle we of {prod_nr} in area {we_area}\")\n", " verbleibend += we\n",
" if we_area != \"05\":\n",
" verbleibendL[we_area] += we\n",
" else:\n",
" verbleibendL[prod.pickArea] += we\n",
" \n", " \n",
" sheet.append([\"\", \"Produktion\", we_dat, t.artnr, t.artname, t.bundle, \"\", f\"+{we}\", *verbleibendL.values(), t.upcoming, t.upc_date, t.upc_area, t.stock00, t.stock01, t.stock33, t.stock36])\n", " sheet.append([\"\", \"Produktion\", we_dat, 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])\n",
"\n", "\n",
"vorlage.save(f\"Umfuhrplanung_{FROM}.xlsx\")" "vorlage.save(f\"Umfuhrplanung_{FROM}.xlsx\")"
] ]
@ -317,7 +248,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.10.1" "version": "3.10.0"
}, },
"orig_nbformat": 4 "orig_nbformat": 4
}, },