Skip to content

Commit

Permalink
Merge pull request #4 from SALUD-AR/Iteracion-4
Browse files Browse the repository at this point in the history
Iteracion 4
  • Loading branch information
Miguel Amorese authored Oct 8, 2019
2 parents 44bc03f + c884270 commit 182d171
Show file tree
Hide file tree
Showing 49 changed files with 7,966 additions and 108 deletions.
3 changes: 2 additions & 1 deletion MnsInteropDemo.sln
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FB08D419-6359-4001-ACF1-707B760A83AA}"
ProjectSection(SolutionItems) = preProject
Flujo de Paciente.txt = Flujo de Paciente.txt
README.md = README.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Msn.InteropDemo.Snowstorm.Implementation", "Msn.InteropDemo.Snowstorm.Implementation\Msn.InteropDemo.Snowstorm.Implementation.csproj", "{FE5083F4-D367-4A84-8740-D59FACCE4A85}"
Expand All @@ -54,7 +55,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Msn.InteropDemo.Snowstorm.E
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Msn.InteropDemo.Communication", "Msn.InteropDemo.Communication\Msn.InteropDemo.Communication.csproj", "{319F5146-DE42-4007-B945-56F3A5E1B800}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Msn.InteropDemo.Dfa", "Msn.InteropDemo.Dfa\Msn.InteropDemo.Dfa.csproj", "{9140330A-D988-4A66-8E0B-C363BBA7596A}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Msn.InteropDemo.Dfa", "Msn.InteropDemo.Dfa\Msn.InteropDemo.Dfa.csproj", "{9140330A-D988-4A66-8E0B-C363BBA7596A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
using Msn.InteropDemo.ViewModel.Pacientes;
using Msn.InteropDemo.Fhir;
using System.Linq.Expressions;
using Msn.InteropDemo.Common.Utils.Helpers;
using Msn.InteropDemo.ViewModel.Request;
using Msn.InteropDemo.ViewModel.Response;
using Microsoft.EntityFrameworkCore;

namespace Msn.InteropDemo.AppServices.Implementation.AppServices
{
Expand All @@ -22,6 +26,109 @@ public PacienteAppService(IPatientManager patientManager,
_patientManager = patientManager;
}

public ViewModel.Response.CoeficienteBusquedaResponce GetCoeficienteBusqueda(CoeficienteBusquedaIngresadoRequest request)
{
if (request is null)
{
throw new ArgumentNullException(nameof(request));
}

var entity = CurrentContext.DataContext.Pacientes.Include(x => x.TipoDocumento)
.FirstOrDefault(x=>x.Id == request.PacienteId);
if(entity == null)
{
throw new Exception($"Paciente inexistente con ID:{request.PacienteId}");
}

var rq = new CoeficienteBusquedaRequest
{
ApellidoIngresado = request.ApellidoIngresado,
ApellidoObtenido = entity.PrimerApellido,
FechaNacimientoIngresado = request.FechaNacimientoIngresado,
FechaNacimientoObtenido = entity.FechaNacimiento.ToString("dd/MM/yyyy"),
NombreIngresado = request.NombreIngresado,
NombreObtenido = entity.PrimerNombre,
NroDocumentoIngresado = request.NroDocumentoIngresado,
NroDocumentoObtenido = entity.NroDocumento.ToString(),
SexoIngresado = request.SexoIngresado,
SexoObtenido = entity.Sexo,
TipoDocumentoIngresado = request.TipoDocumentoIngresado,
TipoDocumentoObtenido = entity.TipoDocumento.Nombre

};

var ret = GetCoeficienteBusqueda(rq);
return ret;
}

public ViewModel.Response.CoeficienteBusquedaResponce GetCoeficienteBusqueda(CoeficienteBusquedaRequest request)
{
if (request is null)
{
throw new ArgumentNullException(nameof(request));
}

if (!Common.Utils.Helpers.DateTimeHelper.TryParseFromAR(request.FechaNacimientoIngresado, out var dtFechaIngrasada))
{
throw new System.ArgumentException("Formato invalido debe ser: dd/mm/yyyy", nameof(request.FechaNacimientoIngresado));
}
if (!Common.Utils.Helpers.DateTimeHelper.TryParseFromAR(request.FechaNacimientoObtenido, out var dtFechaObtenida))
{
throw new System.ArgumentException("Formato invalido debe ser: dd/mm/yyyy", nameof(request.FechaNacimientoObtenido));
}

var ret = new ViewModel.Response.CoeficienteBusquedaResponce();

var element = MatchScoreHelper.MatchApellido.GenerateScoreElement(request.ApellidoObtenido, request.ApellidoIngresado);
ret.ApellidoScoreElement = Mapper.Map<CoeficienteScoreElementResponse>(element);
ret.CoeficienteTotalFinal += ret.ApellidoScoreElement.CoeficienteFinal;

element = MatchScoreHelper.MatchNombre.GenerateScoreElement(request.NombreObtenido, request.NombreIngresado);
ret.NombreScoreElement = Mapper.Map<CoeficienteScoreElementResponse>(element);
ret.CoeficienteTotalFinal += ret.NombreScoreElement.CoeficienteFinal;

element = MatchScoreHelper.MatchNroDocumento.GenerateScoreElement(request.NroDocumentoObtenido, request.NroDocumentoIngresado);
ret.NroDocumentoScoreElement = Mapper.Map<CoeficienteScoreElementResponse>(element);
ret.CoeficienteTotalFinal += ret.NroDocumentoScoreElement.CoeficienteFinal;

element = MatchScoreHelper.MatchFechaNacimiento.GenerateScoreElement(dtFechaObtenida.ToString("yyyyMMdd"), dtFechaIngrasada.ToString("yyyyMMdd"));
element.Ingresado = request.FechaNacimientoIngresado;
element.Obtenido = request.FechaNacimientoObtenido;
ret.FechaNacimientoScoreElement = Mapper.Map<CoeficienteScoreElementResponse>(element);
ret.CoeficienteTotalFinal += ret.FechaNacimientoScoreElement.CoeficienteFinal;

ret.TipoDocumentoScoreElement = new CoeficienteScoreElementResponse
{
PesoValor = MatchScoreHelper.MatchTipoDocumento.MatchValue,
PesoValorUI = MatchScoreHelper.MatchTipoDocumento.MatchValue.ToString("P2"),
Ingresado = request.TipoDocumentoIngresado,
Obtenido = request.TipoDocumentoObtenido,
LevenshteinDistante = $"(no aplicable)",
CoeficienteParcialUI = $"(no aplicable)",
ObtenidoLen = $"(no aplicable)",
CoeficienteFinal = (request.TipoDocumentoIngresado == request.TipoDocumentoObtenido) ? MatchScoreHelper.MatchTipoDocumento.MatchValue : 0,
CoeficienteFinalUI = (request.TipoDocumentoIngresado == request.TipoDocumentoObtenido) ? MatchScoreHelper.MatchTipoDocumento.MatchValue.ToString("P2") : 0M.ToString("P2")
};
ret.CoeficienteTotalFinal += ret.TipoDocumentoScoreElement.CoeficienteFinal;

ret.SexoScoreElement = new CoeficienteScoreElementResponse
{
PesoValor = MatchScoreHelper.MatchSexo.MatchValue,
PesoValorUI = MatchScoreHelper.MatchSexo.MatchValue.ToString("P2"),
Ingresado = request.SexoIngresado,
Obtenido = request.SexoObtenido,
LevenshteinDistante = $"(no aplicable)",
CoeficienteParcialUI = $"(no aplicable)",
ObtenidoLen = $"(no aplicable)",
CoeficienteFinal = (request.SexoIngresado== request.SexoObtenido) ? MatchScoreHelper.MatchSexo.MatchValue : 0,
CoeficienteFinalUI = (request.SexoIngresado == request.SexoObtenido) ? MatchScoreHelper.MatchSexo.MatchValue.ToString("P2") : 0M.ToString("P2")
};
ret.CoeficienteTotalFinal += ret.SexoScoreElement.CoeficienteFinal;

ret.CoeficietneTotalFinalUI = ret.CoeficienteTotalFinal.ToString("P2");

return ret;
}

public Common.OperationResults.OperationResult FederarPaciente(int pacienteId)
{
Expand Down Expand Up @@ -69,28 +176,28 @@ public Common.OperationResults.OperationResult FederarPaciente(int pacienteId)

public bool ExistePacienteEnBUS(int pacienteId)
{
//BUSQUEDA BY MATCH: NO UTULIZADA, SE DEJA A MODO DE DOCUENTACION
//var sexo = (model.Sexo == "M") ? Sexo.Masculino : Sexo.Femenido;
//var fn = DateTime.Parse(model.FechaNacimiento);
//var request = new Msn.InteropDemo.Fhir.Model.Request.ExistPatientRequest
//{
// Dni = model.NroDocumento.Value,
// FechaNacimiento = fn,
// Sexo = sexo,
// OtrosNombres = model.OtrosNombres,
// PrimerApellido = model.PrimerApellido,
// PrimerNombre = model.PrimerNombre
//};

//var exists = _patientManager.ExistsPatient(request);

var model = GetById(pacienteId);

if (model == null)
{
throw new Exception("No se ha encontrado el Paciente en la Base de datos Local");
}

var sexo = (model.Sexo == "M") ? Sexo.Masculino : Sexo.Femenido;
var fn = DateTime.Parse(model.FechaNacimiento);

var request = new Msn.InteropDemo.Fhir.Model.Request.ExistPatientRequest
{
Dni = model.NroDocumento.Value,
FechaNacimiento = fn,
Sexo = sexo,
OtrosNombres = model.OtrosNombres,
PrimerApellido = model.PrimerApellido,
PrimerNombre = model.PrimerNombre
};

//Busqueda By Match
//var exists = _patientManager.ExistsPatient(request);
var exists = _patientManager.ExistsPatient(DomainName.LocalDomain, pacienteId.ToString());

return exists;
Expand Down Expand Up @@ -132,57 +239,54 @@ public List<PacienteListItemViewModel> BuscarPacienteCoincidentesLocal(string ap
throw new System.ArgumentException("Formato invalido debe ser: dd/mm/yyyy", nameof(fechaNacimiento));
}

Expression<Func<Entities.Pacientes.Paciente, bool>> filterExp = x => x.PrimerNombre.ToLower().StartsWith(nombre.ToLower()) ||
x.PrimerApellido.ToLower().StartsWith(apellido.ToLower()) ||
x.NroDocumento == nroDocumento ||
//x.Sexo == sexo || (no tiene sentido buscar por sexo y Tipo doc.)
x.FechaNacimiento == dtFechaNac;
var nombreSoundex = Common.Utils.Helpers.StringHelper.Soundex(nombre);
var apellidoSoundex = Common.Utils.Helpers.StringHelper.Soundex(apellido);

Expression<Func<Entities.Pacientes.Paciente, bool>> filterExp = x => x.PrimerApellidoSoundex == apellidoSoundex ||
x.PrimerNombreSoundex == nombreSoundex ||
x.NroDocumento == nroDocumento ||
x.FechaNacimiento == dtFechaNac;

var lst = Get<ViewModel.Pacientes.PacienteListItemViewModel>(filter: filterExp,
includeProperties: "TipoDocumento",
take: 50) //Solo los primeros 50 coincidentes
.ToList();
var lst = Get<PacienteListItemViewModel>(filter: filterExp,
includeProperties: "TipoDocumento",
orderBy: o => o.OrderBy(n => n.PrimerApellido).ThenBy(t => t.PrimerNombre),
take: 50) //Solo los primeros 50 coincidentes
.ToList();

decimal tmpScore;
foreach (var item in lst)
{
if (item.PrimerApellido.ToLower() == apellido.ToLower())
{
item.Score += (decimal)0.2;
item.PrimerApellidoEsCoincidente = true;
}
if (item.PrimerNombre.ToLower() == nombre.ToLower())
{
item.Score += (decimal)0.1;
item.PrimerNombreEsCoincidente = true;
}
tmpScore = MatchScoreHelper.MatchApellido.CalculateScore(item.PrimerApellido.ToLower(), apellido.ToLower());
item.Score += tmpScore;
item.PrimerApellidoEsCoincidente = (tmpScore == MatchScoreHelper.MatchApellido.MatchValue);

tmpScore = MatchScoreHelper.MatchNombre.CalculateScore(item.PrimerNombre.ToLower(), nombre.ToLower());
item.Score += tmpScore;
item.PrimerNombreEsCoincidente = (tmpScore == MatchScoreHelper.MatchNombre.MatchValue);

tmpScore = MatchScoreHelper.MatchNroDocumento.CalculateScore(item.NroDocumento.Value.ToString(), nroDocumento.ToString());
item.Score += tmpScore;
item.NroDocumentoEsCoincidente = (tmpScore == MatchScoreHelper.MatchNroDocumento.MatchValue);

tmpScore = MatchScoreHelper.MatchFechaNacimiento.CalculateScore(item.FechaNacimientoPlane, dtFechaNac.ToString("yyyyMMdd"));
item.Score += tmpScore;
item.FechaNacimientoEsCoincidente = (tmpScore == MatchScoreHelper.MatchFechaNacimiento.MatchValue);

if (item.TipoDocumentoId == (int)tipoDocumento)
{
item.Score += (decimal)0.1;
item.Score += MatchScoreHelper.MatchTipoDocumento.MatchValue;
item.TipoDocumentoEsCoincidente = true;
}
if (item.NroDocumento == (int)nroDocumento)
{
item.Score += (decimal)0.3;
item.NroDocumentoEsCoincidente = true;
}

if (item.Sexo.ToLower() == sexo.ToLower())
{
item.Score += (decimal)0.1;
item.Score += MatchScoreHelper.MatchSexo.MatchValue;
item.SexoEsCoincidente = true;
}
if (item.FechaNacimiento == dtFechaNac.ToString("dd/MM/yyyy"))
{
item.Score += (decimal)0.2;
item.FechaNacimientoEsCoincidente = true;
}
}

lst = lst.OrderByDescending(x => x.Score).ToList();

//CurrentContext.RegisterActivityLog(Entities.Activity.ActivityType.SEARCH_PACIENTES_COINCIDENTES_DB_LOCAL,
// filterExp.ToString(),
// $"Pacientes obtenidos:{lst.Count}");

return lst;
}

Expand All @@ -206,13 +310,12 @@ public override OperationResult<int> Save(Entities.Pacientes.Paciente entity)
throw new Exception("El sexo es requerido.");
}

entity.PrimerNombreSoundex = Common.Utils.Helpers.StringHelper.Soundex(entity.PrimerNombre);
entity.PrimerApellidoSoundex = Common.Utils.Helpers.StringHelper.Soundex(entity.PrimerApellido);

var op = base.Save(entity);
op.Id = entity.Id;

//CurrentContext.RegisterActivityLog(Entities.Activity.ActivityType.CREATE_PACIENTE_EN_DB_LOCAL,
// entity.ToString(),
// $"Paciente generado:{entity.Id}");

return op;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public LogActiviyProfile()
{
CreateMap<ActivityLog, ActivityLogListItemViewModel>()
.ForMember(dest => dest.ActivityTypeDescriptorName, orig => orig.MapFrom(x => x.ActivityTypeDescriptor.Nombre))
.ForMember(dest => dest.CreatedUserName, orig => orig.MapFrom(x => $"{x.CreatedUser.Apellido}, {x.CreatedUser.Nombre}"))
.ForMember(dest => dest.CreatedDateTimeUI, orig => orig.MapFrom(x => x.CreatedDateTime.ToString("dd/MM/yyyy hh:mm:ss")));

CreateMap<ActivityLog, ActivityLogViewModel>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ public class PacienteProfile : AutoMapper.Profile
{
public PacienteProfile()
{
//TODO: Borrar cuando sea movido el Helper a AppServices
CreateMap<Common.Utils.Helpers.ScoreElement, ViewModel.Response.CoeficienteScoreElementResponse>();

CreateMap<Entities.Pacientes.Paciente, ViewModel.Pacientes.PacienteListItemViewModel>()
.ForMember(dest => dest.TipoDocumentoId, orig => orig.MapFrom(x => x.TipoDocumentoId))
.ForMember(dest => dest.TipoDocumentoNombre, orig => orig.MapFrom(x => x.TipoDocumento.Nombre))
.ForMember(dest => dest.FechaNacimiento, orig => orig.MapFrom(x => x.FechaNacimiento.ToString("dd/MM/yyyy")))
.ForMember(dest => dest.FechaNacimientoPlane, orig => orig.MapFrom(x => x.FechaNacimiento.ToString("yyyyMMdd")))
.ForMember(dest => dest.ApellidosNombresCompletos, orig => orig.MapFrom(x => $"{x.PrimerApellido} {x.OtrosApellidos}, {x.PrimerNombre} {x.OtrosNombres}" ))
.ForMember(dest => dest.TipoDocumentoNombreNroDocumento, orig => orig.MapFrom(x => $"{x.TipoDocumento.Nombre} {x.NroDocumento}"))
.ForMember(dest => dest.SexoNombre, orig => orig.MapFrom(x => x.Sexo == "M" ? "Masculino" : "Femenino"));
Expand Down
2 changes: 2 additions & 0 deletions Msn.InteropDemo.AppServices/IPacienteAppService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ List<PacienteListItemViewModel> BuscarPacienteCoincidentesLocal(string apellido,
bool ExistePacienteEnBUS(int pacienteId);
Common.OperationResults.OperationResult FederarPaciente(int pacienteId);
PacienteViewModel GetById(int pacienteId);
ViewModel.Response.CoeficienteBusquedaResponce GetCoeficienteBusqueda(ViewModel.Request.CoeficienteBusquedaRequest request);
ViewModel.Response.CoeficienteBusquedaResponce GetCoeficienteBusqueda(ViewModel.Request.CoeficienteBusquedaIngresadoRequest request);
}
}
Loading

0 comments on commit 182d171

Please sign in to comment.