using AutoMapper; using Gestor.Common.Validation; using Gestor.Infrastructure.Entities.Generic; using Gestor.Infrastructure.Entities.Seguros; using Gestor.Infrastructure.Helpers; using Gestor.Infrastructure.Mappers; using Gestor.Infrastructure.Repository.Generic; using Gestor.Infrastructure.Repository.Interface; using Gestor.Infrastructure.UnitOfWork.Generic; using Gestor.Model.Common; using Gestor.Model.Domain.Generic; using Gestor.Model.Domain.Relatorios; using Gestor.Model.Domain.Seguros; using NHibernate; using NHibernate.Connection; using NHibernate.Impl; using NHibernate.Util; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Linq.Expressions; using System.Runtime.CompilerServices; namespace Gestor.Infrastructure.Repository.Logic { public class SinistroRepository : GenericRepository, ISinistroRepository, IGenericRepository { private readonly GenericUnitOfWork _unitOfWork; public SinistroRepository(GenericUnitOfWork unitOfWork) : base(unitOfWork.Session) { this._unitOfWork = unitOfWork; } public void Delete(long id) { base.Delete(base.FindEntityById(id)); } public List Find(string numero) { List list = ( from x in base.All() where x.Numero.Normalized().Contains(numero.Normalized()) && numero.Normalized().Contains(x.Numero.Normalized()) select x).ToList(); return ApplicationMapper.Mapper.Map, List>(list); } public List FindByControleId(long id) { List list = ( from x in base.All() where x.ControleSinistro.Id == id select x).ToList(); List sinistros = ApplicationMapper.Mapper.Map, List>(list); sinistros.ForEach((Sinistro x) => { x.SinistroAuto = (new SinistroAutoRepository(this._unitOfWork)).FindBySinistroId(x.Id); x.SinistroVida = (new SinistroVidaRepository(this._unitOfWork)).FindBySinistroId(x.Id); }); return sinistros; } public List FindByData(Filtros filtro, bool pendentes = false) { object connection; string str = "CAST(cs.datasinistro AS DATE)"; string referencia = filtro.Referencia; if (referencia == "DATA LIQUIDAÇÃO") { str = "CAST(s.dataliquidacao AS DATE)"; } else if (referencia == "DATA RECLAMAÇÃO") { str = "CAST(s.datareclamacao AS DATE)"; } List condicaos2 = filtro.CriarCondicao(str); List list = ( from x in condicaos2 where x.Campo == str select x).ToList(); if (pendentes) { list.Add(new Condicao() { Campo = "CAST(s.dataliquidacao AS DATE)", Valores = null }); } string str1 = (filtro.TipoVendedor == null || filtro.TipoVendedor.Count == 0 ? "OUTER APPLY (SELECT TOP 1 idvendedor FROM vendedorparcela vp WHERE vp.iddocumento = d.iddocumento AND vp.idtipovendedor = 1) vp" : string.Concat("INNER JOIN vendedorparcela vp ON vp.iddocumento = d.iddocumento AND vp.idtipovendedor IN (", string.Join(",", from v in filtro.TipoVendedor select v), ")")); SessionFactoryImpl sessionFactory = this._unitOfWork.Session.SessionFactory as SessionFactoryImpl; DataTable dataTable = new DataTable(); DataTable dataTable1 = new DataTable(); DataTable dataTable2 = new DataTable(); DataTable dataTable3 = new DataTable(); if (sessionFactory != null) { connection = sessionFactory.ConnectionProvider.GetConnection(); } else { connection = null; } using (SqlConnection sqlConnection = connection as SqlConnection) { if (sqlConnection != null) { using (SqlCommand sqlCommand = sqlConnection.CreateCommand()) { sqlCommand.CommandTimeout = 15000; string str2 = "SELECT DISTINCT cs.iditem as id, cs.idcontrolesinistro, s.idsinistro, cs.datasinistro as data, s.numsinistro as numero, s.datareclamacao as reclamacao, s.itemsinistrado as item, s.motivo, s.tiposinistro, s.valor as valor, s.vlrorcado as valororcado, s.vlrliberado as valorliberado, s.vlrpago as valorpago, s.vlrfranquia as valorfranquia, s.vlrsalvado as valorsalvado, s.dataliquidacao as liquidacao, s.idstatussinistro, s.StatusPersonalizado, s.auxiliar, s.usuariocriacao, s.usuarioalteracao, s.datacriacao, s.dataalteracao FROM sinistro s INNER JOIN controlesinistro cs on cs.idcontrolesinistro = s.idcontrolesinistro WHERE "; dataTable = sqlCommand.Select(list.CreateParameters(0), str2, ""); if (dataTable.Rows.Count != 0) { Auxiliar.CriarAuxiliar(sqlCommand, false); List list1 = condicaos2.Where((Condicao x) => { if (x.Campo == this.referencia) { return false; } return x.Campo != "CAST(s.dataliquidacao AS DATE)"; }).ToList(); list1.Add(new Condicao() { Campo = "d.excluido", Valores = null, Grupo = 1, Operacao = Operacao.Or }); list1.Add(new Condicao() { Campo = "d.excluido", Valores = "0".CriarValor(), Grupo = 1, Operacao = Operacao.Or }); string str3 = string.Concat("SELECT i.iditem as id, cl.nome as cliente, cl.MalaDireta, cl.idcliente, c.idcontrole, c.idempresa, i.iddocumento, d.contrato as apolice, d.aditamento as endosso, d.vigencia1, d.vigencia2, c.idramo, c.idciaseg as idseguradora, c.idproduto, vp.idvendedor, d.idestipulante, d.datacontrole, d.idstatus, d.pasta, cl.pasta as pastacliente, cl.cgccpf as cpfcnpj FROM item i INNER JOIN documento d on d.iddocumento = i.iddocumento INNER JOIN controle c on c.idcontrole = d.idcontrole INNER JOIN cliente cl on cl.idcliente = c.idcliente ", str1, " WHERE "); dataTable.AsEnumerable().ForEach((DataRow sinistro) => { List condicaos = new List() { new Condicao() { Campo = "i.iditem", Valores = sinistro.Field("id").CriarValor() } }; condicaos.AddRange(list1); List condicaos1 = new List() { new Condicao() { Campo = "idsinistro", Valores = sinistro.Field("idsinistro").CriarValor() } }; dataTable1.Merge(sqlCommand.Select(condicaos.CreateParameters(0), str3, "")); dataTable2.Merge(sqlCommand.Select(condicaos1.CreateParameters(0), "SELECT * FROM sinistroauto WHERE", "")); dataTable3.Merge(sqlCommand.Select(condicaos1.CreateParameters(0), "SELECT * FROM sinistrovida WHERE", "")); }); } else { return new List(); } } } } List nums = dataTable1.AsEnumerable().Select((DataRow x) => x.Field("id")).ToList(); List sinistros = new List(); dataTable.AsEnumerable().Where((DataRow x) => nums.Contains(x.Field("id"))).ForEach((DataRow x) => { TipoPerda? nullable; object sinistroAuto; object sinistroVida; TipoPerda? nullable1; Parceiro parceiro; Parceiro parceiro1; TipoPerda? nullable2; DataRow dataRow = dataTable1.Select(string.Format("id = {0}", x.Field("id"))).FirstOrDefault(); if (dataRow == null) { return; } DataRow dataRow1 = dataTable2.AsEnumerable().ToList().FirstOrDefault((DataRow a) => a.Field("idsinistro") == x.Field("idsinistro")); if (dataRow1 == null) { sinistroAuto = null; } else { sinistroAuto = new SinistroAuto(); ((DomainBase)sinistroAuto).Id = dataRow1.Field("idsinistroauto"); parceiro = (dataRow1.Field("idparceirofunilaria") == null ? null : Auxiliar.Parceiros.Find((Parceiro a) => a.Id == dataRow1.Field("idparceirofunilaria"))); ((SinistroAuto)sinistroAuto).ParceiroFunilaria = parceiro; parceiro1 = (dataRow1.Field("idparceiromecanica") == null ? null : Auxiliar.Parceiros.Find((Parceiro a) => a.Id == dataRow1.Field("idparceiromecanica"))); ((SinistroAuto)sinistroAuto).ParceiroMecanica = parceiro1; if (dataRow1.Field("idtipoperda") == null) { nullable = null; nullable2 = nullable; } else { nullable2 = new TipoPerda?((TipoPerda)int.Parse(dataRow1.Field("idtipoperda").ToString())); } ((SinistroAuto)sinistroAuto).TipoPerda = nullable2; ((SinistroAuto)sinistroAuto).Email = dataRow1.Field("email"); ((SinistroAuto)sinistroAuto).Telefone = string.Concat(dataRow1.Field("ddd"), " ", dataRow1.Field("telefone")); } SinistroAuto sinistroAuto1 = (SinistroAuto)sinistroAuto; DataRow dataRow2 = dataTable3.AsEnumerable().ToList().FirstOrDefault((DataRow a) => a.Field("idsinistro") == x.Field("idsinistro")); if (dataRow2 == null) { sinistroVida = null; } else { sinistroVida = new SinistroVida(); ((DomainBase)sinistroVida).Id = dataRow2.Field("idsinistrovida"); if (dataRow2.Field("tipoperda") == null) { nullable = null; nullable1 = nullable; } else { nullable1 = new TipoPerda?((TipoPerda)int.Parse(dataRow2.Field("tipoperda").ToString())); } ((SinistroVida)sinistroVida).TipoPerda = nullable1; ((SinistroVida)sinistroVida).Beneficiario = dataRow2.Field("beneficiario"); } SinistroVida sinistroVida1 = (SinistroVida)sinistroVida; Sinistro sinistro1 = new Sinistro() { Id = x.Field("idsinistro"), Numero = x.Field("numero"), ItemSinistrado = x.Field("item"), Motivo = x.Field("motivo"), TipoSinistro = new TipoSinistro?((TipoSinistro)Enum.Parse(typeof(TipoSinistro), x.Field("tiposinistro").ToString())), DataReclamacao = new DateTime?((x.Field("reclamacao") != null ? x.Field("reclamacao") : (x.Field("data") != null ? x.Field("data") : DateTime.MinValue))), Valor = (x.Field("valor") == null ? decimal.Zero : x.Field("valor")), ValorOrcado = (x.Field("valororcado") == null ? decimal.Zero : x.Field("valororcado")), ValorLiberado = (x.Field("valorliberado") == null ? decimal.Zero : x.Field("valorliberado")), ValorSalvado = new decimal?((x.Field("valorsalvado") == null ? decimal.Zero : x.Field("valorsalvado"))), ValorFranquia = (x.Field("valorfranquia") == null ? decimal.Zero : x.Field("valorfranquia")), ValorPago = (x.Field("valorpago") == null ? decimal.Zero : x.Field("valorpago")), DataLiquidacao = x.Field("liquidacao"), StatusSinistro = new StatusSinistro?((StatusSinistro)((x.Field("idstatussinistro") == null ? 0 : (StatusSinistro)x.Field("idstatussinistro")))), SinistroAuto = sinistroAuto1, SinistroVida = sinistroVida1, StatusPersonalizado = x.Field("StatusPersonalizado"), Auxiliar = x.Field("auxiliar"), IdUsuarioCriacao = (x.Field("usuariocriacao") == null ? (long)0 : x.Field("usuariocriacao")), DataCriacao = x.Field("datacriacao"), IdUsuarioAlteracao = (x.Field("usuarioalteracao") == null ? (long)0 : x.Field("usuarioalteracao")), DataAlteracao = x.Field("dataalteracao") }; ControleSinistro controleSinistro = new ControleSinistro() { Id = x.Field("idcontrolesinistro"), DataSinistro = new DateTime?((x.Field("data") != null ? x.Field("data") : DateTime.MinValue)) }; Item item = new Item() { Id = x.Field("id") }; Documento documento = new Documento() { Id = dataRow.Field("iddocumento"), Controle = new Controle() { Id = dataRow.Field("idcontrole"), IdEmpresa = dataRow.Field("idempresa"), Cliente = new Cliente() { Id = dataRow.Field("idcliente"), Nome = dataRow.Field("cliente"), Pasta = dataRow.Field("pastacliente"), Documento = dataRow.Field("cpfcnpj"), MalaDireta = new bool?(dataRow.Field("MalaDireta").GetValueOrDefault(true)) }, Seguradora = Auxiliar.Seguradoras.Find((Seguradora p) => p.Id == dataRow.Field("idseguradora")), Ramo = Auxiliar.Ramos.Find((Ramo p) => p.Id == dataRow.Field("idramo")), Produto = (dataRow.Field("idproduto") != null ? Auxiliar.Produtos.Find((Produto p) => p.Id == dataRow.Field("idproduto")) : null) }, Apolice = dataRow.Field("apolice"), Endosso = dataRow.Field("endosso"), VendedorPrincipal = (dataRow.Field("idvendedor") != null ? Auxiliar.Vendedores.Find((Vendedor p) => p.Id == dataRow.Field("idvendedor")) : null), Estipulante1 = (dataRow.Field("idestipulante") != null ? Auxiliar.Estipulantes.Find((Estipulante p) => p.Id == dataRow.Field("idestipulante")) : null), DataControle = dataRow.Field("datacontrole"), Status = (dataRow.Field("idstatus") != null ? Auxiliar.StatusApolice.Find((Status p) => p.Id == dataRow.Field("idstatus")) : null) }; DateTime? nullable3 = dataRow.Field("vigencia1"); documento.Vigencia1 = (nullable3.HasValue ? nullable3.GetValueOrDefault() : DateTime.MinValue); documento.Vigencia2 = dataRow.Field("vigencia2"); documento.Pasta = dataRow.Field("Pasta"); item.Documento = documento; controleSinistro.Item = item; sinistro1.ControleSinistro = controleSinistro; sinistros.Add(sinistro1); }); return sinistros; } public Sinistro FindById(long id) { SinistroDb sinistroDb = base.FindEntityById(id); if (sinistroDb == null) { return null; } Sinistro sinistro = ApplicationMapper.Mapper.Map(sinistroDb); sinistro.SinistroAuto = (new SinistroAutoRepository(this._unitOfWork)).FindBySinistroId(sinistro.Id); sinistro.SinistroVida = (new SinistroVidaRepository(this._unitOfWork)).FindBySinistroId(sinistro.Id); return sinistro; } public List FindByItemId(long id) { IEnumerable nums = from cs in (new ControleSinistroRepository(this._unitOfWork)).FindByIdItem(id) select cs.Id; return ( from s in base.All().ToList() where nums.Contains(s.ControleSinistro.Id) select new Sinistro() { Id = s.Id, Descricao = (string.IsNullOrEmpty(s.Descricao) ? "" : s.Descricao), DataReclamacao = s.DataReclamacao, Observacao = (string.IsNullOrEmpty(s.Observacao) ? "" : s.Observacao), Valor = s.Valor, ValorPago = s.ValorPago, Numero = s.Numero, ControleSinistro = new ControleSinistro() { DataSinistro = s.ControleSinistro.DataSinistro }, ItemSinistrado = s.ItemSinistrado, SinistroAuto = (new SinistroAutoRepository(this._unitOfWork)).FindBySinistroId(s.Id), SinistroVida = (new SinistroVidaRepository(this._unitOfWork)).FindBySinistroId(s.Id) }).ToList(); } public List FindNumeroSinistro(string numero) { return this.Select((new List() { new Condicao() { Campo = "s.numsinistro", Valores = null, Operador = Operador.Diferente }, new Condicao() { Campo = "s.numsinistro", Valores = numero.CriarValor() } }).CreateParameters(0)); } public Sinistro Merge(Sinistro sinistro) { SinistroDb sinistroDb = ApplicationMapper.Mapper.Map(sinistro); base.Merge(sinistroDb); return ApplicationMapper.Mapper.Map(sinistroDb); } public Sinistro SaveOrUpdate(Sinistro sinistro) { SinistroDb sinistroDb = ApplicationMapper.Mapper.Map(sinistro); this.SaveOrUpdate(sinistroDb); return ApplicationMapper.Mapper.Map(sinistroDb); } private List Select(SqlQueryCondition condition) { DataTable dataTable = this._unitOfWork.Select(condition, "SELECT * FROM sinistro s INNER JOIN controlesinistro cs on cs.idcontrolesinistro = s.idcontrolesinistro WHERE ", ""); if (dataTable != null && dataTable.Rows.Count == 0) { return new List(); } List list = ( from x in dataTable.AsEnumerable().ToList() select x.Field("iditem")).ToList(); List condicaos = new List() { new Condicao() { Campo = "i.iditem", Valores = list.CriarValor() }, new Condicao() { Campo = "d.excluido", Valores = null, Grupo = 1, Operacao = Operacao.Or }, new Condicao() { Campo = "d.excluido", Valores = "0".CriarValor(), Grupo = 1, Operacao = Operacao.Or } }; DataTable dataTable1 = this._unitOfWork.Select(condicaos.CreateParameters(0), "SELECT i.iditem, d.iddocumento, ISNULL(d.contrato, '') as apolice, c.idcontrole, cl.idcliente, cl.nome FROM item i INNER JOIN documento d on d.iddocumento = i.iddocumento INNER JOIN controle c on c.idcontrole = d.idcontrole INNER JOIN cliente cl on cl.idcliente = c.idcliente WHERE ", ""); return dataTable.MapSinistro(dataTable1); } } }