Files
adsPRO/migrations/demo_data.sql
Jacek Pyziak afe9d6216d Add migrations for Google Ads settings and demo data
- Create migration for global settings table and add google_ads_customer_id and google_ads_start_date columns to clients table.
- Add migration to include product_url column in products_data table.
- Insert demo data for campaigns, products, and their history for client 'pomysloweprezenty.pl'.
- Implement client management interface with modals for adding and editing clients, including Google Ads Customer ID and data retrieval start date.
2026-02-15 17:46:32 +01:00

362 lines
18 KiB
SQL

-- ============================================================
-- DANE DEMO dla adsPRO
-- Klient: pomysloweprezenty.pl (client_id = 2)
-- Data generacji: 2026-02-15
-- ============================================================
-- UWAGA: Uruchom ten skrypt TYLKO na bazie testowej/deweloperskiej!
-- Zakłada że klient o id=2 istnieje z google_ads_customer_id = '941-605-1782'
-- ============================================================
-- ============================================================
-- 1. KAMPANIE
-- ============================================================
INSERT INTO `campaigns` (`client_id`, `campaign_id`, `campaign_name`) VALUES
(2, 20845671001, 'PMAX | Prezenty personalizowane'),
(2, 20845671002, 'PMAX | Bestsellery'),
(2, 20845671003, 'PMAX | Walentynki 2026'),
(2, 20845671004, 'Shopping | Wszystkie produkty'),
(2, 20845671005, 'Shopping | Prezenty do 50 zł'),
(2, 20845671006, 'Shopping | Prezenty premium'),
(2, 20845671007, 'PMAX | Nowości'),
(2, 20845671008, 'Shopping | Bestsellery high ROAS');
-- Zapamiętaj ID kampanii (zakładam auto_increment od 1)
SET @camp1 = (SELECT id FROM campaigns WHERE campaign_id = 20845671001 AND client_id = 2);
SET @camp2 = (SELECT id FROM campaigns WHERE campaign_id = 20845671002 AND client_id = 2);
SET @camp3 = (SELECT id FROM campaigns WHERE campaign_id = 20845671003 AND client_id = 2);
SET @camp4 = (SELECT id FROM campaigns WHERE campaign_id = 20845671004 AND client_id = 2);
SET @camp5 = (SELECT id FROM campaigns WHERE campaign_id = 20845671005 AND client_id = 2);
SET @camp6 = (SELECT id FROM campaigns WHERE campaign_id = 20845671006 AND client_id = 2);
SET @camp7 = (SELECT id FROM campaigns WHERE campaign_id = 20845671007 AND client_id = 2);
SET @camp8 = (SELECT id FROM campaigns WHERE campaign_id = 20845671008 AND client_id = 2);
-- ============================================================
-- 2. HISTORIA KAMPANII (30 dni: 2026-01-16 do 2026-02-14)
-- ============================================================
-- Generujemy dane dzienne za pomocą procedury
DELIMITER //
DROP PROCEDURE IF EXISTS generate_campaign_history//
CREATE PROCEDURE generate_campaign_history()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE cur_date DATE;
DECLARE day_factor FLOAT;
WHILE i < 30 DO
SET cur_date = DATE_SUB('2026-02-14', INTERVAL i DAY);
-- Weekendy mają wyższe wydatki (factor 1.2-1.4), dni powszednie normalne
SET day_factor = CASE DAYOFWEEK(cur_date)
WHEN 1 THEN 1.3 -- niedziela
WHEN 7 THEN 1.4 -- sobota
WHEN 6 THEN 1.1 -- piątek
ELSE 1.0
END;
-- Walentynki boost (7-14 lutego)
IF cur_date BETWEEN '2026-02-07' AND '2026-02-14' THEN
SET day_factor = day_factor * 1.5;
END IF;
-- PMAX | Prezenty personalizowane (wysoki ROAS, duży budżet)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp1, cur_date,
ROUND(450 + RAND() * 150, 2),
ROUND(520 + RAND() * 80, 2),
150.00,
ROUND((130 + RAND() * 40) * day_factor, 2),
ROUND((600 + RAND() * 300) * day_factor, 2),
'Docelowy ROAS | docelowy ROAS: 400%');
-- PMAX | Bestsellery (bardzo wysoki ROAS)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp2, cur_date,
ROUND(650 + RAND() * 200, 2),
ROUND(700 + RAND() * 100, 2),
200.00,
ROUND((170 + RAND() * 60) * day_factor, 2),
ROUND((1200 + RAND() * 500) * day_factor, 2),
'Docelowy ROAS | docelowy ROAS: 600%');
-- PMAX | Walentynki 2026 (sezonowa, wysoki wydatek w lutym)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp3, cur_date,
ROUND(350 + RAND() * 200 + IF(cur_date >= '2026-02-01', 100, 0), 2),
ROUND(380 + RAND() * 120, 2),
ROUND(IF(cur_date >= '2026-02-01', 250, 80), 2),
ROUND((IF(cur_date >= '2026-02-01', 200, 60) + RAND() * 50) * day_factor, 2),
ROUND((IF(cur_date >= '2026-02-01', 800, 200) + RAND() * 400) * day_factor, 2),
'Maksymalizacja wartosci konwersji');
-- Shopping | Wszystkie produkty (umiarkowany ROAS, duży budżet)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp4, cur_date,
ROUND(300 + RAND() * 100, 2),
ROUND(350 + RAND() * 60, 2),
100.00,
ROUND((85 + RAND() * 30) * day_factor, 2),
ROUND((280 + RAND() * 120) * day_factor, 2),
'Docelowy ROAS | docelowy ROAS: 300%');
-- Shopping | Prezenty do 50 zł (niski CPC, dobry ROAS)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp5, cur_date,
ROUND(380 + RAND() * 120, 2),
ROUND(400 + RAND() * 80, 2),
50.00,
ROUND((40 + RAND() * 15) * day_factor, 2),
ROUND((170 + RAND() * 80) * day_factor, 2),
'Docelowy ROAS | docelowy ROAS: 350%');
-- Shopping | Prezenty premium (niski ROAS, wysoki AOV)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp6, cur_date,
ROUND(200 + RAND() * 100, 2),
ROUND(250 + RAND() * 80, 2),
80.00,
ROUND((65 + RAND() * 25) * day_factor, 2),
ROUND((150 + RAND() * 100) * day_factor, 2),
'Maksymalizacja wartosci konwersji');
-- PMAX | Nowości (nowa kampania, niski ROAS na start)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp7, cur_date,
ROUND(180 + RAND() * 100 + i * 3, 2),
ROUND(200 + RAND() * 80, 2),
60.00,
ROUND((50 + RAND() * 20) * day_factor, 2),
ROUND((100 + RAND() * 80 + i * 5) * day_factor, 2),
'Maksymalizacja liczby konwersji');
-- Shopping | Bestsellery high ROAS (najlepsza kampania)
INSERT INTO campaigns_history (campaign_id, date_add, roas_30_days, roas_all_time, budget, money_spent, conversion_value, bidding_strategy) VALUES
(@camp8, cur_date,
ROUND(800 + RAND() * 300, 2),
ROUND(850 + RAND() * 150, 2),
120.00,
ROUND((100 + RAND() * 35) * day_factor, 2),
ROUND((900 + RAND() * 400) * day_factor, 2),
'Docelowy ROAS | docelowy ROAS: 700%');
SET i = i + 1;
END WHILE;
END//
DELIMITER ;
CALL generate_campaign_history();
DROP PROCEDURE IF EXISTS generate_campaign_history;
-- ============================================================
-- 3. PRODUKTY (25 produktów - realistyczne nazwy sklepu z prezentami)
-- ============================================================
INSERT INTO `products` (`client_id`, `offer_id`, `name`) VALUES
(2, 'shopify_PL_8901001', 'Kubek personalizowany ze zdjęciem - Biały 330ml'),
(2, 'shopify_PL_8901002', 'Poduszka z własnym nadrukiem 40x40cm'),
(2, 'shopify_PL_8901003', 'Brelok LED z grawerem - Serce'),
(2, 'shopify_PL_8901004', 'Ramka na zdjęcie z dedykacją - Drewniana A4'),
(2, 'shopify_PL_8901005', 'Puzzle ze zdjęciem 500 elementów'),
(2, 'shopify_PL_8901006', 'Koszulka z nadrukiem - Dla Najlepszego Taty'),
(2, 'shopify_PL_8901007', 'Skarpetki personalizowane - Zestaw 3 par'),
(2, 'shopify_PL_8901008', 'Kubek magiczny zmieniający kolor ze zdjęciem'),
(2, 'shopify_PL_8901009', 'Plakat personalizowany - Mapa Gwiazd A3'),
(2, 'shopify_PL_8901010', 'Biżuteria - Naszyjnik z grawerem Serce'),
(2, 'shopify_PL_8901011', 'Etui na telefon z własnym zdjęciem'),
(2, 'shopify_PL_8901012', 'Torba bawełniana z nadrukiem'),
(2, 'shopify_PL_8901013', 'Kalendarz ze zdjęciami 2026 - Ścienny A3'),
(2, 'shopify_PL_8901014', 'Podkładka pod mysz z własnym zdjęciem'),
(2, 'shopify_PL_8901015', 'Zestaw upominkowy - Kubek + Podkładka + Brelok'),
(2, 'shopify_PL_8901016', 'Obraz na płótnie Canvas 60x40cm ze zdjęciem'),
(2, 'shopify_PL_8901017', 'Otwieracz do butelek z grawerem'),
(2, 'shopify_PL_8901018', 'Fotokolaż na płótnie 50x70cm'),
(2, 'shopify_PL_8901019', 'Koc z nadrukiem polarowy 150x200cm'),
(2, 'shopify_PL_8901020', 'Piersiówka z grawerem 200ml'),
(2, 'shopify_PL_8901021', 'Zegar ścienny ze zdjęciem - Okrągły 30cm'),
(2, 'shopify_PL_8901022', 'Ręcznik z haftem imienia 70x140cm'),
(2, 'shopify_PL_8901023', 'Walentynkowy zestaw - Kubek + Czekolada + Kartka'),
(2, 'shopify_PL_8901024', 'Magnes na lodówkę z własnym zdjęciem'),
(2, 'shopify_PL_8901025', 'Szkatułka drewniana z grawerem');
-- ============================================================
-- 4. HISTORIA PRODUKTÓW (30 dni dziennych danych)
-- ============================================================
DELIMITER //
DROP PROCEDURE IF EXISTS generate_product_history//
CREATE PROCEDURE generate_product_history()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE j INT DEFAULT 1;
DECLARE cur_date DATE;
DECLARE prod_id INT;
DECLARE base_imp INT;
DECLARE base_clicks INT;
DECLARE base_cost DECIMAL(10,2);
DECLARE base_conv INT;
DECLARE base_conv_val DECIMAL(10,2);
DECLARE day_imp INT;
DECLARE day_clicks INT;
DECLARE day_cost DECIMAL(10,2);
DECLARE day_conv INT;
DECLARE day_conv_val DECIMAL(10,2);
DECLARE day_ctr DECIMAL(6,4);
DECLARE day_factor FLOAT;
DECLARE product_count INT;
SET product_count = 25;
-- Dla każdego produktu
SET j = 1;
WHILE j <= product_count DO
-- Pobierz ID produktu
SET prod_id = (SELECT id FROM products WHERE client_id = 2 AND offer_id = CONCAT('shopify_PL_890100', j) LIMIT 1);
IF prod_id IS NULL AND j >= 10 THEN
SET prod_id = (SELECT id FROM products WHERE client_id = 2 AND offer_id = CONCAT('shopify_PL_89010', j) LIMIT 1);
END IF;
-- Bazowe metryki różne per produkt (symulacja różnej popularności)
CASE j
WHEN 1 THEN SET base_imp = 850, base_clicks = 45, base_cost = 12.50, base_conv = 3, base_conv_val = 89.70; -- Kubek - bestseller
WHEN 2 THEN SET base_imp = 620, base_clicks = 32, base_cost = 9.80, base_conv = 2, base_conv_val = 79.80; -- Poduszka
WHEN 3 THEN SET base_imp = 1200, base_clicks = 68, base_cost = 15.20, base_conv = 5, base_conv_val = 74.75; -- Brelok LED - top impressions
WHEN 4 THEN SET base_imp = 380, base_clicks = 18, base_cost = 7.20, base_conv = 1, base_conv_val = 59.90; -- Ramka
WHEN 5 THEN SET base_imp = 520, base_clicks = 28, base_cost = 11.00, base_conv = 2, base_conv_val = 99.80; -- Puzzle
WHEN 6 THEN SET base_imp = 780, base_clicks = 42, base_cost = 13.50, base_conv = 3, base_conv_val = 89.70; -- Koszulka
WHEN 7 THEN SET base_imp = 450, base_clicks = 22, base_cost = 6.80, base_conv = 2, base_conv_val = 49.90; -- Skarpetki
WHEN 8 THEN SET base_imp = 680, base_clicks = 38, base_cost = 10.50, base_conv = 2, base_conv_val = 69.90; -- Kubek magiczny
WHEN 9 THEN SET base_imp = 920, base_clicks = 55, base_cost = 18.00, base_conv = 4, base_conv_val = 159.60; -- Plakat mapa gwiazd - wysoki AOV
WHEN 10 THEN SET base_imp = 1100, base_clicks = 72, base_cost = 22.00, base_conv = 5, base_conv_val = 349.50; -- Naszyjnik - top conversion value
WHEN 11 THEN SET base_imp = 550, base_clicks = 30, base_cost = 8.50, base_conv = 1, base_conv_val = 39.90; -- Etui
WHEN 12 THEN SET base_imp = 320, base_clicks = 14, base_cost = 4.20, base_conv = 1, base_conv_val = 29.90; -- Torba
WHEN 13 THEN SET base_imp = 280, base_clicks = 12, base_cost = 5.00, base_conv = 0, base_conv_val = 0.00; -- Kalendarz - słaby (po sezonie)
WHEN 14 THEN SET base_imp = 180, base_clicks = 8, base_cost = 2.50, base_conv = 0, base_conv_val = 0.00; -- Podkładka - zombie
WHEN 15 THEN SET base_imp = 740, base_clicks = 40, base_cost = 14.00, base_conv = 3, base_conv_val = 179.70; -- Zestaw upominkowy
WHEN 16 THEN SET base_imp = 480, base_clicks = 25, base_cost = 16.00, base_conv = 1, base_conv_val = 149.00; -- Canvas
WHEN 17 THEN SET base_imp = 350, base_clicks = 18, base_cost = 5.50, base_conv = 1, base_conv_val = 34.90; -- Otwieracz
WHEN 18 THEN SET base_imp = 410, base_clicks = 22, base_cost = 14.00, base_conv = 1, base_conv_val = 189.00; -- Fotokolaż
WHEN 19 THEN SET base_imp = 290, base_clicks = 15, base_cost = 9.00, base_conv = 1, base_conv_val = 119.00; -- Koc
WHEN 20 THEN SET base_imp = 420, base_clicks = 24, base_cost = 7.00, base_conv = 1, base_conv_val = 69.90; -- Piersiówka
WHEN 21 THEN SET base_imp = 260, base_clicks = 11, base_cost = 4.50, base_conv = 0, base_conv_val = 0.00; -- Zegar - słaby
WHEN 22 THEN SET base_imp = 340, base_clicks = 16, base_cost = 6.00, base_conv = 1, base_conv_val = 59.90; -- Ręcznik
WHEN 23 THEN SET base_imp = 1500, base_clicks = 95, base_cost = 28.00, base_conv = 8, base_conv_val = 319.20; -- Walentynkowy zestaw - HIT
WHEN 24 THEN SET base_imp = 150, base_clicks = 6, base_cost = 1.80, base_conv = 0, base_conv_val = 0.00; -- Magnes - zombie
WHEN 25 THEN SET base_imp = 380, base_clicks = 20, base_cost = 8.00, base_conv = 1, base_conv_val = 89.90; -- Szkatułka
ELSE SET base_imp = 300, base_clicks = 15, base_cost = 5.00, base_conv = 1, base_conv_val = 50.00;
END CASE;
-- 30 dni historii
SET i = 0;
WHILE i < 30 DO
SET cur_date = DATE_SUB('2026-02-14', INTERVAL i DAY);
SET day_factor = CASE DAYOFWEEK(cur_date)
WHEN 1 THEN 1.25
WHEN 7 THEN 1.35
WHEN 6 THEN 1.1
ELSE 1.0
END;
-- Walentynki boost (szczególnie produkty walentynkowe: j=23, j=10, j=9)
IF cur_date BETWEEN '2026-02-07' AND '2026-02-14' THEN
IF j IN (23, 10, 9, 3, 1) THEN
SET day_factor = day_factor * 2.0;
ELSE
SET day_factor = day_factor * 1.3;
END IF;
END IF;
SET day_imp = ROUND(base_imp * day_factor * (0.8 + RAND() * 0.4));
SET day_clicks = ROUND(base_clicks * day_factor * (0.7 + RAND() * 0.6));
SET day_cost = ROUND(base_cost * day_factor * (0.8 + RAND() * 0.4), 2);
-- Konwersje: losowe z prawdopodobieństwem bazowym
SET day_conv = FLOOR(base_conv * day_factor * (0.3 + RAND() * 1.4));
SET day_conv_val = ROUND(IF(day_conv > 0, day_conv * (base_conv_val / GREATEST(base_conv, 1)) * (0.9 + RAND() * 0.2), 0), 2);
SET day_ctr = IF(day_imp > 0, ROUND(day_clicks / day_imp, 4) * 100, 0);
IF prod_id IS NOT NULL THEN
INSERT INTO products_history (product_id, date_add, impressions, clicks, ctr, cost, conversions, conversions_value, updated) VALUES
(prod_id, cur_date, day_imp, day_clicks, day_ctr, day_cost, day_conv, day_conv_val, 0);
END IF;
SET i = i + 1;
END WHILE;
SET j = j + 1;
END WHILE;
END//
DELIMITER ;
CALL generate_product_history();
DROP PROCEDURE IF EXISTS generate_product_history;
-- ============================================================
-- 5. PRODUCTS_TEMP (zagregowane dane - jak po cron_products)
-- ============================================================
INSERT INTO products_temp (product_id, name, impressions, impressions_30, clicks, clicks_30, ctr, cost, conversions, conversions_value, cpc, roas)
SELECT
p.id,
p.name,
COALESCE(SUM(ph.impressions), 0),
COALESCE(SUM(ph.impressions), 0),
COALESCE(SUM(ph.clicks), 0),
COALESCE(SUM(ph.clicks), 0),
CASE WHEN SUM(ph.impressions) > 0 THEN ROUND(SUM(ph.clicks) / SUM(ph.impressions) * 100, 2) ELSE 0 END,
COALESCE(SUM(ph.cost), 0),
COALESCE(SUM(ph.conversions), 0),
COALESCE(SUM(ph.conversions_value), 0),
CASE WHEN SUM(ph.clicks) > 0 THEN ROUND(SUM(ph.cost) / SUM(ph.clicks), 6) ELSE 0 END,
CASE WHEN SUM(ph.conversions) > 0 AND SUM(ph.cost) > 0 THEN ROUND(SUM(ph.conversions_value) / SUM(ph.cost) * 100, 2) ELSE 0 END
FROM products p
LEFT JOIN products_history ph ON p.id = ph.product_id
WHERE p.client_id = 2
GROUP BY p.id, p.name;
-- ============================================================
-- 6. PRODUCTS_DATA (custom labels)
-- ============================================================
-- Bestsellery (wysoki ROAS + dużo konwersji)
INSERT INTO products_data (product_id, custom_label_4) VALUES
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901001' AND client_id = 2), 'bestseller'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901003' AND client_id = 2), 'bestseller'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901010' AND client_id = 2), 'bestseller'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901023' AND client_id = 2), 'bestseller');
-- Produkty PLA (w kampaniach Shopping)
INSERT INTO products_data (product_id, custom_label_4) VALUES
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901005' AND client_id = 2), 'pla'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901006' AND client_id = 2), 'pla'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901015' AND client_id = 2), 'pla');
-- Zombie (bardzo niskie wyświetlenia)
INSERT INTO products_data (product_id, custom_label_4) VALUES
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901014' AND client_id = 2), 'zombie'),
((SELECT id FROM products WHERE offer_id = 'shopify_PL_8901024' AND client_id = 2), 'zombie');
-- ============================================================
-- 7. MIN ROAS per klient (bestseller threshold)
-- ============================================================
-- Ustaw min ROAS dla wybranych produktów
UPDATE products SET min_roas = 500 WHERE offer_id = 'shopify_PL_8901001' AND client_id = 2;
UPDATE products SET min_roas = 400 WHERE offer_id = 'shopify_PL_8901003' AND client_id = 2;
UPDATE products SET min_roas = 600 WHERE offer_id = 'shopify_PL_8901010' AND client_id = 2;
UPDATE products SET min_roas = 350 WHERE offer_id = 'shopify_PL_8901023' AND client_id = 2;
-- ============================================================
-- GOTOWE!
-- Po wykonaniu tego skryptu:
-- 1. Wejdź na /campaigns → wybierz klienta pomysloweprezenty.pl
-- → zobaczysz 8 kampanii z 30-dniową historią
-- 2. Wejdź na /products → wybierz klienta
-- → zobaczysz 25 produktów z metrykami
-- 3. Kliknij dowolny produkt → zobaczysz historię i wykres
-- ============================================================