Movimientos - AndresRamos/ARSoftware.Contpaqi.Comercial GitHub Wiki

Modelos

Movimiento

La clase Movimiento representa un modelo amigable de un movimiento. Se utiliza principalmente para la creación de movimientos.

public class Movimiento
{
    /// <summary>
    ///     Id del movimiento.
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    ///     Producto del movimiento.
    /// </summary>
    public Producto Producto { get; set; } = new();

    /// <summary>
    ///     Almacen del movimiento
    /// </summary>
    public Almacen? Almacen { get; set; } = new();

    /// <summary>
    ///     Cantidad de unidad base del movimiento.
    /// </summary>
    public double Unidades { get; set; }

    /// <summary>
    ///     Precio del producto
    /// </summary>
    public decimal Precio { get; set; }

    /// <summary>
    ///     Subtotal del movimiento.
    /// </summary>
    public decimal Subtotal { get; set; }

    /// <summary>
    ///     Descuentos del movimiento.
    /// </summary>
    public DescuentosMovimiento? Descuentos { get; set; }

    /// <summary>
    ///     Impuestos del movimiento.
    /// </summary>
    public ImpuestosMovimiento? Impuestos { get; set; }

    /// <summary>
    ///     Retenciones del movimiento.
    /// </summary>
    public RetencionesMovimiento? Retenciones { get; set; }

    /// <summary>
    ///     Total del movimiento
    /// </summary>
    public decimal Total { get; set; }

    /// <summary>
    ///     Referencia del movimiento.
    /// </summary>
    public string Referencia { get; set; } = string.Empty;

    /// <summary>
    ///     Observaciones del movimiento.
    /// </summary>
    public string? Observaciones { get; set; }

    /// <summary>
    ///     Series o capas del movimiento.
    /// </summary>
    public List<SeriesCapas> SeriesCapas { get; set; } = new();

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

admMovimientos

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

public partial class admMovimientos
{
    public int CIDMOVIMIENTO { get; set; }
    public int CIDDOCUMENTO { get; set; }
    public double CNUMEROMOVIMIENTO { get; set; }
    public int CIDDOCUMENTODE { get; set; }
    public int CIDPRODUCTO { get; set; }
    public int CIDALMACEN { get; set; }
    public double CUNIDADES { get; set; }
    public double CUNIDADESNC { get; set; }
    public double CUNIDADESCAPTURADAS { get; set; }
    public int CIDUNIDAD { get; set; }
    public int CIDUNIDADNC { get; set; }
    public double CPRECIO { get; set; }
    public double CPRECIOCAPTURADO { get; set; }
    public double CCOSTOCAPTURADO { get; set; }
    public double CCOSTOESPECIFICO { get; set; }
    public double CNETO { get; set; }
    public double CIMPUESTO1 { get; set; }
    public double CPORCENTAJEIMPUESTO1 { get; set; }
    public double CIMPUESTO2 { get; set; }
    public double CPORCENTAJEIMPUESTO2 { get; set; }
    public double CIMPUESTO3 { get; set; }
    public double CPORCENTAJEIMPUESTO3 { get; set; }
    public double CRETENCION1 { get; set; }
    public double CPORCENTAJERETENCION1 { get; set; }
    public double CRETENCION2 { get; set; }
    public double CPORCENTAJERETENCION2 { get; set; }
    public double CDESCUENTO1 { get; set; }
    public double CPORCENTAJEDESCUENTO1 { get; set; }
    public double CDESCUENTO2 { get; set; }
    public double CPORCENTAJEDESCUENTO2 { get; set; }
    public double CDESCUENTO3 { get; set; }
    public double CPORCENTAJEDESCUENTO3 { get; set; }
    public double CDESCUENTO4 { get; set; }
    public double CPORCENTAJEDESCUENTO4 { get; set; }
    public double CDESCUENTO5 { get; set; }
    public double CPORCENTAJEDESCUENTO5 { get; set; }
    public double CTOTAL { get; set; }
    public double CPORCENTAJECOMISION { get; set; }
    public string CREFERENCIA { get; set; } = null!;
    public string? COBSERVAMOV { get; set; }
    public int CAFECTAEXISTENCIA { get; set; }
    public int CAFECTADOSALDOS { get; set; }
    public int CAFECTADOINVENTARIO { get; set; }
    public DateTime CFECHA { get; set; }
    public int CMOVTOOCULTO { get; set; }
    public int CIDMOVTOOWNER { get; set; }
    public int CIDMOVTOORIGEN { get; set; }
    public double CUNIDADESPENDIENTES { get; set; }
    public double CUNIDADESNCPENDIENTES { get; set; }
    public double CUNIDADESORIGEN { get; set; }
    public double CUNIDADESNCORIGEN { get; set; }
    public int CTIPOTRASPASO { get; set; }
    public int CIDVALORCLASIFICACION { get; set; }
    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 string CTIMESTAMP { get; set; } = null!;
    public double CGTOMOVTO { get; set; }
    public string CSCMOVTO { get; set; } = null!;
    public double CCOMVENTA { get; set; }
    public int CIDMOVTODESTINO { get; set; }
    public int CNUMEROCONSOLIDACIONES { get; set; }
    public string COBJIMPU01 { get; set; } = null!;
}

MovimientoDto

La clase MovimientoDto representa un modelo de movimiento simplificado. Se utiliza principalmente para consultar el catalogo de movimientos 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 movimientos, como por ejemplo los que implementan IMovimientoRepository<T> de MovimientoDto.

public class MovimientoDto
{
    /// <summary>
    ///     Id del movimiento.
    /// </summary>
    public int CIDMOVIMIENTO { get; set; }

    /// <summary>
    ///     Identificador del producto del movimiento.
    /// </summary>
    public int CIDPRODUCTO { get; set; }

    /// <summary>
    ///     Identificador del almacén del movimiento.
    /// </summary>
    public int CIDALMACEN { get; set; }

    /// <summary>
    ///     Cantidad de unidad base del movimiento.
    /// </summary>
    public double CUNIDADES { get; set; }

    /// <summary>
    ///     Precio del producto.
    /// </summary>
    public double CPRECIO { get; set; }

    /// <summary>
    ///     Importe del neto para el movimiento.
    /// </summary>
    public double CNETO { get; set; }

    /// <summary>
    ///     Importe del total del movimiento.
    /// </summary>
    public double CTOTAL { get; set; }

    /// <summary>
    ///     Referencia del movimiento.
    /// </summary>
    public string CREFERENCIA { get; set; } = string.Empty;

    /// <summary>
    ///     Observaciones del movimiento.
    /// </summary>
    public string? COBSERVAMOV { get; set; } = string.Empty;

    /// <summary>
    ///     Importe del Impuesto 1 para el movimiento.
    /// </summary>
    public double CIMPUESTO1 { get; set; }

    /// <summary>
    ///     Porcentaje del impuesto 1.
    /// </summary>
    public double CPORCENTAJEIMPUESTO1 { get; set; }

    /// <summary>
    ///     Importe del Impuesto 2 para el movimiento.
    /// </summary>
    public double CIMPUESTO2 { get; set; }

    /// <summary>
    ///     Porcentaje del impuesto 2.
    /// </summary>
    public double CPORCENTAJEIMPUESTO2 { get; set; }

    /// <summary>
    ///     Importe del Impuesto 3 para el movimiento.
    /// </summary>
    public double CIMPUESTO3 { get; set; }

    /// <summary>
    ///     Porcentaje del impuesto 3.
    /// </summary>
    public double CPORCENTAJEIMPUESTO3 { get; set; }

    /// <summary>
    ///     Importe de la retención 1 para el movimiento.
    /// </summary>
    public double CRETENCION1 { get; set; }

    /// <summary>
    ///     Porcentaje de la retención 1.
    /// </summary>
    public double CPORCENTAJERETENCION1 { get; set; }

    /// <summary>
    ///     Importe de la retención 2 para el movimiento.
    /// </summary>
    public double CRETENCION2 { get; set; }

    /// <summary>
    ///     Porcentaje de la retención 2.
    /// </summary>
    public double CPORCENTAJERETENCION2 { get; set; }

    /// <summary>
    ///     Importe del descuento 1 para el movimiento.
    /// </summary>
    public double CDESCUENTO1 { get; set; }

    /// <summary>
    ///     Porcentaje del descuento 1.
    /// </summary>
    public double CPORCENTAJEDESCUENTO1 { get; set; }

    /// <summary>
    ///     Importe del descuento 2 para el movimiento.
    /// </summary>
    public double CDESCUENTO2 { get; set; }

    /// <summary>
    ///     Porcentaje del descuento 2.
    /// </summary>
    public double CPORCENTAJEDESCUENTO2 { get; set; }

    /// <summary>
    ///     Importe del descuento 3 para el movimiento.
    /// </summary>
    public double CDESCUENTO3 { get; set; }

    /// <summary>
    ///     Porcentaje del descuento 3.
    /// </summary>
    public double CPORCENTAJEDESCUENTO3 { get; set; }

    /// <summary>
    ///     Importe del descuento 4 para el movimiento.
    /// </summary>
    public double CDESCUENTO4 { get; set; }

    /// <summary>
    ///     Porcentaje del descuento 4.
    /// </summary>
    public double CPORCENTAJEDESCUENTO4 { get; set; }

    /// <summary>
    ///     Importe del descuento 5 para el movimiento.
    /// </summary>
    public double CDESCUENTO5 { get; set; }

    /// <summary>
    ///     Porcentaje del descuento 5.
    /// </summary>
    public double CPORCENTAJEDESCUENTO5 { get; set; }
}

Comandos

Servicios

El servicio IMovimientoService define metodos para crear, actualizar y eliminar movimientos.

public interface IMovimientoService
{
    /// <summary>
    ///     Actualiza un movimiento 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 movimientos en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="idMovimiento">El id del movimiento a actualizar.</param>
    /// <param name="datosMovimiento">Datos del movimiento a actualizar.</param>
    void Actualizar(int idMovimiento, Dictionary<string, string> datosMovimiento);

    /// <summary>
    ///     Crear un movimiento por dato abstracto.
    /// </summary>
    /// <param name="idDocumento">El id del documento al que se le va a crear el movimiento.</param>
    /// <param name="movimiento">Movimiento a crear.</param>
    /// <returns>El id del movimiento creado.</returns>
    int Crear(int idDocumento, tMovimiento movimiento);

    /// <summary>
    ///     Crear un movimiento de descuento por dato abstracto.
    /// </summary>
    /// <param name="idDocumento">El id del documento al que se le va a crear el movimiento.</param>
    /// <param name="movimiento">Movimiento a crear.</param>
    /// <returns>El id del movimiento creado.</returns>
    int Crear(int idDocumento, tMovimientoDesc movimiento);

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

    /// <summary>
    ///     Crea un movimiento.
    /// </summary>
    /// <param name="idDocumento">El id del documento al que se le va a crear el movimiento.</param>
    /// <param name="movimiento">Movimiento a crear.</param>
    /// <returns>El id del movimiento creado.</returns>
    int Crear(int idDocumento, Movimiento movimiento);

    /// <summary>
    ///     Crea la series o capas de un movimiento.
    /// </summary>
    /// <param name="movimientoId">Id del movimiento al que se le va a crear la serie o capas.</param>
    /// <param name="seriesCapas">Las series o capas a crear.</param>
    void CrearSeriesCapas(int movimientoId, tSeriesCapas seriesCapas);

    /// <summary>
    ///     Elimina un movimiento por su id.
    /// </summary>
    /// <param name="idDocumento">Id del documento al que pertenece el movimiento a eliminar.</param>
    /// <param name="idMovimiento">Id del movimiento a eliminar.</param>
    void Eliminar(int idDocumento, int idMovimiento);
}

Crear Movimiento

public class CrearMovimiento
{
    private readonly IMovimientoService _movimientoService;

    public CrearMovimiento(IMovimientoService movimientoService)
    {
        _movimientoService = movimientoService;
    }

    public int Crear(int documentoId)
    {
        var movimiento = new Movimiento
        {
            Producto = new Producto { Codigo = "PRUEBA" },
            Almacen = new Almacen { Codigo = "PRUEBA" },
            Unidades = 1,
            Precio = 100,
            Referencia = "Referencia",
            Observaciones = "Observaciones"
        };

        movimiento.DatosExtra.Add(nameof(admMovimientos.CTEXTOEXTRA1), "Texto Extra 1");

        return _movimientoService.Crear(documentoId, movimiento);
    }
}

Editar Movimiento

public class EditarMovimiento
{
    private readonly IMovimientoService _movimientoService;

    public EditarMovimiento(IMovimientoService movimientoService)
    {
        _movimientoService = movimientoService;
    }

    public void Editar(int movimientoId)
    {
        var datosMovimiento = new Dictionary<string, string>
        {
            { nameof(admMovimientos.CTEXTOEXTRA1), "Texto Extra 1" },
            { nameof(admMovimientos.CTEXTOEXTRA2), "Texto Extra 2" },
            { nameof(admMovimientos.CTEXTOEXTRA3), "Texto Extra 3" },
            { nameof(admMovimientos.CREFERENCIA), "Referencia" },
            { nameof(admMovimientos.COBSERVAMOV), "Observaciones" }
        };

        _movimientoService.Actualizar(movimientoId, datosMovimiento);
    }
}

Eliminar Movimiento

public class EliminarMovimiento
{
    private readonly IMovimientoService _movimientoService;

    public EliminarMovimiento(IMovimientoService movimientoService)
    {
        _movimientoService = movimientoService;
    }

    public void Eliminar(int documentoId, int movimientoId)
    {
        _movimientoService.Eliminar(documentoId, movimientoId);
    }
}

Consultas

Repositorios

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

Los repositorios disponibles para SDK son:

  • MovimientoSdkRepository<T> - Implementa IMovimientoRepository<T>.

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

Los repositorios disponibles para SQL son:

  • MovimientoSqlRepository<T> - Implementa IMovimientoSqlRepository<T>. IMovimientoSqlRepository<T> hereda de IMovimientoRepository<T> y define las versiones asincronas de los metodos para beneficiarse del uso de Entity Framework Core.

El repositorio MovimientoSqlRepository<T> utiliza AutoMapper para proyectar el modelo de SQL admMovimientos 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 MovimientoDto.

IMovimientoRepository<T>

public interface IMovimientoRepository<T> where T : class, new()
{
    /// <summary>
    ///     Busca un movimiento por id.
    /// </summary>
    /// <param name="idMovimiento">
    ///     Id del movimiento a buscar.
    /// </param>
    /// <returns>
    ///     Un movimiento, o <see langword="null" /> si no existe un movimiento con el id proporcionado.
    /// </returns>
    T? BuscarPorId(int idMovimiento);

    /// <summary>
    ///     Busca movimientos por id de documento.
    /// </summary>
    /// <param name="idDocumento">
    ///     Id de documento de los movimientos a buscar.
    /// </param>
    /// <returns>
    ///     Lista de movimientos.
    /// </returns>
    List<T> TraerPorDocumentoId(int idDocumento);

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

IMovimientoSqlRepository<T>

/// <inheritdoc cref="IMovimientoRepository{T}" />
public interface IMovimientoSqlRepository<T> : IMovimientoRepository<T> where T : class, new()
{
    /// <summary>
    ///     Busca un movimiento por id.
    /// </summary>
    /// <param name="idMovimiento">
    ///     Id del movimiento a buscar.
    /// </param>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Un movimiento, o <see langword="null" /> si no existe un movimiento con el id proporcionado.
    /// </returns>
    Task<T?> BuscarPorIdAsync(int idMovimiento, CancellationToken cancellationToken);

    /// <summary>
    ///     Busca movimientos por id de documento.
    /// </summary>
    /// <param name="idDocumento">
    ///     Id de documento de los movimientos a buscar.
    /// </param>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Lista de movimientos.
    /// </returns>
    Task<List<T>> TraerPorDocumentoIdAsync(int idDocumento, CancellationToken cancellationToken);

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

Dependency Injection

public sealed class BuscarMovimientosConRepositorio
{
    private readonly IMovimientoRepository<admMovimientos> _movimientoRepository;
    // private readonly IMovimientoRepository<MovimientoDto> _movimientoRepository;
    // private readonly IMovimientoRepository<TuModelo> _movimientoRepository;

    public BuscarMovimientosConRepositorio(IMovimientoRepository<admMovimientos> movimientoRepository)
    {
        _movimientoRepository = movimientoRepository;
    }
}

Buscar Por Id

public void BuscarPorId()
{
    var idMovimiento = 1;

    admMovimientos? movimiento = _movimientoRepository.BuscarPorId(idMovimiento);

    _logger.LogInformation("{@Movimiento}", movimiento);
}

Traer Por Documento Id

public void TraerPorDocumentoId()
{
    var idDocumento = 1;

    List<admMovimientos> movimientos = _movimientoRepository.TraerPorDocumentoId(idDocumento);

    _logger.LogInformation("{@Movimientos}", movimientos);
}

Traer Todo

public void TraerTodo()
{
    List<admMovimientos> movimientos = _movimientoRepository.TraerTodo();

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