Delimiter //
/**
	Procédure qui pré-calcul les liste compte accrédité pour chacun des membres
	Pour chaque membre, on a une table de le nom est de la forme
		- TMP_ACCOUNTS_CREDENTIALS_MEMBER__[MEMBER_ID]
			-> contien la liste des compte accessible pour le membre dont l'id est [MEMBER_ID] (int)

	Pour les écriture (non géré au 01/2015) on aura des tables de la forme
		- TMP_ENTRIRES_CREDENTIALS_MEMBER__[MEMBER_ID]
  NE PAS UTILISER EN DEHORS DE L'INIT DE LA BDD SUR UNE NOUVELLE INSTANCE

*/
Drop Procedure if Exists BUSINESS_COMPUTE_MEMBERS_CREDENTIALS//
 
Create Procedure BUSINESS_COMPUTE_MEMBERS_CREDENTIALS()
Begin
	memberCredentialInit: Begin
		-- purge des tables précalculé des membres supprimés
		call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_CLEAR_DELETED();

		-- création de la table global des accreditation si necessaire, sans forcer re-creation
		Call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_GLOBAL_PROFILES(0);

		-- creation des table de profil temporaires
# 		call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_PREP_DFPROFILES_TEMP_TABLES(NULL);
		-- obtention de l'id ref type pour les accreditation de compte
		-- requis pour la procédures BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_MEMBER_ACCOUNTS
		set @ref_type  = (Select ID_ENTITIES_REF_TYPES from ENTITIES_REF_TYPES Where ENTITIES_REF_TYPES_CODE = 'ACCRED_ACCOUNTS');

	End;


    memberCredentialMain: begin
		Declare memberId Int unsigned;
		Declare memberLngId Int unsigned;
		Declare memberIsAccredited Int unsigned;
		Declare credMbrCursor cursor For
            -- on ne caclule les accrdition que pour les membre au moins accredité sur une entité
			Select MBR.ID_MEMBERS, DF_LANGUAGES_ID_DF_LANGUAGE
                , Coalesce(
                        (
                            select ehm.MEMBERS_ID_MEMBERS
                            from ENTITIES_has_MEMBERS ehm
                            where MBR.ID_MEMBERS = ehm.MEMBERS_ID_MEMBERS
                            Limit 1
                        )
                        , 0
                    ) IS_ACCREDITED
			From V_CONTACTS_MEMBERS_FULL MBR
            
            Where 
                MBR.CONTACTS_TRASHED = 0
--                 And exists(
--                     select ehm.MEMBERS_ID_MEMBERS
--                     from ENTITIES_has_MEMBERS ehm
--                     where MBR.ID_MEMBERS = ehm.MEMBERS_ID_MEMBERS
--                 )
		;
		Open credMbrCursor;

		credMemberBlk: begin
			Declare Exit Handler for NOT FOUND 
                Begin
                    Close credMbrCursor;
                End ;
			credMemberLoop: loop
-- 				Fetch credMbrCursor into memberId, memberLngId;
				Fetch credMbrCursor into memberId, memberLngId, memberIsAccredited;
-- 				call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_CLEAR_MEMBER_CRENDENTIALS(memberId, null);
                if Coalesce(memberIsAccredited, 0) <> 0 then
                    -- la procédure de purge des anciennes accrditation est appelé 
                    -- directement dans la procédure BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_MEMBER_ACCOUNTS 
                    -- afin de limiter le temps de "coupure" du membre
                    call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_MEMBER_ACCOUNTS(memberId, memberLngId, @ref_type);
                Else 
                    -- le membre n'est pas/plus accredité sur aucune des entité
                    -- il n'est pas util de calculer ces accreditations
                    -- on purge si nécéssaire les anciens
                    call BUSINESS_COMPUTE_MEMBERS_CREDENTIALS_CLEAR_MEMBER_CRENDENTIALS(memberId, null);
                End if;
				
			End loop  credMemberLoop;
		End;

    end ;
end //
Delimiter ;

