 SET NAMES UTF8;

DELIMITER $$

DROP PROCEDURE IF EXISTS ht_oppo_mag_tool$$
CREATE DEFINER=`root`@`localhost` PROCEDURE ht_oppo_mag_tool(
    IN _MODE VARCHAR(150),
    IN _GUID VARCHAR(38),
    IN _Param_A VARCHAR(50),
    IN _Param_B VARCHAR(50),
    IN _Param_C VARCHAR(50)
    
)
BEGIN
/*
    'INIT'    tworzenie tabeli oppo_mag
        BRAK Parametrow
        CALL ht_oppo_mag_tool('INIT', '', '', '', '');        

    'CHECK_TABLE'
        sprawdza istnienie kolumn w tabeli oppo_mag
        BRAK Parametrow
        CALL ht_oppo_mag_tool('CHECK_TABLE', '', '', '', '');        
    
    'CHECK_COLUMNS'
        sprawdza istnienie kolumn w tabeli oppo_mag - ustawia w @oppo_mag_check wartosc 'Y' gdy jest OK a uzupelnia  w gdy brak pol
        Parametry
            _Param_A            okresla nazwe kolumny do sprawdzenia
        CALL ht_oppo_mag_tool('CHECK_COLUMNS', '', 'IdnOper', '', '');        
    
    'UPDATE_ALL'
        Odswieza cala tabele oppo_mag  
        BRAK Parametrow
        CALL ht_oppo_mag_tool('UPDATE_ALL', '', '', '', '');
        
    'UPDATE_OPNG_REC'
        Odswieza rekordy dla opng w oppo_mag 
        Parametry
            _GUID            GUID z oppo czyli IdnOper 
        CALL ht_oppo_mag_tool('UPDATE_OPNG_REC', 'GUID', '', '', '');        

    'UPDATE_ONE_REC_DELTA'
        Odswieza rekord oppo w oppo_mag z uaktualnieniem TowrPo - delta
        Parametry
            _GUID            oppo.GUID
        CALL ht_oppo_mag_tool('UPDATE_ONE_REC_DELTA', 'GUID', '', '', '');        

    'UPDATE_DATE_RANGE'
        Odswieza rekordy wg dat
        Parametry
            _GUID - oppcjolnalnie guid towaru
            _ParamB - data od
            _ParamC - data do
        CALL ht_oppo_mag_tool('UPDATE_DATE_RANGE', '', '', '2025-01-01', '2025-12-31');
        
    'UPDATE_FROM_t_update_oppo_mag'
        Odswieza rekordy oppo_mag na podstawie listy w tabeli t_update_oppo_mag
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag.prepare', '', '', '', '');        
        INSERT INTO t_update_oppo_mag SELECT guid from ....
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag', '', '', '', '');        
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag.drop', '', '', '', '');        
*/
    
    DECLARE _DataBase VARCHAR(250);
    DECLARE _ColumnName VARCHAR(250);
    DECLARE _DateBO DATE;
    DECLARE _DataOd DATE;
    DECLARE _DataDo DATE;
    DECLARE _TGUID VARCHAR(38);
    DECLARE _DEBUG INT DEFAULT 0;
    
    SET _DEBUG = _MODE LIKE '%.DEBUG'; 
    SET _MODE = REPLACE(_MODE, '.DEBUG', '');
    IF _DEBUG THEN
        SELECT CONCAT('DEBUG MODE for ht_oppo_mag_tool MODE=',_MODE) AS MSG;
    END IF;

    IF _MODE = 'INIT' THEN
        -- tworzenie tabeli oppo_mag
            
        DROP TABLE IF EXISTS oppo_mag;
        CREATE TABLE oppo_mag (
            GUID varchar(38) NOT NULL DEFAULT '',
            magazyn int(11) NOT NULL DEFAULT '0',
            idntowr varchar(38) NOT NULL DEFAULT '',
            datawplywu date NOT NULL,
            ilosc double(16,4) NOT NULL DEFAULT '0.0000',
            tymczasowa int(11) NOT NULL DEFAULT '0',
            przychod int(11) NOT NULL DEFAULT '0',
            IdnOper varchar(38) NOT NULL DEFAULT '',
            UNIQUE KEY mag_guid (magazyn,datawplywu,GUID),
            KEY idntowr (idntowr,magazyn,datawplywu,przychod),
            KEY data (datawplywu,magazyn,idntowr),
            KEY GUID_mag (GUID,magazyn),
            KEY IdnOper (IdnOper)
        )
        ;
        -- AMICUS 
        -- IF ISNULL(@session.globals.Owner) THEN SELECT g.value from _db_globals g WHERE g.key='Owner' INTO @session.globals.Owner; END IF;
        SELECT valuei INTO @omt.iloscprecision from IReg where idkey="IloscPrecision";
        IF @omt.iloscprecision>4 THEN
            ALTER TABLE oppo_mag MODIFY COLUMN ilosc double(18,6) NOT NULL DEFAULT '0.000000';
        END IF;
        SET @oppo_mag_check = 'Y';
    END IF;    --    IF _MODE = 'INIT'
    
    IF _MODE = 'CHECK_COLUMNS' THEN
/*        sprawdza istnienie kolumn w tabeli oppo_mag - ustawia w @oppo_mag_check wartosc 'Y' gdy jest OK a uzupelnia  w gdy bark pol
        Parametry
            _Param_A            okresla nazwe kolumny do sprawdzenia
        CALL ht_oppo_mag_tool('CHECK_COLUMNS', '', 'IdnOper', '', '');    */    
        
        SELECT Database() INTO _DataBase;
        SET _ColumnName = IFNULL(_Param_A, 'GUID');
        SET @oppo_mag_check_column = NULL;
        SELECT
            IF(EXISTS(
                SELECT * 
                FROM information_schema.COLUMNS 
                WHERE 
                    TABLE_SCHEMA = _DataBase AND TABLE_NAME = 'oppo_mag' AND COLUMN_NAME = _ColumnName
                ), 'Y', 'N')
            INTO
                @oppo_mag_check_column
        ;
        SET @oppo_mag_check_column = IFNULL(@oppo_mag_check_column, 'N');
        
    END IF;    
    
    IF _MODE = 'CHECK_TABLE' THEN
/*        sprawdza istnienie kolumn w tabeli oppo_mag
        BRAK Parametrow
        CALL ht_oppo_mag_tool('CHECK_TABLE', '', '', '', '');*/
        
        SET @oppo_mag_check = IFNULL(@oppo_mag_check, '?');
        IF @oppo_mag_check = '?' THEN
        --    Konieczny test czy sa pola
            SET @oppo_mag_check_column = 'Y';
        --    Kolejne testy    
            IF @oppo_mag_check_column = 'Y' THEN
                CALL ht_oppo_mag_tool('CHECK_COLUMNS', '', 'IdnOper', '', '');        
            END IF;
            IF @oppo_mag_check_column = 'Y' THEN
                CALL ht_oppo_mag_tool('CHECK_COLUMNS', '', 'GUID', '', '');        
            END IF;

            IF @oppo_mag_check_column = 'N' THEN
            --    Konieczna zmiana struktury tabeli oppo_mag - wolana CALL ht_oppo_mag_tool('INIT', '', '', '', '');        
            --    a nastepnie uzupelnienie rekordow
                CALL ht_oppo_mag_tool('UPDATE_ALL', '', '', '', '');        
                SET @oppo_mag_check_column = 'Y';    -- tak na wszelki wypadek
            END IF;
            SET @oppo_mag_check = @oppo_mag_check_column;
        END IF;
    END IF;    
    
    IF _MODE = 'UPDATE_ALL' THEN
/*        Odswieza cala tabele oppo_mag  
        CALL ht_oppo_mag_tool('UPDATE_ALL', '', '', '', '');        
        Wymuszona data dla przypdakow szczegolnych, gdy oppo_mag ma byc wczesniej niz od dataBO:
        CALL ht_oppo_mag_tool('UPDATE_ALL', '', '2010-01-01', '', '');    */

        CALL ht_oppo_mag_tool('INIT', '', '', '', '');        
        SET @session.globals.ht.databo = NULL;
        CALL _Session_Refresh_Variables('HT', 'oppo', '');
        SET _DateBO = @session.globals.ht.databo;

        IF _Param_A = '' THEN
            SET @databo = NULL;
            CALL _Globals_Get('DataBoMag', @databo, NULL);
            IF @databo IS NULL THEN
            --    Koniecznosc pobrania i uzupelnienia daty BO
                SELECT 
                    MAX(datawplywu) 
                INTO    
                    @databo
                FROM oppo 
                WHERE 
                    rodzaj = 51
                ;
                SET @databo = IFNULL(@databo, '1990-01-01');
            --    i wpisania daty BO do _db_globals
                CALL _Globals_Set('DataBoMag', @databo);
            END IF;    
            SET _DateBO = _VarDate(@databo);
        ELSE 
            SET _DateBO = _VarDate(_Param_A);
        END IF;    
        
    --    Wstaw do oppo_mag PZ
        INSERT IGNORE INTO oppo_mag
            (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                guid, domagazynu, idntowr, datawplywu, ABS(ilosc), tymczasowa, 1, idnoper 
            FROM oppo o 
            WHERE     domagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0)
                AND datawplywu >= _DateBO;

    --    Wstaw do oppo_mag RZ
        INSERT IGNORE INTO oppo_mag
            (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                guid, zmagazynu, idntowr, datawplywu, -ABS(ilosc), tymczasowa, 0, idnoper 
            FROM oppo o 
            WHERE     zmagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0)
                AND datawplywu >= _DateBO;
    END IF;    --    IF _MODE = 'UPDATE_ALL'
    
    IF _MODE = 'UPDATE_OPNG_REC' THEN
/*        Odswieza rekord opng w oppo_mag 
        Parametry: _GUID: GUID z opng czyli IdnOper 
        CALL ht_oppo_mag_tool('UPDATE_OPNG_REC', 'GUID', '', '', '');    */
        CALL ht_oppo_mag_tool('CHECK_TABLE', '', '', '', '');        
    
        DELETE FROM oppo_mag 
        WHERE
            Idnoper = _GUID
        ;
    --    Wstaw do oppo_mag PZ
        INSERT IGNORE INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                 guid, domagazynu, idntowr, datawplywu, ABS(ilosc), tymczasowa, 1, idnoper 
            FROM oppo o 
            WHERE     o.idnoper = _GUID
                AND domagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0);
    --    Wstaw do oppo_mag RZ
        INSERT IGNORE INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                 guid, zmagazynu, idntowr, datawplywu, -ABS(ilosc), tymczasowa, 0, idnoper 
            FROM oppo o 
            WHERE     o.idnoper = _GUID
                AND zmagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0);
    END IF;    
    
    IF _MODE = 'INSERT_ONE_REC_DELTA' THEN
/*        Dodaje rekord oppo w oppo_mag z uaktualnieniem TowrPo - delta
        Parametry
            _GUID            oppo.GUID
        CALL ht_oppo_mag_tool('INSERT_ONE_REC_DELTA', 'GUID', '', '', '');*/

--        DELETE FROM oppo_mag WHERE GUID = _GUID;

    --    Wstaw do oppo_mag PZ
        INSERT INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                guid, domagazynu, idntowr, datawplywu, ABS(ilosc), tymczasowa, 1, idnoper 
            FROM oppo o 
            WHERE     o.GUID = _GUID
                AND domagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0);
    --    Wstaw do oppo_mag RZ
        INSERT INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                 guid, zmagazynu, idntowr, datawplywu, -ABS(ilosc), tymczasowa, 0, idnoper 
            FROM oppo o 
            WHERE     o.GUID = _GUID
                AND zmagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0);
        -- na razie uproszczenie - nie obsluguje zamowiono - TODO
        UPDATE TowrPo p, oppo_mag o SET p.ilosc=p.ilosc+o.ilosc WHERE p.idntowr=o.idntowr and p.magazyn=o.magazyn AND o.guid=_GUID AND o.tymczasowa=0;
    END IF;    

/*        Odswieza rekord opng w oppo_mag 
Parametry
    _GUID - oppcjolnalnie guid towaru
    _ParamB - data od
    _ParamC - data do
SET @dataod='2025-11-01',@datado='2025-11-10';
SELECT guid INTO @tguid from TowrNg where symbol='TEST123';
CALL ht_oppo_mag_tool('UPDATE_DATE_RANGE', @tguid, '', @dataod, @datado);
*/
    IF _MODE = 'UPDATE_DATE_RANGE' THEN

        SET _DataOd = _VarDate(_Param_B),_DataDo = _VarDate(_Param_C),_TGUID=IFNULL(_GUID,'');
        IF _DEBUG THEN
            SELECT COUNT(*) INTO @ile FROM oppo WHERE datawplywu between _DataOd and _DataDo AND (_TGUID='' OR idntowr=_TGUID);
            SELECT CONCAT('DEBUG: UPDATE_DATE_RANGE od ',_DataOd,' do ',_DataDo,' TGUID=',_TGUID, ' ILE=',@ile) AS MSG;

        END IF;

        DELETE FROM oppo_mag WHERE datawplywu between _DataOd and _DataDo AND (_TGUID='' OR idntowr=_TGUID)
        ;
    --    Wstaw do oppo_mag PZ
        INSERT IGNORE INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                 guid, domagazynu, idntowr, datawplywu, ABS(ilosc), tymczasowa, 1, idnoper 
            FROM oppo o 
            WHERE 
                o.datawplywu between _DataOd and _DataDo
                AND domagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0)
                AND (_TGUID='' OR idntowr=_TGUID)
        ;
    --    Wstaw do oppo_mag RZ
        INSERT IGNORE INTO oppo_mag
             (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
            SELECT 
                 guid, zmagazynu, idntowr, datawplywu, -ABS(ilosc), tymczasowa, 0, idnoper 
            FROM oppo o 
            WHERE 
                o.datawplywu between _DataOd and _DataDo
                AND zmagazynu <> 0 
                AND usluga = 0
                AND (ilosc <> 0 or wartnet <> 0 or wartbrt <> 0)
                AND (_TGUID='' OR idntowr=_TGUID)
        ;
    END IF;    

    IF _MODE LIKE 'UPDATE_FROM_t_update_oppo_mag%' THEN
    /*    Odswieza rekordy oppo_mag na podstawie listy w tabeli t_update_oppo_mag
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag.prepare', '', '', '', '');        
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag', '', '', '', '');        
        CALL ht_oppo_mag_tool('UPDATE_FROM_t_update_oppo_mag.drop', '', '', '', '');*/

        IF _MODE = 'UPDATE_FROM_t_update_oppo_mag.prepare' THEN
            
            DROP TEMPORARY TABLE IF EXISTS t_update_oppo_mag;
            CREATE TEMPORARY TABLE t_update_oppo_mag (
                GUID VARCHAR(38) NOT NULL DEFAULT '',
                PRIMARY KEY GUID (GUID)
            )
            ;
        END IF;
        
        IF _MODE = 'UPDATE_FROM_t_update_oppo_mag.drop' THEN
            
            DROP TEMPORARY TABLE IF EXISTS t_update_oppo_mag;
        END IF;
        
        IF _MODE = 'UPDATE_FROM_t_update_oppo_mag' THEN
        --    Sprawdz poprawnosc struktury oppo_mag
            DELETE om FROM oppo_mag om, t_update_oppo_mag t 
            WHERE
                om.idnoper = t.GUID
            ;
        --    Wstaw do oppo_mag PZ
            INSERT IGNORE INTO oppo_mag
                (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
                SELECT 
                    o.guid, o.domagazynu, o.idntowr, o.datawplywu, ABS(o.ilosc), o.tymczasowa, 1, o.idnoper 
                FROM oppo o, t_update_oppo_mag t 
                WHERE 
                    o.idnoper = t.GUID
                    AND o.domagazynu <> 0 
                    AND o.usluga = 0
                    AND (o.ilosc <> 0 OR o.wartnet <> 0 OR o.wartbrt <> 0)
            ;
        --    Wstaw do oppo_mag RZ
            INSERT IGNORE INTO oppo_mag
                (GUID,magazyn,idntowr,datawplywu,ilosc,tymczasowa,przychod,IdnOper)
                SELECT 
                    o.guid, o.zmagazynu, o.idntowr, o.datawplywu, - ABS(o.ilosc), o.tymczasowa, 0, o.idnoper 
                FROM oppo o, t_update_oppo_mag t 
                WHERE 
                    o.idnoper = t.GUID
                    AND o.zmagazynu <> 0 
                    AND o.usluga = 0
                    AND (o.ilosc <> 0 OR o.wartnet <> 0 OR o.wartbrt <> 0)
            ;
        END IF;
    END IF;

    IF _MODE LIKE 'CHECK' THEN
        SET _DataOd = _VarDate(_Param_B);
        SET _DataDo = _VarDate(_Param_C);
        select o.guid,o.idn,o.datawplywu,o.localtime,o.zmagazynu,o.idntowr 
        from oppo o 
        left join oppo_mag m on m.guid=o.guid 
        where o.datawplywu BETWEEN _DataOd and _DataDo and o.tymczasowa=0 and o.usluga=0 and o.rodzaj=10 and o.ilosc<>0 and isnull(m.magazyn);
    END IF;

    IF _MODE LIKE 'CHECK_SAVE_DATA' THEN
        SET _DataOd = _VarDate(_Param_B);
        SET _DataDo = _VarDate(_Param_C);
        DROP TEMPORARY TABLE IF EXISTS tmp_oppo_oppo_mag;
        CREATE TEMPORARY TABLE tmp_oppo_oppo_mag AS
            select o.guid,o.idn,o.datawplywu,o.localtime,o.zmagazynu,o.idntowr 
            from oppo o 
            left join oppo_mag m on m.guid=o.guid 
            where o.datawplywu BETWEEN _DataOd and _DataDo and o.tymczasowa=0 and o.usluga=0 and o.rodzaj=10 and o.ilosc<>0 and isnull(m.magazyn);
    END IF;

END$$

DELIMITER ;

-- insert into _db_globals values ("DataBoMag",'2009-01-01','Data BO magazynu');

/*
$Log: ht_oppo_mag_tool.sql,v $
Revision 1.28  2026/05/28 09:24:23  apro
opcja - guid towaru - selektywne odświeżanie

Revision 1.27  2025/03/04 12:46:33  waliant
$SEND$ Warningi

Revision 1.26  2025/02/14 11:36:26  apro
kosmetyka taby i backtiki

Revision 1.25  2024/07/15 05:17:21  apro
kosmetyka

Revision 1.24  2021/07/15 08:52:38  apro
mode CHECK

Revision 1.23  2019/03/01 07:15:04  apro
$SEND$
uwzgl.  tymczasowosci

Revision 1.22  2018/12/12 07:28:56  apro
formatowanie i komentarze, mod  INSERT_ONE_REC_DELTA

Revision 1.21  2017/10/02 08:08:41  apro
spacje

Revision 1.20  2017/02/21 13:52:56  apro
*** empty log message ***

Revision 1.19  2016/04/19 11:48:30  apro
precyzja

Revision 1.18  2015/11/27 13:01:33  apro
kosmetyka - komentarze

Revision 1.17  2015/03/20 08:22:08  apro
*** empty log message ***

*/
