Clientes y proveedores - AndresRamos/ARSoftware.Contpaqi.Comercial GitHub Wiki

Modelos

ClienteProveedor

La clase ClienteProveedor representa un modelo amigable de un cliente o proveedor. Se utiliza principalmente para la creación de clientes o proveedores.

public class ClienteProveedor
{
    /// <summary>
    ///     Id del cliente o proveedor.
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    ///     Código del cliente o proveedor.
    /// </summary>
    public string Codigo { get; set; } = string.Empty;

    /// <summary>
    ///     Razón Social del cliente o proveedor.
    /// </summary>
    public string RazonSocial { get; set; } = string.Empty;

    /// <summary>
    ///     Registro Federal de Contribuyentes del cliente o proveedor.
    /// </summary>
    public string Rfc { get; set; } = string.Empty;

    /// <summary>
    ///     Tipo de cliente o proveedor.
    /// </summary>
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public TipoCliente Tipo { get; set; }

    /// <summary>
    ///     Uso que el cliente le dará a los CFDIs.
    /// </summary>
    [JsonConverter(typeof(SmartEnumValueConverter<UsoCfdiEnum, string>))]
    public UsoCfdiEnum? UsoCfdi { get; set; }

    /// <summary>
    ///     Régimen Fiscal del cliente.
    /// </summary>
    [JsonConverter(typeof(SmartEnumValueConverter<RegimenFiscalEnum, string>))]
    public RegimenFiscalEnum? RegimenFiscal { get; set; }

    /// <summary>
    ///     Direccion fiscal del cliente.
    /// </summary>
    public Direccion? DireccionFiscal { get; set; }

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

admClientes

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

public partial class admClientes
{
    public int CIDCLIENTEPROVEEDOR { get; set; }
    public string CCODIGOCLIENTE { get; set; } = null!;
    public string CRAZONSOCIAL { get; set; } = null!;
    public DateTime CFECHAALTA { get; set; }
    public string CRFC { get; set; } = null!;
    public string CCURP { get; set; } = null!;
    public string CDENCOMERCIAL { get; set; } = null!;
    public string CREPLEGAL { get; set; } = null!;
    public int CIDMONEDA { get; set; }
    public int CLISTAPRECIOCLIENTE { get; set; }
    public double CDESCUENTODOCTO { get; set; }
    public double CDESCUENTOMOVTO { get; set; }
    public int CBANVENTACREDITO { get; set; }
    public int CIDVALORCLASIFCLIENTE1 { get; set; }
    public int CIDVALORCLASIFCLIENTE2 { get; set; }
    public int CIDVALORCLASIFCLIENTE3 { get; set; }
    public int CIDVALORCLASIFCLIENTE4 { get; set; }
    public int CIDVALORCLASIFCLIENTE5 { get; set; }
    public int CIDVALORCLASIFCLIENTE6 { get; set; }
    public int CTIPOCLIENTE { get; set; }
    public int CESTATUS { get; set; }
    public DateTime CFECHABAJA { get; set; }
    public DateTime CFECHAULTIMAREVISION { get; set; }
    public double CLIMITECREDITOCLIENTE { get; set; }
    public int CDIASCREDITOCLIENTE { get; set; }
    public int CBANEXCEDERCREDITO { get; set; }
    public double CDESCUENTOPRONTOPAGO { get; set; }
    public int CDIASPRONTOPAGO { get; set; }
    public double CINTERESMORATORIO { get; set; }
    public int CDIAPAGO { get; set; }
    public int CDIASREVISION { get; set; }
    public string CMENSAJERIA { get; set; } = null!;
    public string CCUENTAMENSAJERIA { get; set; } = null!;
    public int CDIASEMBARQUECLIENTE { get; set; }
    public int CIDALMACEN { get; set; }
    public int CIDAGENTEVENTA { get; set; }
    public int CIDAGENTECOBRO { get; set; }
    public int CRESTRICCIONAGENTE { get; set; }
    public double CIMPUESTO1 { get; set; }
    public double CIMPUESTO2 { get; set; }
    public double CIMPUESTO3 { get; set; }
    public double CRETENCIONCLIENTE1 { get; set; }
    public double CRETENCIONCLIENTE2 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR1 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR2 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR3 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR4 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR5 { get; set; }
    public int CIDVALORCLASIFPROVEEDOR6 { get; set; }
    public double CLIMITECREDITOPROVEEDOR { get; set; }
    public int CDIASCREDITOPROVEEDOR { get; set; }
    public int CTIEMPOENTREGA { get; set; }
    public int CDIASEMBARQUEPROVEEDOR { get; set; }
    public double CIMPUESTOPROVEEDOR1 { get; set; }
    public double CIMPUESTOPROVEEDOR2 { get; set; }
    public double CIMPUESTOPROVEEDOR3 { get; set; }
    public double CRETENCIONPROVEEDOR1 { get; set; }
    public double CRETENCIONPROVEEDOR2 { get; set; }
    public int CBANINTERESMORATORIO { get; set; }
    public double CCOMVENTAEXCEPCLIENTE { get; set; }
    public double CCOMCOBROEXCEPCLIENTE { get; set; }
    public int CBANPRODUCTOCONSIGNACION { get; set; }
    public string CSEGCONTCLIENTE1 { get; set; } = null!;
    public string CSEGCONTCLIENTE2 { get; set; } = null!;
    public string CSEGCONTCLIENTE3 { get; set; } = null!;
    public string CSEGCONTCLIENTE4 { get; set; } = null!;
    public string CSEGCONTCLIENTE5 { get; set; } = null!;
    public string CSEGCONTCLIENTE6 { get; set; } = null!;
    public string CSEGCONTCLIENTE7 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR1 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR2 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR3 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR4 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR5 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR6 { get; set; } = null!;
    public string CSEGCONTPROVEEDOR7 { 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 int CBANCREDITOYCOBRANZA { get; set; }
    public int CBANENVIO { get; set; }
    public int CBANAGENTE { get; set; }
    public int CBANIMPUESTO { get; set; }
    public int CBANPRECIO { get; set; }
    public string CTIMESTAMP { get; set; } = null!;
    public int CFACTERC01 { get; set; }
    public double CCOMVENTA { get; set; }
    public double CCOMCOBRO { get; set; }
    public int CIDMONEDA2 { get; set; }
    public string CEMAIL1 { get; set; } = null!;
    public string CEMAIL2 { get; set; } = null!;
    public string CEMAIL3 { get; set; } = null!;
    public int CTIPOENTRE { get; set; }
    public int CCONCTEEMA { get; set; }
    public int CFTOADDEND { get; set; }
    public int CIDCERTCTE { get; set; }
    public int CENCRIPENT { get; set; }
    public int CBANCFD { get; set; }
    public string CTEXTOEXTRA4 { get; set; } = null!;
    public string CTEXTOEXTRA5 { get; set; } = null!;
    public double CIMPORTEEXTRA5 { get; set; }
    public int CIDADDENDA { get; set; }
    public string CCODPROVCO { get; set; } = null!;
    public int CENVACUSE { get; set; }
    public string CCON1NOM { get; set; } = null!;
    public string CCON1TEL { get; set; } = null!;
    public int CQUITABLAN { get; set; }
    public int CFMTOENTRE { get; set; }
    public int CIDCOMPLEM { get; set; }
    public int CDESGLOSAI2 { get; set; }
    public int CLIMDOCTOS { get; set; }
    public string CSITIOFTP { get; set; } = null!;
    public string CUSRFTP { get; set; } = null!;
    public string CMETODOPAG { get; set; } = null!;
    public string CNUMCTAPAG { get; set; } = null!;
    public int CIDCUENTA { get; set; }
    public string CUSOCFDI { get; set; } = null!;
    public string CREGIMFISC { get; set; } = null!;
}

ClienteProveedorDto

La clase ClienteProveedorDto representa un modelo de cliente simplificado. Se utiliza principalmente para consultar el catalogo de clientes 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 clientes, como por ejemplo los que implementan IClienteProveedorRepository<T> de ClienteProveedorDto.

public class ClienteProveedorDto
{
    /// <summary>
    ///     Id del cliente o proveedor.
    /// </summary>
    public int CIDCLIENTEPROVEEDOR { get; set; }

    /// <summary>
    ///     Código del cliente o proveedor.
    /// </summary>
    public string CCODIGOCLIENTE { get; set; } = string.Empty;

    /// <summary>
    ///     Razón Social del cliente o proveedor.
    /// </summary>
    public string CRAZONSOCIAL { get; set; } = string.Empty;

    /// <summary>
    ///     Registro Federal de Contribuyentes del cliente.
    /// </summary>
    public string CRFC { get; set; } = string.Empty;

    /// <summary>
    ///     Tipo de cliente o proveedor: 1 = Cliente, 2 = Cliente/Proveedor, 3 = Proveedor
    /// </summary>
    public int CTIPOCLIENTE { get; set; }

    /// <summary>
    ///     Uso que el cliente le dará a los CFDIs por omisión.
    /// </summary>
    public string CUSOCFDI { get; set; } = string.Empty;

    /// <summary>
    ///     Régimen Fiscal del cliente.
    /// </summary>
    public string CREGIMFISC { get; set; } = string.Empty;
}

Comandos

Servicios

El servicio IClienteProveedorService define metodos para crear, actualizar y eliminar clientes o proveedores.

public interface IClienteProveedorService
{
    /// <summary>
    ///     Actualiza un cliente o proveedor 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 clientes en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="idClienteProveedor">El Id del cliente o proveedor a actualizar.</param>
    /// <param name="datosClienteProveedor">Datos del cliente o proveedor a actualizar.</param>
    void Actualizar(int idClienteProveedor, Dictionary<string, string> datosClienteProveedor);

    /// <summary>
    ///     Actualiza un cliente o proveedor 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 clientes en la base de datos y el valor es un valor valido para la columna.
    /// </summary>
    /// <param name="codigoClienteProveedor">Código del cliente o proveedor a actualizar.</param>
    /// <param name="datosClienteProveedor">Datos del cliente o proveedor a actualizar.</param>
    void Actualizar(string codigoClienteProveedor, Dictionary<string, string> datosClienteProveedor);

    /// <summary>
    ///     Actualiza un cliente o proveedor por dato abstracto.
    /// </summary>
    /// <param name="clienteProveedor">Cliente o proveedor a actualizar.</param>
    void Actualizar(tCteProv clienteProveedor);

    /// <summary>
    ///     Crear un cliente o proveedor por dato abstracto.
    /// </summary>
    /// <param name="clienteProveedor">Cliente o proveedor a actualizar.</param>
    /// <returns></returns>
    int Crear(tCteProv clienteProveedor);

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

    /// <summary>
    ///     Crear un cliente o proveedor.
    /// </summary>
    /// <param name="clienteProveedor">Cliente o proveedor a crear.</param>
    /// <returns>El Id del cliente creado.</returns>
    int Crear(ClienteProveedor clienteProveedor);

    /// <summary>
    ///     Elimina un cliente o proveedor por su Id.
    /// </summary>
    /// <param name="idClienteProveedor">El Id del cliente o proveedor a eliminar.</param>
    void Eliminar(int idClienteProveedor);

    /// <summary>
    ///     Elimina un cliente o proveedor por su código.
    /// </summary>
    /// <param name="codigoClienteProveedor">El código del cliente o proveedor a eliminar.</param>
    void Eliminar(string codigoClienteProveedor);
}

Crear Cliente

public class CrearCliente
{
    private readonly IClienteProveedorService _clienteProveedorService;

    public CrearCliente(IClienteProveedorService clienteProveedorService)
    {
        _clienteProveedorService = clienteProveedorService;
    }

    public int Crear()
    {
        var cliente = new ClienteProveedor
        {
            Codigo = "PRUEBA",
            RazonSocial = "CLIENTE DE PRUEBAS",
            Rfc = "XAXX010101000",
            Tipo = TipoCliente.ClienteProveedor,
            UsoCfdi = UsoCfdiEnum.S01,
            RegimenFiscal = RegimenFiscalEnum._616
        };

        cliente.DatosExtra.Add(nameof(admClientes.CTEXTOEXTRA1), "Texto Extra 1");
        cliente.DatosExtra.Add(nameof(admClientes.CEMAIL1), "[email protected]");

        int clienteId = _clienteProveedorService.Crear(cliente);

        return clienteId;
    }
}

Editar Cliente

public class EditarCliente
{
    private readonly IClienteProveedorService _clienteProveedorService;

    public EditarCliente(IClienteProveedorService clienteProveedorService)
    {
        _clienteProveedorService = clienteProveedorService;
    }

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

        var datosCliente = new Dictionary<string, string>
        {
            { nameof(admClientes.CRAZONSOCIAL), "CLIENTE DE PRUEBAS MODIFICADO" },
            { nameof(admClientes.CTEXTOEXTRA1), "Texto Modificado" },
            { nameof(admClientes.CTEXTOEXTRA2), "Texto Extra 2" }
        };

        _clienteProveedorService.Actualizar(codigoCliente, datosCliente);
    }
}

Eliminar Cliente

public class EliminarCliente
{
    private readonly IClienteProveedorService _clienteProveedorService;

    public EliminarCliente(IClienteProveedorService clienteProveedorService)
    {
        _clienteProveedorService = clienteProveedorService;
    }

    public void Eliminar()
    {
        var codigoCliente = "PRUEBA";

        _clienteProveedorService.Eliminar(codigoCliente);
    }
}

Consultas

Repositorios

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

Los repositorios disponibles para SDK son:

  • ClienteProveedorSdkRepository<T> - Implementa IClienteProveedorRepository<T>.

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

Los repositorios disponibles para SQL son:

  • ClienteProveedorSqlRepository<T> - Implementa IClienteProveedorSqlRepository<T>. IClienteProveedorSqlRepository<T> hereda de IClienteProveedorRepository<T> y define las versiones asincronas de los metodos para beneficiarse del uso de Entity Framework Core.

El repositorio ClienteProveedorSqlRepository<T> utiliza AutoMapper para proyectar el modelo de SQL admClientes 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 ClienteProveedorDto.

IClienteProveedorRepository<T>

public interface IClienteProveedorRepository<T> where T : class, new()
{
    /// <summary>
    ///     Busca un cliente o proveedor por código.
    /// </summary>
    /// <param name="codigoCliente">
    ///     Código del cliente o proveedor a buscar.
    /// </param>
    /// <returns>
    ///     Un cliente o proveedor, o <see langword="null" /> si no existe un cliente o proveedor con el código proporcionado.
    /// </returns>
    T? BuscarPorCodigo(string codigoCliente);

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

    /// <summary>
    ///     Busca todos los clientes.
    /// </summary>
    /// <returns>
    ///     Lista de clientes.
    /// </returns>
    List<T> TraerClientes();

    /// <summary>
    ///     Busca clientes o proveedores por tipo.
    /// </summary>
    /// <param name="tipoCliente">
    ///     Tipo de los clientes o proveedores a buscar.
    /// </param>
    /// <returns>
    ///     Lista de clientes o proveedores.
    /// </returns>
    List<T> TraerPorTipo(TipoCliente tipoCliente);

    /// <summary>
    ///     Busca todos los proveedores.
    /// </summary>
    /// <returns>
    ///     Lista de proveedores.
    /// </returns>
    List<T> TraerProveedores();

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

IClienteProveedorSqlRepository<T>

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

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

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

    /// <summary>
    ///     Busca clientes o proveedores por tipo.
    /// </summary>
    /// <param name="tipoCliente">
    ///     Tipo de los clientes o proveedores a buscar.
    /// </param>
    /// <param name="cancellationToken">
    ///     Token de cancelación.
    /// </param>
    /// <returns>
    ///     Lista de clientes o proveedores.
    /// </returns>
    Task<List<T>> TraerPorTipoAsync(TipoCliente tipoCliente, CancellationToken cancellationToken);

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

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

Dependency Injection

public class BuscarClientesConRepositorio 
{
    private readonly IClienteProveedorRepository<admClientes> _clienteProveedorRepository;
    // private readonly IClienteProveedorRepository<ClienteProveedorDto> _clienteProveedorRepository;
    // private readonly IClienteProveedorRepository<TuModelo> _clienteProveedorRepository;

    public BuscarClientesConRepositorio(IClienteProveedorRepository<admClientes> clienteProveedorRepository)
    {
        _clienteProveedorRepository = clienteProveedorRepository;
    }
}

Buscar Por Codigo

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

    admClientes? clienteProveedor = _clienteProveedorRepository.BuscarPorCodigo(codigoCliente);

    _logger.LogInformation("{@Cliente}", clienteProveedor);
}

Buscar Por Id

public void BuscarPorId()
{
    var idCliente = 1;

    admClientes? clienteProveedor = _clienteProveedorRepository.BuscarPorId(idCliente);

    _logger.LogInformation("{@Cliente}", clienteProveedor);
}

Traer Clientes

 public void TraerClientes()
 {
     List<admClientes> clientes = _clienteProveedorRepository.TraerClientes();

     _logger.LogInformation("{@Clientes}", clientes);
 }

Traer Por Tipo

public void TraerPorTipo()
{
    var tipoCliente = TipoCliente.Cliente;
    List<admClientes> clientes = _clienteProveedorRepository.TraerPorTipo(tipoCliente);

    _logger.LogInformation("{@Clientes}", clientes);
}

Traer Proveedores

 public void TraerProveedores()
 {
     List<admClientes> clientes = _clienteProveedorRepository.TraerProveedores();

     _logger.LogInformation("{@Clientes}", clientes);
 }

Traer Todo

  public void TraerTodo()
  {
      List<admClientes> clientes = _clienteProveedorRepository.TraerTodo();

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