SET TERM ^ ;

CREATE OR ALTER procedure SPUI_TRIBUTACAO_OPERACAO
as
declare variable ESTABELECIMENTO_ID integer;
declare variable OPERACAO_CODIGO varchar(10);
declare variable OPERACAO_CODIGO_AUX varchar(10);
declare variable CFOP_CODIGO varchar(10);
declare variable ESTABELECIMENTO_UF varchar(10);
declare variable TRIBUTACAO_ICMS integer;
declare variable TRIBUTACAO_PISCOF varchar(2);
declare variable PERCENTUAL_ICMS numeric(15,4);
declare variable CHECAGEM_VINCULO integer;
declare variable TRIBUTACAO_ICMS_OPER integer;
declare variable TRIBUTACAO_PIS_OPER varchar(2);
declare variable TRIBUTACAO_COFINS_OPER varchar(2);
declare variable PERCENTUAL_ICMS_OPER numeric(15,4);
declare variable CONTADOR integer;
declare variable FAMILIAS varchar(4000);
declare variable SPLIT_FAMILIA varchar(4000);
declare variable FAMILIA_ID integer;
declare variable CHECAGEM_OPERACAO integer;
BEGIN

    :CONTADOR = 1;

    FOR SELECT
            X.ESTABELECIMENTO_CODIGO,
            X.OPERACAO_PDV,
            X.CFOP_CODIGO,
            X.UF,
            CAST(X.CST_ICMS AS INTEGER) AS TRIBUTACAO_ICMS,
            X.CST_PISCOF,
            X.TAXA_ICMS,
            CAST(X.FAMILIAS AS VARCHAR(4000)) AS FAMILIAS
        FROM (
            SELECT DISTINCT
                T.ESTABELECIMENTO_CODIGO,
                T.OPERACAO_PDV,
                T.CFOP_CODIGO,
                E.UF,
                T.CST AS CST_ICMS,
                T.CST_PISCOF,
                T.TAXA_ICMS,
                LIST(T.FAMILIA_CODIGO) AS FAMILIAS
            FROM TBFAMILIA_FICHA T, TBESTABELECIMENTO E
            WHERE T.ESTABELECIMENTO_CODIGO = E.CODIGO
            AND T.OPERACAO_PDV IS NOT NULL
            AND T.OPERACAO_PDV <> ''
            AND T.CFOP_CODIGO IS NOT NULL
            AND T.CFOP_CODIGO <> ''
            AND T.CST IS NOT NULL
            AND T.CST <> ''
            AND T.CST_PISCOF <> '0'
            GROUP BY 1, 2, 3, 4, 5, 6, 7
        ) X
    INTO :ESTABELECIMENTO_ID, :OPERACAO_CODIGO, :CFOP_CODIGO, :ESTABELECIMENTO_UF,
    :TRIBUTACAO_ICMS, :TRIBUTACAO_PISCOF, :PERCENTUAL_ICMS, :FAMILIAS
    DO BEGIN
        
        :CHECAGEM_OPERACAO = COALESCE((SELECT FIRST 1 V.ID FROM TBOPERACAO V WHERE V.CODIGO = :OPERACAO_CODIGO AND V.ORIGEM = 2), 0);

        IF(:CHECAGEM_OPERACAO = 0) THEN
        BEGIN

            :OPERACAO_CODIGO_AUX = 'V'||FN_LPAD(:CONTADOR, 2, '0');
    
            /* INSERINDO OPERACAO */
            
            INSERT INTO TBOPERACAO (CODIGO, DESCRICAO, TIPO, GERACONSUMO, OPERACAOCONSUMO, CONTROLE_ESTOQUE,
                                    CONTROLE_ESTOQUE_EXTERNO, CONTROLE_FATURAMENTO, CONTROLE_DEVOLUCAO, GERA_COMISSAO,
                                    GERA_DUPLICATA, EXIGE_DUPLICATA, EXIGE_LOCALIZACAO, EXIGE_PEDIDO, EXIGE_OC, EXIGE_NF_REFERENCIA,
                                    ESTOQUE, NOTAFISCAL, STATUS, STATUSEXCLUSAO, USUARIO_CODIGO, DATA, ATUALIZA_CUSTO, SERVICO,
                                    EXIGE_CUSTO, EXIGE_CUSTO_EXTERNO, TRANSFERENCIA, EXIGE_NCM, BLOQUEIA_ITEM_OC, CONTROLE_REVISAO,
                                    NAT_BC_CRED, NAT_RECEITA, CONTROLE_CONSIGNACAO, ACERTO, DESPERDICIO, FAMILIAS, GGF,
                                    OBSERVACAO, TIPO_SERVICO, TIPO_DESCONTO, FDI, COMPRA_REVENDA, CONTROLE_DEVOLUCAO_TROCA, ORIGEM)
            SELECT :OPERACAO_CODIGO_AUX CODIGO, DESCRICAO, TIPO, GERACONSUMO, OPERACAOCONSUMO, CONTROLE_ESTOQUE, CONTROLE_ESTOQUE_EXTERNO,
                   CONTROLE_FATURAMENTO, CONTROLE_DEVOLUCAO, GERA_COMISSAO, GERA_DUPLICATA, EXIGE_DUPLICATA, EXIGE_LOCALIZACAO,
                   EXIGE_PEDIDO, EXIGE_OC, EXIGE_NF_REFERENCIA, ESTOQUE, NOTAFISCAL, STATUS, STATUSEXCLUSAO, USUARIO_CODIGO, CURRENT_DATE AS DATA,
                   ATUALIZA_CUSTO, SERVICO, EXIGE_CUSTO, EXIGE_CUSTO_EXTERNO, TRANSFERENCIA, EXIGE_NCM, BLOQUEIA_ITEM_OC,
                   CONTROLE_REVISAO, NAT_BC_CRED, NAT_RECEITA, CONTROLE_CONSIGNACAO, ACERTO, DESPERDICIO, FAMILIAS, GGF,
                   OBSERVACAO, TIPO_SERVICO, TIPO_DESCONTO, FDI, COMPRA_REVENDA, CONTROLE_DEVOLUCAO_TROCA, 2 AS ORIGEM
            FROM TBOPERACAO O
            WHERE O.CODIGO = :OPERACAO_CODIGO;
    
            /* INSERINDO VINCULO CONTABIL */
    
            INSERT INTO TBOPERACAO_VINCULO_CONTABIL (ESTABELECIMENTO_CODIGO, OPERACAO_CODIGO, CONTA_CREDITO, CONTA_DEBITO,
                                     VALOR_ITEM, VALOR_ICMS, VALOR_IPI, VALOR_PIS, VALOR_COFINS, VALOR_ICMS_ST,
                                     VALOR_ACRESCIMOS, VALOR_DESCONTOS, VALOR_II, VALOR_IOF, VALOR_PEDAGIO_ILPUB,
                                     RETENCAO_PIS, RETENCAO_COFINS, RETENCAO_CSLL, RETENCAO_INSS, RETENCAO_IRRF,
                                     RETENCAO_ISSQN, HISTORICO_CONTABIL, TIPO_CREDITO, TIPO_DEBITO, VALOR_FRETE,
                                     VALOR_SEGURO)
            SELECT ESTABELECIMENTO_CODIGO, :OPERACAO_CODIGO_AUX OPERACAO_CODIGO, CONTA_CREDITO, CONTA_DEBITO, VALOR_ITEM, VALOR_ICMS, VALOR_IPI,
                   VALOR_PIS, VALOR_COFINS, VALOR_ICMS_ST, VALOR_ACRESCIMOS, VALOR_DESCONTOS, VALOR_II, VALOR_IOF,
                   VALOR_PEDAGIO_ILPUB, RETENCAO_PIS, RETENCAO_COFINS, RETENCAO_CSLL, RETENCAO_INSS, RETENCAO_IRRF, RETENCAO_ISSQN,
                   HISTORICO_CONTABIL, TIPO_CREDITO, TIPO_DEBITO, VALOR_FRETE, VALOR_SEGURO
            FROM TBOPERACAO_VINCULO_CONTABIL O
            WHERE O.OPERACAO_CODIGO = :OPERACAO_CODIGO;
    
            /* INSERINDO VINCULO CFOP */
    
            INSERT INTO TBOPERACAO_VINCULO_CFOP (OPERACAO_CODIGO, ESTABELECIMENTO_CODIGO, CFOP_CODIGO, UF, FAMILIA_CODIGO,
                                     TRIBUTACAO_ICMS, ICMS, TRIBUTACAO_IPI, TRIBUTACAO_PIS, TRIBUTACAO_COFINS)
            VALUES (:OPERACAO_CODIGO_AUX, :ESTABELECIMENTO_ID, :CFOP_CODIGO, :ESTABELECIMENTO_UF, 0, :TRIBUTACAO_ICMS, :PERCENTUAL_ICMS,
                    '03', :TRIBUTACAO_PISCOF, :TRIBUTACAO_PISCOF);
    
            FOR SELECT
                M.OSPLIT
            FROM SPLIT(:FAMILIAS, ',') M
            INTO :SPLIT_FAMILIA
            DO BEGIN
                :FAMILIA_ID = CAST(:SPLIT_FAMILIA AS INTEGER);
    
                UPDATE TBREGRA_FAMILIA_CFOP T SET T.OPERACAO_CODIGO = :OPERACAO_CODIGO_AUX WHERE T.FAMILIA_ID = :FAMILIA_ID;
    
                UPDATE TBFAMILIA_FICHA T SET T.OPERACAO_PDV = :OPERACAO_CODIGO_AUX WHERE T.FAMILIA_CODIGO = :FAMILIA_ID;
    
            END

            :CONTADOR = :CONTADOR + 1;

        END

        IF(:CHECAGEM_OPERACAO > 0) THEN
        BEGIN

            UPDATE OR INSERT INTO TBOPERACAO_VINCULO_CFOP (OPERACAO_CODIGO, ESTABELECIMENTO_CODIGO, CFOP_CODIGO, UF, FAMILIA_CODIGO,
                                     TRIBUTACAO_ICMS, ICMS, TRIBUTACAO_IPI, TRIBUTACAO_PIS, TRIBUTACAO_COFINS)
            VALUES (:OPERACAO_CODIGO, :ESTABELECIMENTO_ID, :CFOP_CODIGO, :ESTABELECIMENTO_UF, 0, :TRIBUTACAO_ICMS, :PERCENTUAL_ICMS,
                    '03', :TRIBUTACAO_PISCOF, :TRIBUTACAO_PISCOF)
            MATCHING(OPERACAO_CODIGO, ESTABELECIMENTO_CODIGO, CFOP_CODIGO, UF);

        END



    END

END
^

SET TERM ; ^

