# Class AdmissionRepository

Namespace
  adas_core.Infrastructure.Repositories

Assembly
  adas-core.Infrastructure.dll

Repositorio para gestionar las operaciones de la entidad Admission en MongoDB. Proporciona métodos para insertar, actualizar, eliminar y buscar admisiones, así como para manejar opciones de listas maestras relacionadas con las admisiones. Utiliza Serilog para el registro de errores y eventos importantes durante las operaciones de la base de datos.

    public class AdmissionRepository : MongoRepository<Admission>, IAdmissionRepository, IMongoRepository<Admission>

Inheritance
  object
  MongoRepository<Admission>
  AdmissionRepository

Implements
  IAdmissionRepository
  IMongoRepository<Admission>

Inherited Members
  MongoRepository<Admission>.Db
  MongoRepository<Admission>.Collection
  MongoRepository<Admission>.UpdateOneAsync(ObjectId, Admission)
  MongoRepository<Admission>.DeleteAsync(ObjectId)
  MongoRepository<Admission>.InsertInitialLoad()
  MongoRepository<Admission>.InsertManyAsync(List<Admission>)
  MongoRepository<Admission>.UpdateManyObjectIdAsync(string, ObjectId, ObjectId)
  MongoRepository<Admission>.DeleteAsync(string)
  MongoRepository<Admission>.CollectionExists(string)
  object.Equals(object)
  object.Equals(object, object)
  object.GetHashCode()
  object.GetType()
  object.MemberwiseClone()
  object.ReferenceEquals(object, object)
  object.ToString()

Extension Methods
  NumberUtils.IsNumber(object)
  NumberUtils.ToDouble(object)
  ObjectUtils.ToStr(object?)

## Constructors

### AdmissionRepository(IOptions<ApiSettings>, IMongoDatabase)

    public AdmissionRepository(IOptions<ApiSettings> apiSettings, IMongoDatabase database)

#### Parameters

`apiSettings` IOptions<ApiSettings>
`database` IMongoDatabase

## Methods

### CountByUnitId(ObjectId)

Cuenta el número de admisiones en la base de datos que coinciden con un identificador de unidad (unitId) específico. El método construye un filtro para encontrar admisiones que coincidan con el unitId especificado y luego utiliza el método CountDocumentsAsync para obtener el conteo.

    public Task<long> CountByUnitId(ObjectId unitId)

#### Parameters

`unitId` ObjectId

  El identificador de la unidad a buscar.

#### Returns

Task<long>

  Una tarea que representa la operación asincrónica y devuelve el número de admisiones que coinciden con el unitId especificado.

### CreateIndexes()

Crea índices en la colección de admisiones para mejorar el rendimiento de las consultas. En este caso, se crea un índice único en el campo "nhc" (número de paciente) que solo se aplica a los documentos que tienen un valor para "nhc".

    public override Task CreateIndexes()

#### Returns

Task

  Una tarea que representa la operación asincrónica.

### Delete(ObjectId)

Elimina una admisión de la base de datos utilizando su identificador único (ObjectId). El método construye un filtro para encontrar la admisión por su Id y luego utiliza el método DeleteOneAsync para eliminarla. Si ocurre una excepción durante el proceso, se registra un error con Serilog y se vuelve a lanzar la excepción para que pueda ser manejada por el llamador.

    public Task Delete(ObjectId id)

#### Parameters

`id` ObjectId

  El identificador único (ObjectId) de la admisión a eliminar.

#### Returns

Task

  Una tarea que representa la operación asincrónica.

### DeleteAdmissionsByUnitId(ObjectId)

Elimina todas las admisiones de la base de datos que coinciden con un identificador de unidad (unitId) específico. El método construye un filtro para encontrar admisiones que coincidan con el unitId especificado y luego utiliza el método DeleteManyAsync para eliminarlas.

    public Task<bool> DeleteAdmissionsByUnitId(ObjectId unitId)

#### Parameters

`unitId` ObjectId

  El identificador de la unidad cuyas admisiones se eliminarán.

#### Returns

Task<bool>

  Una tarea que representa la operación asincrónica y devuelve un valor booleano que indica si la eliminación fue exitosa.

### DeleteMasterListOption(List<ObjectId>, OptionList, string)

Elimina las opciones de la lista maestra en las admisiones que coinciden con los identificadores de unidad especificados. El método recibe una lista de identificadores de unidad, una opción de actualización de la lista maestra y el nombre del tipo de lista maestra.

    public Task<IEnumerable<Admission>> DeleteMasterListOption(List<ObjectId> unitIds, OptionList opt, string typeName)

#### Parameters

`unitIds` List<ObjectId>

  La lista de identificadores de unidad a buscar.

`opt` OptionList

  La opción de actualización de la lista maestra.

`typeName` string

  El nombre del tipo de lista maestra.

#### Returns

Task<IEnumerable<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones actualizadas.

### FindAll()

Recupera todas las admisiones almacenadas en la base de datos. El método utiliza el método FindAsync con un filtro vacío para obtener todas las admisiones y luego convierte el resultado a una lista. Si ocurre una excepción durante el proceso, se registra un error con Serilog y se devuelve una lista vacía.

    public Task<IEnumerable<Admission>> FindAll()

#### Returns

Task<IEnumerable<Admission>>

  Una lista de todas las admisiones almacenadas en la base de datos.

### FindByDiagnosis(string)

Busca admisiones en la base de datos utilizando el diagnóstico de la admisión (Diagnosis). El método construye un filtro para encontrar admisiones que tengan un diagnóstico que coincida con el nombre del diagnóstico especificado y luego utiliza el método FindAsync para obtenerlas.

    public Task<IEnumerable<Admission>?> FindByDiagnosis(string diagnosis)

#### Parameters

`diagnosis` string

  El nombre del diagnóstico que se utilizará para buscar admisiones.

#### Returns

Task<IEnumerable<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una colección de admisiones que coinciden con el diagnóstico especificado.

### FindById(ObjectId)

Busca una admisión en la base de datos utilizando su identificador único (ObjectId). El método construye un filtro para encontrar la admisión por su Id y luego utiliza el método FindAsync para obtenerla.

    public Task<Admission?> FindById(ObjectId id)

#### Parameters

`id` ObjectId

  El identificador único (ObjectId) de la admisión a buscar.

#### Returns

Task<Admission>

  Una tarea que representa la operación asincrónica y devuelve la admisión encontrada o null si no se encuentra ninguna.

### FindByLocation(PatientLocation)

Busca admisiones en la base de datos utilizando la ubicación del paciente (PatientLocation). El método construye un filtro para encontrar admisiones que coincidan con la unidad, cama y habitación especificadas en la ubicación del paciente.

    public Task<List<Admission>> FindByLocation(PatientLocation location)

#### Parameters

`location` PatientLocation

  La ubicación del paciente (PatientLocation) a buscar.

#### Returns

Task<List<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones que coinciden con la ubicación especificada.

### FindByNhc(string)

Busca una admisión en la base de datos utilizando el número de paciente (NHC). El método construye un filtro para encontrar la admisión por su NHC y luego utiliza el método FindAsync para obtenerla.

    public Task<Admission?> FindByNhc(string nhc)

#### Parameters

`nhc` string

  El número de paciente (NHC) a buscar.

#### Returns

Task<Admission>

  Una tarea que representa la operación asincrónica y devuelve la admisión encontrada o null si no se encuentra ninguna.

### FindByOrigin(string)

Busca admisiones en la base de datos utilizando el origen de la admisión (Origin). El método construye un filtro para encontrar admisiones que tengan un origen que coincida con el nombre del origen especificado.

    public Task<IEnumerable<Admission>?> FindByOrigin(string origin)

#### Parameters

`origin` string

  El nombre del origen de la admisión a buscar.

#### Returns

Task<IEnumerable<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones que coinciden con el origen especificado.

### FindByPointOfCareId(ObjectId)

Busca admisiones en la base de datos utilizando el identificador de punto de atención (PointOfCareId). El método construye un filtro para encontrar admisiones que coincidan con el PointOfCareId especificado y luego utiliza el método FindAsync para obtenerlas.

    public Task<List<Admission>> FindByPointOfCareId(ObjectId pocId)

#### Parameters

`pocId` ObjectId

  El identificador del punto de atención a buscar.

#### Returns

Task<List<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones que coinciden con el PointOfCareId especificado.

### FindByUnitIds(List<ObjectId>)

Busca admisiones en la base de datos utilizando una lista de identificadores de unidad (unitIds). El método construye un filtro para encontrar admisiones que tengan un unitId que coincida con cualquiera de los unitIds especificados y luego utiliza el método FindAsync para obtenerlas.

    public Task<List<Admission>> FindByUnitIds(List<ObjectId> unitIds)

#### Parameters

`unitIds` List<ObjectId>

  La lista de identificadores de unidad a buscar.

#### Returns

Task<List<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones que coinciden con los unitIds especificados.

### GetAdmissionByUnitIdWithOutPoC(ObjectId)

Busca admisiones en la base de datos utilizando el identificador de unidad (unitId) y que no tengan un PointOfCareId asignado. El método construye un filtro para encontrar admisiones que coincidan con el unitId especificado y que tengan un PointOfCareId nulo.

    public Task<List<Admission>> GetAdmissionByUnitIdWithOutPoC(ObjectId unitId)

#### Parameters

`unitId` ObjectId

  El identificador de la unidad a buscar.

#### Returns

Task<List<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones que coinciden con los criterios especificados.

### GetCollectionName()

Sobrescribe el método GetCollectionName para devolver el nombre de la colección de admisiones en MongoDB, que se obtiene de la configuración de la aplicación a través de ApiSettings. Esto permite que el repositorio se conecte a la colección correcta para realizar las operaciones de base de datos relacionadas con las admisiones.

    public override string GetCollectionName()

#### Returns

string

  El nombre de la colección de admisiones en MongoDB.

### InsertOneAsync(Admission)

Sobrescribe el método InsertOneAsync para insertar una nueva admisión en la base de datos. Antes de insertar, establece la fecha de admisión (AdmissionDate) a la fecha y hora actual en formato UTC.

    public override Task InsertOneAsync(Admission admission)

#### Parameters

`admission` Admission

  La admisión a insertar en la base de datos.

#### Returns

Task

  Una tarea que representa la operación asincrónica.

### InsertOneAsyncAndReturn(Admission)

Inserta una nueva admisión en la base de datos y devuelve la admisión insertada. El método establece la fecha de admisión (AdmissionDate) a la fecha y hora actual en formato UTC antes de insertar la admisión.

    public Task<Admission?> InsertOneAsyncAndReturn(Admission origin)

#### Parameters

`origin` Admission

  La admisión a insertar.

#### Returns

Task<Admission>

  Una tarea que representa la operación asincrónica y devuelve la admisión insertada o null si ocurre un error.

### SearchByPatientNumberAndDistinctUnit(string, ObjectId)

Busca una admisión en la base de datos utilizando el número de paciente (patientNumber) y un identificador de unidad (unitId) distinto. El método construye un filtro para encontrar una admisión que coincida con el número de paciente pero que tenga un unitId diferente al proporcionado.

    public Task<Admission?> SearchByPatientNumberAndDistinctUnit(string patientNumber, ObjectId unitId)

#### Parameters

`patientNumber` string

  El número de paciente (NHC) a buscar.

`unitId` ObjectId

  El identificador de unidad (ObjectId) que debe ser distinto al de la admisión encontrada.

#### Returns

Task<Admission>

  Una tarea que representa la operación asincrónica y devuelve la admisión encontrada o null si no se encuentra ninguna.

### Update(Admission)

Actualiza una admisión existente en la base de datos. El método recibe una instancia de Admission con los datos actualizados, construye un filtro para encontrar la admisión por su Id y luego utiliza el método UpdateOneAsync para aplicar los cambios.

    public Task Update(Admission admission)

#### Parameters

`admission` Admission

  La admisión con los datos actualizados.

#### Returns

Task

  Una tarea que representa la operación asincrónica.

### UpdateLocation(ObjectId, ObjectId)

Actualiza la ubicación de una admisión existente en la base de datos. El método recibe el identificador único (ObjectId) de la admisión a actualizar y el nuevo identificador de la ubicación (PointOfCareId). Construye un filtro para encontrar la admisión por su Id y luego utiliza el método UpdateOneAsync para establecer el nuevo PointOfCareId.

    public Task UpdateLocation(ObjectId id, ObjectId newLocation)

#### Parameters

`id` ObjectId

  El identificador único (ObjectId) de la admisión a actualizar.

`newLocation` ObjectId

  El nuevo identificador de la ubicación (PointOfCareId) de la admisión.

#### Returns

Task

  Una tarea que representa la operación asincrónica.

### UpdateMasterListOption(List<ObjectId>, UpdateOptionMasterListDto, string)

Actualiza las opciones de la lista maestra en las admisiones que coinciden con los identificadores de unidad especificados.

    public Task<IEnumerable<Admission>> UpdateMasterListOption(List<ObjectId> unitIds, UpdateOptionMasterListDto opt, string typeName)

#### Parameters

`unitIds` List<ObjectId>

  La lista de identificadores de unidad a buscar.

`opt` UpdateOptionMasterListDto

  La opción de actualización de la lista maestra.

`typeName` string

  El nombre del tipo de lista maestra.

#### Returns

Task<IEnumerable<Admission>>

  Una tarea que representa la operación asincrónica y devuelve una lista de admisiones actualizadas.

### UpdatePatient(ObjectId, Person)

Actualiza los datos personales de una admisión existente en la base de datos. El método recibe el identificador único (ObjectId) de la admisión a actualizar y una instancia de Person con los nuevos datos personales.

    public Task UpdatePatient(ObjectId id, Person patient)

#### Parameters

`id` ObjectId

  El identificador único (ObjectId) de la admisión a actualizar.

`patient` Person

  La instancia de Person con los nuevos datos personales.

#### Returns

Task

  Una tarea que representa la operación asincrónica.