CREATE OR REPLACE TRIGGER TR_PAF_FISCAL_ML2
  before delete or insert or update on FISCAL_ML2
  REFERENCING NEW AS NEW OLD AS OLD
  for each row
  declare
    impressora_id number;

    tipoReg varchar(2);
    cnpjMatriz varchar(14);
    ieEmpTransp varchar(14);
    imEmpTransp varchar(14);
    numSerie20 varchar(20);
    mfAdicional varchar(1);
    tipoEcf varchar(7);
    marca varchar(20);
    modelo varchar(20);
    numUsuario varchar(2);
    ccf varchar(6); --M
    coo varchar(6);
    gnf varchar(6); --L
    grg varchar(6); --L
    dataEmissao varchar(8);
    horaEmissao varchar(6);
    modalidade varchar(2);
    categoria varchar(2);
    identLinha varchar(8);
    codOrigem varchar(20);
    codDestino varchar(20);
    tipoServico varchar(2);
    dataViagem varchar(8);
    horaViagem varchar(6);
    tipoViagem varchar(2);
    poltrona varchar(7);
    plataforma varchar(15);
    codDesconto varchar(8);
    valorTarifa varchar(8);
    aliquota varchar(4); --M
    pedagio varchar(8);
    taxaEmbarque varchar(8);
    valorTotal varchar(8);
    formaPago varchar(2);
    valorPago varchar(8);
    nomePassageiro varchar(50);
    numDocIdentif varchar(40);
    sac varchar(15);
    agencia varchar(35);

    info varchar(433);
  begin
    impressora_id := 0;

    IF DELETING THEN
      impressora_id := :OLD.fiscalimpressora_id;
    ELSIF INSERTING THEN
      impressora_id := :NEW.fiscalimpressora_id;
    END IF;

    if user <> 'VTABOL' then
      update punto_venta p set p.pafinvalido = 1 where p.puntoventa_id = (select puntoventa_id from fiscal_impressora where fiscalimpressora_id = impressora_id);
    end if;

    if INSERTING or UPDATING then
        tipoReg := nvl(:NEW.tipoReg, '');
        cnpjMatriz := nvl(:NEW.cnpjMatriz, '');
        ieEmpTransp := nvl(:NEW.ieEmpTransp, '');
        imEmpTransp := nvl(:NEW.imEmpTransp, '');
        numSerie20 := nvl(:NEW.numserie20, '');
        mfAdicional := nvl(:NEW.mfAdicional, '');
        tipoEcf := nvl(:NEW.tipoEcf, '');
        marca := nvl(:NEW.marca, '');
        modelo := nvl(:NEW.modelo, '');
        numUsuario := nvl(:NEW.numUsuario, '');
        coo := nvl(:NEW.coo, '');
        dataEmissao := nvl(:NEW.dataEmissao, '');
        horaEmissao := nvl(:NEW.horaEmissao, '');
        modalidade := nvl(:NEW.modalidade, '');
        categoria := nvl(:NEW.categoria, '');
        identLinha := nvl(:NEW.identLinha, '');
        codOrigem := nvl(:NEW.codOrigem, '');
        codDestino := nvl(:NEW.codDestino, '');
        tipoServico := nvl(:NEW.tipoServico, '');
        dataViagem := nvl(:NEW.dataViagem, '');
        horaViagem := nvl(:NEW.horaViagem, '');
        tipoViagem := nvl(:NEW.tipoViagem, '');
        poltrona := nvl(:NEW.poltrona, '');
        plataforma := nvl(:NEW.plataforma, '');
        codDesconto := nvl(:NEW.codDesconto, '');
        valorTarifa := nvl(:NEW.valorTarifa, '');
        pedagio := nvl(:NEW.pedagio, '');
        taxaEmbarque := nvl(:NEW.taxaEmbarque, '');
        valorTotal := nvl(:NEW.valorTotal, '');
        formaPago := nvl(:NEW.formaPago, '');
        valorPago := nvl(:NEW.valorPago, '');
        nomePassageiro := nvl(:NEW.nomePassageiro, '');
        numDocIdentif := nvl(:NEW.numDocIdentif, '');
        sac := nvl(:NEW.sac, '');
        agencia := nvl(:NEW.agencia, '');

        if UPPER(tipoReg) = 'M2' then
            ccf := nvl(:NEW.ccf, '');
            aliquota := nvl(:NEW.aliquota, '');
            gnf := '';
            grg := '';
        else
            gnf := nvl(:NEW.gnf, '');
            grg := nvl(:NEW.grg, '');
            ccf := '';
            aliquota := '';
        end if;

        --info := tipoReg || cnpjMatriz || ieEmpTransp || imEmpTransp || numSerie20 || mfAdicional || tipoEcf || marca || modelo || numUsuario || ccf || coo || gnf || grg || dataEmissao || horaEmissao || modalidade || categoria || identLinha || codOrigem || codDestino || tipoServico || dataViagem || horaViagem || tipoViagem || poltrona || plataforma || codDesconto || valorTarifa || aliquota || pedagio || taxaEmbarque || valorTotal || formaPago || valorPago || nomePassageiro || numDocIdentif || sac || agencia;
        --info := SYS.DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW (info, 'AL32UTF8'), 2);
        info := SYS.DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW (tipoReg || cnpjMatriz || ieEmpTransp || imEmpTransp || numSerie20 || mfAdicional || tipoEcf || marca || modelo || numUsuario || ccf || coo || gnf || grg || dataEmissao || horaEmissao || modalidade || categoria || identLinha || codOrigem || codDestino || tipoServico || dataViagem || horaViagem || tipoViagem || poltrona || plataforma || codDesconto || valorTarifa || aliquota || pedagio || taxaEmbarque || valorTotal || formaPago || valorPago || nomePassageiro || numDocIdentif || sac || agencia, 'AL32UTF8'), 2);

        if user <> 'VTABOL' then
          :NEW.hashbd := info;
        else
          :NEW.hashvta := SYS.DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('RJA2014' || info, 'AL32UTF8'), 2);
          :NEW.hashbd := info;
        end if;
    end if;
  end;