20-02-2026
This commit is contained in:
parent
854ce02bf6
commit
4d6b4930b2
128 changed files with 18247 additions and 2093 deletions
70
dev/12-01-2026/Moebeldatenliste Stand 4.11.2025.csv
Normal file
70
dev/12-01-2026/Moebeldatenliste Stand 4.11.2025.csv
Normal 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);Min–Max-Spanne;4–6;🟥 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 (1–5);gering = 1;3;🟩 Optional
|
||||
;Designpunkte (1–5);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
|
||||
|
941
dev/12-01-2026/db-backup.sql
Normal file
941
dev/12-01-2026/db-backup.sql
Normal 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 */;
|
||||
983
dev/12-01-2026/entwicklungsplan.md
Normal file
983
dev/12-01-2026/entwicklungsplan.md
Normal 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.*
|
||||
318
dev/12-01-2026/konzeption.md
Normal file
318
dev/12-01-2026/konzeption.md
Normal 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).
|
||||
Loading…
Add table
Add a link
Reference in a new issue