-
-
Notifications
You must be signed in to change notification settings - Fork 41
Documentos
La clase Documento
representa un modelo amigable de un documento. Se utiliza principalmente para la creación de documentos.
public class Documento
{
/// <summary>
/// Id del documento.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Concepto del documento.
/// </summary>
public ConceptoDocumento Concepto { get; set; } = new();
/// <summary>
/// Serie del documento.
/// </summary>
public string Serie { get; set; } = string.Empty;
/// <summary>
/// Folio del documento.
/// </summary>
public int Folio { get; set; }
/// <summary>
/// Fecha del documento.
/// </summary>
public DateTime Fecha { get; set; }
/// <summary>
/// Cliente o proveedor del documento.
/// </summary>
public ClienteProveedor? Cliente { get; set; }
/// <summary>
/// Moneda del documento.
/// </summary>
public Moneda Moneda { get; set; } = new();
/// <summary>
/// Tipo de cambio del documento.
/// </summary>
public decimal TipoCambio { get; set; } = 1;
/// <summary>
/// Agente del documento.
/// </summary>
public Agente? Agente { get; set; } = new();
/// <summary>
/// Referencia del documento.
/// </summary>
public string Referencia { get; set; } = string.Empty;
/// <summary>
/// Observaciones del documento.
/// </summary>
public string Observaciones { get; set; } = string.Empty;
/// <summary>
/// Total del documento.
/// </summary>
public decimal Total { get; set; }
/// <summary>
/// Forma de pago del documento.
/// </summary>
[JsonConverter(typeof(SmartEnumValueConverter<FormaPagoEnum, string>))]
public FormaPagoEnum? FormaPago { get; set; }
/// <summary>
/// Metodo de pago del documento.
/// </summary>
[JsonConverter(typeof(SmartEnumValueConverter<MetodoPagoEnum, string>))]
public MetodoPagoEnum? MetodoPago { get; set; }
/// <summary>
/// Movimientos del documento.
/// </summary>
public List<Movimiento> Movimientos { get; set; } = new();
/// <summary>
/// Direccion fiscal del documento
/// </summary>
public Direccion? DireccionFiscal { get; set; } = new();
/// <summary>
/// Folio digital del documento.
/// </summary>
public FolioDigital? FolioDigital { get; set; } = new();
/// <summary>
/// Datos extra del documento.
/// </summary>
public Dictionary<string, string> DatosExtra { get; set; } = new();
}
La clase admDocumentos
representa el modelo de SQL con el esquema completo de la tabla de documentos en la base de datos. Se utiliza principalmente para consultar el catalogo de documentos cuando se necesita obtener el esquema completo.
public partial class admDocumentos
{
public int CIDDOCUMENTO { get; set; }
public int CIDDOCUMENTODE { get; set; }
public int CIDCONCEPTODOCUMENTO { get; set; }
public string CSERIEDOCUMENTO { get; set; } = null!;
public double CFOLIO { get; set; }
public DateTime CFECHA { get; set; }
public int CIDCLIENTEPROVEEDOR { get; set; }
public string CRAZONSOCIAL { get; set; } = null!;
public string CRFC { get; set; } = null!;
public int CIDAGENTE { get; set; }
public DateTime CFECHAVENCIMIENTO { get; set; }
public DateTime CFECHAPRONTOPAGO { get; set; }
public DateTime CFECHAENTREGARECEPCION { get; set; }
public DateTime CFECHAULTIMOINTERES { get; set; }
public int CIDMONEDA { get; set; }
public double CTIPOCAMBIO { get; set; }
public string CREFERENCIA { get; set; } = null!;
public string? COBSERVACIONES { get; set; }
public int CNATURALEZA { get; set; }
public int CIDDOCUMENTOORIGEN { get; set; }
public int CPLANTILLA { get; set; }
public int CUSACLIENTE { get; set; }
public int CUSAPROVEEDOR { get; set; }
public int CAFECTADO { get; set; }
public int CIMPRESO { get; set; }
public int CCANCELADO { get; set; }
public int CDEVUELTO { get; set; }
public int CIDPREPOLIZA { get; set; }
public int CIDPREPOLIZACANCELACION { get; set; }
public int CESTADOCONTABLE { get; set; }
public double CNETO { get; set; }
public double CIMPUESTO1 { get; set; }
public double CIMPUESTO2 { get; set; }
public double CIMPUESTO3 { get; set; }
public double CRETENCION1 { get; set; }
public double CRETENCION2 { get; set; }
public double CDESCUENTOMOV { get; set; }
public double CDESCUENTODOC1 { get; set; }
public double CDESCUENTODOC2 { get; set; }
public double CGASTO1 { get; set; }
public double CGASTO2 { get; set; }
public double CGASTO3 { get; set; }
public double CTOTAL { get; set; }
public double CPENDIENTE { get; set; }
public double CTOTALUNIDADES { get; set; }
public double CDESCUENTOPRONTOPAGO { get; set; }
public double CPORCENTAJEIMPUESTO1 { get; set; }
public double CPORCENTAJEIMPUESTO2 { get; set; }
public double CPORCENTAJEIMPUESTO3 { get; set; }
public double CPORCENTAJERETENCION1 { get; set; }
public double CPORCENTAJERETENCION2 { get; set; }
public double CPORCENTAJEINTERES { 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 CDESTINATARIO { get; set; } = null!;
public string CNUMEROGUIA { get; set; } = null!;
public string CMENSAJERIA { get; set; } = null!;
public string CCUENTAMENSAJERIA { get; set; } = null!;
public double CNUMEROCAJAS { get; set; }
public double CPESO { get; set; }
public int CBANOBSERVACIONES { get; set; }
public int CBANDATOSENVIO { get; set; }
public int CBANCONDICIONESCREDITO { get; set; }
public int CBANGASTOS { get; set; }
public double CUNIDADESPENDIENTES { get; set; }
public string CTIMESTAMP { get; set; } = null!;
public double CIMPCHEQPAQ { get; set; }
public int CSISTORIG { get; set; }
public int CIDMONEDCA { get; set; }
public double CTIPOCAMCA { get; set; }
public int CESCFD { get; set; }
public int CTIENECFD { get; set; }
public string CLUGAREXPE { get; set; } = null!;
public string CMETODOPAG { get; set; } = null!;
public int CNUMPARCIA { get; set; }
public int CCANTPARCI { get; set; }
public string CCONDIPAGO { get; set; } = null!;
public string CNUMCTAPAG { get; set; } = null!;
public string CGUIDDOCUMENTO { get; set; } = null!;
public string CUSUARIO { get; set; } = null!;
public int CIDPROYECTO { get; set; }
public int CIDCUENTA { get; set; }
public string CTRANSACTIONID { get; set; } = null!;
public int CIDCOPIADE { get; set; }
public string CVERESQUE { get; set; } = null!;
}
La clase DocumentoDto
representa un modelo de documento simplificado. Se utiliza principalmente para consultar el catalogo de documentos 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 documentos, como por ejemplo los que implementan IDocumentoRepository<T>
de DocumentoDto
.
public class DocumentoDto
{
/// <summary>
/// Id del documento.
/// </summary>
public int CIDDOCUMENTO { get; set; }
/// <summary>
/// Id del concepto del documento.
/// </summary>
public int CIDCONCEPTODOCUMENTO { get; set; }
/// <summary>
/// Serie del documento.
/// </summary>
public string CSERIEDOCUMENTO { get; set; } = string.Empty;
/// <summary>
/// Folio del documento.
/// </summary>
public double CFOLIO { get; set; }
/// <summary>
/// Fecha del documento.
/// </summary>
public DateTime CFECHA { get; set; }
/// <summary>
/// Id del cliente o proveedor del documento.
/// </summary>
public int CIDCLIENTEPROVEEDOR { get; set; }
/// <summary>
/// Moneda asociada al documento.
/// </summary>
public int CIDMONEDA { get; set; }
/// <summary>
/// Tipo de cambio del documento.
/// </summary>
public double CTIPOCAMBIO { get; set; }
/// <summary>
/// Id del agente del documento.
/// </summary>
public int CIDAGENTE { get; set; }
/// <summary>
/// Referencia del documento.
/// </summary>
public string CREFERENCIA { get; set; } = string.Empty;
/// <summary>
/// Observaciones del documento.
/// </summary>
public string? COBSERVACIONES { get; set; }
/// <summary>
/// Importe del total de los totales de los movimientos para el documento.
/// </summary>
public double CTOTAL { get; set; }
/// <summary>
/// Método de pago o forma de pago en facturas.
/// </summary>
public string CMETODOPAG { get; set; } = string.Empty;
/// <summary>
/// Cantidad de parcialidades o Método de pago para facturas
/// </summary>
public int CCANTPARCI { get; set; }
}
El servicio IDocumentoService
define los metodos para realizar operaciones sobre documentos
public interface IDocumentoService
{
/// <summary>
/// Actualiza un documento 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 documentos en la base de datos y el valor es un valor valido para la columna.
/// </summary>
/// <param name="documentoId">Id del documento a actualizar.</param>
/// <param name="datosDocumento">Datos del documento a actualizar.</param>
void Actualizar(int documentoId, Dictionary<string, string> datosDocumento);
/// <summary>
/// Actualiza un documento por su llave. Los datos a actualizar se pasan en un diccionario donde la llave es el nombre
/// de la columna de la tabla de documentos en la base de datos y el valor es un valor valido para la columna.
/// </summary>
/// <param name="codigoConcepto">Código del concepto de documento del documento a actualizar.</param>
/// <param name="serie">Serie del documento a actualizar.</param>
/// <param name="folio">Folio del documento a actualizar.</param>
/// <param name="datosDocumento">Datos del documento a actualizar.</param>
void Actualizar(string codigoConcepto, string serie, string folio, Dictionary<string, string> datosDocumento);
/// <summary>
/// Actualiza un documento por su llave. Los datos a actualizar se pasan en un diccionario donde la llave es el nombre
/// de la columna de la tabla de documentos en la base de datos y el valor es un valor valido para la columna.
/// </summary>
/// <param name="tLlaveDocumento">LLave del documento a actualizar.</param>
/// <param name="datosDocumento">Datos del documento a actualizar.</param>
void Actualizar(tLlaveDoc tLlaveDocumento, Dictionary<string, string> datosDocumento);
/// <summary>
/// Buscar el siguiente folio y serie del concepto de documento.
/// </summary>
/// <param name="codigoConcepto">Código del concepto de documento.</param>
/// <returns>Llave con el siguiente serie y folio del concepto de documento.</returns>
tLlaveDoc BuscarSiguienteSerieYFolio(string codigoConcepto);
/// <summary>
/// Cancela un documento por id.
/// </summary>
/// <param name="idDocumento">Id del documento a cancelar.</param>
/// <param name="contrasenaCertificado">Contraseña del certificado.</param>
void Cancelar(int idDocumento, string contrasenaCertificado);
/// <summary>
/// Cancela un documento por id.
/// </summary>
/// <param name="idDocumento">Id del documento a cancelar.</param>
/// <param name="contrasenaCertificado">Contraseña del certificado.</param>
/// <param name="motivoCancelacion">
/// Motivo de cancelación del documento. Los valores posibles son: "01" - Comprobantes emitidos con errores con
/// relación, "02" - Comprobantes emitidos con errores sin relación, "03" - No se llevó a cabo la operación, "04" -
/// Operación nominativa relacionada en una factura global.
/// </param>
/// <param name="uuidRemplazo">UUID del documento que remplaza al documento a cancelar.</param>
void Cancelar(int idDocumento, string contrasenaCertificado, MotivoCancelacionEnum motivoCancelacion, string uuidRemplazo);
/// <summary>
/// Cancela un documento por su llave.
/// </summary>
/// <param name="tLlaveDocumento">LLave del documento a cancelar.</param>
/// <param name="contrasenaCertificado">Contraseña del certificado.</param>
/// <param name="motivoCancelacion">
/// Motivo de cancelación del documento. Los valores posibles son: "01" - Comprobantes emitidos con errores con
/// relación, "02" - Comprobantes emitidos con errores sin relación, "03" - No se llevó a cabo la operación, "04" -
/// Operación nominativa relacionada en una factura global.
/// </param>
/// <param name="uuidRemplazo">UUID del documento que remplaza al documento a cancelar.</param>
void Cancelar(tLlaveDoc tLlaveDocumento, string contrasenaCertificado, MotivoCancelacionEnum motivoCancelacion, string uuidRemplazo);
/// <summary>
/// Cancela el documento administrativamente por id.
/// </summary>
/// <param name="idDocumento">Id del documento a cancelar.</param>
void CancelarAdministrativamente(int idDocumento);
/// <summary>
/// Cancela el documento administrativamente por su llave.
/// </summary>
/// <param name="codigoConcepto">Código del concepto de documento del documento a cancelar.</param>
/// <param name="serie">Serie del documento a cancelar.</param>
/// <param name="folio">Folio del documento a cancelar.</param>
void CancelarAdministrativamente(string codigoConcepto, string serie, string folio);
/// <summary>
/// Cancela el documento administrativamente por su llave.
/// </summary>
/// <param name="tLlaveDocumento">Llave del documento a cancelar.</param>
void CancelarAdministrativamente(tLlaveDoc tLlaveDocumento);
/// <summary>
/// Crea un documento por dato abstracto.
/// </summary>
/// <param name="documento">Documento a crear.</param>
/// <returns>Id del documento a creado.</returns>
int Crear(tDocumento documento);
/// <summary>
/// Crea un documento. Los datos del documento se pasan en un diccionario donde la llave es el nombre de la columna de
/// la tabla de documentos en la base de datos y el valor es un valor valido para la columna.
/// </summary>
/// <param name="datosDocumento">Datos del documento a crear.</param>
/// <returns>Id del documento creado.</returns>
int Crear(Dictionary<string, string> datosDocumento);
/// <summary>
/// Crea un documento.
/// </summary>
/// <param name="documento">Documento a crear.</param>
/// <returns>Id del documento creado.</returns>
int Crear(Documento documento);
/// <summary>
/// Crea un documento de cargo o abono por dato abstracto.
/// </summary>
/// <param name="documento">Documento a crear.</param>
/// <returns>Id del documento creado.</returns>
int CrearCargoAbono(tDocumento documento);
/// <summary>
/// Crea un documento de cargo o abono.
/// </summary>
/// <param name="documento">Documento a crear.</param>
/// <returns>Id del documento creado.</returns>
int CrearCargoAbono(Documento documento);
/// <summary>
/// Desbloquea un documento por su id.
/// </summary>
/// <param name="idDocumento">Id del documento a desbloquear.</param>
void DesbloquearDocumento(int idDocumento);
/// <summary>
/// Elimina un documento por su id.
/// </summary>
/// <param name="idDocumento">Id del documento a eliminar.</param>
void Eliminar(int idDocumento);
/// <summary>
/// Elimina un documento por su llave.
/// </summary>
/// <param name="codigoConcepto">Código del concepto de documento del documento a eliminar.</param>
/// <param name="serie">Serie del documento a eliminar.</param>
/// <param name="folio">Folio del documento a eliminar.</param>
void Eliminar(string codigoConcepto, string serie, string folio);
/// <summary>
/// Elimina un documento por su llave.
/// </summary>
/// <param name="tLlaveDocumento">Llave del documento a eliminar.</param>
void Eliminar(tLlaveDoc tLlaveDocumento);
/// <summary>
/// Genera el XML o PDF de un documento por su llave.
/// </summary>
/// <param name="codigoConceptoDocumento">Código del concepto de documento del documento.</param>
/// <param name="serieDocumento">Serie del documento.</param>
/// <param name="folioDocumento">Folio del documento.</param>
/// <param name="tipoArchivo">Tipo de archivo a generar. Los valores posibles son: Xml o Pdf.</param>
/// <param name="rutaPlantilla">Ruta de la plantilla para generar el PDF.</param>
void GenerarDocumentoDigital(string codigoConceptoDocumento, string serieDocumento, double folioDocumento,
TipoArchivoDigital tipoArchivo, string rutaPlantilla = "");
/// <summary>
/// Genera el XML o PDF de un documento por su llave.
/// </summary>
/// <param name="documento">Llave del documento.</param>
/// <param name="tipoArchivo">Tipo de archivo a generar. Los valores posibles son: Xml o Pdf.</param>
/// <param name="rutaPlantilla">Ruta de la plantilla para generar el PDF.</param>
void GenerarDocumentoDigital(tLlaveDoc documento, TipoArchivoDigital tipoArchivo, string rutaPlantilla = "");
void GenerarDocumentoDigital(tLlaveDoc documento, TipoArchivoDigital tipoArchivo, string rutaPlantilla, string rutaDirectorioEmpresa,
string rutaArchivoDestino);
void RelacionarDocumentos(tLlaveDoc documento, string tipoRelacion, tLlaveDoc documentoRelacionado);
void RelacionarDocumentos(tLlaveDoc documento, string tipoRelacion, string uuid);
/// <summary>
/// Salda un documento.
/// </summary>
/// <param name="documentoAPagar">Llave del documento a pagar.</param>
/// <param name="documentoPago">Llave del documento de pago.</param>
/// <param name="fecha">Fecha de aplicacion.</param>
/// <param name="importe">Importe a aplicar.</param>
/// <param name="monedaId">Id de la moneda de pago.</param>
void SaldarDocumento(tLlaveDoc documentoAPagar, tLlaveDoc documentoPago, DateTime fecha, double importe, int monedaId = 1);
/// <summary>
/// Timbra un documento por su llave.
/// </summary>
/// <param name="codigoConceptoDocumento">Código del concepto de documento del documento.</param>
/// <param name="serieDocumento">Serie del documento.</param>
/// <param name="folioDocumento">Folio del documento.</param>
/// <param name="contrasenaCertificado">Contraseña del certificado.</param>
/// <param name="rutaArchivoAdicional">
/// Ruta del archivo adicional a anexar en el timbrado. Utilizado para complementos y
/// carta porte.
/// </param>
void Timbrar(string codigoConceptoDocumento, string serieDocumento, double folioDocumento, string contrasenaCertificado,
string rutaArchivoAdicional = "");
/// <summary>
/// Timbra un documento por su llave.
/// </summary>
/// <param name="documento">LLave del documento a timbrar.</param>
/// <param name="contrasenaCertificado">Contraseña del certificado.</param>
/// <param name="rutaArchivoAdicional">
/// Ruta del archivo adicional a anexar en el timbrado. Utilizado para complementos y
/// carta porte.
/// </param>
void Timbrar(tLlaveDoc documento, string contrasenaCertificado, string rutaArchivoAdicional = "");
}
public class CrearFactura
{
private readonly IDocumentoService _documentoService;
private readonly IMovimientoService _movimientoService;
public CrearFactura(IDocumentoService documentoService, IMovimientoService movimientoService)
{
_documentoService = documentoService;
_movimientoService = movimientoService;
}
public int Crear()
{
tLlaveDoc siguienteFolio = _documentoService.BuscarSiguienteSerieYFolio("PRUEBAFACTURA");
var documento = new Documento
{
Concepto = new ConceptoDocumento { Codigo = "PRUEBAFACTURA" },
Serie = siguienteFolio.aSerie,
Folio = (int)siguienteFolio.aFolio,
Fecha = DateTime.Today,
Cliente = new ClienteProveedor { Codigo = "PRUEBA" },
Referencia = "Referencia",
FormaPago = FormaPagoEnum._03,
MetodoPago = MetodoPagoEnum.PPD,
Observaciones = "Observaciones",
Moneda = MonedaEnum.PesoMexicano.ToMoneda(),
TipoCambio = 1,
Agente = new Agente { Codigo = "PRUEBA" }
};
documento.DatosExtra.Add(nameof(admDocumentos.CTEXTOEXTRA1), "Texto Extra 1");
documento.DatosExtra.Add(nameof(admDocumentos.CTEXTOEXTRA2), "Texto Extra 2");
var movimiento = new Movimiento
{
Producto = new Producto { Codigo = "PRUEBA" },
Almacen = new Almacen { Codigo = "1" },
Unidades = 1,
Precio = 100,
Referencia = "Referencia",
Observaciones = "Observaciones"
};
movimiento.DatosExtra.Add(nameof(admMovimientos.CTEXTOEXTRA1), "Texto Extra 1");
documento.Movimientos.Add(movimiento);
int nuevoDocumentoId = _documentoService.Crear(documento);
foreach (Movimiento mov in documento.Movimientos) _movimientoService.Crear(nuevoDocumentoId, mov);
return nuevoDocumentoId;
}
}
public class TimbrarDocumento
{
private readonly IDocumentoService _documentoService;
public TimbrarDocumento(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public void Crear()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
var contrasenaCertificado = "12345678a";
_documentoService.Timbrar(llaveDocumento, contrasenaCertificado);
}
}
public class GenerarDocumentoDigitalDocumento
{
private readonly IDocumentoService _documentoService;
public GenerarDocumentoDigitalDocumento(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public void CrearPdf()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
var rutaPlantilla =
@"\\AR-SERVER\Compac\Empresas\Reportes\Formatos Digitales\reportes_Servidor\COMERCIAL\Facturav40.rdl"; // La ruta a la plantilla en mi servidor ya que las pruebas las hago en una temrinal.
_documentoService.GenerarDocumentoDigital(llaveDocumento, TipoArchivoDigital.Pdf, rutaPlantilla);
}
public void CrearXml()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
_documentoService.GenerarDocumentoDigital(llaveDocumento, TipoArchivoDigital.Xml);
}
}
public class CrearDocumentoCargoAbono
{
private readonly IDocumentoService _documentoService;
public CrearDocumentoCargoAbono(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public int Crear()
{
tLlaveDoc siguienteFolio = _documentoService.BuscarSiguienteSerieYFolio("PRUEBAABONO");
var documento = new Documento
{
Concepto = new ConceptoDocumento { Codigo = "PRUEBAABONO" },
Serie = siguienteFolio.aSerie,
Folio = (int)siguienteFolio.aFolio,
Fecha = DateTime.Today,
Cliente = new ClienteProveedor { Codigo = "PRUEBA" },
Referencia = "Referencia",
Observaciones = "Observaciones",
Moneda = MonedaEnum.PesoMexicano.ToMoneda(),
TipoCambio = 1,
Total = 100
};
int nuevoDocumentoId = _documentoService.CrearCargoAbono(documento);
return nuevoDocumentoId;
}
}
public class SaldarDocumento
{
private readonly IDocumentoService _documentoService;
public SaldarDocumento(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public void Saldar()
{
var documentoPagar = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
var documentoPago = new tLlaveDoc { aCodConcepto = "PRUEBAABONO", aSerie = "PRUEBA", aFolio = 1 };
var importe = 100;
DateTime fecha = DateTime.Today;
int moneda = MonedaEnum.PesoMexicano.Value;
_documentoService.SaldarDocumento(documentoPagar, documentoPago, fecha, importe, moneda);
}
}
public class CancelarDocumento
{
private readonly IDocumentoService _documentoService;
public CancelarDocumento(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public void Cancelar()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
var contrasenaCertificado = "12345678a";
MotivoCancelacionEnum motivoCancelacion = MotivoCancelacionEnum._02;
_documentoService.Cancelar(llaveDocumento, contrasenaCertificado, motivoCancelacion, string.Empty);
}
public void CancelarAdministrativamente()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
_documentoService.CancelarAdministrativamente(llaveDocumento);
}
}
public class EliminarDocumento
{
private readonly IDocumentoService _documentoService;
public EliminarDocumento(IDocumentoService documentoService)
{
_documentoService = documentoService;
}
public void Eliminar()
{
var llaveDocumento = new tLlaveDoc { aCodConcepto = "PRUEBAFACTURA", aSerie = "PRUEBA", aFolio = 1 };
_documentoService.Eliminar(llaveDocumento);
}
}
El proyecto incluye repositorios que implementan la interfaz IDocumentoRepository<T>
que proporciona metodos que puedes utilizar para consultar el catalogo de documentos.
Los repositorios disponibles para SDK son:
-
DocumentoSdkRepository<T>
- ImplementaIDocumentoRepository<T>
.
El repositorio DocumentoSdkRepository<T>
utiliza reflection para buscar los valores de la propiedades del tipo T
en el modelo de SQL admDocumentos
por lo que debes asegurarte que las propiedades del tipo T
tengan el mismo nombre que las columnas de la tabla admDocumentos
en la base de datos. El proyecto ya incluye un tipo DocumentoDto
que cumple con este requisito.
Los repositorios disponibles para SQL son:
-
DocumentoSqlRepository<T>
- ImplementaIDocumentoSqlRepository<T>
.IDocumentoSqlRepository<T>
hereda deIDocumentoRepository<T>
y define las versiones asincronas de los metodos para beneficiarse del uso de Entity Framework Core.
El repositorio DocumentoSqlRepository<T>
utiliza AutoMapper para proyectar el modelo de SQL admDocumentos
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 DocumentoDto
.
public interface IDocumentoRepository<T> where T : class, new()
{
/// <summary>
/// Busca un documento por id.
/// </summary>
/// <param name="idDocumento">
/// Id del documento a buscar.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con el id proporcionado.
/// </returns>
T? BuscarPorId(int idDocumento);
/// <summary>
/// Busca un documento por llave.
/// </summary>
/// <param name="codigoConcepto">
/// Código del concepto del documento a buscar.
/// </param>
/// <param name="serie">
/// Serie del documento a buscar.
/// </param>
/// <param name="folio">
/// Folio del documento a buscar.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con la llave proporcionada.
/// </returns>
T? BuscarPorLlave(string codigoConcepto, string serie, double folio);
/// <summary>
/// Busca un documento por llave.
/// </summary>
/// <param name="llaveDocumento">
/// Llave del documento a buscar.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con la llave proporcionada.
/// </returns>
T? BuscarPorLlave(LlaveDocumento llaveDocumento);
/// <summary>
/// Busca el siguiente serie y folio del concepto de documento.
/// </summary>
/// <param name="codigoConcepto">
/// Código del concepto de documento.
/// </param>
/// <returns>
/// La siguiente serie y folio del concepto de documento.
/// </returns>
LlaveDocumento BuscarSiguienteSerieYFolio(string codigoConcepto);
/// <summary>
/// Busca documentos por rango de fecha, código de concepto y código de cliente/proveedor.
/// </summary>
/// <param name="fechaInicio">
/// Fecha de inicio del rango de fecha.
/// </param>
/// <param name="fechaFin">
/// Fecha de fin del rango de fecha.
/// </param>
/// <param name="codigoConcepto">
/// Código de concepto de los documentos a buscar.
/// </param>
/// <param name="codigoClienteProveedor">
/// Código de cliente/proveedor de los documentos a buscar.
/// </param>
/// <returns>
/// Lista de documentos.
/// </returns>
List<T> TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedor(DateTime fechaInicio, DateTime fechaFin, string codigoConcepto,
string codigoClienteProveedor);
/// <summary>
/// Busca documentos por rango de fecha, código de concepto y códigos de cliente/proveedor.
/// </summary>
/// <param name="fechaInicio">
/// Fecha de inicio del rango de fecha.
/// </param>
/// <param name="fechaFin">
/// Fecha de fin del rango de fecha.
/// </param>
/// <param name="codigoConcepto">
/// Código de concepto de los documentos a buscar.
/// </param>
/// <param name="codigosClienteProveedor">
/// Códigos de cliente/proveedor de los documentos a buscar.
/// </param>
/// <returns>
/// Lista de documentos.
/// </returns>
List<T> TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedor(DateTime fechaInicio, DateTime fechaFin, string codigoConcepto,
IEnumerable<string> codigosClienteProveedor);
/// <summary>
/// Buscar todos los documentos.
/// </summary>
/// <returns>
/// Lista de documentos.
/// </returns>
List<T> TraerTodo();
}
/// <inheritdoc cref="IDocumentoRepository{T}" />
public interface IDocumentoSqlRepository<T> : IDocumentoRepository<T> where T : class, new()
{
/// <summary>
/// Busca un documento por id.
/// </summary>
/// <param name="idDocumento">
/// Id del documento a buscar.
/// </param>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con el id proporcionado.
/// </returns>
Task<T?> BuscarPorIdAsync(int idDocumento, CancellationToken cancellationToken);
/// <summary>
/// Busca un documento por llave.
/// </summary>
/// <param name="codigoConcepto">
/// Código del concepto del documento a buscar.
/// </param>
/// <param name="serie">
/// Serie del documento a buscar.
/// </param>
/// <param name="folio">
/// Folio del documento a buscar.
/// </param>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con la llave proporcionada.
/// </returns>
Task<T?> BuscarPorLlaveAsync(string codigoConcepto, string serie, double folio, CancellationToken cancellationToken);
/// <summary>
/// Busca un documento por llave.
/// </summary>
/// <param name="llaveDocumento">
/// Llave del documento a buscar.
/// </param>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Un documento, o <see langword="null" /> si no existe un documento con la llave proporcionada.
/// </returns>
Task<T?> BuscarPorLlaveAsync(LlaveDocumento llaveDocumento, CancellationToken cancellationToken);
/// <summary>
/// Busca documentos por rango de fecha, código de concepto y código de cliente/proveedor.
/// </summary>
/// <param name="fechaInicio">
/// Fecha de inicio del rango de fecha.
/// </param>
/// <param name="fechaFin">
/// Fecha de fin del rango de fecha.
/// </param>
/// <param name="codigoConcepto">
/// Código de concepto de los documentos a buscar.
/// </param>
/// <param name="codigoClienteProveedor">
/// Código de cliente/proveedor de los documentos a buscar.
/// </param>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Lista de documentos.
/// </returns>
Task<List<T>> TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedorAsync(DateTime fechaInicio, DateTime fechaFin,
string codigoConcepto, string codigoClienteProveedor, CancellationToken cancellationToken);
/// <summary>
/// Busca documentos por rango de fecha, código de concepto y códigos de cliente/proveedor.
/// </summary>
/// <param name="fechaInicio">
/// Fecha de inicio del rango de fecha.
/// </param>
/// <param name="fechaFin">
/// Fecha de fin del rango de fecha.
/// </param>
/// <param name="codigoConcepto">
/// Código de concepto de los documentos a buscar.
/// </param>
/// <param name="codigosClienteProveedor">
/// Códigos de cliente/proveedor de los documentos a buscar.
/// </param>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Lista de documentos.
/// </returns>
Task<List<T>> TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedorAsync(DateTime fechaInicio, DateTime fechaFin,
string codigoConcepto, IEnumerable<string> codigosClienteProveedor, CancellationToken cancellationToken);
/// <summary>
/// Buscar todos los documentos.
/// </summary>
/// <param name="cancellationToken">
/// Token de cancelación.
/// </param>
/// <returns>
/// Lista de documentos.
/// </returns>
Task<List<T>> TraerTodoAsync(CancellationToken cancellationToken);
}
public sealed class BuscarDocumentosConRepositorio
{
private readonly IDocumentoRepository<admDocumentos> _documentoRepository;
// private readonly IDocumentoRepository<DocumentoDto> _documentoRepository;
// private readonly IDocumentoRepository<TuModelo> _documentoRepository;
public BuscarDocumentosConRepositorio(IDocumentoRepository<admDocumentos> documentoRepository)
{
_documentoRepository = documentoRepository;
}
}
public void BuscarPorId()
{
var idDocumento = 1;
admDocumentos? documento = _documentoRepository.BuscarPorId(idDocumento);
_logger.LogInformation("{@Documento}", documento);
}
public void BuscarPorLlave()
{
var llaveDocumento = new LlaveDocumento { ConceptoCodigo = "PRUEBA", Serie = "PRUEBA", Folio = 1 };
admDocumentos? documento = _documentoRepository.BuscarPorLlave(llaveDocumento);
_logger.LogInformation("{@Documento}", documento);
}
public void BuscarSiguienteSerieYFolio()
{
var codigoConcepto = "PRUEBA";
LlaveDocumento siguienteFolio = _documentoRepository.BuscarSiguienteSerieYFolio(codigoConcepto);
_logger.LogInformation("{@SiguienteFolio}", siguienteFolio);
}
public void TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedor()
{
DateTime fechaInicio = DateTime.Today;
DateTime fechaFin = DateTime.Today;
var codigoConcepto = "PRUEBA";
var codigoClienteProveedor = "PRUEBA";
List<admDocumentos> documentos = _documentoRepository.TraerPorRangoFechaYCodigoConceptoYCodigoClienteProveedor(fechaInicio,
fechaFin, codigoConcepto, codigoClienteProveedor);
_logger.LogInformation("{@Documentos}", documentos);
}
public void TraerTodo()
{
List<admDocumentos> documentos = _documentoRepository.TraerTodo();
_logger.LogInformation("{@Documentos}", documentos);
}