20-02-2026

This commit is contained in:
Kevin Adametz 2026-02-20 17:57:50 +01:00
parent 854ce02bf6
commit 4d6b4930b2
128 changed files with 18247 additions and 2093 deletions

View file

@ -0,0 +1,70 @@
Sektion;Feld;Beschreibung;Beispiel;Pflichtgrad
1. Identität & Katalog;B2in-Artikelnummer (intern);Fortlaufende Nummer (vom System vergeben);B2IN-000471;🟥 Pflichtfeld
;Lieferanten-Artikelnummer (SKU);Originalnummer des Herstellers;SOFA-ALBA-3S-ANTHR;🟥 Pflichtfeld
;Produktname;Anzeigename auf Website;Sofa ALBA 3-Sitzer;🟥 Pflichtfeld
;Marke / Hersteller;Produzent oder Label;Möbelwerk Nord;🟨 Empfohlen
;Kategorie;z. B. „Wohnzimmer > Sofa > 3-Sitzer“;Wohnzimmer > Sofas;🟥 Pflichtfeld
;Kurzbeschreibung;Max. 180 Zeichen für Snippets;Modernes Sofa mit Holzrahmen und Stoffbezug.;🟨 Empfohlen
;Langbeschreibung;Detaillierter Text für Produktseite;Das Sofa ALBA verbindet zeitloses Design...;🟩 Optional
;Status;Aktiv / Entwurf;Aktiv;🟥 Pflichtfeld
;Erstelldatum / Änderungsdatum;ISO-Datum;2025-11-04;🟩 Optional
2. Varianten & Attribute;Variantenattribute (Steuernd);Merkmale, die SKUs definieren;Farbe, Bezug, Gestellfarbe;🟨 Empfohlen
;Varianten (Kombinationen);Konkrete Ausprägungen;Anthrazit / Stoff A / Eiche hell;🟨 Empfohlen
;Weitere Attribute;Zusatzinfos (z. B. Sitzhärte, Stil);Sitzhärte: mittel;🟩 Optional
3. Maße & Gewicht (Produkt);Breite (mm);Gesamtbreite;2200;🟥 Pflichtfeld
;Tiefe (mm);Gesamttiefe;950;🟥 Pflichtfeld
;Höhe (mm);Gesamthöhe;830;🟥 Pflichtfeld
;Gewicht netto (kg);Möbel ohne Verpackung;68;🟨 Empfohlen
;Aufbauart;montiert / teilmontiert / zerlegt;zerlegt;🟨 Empfohlen
;Montagezeit (min);Aufbauzeit;45;🟩 Optional
;Traglast (kg);Belastbarkeit;120;🟩 Optional
4. Verpackung & Logistik;Anzahl Packstücke;;2;🟨 Empfohlen
;Gesamtgewicht brutto (kg);inkl. Verpackung;75;🟨 Empfohlen
;Verpackungsart;Karton, Holzrahmen usw.;Karton mit Kantenschutz;🟨 Empfohlen
;Verpackung recyclingfähig (%);Anteil recycelbarer Materialien der Verpackung;85;🟨 Empfohlen
;Kolli 1 Maße (mm);L × B × H;1500 × 950 × 600;🟨 Empfohlen
;Kolli 1 Gewicht (kg);;45;🟩 Optional
;Palettierfähig;Ja / Nein;Ja;🟨 Empfohlen
;HS-Code (Zolltarifnummer);;94016100;🟨 Empfohlen
5. Materialien & Qualität;Hauptmaterial;Tragende Struktur;Massivholz Buche;🟥 Pflichtfeld
;Oberflächenmaterial;Sichtflächen;Furnier Eiche geölt;🟨 Empfohlen
;Bezugsmaterial;Stoff / Leder / Synthetik;Stoff (Polyester);🟨 Empfohlen
;Farbton / Dekor;;Eiche natur / Anthrazit;🟨 Empfohlen
;Herkunftsland (Produktion);ISO-Land;PL;🟥 Pflichtfeld
;Pflegehinweise;Reinigung & Pflege;Mit feuchtem Tuch abwischen.;🟩 Optional
;Zertifikate / Labels;FSC, OEKO-TEX, Blauer Engel etc.;FSC;🟩 Optional
6. Holzherkunft & EUDR;Holzart(en);Botanische Bezeichnung (falls Holz enthalten);Quercus robur (Eiche);🟥 Pflichtfeld
;Herkunftsland des Holzes;ISO-Code (falls Holz enthalten);PL;🟥 Pflichtfeld
;Region / Provinz;falls erforderlich für EUDR;Masowien;🟨 Empfohlen
;Erntejahr;Jahr der Holzgewinnung;2024;🟨 Empfohlen
;Forstbetrieb / Lieferant;;ForestPol Sp. z o.o.;🟨 Empfohlen
;Nachhaltigkeitszertifikat;FSC / PEFC;FSC C123456;🟨 Empfohlen
;Sorgfaltserklärung (EUDR-ID);offizielle Referenz;EUDR-DD-2025-PL-03421;🟨 Empfohlen
;Nachweisdatei (Upload);PDF / Link zum Statement;/uploads/EUDR_Statement_ALBA.pdf;🟩 Optional
7. Preise & Konditionen;Einkaufspreis (net);;680,00€;🟨 Empfohlen
;Verkaufspreis (net);Für B2in-Plattform;1.250,00€;🟥 Pflichtfeld
;Währung;;EUR;🟥 Pflichtfeld
;Steuersatz (%);;19;🟥 Pflichtfeld
;UVP (Brutto);Unverbindliche Preisempfehlung;1.499,00€;🟩 Optional
8. Verfügbarkeit & Lieferzeit;Lagerstatus;Auf Lager / Auf Bestellung / Nicht verfügbar;Auf Bestellung;🟥 Pflichtfeld
;Lieferzeit (Wochen);MinMax-Spanne;46;🟥 Pflichtfeld
;Produktionszeit (Tage);falls relevant;21;🟩 Optional
9. Lieferung, Montage & Services;Lieferart;Abholung / Lieferung / Spedition / Paket;Spedition;🟨 Empfohlen
;Montageservice;Ja / Nein;Ja;🟩 Optional
;Service-Radius (km);Für Montageservice;50;🟩 Optional
;Garantie (Monate);;24;🟩 Optional
10. Händler- / Herstellerzuordnung;VerkäufertypHändler;/ Hersteller / Makler;Händler;🟥 Pflichtfeld
;Verkäufername;;WohnDesign Bielefeld;🟥 Pflichtfeld
;Verkäufer-ID;;SELLER-1123;🟨 Empfohlen
;Region / Hub;Logistische Zuordnung;OWL;🟥 Pflichtfeld
;Ort / PLZ;Standort des Verkäufers/Lagers;33602 Bielefeld;🟨 Empfohlen
11. Nachhaltigkeit & Umwelt;CO₂-Fußabdruck (kg CO₂e);pro Stück;35;🟩 Optional
;Recyclinganteil (%);Anteil recycelter Materialien im Produkt;40;🟨 Empfohlen
;Regionale Produktion;Ja / Nein (Umkreis z. B. < 500 km);Ja;🟩 Optional
12. Scoring-System (B2in Intern);Stauraumvolumen (L);Innenvolumen;280;🟩 Optional
;Aufbauaufwand (15);gering = 1;3;🟩 Optional
;Designpunkte (15);interne Bewertung;5;🟩 Optional
;Gesamt-Score;automatisch berechnet;4,2;🟩 Optional
13. Verwaltung & Lebenszyklus;Sichtbar ab / bis (Datum);Steuerung der Veröffentlichung;2025-01-01 / 2026-01-01;🟩 Optional
;Freigabe durch B2in erforderlich;Ja / Nein;Ja;🟨 Empfohlen
;Letzte Änderung;Datum der letzten Aktualisierung;2025-11-04;🟩 Optional
1 Sektion Feld Beschreibung Beispiel Pflichtgrad
2 1. Identität & Katalog B2in-Artikelnummer (intern) Fortlaufende Nummer (vom System vergeben) B2IN-000471 🟥 Pflichtfeld
3 Lieferanten-Artikelnummer (SKU) Originalnummer des Herstellers SOFA-ALBA-3S-ANTHR 🟥 Pflichtfeld
4 Produktname Anzeigename auf Website Sofa ALBA 3-Sitzer 🟥 Pflichtfeld
5 Marke / Hersteller Produzent oder Label Möbelwerk Nord 🟨 Empfohlen
6 Kategorie z. B. „Wohnzimmer > Sofa > 3-Sitzer“ Wohnzimmer > Sofas 🟥 Pflichtfeld
7 Kurzbeschreibung Max. 180 Zeichen für Snippets Modernes Sofa mit Holzrahmen und Stoffbezug. 🟨 Empfohlen
8 Langbeschreibung Detaillierter Text für Produktseite Das Sofa ALBA verbindet zeitloses Design... 🟩 Optional
9 Status Aktiv / Entwurf Aktiv 🟥 Pflichtfeld
10 Erstelldatum / Änderungsdatum ISO-Datum 2025-11-04 🟩 Optional
11 2. Varianten & Attribute Variantenattribute (Steuernd) Merkmale, die SKUs definieren Farbe, Bezug, Gestellfarbe 🟨 Empfohlen
12 Varianten (Kombinationen) Konkrete Ausprägungen Anthrazit / Stoff A / Eiche hell 🟨 Empfohlen
13 Weitere Attribute Zusatzinfos (z. B. Sitzhärte, Stil) Sitzhärte: mittel 🟩 Optional
14 3. Maße & Gewicht (Produkt) Breite (mm) Gesamtbreite 2200 🟥 Pflichtfeld
15 Tiefe (mm) Gesamttiefe 950 🟥 Pflichtfeld
16 Höhe (mm) Gesamthöhe 830 🟥 Pflichtfeld
17 Gewicht netto (kg) Möbel ohne Verpackung 68 🟨 Empfohlen
18 Aufbauart montiert / teilmontiert / zerlegt zerlegt 🟨 Empfohlen
19 Montagezeit (min) Aufbauzeit 45 🟩 Optional
20 Traglast (kg) Belastbarkeit 120 🟩 Optional
21 4. Verpackung & Logistik Anzahl Packstücke 2 🟨 Empfohlen
22 Gesamtgewicht brutto (kg) inkl. Verpackung 75 🟨 Empfohlen
23 Verpackungsart Karton, Holzrahmen usw. Karton mit Kantenschutz 🟨 Empfohlen
24 Verpackung recyclingfähig (%) Anteil recycelbarer Materialien der Verpackung 85 🟨 Empfohlen
25 Kolli 1 Maße (mm) L × B × H 1500 × 950 × 600 🟨 Empfohlen
26 Kolli 1 Gewicht (kg) 45 🟩 Optional
27 Palettierfähig Ja / Nein Ja 🟨 Empfohlen
28 HS-Code (Zolltarifnummer) 94016100 🟨 Empfohlen
29 5. Materialien & Qualität Hauptmaterial Tragende Struktur Massivholz Buche 🟥 Pflichtfeld
30 Oberflächenmaterial Sichtflächen Furnier Eiche geölt 🟨 Empfohlen
31 Bezugsmaterial Stoff / Leder / Synthetik Stoff (Polyester) 🟨 Empfohlen
32 Farbton / Dekor Eiche natur / Anthrazit 🟨 Empfohlen
33 Herkunftsland (Produktion) ISO-Land PL 🟥 Pflichtfeld
34 Pflegehinweise Reinigung & Pflege Mit feuchtem Tuch abwischen. 🟩 Optional
35 Zertifikate / Labels FSC, OEKO-TEX, Blauer Engel etc. FSC 🟩 Optional
36 6. Holzherkunft & EUDR Holzart(en) Botanische Bezeichnung (falls Holz enthalten) Quercus robur (Eiche) 🟥 Pflichtfeld
37 Herkunftsland des Holzes ISO-Code (falls Holz enthalten) PL 🟥 Pflichtfeld
38 Region / Provinz falls erforderlich für EUDR Masowien 🟨 Empfohlen
39 Erntejahr Jahr der Holzgewinnung 2024 🟨 Empfohlen
40 Forstbetrieb / Lieferant ForestPol Sp. z o.o. 🟨 Empfohlen
41 Nachhaltigkeitszertifikat FSC / PEFC FSC C123456 🟨 Empfohlen
42 Sorgfaltserklärung (EUDR-ID) offizielle Referenz EUDR-DD-2025-PL-03421 🟨 Empfohlen
43 Nachweisdatei (Upload) PDF / Link zum Statement /uploads/EUDR_Statement_ALBA.pdf 🟩 Optional
44 7. Preise & Konditionen Einkaufspreis (net) 680,00€ 🟨 Empfohlen
45 Verkaufspreis (net) Für B2in-Plattform 1.250,00€ 🟥 Pflichtfeld
46 Währung EUR 🟥 Pflichtfeld
47 Steuersatz (%) 19 🟥 Pflichtfeld
48 UVP (Brutto) Unverbindliche Preisempfehlung 1.499,00€ 🟩 Optional
49 8. Verfügbarkeit & Lieferzeit Lagerstatus Auf Lager / Auf Bestellung / Nicht verfügbar Auf Bestellung 🟥 Pflichtfeld
50 Lieferzeit (Wochen) Min–Max-Spanne 4–6 🟥 Pflichtfeld
51 Produktionszeit (Tage) falls relevant 21 🟩 Optional
52 9. Lieferung, Montage & Services Lieferart Abholung / Lieferung / Spedition / Paket Spedition 🟨 Empfohlen
53 Montageservice Ja / Nein Ja 🟩 Optional
54 Service-Radius (km) Für Montageservice 50 🟩 Optional
55 Garantie (Monate) 24 🟩 Optional
56 10. Händler- / Herstellerzuordnung VerkäufertypHändler / Hersteller / Makler Händler 🟥 Pflichtfeld
57 Verkäufername WohnDesign Bielefeld 🟥 Pflichtfeld
58 Verkäufer-ID SELLER-1123 🟨 Empfohlen
59 Region / Hub Logistische Zuordnung OWL 🟥 Pflichtfeld
60 Ort / PLZ Standort des Verkäufers/Lagers 33602 Bielefeld 🟨 Empfohlen
61 11. Nachhaltigkeit & Umwelt CO₂-Fußabdruck (kg CO₂e) pro Stück 35 🟩 Optional
62 Recyclinganteil (%) Anteil recycelter Materialien im Produkt 40 🟨 Empfohlen
63 Regionale Produktion Ja / Nein (Umkreis z. B. < 500 km) Ja 🟩 Optional
64 12. Scoring-System (B2in Intern) Stauraumvolumen (L) Innenvolumen 280 🟩 Optional
65 Aufbauaufwand (1–5) gering = 1 3 🟩 Optional
66 Designpunkte (1–5) interne Bewertung 5 🟩 Optional
67 Gesamt-Score automatisch berechnet 4,2 🟩 Optional
68 13. Verwaltung & Lebenszyklus Sichtbar ab / bis (Datum) Steuerung der Veröffentlichung 2025-01-01 / 2026-01-01 🟩 Optional
69 Freigabe durch B2in erforderlich Ja / Nein Ja 🟨 Empfohlen
70 Letzte Änderung Datum der letzten Aktualisierung 2025-11-04 🟩 Optional

View file

@ -0,0 +1,941 @@
-- -------------------------------------------------------------
-- TablePlus 6.8.0(654)
--
-- https://tableplus.com/
--
-- Database: b2in
-- Generation Time: 2026-02-12 13:29:06.4400
-- -------------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `attribute_values`;
CREATE TABLE `attribute_values` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`attribute_id` bigint unsigned NOT NULL,
`value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `attribute_values_slug_unique` (`slug`),
KEY `attribute_values_attribute_id_foreign` (`attribute_id`),
CONSTRAINT `attribute_values_attribute_id_foreign` FOREIGN KEY (`attribute_id`) REFERENCES `attributes` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `attributes`;
CREATE TABLE `attributes` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `attributes_slug_unique` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `brands`;
CREATE TABLE `brands` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`partner_id` bigint unsigned DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`is_active` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `brands_slug_unique` (`slug`),
KEY `brands_partner_id_foreign` (`partner_id`),
CONSTRAINT `brands_partner_id_foreign` FOREIGN KEY (`partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `cache`;
CREATE TABLE `cache` (
`key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`expiration` int NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `cache_locks`;
CREATE TABLE `cache_locks` (
`key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`owner` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`expiration` int NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`parent_id` bigint unsigned DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `categories_slug_unique` (`slug`),
KEY `categories_parent_id_foreign` (`parent_id`),
CONSTRAINT `categories_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `category_product`;
CREATE TABLE `category_product` (
`category_id` bigint unsigned NOT NULL,
`product_id` bigint unsigned NOT NULL,
PRIMARY KEY (`category_id`,`product_id`),
KEY `category_product_product_id_foreign` (`product_id`),
CONSTRAINT `category_product_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE,
CONSTRAINT `category_product_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `collections`;
CREATE TABLE `collections` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `collections_slug_unique` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `display_footer_contents`;
CREATE TABLE `display_footer_contents` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`headline` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`subline` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`short_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`clicks` int unsigned NOT NULL DEFAULT '0',
`sort_order` int NOT NULL DEFAULT '0',
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `display_footer_contents_short_code_unique` (`short_code`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `display_videos`;
CREATE TABLE `display_videos` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`filename` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`position` int NOT NULL DEFAULT '25',
`sort_order` int NOT NULL DEFAULT '0',
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `failed_jobs`;
CREATE TABLE `failed_jobs` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`connection` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`queue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`exception` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `hub_locations`;
CREATE TABLE `hub_locations` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`hub_id` bigint unsigned NOT NULL,
`city_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`zip_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `hub_locations_hub_id_zip_code_unique` (`hub_id`,`zip_code`),
KEY `hub_locations_zip_code_index` (`zip_code`),
CONSTRAINT `hub_locations_hub_id_foreign` FOREIGN KEY (`hub_id`) REFERENCES `hubs` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `hubs`;
CREATE TABLE `hubs` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`keyvisual_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`emblem_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `hubs_slug_unique` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `job_batches`;
CREATE TABLE `job_batches` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`total_jobs` int NOT NULL,
`pending_jobs` int NOT NULL,
`failed_jobs` int NOT NULL,
`failed_job_ids` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`options` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`cancelled_at` int DEFAULT NULL,
`created_at` int NOT NULL,
`finished_at` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `jobs`;
CREATE TABLE `jobs` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`queue` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`attempts` tinyint unsigned NOT NULL,
`reserved_at` int unsigned DEFAULT NULL,
`available_at` int unsigned NOT NULL,
`created_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `jobs_queue_index` (`queue`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `media`;
CREATE TABLE `media` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`model_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`model_id` bigint unsigned NOT NULL,
`file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'image',
`alt_text` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`order_column` int NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `media_model_type_model_id_index` (`model_type`,`model_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `migrations`;
CREATE TABLE `migrations` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`migration` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`batch` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `model_has_permissions`;
CREATE TABLE `model_has_permissions` (
`permission_id` bigint unsigned NOT NULL,
`model_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`model_id` bigint unsigned NOT NULL,
PRIMARY KEY (`permission_id`,`model_id`,`model_type`),
KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`),
CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `model_has_roles`;
CREATE TABLE `model_has_roles` (
`role_id` bigint unsigned NOT NULL,
`model_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`model_id` bigint unsigned NOT NULL,
PRIMARY KEY (`role_id`,`model_id`,`model_type`),
KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`),
CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `partner_invitations`;
CREATE TABLE `partner_invitations` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`company_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`contact_first_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`contact_last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`role_id` bigint unsigned NOT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`token` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`status` enum('pending','accepted','expired','cancelled') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending',
`expires_at` timestamp NOT NULL,
`invited_by` bigint unsigned NOT NULL,
`partner_id` bigint unsigned DEFAULT NULL,
`accepted_at` timestamp NULL DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `partner_invitations_token_unique` (`token`),
KEY `partner_invitations_invited_by_foreign` (`invited_by`),
KEY `partner_invitations_partner_id_foreign` (`partner_id`),
KEY `partner_invitations_token_status_index` (`token`,`status`),
KEY `partner_invitations_email_status_index` (`email`,`status`),
KEY `partner_invitations_role_id_foreign` (`role_id`),
CONSTRAINT `partner_invitations_invited_by_foreign` FOREIGN KEY (`invited_by`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `partner_invitations_partner_id_foreign` FOREIGN KEY (`partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL,
CONSTRAINT `partner_invitations_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `partners`;
CREATE TABLE `partners` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`company_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`brand` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`salutation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`first_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`hub_id` bigint unsigned DEFAULT NULL,
`parent_partner_id` bigint unsigned DEFAULT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`street` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`house_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`zip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Deutschland',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`website` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '0',
`setup_completed` tinyint(1) NOT NULL DEFAULT '0',
`setup_completed_at` timestamp NULL DEFAULT NULL,
`delivery_radius_km` int DEFAULT NULL,
`assembly_radius_km` int DEFAULT NULL,
`provision_fixed_amount` int DEFAULT NULL,
`provision_rate_percentage` decimal(5,2) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `partners_slug_unique` (`slug`),
KEY `partners_hub_id_foreign` (`hub_id`),
KEY `partners_broker_partner_id_index` (`parent_partner_id`),
KEY `partners_brand_index` (`brand`),
CONSTRAINT `partners_broker_partner_id_foreign` FOREIGN KEY (`parent_partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL,
CONSTRAINT `partners_hub_id_foreign` FOREIGN KEY (`hub_id`) REFERENCES `hubs` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `password_reset_tokens`;
CREATE TABLE `password_reset_tokens` (
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE `permissions` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`guard_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `personal_access_tokens`;
CREATE TABLE `personal_access_tokens` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`tokenable_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`tokenable_id` bigint unsigned NOT NULL,
`name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`token` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`abilities` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`last_used_at` timestamp NULL DEFAULT NULL,
`expires_at` timestamp NULL DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `personal_access_tokens_token_unique` (`token`),
KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `product_logistics`;
CREATE TABLE `product_logistics` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`product_variant_id` bigint unsigned NOT NULL,
`shipping_class_id` bigint unsigned DEFAULT NULL,
`package_width_cm` int DEFAULT NULL,
`package_height_cm` int DEFAULT NULL,
`package_depth_cm` int DEFAULT NULL,
`package_weight_g` int DEFAULT NULL,
`package_count` int NOT NULL DEFAULT '1',
`location_bin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `product_logistics_product_variant_id_foreign` (`product_variant_id`),
KEY `product_logistics_shipping_class_id_foreign` (`shipping_class_id`),
CONSTRAINT `product_logistics_product_variant_id_foreign` FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants` (`id`) ON DELETE CASCADE,
CONSTRAINT `product_logistics_shipping_class_id_foreign` FOREIGN KEY (`shipping_class_id`) REFERENCES `shipping_classes` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `product_tag`;
CREATE TABLE `product_tag` (
`product_id` bigint unsigned NOT NULL,
`tag_id` bigint unsigned NOT NULL,
PRIMARY KEY (`product_id`,`tag_id`),
KEY `product_tag_tag_id_foreign` (`tag_id`),
CONSTRAINT `product_tag_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
CONSTRAINT `product_tag_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `product_variant_attributes`;
CREATE TABLE `product_variant_attributes` (
`product_variant_id` bigint unsigned NOT NULL,
`attribute_value_id` bigint unsigned NOT NULL,
PRIMARY KEY (`product_variant_id`,`attribute_value_id`),
KEY `product_variant_attributes_attribute_value_id_foreign` (`attribute_value_id`),
CONSTRAINT `product_variant_attributes_attribute_value_id_foreign` FOREIGN KEY (`attribute_value_id`) REFERENCES `attribute_values` (`id`) ON DELETE CASCADE,
CONSTRAINT `product_variant_attributes_product_variant_id_foreign` FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `product_variants`;
CREATE TABLE `product_variants` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`product_id` bigint unsigned NOT NULL,
`name_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_master_variant` tinyint(1) NOT NULL DEFAULT '0',
`sku` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`han_mpn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`ean_gtin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`selling_price` int NOT NULL,
`msrp` int DEFAULT NULL,
`purchase_price` int DEFAULT NULL,
`tax_rate_id` bigint unsigned NOT NULL,
`stock_quantity` int NOT NULL DEFAULT '0',
`stock_min_threshold` int DEFAULT NULL,
`availability_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`delivery_time_text` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_rentable` tinyint(1) NOT NULL DEFAULT '0',
`rental_duration_options` json DEFAULT NULL,
`rental_rate_formula` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`residual_value_percentage` decimal(5,2) DEFAULT NULL,
`variant_weight_g` int DEFAULT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `product_variants_sku_unique` (`sku`),
KEY `product_variants_product_id_foreign` (`product_id`),
KEY `product_variants_tax_rate_id_foreign` (`tax_rate_id`),
KEY `product_variants_han_mpn_index` (`han_mpn`),
KEY `product_variants_ean_gtin_index` (`ean_gtin`),
CONSTRAINT `product_variants_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
CONSTRAINT `product_variants_tax_rate_id_foreign` FOREIGN KEY (`tax_rate_id`) REFERENCES `tax_rates` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`partner_id` bigint unsigned NOT NULL,
`brand_id` bigint unsigned DEFAULT NULL,
`collection_id` bigint unsigned DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'draft',
`description_short` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`description_long` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`care_instructions` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`width_cm` int DEFAULT NULL,
`height_cm` int DEFAULT NULL,
`depth_cm` int DEFAULT NULL,
`dimensions_specific` json DEFAULT NULL,
`assembly_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`meta_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`meta_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `products_slug_unique` (`slug`),
KEY `products_partner_id_foreign` (`partner_id`),
KEY `products_brand_id_foreign` (`brand_id`),
KEY `products_collection_id_foreign` (`collection_id`),
CONSTRAINT `products_brand_id_foreign` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`) ON DELETE SET NULL,
CONSTRAINT `products_collection_id_foreign` FOREIGN KEY (`collection_id`) REFERENCES `collections` (`id`) ON DELETE SET NULL,
CONSTRAINT `products_partner_id_foreign` FOREIGN KEY (`partner_id`) REFERENCES `partners` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `registration_codes`;
CREATE TABLE `registration_codes` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'available',
`broker_partner_id` bigint unsigned DEFAULT NULL,
`assigned_to_code_id` bigint unsigned DEFAULT NULL,
`partner_id` bigint unsigned DEFAULT NULL,
`used_by_user_id` bigint unsigned DEFAULT NULL,
`used_at` timestamp NULL DEFAULT NULL,
`expires_at` timestamp NULL DEFAULT NULL,
`metadata` json DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `registration_codes_code_unique` (`code`),
KEY `registration_codes_used_by_user_id_foreign` (`used_by_user_id`),
KEY `registration_codes_role_status_index` (`role`,`status`),
KEY `registration_codes_broker_partner_id_index` (`broker_partner_id`),
KEY `registration_codes_partner_id_index` (`partner_id`),
KEY `registration_codes_name_index` (`name`),
KEY `registration_codes_assigned_to_code_id_index` (`assigned_to_code_id`),
CONSTRAINT `registration_codes_assigned_to_code_id_foreign` FOREIGN KEY (`assigned_to_code_id`) REFERENCES `registration_codes` (`id`) ON DELETE SET NULL,
CONSTRAINT `registration_codes_broker_partner_id_foreign` FOREIGN KEY (`broker_partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL,
CONSTRAINT `registration_codes_partner_id_foreign` FOREIGN KEY (`partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL,
CONSTRAINT `registration_codes_used_by_user_id_foreign` FOREIGN KEY (`used_by_user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `related_products`;
CREATE TABLE `related_products` (
`product_id` bigint unsigned NOT NULL,
`related_product_id` bigint unsigned NOT NULL,
PRIMARY KEY (`product_id`,`related_product_id`),
KEY `related_products_related_product_id_foreign` (`related_product_id`),
CONSTRAINT `related_products_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE,
CONSTRAINT `related_products_related_product_id_foreign` FOREIGN KEY (`related_product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `role_has_permissions`;
CREATE TABLE `role_has_permissions` (
`permission_id` bigint unsigned NOT NULL,
`role_id` bigint unsigned NOT NULL,
PRIMARY KEY (`permission_id`,`role_id`),
KEY `role_has_permissions_role_id_foreign` (`role_id`),
CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE,
CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`can_be_invited` tinyint(1) NOT NULL DEFAULT '0',
`reg_prefix` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`reg_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`reg_start_number` int DEFAULT NULL,
`guard_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zinc',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`),
KEY `roles_reg_prefix_index` (`reg_prefix`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` bigint unsigned DEFAULT NULL,
`ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`last_activity` int NOT NULL,
PRIMARY KEY (`id`),
KEY `sessions_user_id_index` (`user_id`),
KEY `sessions_last_activity_index` (`last_activity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `shipping_classes`;
CREATE TABLE `shipping_classes` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `tags`;
CREATE TABLE `tags` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tags_slug_unique` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `tax_rates`;
CREATE TABLE `tax_rates` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`rate_percentage` decimal(5,2) NOT NULL,
`is_default` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`partner_id` bigint unsigned DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`email_verified_at` timestamp NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`two_factor_secret` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`two_factor_recovery_codes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`two_factor_confirmed_at` timestamp NULL DEFAULT NULL,
`remember_token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`),
KEY `users_partner_id_foreign` (`partner_id`),
KEY `users_display_name_index` (`display_name`),
CONSTRAINT `users_partner_id_foreign` FOREIGN KEY (`partner_id`) REFERENCES `partners` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `brands` (`id`, `partner_id`, `name`, `slug`, `logo_url`, `description`, `is_active`, `created_at`, `updated_at`) VALUES
(1, 15, 'Moritz Möbel', 'moritz-mobel', NULL, '', 1, '2025-12-18 10:55:57', '2025-12-18 17:53:22'),
(2, 10, 'Möbelfritze', 'mobelfritze', NULL, '', 1, '2025-12-18 13:10:19', '2025-12-18 17:57:05');
INSERT INTO `display_footer_contents` (`id`, `headline`, `subline`, `url`, `short_code`, `clicks`, `sort_order`, `is_active`, `created_at`, `updated_at`) VALUES
(1, 'Beratung & Termin', 'Jetzt Termin vereinbaren.', 'https://www.cabinet.de/bielefeld?utm_source=store_display&utm_medium=qr_code&utm_campaign=bielefeld_pos&utm_content=termin_buchung#c39393', 'c59kjb', 6, 1, 1, '2025-12-18 13:19:22', '2025-12-18 14:10:35'),
(2, 'Beratung vor Ort', 'Einfach reinkommen.', 'https://www.cabinet.de/bielefeld?utm_source=store_display&utm_medium=qr_code&utm_campaign=bielefeld_pos&utm_content=termin_buchung#c39393', '3bi07j', 2, 2, 1, '2025-12-18 13:19:22', '2025-12-18 14:10:33'),
(3, 'Pinterest', 'Inspirationen entdecken.', 'https://de.pinterest.com/cabinet_AG/', '1cl8so', 0, 3, 1, '2025-12-18 13:19:22', '2025-12-18 14:10:32'),
(4, 'Instagram', 'Tägliche Einblicke & Design.', 'https://www.instagram.com/cabinet_schranksysteme/', 'hz1tx2', 0, 4, 1, '2025-12-18 13:19:22', '2025-12-18 14:10:30'),
(5, 'Facebook', 'News, Aktionen & Community.', 'https://de-de.facebook.com/cabinetschranksysteme/', 'almb7t', 0, 5, 1, '2025-12-18 13:19:22', '2025-12-18 14:10:29');
INSERT INTO `display_videos` (`id`, `filename`, `title`, `position`, `sort_order`, `is_active`, `created_at`, `updated_at`) VALUES
(1, 'herbst_2025.mp4', 'Herbst 2025', 25, 2, 1, '2025-12-18 13:19:22', '2026-01-06 12:23:48'),
(2, 'fruehjahr_2025.mp4', 'Frühjahr 2025', 10, 1, 1, '2025-12-18 13:19:22', '2026-01-06 12:23:50'),
(3, 'fruehjahr_2024.mp4', 'Frühjahr 2024', 40, 0, 1, '2025-12-18 13:19:22', '2026-01-31 15:28:23'),
(4, 'herbst_2024.mp4', 'Herbst 2024', 25, 3, 1, '2025-12-18 13:19:22', '2025-12-18 13:19:22');
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES
(72, '0001_01_01_000000_create_users_table', 1),
(73, '0001_01_01_000001_create_cache_table', 1),
(74, '0001_01_01_000002_create_jobs_table', 1),
(75, '2025_07_21_124334_add_two_factor_columns_to_users_table', 1),
(76, '2025_07_21_124345_create_personal_access_tokens_table', 1),
(77, '2025_11_05_164539_create_permission_tables', 1),
(78, '2025_11_06_115527_create_hubs_table', 1),
(79, '2025_11_06_115535_create_hub_locations_table', 1),
(80, '2025_11_06_115640_create_partners_table', 1),
(81, '2025_11_06_142927_add_color_to_roles_table', 1),
(82, '2025_11_06_151340_add_partner_id_to_users_table', 1),
(83, '2025_11_06_152910_create_attributes_table', 1),
(84, '2025_11_06_152911_create_attribute_values_table', 1),
(85, '2025_11_06_153100_create_media_table', 1),
(86, '2025_11_06_153241_create_brands_table', 1),
(87, '2025_11_06_153245_create_collections_table', 1),
(88, '2025_11_06_153250_create_categories_table', 1),
(89, '2025_11_06_153254_create_tax_rates_table', 1),
(90, '2025_11_06_153259_create_shipping_classes_table', 1),
(91, '2025_11_06_153520_create_tags_table', 1),
(92, '2025_11_06_154757_create_products_table', 1),
(93, '2025_11_06_154835_create_product_variants_table', 1),
(94, '2025_11_06_154906_create_product_variant_attributes_table', 1),
(95, '2025_11_06_155516_create_partner_invitations_table', 1),
(96, '2025_11_06_155526_create_category_product_table', 1),
(97, '2025_11_06_155530_create_product_tag_table', 1),
(98, '2025_11_06_155534_create_related_products_table', 1),
(99, '2025_11_06_155852_create_product_logistics_table', 1),
(100, '2025_11_06_160618_add_display_name_to_roles_table', 1),
(101, '2025_11_06_162747_add_contact_name_to_partner_invitations_table', 1),
(102, '2025_11_06_170546_add_can_be_invited_to_roles_table', 1),
(103, '2025_11_06_170610_change_partner_type_to_role_id_in_partner_invitations', 1),
(104, '2025_11_21_153912_add_setup_completed_to_partners_table', 2),
(105, '2025_12_11_000001_create_registration_codes_table', 3),
(106, '2025_12_16_134959_add_name_and_assigned_to_code_id_to_registration_codes_table', 4),
(107, '2025_12_16_135608_add_registration_fields_to_roles_table', 5),
(108, '2025_12_17_110248_add_display_name_to_users_table', 6),
(109, '2025_12_17_123210_add_broker_partner_id_to_partners_table', 7),
(110, '2025_12_17_123422_rename_broker_partner_id_to_parent_partner_id_in_partners_table', 8),
(111, '2025_12_17_132845_add_brand_to_partners_table', 9),
(112, '2025_12_17_135808_add_address_fields_to_partners_table', 10),
(113, '2025_12_18_080601_add_soft_deletes_to_users_table', 11),
(114, '2025_12_18_105009_add_partner_id_to_brands_table', 12),
(115, '2025_12_18_131551_create_display_videos_table', 13),
(116, '2025_12_18_131552_create_display_footer_contents_table', 13),
(118, '2025_12_18_134623_add_short_code_and_clicks_to_display_footer_contents', 14),
(119, '2025_12_18_135703_add_display_path_config_to_display_footer_contents', 14),
(120, '2025_12_18_140712_make_url_nullable_in_display_footer_contents', 15);
INSERT INTO `model_has_roles` (`role_id`, `model_type`, `model_id`) VALUES
(1, 'App\\Models\\User', 12),
(1, 'App\\Models\\User', 13),
(2, 'App\\Models\\User', 14),
(2, 'App\\Models\\User', 18),
(3, 'App\\Models\\User', 15),
(4, 'App\\Models\\User', 11),
(4, 'App\\Models\\User', 16),
(5, 'App\\Models\\User', 1),
(5, 'App\\Models\\User', 17);
INSERT INTO `partner_invitations` (`id`, `company_name`, `contact_first_name`, `contact_last_name`, `role_id`, `email`, `token`, `status`, `expires_at`, `invited_by`, `partner_id`, `accepted_at`, `created_at`, `updated_at`) VALUES
(1, 'Möbelhaus', 'Kevin', 'Adametz', 3, 'kevin.adametz@me.com', 'CDfvxGVOOUhmGur6A0N7hWW7mZkfJUzT3kZGwjfxAmdWqnWJuvm79FilEjeKz19k', 'pending', '2025-11-28 14:31:19', 1, NULL, NULL, '2025-11-21 14:31:19', '2025-11-21 14:31:19'),
(2, 'Maxy Möbelman', NULL, NULL, 1, 'info@adametz.media', 'VKg9UeqFUqlvjAugJsthdk6qAyyfjdhpiRg9fT5v5rAIsNeEddvL2wQjl4Huf2pk', 'expired', '2025-11-28 14:53:49', 1, NULL, NULL, '2025-11-21 14:53:49', '2025-12-11 10:32:28'),
(3, 'Media Matters ', NULL, NULL, 3, 'register@adametz.media', 'blUPdDvXCyYsuMrl6RmB6pr8PTrXnmBGUM3UdVFwjP1Wm88FoXTACXlV6FqeKvgv', 'accepted', '2025-11-28 14:54:29', 1, 4, '2025-11-21 15:01:16', '2025-11-21 14:54:29', '2025-11-21 15:01:16'),
(4, 'XXL Lutz', 'Max1243', 'Lustermann', 2, 'register1@adametz.media', 'nkpgrROoNcmlE52NKkTjGmN4lsNOu7jS2HS1Zxp9sgWN6NIDLf3rf6GRE0scQY5w', 'pending', '2025-12-18 10:44:37', 1, NULL, NULL, '2025-12-11 10:44:37', '2025-12-11 10:44:37'),
(5, 'Max Möbelmann', NULL, NULL, 1, 'info3@adametz.media', 'QhQLbYBa1TOOVEs2p7r4UMZ4PUb14O5KLoLQjhaZQCnX53lwpw9LG9zK3J8ADHGh', 'accepted', '2025-12-25 09:45:27', 1, 11, '2025-12-18 09:46:11', '2025-12-18 09:45:27', '2025-12-18 09:46:11'),
(7, 'Kevin Einladung', 'Kevin', 'Einladung', 1, 'register@adametz.media', 'dDjcXk8pju5uxAOmQrzszssTdh06gO0k81nonZfwRggDFeNsLy1BIN8rMocigUcb', 'accepted', '2025-12-26 11:14:21', 1, 16, '2025-12-19 11:20:57', '2025-12-19 11:14:21', '2025-12-19 11:20:57'),
(8, 'Kevin Google Mail ', 'Kevin', 'Google', 1, 'kevin.adametz.media@gmail.com', 'NIex1PbOgVlIL6GUfhq62QJx79yipDo3VcncBu23bSNukTmU4V3NUWlFsWX4L9L9', 'pending', '2025-12-26 11:18:38', 1, NULL, NULL, '2025-12-19 11:18:38', '2025-12-19 11:18:38');
INSERT INTO `partners` (`id`, `company_name`, `display_name`, `slug`, `type`, `brand`, `salutation`, `first_name`, `last_name`, `hub_id`, `parent_partner_id`, `description`, `street`, `house_number`, `zip`, `city`, `country`, `phone`, `website`, `logo_url`, `is_active`, `setup_completed`, `setup_completed_at`, `delivery_radius_km`, `assembly_radius_km`, `provision_fixed_amount`, `provision_rate_percentage`, `created_at`, `updated_at`) VALUES
(4, 'Media Matters ', NULL, 'media-matters', 'Retailer', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Deutschland', NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, '2025-11-21 15:01:15', '2025-11-21 15:01:15'),
(5, 'Partner M10000001', NULL, 'partner-m10000001-91', 'Estate-Agent', NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, 'Deutschland', NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, '2025-12-16 15:05:26', '2025-12-16 16:47:39'),
(6, 'Markler Klaus M10000002', 'Max Schmidt', 'partner-m10000002-104', 'Estate-Agent', NULL, 'Herr', 'test', 'test123', NULL, NULL, '', 'Teststraße', '123', '12344', 'Musterstadt', 'Deutschland', '', '', NULL, 1, 1, '2025-12-17 16:41:19', NULL, NULL, NULL, NULL, '2025-12-16 16:29:03', '2025-12-17 16:41:19'),
(9, 'roles.customer K40000001', NULL, 'rolescustomer-k40000001-93', 'customer', NULL, 'Herr', 'asd', 'asd', NULL, 5, NULL, 'Musterstraße', '1235', '12343', '2134', 'Deutschland', '', NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, '2025-12-17 12:38:20', '2025-12-17 16:43:08'),
(10, 'Hersteller P30000001', NULL, 'rolesmanufacturer-p30000001-105', 'manufacturer', 'b2in', 'Herr', 'Herr', 'Steller', NULL, NULL, '', 'Musterstraße', '123', '12345', 'Bielefeld', 'Deutschland', '', '', NULL, 1, 1, '2025-12-18 13:10:19', NULL, NULL, NULL, NULL, '2025-12-18 08:11:34', '2025-12-18 17:56:39'),
(11, 'Max Möbelmann', NULL, 'max-mobelmann', 'customer', 'stileigentum', 'Frau', 'Franz', 'Hatstil', NULL, NULL, NULL, 'In der Lake', '4', '33739', 'Bielefeld', 'Deutschland', '170206113', NULL, NULL, 1, 1, '2025-12-18 10:14:50', NULL, NULL, NULL, NULL, '2025-12-18 09:46:11', '2025-12-18 17:55:59'),
(12, 'roles.customer K40000003', NULL, 'rolescustomer-k40000003-95', 'customer', 'style2own', 'Frau', 'Steffi', 'Willmöbel', NULL, 5, NULL, 'In der Lake', '4', '33739', 'Bielefeld', 'Deutschland', '170206113', NULL, NULL, 1, 1, '2025-12-18 10:26:45', NULL, NULL, NULL, NULL, '2025-12-18 10:23:23', '2025-12-18 17:54:55'),
(13, 'Immobilien M10000004', 'Markler Max ', 'rolesbroker-m10000004-108', 'broker', 'b2in', 'Herr', 'Immobilien', 'Schulz', NULL, NULL, '', 'In der Lake', '4', '33739', 'Bielefeld', 'Deutschland', '170206113', '', NULL, 1, 1, '2025-12-18 10:36:31', NULL, NULL, NULL, NULL, '2025-12-18 10:30:41', '2025-12-18 17:54:21'),
(14, 'Händler H20000001', NULL, 'rolesretailer-h20000001-109', 'retailer', 'b2in', 'Herr', 'Händler', 'Max', NULL, NULL, '', 'In der Lake', '12', '33739', 'Bielefeld', 'Deutschland', '170206113', '', NULL, 1, 1, '2025-12-18 10:40:48', 20, 30, NULL, NULL, '2025-12-18 10:37:29', '2025-12-18 17:53:56'),
(15, 'Hersteller P30000002', NULL, 'rolesmanufacturer-p30000002-107', 'manufacturer', 'b2in', 'Herr', 'Hersteller', 'Moritz', NULL, NULL, '', 'In der Lake', '4', '33739', 'Bielefeld', 'Deutschland', '170206113', '', NULL, 1, 1, '2025-12-18 10:55:57', NULL, NULL, NULL, NULL, '2025-12-18 10:46:07', '2025-12-18 17:53:22'),
(16, 'Marcel Scheibe', NULL, 'marcel-scheibe', 'Customer', NULL, 'Herr', 'Marcel', 'Scheibe', NULL, NULL, NULL, 'In der Lake', '4', '33739', 'Bielefeld', 'Deutschland', '170206113', NULL, NULL, 1, 1, '2025-12-19 11:21:05', NULL, NULL, NULL, NULL, '2025-12-19 11:20:56', '2025-12-19 11:21:05'),
(17, 'Makler M10000005', 'B2in TEST', 'rolesbroker-m10000005-110', 'broker', 'b2in', 'Herr', 'Marcel', 'Scheibe', NULL, NULL, 'Hallo', 'Feldstrasse ', '59', '32120', 'Hiddenhausen', 'Deutschland', '015151002992', '', NULL, 1, 1, '2026-01-14 10:48:58', NULL, NULL, NULL, NULL, '2026-01-14 10:45:36', '2026-01-14 10:48:58');
INSERT INTO `password_reset_tokens` (`email`, `token`, `created_at`) VALUES
('kevin.adametz.media@gmail.com', '$2y$12$IhYf3kICgy7dvm87aafn/.dvRNljUgKu/vexzy/5bg3zTq.xSro7e', '2025-12-22 13:04:57'),
('kevin.adametz@me.com', '$2y$12$5gEsviH/d726oTzs5j74i.eX8swI8h3ecztBeRKigt6xZQq3Wc1yW', '2025-12-22 12:54:03'),
('register@adametz.media', '$2y$12$iu9JlwsSs3SCyyE9RyjaGeZz4JBVo87koc6RsAk29picU9pm.up8G', '2025-12-19 11:22:27');
INSERT INTO `permissions` (`id`, `name`, `guard_name`, `created_at`, `updated_at`) VALUES
(1, 'view hubs', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(2, 'create hubs', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(3, 'edit hubs', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(4, 'delete hubs', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(5, 'view partners', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(6, 'create partners', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(7, 'edit partners', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(8, 'delete partners', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(9, 'manage provisions', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(10, 'view products', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(11, 'create products', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(12, 'edit products', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(13, 'delete products', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(14, 'manage rental options', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(15, 'view orders', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(16, 'manage orders', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(17, 'view users', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(18, 'manage users', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(19, 'manage roles', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(20, 'access dashboard', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(21, 'place orders', 'web', '2025-11-21 14:29:15', '2025-11-21 14:29:15');
INSERT INTO `registration_codes` (`id`, `code`, `role`, `name`, `status`, `broker_partner_id`, `assigned_to_code_id`, `partner_id`, `used_by_user_id`, `used_at`, `expires_at`, `metadata`, `created_at`, `updated_at`) VALUES
(91, 'M10000001', 'broker', 'Max Markler', 'used', NULL, NULL, 5, 6, '2025-12-16 15:05:26', '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:08', '2025-12-16 15:05:26'),
(92, 'K40000000', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(93, 'K40000001', 'customer', NULL, 'used', NULL, 91, 9, 10, '2025-12-17 12:38:20', '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-17 12:38:20'),
(94, 'K40000002', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(95, 'K40000003', 'customer', NULL, 'used', NULL, 91, 12, 13, '2025-12-18 10:23:23', '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-18 10:23:23'),
(96, 'K40000004', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(97, 'K40000005', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(98, 'K40000006', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(99, 'K40000007', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(100, 'K40000008', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(101, 'K40000009', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(102, 'K40000010', 'customer', NULL, 'available', NULL, 91, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:08:58', '2025-12-16 14:08:58'),
(103, 'M10000000', 'broker', 'test', 'available', NULL, NULL, NULL, NULL, NULL, '2025-12-23 23:59:59', NULL, '2025-12-16 14:56:42', '2025-12-16 14:56:42'),
(104, 'M10000002', 'broker', 'test', 'used', NULL, NULL, 6, 7, '2025-12-16 16:29:03', '2025-12-23 23:59:59', NULL, '2025-12-16 16:25:28', '2025-12-16 16:29:03'),
(105, 'P30000001', 'manufacturer', 'MHerr Steller', 'used', NULL, NULL, 10, 11, '2025-12-18 08:11:34', '2025-12-25 23:59:59', NULL, '2025-12-18 08:09:04', '2025-12-18 08:11:34'),
(106, 'M10000003', 'broker', 'mac ma', 'available', NULL, NULL, NULL, NULL, NULL, '2025-12-25 23:59:59', NULL, '2025-12-18 10:29:41', '2025-12-18 10:29:41'),
(107, 'P30000002', 'manufacturer', 'asdasd', 'used', NULL, NULL, 15, 16, '2025-12-18 10:46:07', '2025-12-25 23:59:59', NULL, '2025-12-18 10:29:45', '2025-12-18 10:46:07'),
(108, 'M10000004', 'broker', 'asd', 'used', NULL, NULL, 13, 14, '2025-12-18 10:30:41', '2025-12-25 23:59:59', NULL, '2025-12-18 10:29:48', '2025-12-18 10:30:41'),
(109, 'H20000001', 'retailer', 'asds', 'used', NULL, NULL, 14, 15, '2025-12-18 10:37:29', '2025-12-25 23:59:59', NULL, '2025-12-18 10:36:54', '2025-12-18 10:37:29'),
(110, 'M10000005', 'broker', 'TEST MS', 'used', NULL, NULL, 17, 18, '2026-01-14 10:45:37', '2026-01-21 23:59:59', NULL, '2026-01-14 10:44:15', '2026-01-14 10:45:37');
INSERT INTO `role_has_permissions` (`permission_id`, `role_id`) VALUES
(1, 2),
(1, 5),
(2, 5),
(3, 5),
(4, 5),
(5, 2),
(5, 5),
(6, 5),
(7, 5),
(8, 5),
(9, 5),
(10, 1),
(10, 3),
(10, 4),
(10, 5),
(11, 3),
(11, 4),
(11, 5),
(12, 3),
(12, 4),
(12, 5),
(13, 3),
(13, 4),
(13, 5),
(14, 3),
(14, 4),
(14, 5),
(15, 1),
(15, 3),
(15, 4),
(15, 5),
(16, 3),
(16, 4),
(16, 5),
(17, 5),
(18, 5),
(19, 5),
(20, 2),
(20, 3),
(20, 4),
(20, 5),
(21, 1);
INSERT INTO `roles` (`id`, `name`, `display_name`, `icon`, `can_be_invited`, `reg_prefix`, `reg_description`, `reg_start_number`, `guard_name`, `color`, `created_at`, `updated_at`) VALUES
(1, 'Customer', 'Kunde (Customer)', 'user', 1, 'K', 'Kundencodes werden Maklern oder Händlern zugeordnet', 40000001, 'web', 'indigo', '2025-11-21 14:29:15', '2025-12-16 14:56:59'),
(2, 'Broker', 'Makler (Broker)', 'home', 1, 'M', 'Maklercodes für die Registrierung von Maklern', 10000001, 'web', 'lime', '2025-11-21 14:29:15', '2025-12-17 12:00:39'),
(3, 'Retailer', 'Händler (Retailer)', 'building-storefront', 1, 'H', 'Händlercodes für die Registrierung von Händlern', 20000001, 'web', 'teal', '2025-11-21 14:29:15', '2025-12-16 14:57:09'),
(4, 'Manufacturer', 'Hersteller (Manufacturer)', 'wrench-screwdriver', 1, 'P', 'Herstellercodes für die Registrierung von Herstellern', 30000001, 'web', 'orange', '2025-11-21 14:29:15', '2025-12-16 14:57:15'),
(5, 'Admin', 'Admin (Administrator)', 'user-circle', 0, NULL, NULL, NULL, 'web', 'purple', '2025-11-21 14:29:15', '2025-11-21 14:29:15'),
(6, 'Super-Admin', 'Super-Admin (Entwickler)', 'shield-check', 0, NULL, NULL, NULL, 'web', 'red', '2025-11-21 14:29:15', '2025-11-21 14:29:15');
INSERT INTO `sessions` (`id`, `user_id`, `ip_address`, `user_agent`, `payload`, `last_activity`) VALUES
('0huO5a1xpWmxlnrpkKrgpqXj5ca5wS9wIbYQWFxV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoic1ROZzhGaDlsUXlqN1RKa2NMQll5bldEb3RBR3BjeUlsU2t6MHB3MCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888218),
('0UpRd4WBu3YZfSoTD2iEMAOgpOpCfht892vB2Jsy', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQ0ZWeEdESE8wa045OWVUTnFtcXlhTjhET1hwc3prTkdnbUVyMzMxcCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893558),
('1mfG4zcnhBzJsUw6fvGHtZ6sxFdSLmG9BLTkwQhh', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidEJjaFRaSGFkeENHQ0pSUGlWNEZHTnZVZFNIOVlQNk1KQUFsWXB6UyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896858),
('29AG8gEyHQDciOCElbPLuXNrRfRXyj8yETt6UNIJ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiTDB0ODdqZnR5cFJIcTBtVFl3Y3pZYlVpMXVYaU9FQ1hhT1RjNnpKTyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891158),
('2aIJbh31nGmC4TjS2RIDtFF6CDG89Nb12tpY6ikH', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUlFKVkpnSmM3SW10RGt0RGFxQkVQMWIwNndmYzQ1QmttOUVBa2gyQyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898358),
('2C7o9my8Vr0O1tFqTSdxbjNQWqY1xsqut0TAouUQ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZ096c0Y2dDVzTVRnNU5hOGRUMXRCZ2JKenYxcG1oRDJ0TWJ4OG5iTCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770899351),
('2kU2RYTXaMi1sVdydnwRZXTU42n77yyuJCH762fT', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiMjlHRHE1all6QWJLbzhsTDVOZmVRT2xSSjFGaWxOaGI3YWVJNzM3SCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894158),
('2x963ow1cJfQRL8EdS6EmRiK5krZB6gPKzXIcQIR', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoienhydVgzckNDMG16RUVIUFN3d1dyRkQ2dFFjREhlMUpma0dtYzNEbiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891458),
('3i70cWhdRfoMWGOpd5UUEb0dP64j8zbMclVT95FO', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiVHB1RUlZOHZlQWtsbjMyREEyZFlxNHd4ZGxKZjg5NHp0VUZjdzFpaCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889417),
('3RzYrkluCGlzGBKI2yUnLWhA5yC4KGS4hbpFpVyF', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiVFZGdWphempFRmhXOTQ5cjljZG1mVHFtVDU5QU9kZUFkTkxmR1FnTyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892358),
('3tHD2TAW8rxbhcLlIdjnsKvpokHBDGchcJOpAwkL', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoibHpwN0dWd1hEY2pNQzFvQWxRNFBpMTVVYWhJNWc2bnhmYmt2em13MSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898751),
('4QQAd8detC8ozTbhUCV3sWJADdhUXCx8fOeieb4M', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoib2kxVm05ZmhyV2hQNGp1U2lONW1WMkJiWHd2NHVYOUlBbTRrRmN5UiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892658),
('4ZGKZkqyZTN0KpChyUvF4Ihxyat6Z9DtcnXOlxpj', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoib1FVaG5kSFhDS1piVmgxWjRNWDExSXoyQlkwYWc4bTluWTU1QVVzRyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891875),
('5A1uKPmt3e6RAP4G0LCgEA70FPhKfqGURV5qefUm', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUER2VmdmakpJN3FEeGJlRXRudmVWVWV1Wnc0RDJVU2ozMjZnOEh0diI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890675),
('5lCoHQdA3kKXtKf6jQ6uzVozSGrmCEkUN50Wxsy2', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNUFEc1duUkdrVmlVMGtURVYzYlI4OXFVSzJ2ZEN2clY1YUZGUjROZSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890317),
('6p8Y4gMO7wdnU5nkvleIgoVSEGdm0XVk8eKDwa51', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiamhROTlwSzZuWVlQallQcEQwMW5xYTVwVlZWNWUzeFZNN0Q1dEd3TSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890975),
('6sC9gA15xgur5req9vRByCfMLTdYrfvtufnIKnIr', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQmdjZUROTjJVS0VwdXhXTjZXcnMyVDZiRkdGYUdhQjRKYnRZNkpzMiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897817),
('8LfsT9HCYmUHIHqdz79eltf7yMwNGva0EJ0WlMsR', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRW9TdWV6N2ZjZjFYSmMwQzZsdGlIZklIRTdoUExNVXR2bm9kVW9YUiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895358),
('8OMiHrgJhv6cQTulbuHlchXBtjwJPF6tFYkT3XS5', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiMGI4UFFjd3RQT1ZQN2RkWWdkVmgxZVNqN2NOelVkQk5YTkNFTzlKYyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898417),
('8TpgaVNz29gQTFRKrhgcUYLV2qp58rYGtoZ0118Y', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidzEzQWVpcFEwYWVjTlZuTm00MDh1QklxOHl4RnE3dWJUTzdYeUFrdCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888817),
('91J3E4136NsVeEnpJwTzBPugCIGG0wn2qlyZempc', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiMXlzMDl6WmExZWFVSnk2Qkx3cm5kUFZ1dEE4WlhOQWhRcnpWR212TyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895658),
('9oNilyBrDzjJ2Z4VQengVGYtXfxr0RRU53s8aJc7', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiU0hNZ3p6cjF0UElMTzhKYjVkUHVKYlYwYVJneXl2RVFNTmJQM2JHUiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890858),
('9qLF6mLFvQlk3ypkH5hk9jfEiuaqJoox1k7L7lLO', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoib1RIWEtaMDd5anRtVHhlaGxLcEJQV1lVWmtMYkltV0FnZG9abWk1ZyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897217),
('aNpsvmFzYCJH9VTKZERRKchHa9xsXuxSP1r9L8Ph', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRFB5elF4b3FOYXRpQ0xUWnp1MjlxT3VrSzdnTml1dnY4SXhkYmt2ZCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898958),
('AoYQaLv7lQzMtoMZm5g5qw0aqQx2CzBQzSgb4ip4', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiS3VZem44MzExN080a1RoQkZKa2V4TlVGWFc2Uml1U2l5MGtpbEVYVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888575),
('BqybQ9CMqFhdVaoZFXy0QeAtpn8FqlXalxboSzFL', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiekFhWTlXWHoyV2pkS2NOcTRHMlpqTlRsR0JocWx2dTRGMlVWSktQbyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893975),
('BTubnX73ZYn2tjkfOdZiQVnSmhmcroLEs2Rx29uV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUXBJakZJYXc1eFJ0Q2xTREdXOGUxVkpiTVJ2dzhISFpOVjdoM2tsZiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894875),
('c4brHlD8wkVOrRGczWOFdyxD1vw3f59349opAxN2', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoicWFmdElZUU9JOFdJNDhhTkhmdnRUd2FadGpkQlFDa0hsSlNsTjh4NCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892775),
('C7OYo02nIPH0oTkQw8iAPFAFMSnmUKbWN297Tz0q', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiM1VlS3FERGJsREt5WVZ0VU5YcnhLYkhtT3B6VUh2SWFaWUh3WGRmdSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890375),
('CeDHUP2OBjaZ3cLWvB2iIbWc67OB1vqRv2MXWVia', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidlVmdThyN0drNjVLTnhtdkVEOGJaUWVwUzRYUlAzRE1EdnlicTZBdiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896375),
('cFF20EbpZzpRAbCzAngC9wpgOvZ2q2XbC7EFAKSq', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQ3BzcHgwZlhHSEE3VXQ1NUxYY1VNcktQZUEyYmMzVDJWVzV6STdDMiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895175),
('CIa8LSJaszWC8H4icDTxPgPtbuUFTDo1tSPzdoVT', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoic3N3TlRSaWFqdERJZXRnRVNHUkYwYWVqM0puZXRhUEk4QndGVHVWdSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897259),
('cIBUz3d7CgspaTtbFwDF4Y7OPgVhYdUXCiGXFf32', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZDVWOW9kSnRDSU9Fa1BtVW9adVpKUFhldmh1Q256NnBOQXQydkNRVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896017),
('cXTtz3be3xTHL9DEq9DEaDbxPZyClPH37Yru0znm', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiVWp6MUdBWTZmbHBLbm5aN0FpMzBrZXhYbkhBN1JoczZmb3ozRnhsMSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893258),
('d0mXDFkdIa1R7HAoiJDgRPlqCWGmNb1Tl2RD9S0p', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZGtUUEdNVG5HOUFxMUFXZGZsUjF1VDlmYkpkdWs1amZFdGd3aHB4QyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892058),
('dSvVQ8pZn64bKlO11VpSl3nD8cL4NWS5cYBIUejz', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiekFUaGRTQ29oMnNnRnN2ald0OUloWmpiSE5VcWxUbkpRVEs0QzMzVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889117),
('Eh366oDSMXbex2GYLdyAMMp28E4QpNRwtlV5166E', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiT3dUOE9hblhYVGRvcnZwaTRaM1V0VmJiMW9vaEZhMVdQbndaRVIwbSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890075),
('eOlC9oRC3fkO8AGRKZQOJAdIQg8sRsevc7796M35', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiaFp4bzBPR3B4ZWRnNVpnZTBiQmJSWWFVZEJTcXJYOFhTT1dKWHY5MSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896258),
('eXgEDqrzmQhWfZzoZRsySJ25xKigc4Or7Y3rqsCn', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiTjlIS0l5bUFEa1FOY1J2YlhSbFA0YWtJc0tSRmVoR1o1b3F4NTZjaSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892175),
('eyp6GBhdkc9CJvWaHI9hkovPNkFvfAEhMlmVR9eK', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoieVptbVE1c2wxeDRjckR0cjFlaDBvREZIelBla1NXMm9FSmdRMXBHcCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897851),
('FgMOZcfwL4ysQQD8tva4gjLhzC5cGjp3VJv7icTH', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoid2JxUUpiM3FzTHdwRHRiWlRMblo1MU5Fc0VTY2tyQUJpd3V4ZGx2SCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770899017),
('FlHpVIcqvcThZWw1qJh6dQ4GnqUMMJxUfvrgbUZV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoibkhMZTltQ280YzE5RDZzSVg1bWRDelpQbTZ6RTFNWHF3eUhnYnFqTiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770899258),
('G5E9C9wEKeozXK4A5OGBluRRCg15pIkwJKAZWWEZ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZGNvUXRORHRtdXR6b1ZDY1ZqOTNQMUpJWWUzVTlJRzdQVmNxTjhRdCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889775),
('GcSesdMFKK8Bh8nI6SsEtTknfBIkAzMo6H7jrwzF', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSzJISlBpSzNuVEw5d0JLTHg1eFBxVkZqUDRicjJjMUNPSm9wazNWNSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897158),
('gu0HL8M8MCPvgVxcmp9axlDG6kgorNTXwNv3mx6i', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNHQ3MTJnejI2VHBRRHZIMzFUTExtVTJYemE0WWp2TGk0czM1UGp0SCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888458),
('hBteSDpylzOcPUVaxQvCSJqbS44nx6ne9nV8J8k9', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoic0hBaERhbEFtY2VWUHlZdDVnMHVJWmZiMURheHk5Q3dBWFFMWjVoUyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894758),
('HgR0OcQuasPkVG6POsjSz1cDh92fKizyYEXIOHP7', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoia21BN3dVS3h6M04wcmVKc28wSDVwUkVTMXBlYTNkN2cyZ2FXQ1c2SCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889717),
('hLyEP1DcNVqv58ESjF0FnTmyEmSQEo9DzwAdm0sA', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZlg0Sjhqd1RVQWcyUTN0c0F1YVkwR2JWVklob2JWWk96WGJyVzhFbiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770899051),
('HP6y0mHvND0ULOtGNEXWEElAv6GXnzMyRVx7754Z', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNnRiRDVkWXhkdHRVZzZnUXo3VDlDY3d2bUhBSjl3MW16bWJndlhHWCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893017),
('IMa3AKgj1az4hxLdrQkFuCNbaobrYmmpOaAUCKAq', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZUoxU2gyREROTFVDUkZsV251YW1NNmR5MWQ5QkNuUU54U3Y5cmt6byI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893917),
('jDPslLnlH2NmyHQFWwbdjUzHoKK7qkB1iS88rgX4', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUndkeElDdzBhaUJ2UHRsUlE5MDExR28yOU53Y1RnY0FGVWFVRHJlZSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893075),
('JInHwzIsogZGMjM7JvpLYodvwrsrbxQlvPvDFYYm', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoibVJUakZnQng5QTVzMVpTQk1YWEg3RkczV0c0R1cxckhUaFBBNWNxZCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892117),
('jS9pX4BQ0Qqg9lOht3qusanQJcCm0zOss91AVype', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSnRyanRYSlpVd0tqb3A0UjlqMVFBUXVlZ214elNDNXZhbVRkMDlpNCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891275),
('Jso8pDszg2F9pVWJTZjAy4P46sq0Zis5NUe3VyDY', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQXFYRUZYSGlBalYwZVhjMzQ0SHpHQ1BnY3lqZEJqaG9JbHBYSGlEOCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891817),
('k9t5OmgNZ3o6ALMzRpv8oJYXZ6raO4hwh824nZmF', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoib01vQ0lHM2Rzc25RNWwwZ3BEblNwcHFlcG04WTRJcnBua0l5a0pJYyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898658),
('KQtnbX0ps8RcyBiQALGxbmxWCoB3nBI3IynokhY8', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNXlqeFZiZmVXcWNESWdIcUpwNE5MYWxwV25PMlZhU1ZiOGdMVTBvdyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888275),
('kXzYgZlkX9Ty89v8Ncgk41bBP79rV5Pj4M3k7gDS', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiY3FGUWNGREhiaFdNZW1iUmJsMUt4MHRvdXdGVHpTaVBLa2k2SWdHQyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888875),
('l7vKalTwRIBfflfBy9BgsrWqwMdMaHgxx8fNfeQY', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoid29YY3RwT0NlZHlaQTVpY0R1aldBUmkyTktiNnhxYVFOYU5ONVdVNyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896675),
('l9e68A9h5TKcOQL98SyjDcF1Qhtsi12cpizoKDM5', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiTWVrSEtQTERRVVJ4N2hRZ0RVbXhhSnN3ckNkd3Z4QnQxdk55UWVGVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891575),
('l9Rc4PHRFNp9mMmA9MHuZJlqCxfIWyfGWB6cykbf', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidEtudlZ4VWYxVEYwYndGZXdyTjRZRUtLbHBXMG42VTZIRWJzejJ3dSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891517),
('lDDLAiZdfLXG2GkAdEvmY3TNnl0sIyqGOYh57YhR', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZTdqRlpvMkh5a1A5Ykg2ejhBVXZaTll5TWhSSEw4ZXN5NkZxdENlTCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897517),
('LlzqhW7M0HfiRL5DICGWOoBEfCdHHR9nzqWnXzCg', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidnNvd2ZUMXMxRzV0WmZ0eG1FTDZYOWhTQkxBeHh1MVZmeEVpMVpHZCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897458),
('LooIygMnhJUtVAnOOiACU874jAxEiZ8dR6CbwHjE', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiTm5PdzRNYmkxVFdNb1l0UDN1M25tbm9LSWQyb1VkMDZIbnZDck0zcyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889058),
('lpTObHmcAQIA3ZDvZnWV8eWm0XZmjHzQW0iD34Ug', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiMmdLMFZRRnZJeTRvTkhlZUhBd2pxcG9mWVByaFp2bHpqdGNwc0xVaiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888758),
('lt8CPWxNN44jLKJqvOV9kpPjmf2ZAKackMVx3BRZ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiWUlUUUU4T25tRWZxbDh5WlBOeDJ3NUZKWXc2ZWZhbWgwYk04M3ljTiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891217),
('lz2Bs1LYrxIHL3bcaxd0BWqSjDyyslO6r5Pk1esI', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidTZWOENBUmtCNXJYWkxuME9HWmNtbGdJUU1qM00yb2JGU3pFVDZrSiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892417),
('mk5t6GUZQdwLACpHtWfhA31qCCpXsnEXrzzsYp2J', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiOXpDVzBCQWtPN1k0djhDTEZVSFZkZmxSRENDbHJxblB0TFRSaklZTSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893858),
('mMwtSoFVIF21ALXxtaCB2RLuOx4wUQ1uaG1ubk0x', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiTVJQOGd4bkpGWmlQWkFWbGRwTlZPRzNiS0hhNHhmemF3YlZJQnJXbSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893375),
('MmZN6m2tHUq5I1c92HECPDDn6AdFVl0uMAQH2AGr', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSmlwUjZSb2VwSjhJTEZGNzhXUTU4Q21VY0dyTEZ2b1VQQWNpOVdndCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890917),
('N7lmUFMMlk2zDRxgRgiSRhr9gsS08vkPNkcvYw0z', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiYW5ZS2tYbFhubENvZHAwQnV6QjFBMERPWWo4c1FTMHoyV1B2a2JVZSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898451),
('NApkvIjH2Ddsde980dc6Ixqv2gZzBATc4o9SJb1S', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiMzJ1WDdmNEdWRlJydFdFRTB5VWx6WmRvanh5dENrdkM3UWR2UWZnayI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898717),
('NumBSlSnSQSjK4tg0RumH7honcRJULg58aMvjott', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoic3hrdkdxZGtmZTRhOFZyZkN2YlNsNVBQMUFrclFoTHpsYzlzSWw0UyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895775),
('oF0v0FYSq7UAUZtwIlerCnw4n7Q5FdMvnCgE59OB', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiVWw2ZFQ0QXNXSHBtOHIzTEpkV2I3dmVrVDIyV0RvaFBFTzRrMEc1RCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895475),
('OJAofVisLmIYa852HcPzejyPZXv9ASw0P4DsYlWp', NULL, '217.247.92.223', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Safari/605.1.15', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSzBZM0I0R3d1c3FhdEdrZFF3OHBmSmhZeVRadEtBcE45dGgyNndZVSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894304),
('oPFxEYcFQCMqVQv2TWB5cmk3vjMUlBUyeQmuz7PO', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNXJDZXpZdXVHcmI5M1NmQzRVQlhMcDk5dm03RDd5SFRrTHU2bnh5OSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895117),
('p4SFcptT4eHwRPVkdF1ScxGc4fcOiNXAFO6LOSNI', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSGR4RUF1aXB0bGRpcE1yRWlDbnFOUUZ6c2Z0Q0NzcmpjNGw5enNoeCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896317),
('pf20KuoXcP5AHSvjwYB6q7JjHR8ne2Pgy46jAdJs', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiOFZmTkhob21MWGxuOVIwdTVzZm1WWWltcUVqT1did1A5YUxkQ1dHdSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896617),
('PL0UhTU2esJUbJu04Z5gLgXFIaeMy9OsmiPCm6qV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidXpOWmJTTHRkT29yQlVJUDhmcWJpbXo5U3VadmJ6NzJZeGROcGFlbCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890617),
('PXWvxrOu2gOKZuP4v3DHPA9xNCaNQ9o5htXH073w', NULL, '217.247.92.223', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Safari/605.1.15', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZ1IyQmd4SEt5QkJkQzBFbk9UMmFOMnFvQkk5OGJKenB6YUh2QlNyUyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893896),
('QaRS58xbomKpHGcb1rEwNcloXZRHE3PV9oardrtY', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiYm5TYldxYXJYRmszMDd2MWhybnNmOHFIdlRsSlVNVXN4UDdYYUJ1MyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770888517),
('qd0n13mKU9DBVOa8bLynUCOEdHv75wOBFXLkBgPo', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoic09JRW05OVlLSHkyT0QyQkdXNlE0eHI4T2dBUmJWZ1BUMzhGUmNFNiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893317),
('qFYZxfPav6Q10jcBfvFqSiqRPSI7W5KQTZlMqUZh', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNjNGUEFYdEtBNTdvakdjWHNUVHJiSjNWQkR2N2oyRUFMMmRXOHY4RSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896975),
('qZvBpSeIQ2Q25XyGlDYjE6fTTv5MmQNbVXY4d8Ec', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoid0h4djllSlRvVzNGMUFMUTg3N1lpeXVSV2U2MTJCbWsxMDhaeGhXVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895717),
('R0kvDZLH3gvxsUjgdcWUBk2JGxb6rR6rSEHqlOPV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoid3k2dDRLTXJvOHlMUjlrS1Jjb0xuNzVvZmJvcFpLd2x4WTEwYU5TTiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770899317),
('r1H3FmzZFodfSLypuIi2m5ezfwUmk1Zw7xjOAn5d', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiR2Nsb2pGbEhLMkI3Um55eGdSNU5kQWZxTmtFY2Nwa1ExUzZ0Q1poQSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892717),
('RvmD9A3MVydxAHja3kqknaEf2wPdFce6kdVftjP0', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiWVVjRmRTRkdMN0tZWGVqcTZUNjZIZXNzZFBWckZPWkhEUU51UTJ0TSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895958),
('SCRhdcSLdYdRDP2YEmUNBbh3fRS3woXi8BOip8wE', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoieWpxMUlwUkhqbzBtSldpTDk4czUxQVFuQjZsYzRDZWNXWWNpTER6eSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894575),
('Sd849ETQZyIfoLm4gjnP9Dk7hVT5gMYs280aiImS', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiclVZZmNsQTVaVFFrMXVOQjBZQWhHeTRKbHVWdzM1dTA0c3BEVjVSRCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895417),
('sXTeXAq5vyAFksx6WB2a9L6djxoUOzwifoJ4xjB7', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiclo3Wk56UDRwUXY5dFFKSnJPZHJyUGxxUEV1aE5LSERKejhFNWlsYiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889175),
('SxTSRmk1i2AQs51n8kMGqMr0j7yNd9MkQjzLyibw', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoidTVPMnBYdTdHSXBKemNDZFJ3dFNOZXZxN1h2bE0xVXdDV2tTYkJFMiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894217),
('TgUtqzlmrZSLNe54Mg79mExW2SDnZSLOnl3CSudC', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoib21LMmE1ak9BdzZ4TXdsekZLSGtRV1dobHZPQ01oTEc1M3JGWjU2OCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892958),
('Tl5hGICX8Zsw9WHy5rqAqEIRhBMrGgQ8wbRK6jJa', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiam0xTTVkNTJqOWFNbG1BdklmdmRmN2ZvWUdQRVlCaWRzNnFmc2E1TCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898058),
('txO09F5MSJWmAVZU4CHAGfsRXt3DipZEFPgzy5nW', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRmFDMTBpcmN6eGRvOEtLdnFDSm1CTnUzZ0EwUGNROUhjQjNoTzl5WiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889475),
('unZFx6D6ZSCcFZOdoVARt5tfAtM9MAOqNk00aWin', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiYVU5QXFDdllEOVBtQ0dwbnhDNWlHR0c0anZwVDJSZUE2MXdLWmhUaiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898151),
('uUeUxNx1adGYfuqOdItepv5VR9MiCp1NmVJSLmfc', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQnhTODBkMEdBc2xQTTJsTFlOTDFBNmRCVWRhb2hveUJKS1JGREp4eiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770898117),
('VWAryPuhUrfUtwlnn1Y589xfmrreAkhHZD6jC2Ma', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRzZ2OU9NTEZES1J2NXoxSVdhQ3pjbHk2alFtUVpqRDlJdjc0VUIxVCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889658),
('w43XLXjbEGJ5Gt48CPEItiMIsH0DLTSKTXMwFBYJ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiSld3bk1naERDZHI2YXZZNFNqWHcwaHkxUUF6ZXdsR1I2ZlRFRWVvZSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770892475),
('wlEy6q5aC4nvdyO7TwYm6hF6AmOyOrkwVrKF8Lsf', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRXZVU0c5T1BENmtVM0pHSVBNMGo3M3VZUnJwSU83SlJiWGFjUEpNTCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770891758),
('wVwr2XlsBJjA7n7zetI2xlLN61THLAxdzRTQBUFN', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZHBnd3lRbGhYTWVjdFNsOEI0MHBBQ0ZQMGZRR3FHU1daNTRBSzh2QSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896075),
('WxkbleraHJTrbMFi8l3NgLm6b1lZXJSu3u3VRDOH', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUlZSRnNCcmN2UTVWNVdnelRkNDhJendiSURId2NySVhZVjJMTFYzcyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770895058),
('x4bniHw7lcVxL4HF2QVchZtqMCeI58nzJd58VeYk', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiN3dCbzNDZllVeHpGWFBtZWlLckMyeDZCSzltV1k0RWNpN3oxNFBPdyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893617),
('xBlCaVciNEMab8bOjrCcWMSkrwfspgNIBSVWELuJ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiWERIRm93c2dYOFoySGFUcWtzYzREWGhGek5JSm1yUHBOM1FZeXJPVyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889958),
('xfxeWMSMhNi22ZHIxBgduEVmzblm9HmjKZbgcxqK', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiUDZlV2swdVFHa0VKTjJpZ1poWXBrT3E1c3dBMlFqRVllWHhzMEdidyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894517),
('XlCI1lrTeY1BfVMUSiB8jTGRZbIu7PRmbv3Gh7PH', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRnlnWkMxRmh3Z1RIaGVXTEpuSzVLa0IyTXJjRHVkSWkyaDBKU0dtMiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894817),
('Y2Ne3iwNnn1sA9d8hNZNI7Vu5olufudeHusj2RJd', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoieWVNZkw3dFVlbW5rV2ZYWmhsTUlyNzFyaUhSbElXeVlOQVNnbllyayI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896558),
('ygU9p3gZHwaH43hPmRbScXJaYwdYHvToKIzr2lgI', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiaHlKcHBLcFU2azVUZXBYemxqNmdOVFJNNzdaTzFJazhiNldDTzVQcCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897551),
('yoSOtQHf06FXRSe74QUFugJXNzwRX0IJi7zYKMm7', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoibVNqeFNlQW5sb0M5cnA2RjdDN05GamZKVHQ4d3I4MUZDdHV5d2wydyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770889358),
('yYwq5XevpDMyHn0CT1QwwhrlKfa1lbkjq948hZ8S', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoicVdQUXFqMEVWQWxPYlY5blJRZDlncmFtQW5NaThXb1ZyTkllOG4wQyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894458),
('zAFbdCVZ5OQSxGW3UEPTnR8wDHn4sqvMd6ugk9T1', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiaVN0NG5SZXZPNExTdFJYUTF2cXFmTUVINENQNjVDa2RYOEFBN2ZqQSI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770897758),
('ZKgpRQXsAqj2ayCFhVvNcoElI3CHRbzN8mLC1ZDB', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiNU1HcWNXWEpYMnd1VlE3MzVEM0hVSVVCODdIbWMyajlEdkJQS3VRMyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770896917),
('Zq3toLWErj9cra5NSHllsxz536gYBymo13alO1gr', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiRnN6VGlHOVhJampRR2FFMjFKdko5eDNJMHhYcnlBNHN5OHRjcXJGUiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770894275),
('Zs0vKBUFZCwKODkfew9bPYHX8qUVsmGJ6fdXy6FZ', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiYTVIQk5uak5JMGxqT1NCNFFRc2YybURYaG9SZjUzTElDZnUwTXVqQiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890017),
('zSZAawZZYkeUEMxSc621cjGmqSUEu1Fq6eMmSaQu', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoibU1vbkNZck14V0kxQ2JtRHpGakQzNEZhak1XdmkyVDJQWlAzSHNPcyI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890558),
('ZtLs4MZDViAkK1KvY4p3k12zfbcFerxaDd8FIMRy', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 13; YDH-028E Build/TQ3C.230805.001.B2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/144.0.7559.132 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiajVxbDNjR3NhZHloNzhlckF0Zk9idDRnWmFnSzZlSE02T2RKVDVOcCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770893675),
('ZUbfueGlLUAWtWWkjnhRVNmdnzd0Qm87gWQrvEHV', NULL, '88.64.208.156', 'Mozilla/5.0 (Linux; Android 9; ZC-339A Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.179 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiYWFHb0daem4ya3VTZFFPNjRoUjV2UXZYd2ltTE1KUTdmOTdpSmhUTiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MzQ6Imh0dHBzOi8vYjJpbi5ldS9hcGkvZGlzcGxheS9jb25maWciO3M6NToicm91dGUiO3M6Mjc6ImdlbmVyYXRlZDo6YjdoeWxRNXVtZFBaZkFvaCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1770890258);
INSERT INTO `users` (`id`, `partner_id`, `name`, `display_name`, `email`, `email_verified_at`, `password`, `two_factor_secret`, `two_factor_recovery_codes`, `two_factor_confirmed_at`, `remember_token`, `created_at`, `updated_at`, `deleted_at`) VALUES
(1, NULL, 'Kevin Adametz', NULL, 'kevin.adametz@me.com', '2025-11-21 14:29:10', '$2y$12$pw7z0He1cIJ/owZOJWYu8O.d6dh6uIgH1tQeB8EiAS7PE3iwnL7Si', NULL, NULL, NULL, 'aznSzEV51VHUf5GBlkykgRKRpGW8zQaMHdS792uoCXg5zySz8NGI3YxdBwwo', '2025-11-21 14:29:10', '2025-12-19 10:58:54', NULL),
(5, 4, 'Gelöschter Benutzer #5', NULL, 'deleted_5@anonymized.local', '2025-11-21 15:01:16', '$2y$12$UH.TScgahDROtFFDI/vkw.hZvXUrmStdyaDRG85I1kAHBpcQMYZSq', NULL, NULL, NULL, 'ZB4rw542j7Uq2rcvoFz0NLa4ldftZvW5yYqUmGtkvGclZsxma0S5kLC9KWQt', '2025-11-21 15:01:16', '2025-12-18 08:07:32', '2025-12-18 08:07:32'),
(6, 5, 'Gelöschter Benutzer #6', NULL, 'deleted_6@anonymized.local', '2025-12-16 15:05:26', '$2y$12$UD3ivNt9uqv.TcooAf.jQOqeCfhX1aXRABGYvCC7XLznhqrbm681.', NULL, NULL, NULL, 'Lega5Eb5bhmGYVT5z6Fkzf7wuF9GwQLG1VEoerP7yvhz4YfrLIEcibDZxOOv', '2025-12-16 15:05:26', '2025-12-18 08:07:20', '2025-12-18 08:07:20'),
(7, 6, 'Gelöschter Benutzer #7', NULL, 'deleted_7@anonymized.local', '2025-12-16 16:29:03', '$2y$12$DmnePN980lksdVtWhL6HyeSD6sJ3oGoRKq3pqs4UV0ADpWUYKQq3e', NULL, NULL, NULL, NULL, '2025-12-16 16:29:03', '2025-12-18 08:07:16', '2025-12-18 08:07:16'),
(10, 9, 'Gelöschter Benutzer #10', NULL, 'deleted_10@anonymized.local', '2025-12-17 12:57:18', '$2y$12$q0O2UymzIdLS3zr.rvMib.QBoeo7tPg3K9YM9a5bw5zx0gi9OHbta', NULL, NULL, NULL, NULL, '2025-12-17 12:38:20', '2025-12-18 08:07:01', '2025-12-18 08:07:01'),
(11, 10, 'Herr Steller', 'Herr Steller', 'info1@adametz.media', '2025-12-18 08:11:52', '$2y$12$HpQQMRo6dtQHsJC0ZNpBxO6pKRUpAEZnIXBEYdF4i5TC4j0P6alUa', NULL, NULL, NULL, NULL, '2025-12-18 08:11:34', '2025-12-18 17:51:08', NULL),
(12, 11, 'Franz Hatstil', NULL, 'info3@adametz.media', '2025-12-18 09:46:11', '$2y$12$2EeN31d8rapcACWOsVWON.j6AeTJ1puR3VNWUE3e.wDsklwLT8jom', NULL, NULL, NULL, NULL, '2025-12-18 09:46:11', '2025-12-18 17:55:44', NULL),
(13, 12, 'Steffi Willmöbel', NULL, 'info4@adametz.media', '2025-12-18 10:23:38', '$2y$12$VCPjieqeb9aTERmnVd6JJ.koqOGGokq0k2143u1e6FjKrHDKrER2y', NULL, NULL, NULL, NULL, '2025-12-18 10:23:23', '2025-12-18 17:55:13', NULL),
(14, 13, 'Immobilien Schulz', 'Immobilien Schulz', 'info5@adametz.media', '2025-12-18 10:31:14', '$2y$12$i4sN9dx9XGMgTyh3dG8ice38bpqqcd4OQ9ziw.uxUI7O1iK4e1c1m', NULL, NULL, NULL, NULL, '2025-12-18 10:30:41', '2025-12-18 17:52:20', NULL),
(15, 14, 'Händler Max', 'Händler Max', 'info6@adametz.media', '2025-12-18 10:37:36', '$2y$12$9FibRJHcYDXZ5Uvp.yL3pe21eEUXIAfsFUjKsNiSb.wYBOJnI1him', NULL, NULL, NULL, NULL, '2025-12-18 10:37:29', '2025-12-18 17:34:16', NULL),
(16, 15, 'Hersteller Moritz', 'Hersteller Moritz', 'kevin.adametz.media@gmail.com', '2025-12-18 10:46:20', '$2y$12$UXIpAVmxUAKerqhdXQt.gebMM/NEbSi713Fq69XsOpmnbbLMHIW/a', NULL, NULL, NULL, NULL, '2025-12-18 10:46:07', '2025-12-18 17:34:32', NULL),
(17, 16, 'Marcel Scheibe', NULL, 'marcel.scheibe@bridges2america.com', '2025-12-19 11:20:57', '$2y$12$pw9PjzTmlWnC1wJ.ioD69OhcV8kxjQTDyKUk71rnP8kiweViEpeRe', NULL, NULL, NULL, 'pHLCoFTBHJet4D5aeoBGl20lNqOuXW1z4g5J7uiaSMFQU3jdXmWOAv5nMFH8', '2025-12-19 11:20:57', '2026-01-14 10:35:09', NULL),
(18, 17, 'Marcel Scheibe', 'TEST MS', 'marcel_scheibe@web.de', '2026-01-14 10:47:04', '$2y$12$b1wZQv9bBVet3RwzIU9uaubHmo7TTC/C/ECro.RBUSAy/CRKy/1AC', NULL, NULL, NULL, NULL, '2026-01-14 10:45:37', '2026-01-14 10:47:04', NULL);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

View file

@ -0,0 +1,983 @@
# Entwicklungsplan: B2In / Local for Local Marktplatz-Ökosystem
**Erstellt:** 12.02.2026
**Letzte Aktualisierung:** 12.02.2026
**Basis:** konzeption.md (Version 1.1)
**Status:** Phase 1 ✅, Phase 2 ✅, Phase 2.5 Produkt-Bearbeitung ✅, Phase 2.6 Refactoring & UX ✅, Phase 2.7 Admin-Produktverwaltung & Freigabe ✅, Phase 3 Kern ✅
**Docker** Projekt läuft in Docker, root /var/www/html nutze php artisan ... nicht vendor/bin/sail artisan ...
---
## 0. Umsetzungsprotokoll
### Phase 2.7: Admin-Produktverwaltung, Freigabe-Workflow & Statusaktionen ABGESCHLOSSEN (13.02.2026)
Vollstaendige Admin-Produktverwaltung mit tabellarischer Uebersicht, Filtern, Freigabe-Workflow mit Ablehnungsgrund, sowie Archivieren/Verkauft-Aktionen fuer Haendler und Admin.
**Produkt archivieren / als Verkauft markieren**
- Neue `archiveProduct()` und `markAsSold()` Methoden in `form-standard.blade.php`, `form-teaser.blade.php` und `products/index.blade.php`
- Edit-Formulare: Buttons "Als verkauft markieren" und "Archivieren" links neben Speichern-Button (nur im Edit-Modus)
- Produktliste: Dropdown-Menue (3-Punkte-Menue) je Produkt mit "Als verkauft" und "Archivieren" Optionen
- `wire:confirm` Dialoge fuer Sicherheitsabfrage
- Activity-Log-Eintraege (action: `archived` / `sold`) werden automatisch erstellt
- Produkte im Status Archived/Sold zeigen kein Dropdown mehr
**Erstellungsdatum in Produktliste**
- Neue Spalte "Erstellt" in `products/index.blade.php` (Format: dd.mm.YYYY)
- Sowohl fuer Haendler als auch Admin sichtbar
**Admin-Produktuebersicht (komplett neu)**
- `admin/products/index.blade.php` komplett umgebaut: von Card-/Tab-Layout zu tabellarischer Uebersicht
- Statistik-Karten: Gesamt, Zur Freigabe, In Korrektur, Freigegeben (klickbar als Schnellfilter)
- Filter: Suche (Name, Artikelnummer), Status (alle ProductStatus-Werte), Produkttyp, Haendler, Kategorie
- Tabelle: Produkt (mit Bild), Haendler, Kategorie, Status, Kuration (Freigabe-Buttons), Erstellt, Aktionen
- Admin kann alle Produkte bearbeiten Edit-Link fuehrt zum gleichen Formular wie fuer Haendler
- Suche durchsucht auch `b2in_article_number` und `partner_product_number`
**Freigabe-Workflow mit Ablehnungsgrund**
- **Freigeben:** Direkt-Button in Kuration-Spalte (Pending → Active + is_curated)
- **Korrektur:** Inline-Formular (orange) mit Pflicht-Textfeld → Status `Correction`, `curation_notes` gespeichert
- **Ablehnung (NEU):** Inline-Formular (rot) mit Pflicht-Textfeld → Status `Archived`, Ablehnungsgrund in `curation_notes` gespeichert
- Activity-Log-Eintrag bei allen drei Aktionen (mit `note` bei Korrektur/Ablehnung)
- `Flux::toast()` Benachrichtigungen statt Flash-Messages
**Kuration-Hinweis beim Haendler**
- Standard- und Teaser-Edit-Formulare zeigen prominenten Callout wenn `curation_notes` vorhanden:
- Korrektur (Status `correction`): Gelbes Warning-Callout "Korrektur erforderlich"
- Ablehnung (Status `archived`): Rotes Danger-Callout "Produkt abgelehnt"
- Angezeigt oberhalb des Formulars, immer sichtbar
**Admin Archiv/Verkauft in Admin-Uebersicht**
- Dropdown-Menue analog zur Haendler-Produktliste
- Admin kann alle Produkte archivieren oder als verkauft markieren
**Erstellte/geaenderte Dateien (5):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Volt** (3) | `form-standard.blade.php`, `form-teaser.blade.php`, `products/index.blade.php` | Archive/Sold-Methoden, Kuration-Callout, Erstellungsdatum, Dropdown-Aktionen |
| **Admin-Volt** (1) | `admin/products/index.blade.php` | Komplett umgebaut: Tabelle, Filter, Statistiken, Rejection mit Textfeld |
| **Tests** (1) | `ProductCurationTest.php`, `ProductEditTest.php` | Aktualisiert + erweitert |
**Neue/aktualisierte Tests (25):**
- ProductCurationTest: 23 Tests (komplett ueberarbeitet fuer neues Tabellen-Layout, Rejection mit Pflicht-Textfeld, Archive/Sold, Filter, Kuration-Notes-Anzeige)
- ProductEditTest: +2 Tests (archiveProduct, markAsSold aus Edit)
**Tests gesamt: 194 Produkt-Tests, alle bestanden ✅ (533 Assertions)**
---
### Phase 2.6: Refactoring, UX-Verbesserungen & Teaser-Erweiterung ABGESCHLOSSEN (13.02.2026)
Umfassende Qualitaetsverbesserung der Produkt-Formulare: Code-Redundanzen eliminiert, UX-Workflow optimiert, Bildsortierung implementiert, Teaser-Produkte mit Produktnummern und korrektem Freigabe-Workflow ausgestattet.
**Refactoring: Create + Edit zu einem Formular zusammengefuehrt**
- `create.blade.php` + `edit.blade.php``form-standard.blade.php` (Standard-Produkte)
- `create-teaser.blade.php` + `edit-teaser.blade.php``form-teaser.blade.php` (Teaser-Produkte)
- Steuerung ueber `$isEditing`-Flag in `mount()`: `?Product $product = null`
- Separate `saveNew()` und `saveExisting()` Methoden
- Alte Einzeldateien geloescht
**UX: Save-Verhalten bei Bearbeitung**
- Bei Edit: Seite bleibt offen statt Redirect zur Produktliste
- Flux Toast-Notification ("Produkt wurde gespeichert" / "zur Freigabe eingereicht")
- Bei Standard-Produkten: aktiver Tab bleibt erhalten (kein Page-Reload)
- `<flux:toast />` global im Sidebar-Layout ergaenzt
- Bei Create: weiterhin Redirect zur Produktliste mit Flash-Message
**Bildsortierung per Drag & Drop**
- Vorhandene Bilder per HTML5 Drag & Drop umsortierbar (Alpine.js, keine externe Dependency)
- Erstes Bild = Standardbild, visuell markiert (blaues "Standard"-Badge + blauer Ring)
- `updateMediaOrder(array $orderedIds)` Methode speichert Reihenfolge in `order_column`
- `existingMedia` wird immer nach `order_column` sortiert geladen
- Drag-Feedback: halbtransparent, blauer Ring am Ziel, Grab-Cursor, Sortier-Icon bei Hover
**Vorschaubild in Produktliste**
- `products/index.blade.php`: Erstes Bild (nach `order_column`) als 40x40px Thumbnail vor dem Produktnamen
- Platzhalter-Icon (Foto-Symbol) wenn kein Bild vorhanden
**Teaser-Produkte: Produktnummern & Status-Fix**
- `partnerProductNumber` hinzugefuegt: wird bei Create automatisch generiert (z.B. P003-0001), bei Edit pre-filled
- `b2inArticleNumber` wird beim Speichern automatisch erzeugt (z.B. B2IN-000001)
- Eigene "Produktnummern"-Karte im Formular (B2in-Badge + Partner-Nummer-Feld)
- **Bug-Fix:** Status "aktiv" im UI setzte Status direkt auf Active statt Pending. Jetzt korrekt: UI "aktiv" → DB `pending` (zur Freigabe)
- UI-Text vereinheitlicht: immer "Zur Freigabe einreichen" (nicht mehr "Aktiv direkt veröffentlichen")
- Freigabe-Workflow-Hinweis erscheint bei Create und Edit
**Routing-Aenderung:**
```
products/create/standard → products.form-standard (products.create.standard)
products/create/teaser → products.form-teaser (products.create.teaser)
products/{product}/edit-standard → products.form-standard (products.edit.standard)
products/{product}/edit-teaser → products.form-teaser (products.edit.teaser)
```
**Erstellte/geaenderte Dateien (8):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Volt** (2) | `form-standard.blade.php`, `form-teaser.blade.php` | Merged Create+Edit, Toast, Bildsortierung, Produktnummern |
| **Views** (2) | `index.blade.php`, `sidebar.blade.php` | Vorschaubild, `<flux:toast />` |
| **Routes** (1) | `routes/admin.php` | Neue Routennamen (.standard/.teaser) |
| **Tests** (4) | `StandardProductCreateTest`, `ProductEditTest`, `TeaserProductCreateTest`, `TeaserProductEditTest` | Komponentennamen aktualisiert, 13 neue Tests |
**Geloeschte Dateien:** `create.blade.php`, `edit.blade.php`, `create-teaser.blade.php`, `edit-teaser.blade.php`
**Neue Tests (13):** Bildsortierung (5), Teaser-Status pending/draft (2), Teaser B2in-Artikelnummer (1), Teaser Partnernummer create+edit (3), Teaser Partnernummer pre-fill (2)
**Tests gesamt: 109 Produkt-Tests, alle bestanden ✅**
---
### Phase 2.5: Produkt-Bearbeitung (Standard + Teaser) ABGESCHLOSSEN (13.02.2026)
Beide Produkttypen koennen jetzt vollstaendig bearbeitet werden. Standard-Produkte (SmartOrder) nutzen das 8-Tab-Formular, Teaser-Produkte (LocalStock) ein vereinfachtes Einseiten-Formular. Die Produkt-Liste leitet automatisch zur richtigen Edit-Seite weiter.
Erstellte/geaenderte Dateien (4):
- Volt: resources/views/livewire/products/edit-teaser.blade.php (neu) - Teaser-Edit mit Pre-Fill, Status-Handling, Media-Verwaltung, Activity-Log
- Routes: routes/admin.php - products.edit.teaser Route hinzugefuegt
- Views: resources/views/livewire/products/index.blade.php - Edit-Link basierend auf product_type
- Tests: tests/Feature/TeaserProductEditTest.php (neu) - 24 Tests
Infrastruktur-Fix: Route-Cache und Test-DB-Migration bereinigt.
Tests gesamt: 24 Tests (TeaserProductEditTest) + 22 Tests (ProductEditTest), alle bestanden.
Produkt-bezogene Tests gesamt: 133 Tests, alle bestanden.
---
### Phase 2.3b: CSV-Felder Erweiterung (Moebeldatenliste) ✅ ABGESCHLOSSEN (13.02.2026)
**Änderung:** Alle fehlenden Felder aus `Moebeldatenliste Stand 4.11.2025.csv` (70 Felder, 13 Sektionen) wurden als DB-Spalten und Formularfelder ergänzt. Von ~30 existierenden Feldern auf ~70 erweitert. Neue Tabelle `product_wood_origins` für EUDR-Compliance. Formular von 5 auf 8 Tabs umgebaut.
**Erstellte/geänderte Dateien (13):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Migrationen** (4) | `add_csv_fields_to_products_table`, `add_csv_fields_to_product_logistics_table`, `add_currency_to_product_variants_table`, `create_product_wood_origins_table` | +21 Spalten products, +4 Spalten product_logistics, +1 Spalte product_variants, neue Tabelle product_wood_origins |
| **Models** (4) | `Product.php`, `ProductLogistics.php`, `ProductVariant.php`, `ProductWoodOrigin.php` (neu) | Fillable, Casts, woodOrigins() Relationship |
| **Factories** (1) | `ProductWoodOriginFactory.php` (neu) | Factory mit Holzarten, Ländern, EUDR-Daten |
| **Volt-Komponenten** (1) | `products/create.blade.php` | 8-Tab-Layout, ~25 neue Properties, Wood-Origins-Repeater, erweiterte Validierung + Save-Logik |
| **Tests** (2) | `StandardProductCreateTest.php` (+12 Tests), `Models/ProductWoodOriginTest.php` (4 Tests, neu) | Material, Logistik, Services, Nachhaltigkeit, EUDR, Scoring, Währung, Validierung |
**Neue DB-Spalten (26):** products: country_of_origin, main_material, surface_material, cover_material, color_finish, certificates(JSON), assembly_time_min, load_capacity_kg, delivery_type, assembly_service, service_radius_km, warranty_months, production_time_days, visible_from, visible_until, co2_footprint_kg, recycling_percentage, is_regional_production, storage_volume_liters, assembly_effort_score, design_score. product_logistics: packaging_type, packaging_recyclable_percent, is_palletizable, hs_code. product_variants: currency.
**Neue Tabelle:** `product_wood_origins` (1:n von products) EUDR-Compliance mit Holzart, Herkunftsland, Region, Erntejahr, Forstbetrieb, Zertifikat, EUDR-ID
**Pint-Formatierung:** ✅ (keine Korrekturen nötig)
**Tests gesamt: 33 Tests (StandardProductCreateTest) + 4 Tests (ProductWoodOriginTest), alle bestanden ✅**
---
### Phase 2.3: Standard-Produkt Erstellung (Maske 2) ✅ ABGESCHLOSSEN (13.02.2026)
**Änderung:** Das Standard-Produkt-Formular (`create.blade.php`) wurde komplett neu geschrieben von einer nicht-funktionalen Dummy-Vorlage zu einem voll funktionsfähigen class-based Volt Component mit 5 Tabs.
**Erstellte/geänderte Dateien (3):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Volt-Komponenten** (1) | `resources/views/livewire/products/create.blade.php` | Komplett neugeschrieben: 5-Tab-Layout (Basis, Bilder, Physisch, Kommerziell, Zuordnung), erstellt Product + ProductVariant + ProductLogistics + Media, inline Validierung, Preise EUR→Cents |
| **Migrationen** (1) | `database/migrations/2026_02_13_..._make_tax_rate_id_nullable_on_product_variants_table.php` | `tax_rate_id` nullable gemacht (war NOT NULL ohne Default, tax_rates Tabelle leer) |
| **Tests** (1) | `tests/Feature/StandardProductCreateTest.php` | 17 neue Tests: Zugriff (3), Happy Path (2), Physisch+Logistik (1), Kommerziell (1), SEO (1), Validierung (8), Preistypen (1) |
**Pint-Formatierung:** ✅ (1 Fix: unused import in StandardProductCreateTest)
**Tests gesamt: 17 Tests (StandardProductCreateTest), alle bestanden ✅**
---
### Phase 2 Ergänzung: Beide Rollen → Beide Produkttypen (13.02.2026)
**Änderung:** Sowohl Händler (Retailer) als auch Hersteller (Manufacturer) können nun BEIDE Produkttypen anlegen (Teaser + Standard). Vorher war die Erstellmaske rollenbasiert auf einen Typ beschränkt.
**Erstellte/geänderte Dateien (3):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Volt-Komponenten** (1) | `resources/views/livewire/products/index.blade.php` | Zwei Buttons ("Neues Teaser-Produkt" + "Neues Standard-Produkt"), neuer `productTypeFilter` State + Query-Filter, Produkttyp-Dropdown im Filterbereich |
| **Tests** (2) | `tests/Feature/LocalFeedTest.php`, `tests/Feature/TeaserProductCreateTest.php` | +6 neue Tests: Produkttyp-Filter (3), Zwei-Button-Anzeige (3), Manufacturer Teaser-Zugriff (1), Manufacturer Teaser-Erstellung (1). Fix: `mainImage``mainImages` in bestehenden Tests |
**Pint-Formatierung:** ✅ (keine Korrekturen nötig)
**Tests gesamt: 21 Tests (LocalFeedTest + TeaserProductCreateTest), alle bestanden ✅**
---
### Phase 3: Kunden-Frontend & Local Feed ✅ KERN ABGESCHLOSSEN (12.02.2026)
**Erstellte/geänderte Dateien (8):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Actions** (1) | `app/Actions/Fortify/CreateNewUser.php` | `origin` aus `config('app.theme')` via `UserOrigin::tryFrom()`, `hub_id` aus Input |
| **Models** (1) | `app/Models/Partner.php` | `PartnerType` Cast hinzugefügt (`type` Feld) |
| **Volt-Komponenten** (2) | `resources/views/livewire/products/index.blade.php`, `resources/views/livewire/partner/profile.blade.php` | products/index: echte DB-Queries, Rollen-basierte Filterung (Admin/Customer/Partner). partner/profile: neue öffentliche Profilseite |
| **Routes** (1) | `routes/admin.php` | `partner.profile` Route hinzugefügt |
| **Tests** (3) | `CreateNewUserOriginTest`, `LocalFeedTest`, `PartnerProfilePageTest` | **17 Tests alle bestanden** |
**Wichtige Korrekturen (12.02.2026):**
- `products` Tabelle hat keine `sku` Spalte aus Suche und Tabellenansicht entfernt
- Partner `type` war nicht auf `PartnerType` Enum gecastet `PartnerType::class` Cast zu `Partner.php` hinzugefügt
- `Volt::test()` wirft `ModelNotFoundException` direkt (kein HTTP 404) 404-Tests nutzen `toThrow()`
**Pint-Formatierung:** ✅ (5 Dateien: Partner.php, CreateNewUser.php, 3 Test-Dateien)
**Tests Phase 3 gesamt: 17 Tests, alle bestanden ✅**
---
### Phase 2: Händler-Profil & Produkt-Management ✅ KERN ABGESCHLOSSEN (12.02.2026)
**Erstellte/geänderte Dateien (11):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Policies** (2) | `app/Policies/PartnerPolicy.php`, `ProductPolicy.php` | PartnerPolicy: viewAny/view/create/update/delete/curateProducts. ProductPolicy: viewAny/view/create/update/delete/curate |
| **Volt-Komponenten** (4) | `admin/partners/index.blade.php`, `admin/partners/edit.blade.php`, `products/create-teaser.blade.php`, `admin/products/index.blade.php` | Partner-Übersicht, Profil-Edit (Story+Öffnungszeiten), Teaser-Erstellen (Typ A, Preislogik via Enum), Kuration-Queue |
| **Routes** (1) | `routes/admin.php` | 4 neue Routen: `admin.partners.index`, `admin.partners.edit`, `products.create.teaser`, `admin.products.index` |
| **Seeders** (1) | `database/seeders/RoleSeeder.php` | `curate products` Permission hinzugefügt |
| **Tests** (5) | `PartnerPolicyTest`, `ProductPolicyTest`, `PartnerProfileUpdateTest`, `TeaserProductCreateTest`, `ProductCurationTest` | **48 Tests alle bestanden** |
**Enums erweitert (12.02.2026):**
- `app/Enums/ProductType.php`: `requiresTicket(): bool`, `allowedPriceTypes(): array`
- `tests/Unit/Enums/ProductTypeTest.php`: 4 neue Tests für Typ A/B Geschäftsregeln
**Pint-Formatierung:** ✅ (keine Style-Korrekturen nötig)
**Wichtige Erkenntnisse:**
- Volt `actingAs()` ist `void` für Tests immer `$this->actingAs($user)` VOR `Volt::test()` aufrufen
- Für HTTP-Tests mit `partner.setup` Middleware: `Partner::factory()->setupCompleted()->create()` verwenden
- `Storage::fake('public')` + `UploadedFile::fake()->image()` für File-Upload-Tests
---
### Phase 1: DB & Core-Vervollständigung ✅ ABGESCHLOSSEN (12.02.2026)
**Erstellte Dateien (29 Dateien):**
| Kategorie | Dateien | Details |
|-----------|---------|---------|
| **Enums** (6) | `app/Enums/ProductType.php`, `ProductStatus.php`, `PriceType.php`, `PartnerType.php`, `UserOrigin.php`, `CurationStatus.php` | Alle mit `label()`, Status-Enums zusätzlich mit `color()`, UserOrigin mit `tonality()` |
| **Neue Models** (4) | `app/Models/Product.php`, `Media.php`, `Setting.php`, `ProductLogistics.php` | Product: 6 Relationships, 6 Scopes. Media: Polymorphe Beziehung. Setting: Key-Value mit getValue/setValue Helpers |
| **Aktualisierte Models** (11) | `Attribute`, `AttributeValue`, `Category`, `Collection`, `Tag`, `ProductVariant`, `ShippingClass`, `TaxRate`, `Hub`, `Partner`, `User` | Alle Sparse Models mit Fillable, Casts, Relationships ergänzt. Partner: +products(), +media(). User: +hub(), +origin Cast |
| **Migrationen** (4) | `2026_02_12_000001` bis `000004` | Users (+origin, +hub_id), Products (+product_type, +is_curated, +hub_id, +price_type, +is_available, +curated_at, +curated_by), Partners (+story_text, +opening_hours, +specialties, +founded_year), Settings-Tabelle |
| **Factories** (5) | `ProductFactory`, `MediaFactory`, `PartnerFactory`, `HubFactory`, `BrandFactory` | Alle mit sinnvollen States (localStock, smartOrder, active, retailer, manufacturer, etc.) |
| **Seeders** (1) | `SettingsSeeder` | 6 Default-Settings: Ticket-Gültigkeit, Beleg-Deadline, Ticket-Limits, Provisions-Defaults |
| **Config** (1) | `config/domains.php` | +local4local Domain (local4local.test / local4local.online) |
| **Tests** (7 Dateien) | 3× Unit (Enums), 4× Feature (Product, Setting, User, Partner) | **47 Tests, 84 Assertions alle bestanden** |
**Migrationen auf Produktions-DB ausgeführt:** ✅
**Settings-Seeder ausgeführt:** ✅ (6 Settings angelegt)
**Pint-Formatierung:** ✅ (7 Style-Issues automatisch korrigiert)
**Vorbestehende Test-Failures BEHOBEN (12.02.2026):**
Alle 16 vorbestehenden Fehler plus 15 weitere Fehler (31 insgesamt) wurden systematisch behoben. Die gesamte Test-Suite besteht jetzt mit **139 Tests, 269 Assertions alle bestanden**
Behobene Probleme:
- `phpunit.xml`: `BASIC_AUTH_ENABLED=false` hinzugefügt (BasicAuth-Middleware blockierte alle HTTP-Tests)
- `admin/partners/index.blade.php`: Flux UI v2 Shorthand `<flux:columns>``<flux:table.columns>` korrigiert
- `config/livewire.php`: `component_layout` Key hinzugefügt (Livewire 4 Layout-Resolution)
- Auth-Tests: Portal-Domain (`portal.b2in.test`) für alle HTTP-Requests
- `RegistrationTest`: Komplett neu geschrieben für code-basierte Registrierung über `/reg/{role}`
- `PasswordResetTest`: `CustomResetPasswordNotification` statt Standard-`ResetPassword`
- `EmailVerificationTest`: Redirect zu `partner.setup.wizard` statt `dashboard`
- `ProfileUpdateTest`: SoftDeletes-Assertion (`->trashed()`) und Layout-Redirect
- `DashboardTest`: `RefreshDatabase` Trait hinzugefügt
- `ProductCurationTest`, `PartnerProfileUpdateTest`, `TeaserProductCreateTest`: `actingAs()` Chaining korrigiert (Volt `actingAs()` ist `void`)
- `TeaserProductCreateTest`: `mainImage` Upload, `setupCompleted()` Factory-State, `CategoryFactory` erstellt
- `ProductCurationTest`: Authorization-Test angepasst (Component authorize in `with()`)
- `Category` Model: `HasFactory` Trait hinzugefügt
---
## 1. Validierung: IST-Zustand vs. Konzeption
### ✅ Bereits implementiert und konzeptkonform
| Bereich | Status | Details |
|---------|--------|---------|
| **Hub-System** | ✅ Fertig | `hubs` + `hub_locations` Tabellen, Hub Model mit Relationships |
| **Partner-System** | ✅ Basis fertig | `partners` Tabelle mit `hub_id`, `type`, Provisionsfelder, Parent/Child-Beziehungen |
| **User-System** | ✅ Basis fertig | Users mit `partner_id`, SoftDeletes, Spatie Roles |
| **Rollen & Permissions** | ✅ Fertig | Customer, Estate-Agent, Retailer, Manufacturer, Admin, Super-Admin (via Spatie) |
| **Registrierungs-Codes** | ✅ Fertig | `registration_codes` mit `broker_partner_id` für Makler→Kunden Attribution |
| **Partner-Invitations** | ✅ Fertig | `partner_invitations` mit Token, Expiry, Status |
| **Multi-Domain-Routing** | ✅ Fertig | ThemeMiddleware, ThemeServiceProvider, `config/domains.php` (5 Domains) |
| **Auth-System** | ✅ Fertig | Fortify + Sanctum, Login, Register, Passwort-Reset, Email-Verifizierung, 2FA |
| **Admin-Portal** | ✅ Basis fertig | Dashboard, User-Management, Partner-Management, Hub-Management, CMS |
| **Partner-Setup-Wizard** | ✅ Fertig | Setup-Workflow für neue Partner nach Registrierung |
| **Produkt-DB-Struktur** | ✅ Tabellen vorhanden | `products`, `product_variants`, `categories`, `tags`, `brands`, `collections`, `attributes`, `media` |
### ⚠️ Teilweise implementiert Erweiterung nötig
| Bereich | Was fehlt | Konzept-Referenz |
|---------|-----------|-----------------|
| **Product Model** | Migration existiert, aber **kein `App\Models\Product`** Model muss erstellt werden | Abschnitt 2: Produkt-Modul |
| **Media Model** | Migration existiert, aber **kein `App\Models\Media`** Model muss erstellt werden | Für Produkt-Bilder, Partner-Galerie |
| **Partner-Profil** | Basis-Felder vorhanden, aber es fehlen: Team-Fotos, Showroom-Galerie, Story-Text, Öffnungszeiten | Abschnitt 3: "Faces" Profile |
| **Produkt-Upload UI** | `livewire/products/create` existiert als Blade, aber unvollständig | Abschnitt 2: Händler-Upload |
| **Produkt-Feed** | `livewire/products/index` existiert, aber keine Hub-basierte Filterung | Abschnitt 5: Local Feed |
| **Sparse Models** | `Attribute`, `AttributeValue`, `Category`, `Collection`, `Tag`, `ProductVariant`, `ShippingClass`, `TaxRate` haben keine Relationships definiert | Allgemein |
### ❌ Nicht implementiert Muss gebaut werden
| Bereich | Beschreibung | Konzept-Referenz |
|---------|-------------|-----------------|
| **User `origin` Feld** | Herkunft des Kunden (`style2own` / `stileigentum`) für Theme-Steuerung | Abschnitt 1: Core-Modul |
| **User `hub_id` Feld** | Direkte Hub-Zuordnung für Kunden (nicht nur indirekt über Partner) | Abschnitt 1: Hub-Logik |
| **`product_type` Feld** | Unterscheidung `local_stock` (Säule A) vs. `smart_order` (Säule B) | Abschnitt 2: Produkt-Modul |
| **`is_curated` Feld** | Admin-Freigabe-Flag für Produkt-Sichtbarkeit | Abschnitt 2: Produkt-Modul |
| **Ticket-System** | Komplett fehlend: Tickets, QR-Codes, Voucher-Generierung | Abschnitt 3A: Ticket-System |
| **Transaction/Receipt** | Beleg-Upload, State Machine (pending→confirmed→paid→distributed) | Abschnitt 3B: Clearing-System |
| **Wallet/Ledger** | Cashback-Wallets, Provisions-Split, Kassenbuch | Abschnitt 3C: Wallet-Logik |
| **Kunden-Dashboard** | "Mein Zuhause" emotionaler Feed mit Produkten aus dem eigenen Hub | Abschnitt 4: User Journey |
| **Setup-Buchung** | Service-Store für Händler (z.B. Setup-Paket 399€) | Abschnitt 4: Partner-Modul |
| **Enums** | Keine PHP Enums vorhanden (ProductType, TransactionStatus, TicketStatus, etc.) | Best Practice |
| **Form Requests** | Keine Form Request Klassen vorhanden | Best Practice |
| **Policies** | Keine Authorization Policies vorhanden | Best Practice |
---
## 2. Entwicklungsphasen
### Phase 1: Datenbank & Core-Vervollständigung ✅ ABGESCHLOSSEN
**Geschätzter Aufwand:** 2-3 Tage | **Tatsächlich:** 1 Tag (12.02.2026)
**Priorität:** HÖCHSTE Basis für alle weiteren Phasen
#### 1.1 Fehlende Models erstellen
- [ ] `App\Models\Product` erstellen mit allen Relationships:
- `belongsTo(Partner)`, `belongsTo(Brand)`, `belongsTo(Collection)`
- `belongsToMany(Category)`, `belongsToMany(Tag)`
- `hasMany(ProductVariant)`, `morphMany(Media)`
- `hasMany(RelatedProduct)`
- Scopes: `active()`, `curated()`, `localStock()`, `smartOrder()`, `inHub($hubId)`
- [ ] `App\Models\Media` erstellen (polymorphe Beziehung)
- [ ] Fehlende Relationships in Sparse Models ergänzen:
- `Attribute``hasMany(AttributeValue)`
- `AttributeValue``belongsTo(Attribute)`
- `Category` → self-referencing parent/children, `belongsToMany(Product)`
- `Tag``belongsToMany(Product)`
- `ProductVariant``belongsTo(Product)`, `belongsToMany(AttributeValue)`
- etc.
- [ ] `Partner::products()` Relationship aktivieren (aktuell auskommentiert)
#### 1.2 Migrationen: User-Erweiterung
```
Migration: add_origin_and_hub_id_to_users_table
```
- [ ] `origin` (nullable string) `style2own` | `stileigentum` | null
- [ ] `hub_id` (nullable FK → hubs) direkte Hub-Zuordnung für Kunden
- [ ] `broker_partner_id` (nullable FK → partners) direkte Makler-Attribution (Alternative zu indirekter Verknüpfung über Partner-Hierarchie; **Entscheidung nötig**: reicht `partner.parent_partner_id` oder braucht User direkt ein Feld?)
> **Offene Frage 1:** Soll der Kunde einen eigenen Partner-Eintrag bekommen (so wie jetzt über `partner_id` → Partner mit `parent_partner_id`) oder reicht eine direkte `hub_id` + `broker_partner_id` auf dem User? Die aktuelle Architektur erstellt für jeden Kunden einen Partner-Eintrag. Das könnte für das Wallet/Ledger System nützlich sein (jeder Partner hat eigene Provision-Settings). **Empfehlung:** Beibehalten, aber `hub_id` und `origin` direkt auf User setzen für schnelle Queries.
#### 1.3 Migrationen: Produkt-Erweiterung
```
Migration: add_marketplace_fields_to_products_table
```
- [ ] `product_type` (string, default: `local_stock`) `local_stock` | `smart_order`
- [ ] `is_curated` (boolean, default: false) Admin-Freigabe
- [ ] `curated_at` (nullable datetime) Zeitpunkt der Freigabe
- [ ] `curated_by` (nullable FK → users) Wer hat freigegeben
- [ ] `hub_id` (nullable FK → hubs) Direkte Hub-Zuordnung (ergänzend zu Partner→Hub)
- [ ] `price_type` (string) `fixed` | `from_price` | `on_request` (Preisanzeige-Logik)
- [ ] `price_display_text` (nullable string) z.B. "Ab 2.500 €" Freitext
- [ ] `is_available` (boolean, default: true) Verfügbar/Verkauft Toggle für Händler
#### 1.4 Migrationen: Partner-Profil Erweiterung
```
Migration: add_profile_fields_to_partners_table
```
- [ ] `story_text` (nullable text) "Seit 1950 in Herford..."
- [ ] `opening_hours` (nullable JSON) Öffnungszeiten strukturiert
- [ ] `specialties` (nullable JSON) Fachgebiete/Spezialisierungen
- [ ] `founded_year` (nullable integer) Gründungsjahr
> **Hinweis:** Team-Fotos und Showroom-Galerie werden über die polymorphe `media` Tabelle abgebildet (type: `team_photo`, `showroom`, `gallery`).
#### 1.5 Migration: Settings-Tabelle
```
Migration: create_settings_table
```
- [ ] `id`
- [ ] `group` (string) z.B. `tickets`, `marketplace`, `commissions`
- [ ] `key` (string, unique innerhalb group)
- [ ] `value` (text, nullable)
- [ ] `type` (string) `string` | `integer` | `boolean` | `json`
- [ ] `description` (nullable text) Beschreibung für Admin-UI
- [ ] `timestamps`
Default-Werte per Seeder:
- `tickets.validity_days` = 30
- `tickets.receipt_upload_deadline_days` = 30
- `tickets.max_per_merchant_per_customer` = 3
- `tickets.max_merchants_per_customer` = 4
- `commissions.default_broker_rate` = 0 (individuell)
- `commissions.default_cashback_rate` = 0 (individuell)
#### 1.6 Domain-Ergänzung: local4local
- [ ] `config/domains.php` um `local4local` Domain erweitern:
- Produktion: `local4local.online`
- Entwicklung: `local4local.test`
- Theme, Farben, Fonts definieren
- [ ] `.env` Variablen: `DOMAIN_LOCAL4LOCAL=local4local.test`
- [ ] Routing in `routes/domains.php` einbinden
#### 1.7 Enums erstellen
- [ ] `App\Enums\ProductType` `LocalStock`, `SmartOrder`
- [ ] `App\Enums\ProductStatus` `Draft`, `Active`, `Archived`, `Sold`
- [ ] `App\Enums\PriceType` `Fixed`, `FromPrice`, `OnRequest`
- [ ] `App\Enums\PartnerType` `Retailer`, `Manufacturer`, `EstateAgent`
- [ ] `App\Enums\UserOrigin` `Style2Own`, `StilEigentum`
- [ ] `App\Enums\CurationStatus` `Pending`, `Approved`, `Rejected`
#### 1.8 Factories & Seeders
- [ ] `ProductFactory` erstellen
- [ ] `MediaFactory` erstellen
- [ ] `SettingFactory` erstellen
- [ ] `PartnerFactory` erweitern (fehlende Felder)
- [ ] `ProductSeeder` für Testdaten
- [ ] `SettingsSeeder` für Default-Werte
- [ ] `HubSeeder` erweitern (wenn nötig)
#### 1.9 Tests Phase 1
- [ ] Unit-Tests für alle neuen Models und Relationships
- [ ] Unit-Tests für Enums
- [ ] Feature-Tests für Migrations (Datenintegrität)
---
### Phase 2: Händler-Profil & Produkt-Management ✅ KERN ABGESCHLOSSEN (12.02.2026)
**Geschätzter Aufwand:** 5-6 Tage | **Tatsächlich:** 1 Tag (12.02.2026)
**Priorität:** HOCH Content-Erstellung ermöglichen
#### 2.0 Architektur-Entscheidung: EINE Tabelle, ZWEI Masken
> **Entscheidung:** Beide Produkttypen nutzen dieselbe `products` Tabelle. Das Feld `product_type` (`local_stock` | `smart_order`) bestimmt, welche Eingabemaske und Validierung angewendet wird.
**Begründung:**
- Beides sind Produkte mit identischem Kern (Name, Beschreibung, Preis, Bilder, Partner, Hub, Kategorie)
- Der Local Feed zeigt beide Typen gemischt an eine Tabelle ermöglicht einfache Queries ohne UNION
- Das Teaser-Produkt ist ein "leichtes" Produkt: die Felder, die es nicht braucht, bleiben `null`
- Ein Model, ein Satz Relationships, ein Satz Scopes kein doppelter Code
- Filterung per Scope: `Product::localStock()`, `Product::smartOrder()`
---
#### Kundenfeedback: Typ A vs. Typ B (12.02.2026)
> **Implementiert in `app/Enums/ProductType.php`:**
> - `requiresTicket(): bool``LocalStock = true`, `SmartOrder = false`
> - `allowedPriceTypes(): array``LocalStock = [FromPrice, OnRequest]`, `SmartOrder = [Fixed, FromPrice, OnRequest]`
**Typ A Teaser-Produkte** (`product_type = 'local_stock'`)
Komplex → Beratung → Laden → **Ticket zwingend erforderlich**
- Aufwendige Konfiguration (Maße, Module, Materialien) Abschluss nur im Laden
- Online nur Beispiele, Referenzen, grobe Preisindikationen
- Typisch: Küchenstudios, maßgefertigte Möbel (Cabinet), Einbausysteme
- **Preistyp:** Nur `from_price` oder `on_request` Festpreis online nicht erlaubt
- **Ticket:** zwingend (`ProductType::LocalStock->requiresTicket() === true`)
**Typ B Standard-Produkte** (`product_type = 'smart_order'`)
Einfach → verständlich → skalierbar → **Ticket optional / Direktkauf möglich**
- Klare Varianten, vollständig online konfigurierbar, ca. 99 % des Sortiments
- **Preistyp:** Alle erlaubt (`fixed`, `from_price`, `on_request`)
- **Ticket:** optional Direktkauf online möglich oder Ticket + Ladenbesuch
---
**Maske 1: Typ A Teaser-Produkt / Local Stock (Händler)**
Ziel: Extrem vereinfacht, handy-optimiert. Kein komplexes Warenwirtschafts-Monster.
| Feld | DB-Spalte | Pflicht | Beschreibung |
|------|-----------|---------|-------------|
| Fotos | → `media` (morph) | Ja (min. 1) | 1 Hauptbild + optional 2 Galerie-Bilder |
| Titel | `name` | Ja | Produktname |
| Kurzbeschreibung | `description_short` | Ja | Max. 180 Zeichen |
| Preistyp | `price_type` | Ja | Nur `from_price` oder `on_request` (via `allowedPriceTypes()`) |
| Preisangabe | `price_display_text` | Cond. | Pflicht wenn `from_price` (z.B. "Ab 2.500 €") |
| Kategorie | → `category_product` (Pivot) | Ja | Dropdown-Auswahl |
| Status | `status` | Ja | Verfügbar / Verkauft |
Automatisch gesetzt: `product_type = 'local_stock'`, `hub_id` = Hub des Händlers, `partner_id` = Partner des Users.
`PriceType::Fixed` für Maske 1 **nicht erlaubt** Validierung via `ProductType::LocalStock->allowedPriceTypes()`.
**Maske 2: Typ B Konfigurations-Produkt / Smart Order (Hersteller)**
Das bestehende 6-Tab-Formular (`livewire/products/create.blade.php`) mit 13 Sektionen:
Basis → Bilder → Physisch → Material & Herkunft → Kommerziell → Zuordnung & Verwaltung
Automatisch gesetzt: `product_type = 'smart_order'`, `partner_id` = Partner des Users.
Hub-Zuordnung: Manuell wählbar (Hersteller können in mehreren Hubs aktiv sein).
Alle Preistypen erlaubt; Standard-Varianten mit Festpreis möglich.
**Routing-Logik:** ✅ AKTUALISIERT (13.02.2026)
```
// Beide Rollen können BEIDE Produkttypen anlegen.
// Die Produktliste zeigt zwei Buttons:
// "Neues Teaser-Produkt" → Maske 1 (Typ A: Teaser, vereinfacht, Ticket zwingend)
// "Neues Standard-Produkt" → Maske 2 (Typ B: Konfiguration, komplex, Ticket optional)
// Sichtbar für: Retailer, Manufacturer, Admin, Super-Admin
// Zusätzlich: Produkttyp-Filter in der Produktliste (Teaser / Standard / Alle)
```
#### 2.1 Partner-Profil Erweiterung (Admin-Portal) ✅ Kern implementiert
- [x] Partner-Profil Formular erweitern:
- [x] Story-Text Editor (`<flux:textarea>`)
- [x] Öffnungszeiten-Eingabe (strukturiertes JSON-Formular, 7 Wochentage)
- [ ] Team-Fotos Upload (mehrere Bilder via `<flux:file-upload>`) ausstehend
- [ ] Showroom-Galerie Upload ausstehend
- [ ] Form Request: `UpdatePartnerProfileRequest` inline Validierung verwendet
- [x] Policy: `PartnerPolicy` (viewAny, view, update, delete, curateProducts)
- [x] Admin Partner-Übersicht: `admin/partners/index.blade.php` (Suche, Filter, Tabelle)
#### 2.2 Produkt-CRUD: Maske 1 Teaser / Local Stock (Händler) ✅ Implementiert
- [x] Volt-Komponente: `livewire/products/form-teaser.blade.php` (merged Create + Edit)
- [x] Einzelseiten-Formular (KEIN Tab-Layout)
- [x] Bild-Upload via `WithFileUploads` + Drag & Drop Bildsortierung
- [x] Felder: Foto, Titel, Kurzbeschreibung, Preistyp (nur FromPrice/OnRequest), Preistext, Kategorie, Status, Produktnummer
- [x] Produktnummern: Partner-Produktnummer (auto-generiert) + B2in-Artikelnummer (auto bei Save)
- [x] Automatisch: `product_type = 'local_stock'`, `hub_id` vom Händler-Hub, `partner_id`
- [x] Preistyp-Validierung via `ProductType::LocalStock->allowedPriceTypes()` (kein Festpreis)
- [x] Freigabe-Workflow: UI "aktiv" → DB `pending` (korrekt zur Freigabe, nicht direkt Active)
- [x] Produkt-Liste: Zwei Buttons ("Neues Teaser-Produkt" + "Neues Standard-Produkt") für alle Partner-Rollen
- [x] Produkt-Liste: Produkttyp-Filter (Teaser / Standard / Alle)
- [x] Produkt-Liste: Vorschaubild (erstes Bild nach order_column) vor Produktname
- [x] Produkt bearbeiten: Pre-Fill, Status-Handling, Media-Verwaltung, Activity-Log, Toast-Notification
- [x] Bildsortierung: Drag & Drop, erstes Bild = Standardbild, order_column in DB
- [x] Produkt archivieren / als "Verkauft" markieren in Edit-Formular und Produktliste (Dropdown-Menue)
- [ ] Form Request: `StoreTeaserProductRequest` inline Validierung verwendet
- [x] Policy: `ProductPolicy` (viewAny, view, create, update, delete, curate)
#### 2.3 Produkt-CRUD: Maske 2 Standard / Smart Order ✅ Implementiert (13.02.2026)
- [x] Volt-Komponente: `livewire/products/form-standard.blade.php` (merged Create + Edit)
- [x] 8-Tab-Layout: Basis, Bilder, Maße & Material, Verpackung & Versand, Kommerziell, Service & Garantie, Nachhaltigkeit, Zuordnung
- [x] Erstellt Product + Master-Variante (ProductVariant) + ProductLogistics + Media
- [x] Preis-Typ Logik: Festpreis / Ab-Preis / Preis auf Anfrage (alle 3 für SmartOrder erlaubt)
- [x] Automatisch: `product_type = 'smart_order'`, Hub-Fallback auf Partner-Hub
- [x] File-Uploads: Mehrere Bilder (max 10, JPG/PNG, max 10 MB) + Drag & Drop Bildsortierung
- [x] Preise in EUR eingeben → automatische Umrechnung in Cents bei Speicherung
- [x] Alle optionalen Felder: MPN, EAN/GTIN, UVP, EK, Lagerstatus, Lieferzeit, SEO-Metadaten, Maße, Verpackung
- [x] Validierung inline (kein separater Form Request konsistent mit Teaser-Formular)
- [x] Authorization: ProductPolicy + Rollenprüfung (Retailer, Manufacturer, Admin, Super-Admin)
- [x] Bei Edit: Toast-Notification, aktiver Tab bleibt erhalten, kein Redirect
- [x] Migration: `tax_rate_id` auf `product_variants` nullable gemacht (war NOT NULL ohne Default)
#### 2.4 Admin: Produkt-Kuration (Approval Queue) ✅ Vollstaendig implementiert
- [x] Admin-View: `admin/products/index.blade.php` Tabelle mit Filtern (Status, Typ, Haendler, Kategorie, Suche)
- [x] Statistik-Karten: Gesamt, Zur Freigabe, In Korrektur, Freigegeben (klickbar als Schnellfilter)
- [x] Approve Action: `is_curated=true`, `curated_at`, `curated_by` + Flux::toast()
- [x] Correction Action: Inline-Formular mit Pflicht-Textfeld → `curation_notes`
- [x] Reject Action: Inline-Formular mit Pflicht-Ablehnungsgrund → `curation_notes` + `status=Archived`
- [x] Autorisierung via `ProductPolicy::curate` (`curate products` Permission)
- [x] Admin kann alle Produkte bearbeiten (gleiche Edit-Formulare wie Haendler)
- [x] Admin kann Produkte archivieren / als verkauft markieren (Dropdown-Menue)
- [x] Erstellungsdatum in Tabelle sichtbar
- [x] Kuration-Hinweis beim Haendler: Callout im Edit-Formular (Korrektur gelb, Ablehnung rot)
- [ ] Notification an Händler/Hersteller bei Freigabe/Ablehnung ausstehend
- [ ] Admin kann `product_type` bei Bedarf nachträglich ändern ausstehend
#### 2.5 Tests Phase 2 ✅ Kern abgeschlossen
- [x] Feature-Tests: `PartnerPolicyTest` (10 Tests) viewAny, view, update, curateProducts
- [x] Feature-Tests: `ProductPolicyTest` (14 Tests) alle Policy-Methoden
- [x] Feature-Tests: `PartnerProfileUpdateTest` (8 Tests) Profil-Update, Öffnungszeiten, Validierung
- [x] Feature-Tests: `TeaserProductCreateTest` (18 Tests) Happy Path, Preistyp-Validierung, Autorisierung, Status-Logik, Produktnummern
- [x] Feature-Tests: `ProductCurationTest` (23 Tests) Approve, Reject mit Pflicht-Textfeld, Correction, Archive/Sold, Filter, Kuration-Notes-Anzeige im Edit
- [x] Feature-Tests: `StandardProductCreateTest` (39 Tests) Zugriff, Happy Path, alle Tabs, Validierung, Preistypen, Produktnummern, Marken
- [x] Feature-Tests: `ProductEditTest` (27 Tests) Pre-Fill, Save, Status, Validierung, Media-Sortierung, Wood Origins, Activity, Archive/Sold
- [x] Feature-Tests: `TeaserProductEditTest` (30 Tests) Pre-Fill, Save, Status, Media-Sortierung, Produktnummern
- [x] Tests: Beide Rollen (Händler + Hersteller) können BEIDE Produkttypen anlegen (Teaser + Standard)
**Tests Phase 2 gesamt: 109 Produkt-Tests + 48 Policy/Profil/Kuration-Tests, alle bestanden ✅**
---
### Phase 3: Kunden-Frontend & Local Feed ✅ KERN ABGESCHLOSSEN (12.02.2026)
**Geschätzter Aufwand:** 4-5 Tage | **Tatsächlich:** 1 Tag (12.02.2026)
**Priorität:** HOCH Kunden-Facing Funktionalität
#### 3.1 User-Origin Tracking ✅ Implementiert
- [x] Bei Registrierung: `origin` automatisch aus Domain setzen
- Request von `style2own.test``origin = 'style2own'`
- Request von `stileigentum.test``origin = 'stileigentum'`
- [x] `CreateNewUser` Action (Fortify) erweitern um `origin` + `hub_id`
- [ ] Hub-Auswahl bei Registrierung (oder automatisch via Invite-Code des Maklers) ausstehend
#### 3.2 Kunden-Dashboard ("Mein Zuhause") ✅ Kern implementiert
- [x] `topOffers` im Dashboard: echte Produkte aus dem Hub des Kunden laden
- `Product::query()->where('status', Active)->where('is_curated', true)->...->take(3)`
- Fallback auf Dummy-Daten wenn noch keine Produkte vorhanden
- [ ] Eigene Dashboard-Seite für Customer-Rolle ausstehend
- [ ] Theme-Steuerung basierend auf `origin` (`style2own` / `stileigentum`) ausstehend
#### 3.3 Local Feed (Marktplatz-View) ✅ Implementiert
- [x] `products/index` mit echter DB-Abfrage und Rollen-Filterung:
- **Admin**: sieht alle Produkte
- **Customer**: nur `active + is_curated + is_available` aus eigenem Hub
- **Retailer/Partner**: nur eigene Produkte
- [x] Suchfilter nach Name, Kategorie-Filter, Paginierung (20 Einträge)
- [ ] Produkt-Detailseite ausstehend
- [ ] Filteroptionen: Preisbereich, Verfügbarkeit ausstehend
#### 3.4 Partner-Profilseite (öffentlich) ✅ Implementiert
- [x] `partner/profile.blade.php`: Story, Öffnungszeiten, Produkte (max. 6), Spezialisierungen, Adresse
- [x] Route: `partner/{partnerId}/profile``partner.profile`
- [ ] Team-Fotos / Showroom-Galerie ausstehend (abhängig von Media-Upload)
#### 3.5 Tests Phase 3 ✅ Abgeschlossen
- [x] `CreateNewUserOriginTest` (6 Tests) Origin-Tracking, hub_id
- [x] `LocalFeedTest` (5 Tests) Hub-Filterung, Kuration, Rollen, Suche, Kategorie
- [x] `PartnerProfilePageTest` (6 Tests) Profilseite, Story, Produkte, Auth
**Tests Phase 3 gesamt: 17 Tests, alle bestanden ✅**
---
### Phase 4: Ticket-System & QR-Generierung
**Geschätzter Aufwand:** 3-4 Tage
**Priorität:** HOCH Kern der Monetarisierung
#### 4.1 Datenbank: Tickets
```
Migration: create_tickets_table
```
- [ ] `id`, `uuid` (public identifier)
- [ ] `user_id` (FK → users, Kunde)
- [ ] `merchant_partner_id` (FK → partners, Händler)
- [ ] `product_id` (nullable FK → products)
- [ ] `hub_id` (FK → hubs)
- [ ] `code` (unique string, z.B. "TK-2026-XXXXX")
- [ ] `qr_code_path` (nullable string, Pfad zur generierten QR-Datei)
- [ ] `status` (string: `active` | `redeemed` | `expired`)
- [ ] `discount_type` (string: `percentage` | `fixed`)
- [ ] `discount_value` (decimal)
- [ ] `valid_until` (datetime)
- [ ] `redeemed_at` (nullable datetime)
- [ ] `timestamps`
#### 4.2 Ticket Model & Enum
- [ ] `App\Models\Ticket` mit Relationships
- [ ] `App\Enums\TicketStatus` `Active`, `Redeemed`, `Expired`
- [ ] `TicketFactory` erstellen
- [ ] `TicketPolicy` erstellen
#### 4.3 Ticket-Generierung
- [ ] Composer-Paket für QR-Code Generierung (`simplesoftwareio/simple-qrcode` oder ähnlich) **Genehmigung einholen**
- [ ] Service: `App\Services\TicketService`
- `generateTicket(User $user, Partner $merchant, ?Product $product): Ticket`
- `generateQrCode(Ticket $ticket): string` (gibt Pfad zurück)
- `validateTicket(string $code): ?Ticket`
- `redeemTicket(Ticket $ticket): void`
- [ ] Livewire-Komponente: "Ticket ziehen" Button auf Produktdetailseite
- [ ] Mail/PDF-Generierung mit QR-Code + Händler-Info
#### 4.4 Händler: Ticket-Einlösung
- [ ] Händler-Dashboard: "Eingelöste Tickets" Übersicht
- [ ] QR-Code Scanner (Optional, Phase 5)
- [ ] Manuelle Code-Eingabe zum Einlösen
#### 4.5 Tests Phase 4
- [ ] Unit-Tests für TicketService
- [ ] Feature-Tests für Ticket-Generierung
- [ ] Feature-Tests für Ticket-Einlösung
- [ ] Tests für QR-Code Generierung
---
### Phase 5: Transaction-Engine & Clearing
**Geschätzter Aufwand:** 5-6 Tage
**Priorität:** MITTEL Aufbauend auf Ticket-System
#### 5.1 Datenbank: Transaktionen
```
Migration: create_transactions_table
```
- [ ] `id`, `uuid`
- [ ] `ticket_id` (FK → tickets)
- [ ] `user_id` (FK → users, Kunde)
- [ ] `merchant_partner_id` (FK → partners, Händler)
- [ ] `broker_partner_id` (nullable FK → partners, Makler)
- [ ] `amount` (integer, in Cents)
- [ ] `receipt_image_path` (nullable string, hochgeladener Beleg)
- [ ] `receipt_amount` (nullable integer, vom Kunden angegebener Betrag in Cents)
- [ ] `status` (string: State Machine)
- [ ] `merchant_confirmed_at` (nullable datetime)
- [ ] `merchant_confirmed_amount` (nullable integer, in Cents)
- [ ] `invoice_generated_at` (nullable datetime)
- [ ] `paid_at` (nullable datetime)
- [ ] `distributed_at` (nullable datetime)
- [ ] `notes` (nullable text)
- [ ] `timestamps`
#### 5.2 Transaction State Machine
```
Enum: App\Enums\TransactionStatus
```
- [ ] `PendingReceipt` Ticket eingelöst, Kunde muss Beleg hochladen
- [ ] `PendingMerchant` Beleg hochgeladen, Händler muss bestätigen
- [ ] `Confirmed` Händler hat bestätigt → Rechnung an Händler generieren
- [ ] `Invoiced` Rechnung erstellt → Zahlung ausstehend
- [ ] `Paid` Händler hat Provision an B2In überwiesen
- [ ] `Distributed` Provisionen an Makler/Kunde ausgeschüttet
- [ ] `Rejected` Händler hat abgelehnt
- [ ] `Disputed` Streitfall
#### 5.3 Beleg-Upload (Kunden-View)
- [ ] Livewire-Komponente: Beleg-Upload Formular
- Foto-Upload des Kaufbelegs
- Betrag-Eingabe
- Verknüpfung mit Ticket
- [ ] Validierung: Ticket muss `redeemed` sein
- [ ] Mail-Notification an Händler: "Neuer Beleg zur Bestätigung"
#### 5.4 Händler-Bestätigung
- [ ] Händler-Dashboard: "Offene Umsatz-Bestätigungen"
- [ ] Beleg anzeigen mit Bestätigungs-/Ablehnungs-Buttons
- [ ] Händler kann Betrag korrigieren (falls Kunde falschen Betrag eingegeben hat)
- [ ] Bei Bestätigung: Event `TransactionConfirmed` feuern
#### 5.5 Tests Phase 5
- [ ] Unit-Tests für State Machine Übergänge
- [ ] Feature-Tests für Beleg-Upload
- [ ] Feature-Tests für Händler-Bestätigung
- [ ] Tests für Events und Notifications
---
### Phase 6: Wallet, Cashback & Provisions-System
**Geschätzter Aufwand:** 4-5 Tage
**Priorität:** MITTEL Monetarisierung
#### 6.1 Datenbank: Wallets & Ledger
```
Migration: create_wallets_table
```
- [ ] `id`
- [ ] `partner_id` (nullable FK → partners)
- [ ] `user_id` (nullable FK → users)
- [ ] `balance` (integer, in Cents)
- [ ] `type` (string: `cashback` | `commission` | `platform`)
- [ ] `timestamps`
```
Migration: create_ledger_entries_table
```
- [ ] `id`, `uuid`
- [ ] `wallet_id` (FK → wallets)
- [ ] `transaction_id` (nullable FK → transactions)
- [ ] `type` (string: `credit` | `debit`)
- [ ] `amount` (integer, in Cents, immer positiv)
- [ ] `balance_after` (integer, in Cents)
- [ ] `description` (string)
- [ ] `timestamps`
#### 6.2 Provisions-Berechnung
- [ ] Service: `App\Services\CommissionService`
- `calculateSplit(Transaction $transaction): CommissionSplit`
- Berechnet: Makler-Anteil, Kunden-Cashback, B2In-Marge
- Nutzt `partner.provision_rate_percentage` und `partner.provision_fixed_amount`
- [ ] Event Listener für `TransactionPaid`:
- Erstellt Ledger-Einträge
- Aktualisiert Wallet-Balances
- Setzt Transaction-Status auf `distributed`
#### 6.3 Wallet-Views
- [ ] Kunden-Dashboard: "Mein Cashback" (Guthaben, Historie)
- [ ] Makler-Dashboard: "Meine Provisionen" (Guthaben, Historie)
- [ ] Admin: Wallet-Übersicht aller Partner und Kunden
#### 6.4 Tests Phase 6
- [ ] Unit-Tests für CommissionService (Splits korrekt berechnet)
- [ ] Feature-Tests für Wallet-Operationen
- [ ] Feature-Tests für Event-basierte Distribution
- [ ] Edge Cases: Rundung, Null-Beträge, fehlende Provisionsregeln
---
### Phase 7: Frontend-Polish & Domains
**Geschätzter Aufwand:** 3-4 Tage
**Priorität:** MITTEL
#### 7.1 Style2Own vs. StilEigentum Feinschliff
- [ ] CSS-Variablen-Sets für beide Brands finalisieren
- [ ] Wording-Datenbank: "Du" vs. "Sie" Ansprache in allen Texten
- [ ] Landingpage-Anpassungen je Brand
#### 7.2 "Local for Local" Branding
- [ ] Hub-spezifisches Branding (z.B. "Local for Local OWL")
- [ ] Hub-Landingpages mit regionalen Inhalten
- [ ] Domain-Routing für `localforlocal.de` (wenn verfügbar)
#### 7.3 Responsive & Mobile
- [ ] Händler-Upload Formular mobil-optimiert ("Handy-optimiert" laut Konzept)
- [ ] Ticket-Anzeige mobil-optimiert (QR-Code gut scanbar)
- [ ] Kunden-Dashboard responsive
#### 7.4 Tests Phase 7
- [ ] Browser-Tests (Laravel Dusk) für Multi-Domain
- [ ] Responsive Tests
---
## 3. Beantwortete Fragen & Entscheidungen
### Architektur-Entscheidungen
**Frage 1: Kunden-Partner-Beziehung** ✅
> **Entscheidung:** Beibehalten. Jeder Kunde behält seinen Partner-Eintrag. Zusätzlich `hub_id` und `origin` direkt auf User für schnelle Queries.
**Frage 2: Hub-Zuordnung bei Produkten** ✅
> **Entscheidung:** Direktes `hub_id` Feld auf Products. Hersteller können Produkte in mehreren Hubs anbieten.
**Frage 3: QR-Code Paket** ✅
> **Entscheidung:** `chillerlan/php-qrcode`
**Frage 4: PDF-Generierung für Tickets** ✅
> **Entscheidung:** `spatie/laravel-pdf`
**Frage 5: Makler-Invite und Hub-Zuweisung** ✅
> **Entscheidung:** Automatisch vom Makler übernehmen. Admin kann manuell ändern.
**Frage 6: Domain Local for Local** ✅
> **Entscheidung:** `local4local.online` (Produktion) / `local4local.test` (Entwicklung). Muss in `config/domains.php` ergänzt werden.
**Frage 11: Produkttypen Eine oder zwei Tabellen?** ✅
> **Entscheidung:** EINE `products` Tabelle, ZWEI Eingabemasken. Das Feld `product_type` (`local_stock` | `smart_order`) steuert welche Maske und Validierung greift. Siehe Phase 2.0 für Details.
> - Maske 1 (Teaser/Local Stock): Vereinfacht, handy-optimiert, für Händler
> - Maske 2 (Konfiguration/Smart Order): Komplex mit 6 Tabs, für Hersteller
### Business-Logic Entscheidungen
**Frage 7: Provisions-Split** ✅
> **Entscheidung:** Individuell pro Partner. Admin-Settings-Seite mit Feldern für:
> - Makler-Provision (%)
> - Kunden-Cashback (%)
> - B2In-Marge (Rest)
> Felder werden pro Partner im Admin-Backend konfiguriert.
**Frage 8: Ticket-Gültigkeit** ✅
> **Entscheidung:** Default 30 Tage. Konfigurierbar über Admin-Settings-Seite.
**Frage 9: Beleg-Upload Deadline** ✅
> **Entscheidung:** Default 30 Tage. Konfigurierbar über Admin-Settings-Seite.
**Frage 10: Ticket-Begrenzung pro Kunde** ✅
> **Entscheidung:** Produkte sind immer an einen Händler gebunden. Ein Kunde kann Tickets bei verschiedenen Händlern für ähnliche Produkte ziehen. Begrenzung über Admin-Settings:
> - Max. Tickets pro Händler (z.B. 3)
> - Max. Händler pro Zeitraum (z.B. 4)
> - Konfigurierbar durch Admin
### Benötigte Admin-Settings-Seite (Neue Anforderung)
Aus den Antworten ergibt sich die Notwendigkeit einer zentralen **Admin-Settings-Seite** für:
- Ticket-Gültigkeit (Tage)
- Beleg-Upload Deadline (Tage)
- Max. Tickets pro Händler pro Kunde
- Max. Händler pro Kunde pro Zeitraum
- Standard-Provisions-Split (Default-Werte für neue Partner)
> **Umsetzung:** `settings` Tabelle (key-value) + Admin-Settings-View in Phase 4/5. Alternativ: `config/marketplace.php` mit `.env`-Variablen für nicht-dynamische Werte.
---
## 4. Technische Richtlinien für die Entwicklung
### Architektur-Prinzipien
- **Eloquent-First:** Keine `DB::` Facades, immer `Model::query()`
- **Form Requests:** Jede Validierung in eigene Request-Klassen
- **Policies:** Jede Autorisierung über Laravel Policies
- **Events/Listeners:** Für alle Seiteneffekte (Mail, Wallet-Buchung, Notifications)
- **Services:** Business-Logik in Service-Klassen (`TicketService`, `CommissionService`)
- **Enums:** Alle Status-Werte als PHP 8.1+ Enums
### Namenskonventionen
- Models: Singular, PascalCase (`Ticket`, `LedgerEntry`)
- Tabellen: Plural, snake_case (`tickets`, `ledger_entries`)
- Enums: PascalCase Keys (`LocalStock`, `SmartOrder`)
- Services: `{Domain}Service` (`TicketService`, `CommissionService`)
- Policies: `{Model}Policy` (`TicketPolicy`, `TransactionPolicy`)
- Form Requests: `{Action}{Model}Request` (`StoreProductRequest`, `UpdatePartnerProfileRequest`)
- Events: Past Tense (`TransactionConfirmed`, `TicketRedeemed`)
### Testing-Strategie
- Jede Phase muss vollständig getestet sein bevor die nächste beginnt
- Feature-Tests für alle Endpoints und Livewire-Komponenten
- Unit-Tests für Services und komplexe Business-Logik
- Pest als Test-Framework, Factories für Testdaten
- Mindestens: Happy Path + Validation + Authorization pro Feature
### Reihenfolge der Entwicklung (innerhalb jeder Phase)
1. Migration(s) erstellen und ausführen
2. Model(s) mit Relationships, Casts, Scopes
3. Enum(s) falls nötig
4. Factory und Seeder
5. Form Request(s)
6. Policy
7. Service-Klasse (falls komplexe Logik)
8. Livewire/Volt Komponente
9. Tests schreiben und ausführen
10. `pint --dirty` für Code-Formatierung
---
## 5. Abhängigkeiten zwischen Phasen
```
Phase 1 (Core) ──────────┬──────────> Phase 2 (Produkte)
│ │
│ ▼
└──────────> Phase 3 (Frontend) ──> Phase 7 (Polish)
Phase 4 (Tickets)
Phase 5 (Transactions)
Phase 6 (Wallet/Cashback)
```
- **Phase 1** ist Voraussetzung für alles
- **Phase 2 und 3** können teilweise parallel laufen
- **Phase 4** setzt Phase 3 voraus (Produktdetailseite muss existieren)
- **Phase 5** setzt Phase 4 voraus (Tickets müssen existieren)
- **Phase 6** setzt Phase 5 voraus (Transaktionen müssen existieren)
- **Phase 7** kann teilweise parallel zu Phase 4-6 laufen
---
## 6. Neue Permissions (zu ergänzen)
Folgende Permissions müssen im RoleSeeder ergänzt werden:
| Permission | Beschreibung | Rollen |
|-----------|-------------|--------|
| `curate products` | Produkte freigeben/ablehnen | Admin, Super-Admin |
| `view tickets` | Eigene Tickets sehen | Customer |
| `create tickets` | Ticket generieren | Customer |
| `redeem tickets` | Ticket einlösen | Retailer |
| `view transactions` | Transaktionen sehen | Customer, Retailer, Estate-Agent, Admin |
| `confirm transactions` | Umsatz bestätigen | Retailer |
| `upload receipts` | Beleg hochladen | Customer |
| `view wallet` | Wallet-Guthaben sehen | Customer, Estate-Agent, Retailer |
| `manage wallets` | Wallets verwalten | Admin |
| `view commissions` | Provisionen einsehen | Estate-Agent, Admin |
| `manage setup packages` | Setup-Pakete verwalten | Admin |
| `book setup package` | Setup-Paket buchen | Retailer |
---
*Dieses Dokument dient als lebende Referenz für die Entwicklung. Bei Änderungen am Konzept muss dieser Plan entsprechend aktualisiert werden.*
ochladen | Customer |
| `view wallet` | Wallet-Guthaben sehen | Customer, Estate-Agent, Retailer |
| `manage wallets` | Wallets verwalten | Admin |
| `view commissions` | Provisionen einsehen | Estate-Agent, Admin |
| `manage setup packages` | Setup-Pakete verwalten | Admin |
| `book setup package` | Setup-Paket buchen | Retailer |
---
*Dieses Dokument dient als lebende Referenz für die Entwicklung. Bei Änderungen am Konzept muss dieser Plan entsprechend aktualisiert werden.*

View file

@ -0,0 +1,318 @@
Konzept-Update: "Local for Local" Marktplatz
1. Strategische Neuausrichtung: Die Domains
Die Trennung wird schärfer.
B2In (Backend/B2B): Bleibt das "Maschinenraum"-Portal für Händler, Hersteller und Makler. Hier wird verwaltet.
Local for Local (Customer Frontend): Das wird das Gesicht zum Kunden. Der Kunde fühlt sich nicht auf einer abstrakten "B2In"-Seite, sondern in seinem regionalen Hub (z.B. "Local for Local OWL").
To-Do: Wir benötigen ggf. die Domain localforlocal.de (o.ä.) und routen diese auf die Endkunden-Ansicht.
Onboarding: Findet hier statt ("Werde Teil des lokalen Kreislaufs").
2. Das neue Produkt-Konzept (2 Kategorien)
Wir unterscheiden im Backend bei der Produktanlage künftig zwei Typen:
Typ A: Das "Teaser-Produkt" (Ticket-System)
Ziel: Frequenzbringer für den stationären Handel (Online-to-Offline).
Funktion: Der Kunde kauft nicht direkt online. Er sieht ein Möbelstück (z.B. "Sofa Bielefeld"), verliebt sich, sieht aber: "Beratung und Stoffauswahl nötig".
Der "Ticket-Workflow" (Neu):
Button: "Ticket & Rabatt sichern".
System generiert einen QR-Code/Voucher für einen spezifischen Händler im Hub des Kunden.
Call-to-Action: "Gehen Sie zu Möbelhaus Müller, zeigen Sie diesen Code und erhalten Sie 5% Rabatt + Fachberatung".
Vorteil: Nimmt den Preisdruck, fördert Beratung, messbarer Erfolg für den Händler (er scannt das Ticket).
Typ B: Die "Konfigurations-Anlage"
Ziel: Darstellung komplexer Wohnwände/Systeme.
Funktion: Zeigt die Machbarkeit und Tiefe des Sortiments ("Alles ist möglich"). Dient als "Showcase" für die Kompetenz der Hersteller.
3. Vertrauen durch erweiterte Profile ("Faces")
Der Marktplatz wird menschlicher. Wir erweitern die Partner-Datenbank (partners Tabelle) massiv um Marketing-Elemente.
Händler/Hersteller/Makler-Profilseite:
Team-Vorstellung: "Ihr Beraterteam vor Ort" (Fotos von echten Menschen).
Galerie: Bilder vom Showroom/Ladenlokal.
Story: "Seit 1950 in Herford..."
Zweck: Wenn der Kunde das "Ticket" zieht, weiß er schon, zu wem er geht. Das senkt die Hemmschwelle enorm.
4. Die User Journey (Kauf-Philosophie)
Das Dashboard des Kunden ("Mein Zuhause") wird zum emotionalen Feed.
Login/Start: Kunde sieht Möbel aus seinem Hub ("Local for Local").
Detailseite:
Großes Bild.
Philosophie-Text (Storytelling zum Möbel).
Preisanzeige: "Ab 2.500 € Ihr Endpreis hängt von Ihrer Konfiguration ab." (Nimmt die Angst vor Fixpreisen).
Action: "Ticket ziehen" -> Terminvereinbarung mit Herrn [Name des Verkäufers] im lokalen Möbelhaus vorschlagen.
Auswirkungen auf die Entwicklung (Roadmap Anpassung)
Das passt sehr gut in unseren aktuellen Plan für Januar/Februar (Produkte & Marktplatz). Wir müssen nur den Fokus leicht verschieben:
Produkt-Datenbank (Phase 1 Abschluss):
Wir fügen ein Feld product_type hinzu (teaser vs. config).
Wir fügen Logik für "Preise ab" oder "Preis auf Anfrage" hinzu.
Partner-Profile (Erweiterung):
Im Backend (das du gerade baust) brauchen wir Upload-Felder für Team-Fotos und "Über uns"-Texte. Das ist schnell gemacht.
Das Ticket-System (Teil von Phase 2 Marktplatz):
Anstatt eines klassischen "Warenkorbs" bauen wir für Typ A Produkte einen "Ticket-Generator".
Das ist technisch einfacher als ein Checkout mit Payment-Provider! Wir generieren ein PDF/QR-Code und senden eine Mail.
Konzeptpapier: B2In / Local for Local Marktplatz-Ökosystem
Status: Final | Version: 1.1 (Update: Marken-Hierarchie)
1. Executive Summary
Das B2In-Ökosystem ist ein hybrider Marktplatz, der den Immobilienkauf ("Moment of Need") mit der Einrichtung verbindet. Es agiert als "Closed Shop" (Zugang nur über Makler). B2In ist die zentrale B2B-Plattform und Technologie. Local for Local ist das verbindende Prinzip innerhalb des Marktplatzes, das die Endkunden-Marken (style2own, stileigentum) mit den regionalen Händlern verknüpft.
Der USP liegt in der Transparenz lokaler Verfügbarkeit (Säule A: Local Express) und exklusiven Insider-Konditionen (Säule B: Smart Club), abgesichert durch ein Cashback-System.
2. Marken-Architektur & Entry-Points
Wir unterscheiden strikt zwischen dem B2B-Zugang (Partner) und den B2C-Einstiegen (Endkunden).
A. Der B2B-Kanal (Die Dachmarke)
Marke: B2In
Zielgruppe: Immobilienmakler, Händler, Hersteller.
Funktion: Akquise, Partner-Login, Verwaltung ("Maschinenraum").
Positionierung: "Das Netzwerk für Immobilien & Einrichtung." Hier findet das Business statt.
B. Die B2C-Kanäle (Die Zielgruppen-Türen)
Der Makler entscheidet anhand der Käuferstruktur, über welche "Tür" der Kunde das System betritt. Beide Landingpages führen in denselben Marktplatz:
1. Marke: Style2Own
Zielgruppe: Young Professionals, Erstbezug, Urban, Trend-orientiert.
Tonalität: Modern, "Du"-Ansprache, Lifestyle-Fokus.
Story: "Dein Style. Deine Stadt."
2. Marke: StilEigentum
Zielgruppe: Gehobenes Segment, Best Ager, Villen, Qualitäts-orientiert.
Tonalität: Exklusiv, "Sie"-Ansprache, Werte-Fokus.
Story: "Exzellenz und Tradition."
C. Das verbindende Element (Inside the Portal)
Prinzip: Local for Local
Funktion: Sobald der Kunde (egal ob über style2own oder stileigentum) eingeloggt ist, greift die "Local for Local"-Logik.
Erlebnis: Das Portal passt sich dem Hub des Kunden an und zeigt die lokalen Händler als "Local Heroes". Es ist die Klammer, die den Marktplatz definiert.
3. Marktplatz & Produktstrategie (Das 2-Säulen-Modell)
Im Portal angekommen, wird das Angebot nach Bedürfnis (Zeit vs. Planung) getrennt.
Säule A: "Local Express" (Phase 1 Focus)
Narrativ: "David gegen Goliath" (Support your Locals).
Angebot: Sofort verfügbare Ausstellungsstücke, Lagerware und kuratierte "Hidden Gems" der lokalen Fachhändler.
Kunden-Vorteil:
Verfügbarkeit: "Was ist heute in meiner Nähe abholbereit?" (Schlägt Google Maps).
Preis/Leistung: Markenware oft günstiger als im Großmarkt.
Händler-Vorteil: Abverkauf von Ausstellungsware (Liquidität), Frequenz im Laden.
Säule B: "Smart Club" (Phase 2 Focus)
Narrativ: "Insider Access".
Angebot: Frei konfigurierbare Neuware (Bestellung).
Kunden-Vorteil: Zugriff auf "Closed Shop"-Konditionen (Objekt-Preise), die öffentlich nicht verfügbar sind.
Strategie: Hersteller können hier Rabatte geben, ohne ihre öffentlichen Marktpreise zu zerstören.
4. Monetarisierung & Tracking (Das Cashback-Clearing)
Das System löst das Problem der fehlenden Transparenz bei Offline-Käufen durch Inzentivierung des Kunden.
Der Prozess:
Ticket: Kunde zieht im Portal einen QR-Code für Händler X.
Kauf: Kunde kauft vor Ort, verhandelt Preise individuell.
Upload (Der Trigger): Kunde lädt Kaufbeleg im B2In-Portal hoch, um sein Cashback anzufordern.
Clearing: Händler bestätigt Umsatz im Backend -> Händler zahlt Gesamt-Provision an B2In.
Ausschüttung: Sobald Geld eingeht, verteilt das System automatisch:
Provision an Makler (Lead-Vergütung).
Cashback an Kunden (Motivation & Datentreue).
Marge an B2In.
1. Core-Modul: Hub & User Logic
Das Fundament. Hier wird entschieden, wer was sehen darf.
Hub-Logik (Hub Model):
Jeder User (Kunde, Makler, Händler) wird einer hub_id zugeordnet (z.B. Hub OWL, Hub Hamburg).
Logik: Ein Kunde aus OWL sieht nur Händler und Produkte mit hub_id = OWL. Das ist der Kern von "Local for Local".
User-Origin (origin Feld):
In der users Tabelle speichern wir, woher der Kunde kam: style2own oder stileigentum.
Zweck: Steuert das Theme im Dashboard (Modern vs. Klassisch), die Datenbank bleibt aber dieselbe.
Rollen-System (Erweiterung):
role: broker (Sieht Provisionen, generiert Invites).
role: merchant (Sieht Produkt-Upload, Clearing).
role: customer (Sieht Shop, Wallet, Upload).
role: admin (Sieht alles + Approval Queue).
2. Produkt-Modul: "The 2 Pillars"
Die Verwaltung der Waren. Hier unterscheiden wir die Strategie.
Produkte Tabelle (products):
Erweiterung um product_type:
'local_stock' (= Säule A, Ausstellungsstück, Händler-gebunden).
'smart_order' (= Säule B, Neuware, Hersteller-gebunden).
is_curated (Boolean): Für die Qualitätssicherung. Erst wenn Admin "OK" gibt, ist das Produkt öffentlich sichtbar.
Händler-Upload (Simple UI):
Extrem vereinfachtes Formular für Händler (Handy-optimiert): Foto, Titel, Preis, Statt-Preis, Status (Verfügbar/Verkauft).
Kein komplexes Warenwirtschafts-Monster!
3. Transaction-Engine: Ticket & Cashback (Das Herzstück)
Hier fließt das Geld. Das ist der komplexeste Teil der Business-Logik.
A. Das Ticket-System (Ticket Model)
Funktion: Kunde klickt "Ticket ziehen".
Daten: user_id, merchant_id, code (Unique String/Hash), created_at.
QR-Generierung: On-the-fly Generierung des Codes für das Frontend.
B. Das Clearing-System (Transaction / Receipt Model)
Upload: Kunde lädt Foto hoch + gibt Betrag ein.
Status-Maschine (State Machine):
pending_merchant: Händler muss bestätigen ("Ja, Kunde war da und hat für 3.000€ gekauft").
confirmed: Händler hat bestätigt -> Rechnung an Händler wird generiert.
paid: Händler hat Provision an B2In überwiesen.
distributed: Provision wurde an Makler/Kunde ausgeschüttet.
C. Die Wallet-Logik (Wallet / Commission Model)
Sobald Status auf paid springt, feuert ein Event (TransactionPaid):
Berechnet Split: x% an Makler-Wallet, y% an Kunden-Wallet (Cashback).
Erstellt Einträge in der ledger (Kassenbuch) Tabelle.
4. Partner-Modul: Makler & Händler Dashboards
Die B2B-Ansichten.
Makler-Invite System:
Makler generiert "Invite-Links" oder Codes für style2own/stileigentum.
Wenn sich ein Kunde damit registriert, wird broker_id fest beim Kunden hinterlegt (Attribution).
Händler Setup-Buchung:
Ein kleiner "Service-Store" im Händler-Backend.
Button: "Setup-Paket buchen (399€)". Löst eine interne Notification an das B2In-Team aus (Ticket für Fotografen).
5. Frontend-Modul: Die Weichenstellung
Wie die Landingpages mit dem System reden.
Multi-Domain-Routing:
Wenn Request von style2own.de kommt -> Lade CSS-Variablen-Set "Modern" + Wording "Du".
Wenn Request von stileigentum.de kommt -> Lade CSS-Variablen-Set "Classic" + Wording "Sie".
Der "Local Feed" (Marktplatz-View):
Query: SELECT * FROM products WHERE hub_id = [User-Hub] AND status = 'active'.
Sortierung: Lagerware (Säule A) gemischt mit Highlights.
Zusammenfassung: Der Entwicklungs-Fahrplan
Das ist die logische Reihenfolge für die Programmierung:
Phase 1: DB & Auth (Basis)
User Table mit hub_id, origin, broker_id.
Hub Table.
Registrierung über Invite-Code (Verknüpfung Makler-Kunde).
Phase 2: Händler & Produkte (Content)
Händler-Profil (Öffnungszeiten, Bilder).
Produkt-CRUD (Create, Read, Update, Delete) für Händler (Säule A).
Frontend-Feed ("Zeige Produkte in meinem Hub").
Phase 3: Der "Geld-Kreislauf" (Logik)
Ticket-Generierung (QR).
WICHTIG: Beleg-Upload Formular für Kunden.
Händler-Backend: Ansicht "Offene Umsatz-Bestätigungen".
Phase 4: Frontend Polish
Style2Own vs. StilEigentum Styling.
Dashboards hübsch machen.
Wie die Module zusammenhängen (Flow)
Landingpage (Origin) -> Registrierung (Auth + Broker-Link) -> User landet im Hub (Hub-Logik) -> Sieht Produkte (Catalog) -> Zieht Ticket -> Lädt Beleg hoch (Transaction) -> Händler bestätigt -> Cashback fließt (Wallet).

0
dev/core-module.md Normal file
View file