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

fix

parent 38b8a85a
......@@ -3,3 +3,4 @@ __pycache__
workbench/*.bak
cache/*.html
cache/*.csv
cache/*.pdf
\ No newline at end of file
......@@ -2,11 +2,11 @@
"fileId": "01509001-bd4e-4462-93ad-dc5066fd729a",
"originalPath": "work/models/deal_deal.py",
"currentPath": "work/models/deal_deal.py",
"hash": "099f755dbb69b9e183dcf39898a9cb00f6eed50a9fede3188d0171f421476186",
"hash": "4d15256bbe0040ef1797a5cbf973ceac39d41c8bb583e11e98f60e9a3824d7a5",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744626243451,
"lastFileModificationTimestamp": 1744625938604.1194,
"lastCheckedTimestamp": 1744805220640,
"lastFileModificationTimestamp": 1744787042633.7546,
"flaggedForCopy": false
}
......@@ -2,11 +2,11 @@
"fileId": "24784b38-54dc-4000-9d2a-f59082ebbc1c",
"originalPath": "work/models/base_base.py",
"currentPath": "work/models/base_base.py",
"hash": "ac06e8d1df3e4d73f4cc72b071faaf8536fdf8471b453e384512b98845b4e566",
"hash": "19b6bd8fd24ccac708053a39f013632721ed03ec35663efd7d7ec222cf0be934",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744626237630,
"lastFileModificationTimestamp": 1744625911470.088,
"lastCheckedTimestamp": 1744805211278,
"lastFileModificationTimestamp": 1744787773143.9746,
"flaggedForCopy": false
}
......@@ -2,10 +2,10 @@
"fileId": "2d1520cf-72fc-48b2-9249-380bc40499ed",
"originalPath": "work/notebooks/GetDataFromMaui.ipynb",
"currentPath": "work/notebooks/GetDataFromMaui.ipynb",
"hash": "e2d6ebb28291ed4181c547bd6dee318102be9f937145e1dfeb6c1ff0a001cb39",
"hash": "f67eb462d1e9ede84202dfee80222e7e97b36b22b7c134f812acaa6f191a160c",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744625554372,
"lastFileModificationTimestamp": 1744625453090.3838
"lastCheckedTimestamp": 1744805357670,
"lastFileModificationTimestamp": 1744805352149.463
}
......@@ -2,10 +2,10 @@
"fileId": "36e791b4-e235-42f6-ac61-8560f1762892",
"originalPath": "work/workbench/Workbench.mwb",
"currentPath": "work/workbench/Workbench.mwb",
"hash": "050435dbe63c623b2d9a4201250dad0b5b1c43601ece3e390392e4541b182c9b",
"hash": "f10bcc0690c342970656e4b4dcaa462b189bc5fa833b9f2bb04f88731782b1f0",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744619680767,
"lastFileModificationTimestamp": 1744619453253.4011
"lastCheckedTimestamp": 1744805338829,
"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 @@
"fileId": "5ec4e9ba-309d-438b-8e17-ce5802f3deb2",
"originalPath": "work/workbench/Documentation.md",
"currentPath": "work/workbench/Documentation.md",
"hash": "f56f35397937e2b3c5e0f8507385b65d8afb0a3321c649466d9698212dc14a62",
"hash": "35d995fb3f8a904ed6f47adbd4da60916c93a29aad08af551b493a32714dcd9c",
"docContent": "<p><br></p>",
"checkedStatus": "done",
"comments": [],
"lastCheckedTimestamp": 1744626251158,
"lastFileModificationTimestamp": 1744626180275.6394
"lastCheckedTimestamp": 1744805208732,
"lastFileModificationTimestamp": 1744805204185.4846
}
......@@ -2,6 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from models._system import Base
from models.basegroup_bgro import BasegroupBgro
from models.option_opti import OptionOpti
class BaseBase(Base):
__tablename__ = 'base_base'
......
......@@ -10,6 +10,7 @@ class DealDeal(Base):
provisiongroup_deal = Column(Integer, ForeignKey('provisiongroup_pgro.id_pgro'))
base_deal = Column(Integer, ForeignKey('base_base.id_base'), nullable=False)
providercode_deal = Column(String(255))
name_deal = Column(String(255))
alias_deal = Column(String(255))
price_deal = Column(Numeric(8, 5), nullable=False)
starts_deal = Column(DateTime, nullable=False)
......
This diff is collapsed.
{
"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
}
This diff is collapsed.
**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
## 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.
Beispielhafte Tarife:
```
Green Allnet Flat
Green Allnet Flat mit Handy 5
......@@ -11,49 +13,75 @@ Green Allnet Flat mit Handy 10
```
### id_base
Dieser Primärschlüssel identifiziert jeden Tarif eindeutig in der Tabelle.
### 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.
### provider_base
Hier wird der Name des Providers gespeichert, beispielsweise "Freenet" oder "Klarmobil".
### providercode_base
Ein optionales Feld, in dem ein zusätzlicher Provider-Code (Fremdschlüssel) hinterlegt werden kann.
### name_base
Dieses Feld enthält den offiziellen Tarifnamen, wie er vom Provider vorgegeben wird.
### alias_base
Hier kann ein alternativer Name definiert werden, der den offiziellen Tarifnamen ersetzt.
### network_base
In diesem Feld wird das verwendete Funknetz definiert.
**Mögliche Werte:**
- **1**: D1/Telekom
- **2**: D2/Vodafone
- **4**: O2/Telefonica
### type_base
Dieses Feld legt den Tariftyp fest.
**Mögliche Werte:**
- **0**: Unbekannt
- **1**: Voice
- **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
Der Zeitstempel, der angibt, wann der Datensatz erstellt wurde.
### updated_base
Der Zeitstempel, an dem der Datensatz zuletzt aktualisiert wurde.
---
## 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.
Beispielhafte Tarifgruppen:
```
Red Allnet Flat Tarifgruppe
Green Allnet Flat Tarifgruppe
......@@ -61,117 +89,153 @@ Blue Allnet Flat Tarifgruppe
```
### id_bgro
Der Primärschlüssel der Tabelle, der jede Tarifgruppe eindeutig identifiziert.
### name_bgro
Hier wird der Name der Tarifgruppe festgelegt.
### created_bgro
Der Zeitpunkt, zu dem die Tarifgruppe erstellt wurde.
### updated_bgro
Der Zeitpunkt, zu dem die Tarifgruppe zuletzt aktualisiert wurde.
---
## 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.
### id_deal
Der Primärschlüssel der Tabelle, der jede Aktion eindeutig identifiziert.
### base_deal
Dieses Feld ist ein Fremdschlüssel, der auf einen Tarif in der Tabelle **Base (base_base)** verweist.
### provisiongroup_deal
Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird.
### providercode_deal
Ein optionales Feld, das einen zusätzlichen Provider-Code (Fremdschlüssel) speichern kann.
### alias_deal
Ein optionaler, alternativer Name des Deals.
### price_deal
In diesem Feld wird der Preis des Deals als Dezimalwert festgehalten (Netto).
### starts_deal
Das Datum und die Uhrzeit, ab wann der Deal aktiv wird.
### stops_deal
Ein optionales Datum und eine Uhrzeit, bis zu denen der Deal gültig ist.
### provision1_deal bis provision4_deal
Diese Felder enthalten verschiedene Provisionswerte für für die Aktion.
Alle Provisionen zusammengerechnet ergeben die Gesamtprovision.
### created_deal
Der Zeitpunkt, zu dem der Deal-Datensatz erstellt wurde.
### updated_deal
Der Zeitpunkt, zu dem der Deal zuletzt aktualisiert wurde.
---
## 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.
### id_opti
Der Primärschlüssel der Tabelle, der jede Option eindeutig identifiziert.
### base_opti
Dieses Feld fungiert als Fremdschlüssel und verweist auf den zugehörigen Tarif in der Tabelle **Base (base_base)**.
### provisiongroup_opti
Dieses Feld definiert, unter welcher Provisionsgruppe dieser Tarif verwaltet wird.
### providercode_opti
Ein optionales Feld zur Speicherung eines zusätzlichen Provider-Codes.
### providercategory_opti
Dieses optionale Feld dient der Kategorisierung der Option (Providerkategorie).
### name_opti
Das Feld enthält den offiziellen Namen der Option, wie er vom Provider vorgegeben wird.
### alias_opti
Ein optionaler Alias, der den offiziellen Namen ergänzen oder ersetzen kann.
### price_opti
In diesem Feld wird der Preis der Option als Dezimalwert festgehalten (Netto).
### starts_opti
Das Datum und die Uhrzeit, ab wann die Option aktiv wird.
### stops_opti
Ein optionales Datum und eine Uhrzeit, bis zu denen die Option gültig ist.
### provision1_opti bis provision4_opti
Diese Felder enthalten verschiedene Provisionswerte für für die Option.
Alle Provisionen zusammengerechnet ergeben die Gesamtprovision.
### created_opti
Der Zeitpunkt, zu dem der Options-Datensatz erstellt wurde.
### updated_opti
Der Zeitpunkt, zu dem der Options-Datensatz zuletzt aktualisiert wurde.
---
## 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.
### id_pgro
Der Primärschlüssel der Tabelle, der jede Provisiongruppe eindeutig identifiziert.
### name_pgro
Hier wird der Name der Provisiongruppe gespeichert.
### percent_pgro
Dieser Dezimalwert legt den Provisionsprozentsatz fest. Standardmäßig beträgt dieser 0.00.
### created_pgro
Der Zeitpunkt, zu dem der Datensatz der Provisiongruppe erstellt wurde.
### updated_pgro
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