/// <summary> /// Atualiza a transação apos o recebimento /// </summary> public void FinalizarTransacao(CapptaRetornoRecebimento dados) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); if (dados.Estorno) { FinalizarTransacaoEstorno(transaction, dados); } else { FinalizarTransacaoRecebimento(transaction, dados); } transaction.Commit(); transaction.Close(); } catch { transaction.Rollback(); transaction.Close(); throw; } } }
/// <summary> /// Finaliza uma transação de estorno /// </summary> private void FinalizarTransacaoEstorno(GDASession session, CapptaRetornoRecebimento dados) { //Insere a transação de estorno if (dados.Sucesso) { //Necessario usar uma transação a parte, pois o recebimento na cappta ja foi realizado e caso ocorra algum problema na finalização no webglass //o mesmo não sera cancelado na cappta, sendo assim tem que ficar registrado no webglass que o recibimento ocorreu com sucesso na cappta //apesar de ter ocorrido erro na finalização no webglass Instance.InsertComTransacao(new TransacaoCapptaTef() { IdReferencia = dados.IdReferencia, TipoRecebimento = dados.TipoRecebimento, CheckoutGuid = dados.CheckoutGuid, CodigoControle = dados.Recebimentos[0].CodigoAdministrativo, ComprovanteLoja = dados.Recebimentos[0].Comprovantes.ComprovanteLoja, ComprovanteCliente = dados.Recebimentos[0].Comprovantes.ComprovanteCliente }); } #region Cancela o recebimento no webglass if (dados.Sucesso || dados.MensagemErro == "Falha ao realizar estorno. Transação não encontrada ou não autorizada.") { switch (dados.TipoRecebimento) { case Helper.UtilsFinanceiro.TipoReceb.LiberacaoAVista: { if (LiberarPedidoDAO.Instance.ObterSituacao(session, dados.IdReferencia) == LiberarPedido.SituacaoLiberarPedido.Cancelado) { return; } var idNf = LiberarPedidoDAO.Instance.ObterIdNf(session, dados.IdReferencia); if (idNf > 0) { var situacaoNf = NotaFiscalDAO.Instance.ObtemSituacao(session, (uint)idNf); if (situacaoNf == (int)NotaFiscal.SituacaoEnum.Autorizada) { NFeUtils.EnviaXML.EnviaCancelamentoEvt((uint)idNf, "Cancelamento da transação TEF"); } else if (situacaoNf == (int)NotaFiscal.SituacaoEnum.Aberta || situacaoNf == (int)NotaFiscal.SituacaoEnum.FalhaEmitir) { NFeUtils.EnviaXML.EnviaInutilizacao((uint)idNf, "Cancelamento da transação TEF"); } } LiberarPedidoDAO.Instance.CancelarLiberacao(session, (uint)dados.IdReferencia, "Cancelamento da transação TEF", DateTime.Now, false, false); break; } case Helper.UtilsFinanceiro.TipoReceb.Acerto: { if (AcertoDAO.Instance.ObtemValorCampo <Situacao>(session, "Situacao", "IdAcerto = " + dados.IdReferencia) == Situacao.Ativo) { ContasReceberDAO.Instance.CancelarAcerto(session, (uint)dados.IdReferencia, "Cancelamento da transação TEF", DateTime.Now, false, false); } break; } case Helper.UtilsFinanceiro.TipoReceb.ChequeDevolvido: { if (AcertoChequeDAO.Instance.ObtemValorCampo <Situacao>(session, "Situacao", "IdAcertoCheque = " + dados.IdReferencia) == Situacao.Ativo) { AcertoChequeDAO.Instance.CancelarAcertoCheque((uint)dados.IdReferencia, "Cancelamento da transação TEF", DateTime.Now, false, false); } break; } case Helper.UtilsFinanceiro.TipoReceb.ContaReceber: { if (ContasReceberDAO.Instance.ObtemValorCampo <bool>(session, "Recebida", "idContaR = " + dados.IdReferencia)) { ContasReceberDAO.Instance.CancelarConta((uint)dados.IdReferencia, "Cancelamento da transação TEF", DateTime.Now, false, false); } break; } case Helper.UtilsFinanceiro.TipoReceb.SinalPedido: { if (SinalDAO.Instance.ObtemValorCampo <Situacao>(session, "Situacao", "IdSinal = " + dados.IdReferencia) == Situacao.Ativo) { SinalDAO.Instance.Cancelar(session, (uint)dados.IdReferencia, null, false, false, "Cancelamento da transação TEF", DateTime.Now, false, false); } break; } case Helper.UtilsFinanceiro.TipoReceb.Obra: { var situacao = ObraDAO.Instance.ObtemSituacao(session, (uint)dados.IdReferencia); if (situacao == Obra.SituacaoObra.Confirmada || situacao == Obra.SituacaoObra.Finalizada) { ObraDAO.Instance.CancelaObra((uint)dados.IdReferencia, "Cancelamento da transação TEF", DateTime.Now, false, false); } break; } default: { break; } } } #endregion }
/// <summary> /// Finaliza uma transação de recebimento /// </summary> private void FinalizarTransacaoRecebimento(GDASession session, CapptaRetornoRecebimento dados) { if (dados.Sucesso) { //Insere as transações foreach (var receb in dados.Recebimentos) { //Necessario usar uma transação a parte, pois o recebimento na cappta ja foi realizado e caso ocorra algum problema na finalização no webglass //o mesmo não sera cancelado na cappta, sendo assim tem que ficar registrado no webglass que o recibimento ocorreu com sucesso na cappta //apesar de ter ocorrido erro na finalização no webglass Instance.InsertComTransacao(new TransacaoCapptaTef() { IdReferencia = dados.IdReferencia, TipoRecebimento = dados.TipoRecebimento, CheckoutGuid = dados.CheckoutGuid, CodigoControle = receb.CodigoAdministrativo, ComprovanteLoja = receb.Comprovantes.ComprovanteLoja, ComprovanteCliente = receb.Comprovantes.ComprovanteCliente }); #region Atualiza o numero de autorização do cartão nos recebimentos switch (dados.TipoRecebimento) { case Helper.UtilsFinanceiro.TipoReceb.LiberacaoAVista: { PagtoLiberarPedidoDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.PagtoIndex, receb.CodigoAdministrativo); break; } case Helper.UtilsFinanceiro.TipoReceb.Acerto: { PagtoAcertoDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.PagtoIndex, receb.CodigoAdministrativo); break; } case Helper.UtilsFinanceiro.TipoReceb.ChequeDevolvido: { PagtoAcertoChequeDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.PagtoIndex, receb.CodigoAdministrativo); break; } case Helper.UtilsFinanceiro.TipoReceb.ContaReceber: { PagtoContasReceberDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.CodigoAdministrativo); break; } case Helper.UtilsFinanceiro.TipoReceb.SinalPedido: { PagtoSinalDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.PagtoIndex, receb.CodigoAdministrativo); break; } case Helper.UtilsFinanceiro.TipoReceb.Obra: { PagtoObraDAO.Instance.AtualizarNumAutCartao(session, dados.IdReferencia, receb.PagtoIndex, receb.CodigoAdministrativo); break; } default: { break; } } #endregion } #region Realiza a finalização dos recebimentos switch (dados.TipoRecebimento) { case Helper.UtilsFinanceiro.TipoReceb.LiberacaoAVista: { LiberarPedidoDAO.Instance.FinalizarPreLiberacaoAVista(session, dados.IdReferencia); break; } case Helper.UtilsFinanceiro.TipoReceb.Acerto: { dados.MensagemRetorno = ContasReceberDAO.Instance.FinalizarPreRecebimentoAcerto(session, dados.IdReferencia); break; } case Helper.UtilsFinanceiro.TipoReceb.ChequeDevolvido: { ChequesDAO.Instance.FinalizarPreQuitacaoChequeDevolvido(session, dados.IdReferencia); break; } case Helper.UtilsFinanceiro.TipoReceb.ContaReceber: { dados.MensagemRetorno = ContasReceberDAO.Instance.FinalizarPreRecebimentoConta(session, dados.IdReferencia); break; } case Helper.UtilsFinanceiro.TipoReceb.SinalPedido: { dados.MensagemRetorno = SinalDAO.Instance.FinalizarPreRecebimentoSinalPagamentoAntecipado(session, dados.IdReferencia); break; } case Helper.UtilsFinanceiro.TipoReceb.Obra: { ObraDAO.Instance.FinalizarPrePagamentoVista(session, dados.IdReferencia, string.Empty); break; } default: break; } #endregion } else { #region Cancelamento do recebimento //Caso ocorra algum erro ao receber na cappta, seja por falta de limite ou erro cancela o pre recebimento no webglass switch (dados.TipoRecebimento) { case Helper.UtilsFinanceiro.TipoReceb.LiberacaoAVista: { LiberarPedidoDAO.Instance.CancelarPreLiberacaoAVista(session, DateTime.Now, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } case Helper.UtilsFinanceiro.TipoReceb.Acerto: { ContasReceberDAO.Instance.CancelarPreRecebimentoAcerto(session, DateTime.Now, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } case Helper.UtilsFinanceiro.TipoReceb.ChequeDevolvido: { ChequesDAO.Instance.CancelarPreQuitacaoChequeDevolvido(session, DateTime.Now, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } case Helper.UtilsFinanceiro.TipoReceb.ContaReceber: { ContasReceberDAO.Instance.CancelarPreRecebimentoConta(session, DateTime.Now, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } case Helper.UtilsFinanceiro.TipoReceb.SinalPedido: { SinalDAO.Instance.CancelarPreRecebimentoSinalPagamentoAntecipado(session, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } case Helper.UtilsFinanceiro.TipoReceb.Obra: { ObraDAO.Instance.CancelarPrePagamentoVista(session, dados.IdReferencia, string.Format("Falha no recebimento TEF. Motivo: {0}", dados.MensagemErro)); break; } default: { break; } } #endregion } }