CREATE OR ALTER PROCEDURE SP_NF_LANCAMENTO_PARCELA (
    ORIGEM VARCHAR(3),
    NF_PARCELA_ID INTEGER,
    NF_ID INTEGER,
    ESTABELECIMENTO_CODIGO INTEGER,
    EMPRESA_CODIGO INTEGER,
    OPERACAO INTEGER,
    NUMERO_NOTAFISCAL INTEGER,
    PARCELA INTEGER,
    DATA DATE,
    VALOR_SALDO NUMERIC(10,5),
    VALOR_TOTAL NUMERIC(15,2),
    TIPO CHAR(1),
    SERIE VARCHAR(3),
    AVULSO CHAR(1),
    ACAO INTEGER)
AS
DECLARE VARIABLE VREGISTROS INTEGER;
BEGIN

  IF (ORIGEM = 'NFS') THEN
      BEGIN
          IF(ACAO = 1) THEN -- INCLUSAO DE LANÇAMENTOS DE PARCELAS
          BEGIN

             INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                ESTABELECIMENTO_CODIGO,
                EMPRESA_CODIGO,
                NFS_PARCELAMENTO_CONTROLE,
                OPERACAO_CODIGO,
                DOCUMENTO_NUMERO,
                PARCELA,
                REGISTRO_MESTRE,
                DATA,
                VALOR,
                VALOR_SALDO,
                VALOR_TOTAL,
                TIPO,
                SERIE,
                NFE_CONTROLE,
                NFS_CONTROLE,
                CODORIGEM,
                CONTA_DEBITO,
                CONTA_CREDITO
                )
                VALUES
                (
                :ESTABELECIMENTO_CODIGO,
                :EMPRESA_CODIGO,
                :NF_PARCELA_ID,
                :OPERACAO,
                :NUMERO_NOTAFISCAL,
                :PARCELA,
                '1',
                :DATA,
                :VALOR_TOTAL,
                :VALOR_SALDO,
                :VALOR_TOTAL,
                :TIPO,
                :SERIE,
                0,
                :NF_ID,
                IIF(:AVULSO='1','AVU','NFS'),
                '',
                ''
                );

          END
          IF(ACAO = 2) THEN -- DELETAR LANÇAMENTOS DE PARCELAS
          BEGIN
            VREGISTROS = (SELECT COUNT(CONTROLE)
                         FROM TBCAIXABANCO_LANCAMENTO_REG
                        WHERE NFS_CONTROLE = :NF_ID
                          AND NFS_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID);

            IF (VREGISTROS > 1) THEN
             EXCEPTION "..." 'PARCELAMENTO COM LANÇAMENTOS VINCULADOS, EXCLUSAO CANCELADA!';

            IF (VREGISTROS > 0 AND VALOR_SALDO <> VALOR_TOTAL) THEN
             EXCEPTION "..." 'PARCELAMENTO COM LANÇAMENTOS VINCULADOS, EXCLUSAO CANCELADA!';

            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFS_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID AND NFS_CONTROLE = :NF_ID;

          END

          IF(ACAO = 3) THEN -- ATUALIZAR LANÇAMENTO DE PARCELA

          BEGIN
             UPDATE TBCAIXABANCO_LANCAMENTO_REG SET
               ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO,
               EMPRESA_CODIGO = :EMPRESA_CODIGO,
               DOCUMENTO_NUMERO = :NUMERO_NOTAFISCAL,
               DATA = :DATA,
               SERIE = :SERIE
               WHERE NFS_CONTROLE = :NF_ID
                 AND NFS_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID
                 AND CODORIGEM = 'NFS' AND REGISTRO_MESTRE = 1;

          END

      END -- FIM PARA NFS

  IF (ORIGEM = 'NFE') THEN
      BEGIN
         IF(ACAO = 1) THEN -- INCLUSAO DE LANÇAMENTOS DE PARCELAS
          BEGIN

             INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                ESTABELECIMENTO_CODIGO,
                EMPRESA_CODIGO,
                NFE_PARCELAMENTO_CONTROLE,
                OPERACAO_CODIGO,
                DOCUMENTO_NUMERO,
                PARCELA,
                REGISTRO_MESTRE,
                DATA,
                VALOR_SALDO,
                VALOR,
                VALOR_TOTAL,
                TIPO,
                SERIE,
                NFE_CONTROLE,
                NFS_CONTROLE,
                CODORIGEM,
                CONTA_DEBITO,
                CONTA_CREDITO
                )
                VALUES
                (
                :ESTABELECIMENTO_CODIGO,
                :EMPRESA_CODIGO,
                :NF_PARCELA_ID,
                :OPERACAO,
                :NUMERO_NOTAFISCAL,
                :PARCELA,
                '1',
                :DATA,
                :VALOR_SALDO,
                :VALOR_TOTAL,
                :VALOR_TOTAL,
                :TIPO,
                :SERIE,
                :NF_ID,
                0,
                IIF(:AVULSO='1','AVU','NFE'),
                '',
                ''
                );

          END
          IF(ACAO = 2) THEN -- DELETAR LANÇAMENTOS DE PARCELAS
          BEGIN
            VREGISTROS = (SELECT COUNT(CONTROLE)
                         FROM TBCAIXABANCO_LANCAMENTO_REG
                        WHERE NFE_CONTROLE = :NF_ID
                          AND NFE_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID);

            IF (VREGISTROS > 1) THEN
             EXCEPTION "..." 'PARCELAMENTO COM LANÇAMENTOS VINCULADOS, EXCLUSAO CANCELADA!';

            IF (VREGISTROS > 0 AND VALOR_SALDO <> VALOR_TOTAL) THEN
             EXCEPTION "..." 'PARCELAMENTO COM LANÇAMENTOS VINCULADOS, EXCLUSAO CANCELADA!';

            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFE_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID AND NFE_CONTROLE = :NF_ID;

          END

          IF(ACAO = 3) THEN -- ATUALIZAR LANÇAMENTO DE PARCELA

          BEGIN
             UPDATE TBCAIXABANCO_LANCAMENTO_REG SET
               ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO,
               EMPRESA_CODIGO = :EMPRESA_CODIGO,
               DOCUMENTO_NUMERO = :NUMERO_NOTAFISCAL,
               DATA = :DATA,
               SERIE = :SERIE
               WHERE NFE_CONTROLE = :NF_ID
                 AND NFE_PARCELAMENTO_CONTROLE = :NF_PARCELA_ID
                 AND CODORIGEM = 'NFE' AND REGISTRO_MESTRE = 1;
          END



      END -- FIM PARA NFE

END;