Almacenes - AndresRamos/ARSoftware.Contpaqi.Comercial GitHub Wiki

Modelos

Almacen

La clase Almacen representa un modelo amigable de un almacen. Se utiliza principalmente para la creación de almacenes.

public class Almacen
{
    /// <summary>
    ///     Id del almacén.
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    ///     Código del almacén.
    /// </summary>
    public string Codigo { get; set; } = string.Empty;

    /// <summary>
    ///     Nombre del almacén.
    /// </summary>
    public string Nombre { get; set; } = string.Empty;

    /// <summary>
    ///     Datos extra del almacén.
    /// </summary>
    public Dictionary<string, string> DatosExtra { get; set; } = new();
}

admAlmacenes

La clase admAlmacenes representa el modelo de SQL con el esquema completo de la tabla de almacenes en la base de datos. Se utiliza principalmente para consultar el catalogo de almacenes cuando se necesita obtener el esquema completo.

public partial class admAlmacenes
{
    public int CIDALMACEN { get; set; }
    public string CCODIGOALMACEN { get; set; } = null!;
    public string CNOMBREALMACEN { get; set; } = null!;
    public DateTime CFECHAALTAALMACEN { get; set; }
    public int CIDVALORCLASIFICACION1 { get; set; }
    public int CIDVALORCLASIFICACION2 { get; set; }
    public int CIDVALORCLASIFICACION3 { get; set; }
    public int CIDVALORCLASIFICACION4 { get; set; }
    public int CIDVALORCLASIFICACION5 { get; set; }
    public int CIDVALORCLASIFICACION6 { get; set; }
    public string CSEGCONTALMACEN { get; set; } = null!;
    public string CTEXTOEXTRA1 { get; set; } = null!;
    public string CTEXTOEXTRA2 { get; set; } = null!;
    public string CTEXTOEXTRA3 { get; set; } = null!;
    public DateTime CFECHAEXTRA { get; set; }
    public double CIMPORTEEXTRA1 { get; set; }
    public double CIMPORTEEXTRA2 { get; set; }
    public double CIMPORTEEXTRA3 { get; set; }
    public double CIMPORTEEXTRA4 { get; set; }
    public int CBANDOMICILIO { get; set; }
    public string CTIMESTAMP { get; set; } = null!;
    public string CSCALMAC2 { get; set; } = null!;
    public string CSCALMAC3 { get; set; } = null!;
    public int CSISTORIG { get; set; }
}

AlmacenDto

La clase AlmacenDto representa un modelo de almacen simplificado. Se utiliza principalmente para consultar el catalogo de almacenes cuando solo se necesitan algunas propiedades. Las propiedades de este modelo tienen los los mismos nombres que las propiedades del modelo de SQL para facilitar la asignacion de valores cuando se utiliza con los repositorios genericos de almacenes, como por ejemplo los que implementan IAlmacenRepository<T> de AlmacenDto.

public class AlmacenDto
{
    /// <summary>
    ///     Id del almacén.
    /// </summary>
    public int CIDALMACEN { get; set; }

    /// <summary>
    ///     Código del almacén.
    /// </summary>
    public string CCODIGOALMACEN { get; set; } = string.Empty;

    /// <summary>
    ///     Nombre del almacén.
    /// </summary>
    public string CNOMBREALMACEN { get; set; } = string.Empty;
}

Comandos

Servicios

El servicio IAlmacenService proporciona metodos para crear y actualizar almacenes.

public interface IAlmacenService
{
    /// <summary>
    ///     Actualiza un almacén por su Id. Los datos a actualizar se pasan en un diccionario donde la llave es el nombre de la
    ///     columna de la tabla de almacenes en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="idAlmacen">El Id del almacén a actualizar.</param>
    /// <param name="datosAlmacen">Datos del almacén a actualizar.</param>
    void Actualizar(int idAlmacen, Dictionary<string, string> datosAlmacen);

    /// <summary>
    ///     Actualiza un almacén por su código. Los datos a actualizar se pasan en un diccionario donde la llave es el nombre
    ///     de la columna de la tabla de almacenes en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="codigoAlmacen">Código del almacén a actualizar.</param>
    /// <param name="datosAlmacen">Datos del almacén a actualizar.</param>
    void Actualizar(string codigoAlmacen, Dictionary<string, string> datosAlmacen);

    /// <summary>
    ///     Crea un almacén. Los datos del almacén se pasan en un diccionario donde la llave es el nombre de la columna de la
    ///     tabla de almacenes en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="datosAlmacen">Datos del almacén a crear.</param>
    /// <returns>El Id del almacén creado.</returns>
    int Crear(Dictionary<string, string> datosAlmacen);

    /// <summary>
    ///     Crear un almacén.
    /// </summary>
    /// <param name="almacen">Almacén a crear.</param>
    /// <returns>El Id del almacén creado.</returns>
    int Crear(Almacen almacen);
}

Crear Almacen

public class CrearAlmacen
{
    private readonly IAlmacenService _almacenService;

    public CrearAlmacen(IAlmacenService almacenService)
    {
        _almacenService = almacenService;
    }

    public int Crear()
    {
        var almacen = new Almacen { Codigo = "PRUEBA", Nombre = "ALMACEN DE PRUEBAS" };

        almacen.DatosExtra.Add(nameof(admAlmacenes.CTEXTOEXTRA1), "Texto extra 2");
        almacen.DatosExtra.Add(nameof(admAlmacenes.CTEXTOEXTRA2), "Texto extra 2");

        int nuevoAlmacenId = _almacenService.Crear(almacen);

        return nuevoAlmacenId;
    }
}

Editar Almacen

public class EditarAlmacen
{
    private readonly IAlmacenService _almacenService;

    public EditarAlmacen(IAlmacenService almacenService)
    {
        _almacenService = almacenService;
    }

    public void Editar()
    {
        var codigoAlmacen = "PRUEBA";

        var datosAlmacen = new Dictionary<string, string>
        {
            { nameof(admAlmacenes.CNOMBREALMACEN), "ALMACEN DE PRUEBAS MODIFICADO" },
            { nameof(admAlmacenes.CTEXTOEXTRA1), "Texto extra 1" },
            { nameof(admAlmacenes.CTEXTOEXTRA2), "Texto extra 2" },
            { nameof(admAlmacenes.CTEXTOEXTRA3), "Texto extra 3" }
        };

        _almacenService.Actualizar(codigoAlmacen, datosAlmacen);
    }
}

Consultas

Repositorios

El proyecto incluye repositorios que implementan la interfaz IAlmacenRepository<T> que proporciona metodos que puedes utilizar para consultar el catalogo almacenes.

Los repositorios disponibles para SDK son:

  • AlmacenSdkRepository<T> - Implementa IAlmacenRepository<T>

El repositorio AlmacenSdkRepository<T> utiliza reflection para buscar los valores de la propiedades del tipo T en el modelo de SQL admAlmacenes por lo que debes asegurarte que las propiedades del tipo T tengan el mismo nombre que las columnas de la tabla admAlmacenes en la base de datos. El proyecto ya incluye un tipo AlmacenDto que cumple con este requisito.

Los repositorios disponibles para SQL son:

  • AlmacenSqlRepository<T> - Implementa IAlmacenSqlRepository<T>. IAlmacenSqlRepository<T> hereda de IAlmacenRepository<T> y define las versiones asincronas de los metodos para beneficiarse del uso de Entity Framework Core.

El repositorio AlmacenSqlRepository<T> utiliza AutoMapper para proyectar el modelo de SQL admAlmacenes al tipo del parametro T por lo debes crear una configuracion de mapeo con AutoMapper para que funcione. El proyecto ya incluye una configuracion de mapeo para el tipo AlmacenDto.

IAlmacenRepository<T>

/// <summary>
///     Interfaz de repositorio que define métodos para consultar almacenes.
/// </summary>
/// <typeparam name="T">
///     El tipo de almacén utilizado por el repositorio.
/// </typeparam>
public interface IAlmacenRepository<T> where T : class, new()
{
    /// <summary>
    ///     Busca un almacén por código.
    /// </summary>
    /// <param name="codigoAlmacen">Código del almacén a buscar.</param>
    /// <returns>
    ///     Un almacén, o <see langword="null" /> si no existe un almacén con el código proporcionado.
    /// </returns>
    T? BuscarPorCodigo(string codigoAlmacen);

    /// <summary>
    ///     Busca un almacén por id.
    /// </summary>
    /// <param name="idAlmacen">
    ///     Id del almacén a buscar.
    /// </param>
    /// <returns>
    ///     Un almacén, o <see langword="null" /> si no existe un almacén con el id proporcionado.
    /// </returns>
    T? BuscarPorId(int idAlmacen);

    /// <summary>
    ///     Busca todos los almacenes.
    /// </summary>
    /// <returns>
    ///     Lista de almacenes.
    /// </returns>
    List<T> TraerTodo();
}

IAlmacenSqlRepository<T>

/// <inheritdoc cref="IAlmacenRepository{T}" />
public interface IAlmacenSqlRepository<T> : IAlmacenRepository<T> where T : class, new()
{
    /// <summary>
    ///     Busca un almacén por código.
    /// </summary>
    /// <param name="codigoAlmacen">Código del almacén a buscar.</param>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Un almacén, o <see langword="null" /> si no existe un almacén con el código proporcionado.
    /// </returns>
    Task<T?> BuscarPorCodigoAsync(string codigoAlmacen, CancellationToken cancellationToken);

    /// <summary>
    ///     Busca un almacén por id.
    /// </summary>
    /// <param name="idAlmacen">
    ///     Id del almacén a buscar.
    /// </param>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Un almacén, o <see langword="null" /> si no existe un almacén con el id proporcionado.
    /// </returns>
    Task<T?> BuscarPorIdAsync(int idAlmacen, CancellationToken cancellationToken);

    /// <summary>
    ///     Busca todos los almacenes.
    /// </summary>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Lista de almacenes.
    /// </returns>
    Task<List<T>> TraerTodoAsync(CancellationToken cancellationToken);
}

Dependency Injection

public sealed class BuscarAlmacenesConRepositorio
{
    private readonly IAlmacenRepository<admAlmacenes> _almacenRepository;
    // private readonly IAlmacenRepository<AlmacenDto> _almacenRepository;
    // private readonly IAlmacenRepository<TuModelo> _almacenRepository;

    public BuscarAlmacenesConRepositorio(IAlmacenRepository<admAlmacenes> almacenRepository)
    {
        _almacenRepository = almacenRepository;
    }
}

Buscar Por Codigo

public void BuscarPorCodigo()
{
    var codigoAlmacen = "PRUEBA";

    AlmacenDto? almacen = _almacenRepository.BuscarPorCodigo(codigoAlmacen);

    _logger.LogInformation("{@Almacen}", almacen);
}

Buscar Por Id

 public void BuscarPorId()
 {
     var idAlmacen = 1;

     AlmacenDto? almacen = _almacenRepository.BuscarPorId(idAlmacen);

     _logger.LogInformation("{@Almacen}", almacen);
 }

Traer Todo

public void TraerTodo()
{
    List<AlmacenDto> almacenes = _almacenRepository.TraerTodo();

    _logger.LogInformation("{@Almacenes}", almacenes);
}
⚠️ **GitHub.com Fallback** ⚠️