Commit 92796ceb authored by Marco Schmiedel's avatar Marco Schmiedel

fix

parent 38b8a85a
...@@ -3,3 +3,4 @@ __pycache__ ...@@ -3,3 +3,4 @@ __pycache__
workbench/*.bak workbench/*.bak
cache/*.html cache/*.html
cache/*.csv cache/*.csv
cache/*.pdf
\ No newline at end of file
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
"fileId": "01509001-bd4e-4462-93ad-dc5066fd729a", "fileId": "01509001-bd4e-4462-93ad-dc5066fd729a",
"originalPath": "work/models/deal_deal.py", "originalPath": "work/models/deal_deal.py",
"currentPath": "work/models/deal_deal.py", "currentPath": "work/models/deal_deal.py",
"hash": "099f755dbb69b9e183dcf39898a9cb00f6eed50a9fede3188d0171f421476186", "hash": "4d15256bbe0040ef1797a5cbf973ceac39d41c8bb583e11e98f60e9a3824d7a5",
"docContent": "<p><br></p>", "docContent": "<p><br></p>",
"checkedStatus": "done", "checkedStatus": "done",
"comments": [], "comments": [],
"lastCheckedTimestamp": 1744626243451, "lastCheckedTimestamp": 1744805220640,
"lastFileModificationTimestamp": 1744625938604.1194, "lastFileModificationTimestamp": 1744787042633.7546,
"flaggedForCopy": false "flaggedForCopy": false
} }
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
"fileId": "24784b38-54dc-4000-9d2a-f59082ebbc1c", "fileId": "24784b38-54dc-4000-9d2a-f59082ebbc1c",
"originalPath": "work/models/base_base.py", "originalPath": "work/models/base_base.py",
"currentPath": "work/models/base_base.py", "currentPath": "work/models/base_base.py",
"hash": "ac06e8d1df3e4d73f4cc72b071faaf8536fdf8471b453e384512b98845b4e566", "hash": "19b6bd8fd24ccac708053a39f013632721ed03ec35663efd7d7ec222cf0be934",
"docContent": "<p><br></p>", "docContent": "<p><br></p>",
"checkedStatus": "done", "checkedStatus": "done",
"comments": [], "comments": [],
"lastCheckedTimestamp": 1744626237630, "lastCheckedTimestamp": 1744805211278,
"lastFileModificationTimestamp": 1744625911470.088, "lastFileModificationTimestamp": 1744787773143.9746,
"flaggedForCopy": false "flaggedForCopy": false
} }
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
"fileId": "2d1520cf-72fc-48b2-9249-380bc40499ed", "fileId": "2d1520cf-72fc-48b2-9249-380bc40499ed",
"originalPath": "work/notebooks/GetDataFromMaui.ipynb", "originalPath": "work/notebooks/GetDataFromMaui.ipynb",
"currentPath": "work/notebooks/GetDataFromMaui.ipynb", "currentPath": "work/notebooks/GetDataFromMaui.ipynb",
"hash": "e2d6ebb28291ed4181c547bd6dee318102be9f937145e1dfeb6c1ff0a001cb39", "hash": "f67eb462d1e9ede84202dfee80222e7e97b36b22b7c134f812acaa6f191a160c",
"docContent": "<p><br></p>", "docContent": "<p><br></p>",
"checkedStatus": "done", "checkedStatus": "done",
"comments": [], "comments": [],
"lastCheckedTimestamp": 1744625554372, "lastCheckedTimestamp": 1744805357670,
"lastFileModificationTimestamp": 1744625453090.3838 "lastFileModificationTimestamp": 1744805352149.463
} }
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
"fileId": "36e791b4-e235-42f6-ac61-8560f1762892", "fileId": "36e791b4-e235-42f6-ac61-8560f1762892",
"originalPath": "work/workbench/Workbench.mwb", "originalPath": "work/workbench/Workbench.mwb",
"currentPath": "work/workbench/Workbench.mwb", "currentPath": "work/workbench/Workbench.mwb",
"hash": "050435dbe63c623b2d9a4201250dad0b5b1c43601ece3e390392e4541b182c9b", "hash": "f10bcc0690c342970656e4b4dcaa462b189bc5fa833b9f2bb04f88731782b1f0",
"docContent": "<p><br></p>", "docContent": "<p><br></p>",
"checkedStatus": "done", "checkedStatus": "done",
"comments": [], "comments": [],
"lastCheckedTimestamp": 1744619680767, "lastCheckedTimestamp": 1744805338829,
"lastFileModificationTimestamp": 1744619453253.4011 "lastFileModificationTimestamp": 1744805330071.942
} }
{
"fileId": "543b791f-9a45-4b53-906e-c49f79ac95d7",
"originalPath": "work/notebooks/ImportCsvToDatabase.ipynb",
"currentPath": "work/notebooks/ImportCsvToDatabase.ipynb",
"hash": "6cdb9455f0658ca804b4beb6201bdfa4ae721451c9fa7c99e0bebe9f5a0dbf09",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744806594117,
"lastFileModificationTimestamp": 1744806589225.9287
}
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
"fileId": "5ec4e9ba-309d-438b-8e17-ce5802f3deb2", "fileId": "5ec4e9ba-309d-438b-8e17-ce5802f3deb2",
"originalPath": "work/workbench/Documentation.md", "originalPath": "work/workbench/Documentation.md",
"currentPath": "work/workbench/Documentation.md", "currentPath": "work/workbench/Documentation.md",
"hash": "f56f35397937e2b3c5e0f8507385b65d8afb0a3321c649466d9698212dc14a62", "hash": "35d995fb3f8a904ed6f47adbd4da60916c93a29aad08af551b493a32714dcd9c",
"docContent": "<p><br></p>", "docContent": "<p><br></p>",
"checkedStatus": "done", "checkedStatus": "done",
"comments": [], "comments": [],
"lastCheckedTimestamp": 1744626251158, "lastCheckedTimestamp": 1744805208732,
"lastFileModificationTimestamp": 1744626180275.6394 "lastFileModificationTimestamp": 1744805204185.4846
} }
...@@ -2,6 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey ...@@ -2,6 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from models._system import Base from models._system import Base
from models.basegroup_bgro import BasegroupBgro from models.basegroup_bgro import BasegroupBgro
from models.option_opti import OptionOpti
class BaseBase(Base): class BaseBase(Base):
__tablename__ = 'base_base' __tablename__ = 'base_base'
......
...@@ -10,6 +10,7 @@ class DealDeal(Base): ...@@ -10,6 +10,7 @@ class DealDeal(Base):
provisiongroup_deal = Column(Integer, ForeignKey('provisiongroup_pgro.id_pgro')) provisiongroup_deal = Column(Integer, ForeignKey('provisiongroup_pgro.id_pgro'))
base_deal = Column(Integer, ForeignKey('base_base.id_base'), nullable=False) base_deal = Column(Integer, ForeignKey('base_base.id_base'), nullable=False)
providercode_deal = Column(String(255)) providercode_deal = Column(String(255))
name_deal = Column(String(255))
alias_deal = Column(String(255)) alias_deal = Column(String(255))
price_deal = Column(Numeric(8, 5), nullable=False) price_deal = Column(Numeric(8, 5), nullable=False)
starts_deal = Column(DateTime, nullable=False) starts_deal = Column(DateTime, nullable=False)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"id": "193fb1fb-6ad1-447e-b641-73857be9d9dd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done\n"
]
}
],
"source": [
"#!/usr/bin/env python3\n",
"\n",
"# Importiert das Modul sys, damit auf Systemfunktionen zugegriffen werden kann.\n",
"import sys\n",
"\n",
"# Fügt das übergeordnete Verzeichnis zum Python-Pfad hinzu, damit lokale Module gefunden werden.\n",
"sys.path.append(\"..\")\n",
"\n",
"# Importiert das Modul os, um Betriebssystemfunktionen wie Pfadoperationen zu nutzen.\n",
"import os\n",
"\n",
"# Importiert das Modul csv, um CSV-Dateien einlesen und verarbeiten zu können.\n",
"import csv\n",
"\n",
"# Importiert das Modul datetime, um Datums- und Zeitfunktionen zu verwenden.\n",
"import datetime\n",
"\n",
"# Importiert die Klasse MysqlManager, um eine Verbindung zur MySQL-Datenbank herzustellen.\n",
"from manager.MysqlManager import MysqlManager\n",
"\n",
"# Importiert die Basisklasse Base, um SQLAlchemy-Modelle zu definieren.\n",
"from models._system import Base\n",
"\n",
"# Importiert die Klasse BasegroupBgro, um auf die Tabelle basegroup_bgro zuzugreifen.\n",
"from models.basegroup_bgro import BasegroupBgro\n",
"\n",
"# Importiert die Klasse BaseBase, um auf die Tabelle base_base zuzugreifen.\n",
"from models.base_base import BaseBase\n",
"\n",
"# Importiert die Klasse ProvisiongroupPgro, um auf die Tabelle provisiongroup_pgro zuzugreifen.\n",
"from models.provisiongroup_pgro import ProvisiongroupPgro\n",
"\n",
"# Importiert die Klasse DealDeal, um auf die Tabelle deal_deal zuzugreifen.\n",
"from models.deal_deal import DealDeal\n",
"\n",
"# Importiert die Klasse OptionOpti, um auf die Tabelle option_opti zuzugreifen.\n",
"from models.option_opti import OptionOpti\n",
"\n",
"# Definiert den Pfad zur CSV-Datei im Cache-Verzeichnis.\n",
"csv_file_path = os.path.join('..', 'cache', 'plans.csv')\n",
"\n",
"# Erzeugt eine Instanz des MysqlManagers, um die MySQL-Verbindung zu verwalten.\n",
"mysql_manager = MysqlManager()\n",
"\n",
"# Öffnet eine neue Session über den MysqlManager, um Datenbankoperationen durchzuführen.\n",
"session = mysql_manager.getSession()\n",
"\n",
"# Öffnet die CSV-Datei im Lese-Modus mit UTF-8-Kodierung und Semikolon als Trennzeichen.\n",
"with open(csv_file_path, newline='', encoding='utf-8') as csvfile:\n",
"\n",
" # Erstellt ein DictReader-Objekt, um Zeilen aus der CSV-Datei als Dictionary abzurufen.\n",
" reader = csv.DictReader(csvfile, delimiter=';')\n",
" \n",
" # Durchläuft jede Zeile, die aus der CSV-Datei gelesen wird.\n",
" for row in reader:\n",
"\n",
" # Speichert den in der CSV-Datei angegebenen Wert 'id' in der Variable csv_id und entfernt Leerzeichen.\n",
" csv_id = row.get('id', '').strip()\n",
"\n",
" # Speichert den in der CSV-Datei angegebenen Wert 'provider' in der Variable provider und entfernt Leerzeichen.\n",
" provider = row.get('provider', '').strip()\n",
"\n",
" # Speichert den in der CSV-Datei angegebenen Wert 'network' in der Variable network und entfernt Leerzeichen.\n",
" network = row.get('network', '').strip()\n",
"\n",
" # Speichert den in der CSV-Datei angegebenen Wert 'name' in der Variable name und entfernt Leerzeichen.\n",
" name = row.get('name', '').strip()\n",
"\n",
" # Speichert den in der CSV-Datei angegebenen Wert 'price' in der Variable price und entfernt Leerzeichen.\n",
" price = row.get('price', '').strip()\n",
" \n",
" # Kombiniert den String \"Freenet | \" mit dem Wert aus provider, um provider_base_val zu erhalten.\n",
" provider_base_val = \"Freenet | \" + provider\n",
" \n",
" # Führt eine Abfrage auf der Tabelle base_base durch, um einen vorhandenen Datensatz mit der gleichen Kombination zu finden.\n",
" existing_record = session.query(BaseBase).filter_by(\n",
" provider_base=provider_base_val,\n",
" providercode_base=csv_id\n",
" ).first()\n",
" \n",
" # Prüft, ob bereits ein Datensatz mit dieser Kombination existiert.\n",
" if existing_record:\n",
"\n",
" # Überspringt die Verarbeitung für diesen Datensatz, da er bereits existiert.\n",
" continue\n",
" \n",
" # Überprüft, ob der Netzwerk-String \"D1\" ist, und setzt network_val auf 1.\n",
" if network == \"D1\":\n",
" network_val = 1\n",
"\n",
" # Überprüft, ob der Netzwerk-String \"D2\" ist, und setzt network_val auf 2.\n",
" elif network == \"D2\":\n",
" network_val = 2\n",
"\n",
" # Überprüft, ob der Netzwerk-String \"O2\" ist, und setzt network_val auf 4.\n",
" elif network == \"O2\":\n",
" network_val = 4\n",
"\n",
" # Setzt network_val auf 0, falls keine der oben genannten Bedingungen zutrifft.\n",
" else:\n",
" network_val = 0\n",
"\n",
" # Setzt den Typ für alle neuen Datensätze standardmäßig auf 0.\n",
" type_val = 0\n",
"\n",
" # Holt das aktuelle Datum und die aktuelle Uhrzeit für die Felder created_base und updated_base.\n",
" now = datetime.datetime.now()\n",
"\n",
" # Erzeugt ein neues BaseBase-Objekt mit den aus der CSV-Datei ausgelesenen und verarbeiteten Werten.\n",
" new_record = BaseBase(\n",
" provider_base=provider_base_val,\n",
" providercode_base=csv_id,\n",
" basegroup_base=1,\n",
" name_base=name,\n",
" network_base=network_val,\n",
" type_base=type_val,\n",
" created_base=now,\n",
" updated_base=now\n",
" )\n",
"\n",
" # Hängt dieses neue Objekt an die aktuelle Session an, damit es später in die Datenbank geschrieben wird.\n",
" session.add(new_record)\n",
"\n",
"# Überträgt alle gesammelten Änderungen an die Datenbank.\n",
"session.commit()\n",
"\n",
"# Schließt die offene Session, sodass keine weiteren Datenbankzugriffe mehr stattfinden.\n",
"session.close()\n",
"\n",
"# Gibt zum Abschluss eine kurze Meldung aus.\n",
"print(\"Done\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d6387255-71e0-40b4-8579-674320efc4db",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "001e79bd-8dff-4753-8754-6ec3101784dd",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "193fb1fb-6ad1-447e-b641-73857be9d9dd",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_base</th>\n",
" <th>provider_base</th>\n",
" <th>providercode_base</th>\n",
" <th>name_base</th>\n",
" <th>network_base</th>\n",
" <th>created_base</th>\n",
" <th>updated_base</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>Freenet | Cellway</td>\n",
" <td>3877325</td>\n",
" <td>Allnet Flat 20 GB Telekom (Okt 2024)</td>\n",
" <td>1</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>Freenet | Cellway</td>\n",
" <td>3877349</td>\n",
" <td>Allnet Flat 20 GB Telekom (Okt 2024) mit Smart...</td>\n",
" <td>1</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>Freenet | Cellway</td>\n",
" <td>3877337</td>\n",
" <td>Allnet Flat 20 GB Telekom (Okt 2024) mit Smart...</td>\n",
" <td>1</td>\n",
" <td>2025-04-16 14:09:50</td>\n",
" <td>2025-04-16 14:09:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>Freenet | Cellway</td>\n",
" <td>3878213</td>\n",
" <td>Allnet Flat 25 GB Telekom (Okt 2024)</td>\n",
" <td>1</td>\n",
" <td>2025-04-16 14:10:01</td>\n",
" <td>2025-04-16 14:10:01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>Freenet | Cellway</td>\n",
" <td>3878237</td>\n",
" <td>Allnet Flat 25 GB Telekom (Okt 2024) mit Smart...</td>\n",
" <td>1</td>\n",
" <td>2025-04-16 14:10:12</td>\n",
" <td>2025-04-16 14:10:12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>127</th>\n",
" <td>128</td>\n",
" <td>Freenet | Netzbetreiber</td>\n",
" <td>3782331</td>\n",
" <td>o2 Mobile Unlimited Smart (Jun 2024) mit Smart...</td>\n",
" <td>4</td>\n",
" <td>2025-04-16 14:25:58</td>\n",
" <td>2025-04-16 14:25:58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>128</th>\n",
" <td>129</td>\n",
" <td>Freenet | Netzbetreiber</td>\n",
" <td>3782328</td>\n",
" <td>o2 Mobile Unlimited Smart (Jun 2024) mit Smart...</td>\n",
" <td>4</td>\n",
" <td>2025-04-16 14:26:07</td>\n",
" <td>2025-04-16 14:26:07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>129</th>\n",
" <td>130</td>\n",
" <td>Freenet | Netzbetreiber</td>\n",
" <td>3973295</td>\n",
" <td>o2 Mobile XL (Nov 2024)</td>\n",
" <td>4</td>\n",
" <td>2025-04-16 14:26:13</td>\n",
" <td>2025-04-16 14:26:13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>130</th>\n",
" <td>131</td>\n",
" <td>Freenet | Netzbetreiber</td>\n",
" <td>3973301</td>\n",
" <td>o2 Mobile XL (Nov 2024) mit Smartphone 10</td>\n",
" <td>4</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>131</th>\n",
" <td>132</td>\n",
" <td>Freenet | Netzbetreiber</td>\n",
" <td>3973298</td>\n",
" <td>o2 Mobile XL (Nov 2024) mit Smartphone 5</td>\n",
" <td>4</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>132 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" id_base provider_base providercode_base \\\n",
"0 1 Freenet | Cellway 3877325 \n",
"1 2 Freenet | Cellway 3877349 \n",
"2 3 Freenet | Cellway 3877337 \n",
"3 4 Freenet | Cellway 3878213 \n",
"4 5 Freenet | Cellway 3878237 \n",
".. ... ... ... \n",
"127 128 Freenet | Netzbetreiber 3782331 \n",
"128 129 Freenet | Netzbetreiber 3782328 \n",
"129 130 Freenet | Netzbetreiber 3973295 \n",
"130 131 Freenet | Netzbetreiber 3973301 \n",
"131 132 Freenet | Netzbetreiber 3973298 \n",
"\n",
" name_base network_base \\\n",
"0 Allnet Flat 20 GB Telekom (Okt 2024) 1 \n",
"1 Allnet Flat 20 GB Telekom (Okt 2024) mit Smart... 1 \n",
"2 Allnet Flat 20 GB Telekom (Okt 2024) mit Smart... 1 \n",
"3 Allnet Flat 25 GB Telekom (Okt 2024) 1 \n",
"4 Allnet Flat 25 GB Telekom (Okt 2024) mit Smart... 1 \n",
".. ... ... \n",
"127 o2 Mobile Unlimited Smart (Jun 2024) mit Smart... 4 \n",
"128 o2 Mobile Unlimited Smart (Jun 2024) mit Smart... 4 \n",
"129 o2 Mobile XL (Nov 2024) 4 \n",
"130 o2 Mobile XL (Nov 2024) mit Smartphone 10 4 \n",
"131 o2 Mobile XL (Nov 2024) mit Smartphone 5 4 \n",
"\n",
" created_base updated_base \n",
"0 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"1 2025-04-16 14:09:40 2025-04-16 14:09:40 \n",
"2 2025-04-16 14:09:50 2025-04-16 14:09:50 \n",
"3 2025-04-16 14:10:01 2025-04-16 14:10:01 \n",
"4 2025-04-16 14:10:12 2025-04-16 14:10:12 \n",
".. ... ... \n",
"127 2025-04-16 14:25:58 2025-04-16 14:25:58 \n",
"128 2025-04-16 14:26:07 2025-04-16 14:26:07 \n",
"129 2025-04-16 14:26:13 2025-04-16 14:26:13 \n",
"130 2025-04-16 14:26:21 2025-04-16 14:26:21 \n",
"131 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"\n",
"[132 rows x 7 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_deal</th>\n",
" <th>base_deal</th>\n",
" <th>providercode_deal</th>\n",
" <th>name_deal</th>\n",
" <th>price_deal</th>\n",
" <th>starts_deal</th>\n",
" <th>stops_deal</th>\n",
" <th>created_deal</th>\n",
" <th>updated_deal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>25.20168</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>A3908081</td>\n",
" <td>170 EUR Sonderbonus</td>\n",
" <td>25.20168</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>A3908084</td>\n",
" <td>24 x 10 EUR Rabatt auf MGP, 0 EUR Vergütungsve...</td>\n",
" <td>25.20168</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>33.60504</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>A3908081</td>\n",
" <td>170 EUR Sonderbonus</td>\n",
" <td>33.60504</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" <td>2025-04-16 14:09:40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>275</th>\n",
" <td>276</td>\n",
" <td>130</td>\n",
" <td>A3990011</td>\n",
" <td>210 EUR Sonderbonus</td>\n",
" <td>42.00840</td>\n",
" <td>2025-04-16 14:26:13</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:13</td>\n",
" <td>2025-04-16 14:26:13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276</th>\n",
" <td>277</td>\n",
" <td>131</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>50.41176</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>277</th>\n",
" <td>278</td>\n",
" <td>131</td>\n",
" <td>A3990011</td>\n",
" <td>210 EUR Sonderbonus</td>\n",
" <td>50.41176</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" <td>2025-04-16 14:26:21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>278</th>\n",
" <td>279</td>\n",
" <td>132</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>46.21008</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>279</th>\n",
" <td>280</td>\n",
" <td>132</td>\n",
" <td>A3990011</td>\n",
" <td>210 EUR Sonderbonus</td>\n",
" <td>46.21008</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>280 rows × 9 columns</p>\n",
"</div>"
],
"text/plain": [
" id_deal base_deal providercode_deal \\\n",
"0 1 1 \n",
"1 2 1 A3908081 \n",
"2 3 1 A3908084 \n",
"3 4 2 \n",
"4 5 2 A3908081 \n",
".. ... ... ... \n",
"275 276 130 A3990011 \n",
"276 277 131 \n",
"277 278 131 A3990011 \n",
"278 279 132 \n",
"279 280 132 A3990011 \n",
"\n",
" name_deal price_deal \\\n",
"0 25.20168 \n",
"1 170 EUR Sonderbonus 25.20168 \n",
"2 24 x 10 EUR Rabatt auf MGP, 0 EUR Vergütungsve... 25.20168 \n",
"3 33.60504 \n",
"4 170 EUR Sonderbonus 33.60504 \n",
".. ... ... \n",
"275 210 EUR Sonderbonus 42.00840 \n",
"276 50.41176 \n",
"277 210 EUR Sonderbonus 50.41176 \n",
"278 46.21008 \n",
"279 210 EUR Sonderbonus 46.21008 \n",
"\n",
" starts_deal stops_deal created_deal updated_deal \n",
"0 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"1 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"2 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"3 2025-04-16 14:09:40 None 2025-04-16 14:09:40 2025-04-16 14:09:40 \n",
"4 2025-04-16 14:09:40 None 2025-04-16 14:09:40 2025-04-16 14:09:40 \n",
".. ... ... ... ... \n",
"275 2025-04-16 14:26:13 None 2025-04-16 14:26:13 2025-04-16 14:26:13 \n",
"276 2025-04-16 14:26:21 None 2025-04-16 14:26:21 2025-04-16 14:26:21 \n",
"277 2025-04-16 14:26:21 None 2025-04-16 14:26:21 2025-04-16 14:26:21 \n",
"278 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"279 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"\n",
"[280 rows x 9 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_opti</th>\n",
" <th>base_opti</th>\n",
" <th>providercode_opti</th>\n",
" <th>providercategory_opti</th>\n",
" <th>name_opti</th>\n",
" <th>price_opti</th>\n",
" <th>starts_opti</th>\n",
" <th>stops_opti</th>\n",
" <th>created_opti</th>\n",
" <th>updated_opti</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>O3120756</td>\n",
" <td>G3120771</td>\n",
" <td>Aktionsguthaben VP | 120 EUR Aktionsguthaben V...</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>O3132971</td>\n",
" <td>G3120771</td>\n",
" <td>Aktionsguthaben VP | 60 EUR Aktionsguthaben VP...</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>O3132980</td>\n",
" <td>G3120771</td>\n",
" <td>Aktionsguthaben VP | 192 EUR Aktionsguthaben V...</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>O1176</td>\n",
" <td>G18</td>\n",
" <td>Kein EVN | EVN vollständig</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>O1943</td>\n",
" <td>G60</td>\n",
" <td>T-Mobile@home / EUR 4,95 monatlich | Hausnummer</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" <td>2025-04-16 14:09:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4621</th>\n",
" <td>4622</td>\n",
" <td>132</td>\n",
" <td>O3501311</td>\n",
" <td>G3559799</td>\n",
" <td>Cashback Fachhandel | VP: 60 Euro Cashback</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4622</th>\n",
" <td>4623</td>\n",
" <td>132</td>\n",
" <td>G3559799</td>\n",
" <td>G179</td>\n",
" <td>Vertriebspartneraktionen | Cashback Fachhandel</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4623</th>\n",
" <td>4624</td>\n",
" <td>132</td>\n",
" <td>G3120771</td>\n",
" <td>G179</td>\n",
" <td>Vertriebspartneraktionen | Aktionsguthaben VP</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4624</th>\n",
" <td>4625</td>\n",
" <td>132</td>\n",
" <td>O3132977</td>\n",
" <td>G3120771</td>\n",
" <td>Aktionsguthaben VP | 168 EUR Aktionsguthaben V...</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4625</th>\n",
" <td>4626</td>\n",
" <td>132</td>\n",
" <td>O3120740</td>\n",
" <td>G3120771</td>\n",
" <td>Aktionsguthaben VP | 24 EUR Aktionsguthaben VP...</td>\n",
" <td>0.00000</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>None</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" <td>2025-04-16 14:26:22</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4626 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" id_opti base_opti providercode_opti providercategory_opti \\\n",
"0 1 1 O3120756 G3120771 \n",
"1 2 1 O3132971 G3120771 \n",
"2 3 1 O3132980 G3120771 \n",
"3 4 1 O1176 G18 \n",
"4 5 1 O1943 G60 \n",
"... ... ... ... ... \n",
"4621 4622 132 O3501311 G3559799 \n",
"4622 4623 132 G3559799 G179 \n",
"4623 4624 132 G3120771 G179 \n",
"4624 4625 132 O3132977 G3120771 \n",
"4625 4626 132 O3120740 G3120771 \n",
"\n",
" name_opti price_opti \\\n",
"0 Aktionsguthaben VP | 120 EUR Aktionsguthaben V... 0.00000 \n",
"1 Aktionsguthaben VP | 60 EUR Aktionsguthaben VP... 0.00000 \n",
"2 Aktionsguthaben VP | 192 EUR Aktionsguthaben V... 0.00000 \n",
"3 Kein EVN | EVN vollständig 0.00000 \n",
"4 T-Mobile@home / EUR 4,95 monatlich | Hausnummer 0.00000 \n",
"... ... ... \n",
"4621 Cashback Fachhandel | VP: 60 Euro Cashback 0.00000 \n",
"4622 Vertriebspartneraktionen | Cashback Fachhandel 0.00000 \n",
"4623 Vertriebspartneraktionen | Aktionsguthaben VP 0.00000 \n",
"4624 Aktionsguthaben VP | 168 EUR Aktionsguthaben V... 0.00000 \n",
"4625 Aktionsguthaben VP | 24 EUR Aktionsguthaben VP... 0.00000 \n",
"\n",
" starts_opti stops_opti created_opti updated_opti \n",
"0 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"1 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"2 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"3 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"4 2025-04-16 14:09:28 None 2025-04-16 14:09:28 2025-04-16 14:09:28 \n",
"... ... ... ... ... \n",
"4621 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"4622 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"4623 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"4624 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"4625 2025-04-16 14:26:22 None 2025-04-16 14:26:22 2025-04-16 14:26:22 \n",
"\n",
"[4626 rows x 10 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# -*- coding: utf-8 -*-\n",
"\n",
"# Fügt das übergeordnete Verzeichnis zum Python-Pfad hinzu, um Modulimporte zu ermöglichen.\n",
"import sys; sys.path.append(\"..\")\n",
"\n",
"# Importiert das Modul zur Interaktion mit dem Betriebssystem, z.B. für Pfadoperationen.\n",
"import os\n",
"# Importiert das Modul zur Verarbeitung von CSV-Dateien.\n",
"import csv\n",
"# Importiert das Modul zur Handhabung von Datum und Zeit.\n",
"import datetime\n",
"# Importiert die Pandas-Bibliothek für Datenanalyse und -manipulation, insbesondere DataFrames.\n",
"import pandas as pd\n",
"# Importiert die Klasse Decimal für präzise Dezimalarithmetik bei Preisangaben.\n",
"from decimal import Decimal\n",
"\n",
"# Importiert den benutzerdefinierten Manager zur Verwaltung von MySQL-Datenbankverbindungen.\n",
"from manager.MysqlManager import MysqlManager\n",
"# Importiert die Basisklasse für SQLAlchemy-Modelle (Teil der Datenbankinteraktion).\n",
"from models._system import Base\n",
"# Importiert das Datenmodell für die Tabelle 'base_base'.\n",
"from models.base_base import BaseBase\n",
"# Importiert das Datenmodell für die Tabelle 'deal_deal'.\n",
"from models.deal_deal import DealDeal\n",
"# Importiert das Datenmodell für die Tabelle 'option_opti'.\n",
"from models.option_opti import OptionOpti\n",
"\n",
"# Konstruiert den Dateipfad zur CSV-Datei, die die Tarifplandaten enthält.\n",
"csvFilePath = os.path.join('..', 'cache', 'plans.csv')\n",
"\n",
"# Konstruiert den Dateipfad zur CSV-Datei, die die Kampagnendaten enthält.\n",
"csvFileCampaigns = os.path.join('..', 'cache', 'campaigns.csv')\n",
"\n",
"# Konstruiert den Dateipfad zur CSV-Datei, die die Optionsdaten enthält.\n",
"csvFileOptions = os.path.join('..', 'cache', 'options.csv')\n",
"\n",
"# Konstruiert den Dateipfad zur CSV-Datei, die die Kategoriedaten enthält.\n",
"csvFileCategories = os.path.join('..', 'cache', 'categorys.csv')\n",
"\n",
"# Erstellt eine Instanz des MysqlManagers, um eine Verbindung zur Datenbank herzustellen.\n",
"mysqlManager = MysqlManager()\n",
"\n",
"# Ruft eine neue Datenbank-Session vom MysqlManager ab.\n",
"session = mysqlManager.getSession()\n",
"\n",
"# Initialisiert eine leere Liste zur Speicherung der IDs neu erstellter Einträge in 'base_base'.\n",
"newBaseIds = []\n",
"# Initialisiert eine leere Liste zur Speicherung der IDs neu erstellter Einträge in 'deal_deal'.\n",
"newDealIds = []\n",
"# Initialisiert eine leere Liste zur Speicherung der IDs neu erstellter Einträge in 'option_opti'.\n",
"newOptionIds = []\n",
"\n",
"# Erstellt ein leeres Wörterbuch (Dictionary), um Kategorie-IDs auf ihre Namen abzubilden.\n",
"categoryMap = {}\n",
"\n",
"# Öffnet die CSV-Datei mit den Kategoriedaten im Lesemodus mit UTF-8-Kodierung.\n",
"with open(csvFileCategories, newline='', encoding='utf-8') as csvCat:\n",
" # Erstellt einen CSV-DictReader, der jede Zeile als Wörterbuch liest, getrennt durch Semikolon.\n",
" csvReaderCat = csv.DictReader(csvCat, delimiter=';')\n",
"\n",
" # Iteriert durch jede Zeile (als Wörterbuch repräsentiert) in der Kategorien-CSV-Datei.\n",
" for catRow in csvReaderCat:\n",
"\n",
" # Extrahiert die Kategorie-ID aus der Spalte 'id', entfernt führende/nachfolgende Leerzeichen und weist sie 'catId' zu.\n",
" catId = catRow.get('id', '').strip()\n",
" # Extrahiert den Kategorienamen aus der Spalte 'name', entfernt Leerzeichen und weist ihn 'catName' zu.\n",
" catName = catRow.get('name', '').strip()\n",
"\n",
" # Speichert den Kategorienamen im 'categoryMap' mit der Kategorie-ID als Schlüssel.\n",
" categoryMap[catId] = catName\n",
"\n",
"# Öffnet die CSV-Datei mit den Tarifplandaten im Lesemodus mit UTF-8-Kodierung.\n",
"with open(csvFilePath, newline='', encoding='utf-8') as csvFile:\n",
" # Erstellt einen CSV-DictReader für die Tarifplandatei.\n",
" csvReader = csv.DictReader(csvFile, delimiter=';')\n",
"\n",
" # Iteriert durch jede Zeile (Tarifplan) in der CSV-Datei.\n",
" for row in csvReader:\n",
"\n",
" # Extrahiert die Plan-ID aus der Spalte 'id' und entfernt Leerzeichen.\n",
" csvId = row.get('id', '').strip()\n",
" # Extrahiert den Provider (Tarifwelt) aus der Spalte 'provider' und entfernt Leerzeichen.\n",
" provider = row.get('provider', '').strip()\n",
" # Extrahiert das Netzwerk aus der Spalte 'network' und entfernt Leerzeichen.\n",
" network = row.get('network', '').strip()\n",
" # Extrahiert den Plannamen aus der Spalte 'name' und entfernt Leerzeichen.\n",
" planName = row.get('name', '').strip()\n",
" # Extrahiert den Planpreis als String aus der Spalte 'price' und entfernt Leerzeichen.\n",
" planPriceStr = row.get('price', '').strip()\n",
"\n",
" # Kombiniert den festen String \"Freenet | \" mit dem extrahierten Providernamen.\n",
" providerBaseVal = \"Freenet | \" + provider\n",
"\n",
" # Sucht in der Datenbanktabelle 'base_base' nach einem vorhandenen Eintrag, der mit dem Provider und der Plan-ID übereinstimmt.\n",
" existingBase = session.query(BaseBase).filter_by(\n",
" provider_base=providerBaseVal,\n",
" providercode_base=csvId\n",
" ).first()\n",
"\n",
" # Ermittelt den numerischen Wert für das Netzwerk basierend auf dem extrahierten String.\n",
" # Wenn das Netzwerk 'D1' ist.\n",
" if network == \"D1\":\n",
" # Setzt den Netzwerk-Wert auf 1.\n",
" networkVal = 1\n",
" # Wenn das Netzwerk 'D2' ist.\n",
" elif network == \"D2\":\n",
" # Setzt den Netzwerk-Wert auf 2.\n",
" networkVal = 2\n",
" # Wenn das Netzwerk 'O2' ist.\n",
" elif network == \"O2\":\n",
" # Setzt den Netzwerk-Wert auf 4.\n",
" networkVal = 4\n",
" # Für alle anderen oder unbekannten Netzwerke.\n",
" else:\n",
" # Setzt den Netzwerk-Wert auf 0.\n",
" networkVal = 0\n",
"\n",
" # Ermittelt den aktuellen Zeitstempel (Datum und Uhrzeit).\n",
" currentTime = datetime.datetime.now()\n",
"\n",
" # Prüft, ob bereits ein passender Eintrag in 'base_base' gefunden wurde.\n",
" if existingBase:\n",
" # Verwendet den gefundenen Datenbankeintrag für spätere Referenzen.\n",
" baseRecord = existingBase\n",
" # Wenn kein passender Eintrag gefunden wurde.\n",
" else:\n",
"\n",
" # Erstellt ein neues BaseBase-Objekt (neuer Datenbankeintrag) mit den Daten aus der CSV.\n",
" baseRecord = BaseBase(\n",
" provider_base=providerBaseVal, # Zusammengesetzter Providername\n",
" providercode_base=csvId, # Plan-ID aus CSV\n",
" basegroup_base=1, # Fester Gruppenwert\n",
" name_base=planName, # Planname aus CSV\n",
" network_base=networkVal, # Ermittelter Netzwerk-Wert\n",
" type_base=0, # Fester Typwert\n",
" created_base=currentTime, # Zeitstempel der Erstellung\n",
" updated_base=currentTime # Zeitstempel der letzten Aktualisierung\n",
" )\n",
" # Fügt das neue Objekt zur Datenbank-Session hinzu.\n",
" session.add(baseRecord)\n",
" # Schreibt die Änderungen (neuer Eintrag) in die Datenbank.\n",
" session.commit()\n",
"\n",
" # Fügt die ID des neu erstellten Base-Eintrags zur Liste 'newBaseIds' hinzu.\n",
" newBaseIds.append(baseRecord.id_base)\n",
"\n",
" # Definiert eine verschachtelte Funktion zum Erstellen oder Aktualisieren von Deal-Einträgen für den aktuellen Base-Eintrag.\n",
" def upsertDeal(providerCodeDeal, dealName=\"\"):\n",
"\n",
" # Sucht in der Datenbanktabelle 'deal_deal' nach einem vorhandenen Deal, der zum aktuellen Base-Eintrag und dem Deal-Providercode passt.\n",
" existingDeal = session.query(DealDeal).filter_by(\n",
" base_deal=baseRecord.id_base, # Verknüpfung zum Base-Eintrag\n",
" providercode_deal=providerCodeDeal # Eindeutiger Code des Deals (kann leer sein)\n",
" ).first()\n",
"\n",
" # Prüft, ob bereits ein passender Deal existiert.\n",
" if existingDeal:\n",
" # Wenn ja, sind keine weiteren Aktionen für diesen Deal nötig.\n",
" pass\n",
" # Wenn kein passender Deal existiert.\n",
" else:\n",
"\n",
" # Erstellt ein neues DealDeal-Objekt mit den Daten des Deals.\n",
" newDeal = DealDeal(\n",
" provisiongroup_deal=1, # Fester Gruppenwert\n",
" base_deal=baseRecord.id_base, # Verknüpfung zum Base-Eintrag\n",
" providercode_deal=providerCodeDeal,# Providercode des Deals\n",
" name_deal=dealName, # Name des Deals (Kampagnenname oder leer)\n",
" # Konvertiert den Planpreis-String in Decimal, oder setzt 0.00 falls leer.\n",
" price_deal=Decimal(planPriceStr) if planPriceStr else Decimal(\"0.00\"),\n",
" starts_deal=currentTime, # Startzeitpunkt des Deals\n",
" stops_deal=None, # Endzeitpunkt (offen)\n",
" created_deal=currentTime, # Zeitstempel der Erstellung\n",
" updated_deal=currentTime # Zeitstempel der letzten Aktualisierung\n",
" )\n",
" # Fügt das neue Deal-Objekt zur Datenbank-Session hinzu.\n",
" session.add(newDeal)\n",
" # Schreibt den neuen Deal in die Datenbank.\n",
" session.commit()\n",
" # Fügt die ID des neuen Deals zur Liste 'newDealIds' hinzu.\n",
" newDealIds.append(newDeal.id_deal)\n",
"\n",
" # Ruft die Funktion `upsertDeal` auf, um einen Basis-Deal ohne spezifischen Providercode oder Namen anzulegen (Standard-Deal).\n",
" upsertDeal(\"\")\n",
"\n",
" # Öffnet die CSV-Datei mit den Kampagnendaten im Lesemodus mit UTF-8-Kodierung.\n",
" with open(csvFileCampaigns, newline='', encoding='utf-8') as csvFile2:\n",
" # Erstellt einen CSV-DictReader für die Kampagnendatei.\n",
" csvReader2 = csv.DictReader(csvFile2, delimiter=';')\n",
"\n",
" # Iteriert durch jede Zeile (Kampagne) in der Kampagnen-CSV-Datei.\n",
" for row2 in csvReader2:\n",
"\n",
" # Extrahiert die Kampagnen-ID und entfernt Leerzeichen.\n",
" campaignId = row2.get('id', '').strip()\n",
" # Extrahiert die zugehörige Plan-ID und entfernt Leerzeichen.\n",
" campaignPlan = row2.get('plan', '').strip()\n",
" # Extrahiert den Kampagnennamen und entfernt Leerzeichen.\n",
" campaignName = row2.get('name', '').strip()\n",
"\n",
" # Prüft, ob die Plan-ID der Kampagne mit der ID des aktuellen Tarifs übereinstimmt.\n",
" if campaignPlan == csvId:\n",
"\n",
" # Ruft `upsertDeal` auf, um einen spezifischen Deal für diese Kampagne anzulegen.\n",
" # Der Providercode wird mit \"A\" präfixiert, der Kampagnenname wird übergeben.\n",
" upsertDeal(\"A\" + campaignId, campaignName)\n",
"\n",
" # Definiert eine verschachtelte Funktion zum Erstellen oder Aktualisieren von Options-Einträgen für den aktuellen Base-Eintrag.\n",
" def upsertOption(providerCodeOpti, categoryOpti, optionName, optionPriceStr):\n",
"\n",
" # Sucht in der Datenbanktabelle 'option_opti' nach einer vorhandenen Option, die zum aktuellen Base-Eintrag und Options-Providercode passt.\n",
" existingOpti = session.query(OptionOpti).filter_by(\n",
" base_opti=baseRecord.id_base, # Verknüpfung zum Base-Eintrag\n",
" providercode_opti=providerCodeOpti # Eindeutiger Code der Option\n",
" ).first()\n",
"\n",
" # Prüft, ob bereits eine passende Option existiert.\n",
" if existingOpti:\n",
" # Wenn ja, sind keine weiteren Aktionen nötig.\n",
" pass\n",
" # Wenn keine passende Option existiert.\n",
" else:\n",
"\n",
" # Holt den vollständigen Kategorienamen aus dem zuvor erstellten 'categoryMap' anhand der Kategorie-ID.\n",
" # Falls die ID nicht gefunden wird, wird \"Unbekannt\" als Standard verwendet.\n",
" categoryFullName = categoryMap.get(categoryOpti, \"Unbekannt\")\n",
" # Kombiniert den Kategorienamen und den Optionsnamen zu einem vollständigen Namen.\n",
" fullName = categoryFullName + \" | \" + optionName\n",
"\n",
" # Erstellt ein neues OptionOpti-Objekt mit den Daten der Option.\n",
" newOpti = OptionOpti(\n",
" provisiongroup_opti=1, # Fester Gruppenwert\n",
" base_opti=baseRecord.id_base, # Verknüpfung zum Base-Eintrag\n",
" providercode_opti=providerCodeOpti, # Providercode der Option\n",
" providercategory_opti=categoryOpti, # Provider-Kategorie-ID\n",
" name_opti=fullName, # Zusammengesetzter Name\n",
" alias_opti=None, # Alias (nicht verwendet)\n",
" # Konvertiert den Optionspreis-String in Decimal, oder setzt 0.00 falls leer.\n",
" price_opti=Decimal(optionPriceStr) if optionPriceStr else Decimal(\"0.00\"),\n",
" starts_opti=currentTime, # Startzeitpunkt der Option\n",
" stops_opti=None, # Endzeitpunkt (offen)\n",
" provision1_opti=Decimal(\"0.00000\"), # Provisionsfelder (Standardwert)\n",
" provision2_opti=Decimal(\"0.00000\"),\n",
" provision3_opti=Decimal(\"0.00000\"),\n",
" provision4_opti=Decimal(\"0.00000\"),\n",
" created_opti=currentTime, # Zeitstempel der Erstellung\n",
" updated_opti=currentTime # Zeitstempel der letzten Aktualisierung\n",
" )\n",
" # Fügt das neue Option-Objekt zur Datenbank-Session hinzu.\n",
" session.add(newOpti)\n",
" # Schreibt die neue Option in die Datenbank.\n",
" session.commit()\n",
" # Fügt die ID der neuen Option zur Liste 'newOptionIds' hinzu.\n",
" newOptionIds.append(newOpti.id_opti)\n",
"\n",
" # Öffnet die CSV-Datei mit den Optionsdaten im Lesemodus mit UTF-8-Kodierung.\n",
" with open(csvFileOptions, newline='', encoding='utf-8') as csvFileOpt:\n",
" # Erstellt einen CSV-DictReader für die Optionsdatei.\n",
" csvReaderOpt = csv.DictReader(csvFileOpt, delimiter=';')\n",
"\n",
" # Iteriert durch jede Zeile (Option) in der Options-CSV-Datei.\n",
" for rowOpt in csvReaderOpt:\n",
"\n",
" # Extrahiert die Options-ID und entfernt Leerzeichen.\n",
" optId = rowOpt.get('id', '').strip()\n",
" # Extrahiert die zugehörige Plan-ID und entfernt Leerzeichen.\n",
" optPlan = rowOpt.get('plan', '').strip()\n",
" # Extrahiert die zugehörige Kategorie-ID und entfernt Leerzeichen.\n",
" optCategory = rowOpt.get('category', '').strip()\n",
" # Extrahiert den Optionsnamen und entfernt Leerzeichen.\n",
" optName = rowOpt.get('name', '').strip()\n",
" # Extrahiert den Optionspreis als String und entfernt Leerzeichen.\n",
" optPriceStr = rowOpt.get('price', '').strip()\n",
"\n",
" # Prüft, ob die Plan-ID der Option mit der ID des aktuellen Tarifs übereinstimmt.\n",
" if optPlan == csvId:\n",
"\n",
" # Ruft `upsertOption` auf, um die Option für den aktuellen Tarif in der Datenbank anzulegen oder zu prüfen.\n",
" upsertOption(optId, optCategory, optName, optPriceStr)\n",
"\n",
"# Initialisiert eine leere Liste für die neu angelegten Base-Datensätze.\n",
"newBases = []\n",
"# Prüft, ob IDs für neue Base-Einträge gesammelt wurden.\n",
"if newBaseIds:\n",
" # Frägt die Datenbank ab, um die vollständigen Datensätze für die neuen Base-IDs zu erhalten.\n",
" newBases = session.query(BaseBase).filter(BaseBase.id_base.in_(newBaseIds)).all()\n",
"\n",
"# Initialisiert eine leere Liste für die neu angelegten Deal-Datensätze.\n",
"newDeals = []\n",
"# Prüft, ob IDs für neue Deal-Einträge gesammelt wurden.\n",
"if newDealIds:\n",
" # Frägt die Datenbank ab, um die vollständigen Datensätze für die neuen Deal-IDs zu erhalten.\n",
" newDeals = session.query(DealDeal).filter(DealDeal.id_deal.in_(newDealIds)).all()\n",
"\n",
"# Initialisiert eine leere Liste für die neu angelegten Options-Datensätze.\n",
"newOptions = []\n",
"# Prüft, ob IDs für neue Options-Einträge gesammelt wurden.\n",
"if newOptionIds:\n",
" # Frägt die Datenbank ab, um die vollständigen Datensätze für die neuen Options-IDs zu erhalten.\n",
" newOptions = session.query(OptionOpti).filter(OptionOpti.id_opti.in_(newOptionIds)).all()\n",
"\n",
"# Bereitet eine Liste von Wörterbüchern für die Erstellung des Base-DataFrames vor.\n",
"# Jedes Wörterbuch repräsentiert eine Zeile mit ausgewählten Spalten des Base-Objekts.\n",
"baseData = [{\n",
" 'id_base': b.id_base,\n",
" 'provider_base': b.provider_base,\n",
" 'providercode_base': b.providercode_base,\n",
" 'name_base': b.name_base,\n",
" 'network_base': b.network_base,\n",
" 'created_base': b.created_base,\n",
" 'updated_base': b.updated_base\n",
"} for b in newBases] # List Comprehension iteriert durch die Liste der neuen Base-Objekte.\n",
"\n",
"# Bereitet eine Liste von Wörterbüchern für die Erstellung des Deal-DataFrames vor.\n",
"# Jedes Wörterbuch repräsentiert eine Zeile mit ausgewählten Spalten des Deal-Objekts.\n",
"dealData = [{\n",
" 'id_deal': d.id_deal,\n",
" 'base_deal': d.base_deal,\n",
" 'providercode_deal': d.providercode_deal,\n",
" 'name_deal': d.name_deal,\n",
" 'price_deal': d.price_deal,\n",
" 'starts_deal': d.starts_deal,\n",
" 'stops_deal': d.stops_deal,\n",
" 'created_deal': d.created_deal,\n",
" 'updated_deal': d.updated_deal\n",
"} for d in newDeals] # List Comprehension iteriert durch die Liste der neuen Deal-Objekte.\n",
"\n",
"# Bereitet eine Liste von Wörterbüchern für die Erstellung des Options-DataFrames vor.\n",
"# Jedes Wörterbuch repräsentiert eine Zeile mit ausgewählten Spalten des Option-Objekts.\n",
"optiData = [{\n",
" 'id_opti': o.id_opti,\n",
" 'base_opti': o.base_opti,\n",
" 'providercode_opti': o.providercode_opti,\n",
" 'providercategory_opti': o.providercategory_opti,\n",
" 'name_opti': o.name_opti,\n",
" 'price_opti': o.price_opti,\n",
" 'starts_opti': o.starts_opti,\n",
" 'stops_opti': o.stops_opti,\n",
" 'created_opti': o.created_opti,\n",
" 'updated_opti': o.updated_opti\n",
"} for o in newOptions] # List Comprehension iteriert durch die Liste der neuen Option-Objekte.\n",
"\n",
"# Erstellt ein Pandas DataFrame aus der Liste der Base-Daten.\n",
"dfBase = pd.DataFrame(baseData)\n",
"\n",
"# Erstellt ein Pandas DataFrame aus der Liste der Deal-Daten.\n",
"dfDeal = pd.DataFrame(dealData)\n",
"\n",
"# Erstellt ein Pandas DataFrame aus der Liste der Options-Daten.\n",
"dfOpti = pd.DataFrame(optiData)\n",
"\n",
"# Gibt das DataFrame mit den neu angelegten Base-Einträgen aus (typischerweise in Jupyter Notebooks oder ähnlichen Umgebungen sichtbar).\n",
"display(dfBase)\n",
"\n",
"# Gibt das DataFrame mit den neu angelegten Deal-Einträgen aus.\n",
"display(dfDeal)\n",
"\n",
"# Gibt das DataFrame mit den neu angelegten Options-Einträgen aus.\n",
"display(dfOpti)\n",
"\n",
"# Schließt die Datenbank-Session, um die Verbindung freizugeben.\n",
"session.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d6387255-71e0-40b4-8579-674320efc4db",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "001e79bd-8dff-4753-8754-6ec3101784dd",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
**Aufgabe:**
Du bist eine hochpräzise API zur Extraktion spezifischer Mobilfunktarif-Merkmale aus Dokumentenpaaren. Deine Eingabe besteht immer aus zwei PDF-Dateien: einem **Produktdetailblatt/Flyer** und einem **Produktinformationsblatt (PIB)**, die gemeinsam *einen* spezifischen Tarif beschreiben.
Deine Aufgabe ist es, beide Dokumente sorgfältig und vergleichend zu analysieren, um die unten definierten **relevanten Tarifbestandteile** mit höchstmöglicher Genauigkeit zu extrahieren. Das Ergebnis **muss ausschließlich** ein einzelnes JSON-Objekt sein, das exakt die vorgegebenen Schlüsselnamen und das flache Key-Value-Format verwendet. Ignoriere irrelevante Informationen wie Anbieteradressen, AGB-Verweise oder allgemeine Marketingtexte.
**Extraktionsanweisungen und Felddefinitionen:**
1. **`tariff_name` (String):** Extrahiere den vollständigen, exakten Namen des Tarifs.
2. **`marketing_start_date` (String oder null):** Extrahiere das Vermarktungsdatum (aus PIB). Formatiere als `JJJJ-MM-TT` oder `null`.
3. **`network_operator` (String oder null):** Identifiziere den Netzbetreiber (z.B. "Telekom", "Vodafone", "O2").
4. **`network_technology` (String oder null):** Identifiziere die primär beworbene/höchste Netztechnologie (z.B. "5G", "LTE").
5. **`is_data_only_tariff` (Boolean):** Ermittle präzise, ob es ein reiner Datentarif ist (`true`/`false`). Ein Kriterium ist, wenn Telefonie nicht als Flat inkludiert ist oder explizit als "nicht möglich" gilt. Achte darauf, Tarife mit "Data" im Namen, die dennoch Telefonie/SMS-Flats haben könnten, nicht fälschlicherweise als reine Datentarife zu klassifizieren. Prüfe die Inklusivleistungen und Preise sorgfältig.
6. **`inclusive_internet_flat` (Boolean oder null):** Prüfe auf explizite Nennung einer Internet-Flat (`true`/`false`).
7. **`inclusive_telephony_flat` (Boolean oder null):** Prüfe auf explizite Nennung einer Telefonie-Flat oder Preis pro Minute von 0,00 € (`true`/`false`). Bei `is_data_only_tariff: true` setze auf `false`.
8. **`telephony_price_per_minute_eur_brutto` (Number oder null):** Wenn `inclusive_telephony_flat: false` und Telefonie möglich ist, extrahiere den Brutto-Preis pro Minute. Sonst `0.0` (bei Flat) oder `null` (wenn nicht möglich/gefunden).
9. **`telephony_price_per_minute_eur_netto` (Number oder null):** Wenn `telephony_price_per_minute_eur_brutto` ein Wert größer als 0 ist, berechne den Nettopreis (Bruttopreis / 1.19). Sonst `0.0` (bei Flat) oder `null`. Runde auf 4 Nachkommastellen.
10. **`inclusive_sms_flat` (Boolean oder null):** Prüfe auf explizite Nennung einer SMS-Flat oder Preis pro SMS von 0,00 € (`true`/`false`).
11. **`sms_price_per_unit_eur_brutto` (Number oder null):** Wenn `inclusive_sms_flat: false`, extrahiere den Brutto-Preis pro SMS. Sonst `0.0` (bei Flat) oder `null` (wenn nicht gefunden).
12. **`sms_price_per_unit_eur_netto` (Number oder null):** Wenn `sms_price_per_unit_eur_brutto` ein Wert größer als 0 ist, berechne den Nettopreis (Bruttopreis / 1.19). Sonst `0.0` (bei Flat) oder `null`. Runde auf 4 Nachkommastellen.
13. **`inclusive_volte_wlan_call` (Boolean oder null):** Prüfe auf explizite Nennung von VoLTE/WLAN-Call. Setze `true`, wenn erwähnt und `is_data_only_tariff: false`. Sonst `false`.
14. **`data_volume_gb` (Number oder null):** Extrahiere das Datenvolumen in GB.
15. **`data_download_max_mbps` (Number oder null):** Extrahiere max. Download in Mbit/s.
16. **`data_upload_max_mbps` (Number oder null):** Extrahiere max. Upload in Mbit/s.
17. **`data_download_throttled_kbps` (Number oder null):** Extrahiere Drossel-Download in kbit/s.
18. **`data_upload_throttled_kbps` (Number oder null):** Extrahiere Drossel-Upload in kbit/s.
19. **`data_billing_increment_kb` (Number oder null):** Extrahiere Datentaktung in KB.
20. **`telephony_billing_increment_seconds` (String oder null):** Extrahiere Telefontaktung (z.B. "60/60"). Setze `null` bei Datentarifen.
21. **`pricing_connection_fee_eur_brutto` (Number oder null):** Extrahiere den einmaligen Anschlusspreis (Brutto).
22. **`pricing_connection_fee_eur_netto` (Number oder null):** Berechne den Netto-Anschlusspreis (Bruttopreis / 1.19), falls Brutto vorhanden. Runde auf 4 Nachkommastellen.
23. **`pricing_monthly_initial_eur_brutto` (Number oder null):** Extrahiere den monatlichen Bruttopreis (initiale Periode).
24. **`pricing_monthly_initial_eur_netto` (Number oder null):** Extrahiere den monatlichen Nettopreis (initiale Periode), falls explizit genannt (oft in Klammern). Falls nicht genannt, berechne ihn (Bruttopreis / 1.19). Runde auf 4 Nachkommastellen.
25. **`pricing_monthly_after_period_eur_brutto` (Number oder null):** Extrahiere den monatlichen Bruttopreis nach der initialen Periode.
26. **`pricing_monthly_after_period_eur_netto` (Number oder null):** Berechne den monatlichen Nettopreis nach der initialen Periode (Bruttopreis / 1.19). Runde auf 4 Nachkommastellen.
27. **`contract_min_duration_months` (Number oder null):** Extrahiere die Mindestlaufzeit in Monaten.
28. **`contract_cancellation_notice_period_months` (Number oder null):** Extrahiere die Kündigungsfrist als Zahl der Monate (z.B. `1` aus "1 Monat").
**Wichtige Hinweise:**
* Verwende `null` für Werte, die nicht zuverlässig extrahiert werden können.
* Stelle sicher, dass numerische Werte als Zahlen (Number) im JSON erscheinen.
* Runde berechnete Nettopreise auf 4 Nachkommastellen.
* Die Ausgabe darf **nur das JSON-Objekt** enthalten, ohne jeglichen erläuternden Text davor oder danach.
**Gewünschtes JSON-Ausgabeformat (zur Referenz):**
{
"tariff_name": "...",
"marketing_start_date": "...",
"network_operator": "...",
"network_technology": "...",
"is_data_only_tariff": ...,
"inclusive_internet_flat": ...,
"inclusive_telephony_flat": ...,
"telephony_price_per_minute_eur_brutto": ...,
"telephony_price_per_minute_eur_netto": ...,
"inclusive_sms_flat": ...,
"sms_price_per_unit_eur_brutto": ...,
"sms_price_per_unit_eur_netto": ...,
"inclusive_volte_wlan_call": ...,
"data_volume_gb": ...,
"data_download_max_mbps": ...,
"data_upload_max_mbps": ...,
"data_download_throttled_kbps": ...,
"data_upload_throttled_kbps": ...,
"data_billing_increment_kb": ...,
"telephony_billing_increment_seconds": "...",
"pricing_connection_fee_eur_brutto": ...,
"pricing_connection_fee_eur_netto": ...,
"pricing_monthly_initial_eur_brutto": ...,
"pricing_monthly_initial_eur_netto": ...,
"pricing_monthly_after_period_eur_brutto": ...,
"pricing_monthly_after_period_eur_netto": ...,
"contract_min_duration_months": ...,
"contract_cancellation_notice_period_months": ...
}
\ No newline at end of file
# Documentation # Documentation
## Base (base_base) ## Base (base_base)
In dieser Tabelle sind die grundlegenden Tarife gespeichert, die als Ausgangsbasis für das gesamte Datenbankschema dienen. Die hinterlegten Tarife bilden das Fundament, auf dem alle weiteren Strukturen aufbauen. In dieser Tabelle sind die grundlegenden Tarife gespeichert, die als Ausgangsbasis für das gesamte Datenbankschema dienen. Die hinterlegten Tarife bilden das Fundament, auf dem alle weiteren Strukturen aufbauen.
Beispielhafte Tarife: Beispielhafte Tarife:
``` ```
Green Allnet Flat Green Allnet Flat
Green Allnet Flat mit Handy 5 Green Allnet Flat mit Handy 5
...@@ -11,49 +13,75 @@ Green Allnet Flat mit Handy 10 ...@@ -11,49 +13,75 @@ Green Allnet Flat mit Handy 10
``` ```
### id_base ### id_base
Dieser Primärschlüssel identifiziert jeden Tarif eindeutig in der Tabelle. Dieser Primärschlüssel identifiziert jeden Tarif eindeutig in der Tabelle.
### basegroup_base ### basegroup_base
Dieses optionale Feld dient als Fremdschlüssel und verweist auf die Tabelle **Basegroup (basegroup_bgro)**, wodurch eine thematische Gruppierung der Tarife ermöglicht wird. Dieses optionale Feld dient als Fremdschlüssel und verweist auf die Tabelle **Basegroup (basegroup_bgro)**, wodurch eine thematische Gruppierung der Tarife ermöglicht wird.
### provider_base ### provider_base
Hier wird der Name des Providers gespeichert, beispielsweise "Freenet" oder "Klarmobil". Hier wird der Name des Providers gespeichert, beispielsweise "Freenet" oder "Klarmobil".
### providercode_base ### providercode_base
Ein optionales Feld, in dem ein zusätzlicher Provider-Code (Fremdschlüssel) hinterlegt werden kann. Ein optionales Feld, in dem ein zusätzlicher Provider-Code (Fremdschlüssel) hinterlegt werden kann.
### name_base ### name_base
Dieses Feld enthält den offiziellen Tarifnamen, wie er vom Provider vorgegeben wird. Dieses Feld enthält den offiziellen Tarifnamen, wie er vom Provider vorgegeben wird.
### alias_base ### alias_base
Hier kann ein alternativer Name definiert werden, der den offiziellen Tarifnamen ersetzt. Hier kann ein alternativer Name definiert werden, der den offiziellen Tarifnamen ersetzt.
### network_base ### network_base
In diesem Feld wird das verwendete Funknetz definiert. In diesem Feld wird das verwendete Funknetz definiert.
**Mögliche Werte:** **Mögliche Werte:**
- **1**: D1/Telekom - **1**: D1/Telekom
- **2**: D2/Vodafone - **2**: D2/Vodafone
- **4**: O2/Telefonica - **4**: O2/Telefonica
### type_base ### type_base
Dieses Feld legt den Tariftyp fest. Dieses Feld legt den Tariftyp fest.
**Mögliche Werte:** **Mögliche Werte:**
- **0**: Unbekannt - **0**: Unbekannt
- **1**: Voice - **1**: Voice
- **2**: Daten - **2**: Daten
### flyerurl_base
Dies ist die URL zum Tarifflyer.
### piburl_base
Dies ist die URL zum Produktinformationsblatt.
### details_base
Dies sind alle Tarifdetails die vom Provider vorgegeben werden (als JSON).
### created_base ### created_base
Der Zeitstempel, der angibt, wann der Datensatz erstellt wurde. Der Zeitstempel, der angibt, wann der Datensatz erstellt wurde.
### updated_base ### updated_base
Der Zeitstempel, an dem der Datensatz zuletzt aktualisiert wurde. Der Zeitstempel, an dem der Datensatz zuletzt aktualisiert wurde.
--- ---
## Basegroup (basegroup_bgro) ## Basegroup (basegroup_bgro)
Diese Tabelle fasst Tarife in Gruppen zusammen, um eine übersichtliche Struktur zu ermöglichen. Die Gruppierung hilft dabei, ähnliche Tarife gemeinsam zu verwalten. Diese Tabelle fasst Tarife in Gruppen zusammen, um eine übersichtliche Struktur zu ermöglichen. Die Gruppierung hilft dabei, ähnliche Tarife gemeinsam zu verwalten.
Beispielhafte Tarifgruppen: Beispielhafte Tarifgruppen:
``` ```
Red Allnet Flat Tarifgruppe Red Allnet Flat Tarifgruppe
Green Allnet Flat Tarifgruppe Green Allnet Flat Tarifgruppe
...@@ -61,117 +89,153 @@ Blue Allnet Flat Tarifgruppe ...@@ -61,117 +89,153 @@ Blue Allnet Flat Tarifgruppe
``` ```
### id_bgro ### id_bgro
Der Primärschlüssel der Tabelle, der jede Tarifgruppe eindeutig identifiziert. Der Primärschlüssel der Tabelle, der jede Tarifgruppe eindeutig identifiziert.
### name_bgro ### name_bgro
Hier wird der Name der Tarifgruppe festgelegt. Hier wird der Name der Tarifgruppe festgelegt.
### created_bgro ### created_bgro
Der Zeitpunkt, zu dem die Tarifgruppe erstellt wurde. Der Zeitpunkt, zu dem die Tarifgruppe erstellt wurde.
### updated_bgro ### updated_bgro
Der Zeitpunkt, zu dem die Tarifgruppe zuletzt aktualisiert wurde. Der Zeitpunkt, zu dem die Tarifgruppe zuletzt aktualisiert wurde.
--- ---
## Deal (deal_deal) ## Deal (deal_deal)
In dieser Tabelle werden zeitlich befristete Aktionen erfasst. Jede Aktion, jeder Deal verknüpft einen Basis-Tarif aus der Tabelle **Base (base_base)** mit einer Provisiongruppe und definiert spezielle Konditionen. In dieser Tabelle werden zeitlich befristete Aktionen erfasst. Jede Aktion, jeder Deal verknüpft einen Basis-Tarif aus der Tabelle **Base (base_base)** mit einer Provisiongruppe und definiert spezielle Konditionen.
### id_deal ### id_deal
Der Primärschlüssel der Tabelle, der jede Aktion eindeutig identifiziert. Der Primärschlüssel der Tabelle, der jede Aktion eindeutig identifiziert.
### base_deal ### base_deal
Dieses Feld ist ein Fremdschlüssel, der auf einen Tarif in der Tabelle **Base (base_base)** verweist. Dieses Feld ist ein Fremdschlüssel, der auf einen Tarif in der Tabelle **Base (base_base)** verweist.
### provisiongroup_deal ### provisiongroup_deal
Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird. Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird.
### providercode_deal ### providercode_deal
Ein optionales Feld, das einen zusätzlichen Provider-Code (Fremdschlüssel) speichern kann. Ein optionales Feld, das einen zusätzlichen Provider-Code (Fremdschlüssel) speichern kann.
### alias_deal ### alias_deal
Ein optionaler, alternativer Name des Deals. Ein optionaler, alternativer Name des Deals.
### price_deal ### price_deal
In diesem Feld wird der Preis des Deals als Dezimalwert festgehalten (Netto). In diesem Feld wird der Preis des Deals als Dezimalwert festgehalten (Netto).
### starts_deal ### starts_deal
Das Datum und die Uhrzeit, ab wann der Deal aktiv wird. Das Datum und die Uhrzeit, ab wann der Deal aktiv wird.
### stops_deal ### stops_deal
Ein optionales Datum und eine Uhrzeit, bis zu denen der Deal gültig ist. Ein optionales Datum und eine Uhrzeit, bis zu denen der Deal gültig ist.
### provision1_deal bis provision4_deal ### provision1_deal bis provision4_deal
Diese Felder enthalten verschiedene Provisionswerte für für die Aktion. Diese Felder enthalten verschiedene Provisionswerte für für die Aktion.
Alle Provisionen zusammengerechnet ergeben die Gesamtprovision. Alle Provisionen zusammengerechnet ergeben die Gesamtprovision.
### created_deal ### created_deal
Der Zeitpunkt, zu dem der Deal-Datensatz erstellt wurde. Der Zeitpunkt, zu dem der Deal-Datensatz erstellt wurde.
### updated_deal ### updated_deal
Der Zeitpunkt, zu dem der Deal zuletzt aktualisiert wurde. Der Zeitpunkt, zu dem der Deal zuletzt aktualisiert wurde.
--- ---
## Option (option_opti) ## Option (option_opti)
Diese Tabelle erfasst spezifische Optionen zu Tarifen, die zusätzliche Leistungen oder Konfigurationen darstellen. Optionen ergänzen die Basistarife und ermöglichen erweiterte Angebotsvarianten. Diese Tabelle erfasst spezifische Optionen zu Tarifen, die zusätzliche Leistungen oder Konfigurationen darstellen. Optionen ergänzen die Basistarife und ermöglichen erweiterte Angebotsvarianten.
### id_opti ### id_opti
Der Primärschlüssel der Tabelle, der jede Option eindeutig identifiziert. Der Primärschlüssel der Tabelle, der jede Option eindeutig identifiziert.
### base_opti ### base_opti
Dieses Feld fungiert als Fremdschlüssel und verweist auf den zugehörigen Tarif in der Tabelle **Base (base_base)**. Dieses Feld fungiert als Fremdschlüssel und verweist auf den zugehörigen Tarif in der Tabelle **Base (base_base)**.
### provisiongroup_opti ### provisiongroup_opti
Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird. Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird.
### providercode_opti ### providercode_opti
Ein optionales Feld zur Speicherung eines zusätzlichen Provider-Codes. Ein optionales Feld zur Speicherung eines zusätzlichen Provider-Codes.
### providercategory_opti ### providercategory_opti
Dieses optionale Feld dient der Kategorisierung der Option (Providerkategorie). Dieses optionale Feld dient der Kategorisierung der Option (Providerkategorie).
### name_opti ### name_opti
Das Feld enthält den offiziellen Namen der Option, wie er vom Provider vorgegeben wird. Das Feld enthält den offiziellen Namen der Option, wie er vom Provider vorgegeben wird.
### alias_opti ### alias_opti
Ein optionaler Alias, der den offiziellen Namen ergänzen oder ersetzen kann. Ein optionaler Alias, der den offiziellen Namen ergänzen oder ersetzen kann.
### price_opti ### price_opti
In diesem Feld wird der Preis der Option als Dezimalwert festgehalten (Netto). In diesem Feld wird der Preis der Option als Dezimalwert festgehalten (Netto).
### starts_opti ### starts_opti
Das Datum und die Uhrzeit, ab wann die Option aktiv wird. Das Datum und die Uhrzeit, ab wann die Option aktiv wird.
### stops_opti ### stops_opti
Ein optionales Datum und eine Uhrzeit, bis zu denen die Option gültig ist. Ein optionales Datum und eine Uhrzeit, bis zu denen die Option gültig ist.
### provision1_opti bis provision4_opti ### provision1_opti bis provision4_opti
Diese Felder enthalten verschiedene Provisionswerte für für die Option. Diese Felder enthalten verschiedene Provisionswerte für für die Option.
Alle Provisionen zusammengerechnet ergeben die Gesamtprovision. Alle Provisionen zusammengerechnet ergeben die Gesamtprovision.
### created_opti ### created_opti
Der Zeitpunkt, zu dem der Options-Datensatz erstellt wurde. Der Zeitpunkt, zu dem der Options-Datensatz erstellt wurde.
### updated_opti ### updated_opti
Der Zeitpunkt, zu dem der Options-Datensatz zuletzt aktualisiert wurde. Der Zeitpunkt, zu dem der Options-Datensatz zuletzt aktualisiert wurde.
--- ---
## Provisiongroup (provisiongroup_pgro) ## Provisiongroup (provisiongroup_pgro)
In dieser Tabelle werden Provisiongruppen verwaltet, die sowohl in Deals als auch in Optionen Anwendung finden. Eine Provisiongruppe legt fest, wie viel Provision prozentual für den Vertrieb freigegeben wird. In dieser Tabelle werden Provisiongruppen verwaltet, die sowohl in Deals als auch in Optionen Anwendung finden. Eine Provisiongruppe legt fest, wie viel Provision prozentual für den Vertrieb freigegeben wird.
### id_pgro ### id_pgro
Der Primärschlüssel der Tabelle, der jede Provisiongruppe eindeutig identifiziert. Der Primärschlüssel der Tabelle, der jede Provisiongruppe eindeutig identifiziert.
### name_pgro ### name_pgro
Hier wird der Name der Provisiongruppe gespeichert. Hier wird der Name der Provisiongruppe gespeichert.
### percent_pgro ### percent_pgro
Dieser Dezimalwert legt den Provisionsprozentsatz fest. Standardmäßig beträgt dieser 0.00. Dieser Dezimalwert legt den Provisionsprozentsatz fest. Standardmäßig beträgt dieser 0.00.
### created_pgro ### created_pgro
Der Zeitpunkt, zu dem der Datensatz der Provisiongruppe erstellt wurde. Der Zeitpunkt, zu dem der Datensatz der Provisiongruppe erstellt wurde.
### updated_pgro ### updated_pgro
Ein optionales Feld, das den Zeitpunkt der letzten Aktualisierung der Provisiongruppe festhält. Ein optionales Feld, das den Zeitpunkt der letzten Aktualisierung der Provisiongruppe festhält.
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment