/// <summary> /// insere cte /// </summary> public uint Insert(Entidade.Cte cte) { lock (_cadastrarCte) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); var idCte = new uint(); var emitente = cte.ObjParticipanteCte.Where(c => c.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Emitente).FirstOrDefault(); if (emitente == null) { throw new Exception("O emitente não foi informado."); } var idCidade = emitente.IdLoja > 0 ? LojaDAO.Instance.ObtemIdCidade(transaction, emitente.IdLoja.Value) : emitente.IdCliente > 0 ? ClienteDAO.Instance.ObtemIdCidade(transaction, emitente.IdCliente.Value) : emitente.IdFornec > 0 ? FornecedorDAO.Instance.ObtemIdCidade(transaction, (int)emitente.IdFornec.Value) : emitente.IdTransportador > 0 ? (uint?)TransportadorDAO.Instance.GetElementByPrimaryKey(transaction, emitente.IdTransportador.Value).IdCidade : (uint?)null; if (!idCidade.HasValue) { throw new Exception("Não foi possível recuperar a cidade do emitente."); } var cidadeEmitente = CidadeDAO.Instance.GetElementByPrimaryKey(transaction, idCidade.Value); if (Glass.Data.DAL.CTe.ConhecimentoTransporteDAO.Instance.CteCadastrado(transaction)) { throw new Exception("CTe cadastrado há poucos segundos, Tente novamente."); } cte.TipoEmissao = cte.TipoEmissao > 0 ? cte.TipoEmissao : 1; if (cte.TipoDocumentoCte == (int)Entidade.Cte.TipoDocumentoCteEnum.Saida) { var idLoja = emitente.IdLoja; if (cte.TipoEmissao != (int)Glass.Data.Model.Cte.ConhecimentoTransporte.TipoEmissaoEnum.AutorizacaoSvcRs && cte.TipoEmissao != (int)Glass.Data.Model.Cte.ConhecimentoTransporte.TipoEmissaoEnum.AutorizacaoSvcSp) { cte.NumeroCte = BuscarCte.Instance.GetUltimoNumeroCte(transaction, idLoja.Value, Glass.Conversoes.StrParaInt(cte.Serie), (int)cte.TipoEmissao); } cte.DataEmissao = DateTime.Now; cte.CodAleatorio = (cte.NumeroCte + (cte.TipoEmissao == (int)Glass.Data.Model.Cte.ConhecimentoTransporte.TipoEmissaoEnum.Normal ? 10203040 : 9020304)).ToString(); cte.ChaveAcesso = ChaveDeAcesso(cidadeEmitente.CodIbgeUf, cte.DataEmissao.ToString("yyMM"), LojaDAO.Instance.ObtemCnpj(transaction, idLoja.Value), Glass.Data.CTeUtils.ConfigCTe.Modelo, cte.Serie.ToString().PadLeft(3, '0'), cte.NumeroCte.ToString(), cte.TipoEmissao.ToString(), cte.CodAleatorio); } else if (cte.TipoDocumentoCte == (int)Entidade.Cte.TipoDocumentoCteEnum.EntradaTerceiros) { if (!string.IsNullOrEmpty(cte.ChaveAcesso) && cte.ChaveAcesso.Length > 0 && cte.ChaveAcesso.Length != 44) { throw new Exception("A chave de acesso deve ter 44 caracteres."); } } cte.Situacao = (int)Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Aberto; idCte = Glass.Data.DAL.CTe.ConhecimentoTransporteDAO.Instance.Insert(transaction, Convert(cte)); cte.ObjCobrancaCte.IdCte = cte.ObjEntregaCte.IdCte = cte.ObjInfoCte.IdCte = cte.ObjConhecimentoTransporteRodoviario.IdCte = cte.ObjSeguroCte.IdCte = cte.ObjComplCte.IdCte = cte.ObjComplCte.ObjComplPassagemCte.IdCte = cte.ObjEfdCte.IdCte = idCte; foreach (var i in cte.ObjParticipanteCte) { i.IdCte = idCte; } foreach (var i in cte.ObjComponenteValorCte) { i.IdCte = idCte; } foreach (var i in cte.ObjVeiculoCte) { i.IdCte = idCte; } foreach (var i in cte.ObjImpostoCte) { i.IdCte = idCte; } CadastrarCobrancaCte.Instance.Insert(transaction, cte.ObjCobrancaCte); CadastrarVeiculoCte.Instance.Insert(transaction, cte.ObjVeiculoCte); if (cte.ObjSeguroCte.IdSeguradora > 0) { CadastrarSeguroCte.Instance.Insert(transaction, cte.ObjSeguroCte); } CadastrarEntregaCte.Instance.Insert(transaction, cte.ObjEntregaCte); CadastrarComponenteValorCte.Instance.Insert(transaction, cte.ObjComponenteValorCte); CadastrarInfoCte.Instance.Insert(transaction, cte.ObjInfoCte); CadastrarConhecimentoTransporteRodoviario.Instance.Insert(transaction, cte.ObjConhecimentoTransporteRodoviario); CadastrarParticipanteCte.Instance.Insert(transaction, cte.ObjParticipanteCte); CadastrarComplCte.Instance.Insert(transaction, cte.ObjComplCte); CadastrarImpostoCte.Instance.Insert(transaction, cte.ObjImpostoCte); CadastrarEfdCte.Instance.Insert(transaction, cte.ObjEfdCte); transaction.Commit(); transaction.Close(); return(idCte); } catch (Exception ex) { transaction.Rollback(); transaction.Close(); ErroDAO.Instance.InserirFromException("CadastrarCTE(Insert).", ex); throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Erro no cadastro de CTe.", ex)); } } } }
/// <summary> /// atualiza dados do cte /// </summary> public void Update(Entidade.Cte cte) { lock (_cadastrarCte) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); var situacaoCTe = Glass.Data.DAL.CTe.ConhecimentoTransporteDAO.Instance.ObtemSituacaoCte(transaction, cte.IdCte); if (situacaoCTe == Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Autorizado || situacaoCTe == Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.FinalizadoTerceiros) { throw new Exception(string.Format("O CTE de número {0} já foi {1}.", cte.NumeroCte, situacaoCTe == Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Autorizado ? "autorizado" : "finalizado")); } var emitente = cte.ObjParticipanteCte.Where(c => c.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Emitente).FirstOrDefault(); if (emitente == null) { throw new Exception("O emitente não foi informado."); } if (cte.TipoDocumentoCte == (int)Entidade.Cte.TipoDocumentoCteEnum.Saida) { var idCidade = emitente.IdLoja > 0 ? LojaDAO.Instance.ObtemIdCidade(transaction, emitente.IdLoja.Value) : emitente.IdCliente > 0 ? ClienteDAO.Instance.ObtemIdCidade(transaction, emitente.IdCliente.Value) : emitente.IdFornec > 0 ? FornecedorDAO.Instance.ObtemIdCidade(transaction, (int)emitente.IdFornec.Value) : emitente.IdTransportador > 0 ? (uint?)TransportadorDAO.Instance.GetElementByPrimaryKey(transaction, emitente.IdTransportador.Value).IdCidade : (uint?)null; if (!idCidade.HasValue) { throw new Exception("Não foi possível recuperar a cidade do emitente."); } var cidadeEmitente = CidadeDAO.Instance.GetElementByPrimaryKey(transaction, idCidade.Value); var idLoja = emitente.IdLoja; cte.ChaveAcesso = ChaveDeAcesso(cidadeEmitente.CodIbgeUf, cte.DataEmissao.ToString("yyMM"), LojaDAO.Instance.ObtemCnpj(transaction, idLoja.Value), Glass.Data.CTeUtils.ConfigCTe.Modelo, cte.Serie.ToString().PadLeft(3, '0'), cte.NumeroCte.ToString(), cte.TipoEmissao.ToString(), cte.CodAleatorio); } else if (cte.TipoDocumentoCte == (int)Entidade.Cte.TipoDocumentoCteEnum.EntradaTerceiros) { if (!string.IsNullOrEmpty(cte.ChaveAcesso) && cte.ChaveAcesso.Length > 0 && cte.ChaveAcesso.Length != 44) { throw new Exception("A chave de acesso deve ter 44 caracteres."); } } cte.Situacao = (int)Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Aberto; var id = Glass.Data.DAL.CTe.ConhecimentoTransporteDAO.Instance.Update(transaction, Convert(cte)); cte.ObjCobrancaCte.IdCte = cte.ObjEntregaCte.IdCte = cte.ObjInfoCte.IdCte = cte.ObjEfdCte.IdCte = cte.ObjConhecimentoTransporteRodoviario.IdCte = cte.ObjSeguroCte.IdCte = cte.ObjComplCte.IdCte = cte.ObjComplCte.ObjComplPassagemCte.IdCte = cte.IdCte; foreach (var i in cte.ObjParticipanteCte) { i.IdCte = cte.IdCte; } foreach (var i in cte.ObjComponenteValorCte) { i.IdCte = cte.IdCte; } foreach (var i in cte.ObjVeiculoCte) { i.IdCte = cte.IdCte; } foreach (var i in cte.ObjImpostoCte) { i.IdCte = cte.IdCte; } CadastrarCobrancaCte.Instance.Update(transaction, cte.ObjCobrancaCte); CadastrarVeiculoCte.Instance.Update(transaction, cte.ObjVeiculoCte); CadastrarSeguroCte.Instance.Update(transaction, cte.ObjSeguroCte); CadastrarEntregaCte.Instance.Update(transaction, cte.ObjEntregaCte); if (cte.ObjComponenteValorCte.Count() > 0 && cte.ObjComponenteValorCte.Select(f => !string.IsNullOrEmpty(f.NomeComponente) && f.ValorComponente != 0).FirstOrDefault()) { CadastrarComponenteValorCte.Instance.Update(transaction, cte.ObjComponenteValorCte); } CadastrarConhecimentoTransporteRodoviario.Instance.Update(transaction, cte.ObjConhecimentoTransporteRodoviario); CadastrarParticipanteCte.Instance.Update(transaction, cte.ObjParticipanteCte); CadastrarComplCte.Instance.Update(transaction, cte.ObjComplCte); CadastrarImpostoCte.Instance.Update(transaction, cte.ObjImpostoCte); CadastrarInfoCte.Instance.Update(transaction, cte.ObjInfoCte); CadastrarEfdCte.Instance.Update(transaction, cte.ObjEfdCte); transaction.Commit(); transaction.Close(); } catch (Exception ex) { transaction.Rollback(); transaction.Close(); ErroDAO.Instance.InserirFromException("CadastrarCTE(Update).", ex); throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Erro ao atualizar CTe.", ex)); } } } }
public void Finalizar(uint idCte) { lock (_finalizarCTeLock) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); Entidade.Cte cte = BuscarCte.Instance.GetCte(transaction, idCte); #region Valida dados do CT-e // TODO: Fazer validações do tipo: CNPJ/Insc Est do transportador, // codigo NCM preenchido automaticamente entre outros. if (cte.NumeroCte == 0) { throw new Exception("Informe o número do conhecimento de transporte."); } if (string.IsNullOrEmpty(cte.Modelo)) { throw new Exception("Informe o modelo do conhecimento de transporte."); } if (cte.IdNaturezaOperacao == 0) { throw new Exception("Selecione a natureza de operação do conhecimento de transporte."); } // Verifica se o CFOP selecionado é de nota fiscal de saída if (!CfopDAO.Instance.IsCfopEntrada(transaction, (int)cte.IdCfop)) { throw new Exception("O CFOP informado no conhecimento de transporte não é um CFOP de entrada."); } // Verifica se o CTE já foi finalizado. if (cte.Situacao == (int)Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Autorizado || cte.Situacao == (int)Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.FinalizadoTerceiros) { throw new Exception("O CTE de número " + cte.NumeroCte + " já foi " + (cte.Situacao == (int)Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.Autorizado ? "autorizado" : "finalizado.")); } //Verifica se o cfop selecionado corresponde a uf do emitente e destinatario var codCfop = Glass.Conversoes.StrParaInt(CfopDAO.Instance.ObtemCodInterno(transaction, cte.IdCfop)[0].ToString()); var ufOrigem = CidadeDAO.Instance.GetNomeUf(transaction, cte.IdCidadeInicio); var ufDestino = CidadeDAO.Instance.GetNomeUf(transaction, cte.IdCidadeFim); if (ufOrigem.ToLower() == ufDestino.ToLower() && codCfop != 1) { throw new Exception("O CFOP informado não corresponde a um CFOP de entrada dentro do estado."); } else if (ufOrigem.ToLower() != ufDestino.ToLower() && codCfop != 2) { throw new Exception("O CFOP informado não corresponde a um CFOP de entrada fora do estado."); } else if (ufOrigem.ToLower() == "ex" && codCfop != 3) { throw new Exception("O CFOP informado não corresponde a um CFOP de entrada fora do país."); } if (!string.IsNullOrEmpty(cte.ChaveAcesso)) { var cnpjChaveAcesso = cte.ChaveAcesso.Substring(6, 14); var emitente = cte.ObjParticipanteCte.FirstOrDefault(x => x.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Emitente); var cpfCnpjEmitente = emitente == null ? null : emitente.IdLoja > 0 ? LojaDAO.Instance.ObtemCnpj(transaction, emitente.IdLoja.Value) : emitente.IdCliente > 0 ? ClienteDAO.Instance.ObtemCpfCnpj(transaction, emitente.IdCliente.Value) : emitente.IdFornec > 0 ? FornecedorDAO.Instance.ObtemCpfCnpj(transaction, emitente.IdFornec.Value) : emitente.IdTransportador > 0 ? TransportadorDAO.Instance.GetElementByPrimaryKey(transaction, emitente.IdTransportador.Value).CpfCnpj : null; if (cpfCnpjEmitente != null && Formatacoes.LimpaCpfCnpj(cpfCnpjEmitente) != cnpjChaveAcesso) { throw new Exception("O CNPJ do Emitente não é o mesmo informado na chave de acesso."); } } #endregion if (cte.TipoDocumentoCte != (int)Glass.Data.Model.Cte.ConhecimentoTransporte.TipoDocumentoCteEnum.EntradaTerceiros) { var notas = NotaFiscalCteDAO.Instance.GetCount(transaction, idCte); if (notas == 0) { throw new Exception("Selecione ao menos uma nota fiscal que está vinculada ao CT-e."); } } GerarContasPagar(transaction, cte); // Altera a situação do CTe ConhecimentoTransporteDAO.Instance.AlteraSituacao(transaction, idCte, Glass.Data.Model.Cte.ConhecimentoTransporte.SituacaoEnum.FinalizadoTerceiros); transaction.Commit(); transaction.Close(); } catch { transaction.Rollback(); transaction.Close(); throw; } } } }
private void GerarContasPagar(GDASession session, Entidade.Cte cte) { if (!cte.ObjCobrancaCte.GerarContasPagar) { return; } var duplicatas = cte.ObjCobrancaCte.ObjCobrancaDuplCte.Where(x => x.DataVenc.HasValue).ToList(); if (cte.ObjCobrancaCte.ValorLiquidoFatura == 0) { throw new Exception("O Valor Líquido Fatura não foi informado."); } if (!cte.ObjCobrancaCte.GerarContasPagar || cte.ObjCobrancaCte.IdConta.GetValueOrDefault() == 0 || cte.ObjCobrancaCte.ValorLiquidoFatura == 0 || duplicatas.Count == 0) { return; } var loja = cte.ObjParticipanteCte.FirstOrDefault(x => x.IdLoja > 0 && (x.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Destinatario || /* Chamado 46951. */ x.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Remetente)); var tipoParticipante = cte.ObjParticipanteCte.FirstOrDefault (x => x.TipoParticipante == Glass.Data.Model.Cte.ParticipanteCte.TipoParticipanteEnum.Emitente); loja = loja ?? new Entidade.ParticipanteCte(); tipoParticipante = tipoParticipante ?? new Entidade.ParticipanteCte(); if (loja.IdLoja.GetValueOrDefault() == 0) { throw new Exception("Não foi possível identificar a loja (destinatário) do CT-e."); } if (tipoParticipante.IdFornec.GetValueOrDefault() == 0 && tipoParticipante.IdTransportador.GetValueOrDefault() == 0) { throw new Exception("Não foi encontrado nenhum fornecedor/transportador associado ao CT-e."); } int numParc = 1, numParcTotal = duplicatas.Count; foreach (var dupl in duplicatas) { var contasPagar = new Glass.Data.Model.ContasPagar() { IdCte = cte.IdCte, Contabil = true, AVista = false, DataVenc = dupl.DataVenc.Value, IdConta = cte.ObjCobrancaCte.IdConta.Value, IdLoja = loja.IdLoja.Value, IdFornec = tipoParticipante.IdFornec > 0 ? (uint?)tipoParticipante.IdFornec : null, IdTransportador = tipoParticipante.IdTransportador > 0 ? (uint?)tipoParticipante.IdTransportador : null, NumBoleto = dupl.NumeroDupl, NumParc = numParc++, NumParcMax = numParcTotal, Paga = false, ValorVenc = dupl.ValorDupl }; ContasPagarDAO.Instance.Insert(session, contasPagar); } }
public void Delete(Entidade.Cte cte) { ExcluirCte.Instance.Excluir(cte); }
public void Excluir(Entidade.Cte cte) { lock (_excluirCte) { using (var transaction = new GDA.GDATransaction()) { try { transaction.BeginTransaction(); uint idCte = cte.IdCte; cte = BuscarCte.Instance.GetCte(transaction, idCte); if (ContasPagarDAO.Instance.ExistePagasCte(transaction, idCte)) { throw new Exception("Já existe pelo menos uma conta paga gerada por esse CT-e."); } ContasPagarDAO.Instance.DeleteByCte(transaction, idCte); Glass.Data.DAL.CTe.ConhecimentoTransporteDAO.Instance.DeleteByPrimaryKey(transaction, idCte); Glass.Data.DAL.CTe.CobrancaCteDAO.Instance.DeleteByPrimaryKey(transaction, idCte); foreach (var i in cte.ObjCobrancaCte.ObjCobrancaDuplCte) { Glass.Data.DAL.CTe.CobrancaDuplCteDAO.Instance.Delete(transaction, idCte); } Glass.Data.DAL.CTe.ComplCteDAO.Instance.DeleteByPrimaryKey(transaction, idCte); Glass.Data.DAL.CTe.ComplPassagemCteDAO.Instance.Delete(transaction, idCte, cte.ObjComplCte.ObjComplPassagemCte.NumSeqPassagem); foreach (var i in cte.ObjComponenteValorCte) { Glass.Data.DAL.CTe.ComponenteValorCteDAO.Instance.Delete(transaction, idCte); } Glass.Data.DAL.CTe.ConhecimentoTransporteRodoviarioDAO.Instance.DeleteByPrimaryKey(transaction, idCte); Glass.Data.DAL.CTe.EntregaCteDAO.Instance.DeleteByPrimaryKey(transaction, idCte); foreach (var i in cte.ObjImpostoCte) { Glass.Data.DAL.CTe.ImpostoCteDAO.Instance.Delete(transaction, idCte, i.TipoImposto); } foreach (var i in cte.ObjInfoCte.ObjInfoCargaCte) { Glass.Data.DAL.CTe.InfoCargaCteDAO.Instance.Delete(transaction, idCte, i.TipoUnidade); } Glass.Data.DAL.CTe.InfoCteDAO.Instance.DeleteByPrimaryKey(transaction, idCte); foreach (var i in cte.ObjConhecimentoTransporteRodoviario.ObjLacreCteRod) { Glass.Data.DAL.CTe.LacreCteRodDAO.Instance.Delete(transaction, idCte); } Glass.Data.DAL.CTe.NotaFiscalCteDAO.Instance.DeleteByIdCte(transaction, idCte); foreach (var i in cte.ObjConhecimentoTransporteRodoviario.ObjOrdemColetaCteRod) { Glass.Data.DAL.CTe.OrdemColetaCteRodDAO.Instance.Delete(transaction, idCte); } foreach (var i in cte.ObjConhecimentoTransporteRodoviario.ObjValePedagioCteRod) { Glass.Data.DAL.CTe.ValePedagioCteRodDAO.Instance.Delete(transaction, idCte); } foreach (var i in cte.ObjParticipanteCte) { Glass.Data.DAL.CTe.ParticipanteCteDAO.Instance.Delete(transaction, idCte); } Glass.Data.DAL.CTe.SeguroCteDAO.Instance.Delete(transaction, idCte); foreach (var i in cte.ObjVeiculoCte) { Glass.Data.DAL.CTe.VeiculoCteDAO.Instance.Delete(transaction, idCte); } Glass.Data.DAL.CTe.EfdCteDAO.Instance.Delete(transaction, idCte); transaction.Commit(); transaction.Close(); } catch { transaction.Rollback(); transaction.Close(); throw; } } } }