public void execute(ServiceData serviceData) throws ServiceException {
    log.debug("::Iniciando execução do servico CancelarDocumentoPagamentoService");

    try {
      log.debug("Preparando os argumentos");
      IEntity<? extends DocumentoPagamento> inDocumento =
          (IEntity<? extends DocumentoPagamento>)
              serviceData.getArgumentList().getProperty(IN_DOCUMENTO);
      Calendar inDataCancelamento =
          (Calendar) serviceData.getArgumentList().getProperty(IN_DATA_CANCELAMENTO);

      IGerenciadorDocumentoPagamento gerenciador =
          this.retrieveGerenciadorPorDocumento((DocumentoPagamento) inDocumento.getObject());

      log.debug("Executando o método cancelarDocumento avulso do gerenciador");
      gerenciador.cancelarDocumento(inDocumento, inDataCancelamento, serviceData);

      log.debug("Adicionando a mensagem de sucesso: cancelarDocumento");
      this.addInfoMessage(serviceData, "CANCELAR_DOCUMENTO_SUCESSO", inDocumento.toString());

    } catch (BusinessException e) {
      log.fatal(e.getErrorList());
      /* O Serviço não precisa adicionar mensagem local. O Manager já indica qual srv falhou e os parâmetros. */
      throw new ServiceException(e.getErrorList());
    } catch (Exception e) {
      log.fatal(e.getMessage());

      /* Indica que o serviço falhou por causa de uma exceção do hibernate. */
      throw new ServiceException(MessageList.createSingleInternalError(e));
    }
  }
  @SuppressWarnings("unchecked")
  public void execute(ServiceData serviceData) throws ServiceException {
    log.debug("::Iniciando a execução do serviço ListarLancamentoMovimentoService");
    try {
      log.debug("Preparando os argumentos");
      /* Obrigatórios */
      String inPropriedadeData =
          (String) serviceData.getArgumentList().getProperty(IN_PROPRIEDADE_DATA);
      int inOrdem = (Integer) serviceData.getArgumentList().getProperty(IN_ORDEM);

      /* Opcionais */
      Long[] inContasId =
          (serviceData.getArgumentList().containsProperty(IN_CONTAS_ID_OPT)
              ? (Long[]) serviceData.getArgumentList().getProperty(IN_CONTAS_ID_OPT)
              : null);
      Calendar inDataInicial =
          (serviceData.getArgumentList().containsProperty(IN_DATA_INICIAL_OPT)
              ? (Calendar) serviceData.getArgumentList().getProperty(IN_DATA_INICIAL_OPT)
              : CalendarUtils.getCalendarBaseDate());
      Calendar inDataFinal =
          (serviceData.getArgumentList().containsProperty(IN_DATA_FINAL_OPT)
              ? (Calendar) serviceData.getArgumentList().getProperty(IN_DATA_FINAL_OPT)
              : null);
      Long inLancamentoId =
          (serviceData.getArgumentList().containsProperty(IN_LANCAMENTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_LANCAMENTO_ID_OPT)
              : null);
      Long inDocumentoId =
          (serviceData.getArgumentList().containsProperty(IN_DOCUMENTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_DOCUMENTO_ID_OPT)
              : null);
      Long inContratoId =
          (serviceData.getArgumentList().containsProperty(IN_CONTRATO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_CONTRATO_ID_OPT)
              : null);
      Long inItemCustoId =
          (serviceData.getArgumentList().containsProperty(IN_ITEM_CUSTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_ITEM_CUSTO_ID_OPT)
              : null);
      Long inDocumentoCobrancaCategoriaId =
          (serviceData.getArgumentList().containsProperty(IN_DOCUMENTO_COBRANCA_CATEGORIA_ID_OPT)
              ? (Long)
                  serviceData.getArgumentList().getProperty(IN_DOCUMENTO_COBRANCA_CATEGORIA_ID_OPT)
              : null);
      String inCpfCnpj =
          (serviceData.getArgumentList().containsProperty(IN_CPF_CNPJ_OPT)
              ? (String) serviceData.getArgumentList().getProperty(IN_CPF_CNPJ_OPT)
              : null);
      LancamentoMovimentoCategoria inTipoOperacao =
          (serviceData.getArgumentList().containsProperty(IN_TIPO_OPERACAO_OPT)
              ? (LancamentoMovimentoCategoria)
                  serviceData.getArgumentList().getProperty(IN_TIPO_OPERACAO_OPT)
              : null);
      Transacao inTransacao =
          (serviceData.getArgumentList().containsProperty(IN_TIPO_TRANSACAO_OPT)
              ? (Transacao) serviceData.getArgumentList().getProperty(IN_TIPO_TRANSACAO_OPT)
              : null);

      log.debug("Buscando registros");

      /* Montando a clausula SELECT */
      String sqlSelect = QueryLancamentoMovimento.SELECT;
      sqlSelect += " left outer join movimento.lancamento.lancamentos as lancamentos ";

      /* Montando a clausula WHERE */
      String sqlWhere = " where (true = true)";
      if (inContasId != null) {
        String listaContas = "";
        for (int i = 0; i < inContasId.length; i++) {
          if (i > 0) listaContas += ", ";
          listaContas += inContasId[i].toString();
        }
        sqlWhere +=
            " and (lancamentoMovimento." + LancamentoMovimento.CONTA + " in (" + listaContas + "))";
      }
      if (inLancamentoId != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + inLancamentoId
                + ")";
      if (inDocumentoId != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.DOCUMENTO_PAGAMENTO
                + " = "
                + Long.toString(inDocumentoId)
                + ")";
      if (inContratoId != null)
        sqlWhere +=
            " and (lancamentomovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + " = "
                + Long.toString(inContratoId)
                + ")";
      if (inItemCustoId != null)
        sqlWhere +=
            " and (lancamentos."
                + LancamentoItem.ITEM_CUSTO
                + " = "
                + Long.toString(inItemCustoId)
                + ")";
      if (inDocumentoCobrancaCategoriaId != null && inDocumentoCobrancaCategoriaId != 0)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.DOCUMENTO_PAGAMENTO
                + "."
                + DocumentoCobranca.DOCUMENTO_COBRANCA_CATEGORIA
                + " = "
                + Long.toString(inDocumentoCobrancaCategoriaId)
                + ")";
      if (inCpfCnpj != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + "."
                + Contrato.PESSOA
                + "."
                + Pessoa.DOCUMENTO
                + "='"
                + inCpfCnpj
                + "')";
      if (inDataFinal != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + inPropriedadeData
                + " between '"
                + CalendarUtils.formatToSQLDate(inDataInicial)
                + "' and '"
                + CalendarUtils.formatToSQLDate(inDataFinal)
                + "')";

      if (inTransacao == Transacao.CREDITO) sqlWhere += " and (lancamentoMovimento.valor>=0)";
      else if (inTransacao == Transacao.DEBITO) sqlWhere += " and (lancamentoMovimento.valor<0)";

      /*
       *  Atribui as condições do filtro da Operação
       *  Para cada Tipo de Operação, há duas operações a serem filtradas.
       *  Exemplo: Lançar e Extorno de Lançado.
       */
      if (inTipoOperacao == LancamentoMovimentoCategoria.QUITADO) {
        sqlWhere +=
            " and ((lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.QUITADO
                + ") or (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.QUITADO_ESTORNADO
                + "))";
      }
      if (inTipoOperacao == LancamentoMovimentoCategoria.CANCELADO) {
        sqlWhere +=
            " and ((lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.CANCELADO
                + ") or (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.CANCELADO_ESTORNADO
                + "))";
      }

      /* Montando a clausula ORDER */
      String sqlOrder = " order by";
      if (inOrdem == ORDEM_DATA) {
        sqlOrder +=
            " lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }
      if (inOrdem == ORDEM_LANCAMENTO) {
        sqlOrder +=
            " lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + ", lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }
      if (inOrdem == ORDEM_NOME) {
        sqlOrder +=
            " lancametoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + "."
                + Contrato.PESSOA
                + "."
                + Pessoa.NOME
                + ", lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO
                + ", lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }

      /* Executando serviço da query */
      String sql = sqlSelect.concat(sqlWhere).concat(sqlOrder);
      Query query = serviceData.getCurrentSession().createQuery(sql);
      List<QueryLancamentoMovimento> beanList = query.list();

      log.debug("::Fim da execução do serviço");
      serviceData.getOutputData().add(beanList);

    } catch (BusinessException e) {
      log.fatal(e.getErrorList());
      /* O Serviço não precisa adicionar mensagem local. O Manager já indica qual srv falhou e os parâmetros. */
      throw new ServiceException(e.getErrorList());
    } catch (Exception e) {
      log.fatal(e.getMessage());
      /* Indica que o serviço falhou por causa de uma exceção do hibernate. */
      throw new ServiceException(MessageList.createSingleInternalError(e));
    }
  }