return: text
lang: plpgsql
src: |
  DECLARE	
  	_nbPlanAna integer; -- Nb de plans analytiques possibles.
  	_templateName text; -- Nom de la vue SQL template.
  	_template text; -- source SQL template à compléter par cette fonction.
  	_opt_mode text; -- Option t_divers définissant quelle vue SQL source est à prendre
  	_viewName text; -- Nom de la vue à créer.
  	_sqlView text; -- SQL de la vue à créer.
  	_tmpRatio text; -- Ratio à appliquer.
  	_tmpSelectId text[]; -- Colonnes à ajouter.
  	_tmpSelectCode text[]; -- Colonnes à ajouter.
  	_tmpSelectTexte text[]; -- Colonnes à ajouter.
  	_tmpJoin text; -- Jointure à utiliser.
  	result text;
  BEGIN
  	_nbPlanAna = 3; -- Actuellement on gère 3 plans analytiques maximum.
  	_templateName = 'v_historique_paie_0'; -- Par défaut, le template SQL à récupérer est situé dans cette vue.
  	_opt_mode = ''; -- Par défaut, on prend la vue standard.
  
  	-- Récupération de l'option.
  	SELECT CASE WHEN valeur != '0' THEN '_1' ELSE '' END INTO _opt_mode FROM rh.t_divers WHERE code = 'OPT_STD_HP';
  	
  	-- Récupération du template.
  	SELECT pg_get_viewdef(c.oid, true) INTO _template FROM pg_class c JOIN pg_namespace as n on n.oid = c.relnamespace	WHERE n.nspname = 'rh' AND c.relname = _templateName||coalesce(_opt_mode, ''::text);
  	
  	-- La vue v_historique_paie_0 est un template dans lequel il faut remplace "* 999" et "JOIN ( SELECT 1) subq ON 1 = 1" par les bonnes valeurs.
  	FOR i IN 1..2^_nbPlanAna LOOP
  	    _tmpRatio = '';
  	    _tmpSelectId = null;
  	    _tmpSelectCode = null;
  	    _tmpSelectTexte = null;
  	    _tmpJoin = '';
  	    _sqlView = '';
  	    
  	    IF (i::bit(3) = 0::bit(3)) THEN
  			_viewName = 'rh.v_historique_paie_1';
  		ELSE
  			_viewName = 'rh.v_historique_paie_1_' || i::bit(3)::text;
  		END IF;
  	    
  	    FOR j IN 1.._nbPlanAna LOOP
  			IF (substr(i::bit(3)::text, j, 1) = '1') THEN
  				_tmpRatio = _tmpRatio || ' * v' || j::text || '.ratio';
  				_tmpSelectId[j] = 'v' || j::text || '.section_analytique_id as ng_section_analytique_' || j::text || '_id, v' || j::text || '.section_analytique_section_id as ng_section_analytique_' || j::text || '_section_id';
  			    _tmpSelectCode[j] = 'v' || j::text || '.section_analytique_code as ng_section_analytique_' || j::text || '_code, v' || j::text || '.section_analytique_section_code as ng_section_analytique_' || j::text || '_section_code';
  			    _tmpSelectTexte[j] = 'v' || j::text || '.section_analytique_texte as ng_section_analytique_' || j::text || '_texte, v' || j::text || '.section_analytique_section_texte as ng_section_analytique_' || j::text || '_section_texte';
  				_tmpJoin = _tmpJoin || ' JOIN rh.p_ventilation_section AS v' || j::text || ' ON v' || j::text || '.ventilation_id = p_historique_paie.ventilation_'|| j::text ||'_id';
  			ELSE
  				_tmpSelectId[j] = 'null::bigint as ng_section_analytique_' || j::text || '_id';
  			    _tmpSelectCode[j] = 'null::text as ng_section_analytique_' || j::text || '_code';
  			    _tmpSelectTexte[j] = 'null::text as ng_section_analytique_' || j::text || '_texte';
  			END IF;
  	    END LOOP;
  	    
  	    -- Remplacements
  	    _sqlView = replace (_template, '* 999', _tmpRatio);
  	    _sqlView = replace (_sqlView, '999::bigint', array_to_string(_tmpSelectId, ', ', 'null::bigint'));
  	    _sqlView = replace (_sqlView, '''section_analytique_ng_code''::text', array_to_string(_tmpSelectCode, ', ', 'null::text'));
  	    _sqlView = replace (_sqlView, '''section_analytique_ng_texte''::text', array_to_string(_tmpSelectTexte, ', ', 'null::text'));
  	    _sqlView = replace (_sqlView, 'JOIN ( SELECT 1) subq ON 1 = 1', _tmpJoin);
     	    _sqlView = replace (_sqlView, ' AS to_replace_id', '');
     	    _sqlView = replace (_sqlView, ' AS to_replace_code', '');
     	    _sqlView = replace (_sqlView, ' AS to_replace_texte', '');
  
  		-- Suppression de la vue si elle existe.
  		EXECUTE 'DROP VIEW IF EXISTS ' || _viewName;
  		
  		-- Création de la vue.
  	    EXECUTE 'CREATE VIEW ' || _viewName || ' AS ' || _sqlView;
  	END LOOP;
  	
  	RETURN 'OK';
  END;