CREATE OR ALTER trigger ttbmfe_parcelamento_b02i for tbmfe_parcelamento
active before insert or update position 1
AS
declare variable status_cf varchar(5);
declare variable desc_operacao varchar(5);
declare variable tipo_operacao varchar(5);
declare variable for_pag integer;
declare variable estabelecimento_id integer;
declare variable pagamento_forma_id integer;
declare variable dt_emissao date;
declare variable CONTA_RECEBER_BANCO integer;
declare variable CONTA_RECEBER_MODALIDADE integer;
declare variable CONTA_RECEBER_POSICAO integer;
declare variable CONTA_RECEBER_COBRANCA integer;
declare variable CONTA_RECEBER_OPERACAO integer;
declare variable PARCELAMENTO_ID integer;
declare variable coo integer;
declare variable valor Numeric(10,5);
begin

end;

CREATE OR ALTER trigger ttbmfe_parcelamento_item_b01ui for tbmfe_parcelamento_item
active before insert or update position 1
AS
declare variable status_cf varchar(5);
declare variable desc_operacao varchar(5);
declare variable tipo_operacao varchar(5);
declare variable for_pag integer;
declare variable estabelecimento_id integer;
declare variable pagamento_forma_id integer;
declare variable dt_emissao date;
declare variable CONTA_RECEBER_BANCO integer;
declare variable CONTA_RECEBER_MODALIDADE integer;
declare variable CONTA_RECEBER_POSICAO integer;
declare variable CONTA_RECEBER_COBRANCA integer;
declare variable CONTA_RECEBER_OPERACAO integer;
declare variable PARCELAMENTO_ID integer;
declare variable PAGAMENTO_ID integer;
declare variable I integer;
declare variable VALOR numeric(15,2);
declare variable VALOR2 numeric(15,2);
declare variable controle integer;
declare variable coo integer;
begin

end;

CREATE OR ALTER function fn_parcelamento_nota (
    estabelecimento integer,
    i_numero_nota integer,
    i_serie integer)
returns integer
as
declare variable valor_total_nf numeric(18,5);
declare variable controle integer;
declare variable data_emissao date;
declare variable numero_notafiscal integer;
declare variable serie varchar(3);
declare variable parcelamento_id integer;
begin

end;

ALTER TABLE TBNFS_PARCELAMENTO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBNFS_PARCELAMENTO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBNFS_PARCELAMENTO DROP CLASSIFICACAO;
ALTER TABLE TBNFS_PARCELAMENTO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBNFS_PARCELAMENTO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBNFS_PARCELAMENTO DROP OLD_PERFIL;

CREATE OR ALTER function fn_parcelamento_nota (
    estabelecimento integer,
    i_numero_nota integer,
    i_serie integer)
returns integer
as
declare variable valor_total_nf numeric(18,5);
declare variable controle integer;
declare variable data_emissao date;
declare variable numero_notafiscal integer;
declare variable serie varchar(3);
declare variable parcelamento_id integer;
begin


  for
    select
    
      t.valor_total_nf,
      p.controle,
      p.data_emissao,
      p.NUMERO_NOTAFISCAL,
      p.SERIE,
      gen_id(GTBNFS_PARCELAMENTO,1) as parcelamento_id
      --1 as parcelamento_id

    from tbnfs p, tbnfs_totais t
    
    where p.estabelecimento_codigo = :ESTABELECIMENTO
    and p.numero_notafiscal = :I_NUMERO_NOTA
    and p.serie = :I_SERIE
    and p.situacao = 2
    and t.nfs_controle = p.controle

  into
    VALOR_TOTAL_NF,
    CONTROLE,
    DATA_EMISSAO,
    NUMERO_NOTAFISCAL,
    SERIE,
    PARCELAMENTO_ID
  do begin

     INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID,NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO, DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE, CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO, NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO, VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE, PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG, SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID, VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO)
            VALUES (
                1,
                :controle,
                1,
                :valor_total_nf,
                :DATA_EMISSAO,
                NULL,
                3,
                0,
                0,
                0,
                0,
                'S',
                :ESTABELECIMENTO,
                :NUMERO_NOTAFISCAL,
                :DATA_EMISSAO,
                10550,
                1,
                :PARCELAMENTO_ID,
                0,
                :valor_total_nf,
                NULL,
                NULL,
                '',
                NULL,
                :SERIE,
                0,
                '0',
                '',
                '',
                '',
                ''||:NUMERO_NOTAFISCAL||'-'|| lpad(:serie,2,'0')||'',
                0,
                '0',
                0,
                0,
                0,
                0,
                0,
                '',
                current_timestamp,
                1);

          INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE, DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO, OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA, VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE, OCORRENCIA_CONTROLE, HISTORICO, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO, CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                VALUES (
                gen_id(GTBCAIXABANCO_REGISTRO,1),
                :ESTABELECIMENTO,
                0,
                :DATA_EMISSAO,
                10550,
                0,
                :PARCELAMENTO_ID,
                0,
                3,
                :NUMERO_NOTAFISCAL,
                1,
                :valor_total_nf,
                0,
                0,
                0,
                0,
                0,
                0,
                '1',
                NULL,
                'VR.RECEB.REF.',
                :valor_total_nf,
                current_timestamp,
                'D',
                :SERIE,
                'NFS',
                '',
                '',
                0,
                :controle,
                :valor_total_nf,
                NULL,
                '',
                0);

  end

  return PARCELAMENTO_ID;
end;


CREATE OR ALTER trigger ttbmfe_parcelamento_item_b01ui for tbmfe_parcelamento_item
active before insert or update position 1
AS
declare variable status_cf varchar(5);
declare variable desc_operacao varchar(5);
declare variable tipo_operacao varchar(5);
declare variable for_pag integer;
declare variable estabelecimento_id integer;
declare variable pagamento_forma_id integer;
declare variable dt_emissao date;
declare variable CONTA_RECEBER_BANCO integer;
declare variable CONTA_RECEBER_MODALIDADE integer;
declare variable CONTA_RECEBER_POSICAO integer;
declare variable CONTA_RECEBER_COBRANCA integer;
declare variable CONTA_RECEBER_OPERACAO integer;
declare variable PARCELAMENTO_ID integer;
declare variable PAGAMENTO_ID integer;
declare variable I integer;
declare variable VALOR numeric(15,2);
declare variable VALOR2 numeric(15,2);
declare variable controle integer;
declare variable coo integer;
begin

  for_pag = 0;

  PAGAMENTO_ID = coalesce((select h.forma_pagamento from tbmfe_parcelamento h where h.id = new.pagamento_id),0);

  select first 1 s.tipo, s.pagamento_forma_id,CONTA_RECEBER_BANCO,CONTA_RECEBER_MODALIDADE,CONTA_RECEBER_POSICAO,CONTA_RECEBER_COBRANCA, CONTA_RECEBER_OPERACAO from tbforma_pagamento_sat s where s.id = :PAGAMENTO_ID
  into for_pag, :pagamento_forma_id, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA, :CONTA_RECEBER_OPERACAO;

  if(for_pag = 3 and new.pagamento_id > 0)then
  begin

      status_cf = 'C';

      select first 1 e.situacao, e.dt_emissao, e.coo, e.vl_total_nf from tbmfe e where e.serie = new.cfe_serie AND E.numero = new.cfe_numero and e.caixa_id = new.caixa_id
      into :status_cf, :dt_emissao, :coo, :VALOR2;

      :valor2 = new.valorpagamento;

     --se nao cancelado e nao tive parcelamento
     if(status_cf = 'E' and new.parcelamento_id = 0 and old.parcelamento_id = 0)then
     begin

        select first 1 q.estabelecimento_id from tbquiosque q where q.id = new.caixa_id
        into :estabelecimento_id;

        I = 1;

        new.parcelas = iif( coalesce(new.parcelas,0) > 0, new.parcelas, 1);

        :VALOR = :VALOR2 / new.parcelas;

        WHILE (I <= new.parcelas) DO
        BEGIN

            if(I = new.parcelas)then
            begin
                :VALOR = :VALOR2 - (:VALOR * (new.parcelas - 1));
            end

            if(new.parcelas = 1)then
            begin
                :VALOR = :VALOR2;
            end

            ---:VALOR = :VALOR2;
            PARCELAMENTO_ID = gen_id(GTBNFS_PARCELAMENTO,1);
            new.parcelamento_id = PARCELAMENTO_ID;

            INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID,NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO, DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE, CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO, NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO, VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE, PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG, SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID, VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO)
                VALUES (
                    new.caixa_id,
                    0,
                    :I,
                    :VALOR,
                    dateadd(month, :I,:dt_emissao),
                    NULL,
                    :CONTA_RECEBER_OPERACAO,
                    :CONTA_RECEBER_BANCO,
                    :CONTA_RECEBER_MODALIDADE,
                    :CONTA_RECEBER_POSICAO,
                    :CONTA_RECEBER_COBRANCA,
                    'S',
                    :estabelecimento_id,
                    :coo,
                    :dt_emissao,
                    fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                    1,
                    :PARCELAMENTO_ID,
                    0,
                    :VALOR,
                    NULL,
                    NULL,
                    '',
                    NULL,
                    new.cfe_serie,
                    :pagamento_forma_id,
                    '0',
                    '',
                    '',
                    '',
                    'CUPOM: ' || :coo ||'-'|| lpad(new.cfe_serie,2,'0')||' CAIXA:'|| new.caixa_id,
                    0,
                    '0',
                    0,
                    0,
                    0,
                    0,
                    0,
                    '',
                    current_timestamp,
                    2);
    
              select h.tipo, h.descricao_reduzida from TBCONTA_RECEBER_OPERACAO h where h.codigo = :CONTA_RECEBER_OPERACAO
              into  tipo_operacao, desc_operacao;
    
              INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE, DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO, OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA, VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE, OCORRENCIA_CONTROLE, HISTORICO, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO, CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                    VALUES (
                    gen_id(GTBCAIXABANCO_REGISTRO,1),
                    :estabelecimento_id,
                    0,
                    :dt_emissao,
                    fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                    0,
                    :PARCELAMENTO_ID,
                    :CONTA_RECEBER_BANCO,
                    :CONTA_RECEBER_OPERACAO,
                    :coo,
                    :I,
                    :VALOR,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    '1',
                    NULL,
                    'VR.RECEB.REF. Doc.Nr.'||:coo||'-'||new.cfe_serie,
                    :VALOR,
                    current_timestamp,
                    :tipo_operacao,
                    new.cfe_serie,
                    'CF1',
                    '',
                    '',
                    0,
                    0,
                    :VALOR,
                    NULL,
                    '',
                    0);

                    I = I + 1;
          END

     end else
     begin
        --se for canselado e tiver parcelamentos
        if(status_cf = 'C' and new.parcelamento_id > 0)then
        begin
          for
            select t.controle
            from TBNFS_PARCELAMENTO t,tbmfe e
            where t.tipo = 2
            and t.caixa_id = new.caixa_id
            and t.serie = new.cfe_serie
            and t.numero_notafiscal = e.coo
            and e.numero = new.cfe_numero
            and e.serie = new.cfe_serie
            and e.caixa_id = new.caixa_id
          into
             :controle
          do begin
            delete from TBNFS_PARCELAMENTO t where t.controle = :controle;
            delete from TBCAIXABANCO_LANCAMENTO_REG s where s.nfs_parcelamento_controle = :controle;
          end
        end
     end
  end

end;


CREATE OR ALTER trigger ttbmfe_parcelamento_b02i for tbmfe_parcelamento
active before insert or update position 1
AS
declare variable status_cf varchar(5);
declare variable desc_operacao varchar(5);
declare variable tipo_operacao varchar(5);
declare variable for_pag integer;
declare variable estabelecimento_id integer;
declare variable pagamento_forma_id integer;
declare variable dt_emissao date;
declare variable CONTA_RECEBER_BANCO integer;
declare variable CONTA_RECEBER_MODALIDADE integer;
declare variable CONTA_RECEBER_POSICAO integer;
declare variable CONTA_RECEBER_COBRANCA integer;
declare variable CONTA_RECEBER_OPERACAO integer;
declare variable PARCELAMENTO_ID integer;
declare variable coo integer;
declare variable valor Numeric(10,5);
begin

  for_pag = 0;

  select first 1 s.tipo, s.pagamento_forma_id,CONTA_RECEBER_BANCO,CONTA_RECEBER_MODALIDADE,CONTA_RECEBER_POSICAO,CONTA_RECEBER_COBRANCA, CONTA_RECEBER_OPERACAO from tbforma_pagamento_sat s where s.id = new.forma_pagamento
  into for_pag, :pagamento_forma_id, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA, :CONTA_RECEBER_OPERACAO;

  if( for_pag = 1)then
  begin

      status_cf = 'C';

      select first 1 e.situacao, e.dt_emissao,e.coo, e.VL_TOTAL_NF from tbmfe e where e.serie = new.serie AND E.numero = new.numero and e.caixa_id = new.caixa_id
      into :status_cf, :dt_emissao, :coo, :valor;

     --se nao cancelado e nao tive parcelamento
     if(status_cf = 'E' and new.parcelamento_id = 0 and old.parcelamento_id = 0 and new.gerar_parcelamento = 1)then
     begin

        select first 1 q.estabelecimento_id from tbquiosque q where q.id = new.caixa_id
        into :estabelecimento_id;

        PARCELAMENTO_ID = gen_id(GTBNFS_PARCELAMENTO,1);

        new.parcelamento_id = PARCELAMENTO_ID;

        INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID,NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO, DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE, CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO, NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO, VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE, PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG, SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID, VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO)
            VALUES (
                new.caixa_id,
                0,
                1,
                :valor,
                :dt_emissao,
                NULL,
                :CONTA_RECEBER_OPERACAO,
                :CONTA_RECEBER_BANCO,
                :CONTA_RECEBER_MODALIDADE,
                :CONTA_RECEBER_POSICAO,
                :CONTA_RECEBER_COBRANCA,
                'S',
                :estabelecimento_id,
                :coo,
                :dt_emissao,
                fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                1,
                :PARCELAMENTO_ID,
                0,
                :valor,
                NULL,
                NULL,
                '',
                NULL,
                new.serie,
                :pagamento_forma_id,
                '0',
                '',
                '',
                '',
                'CUPOM: ' || :coo ||'-'|| lpad(new.serie,2,'0')||' CAIXA:'|| new.caixa_id,
                0,
                '0',
                0,
                0,
                0,
                0,
                0,
                '',
                current_timestamp,
                2);

          select h.tipo, h.descricao_reduzida from TBCONTA_RECEBER_OPERACAO h where h.codigo = :CONTA_RECEBER_OPERACAO
          into  tipo_operacao, desc_operacao;

          INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE, DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO, OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA, VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE, OCORRENCIA_CONTROLE, HISTORICO, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO, CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                VALUES (
                gen_id(GTBCAIXABANCO_REGISTRO,1),
                :estabelecimento_id,
                0,
                :dt_emissao,
                fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                0,
                :PARCELAMENTO_ID,
                :CONTA_RECEBER_BANCO,
                :CONTA_RECEBER_OPERACAO,
                :coo,
                1,
                :valor,
                0,
                0,
                0,
                0,
                0,
                0,
                '1',
                NULL,
                'VR.RECEB.REF. Doc.Nr.'||:coo||'-'||new.serie ,
                :valor,
                current_timestamp,
                :tipo_operacao,
                new.serie,
                'CF1',
                '',
                '',
                0,
                0,
                :valor,
                NULL,
                '',
                0);

     end else
     begin
        --se for canselado e tiver parcelamentos
        if(status_cf = 'C' and new.parcelamento_id > 0 and new.gerar_parcelamento = 1)then
        begin
          delete from TBNFS_PARCELAMENTO t where t.controle = new.parcelamento_id;
          delete from TBCAIXABANCO_LANCAMENTO_REG s where s.nfs_parcelamento_controle = new.parcelamento_id;
        end
     end
  end

end;CREATE OR ALTER procedure spc_nfs_faturamento8 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

end;

CREATE OR ALTER procedure spc_nfs_faturamento9 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    valor_frete numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

end;

CREATE OR ALTER procedure spi_nfs4 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;


CREATE OR ALTER procedure spi_nfs5 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;

CREATE OR ALTER procedure spi_nfs6 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;

CREATE OR ALTER procedure spi_nfs7 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    vencimento_dae_difal date,
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;

CREATE OR ALTER procedure spi_nfs8 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    vencimento_dae_difal date,
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    modalidade char(1),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;

CREATE OR ALTER procedure spu_nfs3 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    cfop_opcional varchar(5),
    usuario_codigo integer,
    usuario_data date,
    statusexclusao char(1),
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    recibo varchar(20),
    protocolo varchar(20),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    modelo char(2),
    especie1 varchar(5),
    formulario_inicial integer,
    formulario_final integer,
    sped char(1),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;

CREATE OR ALTER trigger ttbnfs_b0u_01 for tbnfs
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin

end;

ALTER TABLE TBNFS ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBNFS set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBNFS DROP CLASSIFICACAO;
ALTER TABLE TBNFS ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBNFS set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBNFS DROP OLD_PERFIL;

CREATE OR ALTER trigger ttbnfs_b0u_01 for tbnfs
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin
  if (old.SALESFORCE = new.SALESFORCE) then
      Begin
        For
        Select 
        (Select First 1 A.DataInicial   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 4),
        (Select First 1 A.DataFINAL     From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 4),
        Coalesce((Select First 1 A.MODULO_CODIGO From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 4),0),
        
        extract(day from OLD.DATA_EMISSAO)||'/'||extract(month from OLD.DATA_EMISSAO)||'/'||extract(year from OLD.DATA_EMISSAO),
        extract(day from NEW.DATA_EMISSAO)||'/'||extract(month from NEW.DATA_EMISSAO)||'/'||extract(year from NEW.DATA_EMISSAO),
        (Select First 1 extract(day from A.DataInicial)||'/'||extract(month from A.DataInicial)||'/'||extract(year from A.DataInicial)
                        ||' A '||extract(day from A.DataFINAL)||'/'||extract(month from A.DataFINAL)||'/'||extract(year from A.DataFINAL)
           From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 4)
        
        FROM RDB$DATABASE
        
        Into :DataInicial,:DataFinal,:MODULO_CODIGO,:DATA1,:DATA2,:DATA3
        Do
        begin
          if (:MODULO_CODIGO = 0)      Then Exception "..." 'MODULO DE NFS[4] NAO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||OLD.ESTABELECIMENTO_CODIGO||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA_EMISSAO < :DATAINICIAL) Then Exception "..." 'MODULO DE NFS[4]. DATA '||:DATA1||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA_EMISSAO > :DATAFINAL)   Then Exception "..." 'MODULO DE NFS[4]. DATA '||:DATA1||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA_EMISSAO < :DATAINICIAL) Then Exception "..." 'MODULO DE NFS[4]. DATA '||:DATA2||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA_EMISSAO > :DATAFINAL)   Then Exception "..." 'MODULO DE NFS[4]. DATA '||:DATA2||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        end
      End

End;


CREATE OR ALTER procedure spu_nfs3 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    cfop_opcional varchar(5),
    usuario_codigo integer,
    usuario_data date,
    statusexclusao char(1),
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    recibo varchar(20),
    protocolo varchar(20),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    modelo char(2),
    especie1 varchar(5),
    formulario_inicial integer,
    formulario_final integer,
    sped char(1),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
UPDATE TbNfs SET
Estabelecimento_Codigo = :Estabelecimento_Codigo,
Numero_NotaFiscal      = :Numero_NotaFiscal,
Serie                  = :Serie,
Empresa_Codigo         = :Empresa_Codigo,
Natureza               = :Natureza,
Data_Saida             = :Data_Saida,
Data_Emissao           = :Data_Emissao,
Situacao               = :Situacao,
Cfop_Codigo            = :Cfop_Codigo,
Cfop_Descricao         = :Cfop_Descricao,
Cfop_Opcional          = :Cfop_Opcional,
Usuario_Codigo         = :Usuario_Codigo,
Usuario_Data           = :Usuario_Data,
StatusExclusao         = :StatusExclusao,
Empresa_RazaoSocial    = :Empresa_RazaoSocial,
Empresa_Cnpj           = :Empresa_Cnpj,
Empresa_Ie             = :Empresa_Ie,
Empresa_Endereco       = :Empresa_Endereco,
Empresa_Numero         = :Empresa_Numero,
Empresa_Bairro         = :Empresa_Bairro,
Empresa_Cidade         = :Empresa_Cidade,
Empresa_Cep            = :Empresa_Cep,
Empresa_Uf             = :Empresa_Uf,
Representante_Codigo   = :Representante_Codigo,
Representante_Comissao = :Representante_Comissao,
SUFRAMA       = :SUFRAMA,
CHAVE_ACESSO  = :CHAVE_ACESSO,
TIPO          = :TIPO,
XML           = :XML,
DANFE         = :DANFE,
PAGAMENTO     = :PAGAMENTO,
UF_EMBARQUE   = :UF_EMBARQUE,
LOCAL_EMBARQUE= :LOCAL_EMBARQUE,
RECIBO        = :RECIBO,
protocolo     = :protocolo,
protocolo_cancelamento = :protocolo_cancelamento,
motivo_cancelamento    = :motivo_cancelamento,
Modelo                 = :modelo,
ESPECIE                = :especie1,
Formulario_Inicial     = :formulario_inicial,
Formulario_Final       = :formulario_final,
Sped                   = :sped,
FISCAL_CFOP_CODIGO     = :FISCAL_CFOP_CODIGO,
Acumula_Item = :Acumula_Item,
Tipo_Doc = :Tipo_Doc,
Classificacao = :Classificacao,
Sped_PisCof = :Sped_PisCof 
Where Controle= :Controle;

UPDATE TbNfs_Totais SET
BaseCalculo_Icms       = :BaseCalculo_Icms,
BaseCalculo_Icms_Subst = :BaseCalculo_Icms_Subst,
Valor_Icms             = :Valor_Icms,
Valor_Icms_Subst       = :Valor_Icms_Subst,
Valor_Ipi              = :Valor_Ipi,
Valor_IssQn            = :Valor_IssQn,
Valor_Frete            = :Valor_Frete,
Valor_Seguro           = :Valor_Seguro,
Valor_Pis              = :Valor_Pis,
Valor_Cofins           = :Valor_Cofins,
Valor_Desconto         = :Valor_Desconto,
Valor_Parcelas         = :Valor_Parcelas,
Valor_Acrescimo        = :Valor_Acrescimo,
Valor_OutrosCustos     = :Valor_OutrosCustos,
Valor_Total_Produto    = :Valor_Total_Produto,
Valor_Total_Nf         = :Valor_Total_Nf,
Retencao_Valor_Pis     = :Retencao_Valor_Pis,
Retencao_Valor_Cofins  = :Retencao_Valor_Cofins,
Retencao_Valor_Inss    = :Retencao_Valor_Inss,
Retencao_Valor_IssQn   = :Retencao_Valor_IssQn,
Retencao_Valor_Irrf    = :Retencao_Valor_Irrf,
Valor_Csll             = :Valor_Csll,
Retencao_Valor_Csll    = :Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF = :RETENCAO_BASE_CALCULO_IRRF,
RETENCAO_BASE_CALCULO_INSS = :RETENCAO_BASE_CALCULO_INSS,
valor_contabil         = :VALOR_CONTABIL
WHERE NFS_CONTROLE     = :CONTROLE;

UPDATE TbNfs_Transportadora SET
Transportadora_Codigo  = :Transportadora_Codigo,
Frete                  = :Frete,
Volumes                = :Volumes,
Especie                = :Especie,
Peso_Bruto             = :Peso_Bruto,
Peso_Liquido           = :Peso_Liquido,
Marca                  = :Marca,
Numero                 = :Numero,
Placa                  = :Placa,
Placa_Uf               = :Placa_Uf
WHERE NFS_CONTROLE     = :CONTROLE;

UPDATE TbNfs_Observacao SET
Observacao01           = :Observacao01,
Observacao02           = :Observacao02,
Observacao03           = :Observacao03,
Observacao04           = :Observacao04,
Observacao05           = :Observacao05,
Observacao06           = :Observacao06,
Observacao07           = :Observacao07,
Observacao08           = :Observacao08,
Observacao09           = :Observacao09,
Observacao10           = :Observacao10,
Observacao11           = :Observacao11,
Observacao12           = :Observacao12,
Observacao13           = :Observacao13,
Observacao14           = :Observacao14,
Observacao15           = :Observacao15
WHERE NFS_CONTROLE = :CONTROLE;

  DELETE FROM TbNfs_Item         WHERE Nfs_Controle = :CONTROLE;
  DELETE FROM TbNfs_Item_Saldo   WHERE Nfs_Controle = :CONTROLE;
  DELETE FROM TbNfs_Parcelamento WHERE Nfs_Controle = :CONTROLE;
  DELETE FROM TbNfs_Referenciada Where Nfs_Controle = :CONTROLE;
  DELETE FROM TbNf_Lote
   Where Estabelecimento_Codigo = :Estabelecimento_Codigo
     and Nfs_Controle = :CONTROLE and Nfe_Controle =  0;
  DELETE FROM TbNf_Vinculo_Contabil
   Where Estabelecimento_Id = :Estabelecimento_Codigo
     and Nfs_Id = :CONTROLE and Nfe_Id =  0;

END;

CREATE OR ALTER procedure spi_nfs8 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    vencimento_dae_difal date,
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    modalidade char(1),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfs (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Saida,Data_Emissao,
hora_emissao,hora_saida,IND_FINAL,IND_PRESENCA,id_estrangeiro,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,
Usuario_Codigo,Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,Representante_Codigo,
Representante_Comissao,SUFRAMA,CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,
UF_EMBARQUE,LOCAL_EMBARQUE,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,FISCAL_CFOP_CODIGO,Acumula_Item, Oculta_Grade, Tipo_Doc,
Classificacao,Sped_PisCof) VALUES (

:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Saida,:Data_Emissao,
:hora_emissao,:hora_saida,:IND_FINAL,:IND_PRESENCA,:id_estrangeiro,
:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,
:Empresa_Numero,:Empresa_Bairro,:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:Representante_Codigo,
:Representante_Comissao,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:UF_EMBARQUE,:LOCAL_EMBARQUE,:protocolo_cancelamento,:motivo_cancelamento,
:Sped,:modelo,:especie1,:FISCAL_CFOP_CODIGO,
:Acumula_Item, :Oculta_Grade, :Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfs_Totais (
Nfs_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF,RETENCAO_BASE_CALCULO_INSS,VALOR_CONTABIL,VALOR_ESTORNO,VENCIMENTO_DAE_DIFAL) VALUES(

:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,
:RETENCAO_BASE_CALCULO_IRRF,:RETENCAO_BASE_CALCULO_INSS,:VALOR_CONTABIL,:VALOR_ESTORNO,:VENCIMENTO_DAE_DIFAL);

INSERT INTO TbNfs_Transportadora( 
Nfs_Controle,Transportadora_Codigo,Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Cubagem,Marca,Numero,Placa,Placa_Uf,modalidade) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Cubagem,:Marca,:Numero,:Placa,:Placa_Uf,:modalidade);

INSERT INTO TbNfs_Observacao( 
Nfs_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);
END;

CREATE OR ALTER procedure spi_nfs7 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    vencimento_dae_difal date,
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfs (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Saida,Data_Emissao,
hora_emissao,hora_saida,IND_FINAL,IND_PRESENCA,id_estrangeiro,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,
Usuario_Codigo,Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,Representante_Codigo,
Representante_Comissao,SUFRAMA,CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,
UF_EMBARQUE,LOCAL_EMBARQUE,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,FISCAL_CFOP_CODIGO,Acumula_Item, Oculta_Grade, Tipo_Doc,
Classificacao,Sped_PisCof) VALUES (

:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Saida,:Data_Emissao,
:hora_emissao,:hora_saida,:IND_FINAL,:IND_PRESENCA,:id_estrangeiro,
:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,
:Empresa_Numero,:Empresa_Bairro,:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:Representante_Codigo,
:Representante_Comissao,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:UF_EMBARQUE,:LOCAL_EMBARQUE,:protocolo_cancelamento,:motivo_cancelamento,
:Sped,:modelo,:especie1,:FISCAL_CFOP_CODIGO,
:Acumula_Item, :Oculta_Grade, :Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfs_Totais (
Nfs_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF,RETENCAO_BASE_CALCULO_INSS,VALOR_CONTABIL,VALOR_ESTORNO,VENCIMENTO_DAE_DIFAL) VALUES(

:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,
:RETENCAO_BASE_CALCULO_IRRF,:RETENCAO_BASE_CALCULO_INSS,:VALOR_CONTABIL,:VALOR_ESTORNO,:VENCIMENTO_DAE_DIFAL);

INSERT INTO TbNfs_Transportadora( 
Nfs_Controle,Transportadora_Codigo,Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Cubagem,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Cubagem,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfs_Observacao( 
Nfs_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);
END;

CREATE OR ALTER procedure spi_nfs6 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_estorno numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfs (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Saida,Data_Emissao,
hora_emissao,hora_saida,IND_FINAL,IND_PRESENCA,id_estrangeiro,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,
Usuario_Codigo,Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,Representante_Codigo,
Representante_Comissao,SUFRAMA,CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,
UF_EMBARQUE,LOCAL_EMBARQUE,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,FISCAL_CFOP_CODIGO,Acumula_Item, Oculta_Grade, Tipo_Doc,
Classificacao,Sped_PisCof) VALUES (

:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Saida,:Data_Emissao,
:hora_emissao,:hora_saida,:IND_FINAL,:IND_PRESENCA,:id_estrangeiro,
:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,
:Empresa_Numero,:Empresa_Bairro,:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:Representante_Codigo,
:Representante_Comissao,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:UF_EMBARQUE,:LOCAL_EMBARQUE,:protocolo_cancelamento,:motivo_cancelamento,
:Sped,:modelo,:especie1,:FISCAL_CFOP_CODIGO,
:Acumula_Item, :Oculta_Grade, :Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfs_Totais (
Nfs_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF,RETENCAO_BASE_CALCULO_INSS,VALOR_CONTABIL,VALOR_ESTORNO) VALUES(

:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,
:RETENCAO_BASE_CALCULO_IRRF,:RETENCAO_BASE_CALCULO_INSS,:VALOR_CONTABIL,:VALOR_ESTORNO);

INSERT INTO TbNfs_Transportadora( 
Nfs_Controle,Transportadora_Codigo,Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Cubagem,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Cubagem,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfs_Observacao( 
Nfs_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);
END;

CREATE OR ALTER procedure spi_nfs5 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_saida varchar(5),
    ind_final char(1),
    ind_presenca char(1),
    id_estrangeiro varchar(20),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfs (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Saida,Data_Emissao,
hora_emissao,hora_saida,IND_FINAL,IND_PRESENCA,id_estrangeiro,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,
Usuario_Codigo,Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,Representante_Codigo,
Representante_Comissao,SUFRAMA,CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,
UF_EMBARQUE,LOCAL_EMBARQUE,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,FISCAL_CFOP_CODIGO,Acumula_Item, Oculta_Grade, Tipo_Doc,
Classificacao,Sped_PisCof) VALUES (

:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Saida,:Data_Emissao,
:hora_emissao,:hora_saida,:IND_FINAL,:IND_PRESENCA,:id_estrangeiro,
:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,
:Empresa_Numero,:Empresa_Bairro,:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:Representante_Codigo,
:Representante_Comissao,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:UF_EMBARQUE,:LOCAL_EMBARQUE,:protocolo_cancelamento,:motivo_cancelamento,
:Sped,:modelo,:especie1,:FISCAL_CFOP_CODIGO,
:Acumula_Item, :Oculta_Grade, :Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfs_Totais (
Nfs_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF,RETENCAO_BASE_CALCULO_INSS,VALOR_CONTABIL) VALUES(

:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,
:RETENCAO_BASE_CALCULO_IRRF,:RETENCAO_BASE_CALCULO_INSS,:VALOR_CONTABIL);

INSERT INTO TbNfs_Transportadora( 
Nfs_Controle,Transportadora_Codigo,Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Cubagem,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Cubagem,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfs_Observacao( 
Nfs_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);
END;

CREATE OR ALTER procedure spi_nfs4 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_saida date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    representante_codigo integer,
    representante_comissao numeric(10,5),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    uf_embarque char(2),
    local_embarque varchar(60),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(30),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    cubagem numeric(10,4),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    acumula_item char(1),
    oculta_grade char(1),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfs (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Saida,Data_Emissao,Controle,Situacao,Cfop_Codigo,Cfop_Descricao,
Usuario_Codigo,Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,Representante_Codigo,
Representante_Comissao,SUFRAMA,CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,
UF_EMBARQUE,LOCAL_EMBARQUE,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,FISCAL_CFOP_CODIGO,
Acumula_Item, Oculta_Grade, Tipo_Doc, Classificacao,Sped_PisCof) VALUES (

:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Saida,:Data_Emissao,:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,
:Empresa_Numero,:Empresa_Bairro,:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:Representante_Codigo,
:Representante_Comissao,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:UF_EMBARQUE,:LOCAL_EMBARQUE,:protocolo_cancelamento,:motivo_cancelamento,
:Sped,:modelo,:especie1,:FISCAL_CFOP_CODIGO,
:Acumula_Item, :Oculta_Grade, :Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfs_Totais (
Nfs_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,
RETENCAO_BASE_CALCULO_IRRF,RETENCAO_BASE_CALCULO_INSS,VALOR_CONTABIL) VALUES(

:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,
:RETENCAO_BASE_CALCULO_IRRF,:RETENCAO_BASE_CALCULO_INSS,:VALOR_CONTABIL);

INSERT INTO TbNfs_Transportadora( 
Nfs_Controle,Transportadora_Codigo,Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Cubagem,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Cubagem,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfs_Observacao( 
Nfs_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);
END;

CREATE OR ALTER procedure spc_nfs_faturamento9 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    valor_frete numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

FOR Select
    Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Emissao Data, B.Numero_NotaFiscal, B.Empresa_Codigo,
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),
    Sum(A.Valor_Total) Valor_Total, Max(C.Valor_Desconto) Valor_Desconto,
    Max(C.Valor_Ipi+C.Valor_Acrescimo+C.Valor_Seguro+C.Valor_OutrosCustos+C.Valor_Icms_Subst) Valor_Acrescimo,
    Max(C.Valor_Frete) Valor_Frete,
    Sum(A.Quantidade) Quantidade, Max(0) Valor_Total_Dev, Max(0) Quant_Total_Dev,

    Max((Select First 1 Cast((lPad(P.Conta_Receber_Banco,3,0)||'|'||lPad(P.Conta_Receber_Cobranca,3,0)||'|'||lpad(P.Conta_Receber_Posicao,3,0)) as varchar(12))
    From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle)),
    Max((Select First 1 P.Remessa_Data From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle))

From TbNfs_Item A, TbNfs B, TbNfs_Totais C, TbOperacao D, TbRepresentante R

Where A.Nfs_Controle = B.Controle
and A.Nfs_Controle = C.Nfs_Controle
and A.Operacao_Codigo = D.Codigo
and B.Representante_Codigo = R.Codigo
and D.Controle_Faturamento = 1
and ((B.Situacao = 2) or (B.Situacao = 1 and B.Natureza = 2))

and (B.Estabelecimento_Codigo Between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
and (R.Supervisor_ID like :SUPERVISOR_1)
and (B.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
and (B.Data_Emissao BetWeen :DATA_1 and :DATA_2)
and (B.Numero_NotaFiscal BetWeen :NOTAFISCAL_1 and :NOTAFISCAL_2)
and (B.Empresa_uf like :UF_1)
and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Emissao, B.Numero_NotaFiscal,B.Empresa_Codigo

Union

Select Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Entrada Data, B.Numero_NotaFiscal, B.Empresa_Codigo,

    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),

    Max(0) Valor_Total, Max(0) Valor_Desconto, Max(0) Valor_Acrescimo, Max(0) Valor_Frete, Max(0) Quantidade,
    Sum(A.Valor_Total-A.Valor_Desconto+A.Valor_Acrescimo+A.Valor_Ipi+A.Valor_Icms_St) Valor_Total_Dev,
    Sum(A.Quantidade) Quant_Total_Dev, '', null

From TbNfe_Item A, TbNfe B, TbOperacao C, TbCliente CL, TbRepresentante R

Where A.Nfe_Controle = B.Controle
  and A.Operacao_Codigo = C.Codigo
  and C.Controle_Devolucao = 1 and B.Situacao < 3
  and B.Empresa_Codigo = CL.Codigo
  and CL.Representante_Codigo = R.Codigo
  and (B.Estabelecimento_Codigo between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
  and (R.Supervisor_ID like :SUPERVISOR_1)
  and (CL.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
  and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
  and (B.Data_Entrada BetWeen :DATA_1 and :DATA_2)
  and (B.empresa_uf Like :UF_1)
  and (B.serie Like :Serie_1)
  and (:DevSim = '1')
  and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Entrada, B.Numero_NotaFiscal,B.Empresa_Codigo
Order By 1,3,4

INTO   :ESTABELECIMENTO_CODIGO,
       :ESTABELECIMENTO_FANTASIA,
       :DATA,
       :NUMERO_NOTAFISCAL,
       :EMPRESA_CODIGO,
       :EMPRESA_NOMEFANTASIA,
       :EMPRESA_RAZAOSOCIAL,
       :VALOR_TOTAL,
       :VALOR_DESCONTO,
       :VALOR_ACRESCIMO,
       :VALOR_FRETE,
       :QUANTIDADE,
       :VALOR_TOTAL_DEV,
       :QUANT_TOTAL_DEV,
       :OBSERVACAO,
       :Data_Remessa
DO SUSPEND;
END;


CREATE OR ALTER procedure spc_nfs_faturamento8 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

FOR Select
    Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Emissao Data, B.Numero_NotaFiscal, B.Empresa_Codigo,
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),
    Sum(A.Valor_Total) Valor_Total, Max(C.Valor_Desconto) Valor_Desconto,
    Max(C.Valor_Ipi+C.Valor_Acrescimo+C.Valor_Frete+C.Valor_Seguro+C.Valor_OutrosCustos+C.Valor_Icms_Subst) Valor_Acrescimo,
    Sum(A.Quantidade) Quantidade, Max(0) Valor_Total_Dev, Max(0) Quant_Total_Dev,

    Max((Select First 1 Cast((lPad(P.Conta_Receber_Banco,3,0)||'|'||lPad(P.Conta_Receber_Cobranca,3,0)||'|'||lpad(P.Conta_Receber_Posicao,3,0)) as varchar(12))
    From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle)),
    Max((Select First 1 P.Remessa_Data From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle))

From TbNfs_Item A, TbNfs B, TbNfs_Totais C, TbOperacao D, TbRepresentante R

Where A.Nfs_Controle = B.Controle
and A.Nfs_Controle = C.Nfs_Controle
and A.Operacao_Codigo = D.Codigo
and B.Representante_Codigo = R.Codigo
and D.Controle_Faturamento = 1
and ((B.Situacao = 2) or (B.Situacao = 1 and B.Natureza = 2))

and (B.Estabelecimento_Codigo Between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
and (R.Supervisor_ID like :SUPERVISOR_1)
and (B.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
and (B.Data_Emissao BetWeen :DATA_1 and :DATA_2)
and (B.Numero_NotaFiscal BetWeen :NOTAFISCAL_1 and :NOTAFISCAL_2)
and (B.Empresa_uf like :UF_1)
and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Emissao, B.Numero_NotaFiscal,B.Empresa_Codigo

Union

Select Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Entrada Data, B.Numero_NotaFiscal, B.Empresa_Codigo,

    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),

    Max(0) Valor_Total, Max(0) Valor_Desconto, Max(0) Valor_Acrescimo, Max(0) Quantidade,
    Sum(A.Valor_Total-A.Valor_Desconto+A.Valor_Acrescimo+A.Valor_Ipi+A.Valor_Icms_St) Valor_Total_Dev,
    Sum(A.Quantidade) Quant_Total_Dev, '', null

From TbNfe_Item A, TbNfe B, TbOperacao C, TbCliente CL, TbRepresentante R

Where A.Nfe_Controle = B.Controle
  and A.Operacao_Codigo = C.Codigo
  and C.Controle_Devolucao = 1 and B.Situacao < 3
  and B.Empresa_Codigo = CL.Codigo
  and CL.Representante_Codigo = R.Codigo
  and (B.Estabelecimento_Codigo between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
  and (R.Supervisor_ID like :SUPERVISOR_1)
  and (CL.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
  and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
  and (B.Data_Entrada BetWeen :DATA_1 and :DATA_2)
  and (B.empresa_uf Like :UF_1)
  and (B.serie Like :Serie_1)
  and (:DevSim = '1')
  and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Entrada, B.Numero_NotaFiscal,B.Empresa_Codigo
Order By 1,3,4

INTO   :ESTABELECIMENTO_CODIGO,
       :ESTABELECIMENTO_FANTASIA,
       :DATA,
       :NUMERO_NOTAFISCAL,
       :EMPRESA_CODIGO,
       :EMPRESA_NOMEFANTASIA,
       :EMPRESA_RAZAOSOCIAL,
       :VALOR_TOTAL,
       :VALOR_DESCONTO,
       :VALOR_ACRESCIMO,
       :QUANTIDADE,
       :VALOR_TOTAL_DEV,
       :QUANT_TOTAL_DEV,
       :OBSERVACAO,
       :Data_Remessa
DO SUSPEND;
END;



ALTER TABLE TBNFE_PARCELAMENTO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBNFE_PARCELAMENTO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBNFE_PARCELAMENTO DROP CLASSIFICACAO;
ALTER TABLE TBNFE_PARCELAMENTO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBNFE_PARCELAMENTO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBNFE_PARCELAMENTO DROP OLD_PERFIL;CREATE OR ALTER procedure spc_nfs_faturamento8 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

end;

CREATE OR ALTER procedure spc_nfs_faturamento9 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    valor_frete numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

end;


CREATE OR ALTER procedure spi_nfe4 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;


CREATE OR ALTER procedure spi_nfe5 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN

end;


CREATE OR ALTER procedure spi_nfe6 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1),
    ind_final char(1))
as
BEGIN

end;

CREATE OR ALTER procedure spi_nfe7 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1),
    ind_final char(1),
    cmunini varchar(10),
    cmunfim varchar(10))
as
BEGIN

end;

CREATE OR ALTER trigger ttbnfe_b0u_01 for tbnfe
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin

end;

ALTER TABLE TBNFE ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBNFE set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBNFE DROP CLASSIFICACAO;
ALTER TABLE TBNFE ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBNFE set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBNFE DROP OLD_PERFIL;


CREATE OR ALTER trigger ttbnfe_b0u_01 for tbnfe
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin
  if (old.SALESFORCE = new.SALESFORCE) then
      Begin
        For
        Select  
        (Select First 1 A.DataInicial   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 3),
        (Select First 1 A.DataFINAL     From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 3),
        Coalesce((Select First 1 A.MODULO_CODIGO From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 3),0),
        
        extract(day from OLD.DATA_ENTRADA)||'/'||extract(month from OLD.DATA_ENTRADA)||'/'||extract(year from OLD.DATA_ENTRADA),
        extract(day from NEW.DATA_ENTRADA)||'/'||extract(month from NEW.DATA_ENTRADA)||'/'||extract(year from NEW.DATA_ENTRADA),
        (Select First 1 extract(day from A.DataInicial)||'/'||extract(month from A.DataInicial)||'/'||extract(year from A.DataInicial)
                        ||' A '||extract(day from A.DataFINAL)||'/'||extract(month from A.DataFINAL)||'/'||extract(year from A.DataFINAL)
           From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 3)
        
        FROM RDB$DATABASE
        
        Into :DataInicial,:DataFinal,:MODULO_CODIGO,:DATA1,:DATA2,:DATA3
        Do
        begin
          if (:MODULO_CODIGO = 0)      Then Exception "..." 'MODULO DE NFE[3] NAO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||OLD.ESTABELECIMENTO_CODIGO||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA_ENTRADA < :DATAINICIAL) Then Exception "..." 'MODULO DE NFE[3]. DATA '||:DATA1||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA_ENTRADA > :DATAFINAL)   Then Exception "..." 'MODULO DE NFE[3]. DATA '||:DATA1||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA_ENTRADA < :DATAINICIAL) Then Exception "..." 'MODULO DE NFE[3]. DATA '||:DATA2||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA_ENTRADA > :DATAFINAL)   Then Exception "..." 'MODULO DE NFE[3]. DATA '||:DATA2||' FORA DO PERIODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        end
     End
End;


CREATE OR ALTER procedure spi_nfe7 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(200),
    empresa_numero varchar(20),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1),
    ind_final char(1),
    cmunini varchar(10),
    cmunfim varchar(10))
as
BEGIN
INSERT INTO TbNfe (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Entrada,Data_Emissao,hora_emissao,hora_entrada,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,Usuario_Codigo,
Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,SUFRAMA,CHAVE_ACESSO,
TIPO,XML,DANFE,PAGAMENTO,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,DATA_FISCAL,FISCAL_CFOP_CODIGO,
Tipo_Doc,Classificacao,Sped_PisCof,IND_FINAL) VALUES (
:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Entrada,:Data_Emissao,:hora_emissao,:hora_entrada,:Controle,:Situacao,
:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,
:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,:Empresa_Numero,:Empresa_Bairro,
:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:protocolo_cancelamento,:motivo_cancelamento,
:sped,:modelo,:especie1,:DATA_FISCAL,
:FISCAL_CFOP_CODIGO,:Tipo_Doc,:Classificacao,:Sped_PisCof,:IND_FINAL);

INSERT INTO TbNfe_Totais (
Nfe_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,RETENCAO_BASE_CALCULO_IRRF,
RETENCAO_BASE_CALCULO_INSS,DI_BASE_CALCULO,DI_DESPESAS_ADUANEIRAS,DI_VALOR_II,
DI_VALOR_IOF,VALOR_CONTABIL,VALOR_PEDAGIO)
VALUES(
:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,:RETENCAO_BASE_CALCULO_IRRF,
:RETENCAO_BASE_CALCULO_INSS,:DI_BASE_CALCULO,:DI_DESPESAS_ADUANEIRAS,:DI_VALOR_II,
:DI_VALOR_IOF,:VALOR_CONTABIL,:VALOR_PEDAGIO);

INSERT INTO TbNfe_Transportadora(
Nfe_Controle,Transportadora_Codigo,Frete,Ind_Nat_Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Marca,Numero,Placa,Placa_Uf,CMUNINI,CMUNFIM
) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Ind_Nat_Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Marca,:Numero,:Placa,:Placa_Uf,:CMUNINI,:CMUNFIM
);

INSERT INTO TbNfe_Observacao(
Nfe_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);

END;

CREATE OR ALTER procedure spi_nfe6 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1),
    ind_final char(1))
as
BEGIN
INSERT INTO TbNfe (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Entrada,Data_Emissao,hora_emissao,hora_entrada,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,Usuario_Codigo,
Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,SUFRAMA,CHAVE_ACESSO,
TIPO,XML,DANFE,PAGAMENTO,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,DATA_FISCAL,FISCAL_CFOP_CODIGO,
Tipo_Doc,Classificacao,Sped_PisCof,IND_FINAL) VALUES (
:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Entrada,:Data_Emissao,:hora_emissao,:hora_entrada,:Controle,:Situacao,
:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,
:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,:Empresa_Numero,:Empresa_Bairro,
:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:protocolo_cancelamento,:motivo_cancelamento,
:sped,:modelo,:especie1,:DATA_FISCAL,
:FISCAL_CFOP_CODIGO,:Tipo_Doc,:Classificacao,:Sped_PisCof,:IND_FINAL);

INSERT INTO TbNfe_Totais (
Nfe_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,RETENCAO_BASE_CALCULO_IRRF,
RETENCAO_BASE_CALCULO_INSS,DI_BASE_CALCULO,DI_DESPESAS_ADUANEIRAS,DI_VALOR_II,
DI_VALOR_IOF,VALOR_CONTABIL,VALOR_PEDAGIO)
VALUES(
:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,:RETENCAO_BASE_CALCULO_IRRF,
:RETENCAO_BASE_CALCULO_INSS,:DI_BASE_CALCULO,:DI_DESPESAS_ADUANEIRAS,:DI_VALOR_II,
:DI_VALOR_IOF,:VALOR_CONTABIL,:VALOR_PEDAGIO);

INSERT INTO TbNfe_Transportadora(
Nfe_Controle,Transportadora_Codigo,Frete,Ind_Nat_Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Ind_Nat_Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfe_Observacao(
Nfe_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);

END;

CREATE OR ALTER procedure spi_nfe5 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    hora_emissao varchar(5),
    hora_entrada varchar(5),
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfe (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,
Data_Entrada,Data_Emissao,hora_emissao,hora_entrada,
Controle,Situacao,Cfop_Codigo,Cfop_Descricao,Usuario_Codigo,
Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,SUFRAMA,CHAVE_ACESSO,
TIPO,XML,DANFE,PAGAMENTO,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,DATA_FISCAL,FISCAL_CFOP_CODIGO,
Tipo_Doc,Classificacao,Sped_PisCof) VALUES (
:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Entrada,:Data_Emissao,:hora_emissao,:hora_entrada,:Controle,:Situacao,
:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,
:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,:Empresa_Numero,:Empresa_Bairro,
:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:protocolo_cancelamento,:motivo_cancelamento,
:sped,:modelo,:especie1,:DATA_FISCAL,
:FISCAL_CFOP_CODIGO,:Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfe_Totais (
Nfe_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,RETENCAO_BASE_CALCULO_IRRF,
RETENCAO_BASE_CALCULO_INSS,DI_BASE_CALCULO,DI_DESPESAS_ADUANEIRAS,DI_VALOR_II,
DI_VALOR_IOF,VALOR_CONTABIL,VALOR_PEDAGIO)
VALUES(
:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,:RETENCAO_BASE_CALCULO_IRRF,
:RETENCAO_BASE_CALCULO_INSS,:DI_BASE_CALCULO,:DI_DESPESAS_ADUANEIRAS,:DI_VALOR_II,
:DI_VALOR_IOF,:VALOR_CONTABIL,:VALOR_PEDAGIO);

INSERT INTO TbNfe_Transportadora(
Nfe_Controle,Transportadora_Codigo,Frete,Ind_Nat_Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Ind_Nat_Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfe_Observacao(
Nfe_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);

END;

CREATE OR ALTER procedure spi_nfe4 (
    estabelecimento_codigo integer,
    numero_notafiscal integer,
    serie varchar(3),
    empresa_codigo integer,
    natureza integer,
    data_entrada date,
    data_emissao date,
    controle integer,
    situacao integer,
    cfop_codigo varchar(5),
    cfop_descricao varchar(60),
    usuario_codigo integer,
    usuario_data date,
    empresa_razaosocial varchar(50),
    empresa_cnpj varchar(14),
    empresa_ie varchar(20),
    empresa_endereco varchar(50),
    empresa_numero varchar(5),
    empresa_bairro varchar(20),
    empresa_cidade varchar(40),
    empresa_cep varchar(8),
    empresa_uf varchar(2),
    suframa varchar(9),
    chave_acesso varchar(44),
    tipo char(1),
    classificacao char(1),
    xml char(2),
    danfe char(1),
    pagamento char(1),
    protocolo_cancelamento varchar(20),
    motivo_cancelamento varchar(50),
    sped char(1),
    modelo char(2),
    especie1 varchar(5),
    data_fiscal date,
    fiscal_cfop_codigo varchar(5),
    basecalculo_icms numeric(10,5),
    basecalculo_icms_subst numeric(10,5),
    valor_icms numeric(10,5),
    valor_icms_subst numeric(10,5),
    valor_ipi numeric(10,5),
    valor_issqn numeric(10,5),
    valor_frete numeric(10,5),
    valor_seguro numeric(10,5),
    valor_pis numeric(10,5),
    valor_cofins numeric(10,5),
    valor_csll numeric(10,5),
    retencao_base_calculo_irrf numeric(10,2),
    retencao_base_calculo_inss numeric(10,2),
    di_base_calculo numeric(10,2),
    di_despesas_aduaneiras numeric(10,2),
    di_valor_ii numeric(10,2),
    di_valor_iof numeric(10,2),
    valor_desconto numeric(10,5),
    valor_acrescimo numeric(10,5),
    valor_outroscustos numeric(10,5),
    valor_total_produto numeric(10,5),
    valor_total_nf numeric(10,5),
    retencao_valor_pis numeric(10,5),
    retencao_valor_cofins numeric(10,5),
    retencao_valor_inss numeric(10,5),
    retencao_valor_issqn numeric(10,5),
    retencao_valor_irrf numeric(10,5),
    retencao_valor_csll numeric(10,5),
    valor_parcelas numeric(10,5),
    valor_contabil numeric(10,2),
    valor_pedagio numeric(10,2),
    transportadora_codigo integer,
    frete integer,
    ind_nat_frete varchar(1),
    placa varchar(8),
    placa_uf varchar(2),
    volumes integer,
    especie varchar(10),
    marca varchar(10),
    peso_bruto numeric(10,5),
    peso_liquido numeric(10,5),
    numero varchar(10),
    observacao01 varchar(130),
    observacao02 varchar(130),
    observacao03 varchar(130),
    observacao04 varchar(130),
    observacao05 varchar(130),
    observacao06 varchar(130),
    observacao07 varchar(130),
    observacao08 varchar(130),
    observacao09 varchar(130),
    observacao10 varchar(130),
    observacao11 varchar(130),
    observacao12 varchar(130),
    observacao13 varchar(130),
    observacao14 varchar(130),
    observacao15 varchar(130),
    tipo_doc char(1),
    sped_piscof char(1))
as
BEGIN
INSERT INTO TbNfe (
Estabelecimento_Codigo,Numero_NotaFiscal,Serie,Empresa_Codigo,Natureza,Data_Entrada,
Data_Emissao,Controle,Situacao,Cfop_Codigo,Cfop_Descricao,Usuario_Codigo,
Usuario_Data,Empresa_RazaoSocial,Empresa_Cnpj,Empresa_Ie,Empresa_Endereco,
Empresa_Numero,Empresa_Bairro,Empresa_Cidade,Empresa_Cep,Empresa_Uf,SUFRAMA,CHAVE_ACESSO,
TIPO,XML,DANFE,PAGAMENTO,protocolo_cancelamento,motivo_cancelamento,
sped,modelo,especie,DATA_FISCAL,FISCAL_CFOP_CODIGO,
Tipo_Doc,Classificacao,Sped_PisCof) VALUES (
:Estabelecimento_Codigo,:Numero_NotaFiscal,:Serie,:Empresa_Codigo,:Natureza,
:Data_Entrada,:Data_Emissao,:Controle,:Situacao,:Cfop_Codigo,:Cfop_Descricao,
:Usuario_Codigo,:Usuario_Data,:Empresa_RazaoSocial,
:Empresa_Cnpj,:Empresa_Ie,:Empresa_Endereco,:Empresa_Numero,:Empresa_Bairro,
:Empresa_Cidade,:Empresa_Cep,:Empresa_Uf,:SUFRAMA,:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,
:protocolo_cancelamento,:motivo_cancelamento,
:sped,:modelo,:especie1,:DATA_FISCAL,
:FISCAL_CFOP_CODIGO,:Tipo_Doc,:Classificacao,:Sped_PisCof);

INSERT INTO TbNfe_Totais (
Nfe_Controle,BaseCalculo_Icms,BaseCalculo_Icms_Subst,Valor_Icms,Valor_Icms_Subst,
Valor_Ipi,Valor_IssQn,Valor_Frete,Valor_Seguro,Valor_Pis,Valor_Cofins,Valor_Desconto,
Valor_Parcelas,Valor_Acrescimo,Valor_OutrosCustos,Valor_Total_Produto,Valor_Total_Nf,
Retencao_Valor_Pis,Retencao_Valor_Cofins,Retencao_Valor_Inss,Retencao_Valor_IssQn,
Retencao_Valor_Irrf,Valor_Csll,Retencao_Valor_Csll,RETENCAO_BASE_CALCULO_IRRF,
RETENCAO_BASE_CALCULO_INSS,DI_BASE_CALCULO,DI_DESPESAS_ADUANEIRAS,DI_VALOR_II,
DI_VALOR_IOF,VALOR_CONTABIL,VALOR_PEDAGIO)
VALUES(
:Controle,:BaseCalculo_Icms,:BaseCalculo_Icms_Subst,:Valor_Icms,:Valor_Icms_Subst,
:Valor_Ipi,:Valor_IssQn,:Valor_Frete,:Valor_Seguro,:Valor_Pis,:Valor_Cofins,:Valor_Desconto,
:Valor_Parcelas,:Valor_Acrescimo,:Valor_OutrosCustos,:Valor_Total_Produto,:Valor_Total_Nf,
:Retencao_Valor_Pis,:Retencao_Valor_Cofins,:Retencao_Valor_Inss,:Retencao_Valor_IssQn,
:Retencao_Valor_Irrf,:Valor_Csll,:Retencao_Valor_Csll,:RETENCAO_BASE_CALCULO_IRRF,
:RETENCAO_BASE_CALCULO_INSS,:DI_BASE_CALCULO,:DI_DESPESAS_ADUANEIRAS,:DI_VALOR_II,
:DI_VALOR_IOF,:VALOR_CONTABIL,:VALOR_PEDAGIO);

INSERT INTO TbNfe_Transportadora(
Nfe_Controle,Transportadora_Codigo,Frete,Ind_Nat_Frete,Volumes,Especie,
Peso_Bruto,Peso_Liquido,Marca,Numero,Placa,Placa_Uf) VALUES(
:Controle,:Transportadora_Codigo,:Frete,:Ind_Nat_Frete,:Volumes,:Especie,
:Peso_Bruto,:Peso_Liquido,:Marca,:Numero,:Placa,:Placa_Uf);

INSERT INTO TbNfe_Observacao(
Nfe_Controle,Observacao01,Observacao02,Observacao03,Observacao04,Observacao05,
Observacao06,Observacao07,Observacao08,Observacao09,Observacao10,Observacao11,
Observacao12,Observacao13,Observacao14,Observacao15) VALUES  ( 
:Controle,:Observacao01,:Observacao02,:Observacao03,:Observacao04,:Observacao05,
:Observacao06,:Observacao07,:Observacao08,:Observacao09,:Observacao10,:Observacao11,
:Observacao12,:Observacao13,:Observacao14,:Observacao15);

END;



CREATE OR ALTER procedure spc_nfs_faturamento9 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    valor_frete numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

FOR Select
    Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Emissao Data, B.Numero_NotaFiscal, B.Empresa_Codigo,
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),
    Sum(A.Valor_Total) Valor_Total, Max(C.Valor_Desconto) Valor_Desconto,
    Max(C.Valor_Ipi+C.Valor_Acrescimo+C.Valor_Seguro+C.Valor_OutrosCustos+C.Valor_Icms_Subst) Valor_Acrescimo,
    Max(C.Valor_Frete) Valor_Frete,
    Sum(A.Quantidade) Quantidade, Max(0) Valor_Total_Dev, Max(0) Quant_Total_Dev,

    Max((Select First 1 Cast((lPad(P.Conta_Receber_Banco,3,0)||'|'||lPad(P.Conta_Receber_Cobranca,3,0)||'|'||lpad(P.Conta_Receber_Posicao,3,0)) as varchar(12))
    From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle)),
    Max((Select First 1 P.Remessa_Data From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle))

From TbNfs_Item A, TbNfs B, TbNfs_Totais C, TbOperacao D, TbRepresentante R

Where A.Nfs_Controle = B.Controle
and A.Nfs_Controle = C.Nfs_Controle
and A.Operacao_Codigo = D.Codigo
and B.Representante_Codigo = R.Codigo
and D.Controle_Faturamento = 1
and ((B.Situacao = 2) or (B.Situacao = 1 and B.Natureza = 2))

and (B.Estabelecimento_Codigo Between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
and (R.Supervisor_ID like :SUPERVISOR_1)
and (B.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
and (B.Data_Emissao BetWeen :DATA_1 and :DATA_2)
and (B.Numero_NotaFiscal BetWeen :NOTAFISCAL_1 and :NOTAFISCAL_2)
and (B.Empresa_uf like :UF_1)
and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Emissao, B.Numero_NotaFiscal,B.Empresa_Codigo

Union

Select Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Entrada Data, B.Numero_NotaFiscal, B.Empresa_Codigo,

    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),

    Max(0) Valor_Total, Max(0) Valor_Desconto, Max(0) Valor_Acrescimo, Max(0) Valor_Frete, Max(0) Quantidade,
    Sum(A.Valor_Total-A.Valor_Desconto+A.Valor_Acrescimo+A.Valor_Ipi+A.Valor_Icms_St) Valor_Total_Dev,
    Sum(A.Quantidade) Quant_Total_Dev, '', null

From TbNfe_Item A, TbNfe B, TbOperacao C, TbCliente CL, TbRepresentante R

Where A.Nfe_Controle = B.Controle
  and A.Operacao_Codigo = C.Codigo
  and C.Controle_Devolucao = 1 and B.Situacao < 3
  and B.Empresa_Codigo = CL.Codigo
  and CL.Representante_Codigo = R.Codigo
  and (B.Estabelecimento_Codigo between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
  and (R.Supervisor_ID like :SUPERVISOR_1)
  and (CL.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
  and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
  and (B.Data_Entrada BetWeen :DATA_1 and :DATA_2)
  and (B.empresa_uf Like :UF_1)
  and (B.serie Like :Serie_1)
  and (:DevSim = '1')
  and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Entrada, B.Numero_NotaFiscal,B.Empresa_Codigo
Order By 1,3,4

INTO   :ESTABELECIMENTO_CODIGO,
       :ESTABELECIMENTO_FANTASIA,
       :DATA,
       :NUMERO_NOTAFISCAL,
       :EMPRESA_CODIGO,
       :EMPRESA_NOMEFANTASIA,
       :EMPRESA_RAZAOSOCIAL,
       :VALOR_TOTAL,
       :VALOR_DESCONTO,
       :VALOR_ACRESCIMO,
       :VALOR_FRETE,
       :QUANTIDADE,
       :VALOR_TOTAL_DEV,
       :QUANT_TOTAL_DEV,
       :OBSERVACAO,
       :Data_Remessa
DO SUSPEND;
END;



CREATE OR ALTER procedure spc_nfs_faturamento8 (
    estabelecimento_1 integer,
    estabelecimento_2 integer,
    supervisor_1 varchar(10),
    representante_1 integer,
    representante_2 integer,
    empresa_1 integer,
    empresa_2 integer,
    data_1 date,
    data_2 date,
    notafiscal_1 integer,
    notafiscal_2 integer,
    uf_1 varchar(2),
    serie_1 varchar(3),
    devsim char(1),
    classificacao_1 char(1))
returns (
    estabelecimento_codigo integer,
    estabelecimento_fantasia varchar(50),
    data date,
    numero_notafiscal integer,
    empresa_codigo integer,
    empresa_nomefantasia varchar(23),
    empresa_razaosocial varchar(60),
    valor_total numeric(10,2),
    valor_desconto numeric(10,2),
    valor_acrescimo numeric(10,2),
    quantidade numeric(10,4),
    valor_total_dev numeric(10,2),
    quant_total_dev numeric(10,4),
    observacao varchar(15),
    data_remessa date)
as
BEGIN

FOR Select
    Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Emissao Data, B.Numero_NotaFiscal, B.Empresa_Codigo,
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),
    Sum(A.Valor_Total) Valor_Total, Max(C.Valor_Desconto) Valor_Desconto,
    Max(C.Valor_Ipi+C.Valor_Acrescimo+C.Valor_Frete+C.Valor_Seguro+C.Valor_OutrosCustos+C.Valor_Icms_Subst) Valor_Acrescimo,
    Sum(A.Quantidade) Quantidade, Max(0) Valor_Total_Dev, Max(0) Quant_Total_Dev,

    Max((Select First 1 Cast((lPad(P.Conta_Receber_Banco,3,0)||'|'||lPad(P.Conta_Receber_Cobranca,3,0)||'|'||lpad(P.Conta_Receber_Posicao,3,0)) as varchar(12))
    From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle)),
    Max((Select First 1 P.Remessa_Data From TbNfs_Parcelamento P Where P.Nfs_Controle = B.Controle))

From TbNfs_Item A, TbNfs B, TbNfs_Totais C, TbOperacao D, TbRepresentante R

Where A.Nfs_Controle = B.Controle
and A.Nfs_Controle = C.Nfs_Controle
and A.Operacao_Codigo = D.Codigo
and B.Representante_Codigo = R.Codigo
and D.Controle_Faturamento = 1
and ((B.Situacao = 2) or (B.Situacao = 1 and B.Natureza = 2))

and (B.Estabelecimento_Codigo Between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
and (R.Supervisor_ID like :SUPERVISOR_1)
and (B.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
and (B.Data_Emissao BetWeen :DATA_1 and :DATA_2)
and (B.Numero_NotaFiscal BetWeen :NOTAFISCAL_1 and :NOTAFISCAL_2)
and (B.Empresa_uf like :UF_1)
and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Emissao, B.Numero_NotaFiscal,B.Empresa_Codigo

Union

Select Distinct(B.Estabelecimento_Codigo),
    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbestabelecimento E Where B.Estabelecimento_Codigo = E.Codigo)),
    B.Data_Entrada Data, B.Numero_NotaFiscal, B.Empresa_Codigo,

    Max((Select First 1 E.NomeFantasia||'/'||E.UF From tbempresa E Where B.Empresa_Codigo = E.Codigo)),
    Max(B.Empresa_RazaoSocial||'/'||B.Empresa_UF),

    Max(0) Valor_Total, Max(0) Valor_Desconto, Max(0) Valor_Acrescimo, Max(0) Quantidade,
    Sum(A.Valor_Total-A.Valor_Desconto+A.Valor_Acrescimo+A.Valor_Ipi+A.Valor_Icms_St) Valor_Total_Dev,
    Sum(A.Quantidade) Quant_Total_Dev, '', null

From TbNfe_Item A, TbNfe B, TbOperacao C, TbCliente CL, TbRepresentante R

Where A.Nfe_Controle = B.Controle
  and A.Operacao_Codigo = C.Codigo
  and C.Controle_Devolucao = 1 and B.Situacao < 3
  and B.Empresa_Codigo = CL.Codigo
  and CL.Representante_Codigo = R.Codigo
  and (B.Estabelecimento_Codigo between :ESTABELECIMENTO_1 and :ESTABELECIMENTO_2)
  and (R.Supervisor_ID like :SUPERVISOR_1)
  and (CL.Representante_Codigo between :REPRESENTANTE_1 and :REPRESENTANTE_2)
  and (B.Empresa_Codigo between :EMPRESA_1 and :EMPRESA_2)
  and (B.Data_Entrada BetWeen :DATA_1 and :DATA_2)
  and (B.empresa_uf Like :UF_1)
  and (B.serie Like :Serie_1)
  and (:DevSim = '1')
  and (B.Classificacao Like :Classificacao_1)

Group By B.Estabelecimento_Codigo, B.Data_Entrada, B.Numero_NotaFiscal,B.Empresa_Codigo
Order By 1,3,4

INTO   :ESTABELECIMENTO_CODIGO,
       :ESTABELECIMENTO_FANTASIA,
       :DATA,
       :NUMERO_NOTAFISCAL,
       :EMPRESA_CODIGO,
       :EMPRESA_NOMEFANTASIA,
       :EMPRESA_RAZAOSOCIAL,
       :VALOR_TOTAL,
       :VALOR_DESCONTO,
       :VALOR_ACRESCIMO,
       :QUANTIDADE,
       :VALOR_TOTAL_DEV,
       :QUANT_TOTAL_DEV,
       :OBSERVACAO,
       :Data_Remessa
DO SUSPEND;
END;



ALTER TABLE TBMODELO_PERFIL ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_PERFIL set OLD_PERFIL = PERFIL;
ALTER TABLE TBMODELO_PERFIL DROP PERFIL;
ALTER TABLE TBMODELO_PERFIL ADD PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_PERFIL set PERFIL = OLD_PERFIL;
ALTER TABLE TBMODELO_PERFIL DROP OLD_PERFIL;
ALTER TABLE TBMODELO_LINHA ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_LINHA set OLD_PERFIL = PERFIL;
ALTER TABLE TBMODELO_LINHA DROP PERFIL;
ALTER TABLE TBMODELO_LINHA ADD PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_LINHA set PERFIL = OLD_PERFIL;
ALTER TABLE TBMODELO_LINHA DROP OLD_PERFIL;

ALTER TABLE TBMODELO_LINHA ADD OLD_PERFIL_PEDIDO VARCHAR(10) DEFAULT '';
update TBMODELO_LINHA set OLD_PERFIL_PEDIDO = PERFIL_PEDIDO;
ALTER TABLE TBMODELO_LINHA DROP PERFIL_PEDIDO;
ALTER TABLE TBMODELO_LINHA ADD PERFIL_PEDIDO VARCHAR(10) DEFAULT '';
update TBMODELO_LINHA set PERFIL_PEDIDO = OLD_PERFIL_PEDIDO;
ALTER TABLE TBMODELO_LINHA DROP OLD_PERFIL_PEDIDO;
CREATE OR ALTER trigger ttbremessa_item_processado_b2i for tbremessa_item_processado
active before insert or update position 2
AS
declare variable LINHA_ID INTEGER;
declare variable COLECAO INTEGER;
declare variable DENSIDADE NUMERIC(15,4);
declare variable ESPESSURA NUMERIC(15,4);
declare variable MATRIZ_ID INTEGER;
declare variable REMESSA_WEB VARCHAR(10);
begin

END;

CREATE OR ALTER trigger ttbsobra_b2u for tbsobra
active before update position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbsobra_b1i for tbsobra
active before insert position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbrequisicao_b1i_01 for tbrequisicao
active before insert position 1
AS
declare variable vData Date;
Begin

END;

CREATE OR ALTER trigger ttbremessa_item_processado_b1i for tbremessa_item_processado
active before insert position 1
AS
begin

END;

CREATE OR ALTER trigger ttbpedido_item_proc_b1i_02 for tbpedido_item_processado
active before insert position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbpedido_item_b0u_02 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

END;

CREATE OR ALTER trigger ttbpedido_item_b0i_02 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9u_09 for tbmodelo_bloqueio
active before update position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

END;


CREATE OR ALTER trigger ttbmodelo_bloqueio_b9i_09 for tbmodelo_bloqueio
active before insert position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0u_02 for tbmodelo_bloqueio
active before update position 0
AS
BEGIN

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0d_01 for tbmodelo_bloqueio
active before delete position 0
AS
begin

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

END;

CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil char(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

END;

CREATE OR ALTER function fn_sku_bloqueado (
    modelo_id integer,
    cor_id integer)
returns integer
as
declare variable ret integer;
begin
  RET = 0;

  return RET;
end;

CREATE OR ALTER procedure spu_sobra_bojo (
    i_id integer,
    estabelecimento_id integer,
    gp_id integer,
    remessa_id integer,
    produto_id integer,
    tamanho integer,
    quantidade numeric(15,4),
    operador_id integer,
    data date = null,
    hora varchar(5) = null)
returns (
    id integer,
    enderecamento varchar(100))
as
declare variable familia_id integer;
declare variable enderecamento_id integer;
declare variable localizacao_id integer;
declare variable grupo varchar(10);
declare variable subgrupo varchar(10);
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable perfil_enderecamento_sobra varchar(12);
declare variable enderecamento_localizacao_id integer;
BEGIN

END;

CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(4);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe char(4);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe char(4);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente char(4);
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

END;

CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(1),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

END;



CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

END;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

END;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

END;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

END;

DROP INDEX ITBMODELO_BLOQUEIO_003;
DROP INDEX ITBMODELO_BLOQUEIO_005;
DROP VIEW VWSKU;

ALTER TABLE TBMODELO_BLOQUEIO ADD OLD_PERFIL VARCHAR(10);
update TBMODELO_BLOQUEIO set OLD_PERFIL = PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO DROP PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO ADD PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_BLOQUEIO set PERFIL = OLD_PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO DROP OLD_PERFIL;

CREATE INDEX ITBMODELO_BLOQUEIO_003 ON TBMODELO_BLOQUEIO (PERFIL);
CREATE INDEX ITBMODELO_BLOQUEIO_005 ON TBMODELO_BLOQUEIO (MODELO_ID,COR_ID,TAMANHO,PERFIL,QTD_MULT);

CREATE OR ALTER VIEW VWSKU(
    MODELO_ID,
    COR_ID,
    TAMANHO,
    PERFIL,
    BLQ_PED,
    QTD_MIN,
    QTD_MULT,
    TEMPO_MAQUINA,
    SALESFORCE)
AS
SELECT B.MODELO_ID,
       B.COR_ID,
       B.TAMANHO,
       B.PERFIL,
       B.BLQ_PED,
       B.QTD_MIN,
       B.QTD_MULT,
       B.TEMPO_MAQUINA,
       B.SALESFORCE
  FROM TBMODELO_BLOQUEIO B
;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);


        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        O.familia_codigo,
        O.modelo_codigo,
        O.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_ID,
                    :modelo_ID,
                    :cor_ID
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;


CREATE OR ALTER trigger ttbremessa_item_processado_b2i for tbremessa_item_processado
active before insert or update position 2
AS
declare variable LINHA_ID INTEGER;
declare variable COLECAO INTEGER;
declare variable DENSIDADE NUMERIC(15,4);
declare variable ESPESSURA NUMERIC(15,4);
declare variable MATRIZ_ID INTEGER;
declare variable REMESSA_WEB VARCHAR(10);
begin


    IF ( INSERTING OR (OLD.REPROCESSAR = 0 AND NEW.REPROCESSAR = 1) ) THEN
    BEGIN


        NEW.REPROCESSAR = 0;

        
        LINHA_ID = COALESCE((
        SELECT FIRST 1 LINHA_CODIGO
          FROM TBMODELO M
         WHERE M.CODIGO = NEW.MODELO_CODIGO),0);
    
            /*
        REMESSA_WEB = COALESCE((
            SELECT FIRST 1 R.WEB
              FROM VWREMESSA R
             WHERE R.REMESSA_ID = NEW.REMESSA
        ),0); */
    
        IF ( LINHA_ID > 0 AND COALESCE(NEW.TALAO_VINCULO,0) = 0 /*AND REMESSA_WEB = '1'*/ ) THEN
        BEGIN

            IF ( COALESCE(NEW.PERFIL,'') = '' ) THEN
            BEGIN
                NEW.PERFIL = (SELECT FIRST 1 S.PERFIL
                                FROM TBPRODUTO P,
                                     VWSKU S
                               WHERE P.CODIGO = NEW.PRODUTO_CODIGO
                                 AND S.MODELO_ID = P.MODELO_CODIGO
                                 AND S.COR_ID = P.COR_CODIGO
                                 AND S.TAMANHO = NEW.TAMANHO);
            END


            COLECAO = FN_PARAMETRO('TBPERFIL.TALAO_QUANTIDADE',(SELECT FIRST 1 P.CONTROLE FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = NEW.PERFIL));

            IF ( COLECAO > 1 ) THEN
            BEGIN
            
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o PRIMEIRO talão da PRIMEIRA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    Z.CONSUMO_DENSIDADE DENSIDADE,
                    Z.CONSUMO_ESPESSURA ESPESSURA,
                    Z.CONSUMO_MATRIZ_ID MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
                NEW.TALAO_VINCULO = NEW.ID;
                NEW.DENSIDADE     = :DENSIDADE;
                NEW.ESPESSURA     = :ESPESSURA;
                NEW.MATRIZ_CODIGO = :MATRIZ_ID;
            END
    
            IF ( COLECAO = 3 ) THEN
            BEGIN
    
                      
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 3 talões para o edc (ex.aumentax),
                   sendo o terceiro talão é a espuma que ficará no meio das 2 mantas, formando um "sanduiche",
                   essa rotina irah selecionar a dens./espessura dessa espuma do meio, o qual está informada
                   na ficha 2 da ficha tecnica */

                SELECT FIRST 1
                    Z.CONSUMO_DENSIDADE,
                    Z.CONSUMO_ESPESSURA,
                    Z.CONSUMO_MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.TIPO                   = '2'
                AND Z.HABILITA_GERAR_CONSUMO = '1'
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
    
    
                IF ( COALESCE(MATRIZ_ID,0) = 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'REM.: ' || COALESCE(NEW.REMESSA,'') || ' MODELO: ' || COALESCE(NEW.MODELO_CODIGO,0) || ' - ' || COALESCE(FN_DESCRICAO('TBMODELO',NEW.MODELO_CODIGO),'') || ' Tam. ' || COALESCE(FN_TAMANHO_PRODUTO(NEW.PRODUTO_CODIGO,NEW.TAMANHO),'') || ' DA COLECAO AUMENTAX, NAO POSSUI PRODUTO HABILITADO PARA GERAR CONSUMO COM MATRIZ NA FICHA GERAL DE CONSUMO.';
                END
    
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    6||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA,
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
    
    
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o SEGUNDO talão da SEGUNDA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    COALESCE(LEAD(Z.CONSUMO_DENSIDADE) OVER(),Z.CONSUMO_DENSIDADE) DENSIDADE,
                    COALESCE(LEAD(Z.CONSUMO_ESPESSURA) OVER(),Z.CONSUMO_ESPESSURA) ESPESSURA,
                    COALESCE(LEAD(Z.CONSUMO_MATRIZ_ID) OVER(),Z.CONSUMO_MATRIZ_ID) MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID 
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,  
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    7||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA,  
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
            END
            ELSE
            IF ( COLECAO = 2 ) THEN
            BEGIN
                     
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o SEGUNDO talão da SEGUNDA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    COALESCE(LEAD(Z.CONSUMO_DENSIDADE) OVER(),Z.CONSUMO_DENSIDADE) DENSIDADE,
                    COALESCE(LEAD(Z.CONSUMO_ESPESSURA) OVER(),Z.CONSUMO_ESPESSURA) ESPESSURA,
                    COALESCE(LEAD(Z.CONSUMO_MATRIZ_ID) OVER(),Z.CONSUMO_MATRIZ_ID) MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'     
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,   
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    7||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA, 
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
            END
    
    
        END
    END

end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);

    :OLD_ANO = :IANO;
    :OLD_MES = :IMES;

        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,0,0,0
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO_V2(:OLD_ANO,:OLD_MES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_id,
                    :modelo_id,
                    :cor_id
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

--in autonomous transaction do
--if(true)then
--begin
    delete from tmpcusto_produto;

    iproduto_troca      = '';
    modelo_original     = imodelo_id;
    tamanho_original    = itamanho;
    meses               = 1;
    validar_ficha       = 0;
    tipo_custo          = 1;
    taxa_dolar          = 0;

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        o.familia_codigo,
        o.modelo_codigo,
        o.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID
        from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin

            if(:FILHOS > 0)then
            begin

                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO;

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :FAMILIA_ID,
                    :MODELO_ID,
                    :COR_ID
                do begin

                       --/*
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);
                      --*/


                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;

                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                h.custo  = h.custo_medio,
                h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                */

                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;

        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
        --and k.nivel = -1
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :FAMILIA_ID,
        :MODELO_ID,
        :COR_ID
    do begin

        for
            select first 1
                c.fator_setup
            from tbregra_calculo_custo c, tbproduto p
            where c.familia_id = p.familia_codigo
            and p.codigo = :PRODUTO_CONSUMO
        into
            :fator_setup
        do begin

            :CMS     = :CMS     / :quantidade;
            :CSMOIP  = :CSMOIP  / :quantidade;
            :CSMOIA  = :CSMOIA  / :quantidade;

            :CS      = :CS      / :fator_setup;
            :CSIP    = :CSIP    / :fator_setup;
            :CSIA    = :CSIA    / :fator_setup;

        end

        suspend;
  end
  --end

  --suspend;
end;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

  :INIVEL = :INIVEL + 1;

  for
  select * from(
        select distinct
            p.descricao,
            f.produto_consumo_id,
            :IPRODUTO_ID as PRODUTO_ID,
            f.tamanho_consumo_id,
    
            f.fator_conversao,
            f.custo_medio,
            0 as dolar,
    
            iif(:ITAMANHO = 00,T00, iif(:ITAMANHO = 10,T10,
            iif(:ITAMANHO = 01,T01, iif(:ITAMANHO = 11,T11,
            iif(:ITAMANHO = 02,T02, iif(:ITAMANHO = 12,T12,
            iif(:ITAMANHO = 03,T03, iif(:ITAMANHO = 13,T13,
            iif(:ITAMANHO = 04,T04, iif(:ITAMANHO = 14,T14,
            iif(:ITAMANHO = 05,T05, iif(:ITAMANHO = 15,T15,
            iif(:ITAMANHO = 06,T06, iif(:ITAMANHO = 16,T16,
            iif(:ITAMANHO = 07,T07, iif(:ITAMANHO = 17,T17,
            iif(:ITAMANHO = 08,T08, iif(:ITAMANHO = 18,T18,
            iif(:ITAMANHO = 09,T09, iif(:ITAMANHO = 19,T19,
            iif(:ITAMANHO = 20,T20,0))))))))))))))))))))) as T,
    
            iif(:ITAMANHO = 00,C00, iif(:ITAMANHO = 10,C10,
            iif(:ITAMANHO = 01,C01, iif(:ITAMANHO = 11,C11,
            iif(:ITAMANHO = 02,C02, iif(:ITAMANHO = 12,C12,
            iif(:ITAMANHO = 03,C03, iif(:ITAMANHO = 13,C13,
            iif(:ITAMANHO = 04,C04, iif(:ITAMANHO = 14,C14,
            iif(:ITAMANHO = 05,C05, iif(:ITAMANHO = 15,C15,
            iif(:ITAMANHO = 06,C06, iif(:ITAMANHO = 16,C16,
            iif(:ITAMANHO = 07,C07, iif(:ITAMANHO = 17,C17,
            iif(:ITAMANHO = 08,C08, iif(:ITAMANHO = 18,C18,
            iif(:ITAMANHO = 09,C09, iif(:ITAMANHO = 19,C19,
            iif(:ITAMANHO = 20,C20,0))))))))))))))))))))) as C,
    
            iif(:ITAMANHO = 00,CS00, iif(:ITAMANHO = 10,CS10,
            iif(:ITAMANHO = 01,CS01, iif(:ITAMANHO = 11,CS11,
            iif(:ITAMANHO = 02,CS02, iif(:ITAMANHO = 12,CS12,
            iif(:ITAMANHO = 03,CS03, iif(:ITAMANHO = 13,CS13,
            iif(:ITAMANHO = 04,CS04, iif(:ITAMANHO = 14,CS14,
            iif(:ITAMANHO = 05,CS05, iif(:ITAMANHO = 15,CS15,
            iif(:ITAMANHO = 06,CS06, iif(:ITAMANHO = 16,CS16,
            iif(:ITAMANHO = 07,CS07, iif(:ITAMANHO = 17,CS17,
            iif(:ITAMANHO = 08,CS08, iif(:ITAMANHO = 18,CS18,
            iif(:ITAMANHO = 09,CS09, iif(:ITAMANHO = 19,CS19,
            iif(:ITAMANHO = 20,CS20,0))))))))))))))))))))) as CS,
    
            iif(:ITAMANHO = 00,CO00, iif(:ITAMANHO = 10,CO10,
            iif(:ITAMANHO = 01,CO01, iif(:ITAMANHO = 11,CO11,
            iif(:ITAMANHO = 02,CO02, iif(:ITAMANHO = 12,CO12,
            iif(:ITAMANHO = 03,CO03, iif(:ITAMANHO = 13,CO13,
            iif(:ITAMANHO = 04,CO04, iif(:ITAMANHO = 14,CO14,
            iif(:ITAMANHO = 05,CO05, iif(:ITAMANHO = 15,CO15,
            iif(:ITAMANHO = 06,CO06, iif(:ITAMANHO = 16,CO16,
            iif(:ITAMANHO = 07,CO07, iif(:ITAMANHO = 17,CO17,
            iif(:ITAMANHO = 08,CO08, iif(:ITAMANHO = 18,CO18,
            iif(:ITAMANHO = 09,CO09, iif(:ITAMANHO = 19,CO19,
            iif(:ITAMANHO = 20,CO20,0))))))))))))))))))))) as CO,

            0 TS,
            0 "TO",
            0 CMS,
            0 CMO,
            0 CMOIP,
            0 CMOIA,
            0 CSMOIP,
            0 CSMOIA,
            0 PERDA,
            P.familia_codigo,
            P.modelo_codigo,
            P.cor_codigo
    
        from tbproduto p, tbficha_tecnica f
        
        where f.produto_id = :IPRODUTO_ID
        and p.codigo = f.produto_consumo_id
        and f.ano = :IANO
        and f.mes = :IMES
    ) where T > 0

  into
    :PRODUTO_DESCRICAO,
    :PRODUTO_CONSUMO,
    :ORIGEM,
    :TAMANHO_CONSUMO,
    :FATOR_CONVERSAO,
    :CUSTO_MEDIO,
    :DOLAR,
    :T,
    :C,
    :CS,
    :CO,
    :TS,
    :"TO",
    :CMS,
    :CMO,
    :CMOIP,
    :CMOIA,
    :CSMOIP,
    :CSMOIA,
    :PERDA,
    :FAMILIA_ID,
    :MODELO_ID,
    :COR_ID
  do begin
    :TAMANHO = :ITAMANHO;
    :NIVEL   = :INIVEL;

    select F.familia_codigo FROM tbproduto F WHERE F.codigo = :IPRODUTO_ID
    INTO :FAMILIA_ID;


    MARGEM = coalesce((select first 1
                (sk.margem + 100.0000) / 100.00 as MARGEM
            from tbcusto_margem_sku sk,vwsku ss
                where sk.familia_id = :FAMILIA_ID
                and ss.modelo_id = :MODELO_ID
                and ss.cor_id = :COR_ID
                and ss.perfil = sk.perfil
                and ss.tamanho = :TAMANHO_CONSUMO),1.0000);

    :TROCA = 0;
    
    if(:IGENEALOGIA = '')then
    begin
        :GENEALOGIA = :ORIGEM;
    end else
    begin
        :GENEALOGIA = :IGENEALOGIA||'#'||:ORIGEM;
    end
    suspend;

    if(:PRODUTO_CONSUMO <> :IPRODUTO_ID)then
    begin

        for
          select
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            ORIGEM,
            TAMANHO_CONSUMO,
            FATOR_CONVERSAO,
            CUSTO_MEDIO,
            T,
            C,
            CS,
            CO,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            TAMANHO,
            GENEALOGIA,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID
          from spc_estrutura_absorvido(:IANO,:IMES,:TAMANHO_CONSUMO,:INIVEL,:PRODUTO_CONSUMO, :GENEALOGIA)
        into
            :NIVEL,
            :PRODUTO_DESCRICAO,
            :PRODUTO_CONSUMO,
            :ORIGEM,
            :TAMANHO_CONSUMO,
            :FATOR_CONVERSAO,
            :CUSTO_MEDIO,
            :T,
            :C,
            :CS,
            :CO,
            :TS,
            :"TO",
            :CMS,
            :CMO,
            :CMOIP,
            :CMOIA,
            :CSMOIP,
            :CSMOIA,
            :PERDA,
            :TAMANHO,
            :GENEALOGIA,
            :DOLAR,
            :MARGEM,
            :FAMILIA_ID,
            :MODELO_ID,
            :COR_ID
        do begin
           suspend;
        end
    end

  end
end;

CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(1),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin


   suspend;

  end

end;

CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(10);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe char(4);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe char(4);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente char(4);
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (
            SELECT
                FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                T2.MODELO_ID TALAO_MODELO_ID,
                M.DESCRICAO TALAO_MODELO_DESCRICAO,
                (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                P.DESCRICAO PRODUTO_DESCRICAO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                P.UNIDADEMEDIDA_SIGLA UM,
                MT.LARGURA,
                MT.COMPRIMENTO,
                C2.CLASSE COR_CLASSE,
                C2.SUBCLASSE COR_SUBCLASSE,
                T1.ID,
                T1.ESTABELECIMENTO_ID,
                T1.REMESSA_ID,
                T1.REMESSA_TALAO_ID,
                T1.LOCALIZACAO_ID,
                T1.PRODUTO_ID,
                T1.MODELO_ID,
                P.COR_CODIGO COR_ID,
                T1.TAMANHO,
                T1.QUANTIDADE,
                T1.QUANTIDADE_ALTERNATIVA,
                T1.QUANTIDADE_SOBRA,
                T1.GP_ID,
                T1.UP_ID,
                T1.ESTACAO,
                T1.DENSIDADE,
                T1.ESPESSURA,
                T1.STATUS,
                T1.OBSERVACAO,
                T1.DATA_PRODUCAO,
                T1.DATA_LIBERACAO,
                T1.HORA_PRODUCAO,
                T1.HORA_LIBERACAO,
                T1.VIA_ETIQUETA,
                T1.TURNO,
                T1.TALAO_EXTRA,
                T1.PERCENTUAL_EXTRA
    
            FROM
                VWREMESSA_TALAO T1,
                VWREMESSA_CONSUMO C,
                TBREMESSA_CONSUMO_VINCULO V,
                VWREMESSA_TALAO T2,
                TBPRODUTO P,
                TBMODELO M,
                TBMODELO M2,
                SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                TBCOR C2
    
            WHERE
                T1.REMESSA_ID = C.REMESSA_ID
            AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
            AND V.CONSUMO_ID = C.ID
            AND T2.REMESSA_ID = V.REMESSA_ID
            AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
            AND P.CODIGO = T1.PRODUTO_ID
            AND M.CODIGO = T2.MODELO_ID
            AND M2.CODIGO = P.MODELO_CODIGO
            AND C2.CODIGO = P.COR_CODIGO
            AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   D.QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA
        );
    END


    FOR
        SELECT
            C.ID ID_OLD,
            GEN_ID(GTBREMESSA_CONSUMO,1),
            C.ESTABELECIMENTO_ID,
            :REMESSA_ID,
            V.REMESSA_TALAO_ID,
            C.REMESSA_TALAO_DETALHE_ID,
            C.CONTROLE,
            C.LOCALIZACAO_ID,
            C.PRODUTO_ID,
            C.TAMANHO,
            C.DENSIDADE,
            C.ESPESSURA,
            C.QUANTIDADE_ORIGINAL,
            C.QUANTIDADE_NECES,
            C.QUANTIDADE_NECES_ALTERN,
            C.FATOR_UNIDADE,
            C.FATOR_UNIDADE_ALTERN,
            C.QUANTIDADE,
            C.QUANTIDADE_CONSUMO,
            C.QUANTIDADE_SALDO,
            C.QUANTIDADE_ALTERNATIVA,
            C.QUANTIDADE_SOBRA,
            C.STATUS,
            C.QUANTIDADE_ALTERNATIVA_CONSUMO,
            C.QUANTIDADE_ALTERNATIVA_SALDO,
            C.DATAHORA_CONFERENCIA,
            C.COMPONENTE,
            C.ESTOQUE_ID,
            C.SALDO_BAIXAR
        
        FROM
            VWREMESSA_CONSUMO C,
            TBREMESSA_CONSUMO_VINCULO V
        
        WHERE   
            V.REMESSA_ID = :REMESSA_ID_VINCULO
        AND V.CONSUMO_ID = C.ID
        ORDER BY C.ID
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR
    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            CONTROLE,
            LOCALIZACAO_ID,
            PRODUTO_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE_ORIGINAL,
            QUANTIDADE_NECES,
            QUANTIDADE_NECES_ALTERN,
            QUANTIDADE,
            QUANTIDADE_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end;

CREATE OR ALTER procedure spu_sobra_bojo (
    i_id integer,
    estabelecimento_id integer,
    gp_id integer,
    remessa_id integer,
    produto_id integer,
    tamanho integer,
    quantidade numeric(15,4),
    operador_id integer,
    data date = null,
    hora varchar(5) = null)
returns (
    id integer,
    enderecamento varchar(100))
as
declare variable familia_id integer;
declare variable enderecamento_id integer;
declare variable localizacao_id integer;
declare variable grupo varchar(10);
declare variable subgrupo varchar(10);
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable perfil_enderecamento_sobra varchar(12);
declare variable enderecamento_localizacao_id integer;
BEGIN



    I_ID = ID;
                    
    IF ( COALESCE(OPERADOR_ID,0) = 0 ) THEN
    BEGIN
        EXCEPTION "..." 'OPERADOR EH OBRIGATORIO.';
    END

    SELECT FIRST 1
           S.ENDERECAMENTO_ID
      FROM TBSOBRA S
     WHERE S.ID = :ID
      INTO :ENDERECAMENTO_ID;


    SELECT FIRST 1
           MODELO_CODIGO,
           COR_CODIGO,
           FAMILIA_CODIGO
      FROM TBPRODUTO P
     WHERE P.CODIGO = :PRODUTO_ID
      INTO :MODELO_ID,
           :COR_ID,
           :FAMILIA_ID;
            
    SELECT FIRST 1
           E.GRUPO,
           E.SUBGRUPO
      FROM TBENDERECAMENTO E
     WHERE E.ID = :ENDERECAMENTO_ID
      INTO :GRUPO,
           :SUBGRUPO;


    GRUPO = COALESCE(GRUPO,'');
    SUBGRUPO = COALESCE(GRUPO,'');

    IF ((TRIM(GRUPO) <> '' AND TRIM(SUBGRUPO)  = '') OR
        (TRIM(GRUPO)  = '' AND TRIM(SUBGRUPO) <> ''))
    THEN
    BEGIN
        EXCEPTION "..." 'ENDERECAMENTO INVALIDO PARA SOBRA ID: ' || ID || '.';
    END
    ELSE
    IF (TRIM(GRUPO) = '' AND TRIM(SUBGRUPO) = '') THEN
    BEGIN

        SELECT FIRST 1 PF.ENDERECAMENTO_SOBRA
          FROM VWSKU S,
               TBPERFIL PF
         WHERE S.PERFIL    = PF.ID
           AND PF.TABELA   = 'SKU'
           AND S.MODELO_ID = :MODELO_ID
           AND S.COR_ID    = :COR_ID
           AND S.TAMANHO   = :TAMANHO
          INTO PERFIL_ENDERECAMENTO_SOBRA;


        SELECT FIRST 1
            X.ENDERECAMENTO_ID,
            X.ENDERECAMENTO_LOCALIZACAO_ID,
            X.ENDERECAMENTO
        FROM (
            SELECT
                E.ID ENDERECAMENTO_ID,
                E.GRUPO ENDERECAMENTO_GRUPO,
                E.SUBGRUPO ENDERECAMENTO_SUBGRUPO,
                E.LOCALIZACAO_ID ENDERECAMENTO_LOCALIZACAO_ID,
                E.GRUPO||'-'||E.SUBGRUPO ENDERECAMENTO,
                E.CAPACIDADE ENDERECAMENTO_CAPACIDADE,
                SUM(S.SALDO) SOBRA_SALDO,
                COALESCE((
                    SELECT SUM(SB.SALDO)
                      FROM TBSOBRA SB
                     WHERE SB.ENDERECAMENTO_ID = S.ENDERECAMENTO_ID
                       AND SB.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                       AND SB.STATUS = '1'),0.0000) ENDERECAMENTO_SALDO
            
            FROM
                TBSOBRA S,
                TBPRODUTO P,
                TBENDERECAMENTO E
            WHERE
                S.PRODUTO_ID = P.CODIGO
            AND S.ENDERECAMENTO_ID = E.ID
            AND IIF(POSITION('M',:PERFIL_ENDERECAMENTO_SOBRA) > 0 OR :PERFIL_ENDERECAMENTO_SOBRA = '', P.MODELO_CODIGO = :MODELO_ID,TRUE)
            AND IIF(POSITION('T',:PERFIL_ENDERECAMENTO_SOBRA) > 0 OR :PERFIL_ENDERECAMENTO_SOBRA = '', S.TAMANHO       = :TAMANHO  ,TRUE)
            AND IIF(POSITION('C',:PERFIL_ENDERECAMENTO_SOBRA) > 0                                    , P.COR_CODIGO    = :COR_ID   ,TRUE)
            AND S.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
            AND S.STATUS = '1'
            
            GROUP BY
                S.ENDERECAMENTO_ID,
                E.ID,
                E.GRUPO, 
                E.SUBGRUPO,
                E.LOCALIZACAO_ID,
                E.CAPACIDADE) X
        WHERE (ENDERECAMENTO_Capacidade - ENDERECAMENTO_SALDO) >= :QUANTIDADE
        ORDER BY ENDERECAMENTO_GRUPO,ENDERECAMENTO_SUBGRUPO
         INTO
            ENDERECAMENTO_ID,
            ENDERECAMENTO_LOCALIZACAO_ID,
            ENDERECAMENTO;
        

        IF (ENDERECAMENTO_ID > 0) THEN
        BEGIN
            ENDERECAMENTO_ID = :ENDERECAMENTO_ID;
            LOCALIZACAO_ID   = :ENDERECAMENTO_LOCALIZACAO_ID;
        END

    END
    ELSE
    IF ( TRIM(GRUPO) <> '' AND TRIM(SUBGRUPO) <> '' ) THEN
    BEGIN


        SELECT FIRST 1
            ID,
            LOCALIZACAO_ID,
            E.GRUPO||'-'||E.SUBGRUPO
        FROM
            TBENDERECAMENTO E
        WHERE
            GRUPO = :GRUPO
        AND SUBGRUPO = :SUBGRUPO
        AND FAMILIA_ID = :FAMILIA_ID
        INTO
            ENDERECAMENTO_ID,
            ENDERECAMENTO_LOCALIZACAO_ID,
            ENDERECAMENTO;
        
        IF ( ENDERECAMENTO_ID > 0 ) THEN
        BEGIN
            ENDERECAMENTO_ID = :ENDERECAMENTO_ID;
            LOCALIZACAO_ID   = :ENDERECAMENTO_LOCALIZACAO_ID;
        END
        ELSE
        BEGIN
            EXCEPTION "..." 'ENDERECAMENTO INVALIDO. INFORMADO: ' || GRUPO ||'-'||SUBGRUPO;
        END

    END


    IF ( NOT COALESCE(ID,0) > 0 ) THEN
    BEGIN
        ID = GEN_ID(GTBSOBRA,1);
    END    

    UPDATE OR INSERT INTO TBSOBRA (     
        ID,
        ESTABELECIMENTO_ID,    
        PRODUTO_ID,    
        TAMANHO,      
        QUANTIDADE,
        SALDO,
        TURNO,
        DATA,
        HORA,
        GP_ID,
        OPERADOR_ID,
        ENDERECAMENTO_ID,
        LOCALIZACAO_ID,
        REMESSA
    ) VALUES (                    
        :ID,
        :ESTABELECIMENTO_ID,  
        :PRODUTO_ID,  
        :TAMANHO,       
        :QUANTIDADE,
        :QUANTIDADE,
        FN_TURNO_CORRENTE(),
        :DATA,
        :HORA,
        :GP_ID,
        :OPERADOR_ID,     
        :ENDERECAMENTO_ID,
        :LOCALIZACAO_ID,
        :REMESSA_ID
    ) MATCHING (ID);


    SUSPEND;
END;

CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil char(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

FOR Select A.MODELO_ID, A.COR_ID, A.PERCENTUAL_TALAO,
    Coalesce((Select First 1 P.Status From TbProduto P Where P.Modelo_Codigo = A.Modelo_Id and P.Cor_Codigo = C.Codigo),'1') Status_Produto
From TbModelo_Cor A, TbCor C
Where A.Cor_Id = C.Codigo
--  and C.Status = '1'
  and A.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :PERCENTUAL_TALAO, :Status_Produto
DO
  Begin
  IF (:MODELO_ID > 0/* and :Status_Produto = '1'*/) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_COR (MODELO_ID, COR_ID, PERCENTUAL_TALAO)
       VALUES (:ID2, :COR_ID, :PERCENTUAL_TALAO)
       MATCHING (MODELO_ID, COR_ID);
       END
  End

FOR Select M.MODELO_ID, M.COR_ID, M.TAMANHO, M.PERFIL, M.BLQ_PED
From TbModelo_Bloqueio M
Where M.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED
DO
  Begin
  IF (:MODELO_ID > 0) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_BLOQUEIO (MODELO_ID, COR_ID, TAMANHO, PERFIL, BLQ_PED)
       VALUES (:ID2, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED)
       MATCHING (MODELO_ID, COR_ID, TAMANHO);
       END
  End

END;

CREATE OR ALTER function fn_sku_bloqueado (
    modelo_id integer,
    cor_id integer)
returns integer
as
declare variable ret integer;
begin
  RET = coalesce((
            select
                count(y.TAMANHO) - sum(cast(y.BLQ_PED as integer)) as TAM_LIBERADOS
            from(
                select
                    x.*,
                    fn_array(TAMANHOS,x.TAMANHO ,'#') as ABILITADO
                from(
                    select
                        m.*,
                        (select l.t01||'#'||l.t02||'#'||l.t03||'#'||l.t04||'#'||l.t05||'#'||l.t06||'#'||l.t07||'#'||l.t08||'#'||l.t09||'#'||l.t10||'#'||
                                l.t11||'#'||l.t12||'#'||l.t13||'#'||l.t14||'#'||l.t15||'#'||l.t16||'#'||l.t17||'#'||l.t18||'#'||l.t19||'#'||l.t20||'#'  from tbmodelo l where l.codigo = m.modelo_id) as TAMANHOS
                    
                    from TBMODELO_BLOQUEIO M, tbproduto p
                    where m.modelo_id   = :MODELO_ID
                    and m.cor_id        = :COR_ID
                    and p.modelo_codigo = m.modelo_id
                    and p.cor_codigo    = m.cor_id
                ) x
            ) y
            where ABILITADO = 1),0);

  return RET;
end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin
      if (:vData <> New.Data) then
          Exception "..." 'Data de produção para registro de defeito inválida, a data liberada é '||
                          Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End


  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0d_01 for tbmodelo_bloqueio
active before delete position 0
AS
begin
  if (old.SALESFORCE = 1) then
  begin
    insert into TBREGISTRO_EXCLUIDO (ID, ID1, ID2, TABELA) values(gen_id(GTBREGISTRO_EXCLUIDO,1), old.MODELO_id, old.COR_id, 'TBMODELO_BLOQUEIO');
  end
end;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0u_02 for tbmodelo_bloqueio
active before update position 0
AS
BEGIN

    if (old.MODELO_ID <> new.MODELO_ID or
        old.TAMANHO  <> new.TAMANHO or
        old.COR_ID   <> new.COR_ID or
        old.BLQ_PED  <> new.BLQ_PED or
        old.PERFIL   <> new.PERFIL or
        old.QTD_MIN  <> new.QTD_MIN or
        old.QTD_MULT <> new.QTD_MULT) then
        begin
         new.SALESFORCE = '0';
        end

    if (old.SALESFORCE = '0' and new.SALESFORCE = '1') then
    begin
        insert into TBHISTORICO_SALESFORCE (TABELA, ID1, ID2, ID3) values ('TBMODELO_BLOQUEIO', old.MODELO_ID, old.COR_ID, old.TAMANHO);
    end
    
END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9i_09 for tbmodelo_bloqueio
active before insert position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

   Cor = Coalesce((Select First 1 C.Descricao from TbCor C Where C.Codigo = New.COR_ID),'');
   Tam = Coalesce((Select First 1 (Select Tam_Descricao From Sp_Tamanho_Grade (M.Grade_Codigo,New.Tamanho)) from TbModelo M Where M.Codigo = New.Modelo_ID),'');

      if (Coalesce(New.Blq_Ped,'0') <> '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' bloqueado para pedido. ');
          End

       if (Trim(New.Perfil) <> '') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' registrado no perfil: '||New.Perfil||'-'||Coalesce((Select First 1 P.Descricao from TbPerfil P Where P.Id = New.Perfil and P.Tabela = 'SKU'),''));
          End

end;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9u_09 for tbmodelo_bloqueio
active before update position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

   if (old.SALESFORCE = new.SALESFORCE) Then
       Begin
       Cor = Coalesce((Select First 1 C.Descricao from TbCor C Where C.Codigo = New.COR_ID),'');
       Tam = Coalesce((Select First 1 (Select Tam_Descricao From Sp_Tamanho_Grade (M.Grade_Codigo,New.Tamanho)) from TbModelo M Where M.Codigo = New.Modelo_ID),'');

       if (New.Blq_Ped <> '0' and Old.Blq_Ped = '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' bloqueado para pedido. ');
          End

       if (New.Blq_Ped = '0' and Old.Blq_Ped <> '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' desbloqueado para pedido. ');
          End

       if (Trim(New.Perfil) <> Trim(Old.Perfil)) Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' perfil alterado: '||Old.Perfil||' -> '||New.Perfil||'-'||Coalesce((Select First 1 P.Descricao from TbPerfil P Where P.Id = New.Perfil and P.Tabela = 'SKU'),''));
          End

       End

end;

CREATE OR ALTER trigger ttbpedido_item_b0i_02 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

  ecomerce = Coalesce((Select c.ecommerce From TbPedido c Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),0);

  Tipo_Pedido = Coalesce((Select Tipo_Pedido From TbPedido Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),'1');
  Cli_Qtd_Min = '1';
  Cli_Qtd_Mult= '1';

  if (:Tipo_Pedido = '1' and New.Tamanho > 0 and New.Situacao = 1 and ecomerce = 0) Then --Pedido Normal
      Begin

        For
        Select First 1 C.Quantidade_Minima, C.Quantidade_Multipla
          From TbCliente_Modelo_Preco C
         Where C.Cliente_Codigo = New.Cliente_Codigo
           and C.Modelo_Codigo = New.Modelo_Codigo
          Into :Cli_Qtd_Min, :Cli_Qtd_Mult
            Do
         Begin
           End

        For
        Select First 1 P.Cor_Codigo, P.Descricao
          From TbProduto P
         Where P.Codigo = New.Produto_Codigo
          Into :Cor_Id, :Produto
            Do
         Begin

            if (:Cor_Id > 0) Then
                Begin

                Blq_Qtd_Min  = 0;
                Blq_Qtd_Mult = 0;

                For
                Select First 1 B.Blq_Ped, Coalesce(P.Qtd_Min,0), Coalesce(P.Qtd_Mult,0)
                  From TbModelo_Bloqueio B
             Left Join TbPerfil P On B.Perfil = P.Id and P.Tabela = 'SKU' and P.Qtd_Tipo = 'T' --'T' Por Tamanho
                 Where B.Modelo_ID = New.Modelo_Codigo
                   and B.Tamanho = New.Tamanho
                   and B.Cor_Id = :Cor_Id
                  Into :Blq_Ped, :Blq_Qtd_Min, :Blq_Qtd_Mult
                    do
                 Begin

                     if (:Blq_Ped = '1' or :Blq_Ped = '3') then
                         Begin
                            Exception "..." 'PRODUTO BLOQUEADO PARA PEDIDO. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End

                     if (:Blq_Qtd_Min > 0 and New.Quantidade < :Blq_Qtd_Min and :Cli_Qtd_Min = '1') then
                         Begin
                            Exception "..." 'QUANTIDADE MINIMA DO PRODUTO ATINGIDO, INCLUSAO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                            ||' QUANT.MINIMA: '||:BLQ_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                            ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End

                     if (:Blq_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                         Begin
                         if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Blq_Qtd_Mult) * :Blq_Qtd_Mult > 0) then
                             Begin
                                Exception "..." 'QUANTIDADE MULTIMA DO PRODUTO VIOLADO, INCLUSAO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                ||' QUANT.MULTIPLA: '||:BLQ_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                             End
                         End
                   End

-------------

                Mod_Qtd_Min  = 0;
                Mod_Qtd_Mult = 0;

                For
                Select First 1  Case When NEW.Tamanho = 1 Then MI01 When NEW.Tamanho = 2 Then MI02
                                     When NEW.Tamanho = 3 Then MI03 When NEW.Tamanho = 4 Then MI04
                                     When NEW.Tamanho = 5 Then MI05 When NEW.Tamanho = 6 Then MI06
                                     When NEW.Tamanho = 7 Then MI07 When NEW.Tamanho = 8 Then MI08
                                     When NEW.Tamanho = 9 Then MI09 When NEW.Tamanho =10 Then MI10
                                     When NEW.Tamanho =11 Then MI11 When NEW.Tamanho =12 Then MI12
                                     When NEW.Tamanho =13 Then MI13 When NEW.Tamanho =14 Then MI14
                                     When NEW.Tamanho =15 Then MI15 When NEW.Tamanho =16 Then MI16
                                     When NEW.Tamanho =17 Then MI17 When NEW.Tamanho =18 Then MI18
                                     When NEW.Tamanho =19 Then MI19 When NEW.Tamanho =20 Then MI20 End,

                                Case When NEW.Tamanho = 1 Then MU01 When NEW.Tamanho = 2 Then MU02
                                     When NEW.Tamanho = 3 Then MU03 When NEW.Tamanho = 4 Then MU04
                                     When NEW.Tamanho = 5 Then MU05 When NEW.Tamanho = 6 Then MU06
                                     When NEW.Tamanho = 7 Then MU07 When NEW.Tamanho = 8 Then MU08
                                     When NEW.Tamanho = 9 Then MU09 When NEW.Tamanho =10 Then MU10
                                     When NEW.Tamanho =11 Then MU11 When NEW.Tamanho =12 Then MU12
                                     When NEW.Tamanho =13 Then MU13 When NEW.Tamanho =14 Then MU14
                                     When NEW.Tamanho =15 Then MU15 When NEW.Tamanho =16 Then MU16
                                     When NEW.Tamanho =17 Then MU17 When NEW.Tamanho =18 Then MU18
                                     When NEW.Tamanho =19 Then MU19 When NEW.Tamanho =20 Then MU20 End

                  From TbModelo_Pedido_Cota M
                 Where M.Modelo_Id = New.Modelo_Codigo
                  Into :Mod_Qtd_Min, :Mod_Qtd_Mult
                    do
                 Begin
                     if (:Mod_Qtd_Min > 0 and New.Quantidade < :Mod_Qtd_Min and :Cli_Qtd_Min = '1') then
                         Begin
                            Exception "..." 'QUANTIDADE MÍNIMA DO MODELO ANTINGIDO, INCLUSÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                            ||' QUANT.MÍNIMA: '||:Mod_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                            ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End
                     if (:Mod_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                         Begin
                         if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Mod_Qtd_Mult) * :Mod_Qtd_Mult > 0) then
                             Begin
                                Exception "..." 'QUANTIDADE MÚLTIMA DO MODELO VIOLADO, INCLUSÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                ||' QUANT.MÚLTIPLA: '||:MOD_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                             End
                         End
                   End

                End
           End
      End

End;

CREATE OR ALTER trigger ttbpedido_item_b0u_02 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

  ecomerce = Coalesce((Select c.ecommerce From TbPedido c Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),0);

  if ((New.Tamanho <> Old.Tamanho or
      New.Quantidade <> Old.Quantidade or
      New.Produto_Codigo <> Old.Produto_Codigo or
     (New.Situacao <> Old.Situacao and New.Situacao = 1)) and  ecomerce = 0) Then
       Begin

          Tipo_Pedido = Coalesce((Select Tipo_Pedido From TbPedido Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),'1');
          Cli_Qtd_Min = '1';
          Cli_Qtd_Mult= '1';
        
          if (:Tipo_Pedido = '1' and New.Tamanho > 0 and New.Situacao = 1) Then --Pedido Normal
              Begin
        
                For
                Select First 1 C.Quantidade_Minima, C.Quantidade_Multipla
                  From TbCliente_Modelo_Preco C
                 Where C.Cliente_Codigo = New.Cliente_Codigo
                   and C.Modelo_Codigo = New.Modelo_Codigo
                  Into :Cli_Qtd_Min, :Cli_Qtd_Mult
                    Do
                 Begin
                   End
        
                For
                Select First 1 P.Cor_Codigo, P.Descricao
                  From TbProduto P
                 Where P.Codigo = New.Produto_Codigo
                  Into :Cor_Id, :Produto
                    Do
                 Begin
        
                    if (:Cor_Id > 0) Then
                        Begin
        
                        Blq_Qtd_Min  = 0;
                        Blq_Qtd_Mult = 0;
        
                        For
                        Select First 1 B.Blq_Ped, Coalesce(P.Qtd_Min,0), Coalesce(P.Qtd_Mult,0)
                          From TbModelo_Bloqueio B
                     Left Join TbPerfil P On B.Perfil = P.Id and P.Tabela = 'SKU' and P.Qtd_Tipo = 'T' --'T' Por Tamanho
                         Where B.Modelo_ID = New.Modelo_Codigo
                           and B.Tamanho = New.Tamanho
                           and B.Cor_Id = :Cor_Id
                          Into :Blq_Ped, :Blq_Qtd_Min, :Blq_Qtd_Mult
                            do
                         Begin
                             if (:Blq_Ped = '1') then
                                 Begin
                                    Exception "..." 'PRODUTO BLOQUEADO PARA PEDIDO. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO||
                                    ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Blq_Qtd_Min > 0 and New.Quantidade < :Blq_Qtd_Min and :Cli_Qtd_Min = '1') then
                                 Begin
                                    Exception "..." 'QUANTIDADE MÍNIMA DO PRODUTO ANTINGIDO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                    ||' QUANT.MÍNIMA: '||:BLQ_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                                    ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Blq_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                                 Begin
                                 if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Blq_Qtd_Mult) * :Blq_Qtd_Mult > 0) then
                                     Begin
                                        Exception "..." 'QUANTIDADE MÚLTIMA DO PRODUTO VIOLADO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                        ||' QUANT.MÚLTIPLA: '||:BLQ_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                        ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                     End
                                 End
                           End
        
        -------------
        
                        Mod_Qtd_Min  = 0;
                        Mod_Qtd_Mult = 0;
        
                        For
                Select First 1  Case When NEW.Tamanho = 1 Then MI01 When NEW.Tamanho = 2 Then MI02
                                     When NEW.Tamanho = 3 Then MI03 When NEW.Tamanho = 4 Then MI04
                                     When NEW.Tamanho = 5 Then MI05 When NEW.Tamanho = 6 Then MI06
                                     When NEW.Tamanho = 7 Then MI07 When NEW.Tamanho = 8 Then MI08
                                     When NEW.Tamanho = 9 Then MI09 When NEW.Tamanho =10 Then MI10
                                     When NEW.Tamanho =11 Then MI11 When NEW.Tamanho =12 Then MI12
                                     When NEW.Tamanho =13 Then MI13 When NEW.Tamanho =14 Then MI14
                                     When NEW.Tamanho =15 Then MI15 When NEW.Tamanho =16 Then MI16
                                     When NEW.Tamanho =17 Then MI17 When NEW.Tamanho =18 Then MI18
                                     When NEW.Tamanho =19 Then MI19 When NEW.Tamanho =20 Then MI20 End,

                                Case When NEW.Tamanho = 1 Then MU01 When NEW.Tamanho = 2 Then MU02
                                     When NEW.Tamanho = 3 Then MU03 When NEW.Tamanho = 4 Then MU04
                                     When NEW.Tamanho = 5 Then MU05 When NEW.Tamanho = 6 Then MU06
                                     When NEW.Tamanho = 7 Then MU07 When NEW.Tamanho = 8 Then MU08
                                     When NEW.Tamanho = 9 Then MU09 When NEW.Tamanho =10 Then MU10
                                     When NEW.Tamanho =11 Then MU11 When NEW.Tamanho =12 Then MU12
                                     When NEW.Tamanho =13 Then MU13 When NEW.Tamanho =14 Then MU14
                                     When NEW.Tamanho =15 Then MU15 When NEW.Tamanho =16 Then MU16
                                     When NEW.Tamanho =17 Then MU17 When NEW.Tamanho =18 Then MU18
                                     When NEW.Tamanho =19 Then MU19 When NEW.Tamanho =20 Then MU20 End

                          From TbModelo_Pedido_Cota M
                         Where M.Modelo_Id = New.Modelo_Codigo
                          Into :Mod_Qtd_Min, :Mod_Qtd_Mult
                            do
                         Begin
                             if (:Mod_Qtd_Min > 0 and New.Quantidade < :Mod_Qtd_Min and :Cli_Qtd_Min = '1') then
                                 Begin
                                    Exception "..." 'QUANTIDADE MÍNIMA DO MODELO ANTINGIDO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                    ||' QUANT.MÍNIMA: '||:Mod_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                                    ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Mod_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                                 Begin
                                 if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Mod_Qtd_Mult) * :Mod_Qtd_Mult > 0) then
                                     Begin
                                        Exception "..." 'QUANTIDADE MÚLTIMA DO MODELO VIOLADO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                        ||' QUANT.MÚLTIPLA: '||:MOD_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                        ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                     End
                                 End
                           End
        
                        End
                   End
              End
       End
End;

CREATE OR ALTER trigger ttbpedido_item_proc_b1i_02 for tbpedido_item_processado
active before insert position 1
AS
Begin

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbModelo_Bloqueio M
                              Where M.Modelo_Id = New.Modelo_Codigo
                                and M.Cor_Id    = New.Cor_Id
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbremessa_item_processado_b1i for tbremessa_item_processado
active before insert position 1
AS
begin

  IF ((TRIM(NEW.PERFIL) = '') OR (NEW.PERFIL IS NULL)) THEN
      BEGIN
      NEW.PERFIL = COALESCE((SELECT FIRST 1 M.PERFIL FROM TBPRODUTO P, TBMODELO_BLOQUEIO M
                              WHERE P.CODIGO    = NEW.PRODUTO_CODIGO
                                AND M.MODELO_ID = P.MODELO_CODIGO
                                AND M.COR_ID    = P.COR_CODIGO
                                AND M.TAMANHO   = NEW.TAMANHO),'');
      END
end;

CREATE OR ALTER trigger ttbrequisicao_b1i_01 for tbrequisicao
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin

      --if (New.Data - :vData = 1) then
          New.Data = :vData;

      --if (:vData <> New.Data) then
      --    Exception "..." 'Data de produção para registro de requisição inválida, a data liberada é '||
      --                    Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbsobra_b1i for tbsobra
active before insert position 1
AS
Begin

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbsobra_b2u for tbsobra
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

DROP INDEX ITBMODELO_09;

CREATE OR ALTER trigger ttmodelo_b9u for tbmodelo
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER procedure spu_copia_modelo_geral (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    codigo integer,
    descricao varchar(50),
    familia_codigo integer,
    grade_codigo integer,
    matriz_codigo integer,
    status char(1),
    linha_codigo integer,
    tipoproduto_codigo integer,
    classificacao char(1),
    unidademedida_sigla varchar(3),
    modelo_pai integer,
    densidade integer,
    espessura numeric(10,1),
    tipo_tag varchar(10),
    acrescimo numeric(15,2),
    prioridade integer,
    gerar_remessa char(1),
    horas_bloqueio integer,
    horas_tolerancia integer,
    cor_id integer,
    tamanho integer,
    t01 char(1),
    t02 char(1),
    t03 char(1),
    t04 char(1),
    t05 char(1),
    t06 char(1),
    t07 char(1),
    t08 char(1),
    t09 char(1),
    t10 char(1),
    t11 char(1),
    t12 char(1),
    t13 char(1),
    t14 char(1),
    t15 char(1),
    t16 char(1),
    t17 char(1),
    t18 char(1),
    t19 char(1),
    t20 char(1),
    observacao blob sub_type 0 segment size 80)
as
BEGIN

end;

CREATE OR ALTER procedure spu_pedido_margem_v2 (
    data_1 date,
    data_2 date,
    familia_id integer)
as
declare variable cliente_id integer;
declare variable modelo_id integer;
declare variable tamanho integer;
declare variable percentual_margem numeric(10,2);
declare variable data date;
Begin

end;

ALTER TABLE TBMODELO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBMODELO DROP CLASSIFICACAO;
ALTER TABLE TBMODELO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBMODELO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBMODELO DROP OLD_PERFIL;

CREATE INDEX ITBMODELO_09 ON TBMODELO (CLASSIFICACAO);
SET STATISTICS INDEX ITBMODELO_09;

CREATE OR ALTER procedure spu_pedido_margem_v2 (
    data_1 date,
    data_2 date,
    familia_id integer)
as
declare variable cliente_id integer;
declare variable modelo_id integer;
declare variable tamanho integer;
declare variable percentual_margem numeric(10,2);
declare variable data date;
Begin

        FOR
        SELECT  CLIENTE_ID,
                MODELO_ID,
                TAMANHO,
                PERCENTUAL_MARGEM,
                DATA
        FROM (
        SELECT DISTINCT
               A.EMPRESA_CODIGO AS CLIENTE_ID,
               P.MODELO_CODIGO AS MODELO_ID,
               A.TAMANHO AS TAMANHO,
               ROUND(100 - (A.MARGEM / (A.MARGEM + A.VALOR_UNITARIO) * 100),0) AS PERCENTUAL_MARGEM,
               MAX(A.DATA_EMISSAO) DATA
        FROM TBNFS_ITEM A, TBPRODUTO P, TBMODELO M, TBNFS S
        WHERE A.DATA_EMISSAO BETWEEN :DATA_1 AND :DATA_2
          AND A.MARGEM > 0
          AND A.PEDIDO_ITEM_PE_CONTROLE > 0
          AND P.CODIGO = A.produto_codigo
          AND M.CODIGO = P.MODELO_CODIGO
          AND S.CONTROLE = A.NFS_CONTROLE
          AND M.FAMILIA_CODIGO = :FAMILIA_ID
          AND M.CLASSIFICACAO = 'B'
        GROUP BY 1,2,3,4
        )
        ORDER BY 1,2,3,5

        INTO :CLIENTE_ID, :MODELO_ID, :TAMANHO, :PERCENTUAL_MARGEM, :DATA
         do begin

            UPDATE OR INSERT INTO TBCLIENTE_MARGEM (CLIENTE_ID, MODELO_ID, TAMANHO, PERCENTUAL_MARGEM, DATAHORA)
            VALUES (:CLIENTE_ID, :MODELO_ID, :TAMANHO, :PERCENTUAL_MARGEM, :DATA)
            MATCHING (CLIENTE_ID, MODELO_ID, TAMANHO);

            UPDATE OR INSERT INTO TBCLIENTE_MARGEM (CLIENTE_ID, MODELO_ID, TAMANHO, PERCENTUAL_MARGEM, DATAHORA)
            VALUES (:CLIENTE_ID, :MODELO_ID, 0, :PERCENTUAL_MARGEM, :DATA)
            MATCHING (CLIENTE_ID, MODELO_ID, TAMANHO);

            end

  UPDATE TBPEDIDO_ITEM PI SET
  MARGEM = PI.VALOR /
  (COALESCE(((SELECT FIRST 1 CMP.PERCENTUAL_MARGEM
              FROM TBCLIENTE_MARGEM CMP
             WHERE CMP.CLIENTE_ID = PI.CLIENTE_CODIGO
               AND CMP.MODELO_ID  = PI.MODELO_CODIGO
               AND CMP.TAMANHO    = 0)/100.0),1)) - PI.VALOR
  WHERE PI.DATA_INCLUSAO BETWEEN :DATA_1 AND :DATA_2
    AND PI.MARGEM = 0
    AND PI.MODELO_CODIGO = (SELECT M.CODIGO FROM TBMODELO M WHERE M.CODIGO = PI.MODELO_CODIGO AND M.CLASSIFICACAO = 'B' AND M.FAMILIA_CODIGO = :FAMILIA_ID)
    AND PI.PEDIDO = (SELECT PEDIDO FROM TBPEDIDO P WHERE P.TIPO_PEDIDO = '1' AND P.PEDIDO = PI.PEDIDO AND P.FAMILIA_CODIGO = :FAMILIA_ID);

  UPDATE TBPEDIDO_ITEM PI SET
  MARGEM =   PI.VALOR /
  (COALESCE(((SELECT FIRST 1 CMP.PERCENTUAL_MARGEM
              FROM TBCLIENTE_MARGEM CMP
             WHERE CMP.CLIENTE_ID = PI.CLIENTE_CODIGO
               AND CMP.MODELO_ID  = PI.MODELO_CODIGO
               AND CMP.TAMANHO    = PI.TAMANHO)/100.0),1)) - PI.VALOR
  WHERE PI.DATA_INCLUSAO BETWEEN :DATA_1 AND :DATA_2
    AND PI.MARGEM = 0
    AND PI.MODELO_CODIGO = (SELECT M.CODIGO FROM TBMODELO M WHERE M.CODIGO = PI.MODELO_CODIGO AND M.CLASSIFICACAO = 'B' AND M.FAMILIA_CODIGO = :FAMILIA_ID)
    AND PI.PEDIDO = (SELECT PEDIDO FROM TBPEDIDO P WHERE P.TIPO_PEDIDO = '1' AND P.PEDIDO = PI.PEDIDO AND P.FAMILIA_CODIGO = :FAMILIA_ID);

End;

CREATE OR ALTER procedure spu_copia_modelo_geral (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    codigo integer,
    descricao varchar(50),
    familia_codigo integer,
    grade_codigo integer,
    matriz_codigo integer,
    status char(1),
    linha_codigo integer,
    tipoproduto_codigo integer,
    classificacao char(1),
    unidademedida_sigla varchar(3),
    modelo_pai integer,
    densidade integer,
    espessura numeric(10,1),
    tipo_tag varchar(10),
    acrescimo numeric(15,2),
    prioridade integer,
    gerar_remessa char(1),
    horas_bloqueio integer,
    horas_tolerancia integer,
    cor_id integer,
    tamanho integer,
    t01 char(1),
    t02 char(1),
    t03 char(1),
    t04 char(1),
    t05 char(1),
    t06 char(1),
    t07 char(1),
    t08 char(1),
    t09 char(1),
    t10 char(1),
    t11 char(1),
    t12 char(1),
    t13 char(1),
    t14 char(1),
    t15 char(1),
    t16 char(1),
    t17 char(1),
    t18 char(1),
    t19 char(1),
    t20 char(1),
    observacao blob sub_type 0 segment size 80)
as
BEGIN

FOR Select A.CODIGO, A.DESCRICAO, A.FAMILIA_CODIGO, A.GRADE_CODIGO, A.MATRIZ_CODIGO,
    A.STATUS, A.LINHA_CODIGO, A.TIPOPRODUTO_CODIGO,
    A.T01, A.T02, A.T03, A.T04, A.T05, A.T06, A.T07, A.T08, A.T09, A.T10,
    A.T11, A.T12, A.T13, A.T14, A.T15, A.T16, A.T17, A.T18, A.T19, A.T20,
    (Select B.Observacao from TbModelo_Observacao B Where B.Modelo_Codigo = A.Codigo),
    CLASSIFICACAO, UNIDADEMEDIDA_SIGLA, MODELO_PAI, DENSIDADE, ESPESSURA,
    TIPO_TAG, ACRESCIMO, PRIORIDADE, GERAR_REMESSA, HORAS_BLOQUEIO, HORAS_TOLERANCIA,
    COR_ID,TAMANHO
From TbModelo A
Left join TbModelo_Padrao P On P.Modelo_Id = A.Codigo
Where A.Codigo = :ID1

INTO :CODIGO, :DESCRICAO, :FAMILIA_CODIGO, :GRADE_CODIGO,
     :MATRIZ_CODIGO, :STATUS, :LINHA_CODIGO, :TIPOPRODUTO_CODIGO,
     :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10,
     :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20, :OBSERVACAO,
     :CLASSIFICACAO, :UNIDADEMEDIDA_SIGLA, :MODELO_PAI, :DENSIDADE, :ESPESSURA,
     :TIPO_TAG, :ACRESCIMO, :PRIORIDADE, :GERAR_REMESSA, :HORAS_BLOQUEIO,
     :HORAS_TOLERANCIA, :COR_ID, :TAMANHO

DO

    IF (:CODIGO > 0) then
         BEGIN

            UPDATE or INSERT INTO TBMODELO (
            CODIGO, DESCRICAO, FAMILIA_CODIGO, GRADE_CODIGO, MATRIZ_CODIGO,
            STATUS, LINHA_CODIGO, TIPOPRODUTO_CODIGO,
            T01, T02, T03, T04, T05, T06, T07, T08, T09, T10,
            T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
            CLASSIFICACAO, UNIDADEMEDIDA_SIGLA, MODELO_PAI, DENSIDADE,
            ESPESSURA, TIPO_TAG, ACRESCIMO, PRIORIDADE, GERAR_REMESSA,
            HORAS_BLOQUEIO, HORAS_TOLERANCIA, USUARIO_CODIGO) VALUES (
           :ID2, :DESCRICAO_1, :FAMILIA_CODIGO, :GRADE_CODIGO, :MATRIZ_CODIGO,
           :STATUS, :LINHA_CODIGO, :TIPOPRODUTO_CODIGO,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10,
           :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :CLASSIFICACAO, :UNIDADEMEDIDA_SIGLA, :MODELO_PAI, :DENSIDADE,
           :ESPESSURA, :TIPO_TAG, :ACRESCIMO, :PRIORIDADE, :GERAR_REMESSA,
           :HORAS_BLOQUEIO, :HORAS_TOLERANCIA, :USUARIO_ID)
            MATCHING (CODIGO);
    
         UPDATE or INSERT
         INTO TBMODELO_OBSERVACAO (MODELO_CODIGO, OBSERVACAO)
         VALUES (:ID2, :OBSERVACAO) MATCHING (MODELO_CODIGO);

         if (:COR_ID > 0 and :TAMANHO > 0) then
            Begin
             UPDATE or INSERT
             INTO TBMODELO_PADRAO (MODELO_ID, COR_ID, TAMANHO)
             VALUES (:ID2, :COR_ID, :TAMANHO) MATCHING (MODELO_ID);
            End

         END

SUSPEND;
END;

CREATE OR ALTER trigger ttmodelo_b9u for tbmodelo
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.tipoproduto_codigo <> NEW.tipoproduto_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Tipo '||OLD.tipoproduto_codigo||'->'||NEW.tipoproduto_codigo;
       END
   if (OLD.familia_codigo <> NEW.familia_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Fam.'||OLD.familia_codigo||'->'||NEW.familia_codigo;
       END
   if (OLD.linha_codigo <> NEW.linha_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Lin.'||OLD.linha_codigo||'->'||NEW.linha_codigo;
       END
   if (OLD.unidademedida_sigla <> NEW.unidademedida_sigla) then
       BEGIN
       HISTORICO = HISTORICO||' UM.'||OLD.unidademedida_sigla||'->'||NEW.unidademedida_sigla;
       END
   if (OLD.descricao <> NEW.descricao) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.descricao||'->'||NEW.descricao;
       END
   if (OLD.descricao_nf <> NEW.descricao_nf) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.Cpl.'||OLD.descricao_nf||'->'||NEW.descricao_nf;
       END
   if (OLD.matriz_codigo <> NEW.matriz_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Mtz.'||OLD.matriz_codigo||'->'||NEW.matriz_codigo;
       END
   if (OLD.grade_codigo <> NEW.grade_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Grd.'||OLD.grade_codigo||'->'||NEW.grade_codigo;
       END
   if (OLD.classificacao <> NEW.classificacao) then
       BEGIN
       HISTORICO = HISTORICO||' Class.'||OLD.classificacao||'->'||NEW.classificacao;
       END
   if (OLD.compra_produz <> NEW.compra_produz) then
       BEGIN
       HISTORICO = HISTORICO||' Form.Entr.Est.'||OLD.compra_produz||'->'||NEW.compra_produz;
       END
   if (OLD.Densidade <> NEW.Densidade) then
       BEGIN
       HISTORICO = HISTORICO||' Dens.'||OLD.Densidade||'->'||NEW.Densidade;
       END
   if (OLD.Espessura<> NEW.Espessura) then
       BEGIN
       HISTORICO = HISTORICO||' Esp.'||OLD.Espessura||'->'||NEW.Espessura;
       END
   if (OLD.Tipo_Tag <> NEW.Tipo_Tag) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Tag '||OLD.Tipo_Tag||'->'||NEW.Tipo_Tag;
       END
   if (OLD.Acrescimo <> NEW.Acrescimo) then
       BEGIN
       HISTORICO = HISTORICO||' Acresc.'||OLD.Acrescimo||'->'||NEW.Acrescimo;
       END
   if (OLD.Prioridade <> NEW.Prioridade) then
       BEGIN
       HISTORICO = HISTORICO||' Prior.Prod.'||OLD.Prioridade||'->'||NEW.Prioridade;
       END
   if (OLD.Horas_Bloqueio <> NEW.Horas_Bloqueio) then
       BEGIN
       HISTORICO = HISTORICO||' Hr.Blq.'||OLD.Horas_Bloqueio||'->'||NEW.Horas_Bloqueio;
       END
   if (OLD.Gerar_Remessa <> NEW.Gerar_Remessa) then
       BEGIN
       HISTORICO = HISTORICO||' Hab.Ger.Rem.'||OLD.Gerar_Remessa||'->'||NEW.Gerar_Remessa;
       END
   if (OLD.Modelo_Pai <> NEW.Modelo_Pai) then
       BEGIN
       HISTORICO = HISTORICO||' Modelo Pai:'||OLD.Modelo_Pai||'->'||NEW.Modelo_Pai;
       END

   if (OLD.t01 <> NEW.t01) then BEGIN HISTORICO = HISTORICO||' T01 '||OLD.t01||'->'||NEW.t01; END
   if (OLD.t02 <> NEW.t02) then BEGIN HISTORICO = HISTORICO||' T02 '||OLD.t02||'->'||NEW.t02; END
   if (OLD.t03 <> NEW.t03) then BEGIN HISTORICO = HISTORICO||' T03 '||OLD.t03||'->'||NEW.t03; END
   if (OLD.t04 <> NEW.t04) then BEGIN HISTORICO = HISTORICO||' T04 '||OLD.t04||'->'||NEW.t04; END
   if (OLD.t05 <> NEW.t05) then BEGIN HISTORICO = HISTORICO||' T05 '||OLD.t05||'->'||NEW.t05; END
   if (OLD.t06 <> NEW.t06) then BEGIN HISTORICO = HISTORICO||' T06 '||OLD.t06||'->'||NEW.t06; END
   if (OLD.t07 <> NEW.t07) then BEGIN HISTORICO = HISTORICO||' T07 '||OLD.t07||'->'||NEW.t07; END
   if (OLD.t08 <> NEW.t08) then BEGIN HISTORICO = HISTORICO||' T08 '||OLD.t08||'->'||NEW.t08; END
   if (OLD.t09 <> NEW.t09) then BEGIN HISTORICO = HISTORICO||' T09 '||OLD.t09||'->'||NEW.t09; END
   if (OLD.t10 <> NEW.t10) then BEGIN HISTORICO = HISTORICO||' T10 '||OLD.t10||'->'||NEW.t10; END
   if (OLD.t11 <> NEW.t11) then BEGIN HISTORICO = HISTORICO||' T11 '||OLD.t11||'->'||NEW.t11; END
   if (OLD.t12 <> NEW.t12) then BEGIN HISTORICO = HISTORICO||' T12 '||OLD.t12||'->'||NEW.t12; END
   if (OLD.t13 <> NEW.t13) then BEGIN HISTORICO = HISTORICO||' T13 '||OLD.t13||'->'||NEW.t13; END
   if (OLD.t14 <> NEW.t14) then BEGIN HISTORICO = HISTORICO||' T14 '||OLD.t14||'->'||NEW.t14; END
   if (OLD.t15 <> NEW.t15) then BEGIN HISTORICO = HISTORICO||' T15 '||OLD.t15||'->'||NEW.t15; END
   if (OLD.t16 <> NEW.t16) then BEGIN HISTORICO = HISTORICO||' T16 '||OLD.t16||'->'||NEW.t16; END
   if (OLD.t17 <> NEW.t17) then BEGIN HISTORICO = HISTORICO||' T17 '||OLD.t17||'->'||NEW.t17; END
   if (OLD.t18 <> NEW.t18) then BEGIN HISTORICO = HISTORICO||' T18 '||OLD.t18||'->'||NEW.t18; END
   if (OLD.t19 <> NEW.t19) then BEGIN HISTORICO = HISTORICO||' T19 '||OLD.t19||'->'||NEW.t19; END
   if (OLD.t11 <> NEW.t20) then BEGIN HISTORICO = HISTORICO||' T20 '||OLD.t20||'->'||NEW.t20; END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBMODELO', OLD.CODIGO,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
end;
CREATE OR ALTER trigger ttblinha_perfil_b9u for tblinha_perfil
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;


ALTER TABLE TBLINHA_PERFIL ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBLINHA_PERFIL set OLD_PERFIL = PERFIL;
ALTER TABLE TBLINHA_PERFIL DROP PERFIL;
ALTER TABLE TBLINHA_PERFIL ADD PERFIL VARCHAR(10) DEFAULT '';
update TBLINHA_PERFIL set PERFIL = OLD_PERFIL;
ALTER TABLE TBLINHA_PERFIL DROP OLD_PERFIL;

CREATE OR ALTER trigger ttblinha_perfil_b9u for tblinha_perfil
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.CAP_PRODUTIVA <> NEW.CAP_PRODUTIVA) then
       BEGIN
       HISTORICO = HISTORICO||' Cap.'||OLD.CAP_PRODUTIVA||'->'||NEW.CAP_PRODUTIVA;
       END
   if (OLD.MULTIPLICADOR <> NEW.MULTIPLICADOR) then
       BEGIN
       HISTORICO = HISTORICO||' Mult.'||OLD.MULTIPLICADOR||'->'||NEW.MULTIPLICADOR;
       END
   if (OLD.PERFIL <> NEW.PERFIL) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.PERFIL||'->'||NEW.PERFIL;
       END

   if (HISTORICO <> '') Then
       Begin
       HISTORICO = 'Tam. ['||OLD.TAMANHO||'] - '||HISTORICO;
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBLINHA', OLD.LINHA_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
End;

DROP INDEX ITBGP_PERFIL_SKU_01;
DROP INDEX ITBGP_PERFIL_SKU_02;

CREATE OR ALTER trigger ttbgp_perfil_sku_b9u for tbgp_perfil_sku
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

ALTER TABLE TBGP_PERFIL_SKU ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBGP_PERFIL_SKU set OLD_PERFIL = PERFIL;
ALTER TABLE TBGP_PERFIL_SKU DROP PERFIL;
ALTER TABLE TBGP_PERFIL_SKU ADD PERFIL VARCHAR(10) DEFAULT '';
update TBGP_PERFIL_SKU set PERFIL = OLD_PERFIL;
ALTER TABLE TBGP_PERFIL_SKU DROP OLD_PERFIL;

CREATE INDEX ITBGP_PERFIL_SKU_01 ON TBGP_PERFIL_SKU (GP_ID,PERFIL);
CREATE INDEX ITBGP_PERFIL_SKU_02 ON TBGP_PERFIL_SKU (PERFIL);

CREATE OR ALTER trigger ttbgp_perfil_sku_b9u for tbgp_perfil_sku
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.MULTIPLICADOR <> NEW.MULTIPLICADOR) then
       BEGIN
       HISTORICO = HISTORICO||'Perfil '||OLD.PERFIL||' Mult.'||OLD.MULTIPLICADOR||'->'||NEW.MULTIPLICADOR;
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBESTEIRA', OLD.GP_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
End;


ALTER TABLE TBFAMILIA ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBFAMILIA set OLD_PERFIL = PERFIL;
ALTER TABLE TBFAMILIA DROP PERFIL;
ALTER TABLE TBFAMILIA ADD PERFIL VARCHAR(10) DEFAULT '';
update TBFAMILIA set PERFIL = OLD_PERFIL;
ALTER TABLE TBFAMILIA DROP OLD_PERFIL;DROP INDEX ITBESTEIRA_05;

CREATE OR ALTER VIEW TBGP(
    ID,
    DESCRICAO,
    FAMILIA_ID,
    PERFIL,
    STATUS,
    REMESSAS,
    DOM,
    SEG,
    TER,
    QUA,
    QUI,
    SEX,
    SAB,
    TEMPO,
    CODIGO1,
    H_SEG,
    H_TER,
    H_QUA,
    H_QUI,
    H_SEX,
    H_SAB,
    H_DOM,
    SUPERVISOR1,
    SUPERVISOR2,
    REG_ESTOQUE,
    REG_QUANTIDADE,
    FLAG,
    MONITOR,
    PERFIL_PED,
    MENSAGEM,
    CCUSTO,
    DIAS,
    VER_PECA_DISPONIVEL,
    VER_PARES,
    HABILITA_QUEBRA_TALAO_SKU,
    REQUISITA_SOBRA)
AS
SELECT
    CODIGO,
    DESCRICAO,
    FAMILIA_CODIGO,
    '' as PERFIL,
    STATUS,
    TALOES,
    DOM,
    SEG,
    TER,
    QUA,
    QUI,
    SEX,
    SAB,
    TEMPO,
    CODIGO1,
    H_SEG,
    H_TER,
    H_QUA,
    H_QUI,
    H_SEX,
    H_SAB,
    H_DOM,
    SUPERVISOR1,
    SUPERVISOR2,
    REG_ESTOQUE,
    REG_QUANTIDADE,
    FLAG,
    MONITOR,
    PERFIL_PED,
    MENSAGEM,
    CCUSTO,
    TALOES,
    VER_PECA_DISPONIVEL,
    VER_PARES,
    HABILITA_QUEBRA_TALAO_SKU,
    REQUISITA_SOBRA
FROM TBESTEIRA
;

CREATE OR ALTER trigger ttbesteira_b0iu_01 for tbesteira
active before insert or update position 0
AS
DECLARE VARIABLE ID INTEGER;
begin

end;

CREATE OR ALTER trigger ttbesteira_b9u for tbesteira
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(1000);
begin

end;

ALTER TABLE TBESTEIRA ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBESTEIRA set OLD_PERFIL = PERFIL;
ALTER TABLE TBESTEIRA DROP PERFIL;
ALTER TABLE TBESTEIRA ADD PERFIL VARCHAR(10) DEFAULT '';
update TBESTEIRA set PERFIL = OLD_PERFIL;
ALTER TABLE TBESTEIRA DROP OLD_PERFIL;

CREATE INDEX ITBESTEIRA_05 ON TBESTEIRA (PERFIL);

CREATE OR ALTER trigger ttbesteira_b9u for tbesteira
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(1000);
begin

   HISTORICO = '';

   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   if (OLD.Perfil <> NEW.Perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Perfil||'->'||NEW.Perfil;
       END
   if (OLD.Perfil_Ped <> NEW.Perfil_Ped) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.Ped.'||OLD.Perfil_Ped||'->'||NEW.Perfil_Ped;
       END
   if (OLD.FAMILIA_CODIGO <> NEW.FAMILIA_CODIGO) then
       BEGIN
       HISTORICO = HISTORICO||' Fam.'||OLD.FAMILIA_CODIGO||'->'||NEW.FAMILIA_CODIGO;
       END
   if (OLD.CODIGO1 <> NEW.CODIGO1) then
       BEGIN
       HISTORICO = HISTORICO||' Cod.Bar.'||OLD.CODIGO1||'->'||NEW.CODIGO1;
       END
   if (OLD.Taloes <> NEW.Taloes) then
       BEGIN
       HISTORICO = HISTORICO||' Rem.Aber.'||OLD.Taloes||'->'||NEW.Taloes;
       END

   if (OLD.REG_ESTOQUE <> NEW.REG_ESTOQUE) then
       BEGIN
       HISTORICO = HISTORICO||' Reg.Est.'||OLD.REG_ESTOQUE||'->'||NEW.REG_ESTOQUE;
       END

   if (OLD.REG_QUANTIDADE <> NEW.REG_QUANTIDADE) then
       BEGIN
       HISTORICO = HISTORICO||' Reg.Qtd.'||OLD.REG_QUANTIDADE||'->'||NEW.REG_QUANTIDADE;
       END

   if (OLD.SUPERVISOR1 <> NEW.SUPERVISOR1) then
       BEGIN
       HISTORICO = HISTORICO||' Superv.1:'||OLD.SUPERVISOR1||'->'||NEW.SUPERVISOR1;
       END
   if (OLD.SUPERVISOR2 <> NEW.SUPERVISOR2) then
       BEGIN
       HISTORICO = HISTORICO||' Superv.2:'||OLD.SUPERVISOR2||'->'||NEW.SUPERVISOR2;
       END

   if (OLD.BSC_GRUPO <> NEW.BSC_GRUPO) then
       BEGIN
       HISTORICO = HISTORICO||' Grp.BSC:'||OLD.BSC_GRUPO||'->'||NEW.BSC_GRUPO;
       END
   if (OLD.CCUSTO <> NEW.CCUSTO) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo:'||OLD.CCUSTO||'->'||NEW.CCUSTO;
       END
   if (OLD.PRAZO_PRODUCAO <> NEW.PRAZO_PRODUCAO) then
       BEGIN
       HISTORICO = HISTORICO||' Pzo.Prod:'||OLD.PRAZO_PRODUCAO||'->'||NEW.PRAZO_PRODUCAO;
       END
   if (OLD.PERC_INEFICIENCIA <> NEW.PERC_INEFICIENCIA) then
       BEGIN
       HISTORICO = HISTORICO||' % Inefic.'||OLD.PERC_INEFICIENCIA||'->'||NEW.PERC_INEFICIENCIA;
       END

   if (OLD.PRODUCAO <> NEW.PRODUCAO) then
       BEGIN
       HISTORICO = HISTORICO||' Cap.Prod:'||OLD.PRODUCAO||'->'||NEW.PRODUCAO;
       END

   if (OLD.SEG  <> NEW.SEG or OLD.H_SEG <> NEW.H_SEG) then
       BEGIN
       HISTORICO = HISTORICO||' Min.SEG.'||OLD.SEG||'->'||NEW.SEG||' Hor.'||OLD.H_SEG||'->'||NEW.H_SEG;
       END
   if (OLD.TER  <> NEW.TER or OLD.H_TER <> NEW.H_TER) then
       BEGIN
       HISTORICO = HISTORICO||' Min.TER.'||OLD.TER||'->'||NEW.TER||' Hor.'||OLD.H_TER||'->'||NEW.H_TER;
       END
   if (OLD.QUA  <> NEW.QUA or OLD.H_QUA <> NEW.H_QUA) then
       BEGIN
       HISTORICO = HISTORICO||' Min.QUA.'||OLD.QUA||'->'||NEW.QUA||' Hor.'||OLD.H_QUA||'->'||NEW.H_QUA;
       END
   if (OLD.QUI  <> NEW.QUI or OLD.H_QUI <> NEW.H_QUI) then
       BEGIN
       HISTORICO = HISTORICO||' Min.QUI.'||OLD.QUI||'->'||NEW.QUI||' Hor.'||OLD.H_QUI||'->'||NEW.H_QUI;
       END
   if (OLD.SEX  <> NEW.SEX or OLD.H_SEX <> NEW.H_SEX) then
       BEGIN
       HISTORICO = HISTORICO||' Min.SEX.'||OLD.SEX||'->'||NEW.SEX||' Hor.'||OLD.H_SEX||'->'||NEW.H_SEX;
       END
   if (OLD.SAB  <> NEW.SAB or OLD.H_SAB <> NEW.H_SAB) then
       BEGIN
       HISTORICO = HISTORICO||' Min.SAB.'||OLD.SAB||'->'||NEW.SAB||' Hor.'||OLD.H_SAB||'->'||NEW.H_SAB;
       END
   if (OLD.DOM  <> NEW.DOM or OLD.H_DOM <> NEW.H_DOM) then
       BEGIN
       HISTORICO = HISTORICO||' Min.DOM.'||OLD.DOM||'->'||NEW.DOM||' Hor.'||OLD.H_DOM||'->'||NEW.H_DOM;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (char_length(:HISTORICO) > 500) then
       BEGIN
       :HISTORICO = SUBSTRING(:HISTORICO from 1 for 500);
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBESTEIRA', OLD.CODIGO,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :HISTORICO);
       End
end;

CREATE OR ALTER trigger ttbesteira_b0iu_01 for tbesteira
active before insert or update position 0
AS
DECLARE VARIABLE ID INTEGER;
begin

   if (New.Familia_Codigo > 0) then
       Begin
       ID = Coalesce((Select First 1 F.Codigo From TbFamilia F Where F.Codigo = New.Familia_Codigo),0);
       if (id = 0) then
           Begin
           Exception "..." 'FAMÍLIA DE PRODUTOS INVÁLIDA!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

   if (Char_Length(New.CCusto) > 0) then
       Begin
       ID = Coalesce((Select First 1 C.ID From TbCentro_De_Custo C Where C.Codigo = New.CCusto),0);
       if (id = 0) then
           Begin
           Exception "..." 'CENTRO DE CUSTO INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End


   if (Char_Length(New.Perfil) > 0) then
       Begin
       ID = Coalesce((Select First 1 P.Controle From TbPerfil P Where P.ID = New.Perfil and P.Tabela = 'GP'),0);
       if (id = 0) then
           Begin
           Exception "..." 'PERFIL DE GRUPO DE PRODUÇÃO INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

   if (Char_Length(New.Perfil_Ped) > 0) then
       Begin
       ID = Coalesce((Select First 1 P.Controle From TbPerfil P Where P.ID = New.Perfil_Ped and P.Tabela = 'PED'),0);
       if (id = 0) then
           Begin
           Exception "..." 'PERFIL DE PEDIDOS INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

end;


CREATE OR ALTER VIEW TBGP(
    ID,
    DESCRICAO,
    FAMILIA_ID,
    PERFIL,
    STATUS,
    REMESSAS,
    DOM,
    SEG,
    TER,
    QUA,
    QUI,
    SEX,
    SAB,
    TEMPO,
    CODIGO1,
    H_SEG,
    H_TER,
    H_QUA,
    H_QUI,
    H_SEX,
    H_SAB,
    H_DOM,
    SUPERVISOR1,
    SUPERVISOR2,
    REG_ESTOQUE,
    REG_QUANTIDADE,
    FLAG,
    MONITOR,
    PERFIL_PED,
    MENSAGEM,
    CCUSTO,
    DIAS,
    VER_PECA_DISPONIVEL,
    VER_PARES,
    HABILITA_QUEBRA_TALAO_SKU,
    REQUISITA_SOBRA)
AS
SELECT
    CODIGO,
    DESCRICAO,
    FAMILIA_CODIGO,
    PERFIL,
    STATUS,
    TALOES,
    DOM,
    SEG,
    TER,
    QUA,
    QUI,
    SEX,
    SAB,
    TEMPO,
    CODIGO1,
    H_SEG,
    H_TER,
    H_QUA,
    H_QUI,
    H_SEX,
    H_SAB,
    H_DOM,
    SUPERVISOR1,
    SUPERVISOR2,
    REG_ESTOQUE,
    REG_QUANTIDADE,
    FLAG,
    MONITOR,
    PERFIL_PED,
    MENSAGEM,
    CCUSTO,
    TALOES,
    VER_PECA_DISPONIVEL,
    VER_PARES,
    HABILITA_QUEBRA_TALAO_SKU,
    REQUISITA_SOBRA
FROM TBESTEIRA
;
DROP INDEX ITBDEFEITO_TRANSACAO_ITEM_10;

DROP VIEW VWREGISTRO_DEFEITO_DIA;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b3iu for tbdefeito_transacao_item
active before insert or update position 3
AS
DECLARE VARIABLE REGISTRAR_SEM_TALAO VARCHAR(10);
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
BEGIN

end;

ALTER TABLE TBDEFEITO_TRANSACAO_ITEM ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBDEFEITO_TRANSACAO_ITEM set OLD_PERFIL = PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM DROP PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM ADD PERFIL VARCHAR(10) DEFAULT '';
update TBDEFEITO_TRANSACAO_ITEM set PERFIL = OLD_PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM DROP OLD_PERFIL;

CREATE INDEX ITBDEFEITO_TRANSACAO_ITEM_10 ON TBDEFEITO_TRANSACAO_ITEM (PERFIL);

CREATE OR ALTER trigger ttbdefeito_transacao_item_b3iu for tbdefeito_transacao_item
active before insert or update position 3
AS
DECLARE VARIABLE REGISTRAR_SEM_TALAO VARCHAR(10);
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
BEGIN

    REGISTRAR_SEM_TALAO = FN_PARAMETRO('TBUSUARIO.REG_DEF_SEM_TALAO',FN_CURRENT_USER_ID());

    IF ( REGISTRAR_SEM_TALAO = 0 ) THEN
    BEGIN
        IF ( COALESCE(NEW.REMESSA,0) = 0 OR COALESCE(NEW.REMESSA_CONTROLE,0) = 0 ) THEN
        BEGIN
            EXCEPTION "..." 'USUARIO NAO PERMITE REGISTRAR DEFEITO SEM REMESSA E TALAO.';
        END
    END

    IF ( NEW.REMESSA > 0 OR NEW.REMESSA_CONTROLE > 0 ) THEN
    BEGIN

        /* VERIFICA SE EH TALAO DETALHATADO */
        SELECT FIRST 1
               D.ESTABELECIMENTO_ID,
               D.PRODUTO_ID,
               D.TAMANHO,
               D.GP_ID
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.REMESSA_ID = NEW.REMESSA
           AND D.ID         = NEW.REMESSA_CONTROLE
          INTO :ESTABELECIMENTO_ID,
               :PRODUTO_ID,
               :TAMANHO,
               :GP_ID;

         /* VERIFICA SE EH TALAO ACUMUADLO */
         IF ( PRODUTO_ID IS NULL ) THEN
         BEGIN
            SELECT FIRST 1
                   T.ESTABELECIMENTO_ID,
                   T.PRODUTO_ID,
                   T.TAMANHO,
                   T.GP_ID
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_CONTROLE
              INTO :ESTABELECIMENTO_ID,
                   :PRODUTO_ID,
                   :TAMANHO,
                   :GP_ID;
         END

         IF ( PRODUTO_ID IS NULL ) THEN
         BEGIN
            EXCEPTION "..." 'TALAO INEXISTENTE.';
         END


         IF ( NEW.ESTABELECIMENTO_ID <> ESTABELECIMENTO_ID ) THEN
         BEGIN
            EXCEPTION "..." 'ESTABELECIMENTO NAO CONFERE.';
         END         

         IF ( NEW.ESTEIRA_ID <> GP_ID ) THEN
         BEGIN
            EXCEPTION "..." 'GP NAO CONFERE. ESPERADO: ' || COALESCE(FN_LPAD(GP_ID,3,0),'') || ' - ' || COALESCE(FN_DESCRICAO('TBGP',GP_ID),'');
         END

         IF ( NEW.PRODUTO_ID <> PRODUTO_ID ) THEN
         BEGIN
            EXCEPTION "..." 'PRODUTO NAO CONFERE. ESPERADO: ' || COALESCE(FN_LPAD(PRODUTO_ID,4,0),'') || ' - ' || COALESCE(FN_DESCRICAO('TBPRODUTO',PRODUTO_ID),'');
         END
         IF ( NEW.TAMANHO <> TAMANHO ) THEN
         BEGIN
            EXCEPTION "..." 'TAMANHO NAO CONFERE. ESPERADO: ' || COALESCE(FN_TAMANHO_PRODUTO(PRODUTO_ID,TAMANHO),'');
         END

    END

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin
      if (:vData <> New.Data) then
          Exception "..." 'Data de produção para registro de defeito inválida, a data liberada é '||
                          Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End


  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER VIEW VWREGISTRO_DEFEITO_DIA(
    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    DEFEITO_SETOR,
    DEFEITO_ID,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    TAMANHO,
    DENSIDADE,
    ESPESSURA)
AS
select

    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(Quantidade) as Quantidade,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    defeito_setor,
    defeito_id,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    cast(substring(Densidade from 1  for 10) as numeric(5,2)) DENSIDADE,
    cast(substring(Densidade from 11 for 20) as numeric(5,2)) espessura

from(
    Select
        
        B.Data DATA_REGISTRO,
        d.descricao as DEFEITO,
        d.setor as SETOR,
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
    
        B.Quantidade,
        IIF(B.TURNO=1,B.Quantidade,0) QTD_TURNO1,
        IIF(B.TURNO=2,B.Quantidade,0) QTD_TURNO2,
        1 as TALOES,
    
        d.setor  as defeito_setor,
        d.codigo as defeito_id,
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,

        p.familia_codigo as familia_id,
        b.estabelecimento_id,

        FN_TAMANHO_GRADE(p.grade_codigo, b.tamanho) tamanho,

        (Select First 1
      Coalesce((Select First 1 lpad(M.Densidade,10,0)||lpad(m.espessura,10,0)
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.codigo
       and MC.Produto_Id = P2.Codigo
       and P2.Familia_Codigo = F.Codigo
       and F.Densidade_Espessura = '1'

       and((b.tamanho = 1 and MC.T01 > 0) or
           (b.Tamanho = 2 and MC.T02 > 0) or
           (b.Tamanho = 3 and MC.T03 > 0) or
           (b.Tamanho = 4 and MC.T04 > 0) or
           (b.Tamanho = 5 and MC.T05 > 0) or
           (b.Tamanho = 6 and MC.T06 > 0) or
           (b.Tamanho = 7 and MC.T07 > 0) or
           (b.Tamanho = 8 and MC.T08 > 0) or
           (b.Tamanho = 9 and MC.T09 > 0) or
           (b.Tamanho =10 and MC.T10 > 0) or
           (b.Tamanho =11 and MC.T11 > 0) or
           (b.Tamanho =12 and MC.T12 > 0) or
           (b.Tamanho =13 and MC.T13 > 0) or
           (b.Tamanho =14 and MC.T14 > 0) or
           (b.Tamanho =15 and MC.T15 > 0) or
           (b.Tamanho =16 and MC.T16 > 0) or
           (b.Tamanho =17 and MC.T17 > 0) or
           (b.Tamanho =18 and MC.T18 > 0) or
           (b.Tamanho =19 and MC.T19 > 0) or
           (b.Tamanho =20 and MC.T20 > 0))) as Densidade
    
    From TbDefeito_Transacao_Item B,tbsac_defeito d, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    Where B.Esteira_id = E.Codigo
      and B.Produto_id = P.Codigo
      --and B.Estabelecimento_Id = :ESTABELECIMENTO
      --and B.Data between :DATA1 and :DATA2
      AND (B.DEFEITO_ID > 0)
      --and P.Familia_Codigo = :FAMILIA
      and m.codigo = p.modelo_codigo
      and d.codigo = b.defeito_id
      and c.codigo = p.cor_codigo
      and r.codigo = m.linha_codigo
      and s.id = b.perfil
      and s.tabela = 'SKU'
      and s.familia_id = p.familia_codigo

)

        group by
        DATA_REGISTRO,
        DEFEITO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        defeito_setor,
        defeito_id,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade,
        espessura
;

CREATE OR ALTER trigger ttbcusto_margem_sku_b01d for tbcusto_margem_sku
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b01u for tbcusto_margem_sku
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b02i for tbcusto_margem_sku
active before insert position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

end;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

end;

ALTER TABLE TBCUSTO_MARGEM_SKU ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBCUSTO_MARGEM_SKU set OLD_PERFIL = PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU DROP PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU ADD PERFIL VARCHAR(10) DEFAULT '';
update TBCUSTO_MARGEM_SKU set PERFIL = OLD_PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU DROP OLD_PERFIL;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

  :INIVEL = :INIVEL + 1;

  for
  select * from(
        select distinct
            p.descricao,
            f.produto_consumo_id,
            :IPRODUTO_ID as PRODUTO_ID,
            f.tamanho_consumo_id,
    
            f.fator_conversao,
            f.custo_medio,
            0 as dolar,
    
            iif(:ITAMANHO = 00,T00, iif(:ITAMANHO = 10,T10,
            iif(:ITAMANHO = 01,T01, iif(:ITAMANHO = 11,T11,
            iif(:ITAMANHO = 02,T02, iif(:ITAMANHO = 12,T12,
            iif(:ITAMANHO = 03,T03, iif(:ITAMANHO = 13,T13,
            iif(:ITAMANHO = 04,T04, iif(:ITAMANHO = 14,T14,
            iif(:ITAMANHO = 05,T05, iif(:ITAMANHO = 15,T15,
            iif(:ITAMANHO = 06,T06, iif(:ITAMANHO = 16,T16,
            iif(:ITAMANHO = 07,T07, iif(:ITAMANHO = 17,T17,
            iif(:ITAMANHO = 08,T08, iif(:ITAMANHO = 18,T18,
            iif(:ITAMANHO = 09,T09, iif(:ITAMANHO = 19,T19,
            iif(:ITAMANHO = 20,T20,0))))))))))))))))))))) as T,
    
            iif(:ITAMANHO = 00,C00, iif(:ITAMANHO = 10,C10,
            iif(:ITAMANHO = 01,C01, iif(:ITAMANHO = 11,C11,
            iif(:ITAMANHO = 02,C02, iif(:ITAMANHO = 12,C12,
            iif(:ITAMANHO = 03,C03, iif(:ITAMANHO = 13,C13,
            iif(:ITAMANHO = 04,C04, iif(:ITAMANHO = 14,C14,
            iif(:ITAMANHO = 05,C05, iif(:ITAMANHO = 15,C15,
            iif(:ITAMANHO = 06,C06, iif(:ITAMANHO = 16,C16,
            iif(:ITAMANHO = 07,C07, iif(:ITAMANHO = 17,C17,
            iif(:ITAMANHO = 08,C08, iif(:ITAMANHO = 18,C18,
            iif(:ITAMANHO = 09,C09, iif(:ITAMANHO = 19,C19,
            iif(:ITAMANHO = 20,C20,0))))))))))))))))))))) as C,
    
            iif(:ITAMANHO = 00,CS00, iif(:ITAMANHO = 10,CS10,
            iif(:ITAMANHO = 01,CS01, iif(:ITAMANHO = 11,CS11,
            iif(:ITAMANHO = 02,CS02, iif(:ITAMANHO = 12,CS12,
            iif(:ITAMANHO = 03,CS03, iif(:ITAMANHO = 13,CS13,
            iif(:ITAMANHO = 04,CS04, iif(:ITAMANHO = 14,CS14,
            iif(:ITAMANHO = 05,CS05, iif(:ITAMANHO = 15,CS15,
            iif(:ITAMANHO = 06,CS06, iif(:ITAMANHO = 16,CS16,
            iif(:ITAMANHO = 07,CS07, iif(:ITAMANHO = 17,CS17,
            iif(:ITAMANHO = 08,CS08, iif(:ITAMANHO = 18,CS18,
            iif(:ITAMANHO = 09,CS09, iif(:ITAMANHO = 19,CS19,
            iif(:ITAMANHO = 20,CS20,0))))))))))))))))))))) as CS,
    
            iif(:ITAMANHO = 00,CO00, iif(:ITAMANHO = 10,CO10,
            iif(:ITAMANHO = 01,CO01, iif(:ITAMANHO = 11,CO11,
            iif(:ITAMANHO = 02,CO02, iif(:ITAMANHO = 12,CO12,
            iif(:ITAMANHO = 03,CO03, iif(:ITAMANHO = 13,CO13,
            iif(:ITAMANHO = 04,CO04, iif(:ITAMANHO = 14,CO14,
            iif(:ITAMANHO = 05,CO05, iif(:ITAMANHO = 15,CO15,
            iif(:ITAMANHO = 06,CO06, iif(:ITAMANHO = 16,CO16,
            iif(:ITAMANHO = 07,CO07, iif(:ITAMANHO = 17,CO17,
            iif(:ITAMANHO = 08,CO08, iif(:ITAMANHO = 18,CO18,
            iif(:ITAMANHO = 09,CO09, iif(:ITAMANHO = 19,CO19,
            iif(:ITAMANHO = 20,CO20,0))))))))))))))))))))) as CO,

            0 TS,
            0 "TO",
            0 CMS,
            0 CMO,
            0 CMOIP,
            0 CMOIA,
            0 CSMOIP,
            0 CSMOIA,
            0 PERDA,
            P.familia_codigo,
            P.modelo_codigo,
            P.cor_codigo
    
        from tbproduto p, tbficha_tecnica f
        
        where f.produto_id = :IPRODUTO_ID
        and p.codigo = f.produto_consumo_id
        and f.ano = :IANO
        and f.mes = :IMES
    ) where T > 0

  into
    :PRODUTO_DESCRICAO,
    :PRODUTO_CONSUMO,
    :ORIGEM,
    :TAMANHO_CONSUMO,
    :FATOR_CONVERSAO,
    :CUSTO_MEDIO,
    :DOLAR,
    :T,
    :C,
    :CS,
    :CO,
    :TS,
    :"TO",
    :CMS,
    :CMO,
    :CMOIP,
    :CMOIA,
    :CSMOIP,
    :CSMOIA,
    :PERDA,
    :FAMILIA_ID,
    :MODELO_ID,
    :COR_ID
  do begin
    :TAMANHO = :ITAMANHO;
    :NIVEL   = :INIVEL;

    select F.familia_codigo FROM tbproduto F WHERE F.codigo = :IPRODUTO_ID
    INTO :FAMILIA_ID;


    MARGEM = coalesce((select first 1
                (sk.margem + 100.0000) / 100.00 as MARGEM
            from tbcusto_margem_sku sk,vwsku ss
                where sk.familia_id = :FAMILIA_ID
                and ss.modelo_id = :MODELO_ID
                and ss.cor_id = :COR_ID
                and ss.perfil = sk.perfil
                and ss.tamanho = :TAMANHO_CONSUMO),1.0000);

    :TROCA = 0;
    
    if(:IGENEALOGIA = '')then
    begin
        :GENEALOGIA = :ORIGEM;
    end else
    begin
        :GENEALOGIA = :IGENEALOGIA||'#'||:ORIGEM;
    end
    suspend;

    if(:PRODUTO_CONSUMO <> :IPRODUTO_ID)then
    begin

        for
          select
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            ORIGEM,
            TAMANHO_CONSUMO,
            FATOR_CONVERSAO,
            CUSTO_MEDIO,
            T,
            C,
            CS,
            CO,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            TAMANHO,
            GENEALOGIA,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID
          from spc_estrutura_absorvido(:IANO,:IMES,:TAMANHO_CONSUMO,:INIVEL,:PRODUTO_CONSUMO, :GENEALOGIA)
        into
            :NIVEL,
            :PRODUTO_DESCRICAO,
            :PRODUTO_CONSUMO,
            :ORIGEM,
            :TAMANHO_CONSUMO,
            :FATOR_CONVERSAO,
            :CUSTO_MEDIO,
            :T,
            :C,
            :CS,
            :CO,
            :TS,
            :"TO",
            :CMS,
            :CMO,
            :CMOIP,
            :CMOIA,
            :CSMOIP,
            :CSMOIA,
            :PERDA,
            :TAMANHO,
            :GENEALOGIA,
            :DOLAR,
            :MARGEM,
            :FAMILIA_ID,
            :MODELO_ID,
            :COR_ID
        do begin
           suspend;
        end
    end

  end
end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

--in autonomous transaction do
--if(true)then
--begin
    delete from tmpcusto_produto;

    iproduto_troca      = '';
    modelo_original     = imodelo_id;
    tamanho_original    = itamanho;
    meses               = 1;
    validar_ficha       = 0;
    tipo_custo          = 1;
    taxa_dolar          = 0;

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        o.familia_codigo,
        o.modelo_codigo,
        o.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID
        from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin

            if(:FILHOS > 0)then
            begin

                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO;

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :FAMILIA_ID,
                    :MODELO_ID,
                    :COR_ID
                do begin

                       --/*
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);
                      --*/


                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;

                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                h.custo  = h.custo_medio,
                h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                */

                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;

        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
        --and k.nivel = -1
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :FAMILIA_ID,
        :MODELO_ID,
        :COR_ID
    do begin

        for
            select first 1
                c.fator_setup
            from tbregra_calculo_custo c, tbproduto p
            where c.familia_id = p.familia_codigo
            and p.codigo = :PRODUTO_CONSUMO
        into
            :fator_setup
        do begin

            :CMS     = :CMS     / :quantidade;
            :CSMOIP  = :CSMOIP  / :quantidade;
            :CSMOIA  = :CSMOIA  / :quantidade;

            :CS      = :CS      / :fator_setup;
            :CSIP    = :CSIP    / :fator_setup;
            :CSIA    = :CSIA    / :fator_setup;

        end

        suspend;
  end
  --end

  --suspend;
end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);

    :OLD_ANO = :IANO;
    :OLD_MES = :IMES;

        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,0,0,0
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO_V2(:OLD_ANO,:OLD_MES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_id,
                    :modelo_id,
                    :cor_id
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);


        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
