public static void EstornarLote(TRegistro_LoteBloqueto val, BancoDados.TObjetoBanco banco) { bool st_transacao = false; TCD_LoteBloqueto qtb_lote = new TCD_LoteBloqueto(); try { if (banco == null) { st_transacao = qtb_lote.CriarBanco_Dados(true); } else { qtb_lote.Banco_Dados = banco; } //Inicio do processo de estornar lote if (val.St_registro.Trim().ToUpper().Equals("P")) { if (val.ListaCaixa.Count > 0) { //Verificar se nao existe alguma parcela que originou bloqueto ja liquidada foreach (var p in val.ListaBloqueto) { CamadaDados.Financeiro.Duplicata.TList_RegLanParcela lParcela = new CamadaDados.Financeiro.Duplicata.TCD_LanParcela(qtb_lote.Banco_Dados).Select( new TpBusca[] { new TpBusca() { vNM_Campo = "isnull(a.st_registro, 'A')", vOperador = "in", vVL_Busca = "('L', 'P')" }, new TpBusca() { vNM_Campo = "isnull(d.st_registro, 'A')", vOperador = "=", vVL_Busca = "'A'" }, new TpBusca() { vNM_Campo = string.Empty, vOperador = "exists", vVL_Busca = "(select 1 from tb_cob_titulo x " + "where x.cd_empresa = a.cd_empresa " + "and x.nr_lancto = a.nr_lancto " + "and x.cd_parcela = a.cd_parcela " + "and x.cd_empresa = '" + p.Cd_empresa.Trim() + "'" + "and x.nr_lancto = " + p.Nr_lancto.ToString() + "and x.cd_parcela = " + p.Cd_parcela.ToString() + ")" } }, 0, string.Empty, "a.dt_vencto, c.nm_clifor", string.Empty); if (lParcela.Count > 0) { throw new Exception("Lote não podera ser estornado, existe parcela com liquidação.\r\n\r\n" + "Empresa: " + p.Cd_empresa.Trim() + "\r\n" + "Duplicata: " + p.Nr_lancto.ToString() + "/" + p.Cd_parcela.ToString() + "\r\n\r\n" + "Obrigatorio estornar primeiro a liquidação."); } } val.ListaCaixa.ForEach(p => { //Excluir registro Lote X Caixa TCN_Bloqueto_X_Caixa.Excluir(new TRegistro_Lote_X_Caixa() { Cd_contager = p.Cd_ContaGer, Cd_lanctocaixa = p.Cd_LanctoCaixa, Id_lote = val.Id_lote.Value }, qtb_lote.Banco_Dados); //Chamar metodo estorno de caixa Caixa.TCN_LanCaixa.EstornarCaixa(p, null, qtb_lote.Banco_Dados); }); //Alterar o valor da taxa no bloquetos val.ListaBloqueto.ForEach(p => TCN_Lote_X_Titulo.Gravar(new TRegistro_Lote_X_Titulo() { Cd_empresa = p.Cd_empresa, Cd_parcela = p.Cd_parcela, Id_cobranca = p.Id_cobranca, Id_lote = val.Id_lote.Value, Nr_lancto = p.Nr_lancto, Vl_taxa = 0 }, qtb_lote.Banco_Dados)); //Alterar o lote val.St_registro = "A"; val.Vl_taxa = 0; qtb_lote.Gravar(val); if (st_transacao) { qtb_lote.Banco_Dados.Commit_Tran(); } } else { throw new Exception("Não existe lançamento de caixa para ser estornado."); } } else { throw new Exception("Lote não se encontra processado."); } } catch (Exception ex) { if (st_transacao) { qtb_lote.Banco_Dados.RollBack_Tran(); } throw new Exception(ex.Message); } finally { if (st_transacao) { qtb_lote.deletarBanco_Dados(); } } }
public static string ProcessarLote(TRegistro_LoteBloqueto val, BancoDados.TObjetoBanco banco) { bool st_transacao = false; TCD_LoteBloqueto qtb_lote = new TCD_LoteBloqueto(); try { if (banco == null) { st_transacao = qtb_lote.CriarBanco_Dados(true); } else { qtb_lote.Banco_Dados = banco; } //Lancamento de caixa no valor liquido //Buscar historico na configuracao do banco TList_CadCFGBanco lCfg = Cadastros.TCN_CadCFGBanco.Buscar(val.Id_configstr, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, 1, qtb_lote.Banco_Dados); if (lCfg.Count > 0) { if (string.IsNullOrEmpty(lCfg[0].Cd_historico_desconto)) { throw new Exception("Não existe configuração de historico para desconto de bloquetos\r\n" + "para a configuração " + val.Ds_config.Trim()); } decimal total_bloquetos = val.ListaBloqueto.Sum(p => p.Vl_documento); string retorno = TCN_LanCaixa.GravaLanCaixa( new TRegistro_LanCaixa() { Cd_ContaGer = val.Cd_contager, Cd_Empresa = val.Cd_empresa, Cd_Historico = lCfg[0].Cd_historico_desconto, ComplHistorico = "DESCONTO DE BLOQUETOS DO LOTE " + val.Id_lotestr, Dt_lancto = val.Dt_processamento, Nr_Docto = "LOTE" + val.Id_lotestr, St_Estorno = "N", Vl_PAGAR = 0, Vl_RECEBER = total_bloquetos }, qtb_lote.Banco_Dados); //Amarrar este lancamento de caixa ao lote //com o campo TP_Registro = D (DESCONTO) TCN_Bloqueto_X_Caixa.Gravar(new TRegistro_Lote_X_Caixa() { Cd_contager = val.Cd_contager, Cd_lanctocaixa = Convert.ToDecimal(CamadaDados.TDataQuery.getPubVariavel(retorno, "@P_CD_LANCTOCAIXA")), Id_lote = val.Id_lote.Value, Tp_registro = "D" }, qtb_lote.Banco_Dados); //Lancar Taxa if (string.IsNullOrEmpty(lCfg[0].Cd_historico_taxadesc)) { throw new Exception("Não existe configuração de historico para taxa desconto de bloquetos\r\n" + "para a configuração " + val.Ds_config.Trim()); } retorno = TCN_LanCaixa.GravaLanCaixa(new TRegistro_LanCaixa() { Cd_ContaGer = val.Cd_contager, Cd_Empresa = val.Cd_empresa, Cd_Historico = lCfg[0].Cd_historico_taxadesc, ComplHistorico = "TAXA DESCONTO BLOQUETOS DO LOTE " + val.Id_lotestr, Dt_lancto = val.Dt_processamento, Nr_Docto = "LOTE" + val.Id_lote, St_Estorno = "N", Vl_PAGAR = val.Vl_taxa, Vl_RECEBER = decimal.Zero }, qtb_lote.Banco_Dados); //Amarrar este lancamento de caixa ao lote //com o campo TP_Registro = T (TAXA) TCN_Bloqueto_X_Caixa.Gravar(new TRegistro_Lote_X_Caixa() { Cd_contager = val.Cd_contager, Cd_lanctocaixa = Convert.ToDecimal(CamadaDados.TDataQuery.getPubVariavel(retorno, "@P_CD_LANCTOCAIXA")), Id_lote = val.Id_lote.Value, Tp_registro = "T" }, qtb_lote.Banco_Dados); //Gravar centro resultado taxa cobrança if (!string.IsNullOrEmpty(lCfg[0].Cd_centroresultTXCob)) { //Gravar Lancto Resultado string id = CCustoLan.TCN_LanCCustoLancto.Gravar( new CamadaDados.Financeiro.CCustoLan.TRegistro_LanCCustoLancto() { Cd_empresa = val.Cd_empresa, Cd_centroresult = lCfg[0].Cd_centroresultTXCob, Vl_lancto = val.Vl_taxa, Dt_lancto = val.Dt_processamento }, qtb_lote.Banco_Dados); //Amarrar Lancto a Caixa TCN_Caixa_X_CCusto.Gravar(new TRegistro_Caixa_X_CCusto() { Cd_contager = val.Cd_contager, Cd_lanctocaixa = Convert.ToDecimal(CamadaDados.TDataQuery.getPubVariavel(retorno, "@P_CD_LANCTOCAIXA")), Id_ccustolan = decimal.Parse(id) }, qtb_lote.Banco_Dados); } val.ListaBloqueto.ForEach(p => { //Alterar status dos bloquetos para D - Descontado p.St_registro = "D"; TCN_Titulo.Gravar(p, qtb_lote.Banco_Dados); //Criar lista de lote x titulo val.lBloquetos.Add(new TRegistro_Lote_X_Titulo() { Cd_empresa = p.Cd_empresa, Cd_parcela = p.Cd_parcela, Id_cobranca = p.Id_cobranca, Id_lote = val.Id_lote.Value, Nr_lancto = p.Nr_lancto, Vl_documento = p.Vl_documento }); }); //Calcular valor taxa por bloqueto val.lBloquetos.ForEach(p => p.Vl_taxa = Math.Round(((val.Vl_taxa / total_bloquetos) * p.Vl_documento), 2)); decimal total_taxa = val.lBloquetos.Sum(p => p.Vl_taxa); if (val.Vl_taxa != total_taxa) { val.lBloquetos[val.lBloquetos.Count - 1].Vl_taxa += (val.Vl_taxa - total_taxa); } //Gravar lote x titulo com o valor da taxa val.lBloquetos.ForEach(p => TCN_Lote_X_Titulo.Gravar(p, qtb_lote.Banco_Dados)); //Limpar lista de bloquetos para //que a gravacao do lote nao altere //novamente a lista de bloquetos val.ListaBloqueto.Clear(); //Alterar status do lote para processado val.St_registro = "P"; Gravar(val, qtb_lote.Banco_Dados); if (st_transacao) { qtb_lote.Banco_Dados.Commit_Tran(); } return(retorno); } else { throw new Exception("Não existe configuração para emissão de bloquetos para a empresa " + val.Cd_empresa.Trim() + " e conta gerencial " + val.Cd_contager.Trim()); } } catch (Exception ex) { if (st_transacao) { qtb_lote.Banco_Dados.RollBack_Tran(); } throw new Exception(ex.Message); } finally { if (st_transacao) { qtb_lote.deletarBanco_Dados(); } } }