SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE function [dbo].[f_pr_products]
(
	@branch_id		int,						-- code EJ de la session
	@user_code		ais_code_medium,			-- id de l'utilisateur connecté (ou '%')
	@introducer_id	int,						-- id de l'apporteur attaché à l'utilisateur connecté (ou 0)
	@currency_code	ais_code_short,				-- code devise (ou '%')
	@ref_date		date						-- date de référence: si NULL - pas de filtre. Sinon, on filtre freeze & prd_date_begin <= @ref_date <= prd_date_end
								
) 
returns TABLE
as 

	/*
	Cette fonction renvoie la liste des produits disponibles pour un utilisateur, en fonction de la sesion.
	*/
	RETURN

		select	distinct up.usrp_product_code AS product_code
		from	usr_users_products up
				inner join usr_users u on u.usr_user_code = up.usrp_user_code
				inner join usr_profils pr on pr.pr_profil_code = u.usr_profil_code
				inner join pr_products p on p.prd_product_code = up.usrp_product_code
				inner join pr_products_branches pb on pb.prdb_product_code = p.prd_product_code and pb.prdb_branch_id = @branch_id
				inner join pr_families f on f.pf_family_code = p.prd_family_code
		where	(@user_code = '%' or u.usr_user_code = @user_code)					-- code utilisateur
		and		(@currency_code = '%' or pb.prdb_currency_code = @currency_code)	-- code devise
		and		(
				-- utilisateur standard, qui n'est pas attaché à un apporteur - il a le droit à tous les produits
				@introducer_id <= 0				
				or
				-- utilisateur attaché à un apporteur, il voit uniquement ses produits
				exists (	select	1 
							from	pr_products_introducers ppi 
							where	ppi.prdint_product_code = p.prd_product_code 
							and		ppi.prdint_branch_id = @branch_id
							and		ppi.prdint_introducer_id = @introducer_id )
				)

				-- si la date de référence == NULL - on ne vérifie pas freeze & la période
		and		1 =		case
						when @ref_date is null then 1
						when 
								--	freeze
								( 
								pr.pr_admin != 0				-- l'administrateur peut utiliser les éléments freezed
								or
									(	p.prd_freeze	= 0		-- produit bloqué
									and	pb.prdb_freeze	= 0		-- utilisation d'un produit bloquée pour une EJ
									and	f.pf_freeze		= 0		-- famille bloquée
									)
								)
								-- vérifier la période de validité du produit
								and		isnull(@ref_date, prd_date_begin) between prd_date_begin and isnull(prd_date_end, '01/01/2100')

								then 1
						else 0
						end

		
	






GO
