generated from dopt-python/py311
prepare external database interaction
This commit is contained in:
@@ -18,6 +18,7 @@ CREATE TABLE WATTANA.KPI_KONFEKTIONAERE (
|
|||||||
ID NUMBER PRIMARY KEY,
|
ID NUMBER PRIMARY KEY,
|
||||||
AKTUALISIERT_AM TIMESTAMP,
|
AKTUALISIERT_AM TIMESTAMP,
|
||||||
KONFEKTIONAER VARCHAR2(200),
|
KONFEKTIONAER VARCHAR2(200),
|
||||||
|
KONFEKTIONAER_ID NUMBER,
|
||||||
QUOTE_ERSTBESTAETIGUNG NUMBER(7,4),
|
QUOTE_ERSTBESTAETIGUNG NUMBER(7,4),
|
||||||
PROZENT_LIEFERTREUE NUMBER(7,4),
|
PROZENT_LIEFERTREUE NUMBER(7,4),
|
||||||
ANTEIL_PROZENT_LIEFERTERMINUNTERSCHREITUNG NUMBER(7,4),
|
ANTEIL_PROZENT_LIEFERTERMINUNTERSCHREITUNG NUMBER(7,4),
|
||||||
@@ -30,3 +31,45 @@ CREATE TABLE WATTANA.KPI_KONFEKTIONAERE (
|
|||||||
MITTLERE_DURCHLAUFZEIT_ANZAHL_TAGE NUMBER(10),
|
MITTLERE_DURCHLAUFZEIT_ANZAHL_TAGE NUMBER(10),
|
||||||
MITTLERER_QUALITAETSSCORE_PSM NUMBER(5,4)
|
MITTLERER_QUALITAETSSCORE_PSM NUMBER(5,4)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE WATTANA.EXTERN_MIS (
|
||||||
|
"ID" NUMBER PRIMARY KEY,
|
||||||
|
"PA" NUMBER,
|
||||||
|
"PA Pos" NUMBER,
|
||||||
|
"VK Auftrag" NUMBER,
|
||||||
|
"Konfektionär" VARCHAR2(1000),
|
||||||
|
"Lieferantnr." NUMBER
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE WATTANA.EXTERN_PSM (
|
||||||
|
"ID" NUMBER PRIMARY KEY,
|
||||||
|
"VK Auftrag" NUMBER,
|
||||||
|
"Artikelbez." VARCHAR2(1000),
|
||||||
|
"Auftragsmenge" NUMBER,
|
||||||
|
"Kunde" VARCHAR2(1000),
|
||||||
|
"PA" NUMBER,
|
||||||
|
"PA Pos" NUMBER,
|
||||||
|
"PSM gemeldet am" TIMESTAMP,
|
||||||
|
"Konfektionär" VARCHAR2(1000),
|
||||||
|
"Lieferantnr." NUMBER,
|
||||||
|
"Artikelnr." VARCHAR2(300),
|
||||||
|
"LT Kunde bestätigt" DATE,
|
||||||
|
"Export Ist" DATE,
|
||||||
|
"1.bestät. Import Konfektionär" DATE,
|
||||||
|
"Import Ist" DATE,
|
||||||
|
"Ablief.(Import Ist+Transport)" DATE,
|
||||||
|
"Wareneingang am" DATE,
|
||||||
|
"Wareneingang geprüft" VARCHAR2(10),
|
||||||
|
"Täglicher Ausstoss" NUMBER,
|
||||||
|
"Zuschnitt am" DATE,
|
||||||
|
"Teile in Zuschnitt" NUMBER,
|
||||||
|
"Teile im Nähband" NUMBER,
|
||||||
|
"Fertigware aus Nähband" NUMBER,
|
||||||
|
"Teile kontrolliert" NUMBER,
|
||||||
|
"Teile verpackt in Karton" NUMBER,
|
||||||
|
"Anzahl Bänder" NUMBER,
|
||||||
|
"Anzahl Näher" NUMBER,
|
||||||
|
"Arbeitsstunden pro Näher" NUMBER,
|
||||||
|
"Anzahl Arbeitstage pro Woche" NUMBER,
|
||||||
|
"Blockauftrag" VARCHAR2(10)
|
||||||
|
);
|
||||||
@@ -25,9 +25,16 @@ data_t1_jobs = data_t1 / "MIS-Auträge_22.csv"
|
|||||||
assert data_t1_jobs.exists()
|
assert data_t1_jobs.exists()
|
||||||
data_t1_PSM = data_t1 / "Produktionsstandsmeldungen.csv"
|
data_t1_PSM = data_t1 / "Produktionsstandsmeldungen.csv"
|
||||||
assert data_t1_PSM.exists()
|
assert data_t1_PSM.exists()
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
# // MIS-Aufträge
|
# // MIS-Aufträge
|
||||||
# pl.read_csv(data_t1_jobs, encoding="windows-1252", separator=";")
|
# schema_override = {
|
||||||
|
# "Fertigungsminuten pro Artikel": pl.String,
|
||||||
|
# }
|
||||||
|
schema_override = None
|
||||||
|
pl.read_csv(
|
||||||
|
data_t1_jobs, encoding="windows-1252", separator=";", schema_overrides=schema_override
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
408
prototypes/01-2_cleanup_MIS-file.py
Normal file
408
prototypes/01-2_cleanup_MIS-file.py
Normal file
@@ -0,0 +1,408 @@
|
|||||||
|
# %%
|
||||||
|
import datetime
|
||||||
|
import enum
|
||||||
|
import importlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from pprint import pprint
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import polars as pl
|
||||||
|
import sqlalchemy as sql
|
||||||
|
|
||||||
|
from wattanalyse import db
|
||||||
|
|
||||||
|
importlib.reload(db)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
PROJECT_BASE = Path(__file__).parents[1]
|
||||||
|
DATA_PTH = PROJECT_BASE / "data"
|
||||||
|
assert DATA_PTH.exists()
|
||||||
|
# %%
|
||||||
|
data_t1 = DATA_PTH / "PSM/20260507"
|
||||||
|
assert data_t1.exists()
|
||||||
|
# %%
|
||||||
|
# data_t1_jobs = data_t1 / "MIS-Auträge_22.csv"
|
||||||
|
data_t1_jobs = data_t1 / "MIS Auträge ab 22.csv"
|
||||||
|
assert data_t1_jobs.exists()
|
||||||
|
data_t1_PSM = data_t1 / "Produktionsstandsmeldungen.csv"
|
||||||
|
assert data_t1_PSM.exists()
|
||||||
|
# %%
|
||||||
|
# // MIS-Aufträge
|
||||||
|
schema_override = {
|
||||||
|
"Fertigungsminuten pro Artikel": pl.String,
|
||||||
|
"Fertigungsminuten pro PA": pl.String,
|
||||||
|
"Auftragsmenge offen": pl.String,
|
||||||
|
"Gutschrift Menge": pl.String,
|
||||||
|
"PA Menge offen": pl.String,
|
||||||
|
}
|
||||||
|
# schema_override = None
|
||||||
|
data = pl.read_csv(
|
||||||
|
data_t1_jobs, encoding="windows-1252", separator=";", schema_overrides=schema_override
|
||||||
|
).head(-1)
|
||||||
|
# %%
|
||||||
|
faulty_cols = [
|
||||||
|
"Fertigungsminuten pro Artikel",
|
||||||
|
"Fertigungsminuten pro PA",
|
||||||
|
"Auftragsmenge offen",
|
||||||
|
"Gutschrift Menge",
|
||||||
|
"PA Menge offen",
|
||||||
|
]
|
||||||
|
data = data.with_columns(
|
||||||
|
pl.col(faulty_cols)
|
||||||
|
.str.replace(r"\.(\d)$", r".${1}00")
|
||||||
|
.str.replace(r"\.(\d\d)$", r".${1}0")
|
||||||
|
.str.replace_all(r"\.", "")
|
||||||
|
.cast(pl.Int64)
|
||||||
|
.name.keep()
|
||||||
|
)
|
||||||
|
# %%
|
||||||
|
# cols = data.columns
|
||||||
|
# data = data.with_row_index("idx", offset=2)
|
||||||
|
# data = data.select(["idx"] + cols)
|
||||||
|
# data.head()
|
||||||
|
|
||||||
|
# %%
|
||||||
|
data = data.select(["PA", "PA Pos", "VK Auftrag", "Konfektionär"])
|
||||||
|
# // save data as raw
|
||||||
|
target = DATA_PTH / "MIS_20260507.arrow"
|
||||||
|
data.write_ipc(target)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# !! schema not working because of faulty base data
|
||||||
|
# keep this schema for later, maybe helpful at later stages
|
||||||
|
# for prototyping just use a subset with the relevant features, especially "PA" + "PA Pos"
|
||||||
|
schema_MIS = {
|
||||||
|
"Muster neu / vor Ort": pl.String,
|
||||||
|
"PA Pos": pl.UInt32,
|
||||||
|
"Agentur": pl.String,
|
||||||
|
"Konfektionär bestätigt": pl.Int8,
|
||||||
|
"Auftragsart": pl.String,
|
||||||
|
"Geplante Fertigungsdauer (Tage)": pl.UInt64,
|
||||||
|
"Geplanter Ausstoß pro Tag": pl.UInt64,
|
||||||
|
"PSM Import Ist": pl.Date,
|
||||||
|
"Export Ist": pl.Date,
|
||||||
|
"Kundenliefertermin bestätigt": pl.Date,
|
||||||
|
"Kundenliefertermin Soll": pl.Date,
|
||||||
|
"Kundenliefertermin bestätigt (erster)": pl.Date,
|
||||||
|
"PSM Gemeldet am": pl.Date,
|
||||||
|
"Kunde Kurzbezeichnung": pl.String,
|
||||||
|
"Artikelbezeichnung": pl.String,
|
||||||
|
"Artikelnummer": pl.String,
|
||||||
|
"PA Menge Soll": pl.UInt32,
|
||||||
|
"PA": pl.UInt64,
|
||||||
|
"VK Auftrag": pl.UInt64,
|
||||||
|
"PSM Bereits in Produktion": pl.UInt32,
|
||||||
|
"Konfektionär": pl.String,
|
||||||
|
"Auftragseingang": pl.Date,
|
||||||
|
"Export geplant": pl.Date,
|
||||||
|
"VK Auftrag Pos": pl.UInt32,
|
||||||
|
"Import Ist": pl.Date,
|
||||||
|
"Importtermin bestätigt": pl.Int8,
|
||||||
|
"Kundenliefertermin geplant (Import + Transport) autom. berechnet": pl.Date,
|
||||||
|
"1. bestätigter Import Konfektionär": pl.Date,
|
||||||
|
"PSM Grund Lieferverschiebung": pl.String,
|
||||||
|
"Saison": pl.Int64,
|
||||||
|
"Auftragsstatus": pl.String,
|
||||||
|
"Kd. Auftrag": pl.String,
|
||||||
|
"Schweißartikel": pl.String,
|
||||||
|
"Konfektionsland": pl.String,
|
||||||
|
"Artikelfarbe": pl.String,
|
||||||
|
"Materialbedarf Kosten Soll gesamt": pl.Decimal(scale=2),
|
||||||
|
"ASD Nr.": pl.String,
|
||||||
|
"Kunde": pl.String,
|
||||||
|
"Konzern": pl.String,
|
||||||
|
"Lieferort": pl.String,
|
||||||
|
"Kommentar Lieferant KW X": pl.String,
|
||||||
|
"Kommentar BWBM KW X": pl.String,
|
||||||
|
"Auftragsmenge": pl.UInt32,
|
||||||
|
"Auftragsmenge geliefert": pl.UInt32,
|
||||||
|
"Auftragsmenge offen": pl.UInt32,
|
||||||
|
"Angebotspreis kalk pro Artikel aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"VK Preis": pl.Decimal(scale=2),
|
||||||
|
"VK Rechnungen bezahlt am": pl.String,
|
||||||
|
"VK Rechnungen netto bezahlt": pl.Decimal(scale=2),
|
||||||
|
"VK Gutschriften Info": pl.String,
|
||||||
|
"RV Vertragslaufzeit Beginn": pl.Date,
|
||||||
|
"RV Vertragslaufzeit Ende": pl.Date,
|
||||||
|
"Auftrag angelegt am": pl.Date,
|
||||||
|
"Kundenliefertermin Ist (Letzte Lieferung)": pl.Date,
|
||||||
|
"Exportabschluss vollständig am": pl.Date,
|
||||||
|
"LP kalk pro Artikel aus Auftragspos.": pl.Decimal(scale=2),
|
||||||
|
"PA aktiv (PL auf PA umstellen)": pl.Int8,
|
||||||
|
"Vorfertigungsstufen in PA": pl.String,
|
||||||
|
"PA Status": pl.String,
|
||||||
|
"PA Art": pl.String,
|
||||||
|
"PA Typ": pl.String,
|
||||||
|
"Dach-PA": pl.String,
|
||||||
|
"MEL": pl.String,
|
||||||
|
"Nachlieferungen": pl.String,
|
||||||
|
"Ersatzlieferungen": pl.String,
|
||||||
|
"Konfektionär aus Kalkulation": pl.String,
|
||||||
|
"Konfektionsland aus Kalkulation": pl.String,
|
||||||
|
"LP kalk gesamt aus Auftragspos.": pl.Decimal(scale=2),
|
||||||
|
"LP Ist pro Artikel aus PA-Stufe Fertigung": pl.Decimal(scale=2),
|
||||||
|
"LP bestätigt": pl.Int8,
|
||||||
|
"LP Ist gesamt aus PA-Stufe Fertigung": pl.Decimal(scale=2),
|
||||||
|
"Info PPS (aus PA)": pl.String,
|
||||||
|
"PA Menge offen": pl.UInt32,
|
||||||
|
"PSM Teile in Zuschnitt": pl.UInt32,
|
||||||
|
"PSM Teile in Nähband": pl.UInt32,
|
||||||
|
"Info PPS (allgemein)": pl.String,
|
||||||
|
"MwVZ kalk pro Artikel aus Auftragpos.": pl.Decimal(scale=2),
|
||||||
|
"MwVZ kalk gesamt aus Auftragpos.": pl.Decimal(scale=2),
|
||||||
|
"MwVZ berechnet pro Artikel (Basis PA Stüli)": pl.Decimal(scale=2),
|
||||||
|
"MwVZ berechnet gesamt (Basis PA Stüli)": pl.Decimal(scale=2),
|
||||||
|
"MwVZ berechnet Bemerkung (Basis PA Stüli)": pl.String,
|
||||||
|
"MwVZ Ist pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"MwVZ Ist gesamt": pl.Decimal(scale=2),
|
||||||
|
"Kalk/Ist-Preise aus ELO": pl.String,
|
||||||
|
"Materialkosten kalk gesamt aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Herstellkosten kalk pro Artikel aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Herstellkosten kalk gesamt aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Materialbedarf Kosten Soll pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten Überlieferung pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten Überlieferung gesamt": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten Komplettlieferung pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten Komplettlieferung gesamt": pl.Decimal(scale=2),
|
||||||
|
"Material Bestellwert pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Material Bestellwert gesamt": pl.Decimal(scale=2),
|
||||||
|
"Material bereits bezahlt": pl.Decimal(scale=2),
|
||||||
|
"Material noch nicht bezahlt - ELO Rechnung vorhanden": pl.Decimal(scale=2),
|
||||||
|
"Transportkosten Import kalk pro Artikel aus KalkSchema oder Auftragspos.": pl.Decimal(
|
||||||
|
scale=2
|
||||||
|
),
|
||||||
|
"Transportkosten Import kalk gesamt aus KalkSchema oder Auftragspos.": pl.Decimal(
|
||||||
|
scale=2
|
||||||
|
),
|
||||||
|
"Transportkosten Import Ist gesamt": pl.Decimal(scale=2),
|
||||||
|
"Transportkosten Import Ist pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Transportkosten Export kalk pro Artikel aus KalkSchema oder Auftragspos. ": pl.Decimal(
|
||||||
|
scale=2
|
||||||
|
),
|
||||||
|
"Transportkosten Export kalk gesamt aus KalkSchema oder Auftragspos.": pl.Decimal(
|
||||||
|
scale=2
|
||||||
|
),
|
||||||
|
"Umsatz Auftragsmenge gesamt": pl.Decimal(scale=2),
|
||||||
|
"Transportkosten Export Ist gesamt": pl.Decimal(scale=2),
|
||||||
|
"Transportkosten Export Ist pro Artikel": pl.Decimal(scale=2),
|
||||||
|
"Zuschlag (Stickerei/Zutaten)": pl.Decimal(scale=2),
|
||||||
|
"LP + MwVz kalk gesamt": pl.Decimal(scale=2),
|
||||||
|
"LP + MwVz Ist gesamt": pl.Decimal(scale=2),
|
||||||
|
"Stückliste Freigabe am": pl.Date,
|
||||||
|
"Kundenmuster Freigabe am": pl.Date,
|
||||||
|
"Lieferanten ABs komplett am": pl.Date,
|
||||||
|
"Technische Unterlagen/Muster erstellt am": pl.Date,
|
||||||
|
"Etikettlayout erstellt/Freigabe Kunde am": pl.Date,
|
||||||
|
"Schnibi": pl.Date,
|
||||||
|
"VK Rechnung Kz.": pl.String,
|
||||||
|
"Kapazität pro Tag pro Näher (min)": pl.UInt16,
|
||||||
|
"Gesamtkapazität pro Tag (min)": pl.UInt16,
|
||||||
|
"Fertigungsminuten pro Artikel": pl.UInt32,
|
||||||
|
"Fertigungsminuten pro PA": pl.UInt32,
|
||||||
|
"APP Nr.": pl.String,
|
||||||
|
"VK Auftrag Los": pl.Int64,
|
||||||
|
"Umsatz Auftragsmenge offen": pl.Decimal(scale=2),
|
||||||
|
"Umsatz fakturiert": pl.Decimal(scale=2),
|
||||||
|
"Kundenliefertermin bestätigt (Monat/Jahr)": pl.Date,
|
||||||
|
"Materialkosten zu Kalk Preis aus Kalk.-Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu EK Preis aus Kalk.-Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu EKD Preis aus Kalk.-Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu Staffel Preis aus Kalk.-Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu EK Preis aus Soll-Prod.Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu EKD Preis aus Soll-Prod.Stüli": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten zu Staffel Preis aus Soll-Prod.Stüli": pl.Decimal(scale=2),
|
||||||
|
"VK Rechnung erstellt am": pl.Date,
|
||||||
|
"Nationalisierungsabgabe kalk aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten kalk pro Artikel aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Materialkosten Artikelstamm": pl.Decimal(scale=2),
|
||||||
|
"PA Menge Ist": pl.UInt32,
|
||||||
|
"Kundenliefertermin Ist (Letzte Lieferung) (Monat/Jahr)": pl.Date,
|
||||||
|
"Import Ist (Monat/Jahr)": pl.Date,
|
||||||
|
"Kalkulationen (alle) zum Artikel": pl.String,
|
||||||
|
"Kalkulation zu Auftrag": pl.String,
|
||||||
|
"Material Oberstoff Überlieferung in %": pl.Float64,
|
||||||
|
"Material Zutaten Überlieferung in %": pl.Float64,
|
||||||
|
"Lohnkonfektionsbestellnr": pl.String,
|
||||||
|
"VK Auftrag Pos Text": pl.String,
|
||||||
|
"PA Vorfertigung Menge": pl.UInt32,
|
||||||
|
"Preisanpassungen zu Artikel": pl.String,
|
||||||
|
"MwVZ kalk pro Artikel aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"PA Vorfertigung Menge offen": pl.UInt32,
|
||||||
|
"PA Vorfertigung Menge Ist": pl.UInt32,
|
||||||
|
"RV Nr.": pl.String,
|
||||||
|
"VK Rechnung erstellt am Jahr": pl.UInt16,
|
||||||
|
"VK Kalk. Angebotspreise (Staffelpreise)": pl.String,
|
||||||
|
"Gutschrift Menge": pl.UInt32,
|
||||||
|
"Ausschreibung abgegeben am": pl.Date,
|
||||||
|
"VK Blockauftrag": pl.String,
|
||||||
|
"Lieferung im Jahr": pl.UInt16,
|
||||||
|
"LP kalk pro Artikel aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"LP kalk gesamt aus KalkSchema": pl.Decimal(scale=2),
|
||||||
|
"Artikel Produktbereich": pl.String,
|
||||||
|
"VK Blockauftrag Pos": pl.Int32,
|
||||||
|
"Preisanpassung beantragt": pl.String,
|
||||||
|
"Preisanpassung erhalten": pl.String,
|
||||||
|
"VK Preis vor Preisanpassung": pl.Decimal(scale=2),
|
||||||
|
"VK Preis nach Preisanpassung": pl.Decimal(scale=2),
|
||||||
|
"Tagesplannr": pl.Int64,
|
||||||
|
"Abweichung Gesamtkosten pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung Materialkosten pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung Materialkosten pro Artikel Kalk zu Ist %": pl.Float64,
|
||||||
|
"Abweichung Lohnpreis pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung Lohnpreis pro Artikel Kalk zu Ist %": pl.Float64,
|
||||||
|
"Abweichung MwVZ pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung MwVZ pro Artikel Kalk zu Ist %": pl.Float64,
|
||||||
|
"Abweichung Transportkosten Export pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung Transportkosten Export pro Artikel Kalk zu Ist %": pl.Float64,
|
||||||
|
"BANFen erstellt am (Prod.Planung)": pl.Date,
|
||||||
|
"Bestellfreigabe am": pl.Date,
|
||||||
|
"Abweichung Transportkosten Import pro Artikel Kalk zu Ist": pl.Decimal(scale=2),
|
||||||
|
"Abweichung Transportkosten Import pro Artikel Kalk zu Ist %": pl.Float64,
|
||||||
|
"Artikelgruppierung PPS": pl.String,
|
||||||
|
"Info QS": pl.String,
|
||||||
|
"Artikelgruppierung VK": pl.String,
|
||||||
|
"Mengenart": pl.String,
|
||||||
|
"Info Z/L": pl.String,
|
||||||
|
"EK Erste Bestellung erstellt am": pl.Date,
|
||||||
|
"Info VK": pl.String,
|
||||||
|
"Info PM": pl.String,
|
||||||
|
"EK Letzte Bestellung erstellt am": pl.Date,
|
||||||
|
"EK Letzte AB Oberstoff": pl.Date,
|
||||||
|
"EK Letzte AB Zutaten": pl.Date,
|
||||||
|
"Info EK": pl.String,
|
||||||
|
"Info BuHa": pl.String,
|
||||||
|
"Info Musternäherei": pl.String,
|
||||||
|
"VK Ansprechpartner": pl.String,
|
||||||
|
"Artikel Matchcode": pl.String,
|
||||||
|
"Artikel Produktgruppe": pl.String,
|
||||||
|
"Artikel Thema": pl.String,
|
||||||
|
"PSM Wareneingang geprüft": pl.Int8,
|
||||||
|
"LV gesendet": pl.Date,
|
||||||
|
"LV bestätigt": pl.Date,
|
||||||
|
"VK Suchmerkmal": pl.String,
|
||||||
|
"PSM Wareneingang am": pl.Date,
|
||||||
|
"VK Rechnung Nr.": pl.String,
|
||||||
|
"Lieferschein Nr.": pl.String,
|
||||||
|
"QS Prüfung vor Ort erforderlich": pl.Int8,
|
||||||
|
"RV Nr. mit Artikel": pl.String,
|
||||||
|
"PSM täglicher Ausstoß": pl.UInt32,
|
||||||
|
"QS Lieferung Qualität aus ELO": pl.String,
|
||||||
|
"PSM Anzahl Bänder": pl.UInt32,
|
||||||
|
"PSM Anzahl Näher": pl.UInt32,
|
||||||
|
"PSM Arbeitsstunden pro Tag pro Näher": pl.UInt8,
|
||||||
|
"PSM Arbeitstage pro Woche": pl.UInt8,
|
||||||
|
"PSM Zuschnitt am": pl.Date,
|
||||||
|
"PSM Fertigware aus Nähband": pl.UInt32,
|
||||||
|
"PSM Teile kontrolliert": pl.UInt32,
|
||||||
|
"PSM Teile verpackt": pl.UInt32,
|
||||||
|
"PSM Hängeware": pl.Int8,
|
||||||
|
"Kundenliefertermin Verschiebungen": pl.UInt32,
|
||||||
|
"PSM Anzahl Paletten": pl.UInt32,
|
||||||
|
"PSM Anzahl Kartons": pl.UInt32,
|
||||||
|
"PSM Teile in Färberei": pl.UInt32,
|
||||||
|
"PSM Teile in Stickerei": pl.UInt32,
|
||||||
|
"Güteprüfung beantragt": pl.Int8,
|
||||||
|
"Güteprüfung erforderlich": pl.Int8,
|
||||||
|
"Güteprüfung Termin": pl.Date,
|
||||||
|
"Güteprüfung Ort": pl.String,
|
||||||
|
"Materialdatei erforderlich": pl.Int8,
|
||||||
|
"Materialdatei beantragt am": pl.Date,
|
||||||
|
"Materialdatei Freigabe am": pl.Date,
|
||||||
|
"Export bestätigt": pl.Int8,
|
||||||
|
"MEL gesendet": pl.Int8,
|
||||||
|
"Lieferart": pl.String,
|
||||||
|
"Schnittfreigabe": pl.Date,
|
||||||
|
"Schnibi gesendet an": pl.String,
|
||||||
|
"Etiketten Druckfreigabe": pl.Date,
|
||||||
|
"Sonderkommissionierung": pl.Int8,
|
||||||
|
"Sonderkommissionierung Kosten": pl.Decimal(scale=2),
|
||||||
|
"Artikel Gewicht in g": pl.UInt64,
|
||||||
|
"Nach-/Ersatzlieferung Transportkosten": pl.Decimal(scale=2),
|
||||||
|
"HPZ (Herstellerprüfzertifikat) eingereicht": pl.Int8,
|
||||||
|
"Stückliste Freigabe Bemerkung": pl.String,
|
||||||
|
"Schnittfreigabe Bemerkung": pl.String,
|
||||||
|
"RV Vertragsmenge gesamt (BA)": pl.UInt32,
|
||||||
|
"RV Vertragsmenge abgerufen gesamt (BA)": pl.UInt32,
|
||||||
|
"RV Vertragsmenge offen gesamt (BA)": pl.UInt32,
|
||||||
|
"RV Auftragsmenge (DA)": pl.UInt32,
|
||||||
|
"RV Auftragsmenge geliefert (DA)": pl.UInt32,
|
||||||
|
"Vertragsstrafe Belegnr. intern/extern mit Belegdatum aus ELO": pl.String,
|
||||||
|
"RV Auftragsmenge offen (DA)": pl.UInt32,
|
||||||
|
"RV Forecastmenge": pl.UInt32,
|
||||||
|
"QS Auftrag aus VK gedruckt": pl.Int8,
|
||||||
|
"TU gespeichert in Auftrag": pl.Int8,
|
||||||
|
"Mail Muster für Proforma": pl.Int8,
|
||||||
|
"Musterliste": pl.Int8,
|
||||||
|
"Vertragsstrafe Info aus ELO": pl.String,
|
||||||
|
"EP (Endprüfprotokoll)": pl.Int8,
|
||||||
|
"ZP (Zwischenprüfprotokoll)": pl.Int8,
|
||||||
|
"Lagen Laminat": pl.String,
|
||||||
|
"Workflowart": pl.String,
|
||||||
|
"Vertragsstrafe Grund aus ELO": pl.String,
|
||||||
|
"RV Sortierung": pl.String,
|
||||||
|
"EK Lieferzeit (längste) Oberstoff in Wochen aus Kalk.Stüli": pl.String,
|
||||||
|
"EK Lieferzeit (längste) Zutaten in Wochen aus Kalk.Stüli": pl.String,
|
||||||
|
"Vertragsstrafe Verzugstage aus ELO": pl.String,
|
||||||
|
"Vertragsstrafe Betrag aus ELO": pl.String,
|
||||||
|
"RV Mindestmenge (BA)": pl.String,
|
||||||
|
"QS Ansprechpartner für Konfektionär": pl.String,
|
||||||
|
"Vertragsstrafe weiterbelastet an (Weiterbelastung-Nr.) aus ELO": pl.String,
|
||||||
|
"Vertragsstrafe Weiterbelastung Betrag aus ELO": pl.Decimal(scale=2),
|
||||||
|
"Vertragsstrafe Gutschrift Nr. aus ELO": pl.String,
|
||||||
|
"Vertragsstrafe Gutschrift Betrag aus ELO": pl.Decimal(scale=2),
|
||||||
|
"Vertragsstrafe fiktiv Betrag LT Soll zu LT bestätigt (letzter)": pl.Decimal(scale=2),
|
||||||
|
"Vertragsstrafe fiktiv Betrag LT Soll zu LT Ist": pl.Decimal(scale=2),
|
||||||
|
"Ausschreibung Lieferzeit in Tagen (Mo-Fr)": pl.UInt64,
|
||||||
|
"Konfektionär Gesamtanzahl Näher": pl.UInt64,
|
||||||
|
"QS VP Muster erforderlich": pl.Int8,
|
||||||
|
"Abweichung LT Soll zu LT bestätigt (letzter) in Tagen (Mo-Fr)": pl.UInt64,
|
||||||
|
"Abweichung LT Soll zu LT Ist in Tagen (Mo-Fr)": pl.UInt64,
|
||||||
|
"RV Mindestmenge geliefert (BA)": pl.UInt32,
|
||||||
|
"RV Mindestmenge offen (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Menge (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Menge geliefert (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Menge offen (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Restmenge zur Maximalmenge (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Restmenge zur Maximalmenge geliefert (BA)": pl.UInt32,
|
||||||
|
"RV unverbindliche Restmenge zur Maximalmenge offen (BA)": pl.UInt32,
|
||||||
|
"QS Lieferung Qualität Bemerkung aus ELO": pl.String,
|
||||||
|
"Abweichung 'Export Ist' zu 'Zuschnitt am' (Mo-Fr)": pl.UInt64,
|
||||||
|
"Lieferschein erstellt am": pl.Date,
|
||||||
|
"Materialdatei EK abgeschlossen": pl.String,
|
||||||
|
"Lademeter Export": pl.String,
|
||||||
|
"Palettenanzahl Import": pl.UInt64,
|
||||||
|
"Transportzeit Konfektionär zu Kunde": pl.UInt32,
|
||||||
|
"Abweichung LT bestätigt zu LT geplant": pl.UInt64,
|
||||||
|
"Lieferadresse": pl.String,
|
||||||
|
}
|
||||||
|
# %%
|
||||||
|
data.filter(pl.col("LP kalk gesamt aus KalkSchema").str.contains("6.072")).select(
|
||||||
|
"LP kalk gesamt aus KalkSchema"
|
||||||
|
)
|
||||||
|
# %%
|
||||||
|
data = data.cast(schema_MIS)
|
||||||
|
# %%
|
||||||
|
df = pl.DataFrame(
|
||||||
|
{
|
||||||
|
"auftrag_id": [1, 2, 3, 4, 5],
|
||||||
|
"defekte_zahlen": ["3.11", "1.2", "1.250.000", "500", "1.0"],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# 2. Bereinigung durchführen
|
||||||
|
df_bereinigt = df.with_columns(
|
||||||
|
pl.col("defekte_zahlen")
|
||||||
|
# Schritt A: Wenn nur 1 Ziffer nach dem Punkt steht (z.B. .2), zwei Nullen anhängen
|
||||||
|
.str.replace(r"\.(\d)$", r".${1}00")
|
||||||
|
# Schritt B: Wenn 2 Ziffern nach dem Punkt stehen (z.B. .11), eine Null anhängen
|
||||||
|
.str.replace(r"\.(\d\d)$", r".${1}0")
|
||||||
|
# Schritt C: Alle Punkte entfernen (da es reine Tausendertrennzeichen sind)
|
||||||
|
.str.replace_all(r"\.", "")
|
||||||
|
# Schritt D: In eine Ganzzahl (Integer) umwandeln
|
||||||
|
.cast(pl.Int64)
|
||||||
|
.alias("saubere_zahlen")
|
||||||
|
)
|
||||||
|
# %%
|
||||||
|
df_bereinigt
|
||||||
|
# %%
|
||||||
111
prototypes/03-2_fill_oracle-db.py
Normal file
111
prototypes/03-2_fill_oracle-db.py
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# %%
|
||||||
|
import importlib
|
||||||
|
from pathlib import Path
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
import external_code
|
||||||
|
import oracledb
|
||||||
|
import polars as pl
|
||||||
|
|
||||||
|
import wattanalyse
|
||||||
|
from wattanalyse import constants, db
|
||||||
|
|
||||||
|
importlib.reload(wattanalyse)
|
||||||
|
importlib.reload(constants)
|
||||||
|
importlib.reload(external_code)
|
||||||
|
importlib.reload(db)
|
||||||
|
# %%
|
||||||
|
PROJECT_BASE = Path(__file__).parents[1]
|
||||||
|
DATA_PTH = PROJECT_BASE / "data"
|
||||||
|
assert DATA_PTH.exists()
|
||||||
|
# %%
|
||||||
|
|
||||||
|
mis_data = DATA_PTH / "MIS_20260507.arrow"
|
||||||
|
psm_data = DATA_PTH / "PSM_20260507.arrow"
|
||||||
|
|
||||||
|
assert mis_data.exists()
|
||||||
|
assert psm_data.exists()
|
||||||
|
# %%
|
||||||
|
# // prepare
|
||||||
|
data_mis = pl.read_ipc(mis_data)
|
||||||
|
select_cols = data_mis.columns
|
||||||
|
data_mis = data_mis.with_row_index("ID", offset=1)
|
||||||
|
data_mis = data_mis.select(["ID"] + select_cols)
|
||||||
|
data_mis.head()
|
||||||
|
|
||||||
|
# %%
|
||||||
|
data_mis = (
|
||||||
|
data_mis.with_columns(
|
||||||
|
pl.col("Konfektionär").str.replace(r" - [^-]+$", "").alias("Konfektionär_"),
|
||||||
|
pl.col("Konfektionär")
|
||||||
|
.str.extract(r" - ([^-]+)$", 1)
|
||||||
|
.cast(pl.UInt64)
|
||||||
|
.alias("Lieferantnr."),
|
||||||
|
)
|
||||||
|
.drop("Konfektionär")
|
||||||
|
.rename({"Konfektionär_": "Konfektionär"})
|
||||||
|
.with_columns(
|
||||||
|
pl.col("Konfektionär").str.strip_chars(" "),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# %%
|
||||||
|
new_mis_data = DATA_PTH / "MIS_prep_20260507.arrow"
|
||||||
|
data_mis.write_ipc(new_mis_data)
|
||||||
|
####################################
|
||||||
|
# %%
|
||||||
|
konf_ids = data_mis.select(["Konfektionär", "Lieferantnr."]).unique(
|
||||||
|
subset=["Konfektionär"], keep="first"
|
||||||
|
)
|
||||||
|
# %%
|
||||||
|
data_psm = pl.read_ipc(psm_data)
|
||||||
|
select_cols = data_psm.columns
|
||||||
|
data_psm = data_psm.with_row_index("ID", offset=1).with_columns(
|
||||||
|
pl.col("Konfektionär").str.strip_chars(" ")
|
||||||
|
)
|
||||||
|
data_psm.head()
|
||||||
|
# %%
|
||||||
|
select_cols = data_psm.columns
|
||||||
|
konf_idx = select_cols.index("Konfektionär")
|
||||||
|
select_cols.insert(konf_idx + 1, "Lieferantnr.")
|
||||||
|
data_psm = data_psm.join(konf_ids, on="Konfektionär", how="left").select(select_cols)
|
||||||
|
data_psm.head()
|
||||||
|
# %%
|
||||||
|
new_psm_data = DATA_PTH / "PSM_prep_20260507.arrow"
|
||||||
|
data_psm.write_ipc(new_psm_data)
|
||||||
|
# %%
|
||||||
|
# // save to database
|
||||||
|
new_mis_data = DATA_PTH / "MIS_prep_20260507.arrow"
|
||||||
|
data_mis = pl.read_ipc(new_mis_data)
|
||||||
|
new_psm_data = DATA_PTH / "PSM_prep_20260507.arrow"
|
||||||
|
data_psm = pl.read_ipc(new_psm_data)
|
||||||
|
data_psm.head()
|
||||||
|
# %%
|
||||||
|
conn = oracledb.connect(
|
||||||
|
user=constants.USER_CFG.Datenbank.NUTZER,
|
||||||
|
password=constants.USER_CFG.Datenbank.PASSWORT,
|
||||||
|
host=constants.USER_CFG.Datenbank.HOST,
|
||||||
|
port=constants.USER_CFG.Datenbank.PORT,
|
||||||
|
service_name=constants.USER_CFG.Datenbank.SERVICE_NAME,
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
stmts = external_code.oracle_generate_sql_insert("EXTERN_MIS", data_mis.columns)
|
||||||
|
external_code.oracle_save_polars(conn, stmts, data_mis)
|
||||||
|
# %%
|
||||||
|
stmts = external_code.oracle_generate_sql_insert("EXTERN_PSM", data_psm.columns)
|
||||||
|
external_code.oracle_save_polars(conn, stmts, data_psm)
|
||||||
|
# %%
|
||||||
|
schema = db.extern_MIS_t_schema
|
||||||
|
df = external_code.oracle_load_table_as_polars(conn, "EXTERN_MIS", schema=schema).collect()
|
||||||
|
df
|
||||||
|
# %%
|
||||||
|
schema = db.extern_prod_order_t_schema
|
||||||
|
df = external_code.oracle_load_table_as_polars(conn, "EXTERN_PSM", schema=schema).collect()
|
||||||
|
df
|
||||||
|
# %%
|
||||||
|
# // alter table for aggregates of supplier
|
||||||
|
stmt = 'ALTER TABLE "KPI_KONFEKTIONAERE" ADD ("KONFEKTIONAER_ID" NUMBER);'
|
||||||
|
with conn.cursor() as cursor:
|
||||||
|
cursor.execute(stmt)
|
||||||
|
conn.commit()
|
||||||
|
# %%
|
||||||
@@ -84,7 +84,7 @@ MD_INTERNAL.create_all(ENGINE_INTERNAL)
|
|||||||
|
|
||||||
# ** read
|
# ** read
|
||||||
extern_prod_order_t_schema: dict[str, type[pl.DataType]] = {
|
extern_prod_order_t_schema: dict[str, type[pl.DataType]] = {
|
||||||
"VK Auftrag": pl.UInt32,
|
"VK Auftrag": pl.UInt64,
|
||||||
"Artikelbez.": pl.String,
|
"Artikelbez.": pl.String,
|
||||||
"Auftragsmenge": pl.UInt32,
|
"Auftragsmenge": pl.UInt32,
|
||||||
"Kunde": pl.String,
|
"Kunde": pl.String,
|
||||||
@@ -92,6 +92,7 @@ extern_prod_order_t_schema: dict[str, type[pl.DataType]] = {
|
|||||||
"PA Pos": pl.UInt32,
|
"PA Pos": pl.UInt32,
|
||||||
"PSM gemeldet am": pl.Datetime,
|
"PSM gemeldet am": pl.Datetime,
|
||||||
"Konfektionär": pl.String,
|
"Konfektionär": pl.String,
|
||||||
|
"Lieferantnr.": pl.UInt64,
|
||||||
"Artikelnr.": pl.String,
|
"Artikelnr.": pl.String,
|
||||||
"LT Kunde bestätigt": pl.Date,
|
"LT Kunde bestätigt": pl.Date,
|
||||||
"Export Ist": pl.Date,
|
"Export Ist": pl.Date,
|
||||||
@@ -107,13 +108,21 @@ extern_prod_order_t_schema: dict[str, type[pl.DataType]] = {
|
|||||||
"Fertigware aus Nähband": pl.UInt64,
|
"Fertigware aus Nähband": pl.UInt64,
|
||||||
"Teile kontrolliert": pl.UInt64,
|
"Teile kontrolliert": pl.UInt64,
|
||||||
"Teile verpackt in Karton": pl.UInt64,
|
"Teile verpackt in Karton": pl.UInt64,
|
||||||
"Anzahl Bänder": pl.UInt16,
|
"Anzahl Bänder": pl.UInt32,
|
||||||
"Anzahl Näher": pl.UInt16,
|
"Anzahl Näher": pl.UInt32,
|
||||||
"Arbeitsstunden pro Näher": pl.UInt8,
|
"Arbeitsstunden pro Näher": pl.UInt8,
|
||||||
"Anzahl Arbeitstage pro Woche": pl.UInt8,
|
"Anzahl Arbeitstage pro Woche": pl.UInt8,
|
||||||
"Blockauftrag": pl.String,
|
"Blockauftrag": pl.String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern_MIS_t_schema: dict[str, type[pl.DataType]] = {
|
||||||
|
"PA": pl.UInt64,
|
||||||
|
"PA Pos": pl.UInt32,
|
||||||
|
"VK Auftrag": pl.UInt64,
|
||||||
|
"Konfektionär": pl.String,
|
||||||
|
"Lieferantnr.": pl.UInt64,
|
||||||
|
}
|
||||||
|
|
||||||
# ** write
|
# ** write
|
||||||
extern_results_prod_orders_t: Table = Table(
|
extern_results_prod_orders_t: Table = Table(
|
||||||
"KPI_PRODUKTIONSAUFTRAEGE",
|
"KPI_PRODUKTIONSAUFTRAEGE",
|
||||||
@@ -136,6 +145,7 @@ extern_results_suppliers_t: Table = Table(
|
|||||||
Column("ID", sql.Integer, primary_key=True),
|
Column("ID", sql.Integer, primary_key=True),
|
||||||
Column("AKTUALISIERT_AM", sql.DateTime, nullable=False),
|
Column("AKTUALISIERT_AM", sql.DateTime, nullable=False),
|
||||||
Column("KONFEKTIONAER", sql.String(200), nullable=True),
|
Column("KONFEKTIONAER", sql.String(200), nullable=True),
|
||||||
|
Column("KONFEKTIONAER_ID", sql.Integer, nullable=True),
|
||||||
Column("QUOTE_ERSTBESTAETIGUNG", sql.Numeric(7, 4), nullable=True),
|
Column("QUOTE_ERSTBESTAETIGUNG", sql.Numeric(7, 4), nullable=True),
|
||||||
Column("PROZENT_LIEFERTREUE", sql.Numeric(7, 4), nullable=True),
|
Column("PROZENT_LIEFERTREUE", sql.Numeric(7, 4), nullable=True),
|
||||||
Column("ANTEIL_PROZENT_LIEFERTERMINUNTERSCHREITUNG", sql.Numeric(7, 4), nullable=True),
|
Column("ANTEIL_PROZENT_LIEFERTERMINUNTERSCHREITUNG", sql.Numeric(7, 4), nullable=True),
|
||||||
|
|||||||
Reference in New Issue
Block a user