IF EXISTS
(
    SELECT *
    FROM SYS.OBJECTS
    WHERE NAME = 'UFD_EST_PROD_TRIB_PIS_COFINS'
)
    DROP FUNCTION [dbo].[UFD_EST_PROD_TRIB_PIS_COFINS];
GO
--SELECT * FROM GLB_MOV_OP ORDER BY DS_MOV_OP
--SELECT * FROM GLB_NT_OP WHERE CD_NT_OP=8 
--  select * from UFD_EST_PROD_TRIB_PIS_COFINS(1,28,16,39546,61,78,4) 
CREATE FUNCTION [dbo].[UFD_EST_PROD_TRIB_PIS_COFINS]
(@CD_EMP                INT,
 @CD_FILIAL             INT,
 @CD_MOV_OP             INT,
 @CD_PROD               INT,
 @CD_NT_OP              INT,
 @VLR_PROD_BASE_IMPOSTO MONEY,
 @REGIME_DOC			TINYINT
) --(((QT_IT * VLR_IT) + VLR_IPI + VLR_OUTRAS_DESPESAS) - VLR_DESC)  
RETURNS @UFD_RETURN TABLE
(CD_CST_PIS                       INT,
 PERC_PIS                         MONEY,
 VLR_BASE_PIS                     MONEY,
 VLR_PIS                          MONEY,
 CD_CST_COFINS                    INT,
 PERC_COFINS                      MONEY,
 VLR_BASE_COFINS                  MONEY,
 VLR_COFINS                       MONEY,
 MOV_FLAG_NAO_TRIBUTAR_PIS_COFINS INT,
 PROD_PIS_COFINS                  INT,
 PROD_TIPO_TRIBUTACAO             INT,
 PROD_FLAG_TRIB_PIS_COFINS_PROD   INT,
 PROD_LISTA_PROD                  INT,
 NT_OP_CST                        INT,
 CST_TP_TRIB_PIS                  INT,
 CST_TP_TRIB_COFINS               INT
)
     BEGIN
         DECLARE @PERC_PIS MONEY;
         DECLARE @VLR_BASE_PIS MONEY;
         DECLARE @VLR_PIS MONEY;
         DECLARE @PERC_COFINS MONEY;
         DECLARE @VLR_BASE_COFINS MONEY;
         DECLARE @VLR_COFINS MONEY;
         DECLARE @FLAG_NAO_TRIBUTAR_PIS_COFINS INT;
         DECLARE @PIS_COFINS INT;
         DECLARE @TIPO_TRIBUTACAO INT;
         DECLARE @FLAG_TRIB_PIS_COFINS_PROD INT;
         DECLARE @LISTA_PROD INT;
         DECLARE @CST_PIS INT;
         DECLARE @CST_COFINS INT;
         DECLARE @CST_NT_OP INT;
         DECLARE @TP_TRANSA INT;
         DECLARE @TP_TRIB_CST_PIS INT;
         DECLARE @TP_TRIB_CST_COFINS INT;
         DECLARE @TP_REGIME_APURACAO_PISCOFINS INT;
		 DECLARE @TP_REGIME_APURACAO_ICMS INT;
         SET @PERC_PIS = 0;
         SET @VLR_BASE_PIS = 0;
         SET @VLR_PIS = 0;
         SET @PERC_COFINS = 0;
         SET @VLR_BASE_COFINS = 0;
         SET @VLR_COFINS = 0;
         SET @FLAG_NAO_TRIBUTAR_PIS_COFINS = 0;
         SET @PIS_COFINS = 0;
         SET @TIPO_TRIBUTACAO = 0;
         SET @FLAG_TRIB_PIS_COFINS_PROD = 0;
         SET @LISTA_PROD = 0;
         SET @CST_PIS = 0;
         SET @CST_COFINS = 0;
         SET @CST_NT_OP = 0;
         SET @TP_TRANSA = 0;
         SET @TP_TRIB_CST_PIS = 0;
         SET @TP_TRIB_CST_COFINS = 0;
         SET @TP_REGIME_APURACAO_PISCOFINS = 0;
		 SET @TP_REGIME_APURACAO_ICMS = 0;

         --ANTES
         --A aliquota de Pis/Cofins para empresas do lucro presumido é diferenciada
         -- Quando lucro presumido buscar a alíquota na tabela GLB_IMPOSTOS_GRP_ECON
         --AGORA

		-- @TP_REGIME_APURACAO_PISCOFINS Busca o tipo de regime de apuração de pis/cofins por filial -criado pelo 
		-- fato de existir cumulativo e nao cumulativo no mesmo grupo economico
		----@TP_REGIME_APURACAO_ICMS Busca o tipo de regime de apuração Icms por filial
		----Qdo Regime Simples Nacional não poderá aplicar incidencia do imposto. Neste caso será utilizado o CST = 99
		 SELECT @TP_REGIME_APURACAO_PISCOFINS = ISNULL(TP_REGIME_APURAC_PIS_COFINS, 0) , 
		        @TP_REGIME_APURACAO_ICMS =  REGIME_TRIBUTARIO  
         FROM PRC_FILIAL
         WHERE CD_FILIAL = @CD_FILIAL;
 
		 --Pega a natureza informada
         IF @CD_MOV_OP > 0
             BEGIN
                 SELECT @FLAG_NAO_TRIBUTAR_PIS_COFINS = ISNULL(FLAG_NAO_TRIBUTAR_PIS_COFINS, 0),
                        @TP_TRANSA = TP_MOV_OP_TRANSA
                 FROM GLB_MOV_OP
                 WHERE CD_MOV_OP = @CD_MOV_OP;
             END; 

         --Forca saida de mercadoria
         IF @CD_MOV_OP = 0
             BEGIN
                 SET @FLAG_NAO_TRIBUTAR_PIS_COFINS = 0;
                 SET @TP_TRANSA = 1;
             END;

         --Natureza tributa pis/cofins
         IF @FLAG_NAO_TRIBUTAR_PIS_COFINS = 0
             BEGIN

                 --Buscando Aliquota de PIS
                 --1 - PIS - NÃO CUMULATIVO
                 --2 - COFINS - NÃO CUMULATIVO
                 --32 - PIS - CUMULATIVO"
                 --33 - COFINS - CUMULATIVO

				
				IF (@REGIME_DOC = 3 AND @REGIME_DOC > 0 )
				BEGIN
					/* 32 para PIS (LUCRO PRESUMIDO) */
					SELECT TOP 1 @PERC_PIS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO =32;
					
					/* 33 para COFINS (LUCRO PRESUMIDO) */
					SELECT TOP 1 @PERC_COFINS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO = 33;
				END
				ELSE IF (@REGIME_DOC = 4 AND @REGIME_DOC > 0)
				BEGIN
					/* 32 para PIS (LUCRO REAL) */
					SELECT TOP 1 @PERC_PIS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO =1;
					
					/* 33 para COFINS (LUCRO REAL) */
					SELECT TOP 1 @PERC_COFINS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO = 2;
				END
				ELSE
				BEGIN
					SELECT TOP 1 @PERC_PIS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO = CASE
										  WHEN @TP_REGIME_APURACAO_PISCOFINS = 0
										  THEN 1
										  ELSE 32
									  END;

					--Buscando Aliquota de COFINS
					SELECT TOP 1 @PERC_COFINS = PERC_IMP
					FROM GLB_IMPOSTOS
					WHERE TIPO_IMPOSTO = CASE
										  WHEN @TP_REGIME_APURACAO_PISCOFINS = 0
										  THEN 2
										  ELSE 33
									  END;
				END
									  
                 --Calculando PIS
                 SET @VLR_BASE_PIS = @VLR_PROD_BASE_IMPOSTO;
                 SET @VLR_PIS = ROUND((@VLR_BASE_PIS * @PERC_PIS) / 100.00, 4);

                 --Calculando COFINS
                 SET @VLR_BASE_COFINS = @VLR_PROD_BASE_IMPOSTO;
                 SET @VLR_COFINS = ROUND((@VLR_BASE_COFINS * @PERC_COFINS) / 100.00, 4);
            
			 END; --IF @FLAG_NAO_TRIBUTAR_PIS_COFINS = 0

         --Se existir tributacao por por CFOP
         SELECT @CST_COFINS = CASE
                                  WHEN ISNULL(GLB_NT_OP.CST_COFINS, 0) = 0
                                  THEN @CST_COFINS
                                  ELSE ISNULL(GLB_NT_OP.CST_COFINS, 0)
                              END,
                @CST_PIS = CASE
                               WHEN ISNULL(GLB_NT_OP.CST_PIS, 0) = 0
                               THEN @CST_PIS
                               ELSE ISNULL(GLB_NT_OP.CST_PIS, 0)
                           END,
                @CST_NT_OP = CASE
                                 WHEN ISNULL(GLB_NT_OP.CST_PIS, 0) = 0
                                 THEN 0
                                 ELSE 1
                             END
         FROM GLB_NT_OP
         WHERE CD_NT_OP = @CD_NT_OP;
        
		 --se Nao possui CST de PIS/COFINS no CFOP
         IF @CST_PIS = 0
             BEGIN
                 SELECT @PIS_COFINS = ISNULL(PIS_COFINS, 0),
                        @TIPO_TRIBUTACAO = CASE
                                               WHEN @TP_TRANSA = 0
                                               THEN ISNULL(TIPO_TRIBUTACAO_PIS_COFINS_ENTRADA, 0)
                                               ELSE ISNULL(TIPO_TRIBUTACAO_PIS_COFINS, 0)
                                           END,
                        @FLAG_TRIB_PIS_COFINS_PROD = ISNULL(FLAG_TRIB_PIS_COFINS_PROD, 0),
                        @LISTA_PROD = ISNULL(LISTA_PROD, 0),
                        @CST_COFINS = CASE
                                          WHEN @TP_TRANSA = 0
                                          THEN ISNULL((CASE
                                                           WHEN(isnull(FLAG_TRIB_PIS_COFINS_PROD, 0)) = 1
                                                           THEN EST_PROD.CD_CST_COFINS_ENTRADA
                                                           ELSE 0
                                                       END), 0)
                                          ELSE ISNULL((CASE
                                                           WHEN(isnull(FLAG_TRIB_PIS_COFINS_PROD, 0)) = 1
                                                           THEN EST_PROD.CD_CST_COFINS_SAIDA
                                                           ELSE 0
                                                       END), 0)
                                      END,
                       @CST_PIS = CASE
                                       WHEN @TP_TRANSA = 0
                                       THEN ISNULL((CASE
                                                        WHEN(isnull(FLAG_TRIB_PIS_COFINS_PROD, 0)) = 1
                                                        THEN EST_PROD.CD_CST_PIS_ENTRADA
                                                        ELSE 0
                                                    END), 0)
                                       ELSE ISNULL((CASE
                                                        WHEN(isnull(FLAG_TRIB_PIS_COFINS_PROD, 0)) = 1
                                                        THEN EST_PROD.CD_CST_PIS_SAIDA
                                                        ELSE 0
                                                    END), 0)
                                   END
                 FROM EST_PROD
                 WHERE CD_EMP = @CD_EMP
                       AND CD_PROD = @CD_PROD;
             END;


         --Nao possui CST de PIS/COFINS no CFOP nem por exceção do produto
         IF @CST_PIS = 0
             IF @CST_NT_OP = 0
                 BEGIN
                     SELECT @CST_COFINS = GLB_TRIB_PIS_COFINS_REGIME.CD_CST,
                            @CST_PIS = GLB_TRIB_PIS_COFINS_REGIME.CD_CST
                     FROM GLB_TRIB_PIS_COFINS_REGIME
                     WHERE GLB_TRIB_PIS_COFINS_REGIME.CD_LISTA = @LISTA_PROD
                           AND GLB_TRIB_PIS_COFINS_REGIME.TP_TRANSA = @TP_TRANSA
                           AND GLB_TRIB_PIS_COFINS_REGIME.TIPO_TRIBUTACAO = @TIPO_TRIBUTACAO
                           AND TIPO_REGIME = @TP_REGIME_APURACAO_PISCOFINS;
                 END;

         --==================================================================
         --Analisando PIS
         --==================================================================
         --Analisando se o CST e tributavel
         SELECT @TP_TRIB_CST_PIS = TP_TRIB
         FROM CST_PIS_COFINS
         WHERE CD_CST = @CST_PIS;

	    --Se for igual a zero nao possui imposto
         IF @TP_TRIB_CST_PIS = 0
             BEGIN
                 SET @PERC_PIS = 0;
                 SET @VLR_BASE_PIS = 0;
                 SET @VLR_PIS = 0;
             END;

         --Se for igual a so tem base
         IF @TP_TRIB_CST_PIS = 2
             BEGIN
                 SET @PERC_PIS = 0;
                 SET @VLR_PIS = 0;
             END;
         --==================================================================
         --Analisando COFINS
         --==================================================================
         --Analisando se o CST e tributavel
         SELECT @TP_TRIB_CST_COFINS = TP_TRIB,
				@PIS_COFINS = TP_TRIB
         FROM CST_PIS_COFINS
         WHERE CD_CST = @CST_COFINS;

         --Se for igual a zero nao possui imposto
         IF @TP_TRIB_CST_PIS = 0
             BEGIN
                 SET @PERC_COFINS = 0;
                 SET @VLR_BASE_COFINS = 0;
                 SET @VLR_COFINS = 0;
             END;

         --Se for igual a so tem base
         IF @TP_TRIB_CST_PIS = 2
             BEGIN
                 SET @PERC_COFINS = 0;
                 SET @VLR_COFINS = 0;
             END;
         --==================================================================

		 IF @VLR_BASE_PIS < 0 
		 BEGIN
			SET @CST_PIS=''
			SET @VLR_BASE_PIS=0
			SET @VLR_PIS=0
			SET @PERC_PIS=0
		 END 
		 
		 IF @VLR_BASE_COFINS < 0 
		 BEGIN
			SET @CST_COFINS=''
			SET @VLR_BASE_COFINS=0
			SET @VLR_COFINS=0
			SET @PERC_COFINS=0
		 END
		 
		 IF @TP_REGIME_APURACAO_ICMS  =1  -- Filial optante pelo simples Nacional
			
			BEGIN
			SET @CST_PIS='99'
			SET @VLR_BASE_PIS=0
			SET @VLR_PIS=0
			SET @PERC_PIS=0
			
			SET @CST_COFINS='99'
			SET @VLR_BASE_COFINS=0
			SET @VLR_COFINS=0
			SET @PERC_COFINS=0

		 END;
		 
         INSERT INTO @UFD_RETURN
                SELECT @CST_PIS,
                       @PERC_PIS,
                       @VLR_BASE_PIS,
                       @VLR_PIS,
                       @CST_COFINS,
                       @PERC_COFINS,
                       @VLR_BASE_COFINS,
                       @VLR_COFINS,
                       @FLAG_NAO_TRIBUTAR_PIS_COFINS,
                       @PIS_COFINS,
                       @TIPO_TRIBUTACAO,
                       @FLAG_TRIB_PIS_COFINS_PROD,
                       @LISTA_PROD,
                       @CST_NT_OP,
                       @TP_TRIB_CST_PIS,
                       @TP_TRIB_CST_COFINS;
         RETURN;
     END;