Delimiter //
/**
* determine une numerotation de lot qui respecte les contraintes d'affectation des écritures aux comptes
* Principalement utilisé pour le mode RECONCILIATION. Ce mode implique de facto un lettrage
*/
Drop Procedure if Exists LOADER_ENTRIES_NORMALIZE_MAP_BATCH_NUM//
Create Procedure LOADER_ENTRIES_NORMALIZE_MAP_BATCH_NUM (
)
Begin
    batchNum__main: Begin

        Set @max_batch = Coalesce(GET_LOADER_INFO('MAX_BATCH', 1), 0);
        Set @batch_size = Coalesce(GET_LOADER_INFO('BATCH_SIZE', 1), 1000);

        Drop temporary Table if Exists TMP_ORDERLOADER_ENTRIES;
        -- classement
        Create temporary Table TMP_ORDERLOADER_ENTRIES (
            ID_TMP_ORDERLOADER_ENTRIES Int Not Null Primary Key Auto_increment
            , LOADER_STATUS_ID_LOADER_STATUS Int Not Null
			, ACCOUNTS_REF Varchar(45) Null
            , Index (ACCOUNTS_REF)
        ) ;
        Insert Into TMP_ORDERLOADER_ENTRIES(
            LOADER_STATUS_ID_LOADER_STATUS, ACCOUNTS_REF
        ) 
        Select LOADER_STATUS_ID_LOADER_STATUS, ACCOUNTS_REF
        From LOADER_ENTRIES
        Where ACCOUNTS_REF Is Not Null
        Order By ACCOUNTS_REF;

		-- table pour les nouveau numéro de lot calculé
		-- nécéssaire car dans mysql, on ne peux faire une autojointure sur une table TEMPORAIRE
		Drop temporary Table if Exists TMP_LOADER_ENTRIES_BATCHNUM;
        -- classement
        Create temporary Table TMP_LOADER_ENTRIES_BATCHNUM (
            LOADER_STATUS_ID_LOADER_STATUS Int Not Null Primary Key 
			, LOADER_ENTRIES_BATCHNUM Int null
        ) ;
        Insert Into TMP_LOADER_ENTRIES_BATCHNUM(
            LOADER_STATUS_ID_LOADER_STATUS
        ) 
        Select LOADER_STATUS_ID_LOADER_STATUS
        From LOADER_ENTRIES
        Order By LOADER_STATUS_ID_LOADER_STATUS;


        -- boucle d'affectation des nouveau numéro de lot dans la table temopraire TMP_LOADER_ENTRIES_BATCHNUM

        Set @loopCount = 0;
        entriesNewBatchLoop: loop
                Set @minOffet = @loopCount * @batch_size +1;
                Set @loopCount = @loopCount +1;
                if @loopCount > @max_batch Then
                    leave entriesNewBatchLoop;
                End if;
                Set @maxOffset = @loopCount * @batch_size;
                --
                -- on affecte un nouveau numero de lot
                -- pour les lot non encore affecté !!!
                update TMP_LOADER_ENTRIES_BATCHNUM TLEBN
                    Inner Join TMP_ORDERLOADER_ENTRIES TOM
                        On TLEBN.LOADER_STATUS_ID_LOADER_STATUS = TOM.LOADER_STATUS_ID_LOADER_STATUS
                Set
                    TLEBN.LOADER_ENTRIES_BATCHNUM = @loopCount
                Where
                    TOM.ID_TMP_ORDERLOADER_ENTRIES Between @minOffet And @maxOffset
                    And TLEBN.LOADER_ENTRIES_BATCHNUM Is Null
                ;
                --
                -- puis on recherche la  référence du compte de la derniere ligne du lot
                --
                Set @refCompteLastRow = (Select ACCOUNTS_REF 
                                    From TMP_ORDERLOADER_ENTRIES 
                                    Where ID_TMP_ORDERLOADER_ENTRIES = @maxOffset
                                )
                            ;
                -- on affecte le meme numero de lot a toute les ligne ayant la même référence de compte
                update TMP_LOADER_ENTRIES_BATCHNUM TLEBN
                    Inner Join TMP_ORDERLOADER_ENTRIES TOM
                        On TLEBN.LOADER_STATUS_ID_LOADER_STATUS = TOM.LOADER_STATUS_ID_LOADER_STATUS
                Set
                    TLEBN.LOADER_ENTRIES_BATCHNUM = @loopCount
                Where
                    TOM.ID_TMP_ORDERLOADER_ENTRIES > @maxOffset
                    And TOM.ACCOUNTS_REF = @refCompteLastRow
                    And TLEBN.LOADER_ENTRIES_BATCHNUM Is Null
                ;
                
        end loop entriesNewBatchLoop;
        
        -- Mise à jour du numéro de lot
        -- voir si nécéssaire
        -- on peut utiliser LOADER_ENTRIES_BATCHNUM dans les sous procédures
        Update
            LOADER_STATUS LS
            Inner Join TMP_LOADER_ENTRIES_BATCHNUM TLEBN
                On LS.ID_LOADER_STATUS = TLEBN.LOADER_STATUS_ID_LOADER_STATUS
        Set 
            LS.LOADER_STATUS_BATCH_NUM = TLEBN.LOADER_ENTRIES_BATCHNUM
        ;

        -- purges des données
        Drop temporary Table if Exists TMP_ORDERLOADER_ENTRIES;
        Drop temporary Table if Exists TMP_LOADER_ENTRIES_BATCHNUM;
    End;
    

End //
Delimiter ;