Delimiter //
/**
 * Le mode "RECONCILIATION" est un mode d'import particulier. Il est multipciple de facto
 * En principe, le multicible est géré par le batch
 * Le mode "reconciliation" est un multicible en soit. Il est donc incompatible avec un mode muticible par batch
 * -> un fichier contentant des écritures pour le mode "RECONCILIATION"  ne dois pas contenir de lettrage
 * 
 * lorsqu'un fichier est vide on a forcémant 0 lot. le @lemrnmax_batch vaut alors 0
 * les écritures ne jammais réconcilié car il faut au minimul 1 ligne, 1 lot
 * ce fonctionnement non prévu est volontairement conservé car il permet d'eviter
 * la réconciliation sans doute non désiré en cas de fichier vide
*/
Drop Procedure If Exists LOADER_ENTRIES_MODE_RECONCILIATION_NORMALIZE//
Create Procedure LOADER_ENTRIES_MODE_RECONCILIATION_NORMALIZE(
    In batchnum Int
)
BEGIN 
	MAIN_ENTRIES_RECONCILIATION_NORMALIZE: Begin

		Set @lemrn_batchnum = batchnum;
		Set @lemrnmax_batch = Coalesce(GET_LOADER_INFO('MAX_BATCH', 1), 0);

		-- initialise dependents tables on init batch (0)
		if @lemrn_batchnum = 0 Then
			call LOADER_ENTRIES_NORMALIZE_MAP_BATCH_NUM; -- nécéssaire pour le lettrage au sein du même numéro de lot
			-- tables lié à l'importation des écritures
	        call LOADER_CREATE_TABLE_ENTRIES_ENTRIES_HAS_ACCOUNTS;
			
			-- tables liés au lettrage
			call LOADER_CREATE_TABLE_MATCHINGCODES_ENTRIES_TOREMOVE;
			call LOADER_CREATE_TABLE_MATCHINGCODES_MATCHINGCODES_TOREMOVE;
			call LOADER_CREATE_TABLE_MATCHINGCODES_ENTRIES;
			call LOADER_CREATE_TABLE_MATCHINGCODES_MATCHINGCODES;

			call LOADER_CREATE_TABLE_MATCHINGCODES_NEW_RECLAIMS_DETAILS;

			Delete From LOADER_MATCHINGCODES;
			Delete From LOADER_MATCHINGCODES_ENTRIES;
			Delete from LOADER_MATCHINGCODES_MATCHINGCODES;
			Delete from LOADER_MATCHINGCODES_MATCHINGCODES_TOREMOVE;
			Delete from LOADER_MATCHINGCODES_ENTRIES_TOREMOVE;

            Drop Table If Exists TMP_LOADER_ENTRIES_TO_RECONCIL; -- purge table non temporaire pour retro compatibilité

			--
			leave MAIN_ENTRIES_RECONCILIATION_NORMALIZE;
		End if;

		if @lemrn_batchnum > @lemrnmax_batch-1 Then
-- 			lettrage
			leave MAIN_ENTRIES_RECONCILIATION_NORMALIZE;
		End if;

		-- Mandatory checks
		Call LOADER_ENTRIES_NORMALIZE_ACCOUNT_REF_NOT_NULL(@lemrn_batchnum);
		Call LOADER_ENTRIES_NORMALIZE_ENTRY_ACCOUNT_EXT_REF_NOT_NULL(@lemrn_batchnum);

		-- Other checks
		Call LOADER_ENTRIES_NORMALIZE_ENTRY_REF_NOT_NULL(@lemrn_batchnum);

		Call LOADER_ENTRIES_NORMALIZE_REF_IS_UNIQUE_PER_ACCOUNTS(@lemrn_batchnum);

		-- Mandatory linking
		Call LOADER_ENTRIES_NORMALIZE_MAP_ACCOUNT_REF_PROVIDED(@lemrn_batchnum); -- doit être AVANT LOADER_ENTRIES_NORMALIZE_MAP_ENTRY_CREATE_OR_UPDATE

		-- Create or update ?
		Call LOADER_ENTRIES_NORMALIZE_MAP_ENTRY_CREATE_OR_UPDATE(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_NORMALIZE_MAP_ACCOUNT_REF_PROVIDED

		-- Mapping and linking
		Call LOADER_ENTRIES_MAP_CURRENCY_NOTPROVIDED(@lemrn_batchnum);
		Call LOADER_ENTRIES_MAP_CURRENCY_PROVIDED(@lemrn_batchnum);
		Call LOADER_ENTRIES_NORMALIZE_MAP_DATE_NOTPROVIDED(@lemrn_batchnum); -- doit être AVANT LOADER_ENTRIES_NORMALIZE_MAP_DUEDATE_NOTPROVIDED
	    Call LOADER_ENTRIES_NORMALIZE_MAP_DUEDATE_NOTPROVIDED(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_NORMALIZE_MAP_DATE_NOTPROVIDED

	    Call LOADER_ENTRIES_MAP_PAYMENTTYPE_NOT_PROVIDED(@lemrn_batchnum);
		Call LOADER_ENTRIES_MAP_PAYMENTTYPE_PROVIDED(@lemrn_batchnum);

		Call LOADER_ENTRIES_MAP_POSITIVE_AMOUNTS(@lemrn_batchnum);

		Call LOADER_ENTRIES_NORMALIZE_MAP_MATCHING_CODE_STATE_SET(@lemrn_batchnum);
        Call LOADER_ENTRIES_NORMALIZE_MAP_FORCED_MATCH_STAT(@lemrn_batchnum);

		Call LOADER_ENTRIES_NORMALIZE_MAP_PAYMENT_SCHEDULE_STATUS_SET(@lemrn_batchnum);
		Call LOADER_ENTRIES_NORMALIZE_MAP_SAND_STATE_SET(@lemrn_batchnum);

		Call LOADER_ENTRIES_NORMALIZE_MAP_STATUS_PROVIDED(@lemrn_batchnum); -- doit être avant LOADER_ENTRIES_NORMALIZE_MAP_STATUS_NOTPROVIDED
		Call LOADER_ENTRIES_NORMALIZE_MAP_STATUS_NOTPROVIDED(@lemrn_batchnum); -- doit être paret LOADER_ENTRIES_NORMALIZE_MAP_STATUS_PROVIDED

		Call LOADER_ENTRIES_MAP_TYPE_PROVIDED(@lemrn_batchnum); -- doit être AVANT LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS et LOADER_ENTRIES_NORMALIZE_MAP_BALANCE_AMOUNT
		Call LOADER_ENTRIES_NORMALIZE_MAP_BALANCE_AMOUNT(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_TYPE_PROVIDED et avant LOADER_ENTRIES_MAP_TYPE_PROVIDED
		Call LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_TYPE_PROVIDED et LOADER_ENTRIES_NORMALIZE_MAP_BALANCE_AMOUNT

		Call LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS_INV_TO_CRN(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS
		Call LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS_CRN_TO_INV(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS
		Call LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS_PAY_TO_CAN(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS
		Call LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS_CAN_TO_PAY(@lemrn_batchnum); -- doit être après LOADER_ENTRIES_MAP_NEGATIVE_AMOUNTS

	    Call LOADER_ENTRIES_MAP_CALCULATE_BALANCE(@lemrn_batchnum); -- après tous les traitements sur les montants

		Call LOADER_ENTRIES_MAP_EMPTY_TRANSACTION_AMOUNTS(batchnum); -- après tous les traitements sur les montants, LOADER_ENTRIES_MAP_CALCULATE_BALANCE  et LOADER_ENTRIES_NORMALIZE_MAP_ENTRY_CREATE_OR_UPDATE

		lemrn_chkerr: Begin
			-- ci dessous on utilise les tables de lots
			-- pour effectguer on non la reconciliation en cas d'erreur et de l'option 'RCONCIL-NO-ERR'
			-- attention si déplacement dans des procedure externes

			if @lemrn_batchnum < @lemrnmax_batch-2 Then
				-- on n'est pas dans les lots concerné : 
-- 				call cash_print('lemrn_chkerr : @lemrn_batchnum < @lemrnmax_batch-2', null);
				leave lemrn_chkerr;
				
			End if;
			
			-- on fonction de l'option RCONCIL-NO-ERR et de la présence d'erreur
			-- on applique ou pas la réconciliation
			Set @lemrn_id_loader = GET_LOADER_INFO('ID_TEMPLATE_LOADER', @lemrn_batchnum);
			Set @lemrn_reconcilNoError = Coalesce(
						(
							Select Count(*)
							From
								TEMPL_LOADER_has_TEMPL_OPT ldopt
								Inner Join TEMPLATE_OPTIONS tmplopt
									On ldopt.TEMPL_OPT_ID_TEMPL_OPT = tmplopt.ID_TEMPLATE_OPTIONS
							Where
								ldopt.TEMPL_LOADER_ID_TEMPL_LOADER = @lemrn_id_loader
								And tmplopt.TEMPLATE_OPTIONS_CODE ='RCONCIL-NO-ERR'
						) 
						, 0
					)
				;

			if @lemrn_reconcilNoError = 0 Then
-- 				call cash_print('lemrn_chkerr : @lemrn_reconcilNoError = 0', null);
				-- l'option n'est pas activé
				leave lemrn_chkerr;
			End if; 

			-- l'option est activée
			-- on dois tester la présence d'erreurs
			Set @lemrn_hasError = Coalesce(
						(
							Select LOADER_STATUS_ERRCOUNT
							From
								LOADER_STATUS
							Where
								LOADER_STATUS_ERRCOUNT > 0
							Limit 1 
						) 
						, 0
					)
				;
			
			if @lemrn_hasError = 0  Then
-- 				call cash_print('lemrn_chkerr : @lemrn_hasError = 0 ', null);
				-- pas d'erreur 
				leave lemrn_chkerr;
			End if;
			
			-- erreurs détéctés
			if @lemrn_batchnum = @lemrnmax_batch-2  Then
-- 				call cash_print('log : reconcil canceled', null);
						-- on ajout une alert (1 foix, on se sert du n° lot pour eviter d'ajouter plusieur fois l'info)
						
				Insert Into 
					LOADER_LOGS (
						LOADER_STATUS_ID_LOADER_STATUS
						, LOADER_LOGS_SRC_TABLE_ID
						, LOADER_LOGS_BATCH_NUMM
						, LOADER_LOGS_ERRCOUNT
						, LOADER_LOGS_ERRMSGS
						, LOADER_LOGS_WARNCOUNT
						, LOADER_LOGS_WARNMSGS
						, LOADER_LOGS_TYPE
					)
					Values(
						Null
						, Null
						, Null
						, 0
						, null
						, 1
	-- 							, 'Reconciliation non autorisée abandonnée : en raison de la présence d''erreur dans le fichiers'
						, 'Reconciliation non autorisée : présence d''erreurs dans le fichier importé'
						, 'ENTRIES'
					)
				;

			End if;

			-- ici presence d'erreur et option 'RCONCIL-NO-ERR' activé 
			-- on sort du block principal pour ne pas créer les ecrtiture et le lettrage de reconciliation
			leave MAIN_ENTRIES_RECONCILIATION_NORMALIZE;
		end ;

			

		if @lemrn_batchnum = @lemrnmax_batch-2 Then
-- 			call cash_print('preparing reconcil', null);
			-- ici on doit fair les tratements nécéssaire au mode reconciliation
			-- => détéction des écriture NON TOTALEMENT léttré qui ne sont plus fournis / compte
			-- => creation de lettrage TOTAL des ces écritures
			-- => si besoin créer l'écriture de compensation
			-- => lancement des traitement nécéssaire au lettrage
			
			-- on dois nécéssairement le faire dans la derniere iterations
			call LOADER_ENTRIES_NORMALIZE_MAP_ENTRIES_TO_RECONCIL;
			call LOADER_ENTRIES_NORMALIZE_MAP_RECONCILIATIONS_ENTRIES;
			call LOADER_ENTRIES_NORMALIZE_MAP_RECONCILIATION_PREPDATA(@lemrn_batchnum);
			
		End If;

	End;

END//
Delimiter ;