-- ============================================================
-- i-BOK 5 - Dane demonstracyjne
-- ISP "FibraNet" działający od 10 lat, ~500 klientów
-- ============================================================
-- UWAGA: Ten skrypt tworzy tabele i widoki od zera!
-- Wykonaj na PUSTEJ bazie danych skonfigurowanej w i-BOK 5.
-- ============================================================

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ============================================================
-- 1. TABELA: Podmioty (firma ISP)
-- ============================================================
DROP TABLE IF EXISTS Podmioty;
CREATE TABLE Podmioty (
    P_INDEX       INT AUTO_INCREMENT PRIMARY KEY,
    P_NAZWA1      VARCHAR(200) NOT NULL DEFAULT '',
    P_NAZWA2      VARCHAR(200) NOT NULL DEFAULT '',
    P_ULICA       VARCHAR(100) NOT NULL DEFAULT '',
    P_NRDOMU      VARCHAR(20) NOT NULL DEFAULT '',
    P_NRLOKALU    VARCHAR(20) NOT NULL DEFAULT '',
    P_KODPOCZTOWY VARCHAR(10) NOT NULL DEFAULT '',
    P_MIEJSCOWOSC VARCHAR(100) NOT NULL DEFAULT '',
    P_NIP         VARCHAR(20) NOT NULL DEFAULT '',
    P_REGON       VARCHAR(20) NOT NULL DEFAULT '',
    P_BANK        VARCHAR(100) NOT NULL DEFAULT '',
    P_NRKONTA     VARCHAR(40) NOT NULL DEFAULT '',
    P_TELEFONEMAIL VARCHAR(200) NOT NULL DEFAULT '',
    P_WWW         VARCHAR(200) NOT NULL DEFAULT '',
    P_CZYAKTYWNY  INT NOT NULL DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO Podmioty (P_INDEX, P_NAZWA1, P_NAZWA2, P_ULICA, P_NRDOMU, P_NRLOKALU, P_KODPOCZTOWY, P_MIEJSCOWOSC, P_NIP, P_REGON, P_BANK, P_NRKONTA, P_TELEFONEMAIL, P_WWW, P_CZYAKTYWNY) VALUES
(1, 'FibraNet Sp. z o.o.', 'Jan Kowalski', 'ul. Światłowodowa', '15', '', '00-001', 'Warszawa', '5271234567', '012345678', 'Bank Pekao SA', '48 1240 1234 1234 1234 1234 1234', 'biuro@fibranet.pl', 'www.fibranet.pl', 1);

-- ============================================================
-- 2. TABELA: Userdb (klienci) + widok vUserdb
-- ============================================================
DROP TABLE IF EXISTS Userdb;
CREATE TABLE Userdb (
    U_INDEX       INT AUTO_INCREMENT,
    U_NRKLIENTA   INT NOT NULL,
    U_LOGIN       VARCHAR(50) NOT NULL DEFAULT '',
    U_HASLO       VARCHAR(100) NOT NULL DEFAULT '',
    U_NAZWISKO    VARCHAR(100) NOT NULL DEFAULT '',
    U_IMIE        VARCHAR(100) NOT NULL DEFAULT '',
    U_NRRACHUNKU1 VARCHAR(40) NOT NULL DEFAULT '',
    U_NRRACHUNKU2 VARCHAR(40) NOT NULL DEFAULT '',
    U_SALDO       DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    U_SALDOZALEGLE DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    U_DATAAKTYWACJI DATE DEFAULT NULL,
    U_DATAKONCAUMOWY DATE DEFAULT NULL,
    U_DATADEAKTYWACJI DATE DEFAULT NULL,
    U_DATAMODYFIKACJI DATE DEFAULT NULL,
    U_ZAZNACZ     VARCHAR(10) NOT NULL DEFAULT '',
    U_POWIADAMIAJ VARCHAR(10) NOT NULL DEFAULT '',
    U_BLOKUJ      VARCHAR(10) NOT NULL DEFAULT '',
    U_PASMODOWNLOADDZIENTXT VARCHAR(20) NOT NULL DEFAULT '',
    U_PASMOUPLOADDZIENTXT VARCHAR(20) NOT NULL DEFAULT '',
    U_PASMODOWNLOADNOCTXT VARCHAR(20) NOT NULL DEFAULT '',
    U_PASMOUPLOADNOCTXT VARCHAR(20) NOT NULL DEFAULT '',
    U_ADR_ULICA   VARCHAR(100) NOT NULL DEFAULT '',
    U_ADR_NRDOMU  VARCHAR(20) NOT NULL DEFAULT '',
    U_ADR_NRLOKALU VARCHAR(20) NOT NULL DEFAULT '',
    U_ADR_KOD     VARCHAR(10) NOT NULL DEFAULT '',
    U_ADR_MIEJSCOWOSC VARCHAR(100) NOT NULL DEFAULT '',
    U_TEL1        VARCHAR(30) NOT NULL DEFAULT '',
    U_TEL2        VARCHAR(30) NOT NULL DEFAULT '',
    U_EMAIL       VARCHAR(100) NOT NULL DEFAULT '',
    U_NIP         VARCHAR(20) NOT NULL DEFAULT '',
    U_PESEL       VARCHAR(15) NOT NULL DEFAULT '',
    U_NOTATKA     TEXT,
    U_NOTATKA2    TEXT,
    U_AKTYWNY     INT NOT NULL DEFAULT 1,
    U_PODMIOT     INT NOT NULL DEFAULT 1,
    PRIMARY KEY (U_INDEX),
    KEY idx_nrklienta (U_NRKLIENTA),
    KEY idx_login (U_LOGIN)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 3. TABELA: FV (faktury) + widok vFvLista
-- ============================================================
DROP TABLE IF EXISTS FV;
CREATE TABLE FV (
    FV_INDEX          INT AUTO_INCREMENT PRIMARY KEY,
    FV_NUMERTXT       VARCHAR(50) NOT NULL DEFAULT '',
    FV_SUMABRUTTO     DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FV_KWOTAROZLICZONA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FV_KWOTADOROZLICZENIA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FV_DATAWYSTAWIENIA DATE DEFAULT NULL,
    FV_DATAPLATNOSCI  DATE DEFAULT NULL,
    FV_NumerPdf       VARCHAR(100) NOT NULL DEFAULT '',
    FV_UWAGI          TEXT,
    U_NRKLIENTA       INT NOT NULL DEFAULT 0,
    KEY idx_klient (U_NRKLIENTA),
    KEY idx_data (FV_DATAWYSTAWIENIA)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 4. TABELA: PZ (polecenia zapłaty) + widok vPzLista
-- ============================================================
DROP TABLE IF EXISTS PZ;
CREATE TABLE PZ (
    PZ_INDEX          INT AUTO_INCREMENT PRIMARY KEY,
    PZ_NUMERTXT       VARCHAR(50) NOT NULL DEFAULT '',
    PZ_SUMABRUTTO     DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    PZ_KWOTAROZLICZONA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    PZ_KWOTADOROZLICZENIA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    PZ_DATAWYSTAWIENIA DATE DEFAULT NULL,
    PZ_DATAPLATNOSCI  DATE DEFAULT NULL,
    PZ_NumerPdf       VARCHAR(100) NOT NULL DEFAULT '',
    PZ_UWAGI          TEXT,
    U_NRKLIENTA       INT NOT NULL DEFAULT 0,
    KEY idx_klient (U_NRKLIENTA)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 5. TABELA: FVK (korekty) + widok vFvkLista
-- ============================================================
DROP TABLE IF EXISTS FVK;
CREATE TABLE FVK (
    FVK_INDEX          INT AUTO_INCREMENT PRIMARY KEY,
    FVK_NUMERTXT       VARCHAR(50) NOT NULL DEFAULT '',
    FVK_SUMABRUTTO     DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FVK_KWOTAROZLICZONA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FVK_KWOTADOROZLICZENIA DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    FVK_DATAWYSTAWIENIA DATE DEFAULT NULL,
    FVK_DATAPLATNOSCI  DATE DEFAULT NULL,
    FVK_NumerPdf       VARCHAR(100) NOT NULL DEFAULT '',
    FVK_OPIS           TEXT,
    U_NRKLIENTA        INT NOT NULL DEFAULT 0,
    KEY idx_klient (U_NRKLIENTA)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 6. TABELA: Oplaty (wpłaty) + widok vOplatyLista
-- ============================================================
DROP TABLE IF EXISTS Oplaty;
CREATE TABLE Oplaty (
    O_INDEX          INT AUTO_INCREMENT PRIMARY KEY,
    O_NUMERTXT       VARCHAR(50) NOT NULL DEFAULT '',
    O_KWOTA          DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    O_DATAWPLATY     DATE DEFAULT NULL,
    O_FORMAPLATNOSCI VARCHAR(50) NOT NULL DEFAULT '',
    U_NRKLIENTA      INT NOT NULL DEFAULT 0,
    KEY idx_klient (U_NRKLIENTA),
    KEY idx_data (O_DATAWPLATY)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 7. TABELA: MAC (urządzenia klientów) + widok vMac
-- ============================================================
DROP TABLE IF EXISTS MAC;
CREATE TABLE MAC (
    M_INDEX       INT AUTO_INCREMENT PRIMARY KEY,
    M_IP          VARCHAR(20) NOT NULL DEFAULT '',
    M_PORT        INT NOT NULL DEFAULT 0,
    M_MAC         VARCHAR(20) NOT NULL DEFAULT '',
    M_DATAPODLACZENIA DATE DEFAULT NULL,
    M_DATAPRZYDZIELENIAPUBIP DATE DEFAULT NULL,
    M_PUBIP       VARCHAR(20) NOT NULL DEFAULT '',
    M_UWAGI       TEXT,
    M_CZYZAZNACZONE INT NOT NULL DEFAULT 0,
    M_CZYZAWIESZONE INT NOT NULL DEFAULT 0,
    M_INDEXUSER   INT NOT NULL DEFAULT 0,
    TL_NAZWA      VARCHAR(50) NOT NULL DEFAULT '',
    RU_NAZWA      VARCHAR(50) NOT NULL DEFAULT '',
    TU_NAZWA      VARCHAR(50) NOT NULL DEFAULT '',
    INF_NAZWA     VARCHAR(100) NOT NULL DEFAULT '',
    KEY idx_user (M_INDEXUSER)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 8. TABELA: Infrastruktura + widok vInfrastruktura
-- ============================================================
DROP TABLE IF EXISTS Infrastruktura;
CREATE TABLE Infrastruktura (
    INF_INDEX         INT AUTO_INCREMENT PRIMARY KEY,
    INF_IP            VARCHAR(20) NOT NULL DEFAULT '',
    INF_MAC           VARCHAR(20) NOT NULL DEFAULT '',
    INF_NAZWA         VARCHAR(100) NOT NULL DEFAULT '',
    INF_FUNKCJA       VARCHAR(100) NOT NULL DEFAULT '',
    INF_TypUrzadzenia VARCHAR(100) NOT NULL DEFAULT '',
    INF_GrNazwaAll    VARCHAR(100) NOT NULL DEFAULT '',
    INF_CZYZAZNACZONE INT NOT NULL DEFAULT 0,
    INF_CZYZAWIESZONE INT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 9. TABELA: ZleceniaSerwisowe + widok vZleceniaLista
-- ============================================================
DROP TABLE IF EXISTS ZleceniaSerwisowe;
CREATE TABLE ZleceniaSerwisowe (
    ZS_INDEX           INT AUTO_INCREMENT PRIMARY KEY,
    ZS_NUMERTXT        VARCHAR(50) NOT NULL DEFAULT '',
    ZS_ZAKRES          TEXT,
    ZS_UWAGI           TEXT,
    ZS_DATAREJESTRACJI  DATE DEFAULT NULL,
    ZS_DATAZAKONCZENIA  DATE DEFAULT NULL,
    ZS_CzasTrwania     INT NOT NULL DEFAULT 0,
    U_NRKLIENTA        INT NOT NULL DEFAULT 0,
    KEY idx_klient (U_NRKLIENTA)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 10. TABELA: Umowy + widok vUmowyLista
-- ============================================================
DROP TABLE IF EXISTS Umowy;
CREATE TABLE Umowy (
    UM_INDEX        INT AUTO_INCREMENT PRIMARY KEY,
    UM_INDEXUSER    INT NOT NULL DEFAULT 0,
    UM_NUMERTXT     VARCHAR(50) NOT NULL DEFAULT '',
    UM_TYTUL        VARCHAR(200) NOT NULL DEFAULT '',
    UM_OPIS         TEXT,
    UM_UWAGI        TEXT,
    UM_DATASTART    DATE DEFAULT NULL,
    UM_DATAKONIEC   DATE DEFAULT NULL,
    UM_CZYPODPISANA INT NOT NULL DEFAULT 0,
    UM_CZYNAIBOKU   INT NOT NULL DEFAULT 1,
    UM_CZYNIEAKTYWNA INT NOT NULL DEFAULT 0,
    UM_CZYANEKS     INT NOT NULL DEFAULT 0,
    UM_CzyAneksTyp  VARCHAR(10) NOT NULL DEFAULT 'UM',
    KEY idx_user (UM_INDEXUSER)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


-- ============================================================
-- 11. TABELA: Operator (konta admin - legacy)
-- ============================================================
DROP TABLE IF EXISTS Operator;
CREATE TABLE Operator (
    OP_INDEX   INT AUTO_INCREMENT PRIMARY KEY,
    OP_LOGIN   VARCHAR(50) NOT NULL DEFAULT '',
    OP_HASLO   VARCHAR(50) NOT NULL DEFAULT '',
    OP_AKTYWNY VARCHAR(5) NOT NULL DEFAULT 'A'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 12. TABELA: INI (ustawienia systemowe + hasła admin)
-- ============================================================
DROP TABLE IF EXISTS INI;
CREATE TABLE INI (
    I_INDEX INT AUTO_INCREMENT PRIMARY KEY,
    I_IDENT VARCHAR(100) NOT NULL DEFAULT '',
    I_VALUE TEXT,
    KEY idx_ident (I_IDENT)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Hasło admina: demo (plain text w INI)
INSERT INTO INI (I_IDENT, I_VALUE) VALUES
('iBOK_HasloAdmin', 'demo'),
('iBOK_Serw1Login', 'serwisant'),
('iBOK_Serw1Haslo', 'serwis123'),
('iBOK_Serw2Login', ''),
('iBOK_Serw2Haslo', ''),
('iBOK_Serw3Login', ''),
('iBOK_Serw3Haslo', '');

-- ============================================================
-- 13. TABELA: MagazynBlob2 (dokumenty PDF - pusta dla demo)
-- ============================================================
DROP TABLE IF EXISTS MagazynBlob2;
CREATE TABLE MagazynBlob2 (
    MB_NAZWA       VARCHAR(200) NOT NULL PRIMARY KEY,
    MB_PLIK        LONGBLOB,
    MB_CzasObmiana TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 14. TABELA: Licencja
-- ============================================================
DROP TABLE IF EXISTS Licencja;
CREATE TABLE Licencja (
    L_ID    VARCHAR(10) NOT NULL PRIMARY KEY,
    L_KLUCZ VARCHAR(50) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Klucz licencyjny demo (J + 14 cyfr)
INSERT INTO Licencja (L_ID, L_KLUCZ) VALUES ('J', 'J12345678901234');

-- ============================================================
-- 15. TABELA: OplatyIbok (wpłaty online z bramek płatności)
-- ============================================================
DROP TABLE IF EXISTS OplatyIbok;
CREATE TABLE OplatyIbok (
    O_INDEX           INT NOT NULL AUTO_INCREMENT,
    O_INDEXUSER       INT NOT NULL,
    O_KWOTA           DECIMAL(16,2) NOT NULL DEFAULT 0.00,
    O_DATAWPLATY      DATE NOT NULL,
    O_OPERATORID      INT NOT NULL DEFAULT 0,
    O_DATAMODYFIKACJI TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    O_DATADODANIA     DATE NOT NULL,
    O_OPISPLATNOSCI   VARCHAR(255) NOT NULL DEFAULT '',
    PRIMARY KEY (O_INDEX),
    KEY O_INDEXUSER (O_INDEXUSER),
    KEY O_DATAWPLATY (O_DATAWPLATY)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_polish_ci;


-- ============================================================
-- 16. TABELA: Rozrachunki (pomocnicza - saldo)
-- ============================================================
DROP TABLE IF EXISTS Rozrachunki;
CREATE TABLE Rozrachunki (
    R_INDEX      INT AUTO_INCREMENT PRIMARY KEY,
    R_NUMERTXT   VARCHAR(50) NOT NULL DEFAULT '',
    R_KWOTA      DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    R_DATA       DATE DEFAULT NULL,
    U_NRKLIENTA  INT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- WIDOKI (po wszystkich tabelach)
-- ============================================================

DROP VIEW IF EXISTS vUserdb;
CREATE VIEW vUserdb AS
SELECT u.*,
       CONCAT(u.U_NAZWISKO, ' ', u.U_IMIE) AS vU_NazwiskoImie,
       CONCAT(u.U_ADR_ULICA, ' ', u.U_ADR_NRDOMU,
              IF(u.U_ADR_NRLOKALU != '', CONCAT('/', u.U_ADR_NRLOKALU), ''),
              ', ', u.U_ADR_KOD, ' ', u.U_ADR_MIEJSCOWOSC) AS vU_ADR_Adres,
       '' AS vU_LOK_Adres,
       '' AS vU_KOR_Adres,
       (SELECT MAX(O_DATAWPLATY) FROM Oplaty WHERE Oplaty.U_NRKLIENTA = u.U_NRKLIENTA) AS vU_DataOstatniejWplaty
FROM Userdb u;

DROP VIEW IF EXISTS vFvLista;
CREATE VIEW vFvLista AS
SELECT f.*,
       GREATEST(0, DATEDIFF(CURDATE(), f.FV_DATAPLATNOSCI)) AS FV_PoTerminie
FROM FV f;

DROP VIEW IF EXISTS vPzLista;
CREATE VIEW vPzLista AS
SELECT p.*,
       GREATEST(0, DATEDIFF(CURDATE(), p.PZ_DATAPLATNOSCI)) AS PZ_PoTerminie
FROM PZ p;

DROP VIEW IF EXISTS vFvkLista;
CREATE VIEW vFvkLista AS
SELECT f.*,
       GREATEST(0, DATEDIFF(CURDATE(), f.FVK_DATAPLATNOSCI)) AS FVK_PoTerminie
FROM FVK f;

DROP VIEW IF EXISTS vOplatyLista;
CREATE VIEW vOplatyLista AS SELECT * FROM Oplaty;

DROP VIEW IF EXISTS vMac;
CREATE VIEW vMac AS
SELECT m.*, u.U_NRKLIENTA
FROM MAC m
LEFT JOIN Userdb u ON m.M_INDEXUSER = u.U_INDEX;

DROP VIEW IF EXISTS vInfrastruktura;
CREATE VIEW vInfrastruktura AS SELECT * FROM Infrastruktura;

DROP VIEW IF EXISTS vZleceniaLista;
CREATE VIEW vZleceniaLista AS
SELECT z.*, u.U_NAZWISKO, u.U_ADR_MIEJSCOWOSC
FROM ZleceniaSerwisowe z
LEFT JOIN Userdb u ON z.U_NRKLIENTA = u.U_NRKLIENTA;

DROP VIEW IF EXISTS vUmowyLista;
CREATE VIEW vUmowyLista AS SELECT * FROM Umowy;

-- ============================================================
-- GENEROWANIE DANYCH DEMO
-- ============================================================

-- Procedura generująca dane demo
DELIMITER //

DROP PROCEDURE IF EXISTS generate_demo_data//

CREATE PROCEDURE generate_demo_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE v_login VARCHAR(50);
    DECLARE v_nazwisko VARCHAR(100);
    DECLARE v_imie VARCHAR(100);
    DECLARE v_ulica VARCHAR(100);
    DECLARE v_nrdomu VARCHAR(10);
    DECLARE v_nrlokalu VARCHAR(10);
    DECLARE v_kod VARCHAR(10);
    DECLARE v_miasto VARCHAR(100);
    DECLARE v_dl VARCHAR(20);
    DECLARE v_ul VARCHAR(20);
    DECLARE v_dl_noc VARCHAR(20);
    DECLARE v_ul_noc VARCHAR(20);
    DECLARE v_aktywacja DATE;
    DECLARE v_koniec_umowy DATE;
    DECLARE v_deaktywacja DATE;
    DECLARE v_saldo DECIMAL(12,2);
    DECLARE v_saldo_zalegle DECIMAL(12,2);
    DECLARE v_tel1 VARCHAR(30);
    DECLARE v_email VARCHAR(100);
    DECLARE v_aktywny INT;
    DECLARE v_rand INT;
    DECLARE v_year_start INT;
    DECLARE v_month_start INT;
    DECLARE v_nr_klienta INT;

    -- Tablice nazw
    SET @nazwiska = 'Nowak,Kowalski,Wiśniewski,Wójcik,Kowalczyk,Kamiński,Lewandowski,Zieliński,Szymański,Woźniak,Dąbrowski,Kozłowski,Jankowski,Mazur,Wojciechowski,Kwiatkowski,Krawczyk,Kaczmarek,Piotrowski,Grabowski,Pawlak,Michalski,Zając,Król,Wieczorek,Jabłoński,Wróbel,Nowakowski,Majewski,Olszewski,Stępień,Malinowski,Jaworski,Adamczyk,Dudek,Pawłowski,Górski,Nowicki,Pietrzak,Walczak,Rutkowski,Michalak,Sikora,Baran,Ostrowski,Duda,Szewczyk,Tomaszewski,Cieślak,Kubiak';
    SET @imiona_m = 'Adam,Piotr,Krzysztof,Tomasz,Paweł,Andrzej,Jan,Marcin,Michał,Marek,Grzegorz,Jakub,Robert,Łukasz,Mateusz,Artur,Kamil,Dariusz,Rafał,Sławomir,Wojciech,Sebastian,Mariusz,Damian,Przemysław,Karol,Filip,Maciej,Dawid,Dominik';
    SET @imiona_k = 'Anna,Maria,Katarzyna,Agnieszka,Barbara,Ewa,Magdalena,Monika,Krystyna,Dorota,Joanna,Aleksandra,Małgorzata,Beata,Jolanta,Elżbieta,Iwona,Justyna,Natalia,Patrycja,Sylwia,Renata,Marta,Karolina,Paulina';
    SET @ulice = 'Polna,Leśna,Słoneczna,Krótka,Szkolna,Ogrodowa,Lipowa,Brzozowa,Łąkowa,Kwiatowa,Kolejowa,Kościelna,Sosnowa,Akacjowa,Klonowa,Parkowa,Topolowa,Jasna,Zielona,Cicha,Spokojna,Wodna,Dębowa,Sadowa,Wierzbowa,Bukowa,Modrzewiowa,Jodłowa,Wiśniowa,Kalinowa';
    SET @miasta = 'Warszawa,Kraków,Łódź,Wrocław,Poznań,Gdańsk,Szczecin,Bydgoszcz,Lublin,Białystok,Katowice,Gdynia,Częstochowa,Radom,Toruń,Sosnowiec,Kielce,Rzeszów,Gliwice,Zabrze,Olsztyn,Bielsko-Biała,Bytom,Zielona Góra,Rybnik,Ruda Śląska,Opole,Tychy,Płock,Elbląg';
    SET @kody = '00-001,01-234,02-456,03-678,04-890,05-012,10-100,11-200,12-300,15-400,20-500,25-600,30-700,31-800,32-900,35-010,40-020,41-030,42-040,43-050,44-060,45-070,50-080,51-090,52-100,53-110,54-120,55-130,58-140,59-150';

    -- Taryfy (download/upload dzień i noc)
    SET @taryfy_dl = '25Mb,50Mb,100Mb,150Mb,200Mb,300Mb,500Mb,1Gb';
    SET @taryfy_ul = '5Mb,10Mb,20Mb,30Mb,50Mb,50Mb,100Mb,200Mb';
    SET @taryfy_dl_noc = '50Mb,100Mb,200Mb,300Mb,300Mb,500Mb,500Mb,1Gb';
    SET @taryfy_ul_noc = '10Mb,20Mb,30Mb,50Mb,50Mb,100Mb,100Mb,300Mb';
    SET @tarify_nazwy = 'Start 25,Eco 50,Standard 100,Plus 150,Komfort 200,Premium 300,Turbo 500,Fiber 1G';

    WHILE i <= 500 DO
        SET v_nr_klienta = 1000 + i;
        SET v_rand = FLOOR(1 + RAND() * 50);
        SET v_nazwisko = SUBSTRING_INDEX(SUBSTRING_INDEX(@nazwiska, ',', v_rand), ',', -1);

        -- Losowe imię (70% mężczyźni, 30% kobiety)
        IF RAND() < 0.7 THEN
            SET v_rand = FLOOR(1 + RAND() * 30);
            SET v_imie = SUBSTRING_INDEX(SUBSTRING_INDEX(@imiona_m, ',', v_rand), ',', -1);
        ELSE
            SET v_rand = FLOOR(1 + RAND() * 25);
            SET v_imie = SUBSTRING_INDEX(SUBSTRING_INDEX(@imiona_k, ',', v_rand), ',', -1);
        END IF;

        -- Login: pierwsza litera imienia + nazwisko (lowercase)
        SET v_login = LOWER(CONCAT(LEFT(v_imie, 1), v_nazwisko, v_nr_klienta));

        -- Adres
        SET v_rand = FLOOR(1 + RAND() * 30);
        SET v_ulica = CONCAT('ul. ', SUBSTRING_INDEX(SUBSTRING_INDEX(@ulice, ',', v_rand), ',', -1));
        SET v_nrdomu = CAST(FLOOR(1 + RAND() * 120) AS CHAR);
        SET v_nrlokalu = IF(RAND() < 0.4, CAST(FLOOR(1 + RAND() * 30) AS CHAR), '');
        SET v_rand = FLOOR(1 + RAND() * 30);
        SET v_kod = SUBSTRING_INDEX(SUBSTRING_INDEX(@kody, ',', v_rand), ',', -1);
        SET v_miasto = SUBSTRING_INDEX(SUBSTRING_INDEX(@miasta, ',', v_rand), ',', -1);

        -- Taryfa (losowa z 8)
        SET v_rand = FLOOR(1 + RAND() * 8);
        SET v_dl = SUBSTRING_INDEX(SUBSTRING_INDEX(@taryfy_dl, ',', v_rand), ',', -1);
        SET v_ul = SUBSTRING_INDEX(SUBSTRING_INDEX(@taryfy_ul, ',', v_rand), ',', -1);
        SET v_dl_noc = SUBSTRING_INDEX(SUBSTRING_INDEX(@taryfy_dl_noc, ',', v_rand), ',', -1);
        SET v_ul_noc = SUBSTRING_INDEX(SUBSTRING_INDEX(@taryfy_ul_noc, ',', v_rand), ',', -1);

        -- Data aktywacji: losowo od 2015 do 2025
        SET v_year_start = FLOOR(2015 + RAND() * 11);
        SET v_month_start = FLOOR(1 + RAND() * 12);
        SET v_aktywacja = DATE(CONCAT(v_year_start, '-', LPAD(v_month_start, 2, '0'), '-', LPAD(FLOOR(1 + RAND() * 28), 2, '0')));
        SET v_koniec_umowy = DATE_ADD(v_aktywacja, INTERVAL (12 + FLOOR(RAND() * 24)) MONTH);

        -- 90% aktywnych, 10% dezaktywowanych
        IF RAND() < 0.9 THEN
            SET v_deaktywacja = NULL;
            SET v_aktywny = 1;
        ELSE
            SET v_deaktywacja = DATE_ADD(v_aktywacja, INTERVAL FLOOR(6 + RAND() * 48) MONTH);
            SET v_aktywny = 0;
        END IF;

        -- Saldo: 70% saldo=0, 15% nadpłata, 15% zaległości
        SET v_saldo = 0.00;
        SET v_saldo_zalegle = 0.00;
        IF RAND() < 0.15 THEN
            SET v_saldo = ROUND(10 + RAND() * 200, 2);
        ELSEIF RAND() < 0.20 THEN
            SET v_saldo_zalegle = ROUND(30 + RAND() * 300, 2);
        END IF;

        -- Telefon i email
        SET v_tel1 = CONCAT('+48 ', FLOOR(500 + RAND() * 500), ' ',
                     LPAD(FLOOR(RAND() * 1000), 3, '0'), ' ',
                     LPAD(FLOOR(RAND() * 1000), 3, '0'));
        SET v_email = CONCAT(LOWER(v_imie), '.', LOWER(v_nazwisko), FLOOR(RAND()*100), '@example.com');

        INSERT INTO Userdb (
            U_INDEX, U_NRKLIENTA, U_LOGIN, U_HASLO,
            U_NAZWISKO, U_IMIE,
            U_NRRACHUNKU1, U_NRRACHUNKU2,
            U_SALDO, U_SALDOZALEGLE,
            U_DATAAKTYWACJI, U_DATAKONCAUMOWY, U_DATADEAKTYWACJI,
            U_DATAMODYFIKACJI, U_ZAZNACZ, U_POWIADAMIAJ, U_BLOKUJ,
            U_PASMODOWNLOADDZIENTXT, U_PASMOUPLOADDZIENTXT,
            U_PASMODOWNLOADNOCTXT, U_PASMOUPLOADNOCTXT,
            U_ADR_ULICA, U_ADR_NRDOMU, U_ADR_NRLOKALU,
            U_ADR_KOD, U_ADR_MIEJSCOWOSC,
            U_TEL1, U_TEL2, U_EMAIL, U_NIP, U_PESEL,
            U_NOTATKA, U_NOTATKA2, U_AKTYWNY, U_PODMIOT
        ) VALUES (
            i, v_nr_klienta, v_login, 'demo',
            v_nazwisko, v_imie,
            CONCAT('PL', LPAD(FLOOR(RAND() * 10000000000), 26, '0')), '',
            v_saldo, v_saldo_zalegle,
            v_aktywacja, v_koniec_umowy, v_deaktywacja,
            DATE_SUB(CURDATE(), INTERVAL FLOOR(RAND() * 90) DAY),
            '', '', IF(v_saldo_zalegle > 200, 'T', ''),
            v_dl, v_ul, v_dl_noc, v_ul_noc,
            v_ulica, v_nrdomu, v_nrlokalu,
            v_kod, v_miasto,
            v_tel1, '', v_email,
            IF(RAND() < 0.15, CONCAT(FLOOR(1000000000 + RAND() * 9000000000)), ''),
            '',
            '', '', v_aktywny, 1
        );

        SET i = i + 1;
    END WHILE;

    -- ========================================================
    -- FAKTURY: ~60 miesięcy historii dla aktywnych klientów
    -- (ostatnie 5 lat, po 1 fakturze/miesiąc)
    -- ========================================================
    BEGIN
        DECLARE done_fv INT DEFAULT 0;
        DECLARE c_nrklienta INT;
        DECLARE c_aktywacja DATE;
        DECLARE c_deaktywacja DATE;
        DECLARE c_dl VARCHAR(20);
        DECLARE fv_month DATE;
        DECLARE fv_nr INT DEFAULT 1;
        DECLARE fv_kwota DECIMAL(12,2);
        DECLARE fv_rozliczona DECIMAL(12,2);
        DECLARE fv_do_rozl DECIMAL(12,2);
        DECLARE taryfa_idx INT;

        DECLARE cur_clients CURSOR FOR
            SELECT U_NRKLIENTA, U_DATAAKTYWACJI, U_DATADEAKTYWACJI, U_PASMODOWNLOADDZIENTXT
            FROM Userdb;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_fv = 1;

        OPEN cur_clients;
        fv_loop: LOOP
            FETCH cur_clients INTO c_nrklienta, c_aktywacja, c_deaktywacja, c_dl;
            IF done_fv THEN LEAVE fv_loop; END IF;

            -- Cena na podstawie taryfy
            SET fv_kwota = CASE c_dl
                WHEN '25Mb' THEN 39.99
                WHEN '50Mb' THEN 49.99
                WHEN '100Mb' THEN 69.99
                WHEN '150Mb' THEN 79.99
                WHEN '200Mb' THEN 89.99
                WHEN '300Mb' THEN 109.99
                WHEN '500Mb' THEN 149.99
                WHEN '1Gb' THEN 199.99
                ELSE 59.99
            END;

            -- Generuj faktury od aktywacji (max 5 lat wstecz) do deaktywacji lub teraz
            SET fv_month = GREATEST(c_aktywacja, DATE_SUB(CURDATE(), INTERVAL 60 MONTH));
            SET fv_month = DATE(CONCAT(YEAR(fv_month), '-', LPAD(MONTH(fv_month), 2, '0'), '-01'));

            WHILE fv_month <= CURDATE() AND (c_deaktywacja IS NULL OR fv_month <= c_deaktywacja) DO
                -- 95% opłaconych, 5% nieopłaconych (z ostatnich 3 mies)
                IF fv_month < DATE_SUB(CURDATE(), INTERVAL 3 MONTH) OR RAND() < 0.95 THEN
                    SET fv_rozliczona = fv_kwota;
                    SET fv_do_rozl = 0.00;
                ELSE
                    SET fv_rozliczona = 0.00;
                    SET fv_do_rozl = fv_kwota;
                END IF;

                INSERT INTO FV (FV_NUMERTXT, FV_SUMABRUTTO, FV_KWOTAROZLICZONA, FV_KWOTADOROZLICZENIA,
                               FV_DATAWYSTAWIENIA, FV_DATAPLATNOSCI, FV_NumerPdf, FV_UWAGI, U_NRKLIENTA)
                VALUES (
                    CONCAT('FV/', YEAR(fv_month), '/', LPAD(MONTH(fv_month), 2, '0'), '/', LPAD(c_nrklienta, 4, '0')),
                    fv_kwota, fv_rozliczona, fv_do_rozl,
                    DATE_ADD(fv_month, INTERVAL (FLOOR(RAND() * 5)) DAY),
                    DATE_ADD(fv_month, INTERVAL 14 DAY),
                    '', '', c_nrklienta
                );

                SET fv_month = DATE_ADD(fv_month, INTERVAL 1 MONTH);
            END WHILE;
        END LOOP fv_loop;
        CLOSE cur_clients;
    END;

    -- ========================================================
    -- WPŁATY: dla opłaconych faktur
    -- ========================================================
    INSERT INTO Oplaty (O_NUMERTXT, O_KWOTA, O_DATAWPLATY, O_FORMAPLATNOSCI, U_NRKLIENTA)
    SELECT
        CONCAT('WP/', FV_NUMERTXT),
        FV_SUMABRUTTO,
        DATE_ADD(FV_DATAPLATNOSCI, INTERVAL FLOOR(-5 + RAND() * 10) DAY),
        ELT(FLOOR(1 + RAND() * 4), 'przelew', 'karta', 'gotówka', 'BLIK'),
        U_NRKLIENTA
    FROM FV
    WHERE FV_KWOTAROZLICZONA > 0;

    -- ========================================================
    -- URZĄDZENIA SIECIOWE (MAC): po 1-2 na klienta
    -- ========================================================
    BEGIN
        DECLARE done_mac INT DEFAULT 0;
        DECLARE mc_index INT;
        DECLARE mc_nrklienta INT;
        DECLARE mc_aktywacja DATE;
        DECLARE mc_dl VARCHAR(20);
        DECLARE tariff_name VARCHAR(50);
        DECLARE cur_mac CURSOR FOR
            SELECT U_INDEX, U_NRKLIENTA, U_DATAAKTYWACJI, U_PASMODOWNLOADDZIENTXT FROM Userdb;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_mac = 1;

        OPEN cur_mac;
        mac_loop: LOOP
            FETCH cur_mac INTO mc_index, mc_nrklienta, mc_aktywacja, mc_dl;
            IF done_mac THEN LEAVE mac_loop; END IF;

            SET tariff_name = CASE mc_dl
                WHEN '25Mb' THEN 'Start 25'
                WHEN '50Mb' THEN 'Eco 50'
                WHEN '100Mb' THEN 'Standard 100'
                WHEN '150Mb' THEN 'Plus 150'
                WHEN '200Mb' THEN 'Komfort 200'
                WHEN '300Mb' THEN 'Premium 300'
                WHEN '500Mb' THEN 'Turbo 500'
                WHEN '1Gb' THEN 'Fiber 1G'
                ELSE 'Standard'
            END;

            INSERT INTO MAC (M_IP, M_PORT, M_MAC, M_DATAPODLACZENIA, M_PUBIP, M_INDEXUSER, TL_NAZWA, RU_NAZWA, TU_NAZWA, INF_NAZWA)
            VALUES (
                CONCAT('10.', FLOOR(mc_nrklienta / 256), '.', mc_nrklienta MOD 256, '.', FLOOR(1 + RAND() * 254)),
                FLOOR(1 + RAND() * 48),
                UPPER(CONCAT(
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0'), ':',
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0'), ':',
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0'), ':',
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0'), ':',
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0'), ':',
                    LPAD(HEX(FLOOR(RAND() * 256)), 2, '0')
                )),
                mc_aktywacja,
                '',
                mc_index,
                tariff_name,
                ELT(FLOOR(1 + RAND() * 3), 'Router WiFi', 'ONT', 'Media konwerter'),
                ELT(FLOOR(1 + RAND() * 5), 'Mikrotik hAP ac2', 'TP-Link Archer C6', 'Huawei HG8245Q2', 'ZTE F660', 'Ubiquiti EdgeRouter X'),
                CONCAT('HUB-', LPAD(FLOOR(1 + RAND() * 30), 2, '0'))
            );
        END LOOP mac_loop;
        CLOSE cur_mac;
    END;

    -- ========================================================
    -- INFRASTRUKTURA: 30 urządzeń sieciowych
    -- ========================================================
    BEGIN
        DECLARE j INT DEFAULT 1;
        WHILE j <= 30 DO
            INSERT INTO Infrastruktura (INF_IP, INF_MAC, INF_NAZWA, INF_FUNKCJA, INF_TypUrzadzenia, INF_GrNazwaAll)
            VALUES (
                CONCAT('10.0.0.', j),
                UPPER(CONCAT('00:1A:2B:', LPAD(HEX(j), 2, '0'), ':00:', LPAD(HEX(FLOOR(RAND()*256)), 2, '0'))),
                CONCAT('HUB-', LPAD(j, 2, '0')),
                ELT(FLOOR(1 + RAND() * 4), 'Switch dostępowy', 'Router', 'OLT', 'Switch agregacyjny'),
                ELT(FLOOR(1 + RAND() * 6), 'Mikrotik CRS326', 'Mikrotik CCR1036', 'Huawei MA5608T', 'Cisco C2960', 'Ubiquiti ES-48', 'TP-Link T2600G'),
                ELT(FLOOR(1 + RAND() * 4), 'Osiedle Centrum', 'Osiedle Północ', 'Osiedle Południe', 'Strefa Przemysłowa')
            );
            SET j = j + 1;
        END WHILE;
    END;

    -- ========================================================
    -- ZLECENIA SERWISOWE: ~200 zleceń
    -- ========================================================
    BEGIN
        DECLARE k INT DEFAULT 1;
        DECLARE zs_klient INT;
        DECLARE zs_data DATE;
        DECLARE zs_zakonczenie DATE;
        WHILE k <= 200 DO
            SET zs_klient = 1000 + FLOOR(1 + RAND() * 500);
            SET zs_data = DATE_SUB(CURDATE(), INTERVAL FLOOR(RAND() * 730) DAY);

            IF RAND() < 0.85 THEN
                SET zs_zakonczenie = DATE_ADD(zs_data, INTERVAL FLOOR(1 + RAND() * 7) DAY);
            ELSE
                SET zs_zakonczenie = NULL;
            END IF;

            INSERT INTO ZleceniaSerwisowe (ZS_NUMERTXT, ZS_ZAKRES, ZS_UWAGI, ZS_DATAREJESTRACJI, ZS_DATAZAKONCZENIA, ZS_CzasTrwania, U_NRKLIENTA)
            VALUES (
                CONCAT('ZS/', YEAR(zs_data), '/', LPAD(k, 4, '0')),
                ELT(FLOOR(1 + RAND() * 10),
                    'Brak sygnału - wymiana kabla',
                    'Niska prędkość internetu',
                    'Wymiana routera na nowy model',
                    'Konfiguracja WiFi',
                    'Przeniesienie przyłącza',
                    'Awaria zasilacza ONT',
                    'Reklamacja prędkości',
                    'Podłączenie nowego punktu',
                    'Restart urządzenia CPE',
                    'Modernizacja łącza na wyższą taryfę'
                ),
                IF(zs_zakonczenie IS NOT NULL,
                    ELT(FLOOR(1 + RAND() * 5), 'Wykonano', 'Zrealizowano', 'Naprawiono', 'Wymieniono urządzenie', 'Konfiguracja poprawiona'),
                    ''
                ),
                zs_data,
                zs_zakonczenie,
                IF(zs_zakonczenie IS NOT NULL, DATEDIFF(zs_zakonczenie, zs_data), 0),
                zs_klient
            );
            SET k = k + 1;
        END WHILE;
    END;

    -- ========================================================
    -- UMOWY: po 1 na klienta + losowe aneksy
    -- ========================================================
    BEGIN
        DECLARE done_um INT DEFAULT 0;
        DECLARE um_user_idx INT;
        DECLARE um_nrklienta INT;
        DECLARE um_aktywacja DATE;
        DECLARE um_koniec DATE;
        DECLARE um_dl VARCHAR(20);
        DECLARE cur_um CURSOR FOR
            SELECT U_INDEX, U_NRKLIENTA, U_DATAAKTYWACJI, U_DATAKONCAUMOWY, U_PASMODOWNLOADDZIENTXT FROM Userdb;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_um = 1;

        OPEN cur_um;
        um_loop: LOOP
            FETCH cur_um INTO um_user_idx, um_nrklienta, um_aktywacja, um_koniec, um_dl;
            IF done_um THEN LEAVE um_loop; END IF;

            -- Umowa główna (UM_INDEXUSER = U_INDEX, nie U_NRKLIENTA!)
            INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_DATASTART, UM_DATAKONIEC,
                              UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
            VALUES (
                um_user_idx,
                CONCAT('UM/', YEAR(um_aktywacja), '/', LPAD(um_nrklienta, 4, '0')),
                CONCAT('Umowa o świadczenie usług internetowych - taryfa ', um_dl),
                'Umowa na świadczenie usług dostępu do sieci Internet.',
                um_aktywacja, um_koniec,
                1, 1, 0, 0, 'UM'
            );

            -- 20% klientów ma aneks
            IF RAND() < 0.20 THEN
                INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_DATASTART, UM_DATAKONIEC,
                                  UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
                VALUES (
                    um_user_idx,
                    CONCAT('AN/', YEAR(um_aktywacja)+1, '/', LPAD(um_nrklienta, 4, '0')),
                    'Aneks - zmiana taryfy',
                    'Zmiana parametrów usługi internetowej.',
                    DATE_ADD(um_aktywacja, INTERVAL 12 MONTH), um_koniec,
                    1, 1, 0, 1, 'AN'
                );
            END IF;
        END LOOP um_loop;
        CLOSE cur_um;
    END;

    -- ========================================================
    -- UMOWY DO PODPISU: 25 losowych klientów
    -- ========================================================
    BEGIN
        DECLARE p INT DEFAULT 1;
        DECLARE p_klient INT;
        DECLARE p_user_idx INT;
        DECLARE p_dl VARCHAR(20);
        DECLARE p_typ INT;

        WHILE p <= 25 DO
            SET p_klient = 1000 + FLOOR(1 + RAND() * 500);

            SELECT U_INDEX, U_PASMODOWNLOADDZIENTXT INTO p_user_idx, p_dl
            FROM Userdb WHERE U_NRKLIENTA = p_klient LIMIT 1;

            SET p_typ = FLOOR(1 + RAND() * 4);

            IF p_typ = 1 THEN
                -- Nowa umowa (przedłużenie)
                INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_UWAGI,
                                  UM_DATASTART, UM_DATAKONIEC,
                                  UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
                VALUES (
                    p_user_idx,
                    CONCAT('UM/', YEAR(CURDATE()), '/', LPAD(900 + p, 4, '0')),
                    CONCAT('Przedłużenie umowy - taryfa ', p_dl),
                    CONCAT('Umowa na świadczenie usług dostępu do sieci Internet na kolejny okres.\nTaryfa: ', p_dl, '\nOkres: 24 miesiące.'),
                    'Prosimy o zapoznanie się z warunkami i podpisanie umowy.',
                    CURDATE(), DATE_ADD(CURDATE(), INTERVAL 24 MONTH),
                    0, 1, 0, 0, 'UM'
                );
            ELSEIF p_typ = 2 THEN
                -- Aneks - zmiana taryfy
                INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_UWAGI,
                                  UM_DATASTART, UM_DATAKONIEC,
                                  UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
                VALUES (
                    p_user_idx,
                    CONCAT('AN/', YEAR(CURDATE()), '/', LPAD(900 + p, 4, '0')),
                    'Aneks - zmiana taryfy na wyższą',
                    CONCAT('Aneks do umowy o świadczenie usług internetowych.\nZmiana taryfy na: ', ELT(FLOOR(1 + RAND() * 4), '100/20 Mbps', '200/30 Mbps', '300/50 Mbps', '500/100 Mbps'), '.\nBez zmiany okresu obowiązywania umowy.'),
                    'Aneks wchodzi w życie po podpisaniu przez obie strony.',
                    CURDATE(), DATE_ADD(CURDATE(), INTERVAL 12 MONTH),
                    0, 1, 0, 1, 'AN'
                );
            ELSEIF p_typ = 3 THEN
                -- Regulamin
                INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_UWAGI,
                                  UM_DATASTART, UM_DATAKONIEC,
                                  UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
                VALUES (
                    p_user_idx,
                    CONCAT('REG/', YEAR(CURDATE()), '/', LPAD(900 + p, 4, '0')),
                    'Nowy regulamin świadczenia usług',
                    'Zaktualizowany regulamin świadczenia usług telekomunikacyjnych.\nZmiany dotyczą: polityki prywatności, warunków reklamacji, SLA.',
                    'Akceptacja regulaminu jest wymagana do kontynuacji usługi.',
                    CURDATE(), DATE_ADD(CURDATE(), INTERVAL 36 MONTH),
                    0, 1, 0, 0, 'UM'
                );
            ELSE
                -- Aneks - dodatkowa usługa
                INSERT INTO Umowy (UM_INDEXUSER, UM_NUMERTXT, UM_TYTUL, UM_OPIS, UM_UWAGI,
                                  UM_DATASTART, UM_DATAKONIEC,
                                  UM_CZYPODPISANA, UM_CZYNAIBOKU, UM_CZYNIEAKTYWNA, UM_CZYANEKS, UM_CzyAneksTyp)
                VALUES (
                    p_user_idx,
                    CONCAT('AN/', YEAR(CURDATE()), '/D', LPAD(900 + p, 4, '0')),
                    ELT(FLOOR(1 + RAND() * 3), 'Aneks - dodanie publicznego IP', 'Aneks - usługa telewizji IPTV', 'Aneks - dodatkowy router WiFi'),
                    ELT(FLOOR(1 + RAND() * 3),
                        'Aneks dotyczący przydzielenia stałego publicznego adresu IPv4.\nOpłata dodatkowa: 10 zł/mies. netto.',
                        'Aneks dotyczący uruchomienia usługi telewizji IPTV.\nPakiet podstawowy: 30 kanałów.\nOpłata: 25 zł/mies. netto.',
                        'Aneks dotyczący dzierżawy routera WiFi.\nModel: TP-Link Archer C6.\nOpłata: 5 zł/mies. netto.'
                    ),
                    'Usługa zostanie aktywowana po podpisaniu aneksu.',
                    CURDATE(), DATE_ADD(CURDATE(), INTERVAL 12 MONTH),
                    0, 1, 0, 1, 'AN'
                );
            END IF;

            SET p = p + 1;
        END WHILE;
    END;

    -- ========================================================
    -- KOREKTY: ~50 losowych korekt
    -- ========================================================
    BEGIN
        DECLARE m INT DEFAULT 1;
        DECLARE fvk_klient INT;
        DECLARE fvk_data DATE;
        DECLARE fvk_kwota DECIMAL(12,2);

        WHILE m <= 50 DO
            SET fvk_klient = 1000 + FLOOR(1 + RAND() * 500);
            SET fvk_data = DATE_SUB(CURDATE(), INTERVAL FLOOR(RAND() * 365) DAY);
            SET fvk_kwota = -1 * ROUND(10 + RAND() * 100, 2);

            INSERT INTO FVK (FVK_NUMERTXT, FVK_SUMABRUTTO, FVK_KWOTAROZLICZONA, FVK_KWOTADOROZLICZENIA,
                            FVK_DATAWYSTAWIENIA, FVK_DATAPLATNOSCI, FVK_NumerPdf, FVK_OPIS, U_NRKLIENTA)
            VALUES (
                CONCAT('FVK/', YEAR(fvk_data), '/', LPAD(m, 4, '0')),
                fvk_kwota, fvk_kwota, 0.00,
                fvk_data, DATE_ADD(fvk_data, INTERVAL 14 DAY),
                '', ELT(FLOOR(1 + RAND() * 4), 'Korekta za okres przerwy', 'Korekta naliczenia', 'Rabat lojalności', 'Rekompensata za awarię'),
                fvk_klient
            );
            SET m = m + 1;
        END WHILE;
    END;

END//

DELIMITER ;

-- Uruchom procedurę generującą dane
CALL generate_demo_data();

-- Posprzątaj
DROP PROCEDURE IF EXISTS generate_demo_data;

SET FOREIGN_KEY_CHECKS = 1;

-- ============================================================
-- PODSUMOWANIE:
-- ============================================================
-- Admin login:     admin / demo
-- Serwisant login: serwisant / serwis123
-- Klient login:    dowolny z vUserdb (np. anowak1001) / demo
--
-- ~500 klientów, ~20.000+ faktur, ~20.000+ wpłat,
-- 500+ urządzeń, 30 węzłów infrastruktury,
-- 200 zleceń serwisowych, 500+ umów, 50 korekt
-- ============================================================
