HQS.DataBridge.Foundation
2.1.0
dotnet add package HQS.DataBridge.Foundation --version 2.1.0
NuGet\Install-Package HQS.DataBridge.Foundation -Version 2.1.0
<PackageReference Include="HQS.DataBridge.Foundation" Version="2.1.0" />
<PackageVersion Include="HQS.DataBridge.Foundation" Version="2.1.0" />
<PackageReference Include="HQS.DataBridge.Foundation" />
paket add HQS.DataBridge.Foundation --version 2.1.0
#r "nuget: HQS.DataBridge.Foundation, 2.1.0"
#:package HQS.DataBridge.Foundation@2.1.0
#addin nuget:?package=HQS.DataBridge.Foundation&version=2.1.0
#tool nuget:?package=HQS.DataBridge.Foundation&version=2.1.0
HQS.DataBridge.Foundation
Biblioteca de contratos compartidos para la integración con el ERP a través de DataBridge. Define los DTOs (*Contract) y las interfaces de controlador (I*Controller) que consumidores e implementaciones del wrapper deben usar para mantener un acoplamiento desacoplado y versionable.
Este repositorio no contiene lógica de negocio ni acceso a datos: solo la superficie de tipos que garantiza compatibilidad entre clientes (APIs, servicios, integraciones) y la implementación concreta del DB Wrapper.
Características
- Target .NET Standard 2.0 (compatible con .NET Framework y .NET moderno).
- Empaquetado como NuGet en cada build (
GeneratePackageOnBuild). - Patrón uniforme List / Search / Save en todos los controladores.
- Contratos de maestros (catálogos) y comprobantes (transacciones).
Requisitos
- .NET SDK compatible con
netstandard2.0 - Dependencia transitiva:
DS.Foundation.WebApi(tiposResponseContract<T>ySearchContract)
Instalación
dotnet add package HQS.DataBridge.Foundation
O agregar la referencia en el .csproj:
<PackageReference Include="HQS.DataBridge.Foundation" Version="2.1.0" />
Estructura del proyecto
src/
└── HQS.DataBridge.Foundation/
├── HQS.DataBridge.Foundation.csproj
└── HQS.DataBridge.ERP.Interfaces/
├── Contracts/ # DTOs de maestros
│ ├── AbstractElementContract.cs
│ ├── AbstractObjectContract.cs
│ ├── ClienteContract.cs
│ ├── ArticuloContract.cs
│ ├── DepositoContract.cs
│ ├── ...
│ └── Comprobantes/ # DTOs transaccionales
│ ├── ComprobanteContractBase.cs
│ ├── ComprobanteItemContract.cs
│ ├── OrdenDeCompraContract.cs
│ ├── OrdenDeCompraItemContract.cs
│ ├── OrdenDeVentaContract.cs
│ ├── OrdenDeVentaItemContract.cs
│ └── TipoDeComprobante.cs # códigos canónicos de tipo
└── Controllers/ # Interfaces de controlador
├── IClienteController.cs
├── IDepositoController.cs
├── IImpuestoController.cs
├── IOrdenDeCompraController.cs
└── ...
Namespaces
Todo el paquete vive bajo el namespace común HQS.DataBridge.ERP.Interfaces, y la ruta de carpetas es el namespace:
| Ámbito | Carpeta | Namespace |
|---|---|---|
| Interfaces de controlador | HQS.DataBridge.ERP.Interfaces/Controllers/ |
HQS.DataBridge.ERP.Interfaces.Controllers |
| Contratos de maestros y comprobantes | HQS.DataBridge.ERP.Interfaces/Contracts/ (incluida Comprobantes/) |
HQS.DataBridge.ERP.Interfaces.Contracts |
El build lo hace cumplir: el RootNamespace del proyecto está vacío y la regla IDE0130 (src/HQS.DataBridge.Foundation/.editorconfig) falla con error si el namespace de un archivo no coincide con su carpeta. Comprobantes/ es la única excepción: es una subcarpeta organizativa y sus tipos comparten HQS.DataBridge.ERP.Interfaces.Contracts.
Jerarquía de contratos (maestros)
AbstractElementContract
├── Codigo, Nombre
├── UsuarioContract
└── AbstractObjectContract
├── Descripcion, EstaDeshabilitado, EstaEliminado
└── ClienteContract, ArticuloContract, ProveedorContract, ImpuestoContract, ...
Jerarquía de comprobantes
ComprobanteContractBase (cabecera común: tipo, fechas, CAI, empresa, condición de pago, ...)
├── OrdenDeCompraContract (+ proveedor, tipo de proveedor, EsGasto, CuentaDeuda, Items)
└── OrdenDeVentaContract (+ cliente, Items)
ComprobanteItemContract (línea común: artículo, cantidad, precios, impuestos, depósito, ...)
├── OrdenDeCompraItemContract
└── OrdenDeVentaItemContract
Los comprobantes son DTOs planos (cabecera + ítems) y no heredan de la jerarquía de maestros. Las referencias a otras entidades son siempre códigos de negocio (el Codigo del contrato referenciado), nunca ids internos del ERP.
Tipos e identificación de comprobantes
Tipo lleva siempre un código canónico de 2 letras de TipoDeComprobante, nunca un código numérico ni un valor propio del ERP. Cada comprobante concreto lo inicializa (OrdenDeCompraContract = OC, OrdenDeVentaContract = OV).
| Código | Constante | Nombre visible |
|---|---|---|
| OC | TipoDeComprobante.OC |
Orden de compra |
| RI | TipoDeComprobante.RI |
Remito de ingreso |
| RE | TipoDeComprobante.RE |
Remito de egreso |
| NC | TipoDeComprobante.NC |
Nota de crédito |
| FC | TipoDeComprobante.FC |
Factura |
| ND | TipoDeComprobante.ND |
Nota de débito |
| TR | TipoDeComprobante.TR |
Orden de traslado |
| OV | TipoDeComprobante.OV |
Orden de venta |
Campos de identificación (todos string, en formato canónico):
| Campo | Formato | Ejemplo |
|---|---|---|
Tipo |
2 letras | OC |
Letra |
1 carácter; X si el comprobante no tiene letra fiscal |
X |
Talonario |
5 dígitos con ceros a la izquierda; identifica el punto de venta de la empresa emisora | 00001 |
Numero |
8 dígitos con ceros a la izquierda | 00000023 |
Comprobante |
Tipo + Letra + Talonario + Numero, ancho fijo y sin separadores |
OCX0000100000023 |
Comprobantees el identificador único del comprobante dentro del ERP para la empresa (EmpresaCodigo).Searchrecibe el valor deComprobanteenSearchContract.Id. La empresa se indica con un filtroField=EmpresaCodigoenSearchContract.Filters; sin ese filtro, el wrapper usa la empresa por defecto de su configuración.- En
Save, quien llama envía siempreTipo,Letra,Talonario,NumeroyComprobante, y el ERP los respeta. - Cada wrapper traduce estos valores al formato de su ERP (por ejemplo, Gescom usa un talonario de 4 dígitos).
Referencias y valores null
Codigode identidad (AbstractElementContract.Codigo) nunca esnull: se inicializa en""porque es la clave de join entre contratos.- Un campo
*Codigocontiene el código de la entidad referenciada (por ejemploArticuloContract.RubroCodigo=RubroContract.Codigo); el campo homónimo sin sufijo contiene su nombre (ArticuloContract.Rubro= nombre del rubro). Para relacionar entidades, usar siempre el*Codigo. - Un
stringsin inicializador o una propiedad de valor nullable (int?,decimal?,bool?) ennullsignifica "el ERP no lo informa o no hay relación", nunca "vacío" ni "cero".
Entidades disponibles
Maestros
| Contrato | Controlador |
|---|---|
ArticuloContract |
IArticuloController |
ClienteContract |
IClienteController |
CondicionPagoContract |
ICondicionPagoController |
DepositoContract |
IDepositoController |
EmpresaContract |
IEmpresaController |
ImpuestoContract |
IImpuestoController |
LineaContract |
ILineaController |
ListaPrecioContract |
IListaPrecioController |
ProveedorContract |
IProveedorController |
RubroContract |
IRubroController |
UsuarioContract |
IUsuarioController |
VendedorContract |
IVendedorController |
ZonaContract |
IZonaController |
Comprobantes
| Contrato | Controlador |
|---|---|
OrdenDeCompraContract |
IOrdenDeCompraController |
OrdenDeVentaContract |
IOrdenDeVentaController |
Cada comprobante incluye una lista de ítems (OrdenDeCompraItemContract / OrdenDeVentaItemContract), ambos derivados de ComprobanteItemContract.
Patrón de controlador
Todas las interfaces siguen la misma firma:
public interface IClienteController
{
ResponseContract<List<ClienteContract>> List();
ResponseContract<List<ClienteContract>> Search(SearchContract search);
ResponseContract<List<ClienteContract>> Save(ClienteContract contract);
}
| Operación | Descripción |
|---|---|
List() |
Obtiene el listado completo de registros. |
Search(SearchContract) |
Busca registros según criterios del contrato de búsqueda. |
Save(T) |
Persiste o actualiza un registro. |
Los tipos de respuesta y búsqueda provienen de DS.Foundation.WebApi.Surface.Contracts.
Compilación
dotnet build src/HQS.DataBridge.Foundation.sln
El paquete NuGet se genera en:
src/HQS.DataBridge.Foundation/bin/Debug/HQS.DataBridge.Foundation.{version}.nupkg
Scripts (bash) en src/: clean.sh borra bin/ y obj/ de los proyectos de src/, build.sh compila en Release y push.sh limpia, compila y publica el paquete (requiere NUGET_ORG_API_KEY y GITEA_NUGET_API_KEY).
Versionado
La versión del paquete se define en HQS.DataBridge.Foundation.csproj (AssemblyVersion / FileVersion).
Al actualizar contratos con cambios incompatibles (renombre de namespace, cambio de tipos de propiedades, eliminación de miembros), incrementar la versión mayor según SemVer y documentar la migración para consumidores existentes. Excepción histórica: la 1.1 incluyó cambios incompatibles por decisión del proyecto (ver migración abajo).
La superficie pública se controla con Microsoft.CodeAnalysis.PublicApiAnalyzers: PublicAPI.Shipped.txt (liberado) y PublicAPI.Unshipped.txt (pendiente de liberar; los miembros eliminados figuran con el prefijo *REMOVED*). Ambos archivos, el README y la documentación XML viajan dentro del paquete.
Migración 2.0 → 2.1
La 2.1 no rompe compilación, pero cambia los valores de identificación de los comprobantes (OrdenDeCompraContract, OrdenDeVentaContract). Cada wrapper debe adoptarla para que Search y Save sean consistentes entre ERPs.
| Cambio | Acción en wrappers y consumidores |
|---|---|
Tipo pasa a ser el código canónico de TipoDeComprobante y OrdenDeCompraContract / OrdenDeVentaContract lo inicializan en OC / OV |
Traducir el tipo del ERP al código canónico (y al revés en Save). |
Letra lleva X cuando el comprobante no tiene letra fiscal |
Informar X en lugar de vacío o null. |
Nuevos Talonario (5 dígitos) y Numero (8 dígitos), con ceros a la izquierda |
Mapearlos desde el ERP, convirtiendo el largo del talonario si el ERP usa otro (Gescom: 4). |
Comprobante pasa a ser Tipo + Letra + Talonario + Numero (ancho fijo, 16 caracteres) |
Componerlo con el formato canónico; Search lo recibe en SearchContract.Id junto con el filtro EmpresaCodigo. Los consumidores que parseaban el formato del ERP deben usar los campos separados. |
Migración 1.x → 2.0
La 2.0 rompe compilación en todos los wrappers (Gescom, Netegia, Odoo, Táctica) y cambia el JSON de comprobantes, artículos, clientes, empresas, impuestos y usuarios. Cada wrapper debe actualizarse en la misma release.
Comprobantes (OrdenDeCompraContract, OrdenDeVentaContract y sus ítems)
| Cambio | Acción en wrappers y consumidores |
|---|---|
La cabecera común pasa a ComprobanteContractBase y la línea común a ComprobanteItemContract |
Sin cambios de código para quien usa las clases concretas; el JSON conserva los nombres de propiedad. Código que reciba "cualquier comprobante" puede tipar contra las bases. |
EmpresaId (int?) → EmpresaCodigo (string) |
Mapear el Codigo de EmpresaContract, no el id interno. |
CppId (int?) → CondicionPagoCodigo (string) |
Mapear el Codigo de CondicionPagoContract. |
PeriodoId (int?) → Periodo (string, yyyyMM) |
Convertir el período a texto yyyyMM (por ejemplo 202611). |
CondIva (byte?) → CondicionIva (string) |
Informar la condición de IVA como texto del ERP en lugar del código numérico. |
CamionFisicoId (int?) → CamionCodigo (string) |
Mapear el código de negocio del vehículo. |
OrdenDeCompraContract.TipoProveedorId (int?) → TipoProveedorCodigo (string) |
Mapear el código del tipo de proveedor. |
Ítems: DepositoDestinoId (int?) → DepositoCodigo (string) |
Mapear el Codigo de DepositoContract. |
Ítems: UxbCompra → UxbOperacion |
Renombrar el mapeo; aplica a compra y venta. |
Ítems: DescuentoDetallado pasa de decimal? a string |
Informar el texto tal como lo expresa el ERP. |
Se eliminan AcreditaFuturo, Acredito, Papel, Poc, Km, PorCuentaYOrden, ReferenciaAcreditacion, PeriodoAcreditacionId y Hora (cabecera) y EsVacio y Cantidad2 (ítems) |
Quitar su mapeo. La hora del comprobante viaja en Fecha. |
Maestros
| Cambio | Acción en wrappers y consumidores |
|---|---|
ArticuloContract: Costo, UnidadesPorBulto, BultosPorPallet, Stock, StockMin y EsConAlcohol pasan a nullable |
Devolver null cuando el ERP no informa el dato (antes se enviaba 0/false). Los consumidores deben contemplar null. |
ArticuloContract: nuevos RubroCodigo y LineaCodigo |
Mapear el código del rubro y la línea; Rubro y Linea siguen con el nombre. |
ClienteContract: nuevos ListaPrecioCodigo, ZonaCodigo y VendedorCodigo |
Mapear los códigos; ListaPrecio, Zona y Vendedor siguen con el nombre. |
ClienteContract.CodPos y EmpresaContract.Cp → CodigoPostal; nuevo ProveedorContract.CodigoPostal |
Renombrar el mapeo y mapear el código postal del proveedor. |
ClienteContract.GeoX / GeoY y CondicionPagoContract.Dias pasan a nullable |
Devolver null cuando el ERP no los informa. |
ImpuestoContract hereda de AbstractObjectContract (suma Nombre, Descripcion, EstaDeshabilitado, EstaEliminado) y Porcentaje pasa a decimal? |
Codigo y Tipo no cambian. Mapear el nombre y el estado si el ERP los tiene. |
Nuevo IImpuestoController (List / Search / Save sobre ImpuestoContract) |
Implementarlo en cada wrapper. |
UsuarioContract hereda de AbstractElementContract; Nickname → Nombre |
Renombrar el mapeo. Codigo no cambia (ahora heredado). |
Migración 1.0.x → 1.1
| Cambio | Acción en wrappers y consumidores |
|---|---|
Los contratos de comprobantes (OrdenDeCompraContract, OrdenDeCompraItemContract, OrdenDeVentaContract, OrdenDeVentaItemContract) pasan de HQS.DataBridge.Foundation.DB.Wrapper.Contracts.Comprobantes a HQS.DataBridge.ERP.Interfaces.Contracts |
Reemplazar el using por HQS.DataBridge.ERP.Interfaces.Contracts. El JSON no cambia. |
Se eliminan OrdenDeVentaContract.EsGasto, CuentaDeuda y TipoProveedorId (propios de compras) |
Quitar su mapeo. Los consumidores dejan de recibirlos en el JSON. |
Se elimina ProveedorContract.Baja |
Usar EstaDeshabilitado. |
Relación con otros proyectos
┌─────────────────────┐ referencia ┌──────────────────────────┐
│ Consumidores │ ──────────────────► │ HQS.DataBridge.Foundation│
│ (API, servicios) │ │ (contratos + interfaces)│
└─────────────────────┘ └────────────┬─────────────┘
│ implementa
▼
┌──────────────────────────┐
│ DB Wrapper (ERP) │
└──────────────────────────┘
Los consumidores referencian este paquete para tipar requests/responses. La implementación concreta de cada I*Controller vive en el proyecto del wrapper ERP.
Plan de evolución
Ver agents/rules/roadmap.md para el roadmap de entidades faltantes hacia un ERP estándar (fases, sprints y deuda técnica), agents/rules/stock-movements.md para la decisión sobre movimientos de stock y agents/rules/voucher-types.md para el catálogo de tipos de comprobante.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- DS.Foundation.WebApi (>= 8.2.6)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.1.0 | 49 | 11/11/2026 |
| 2.0.0 | 89 | 11/7/2026 |
| 1.2.0 | 124 | 10/17/2026 |
| 1.1.0 | 120 | 10/14/2026 |
| 1.0.16 | 143 | 9/22/2026 |
| 1.0.15 | 106 | 9/22/2026 |
| 1.0.13 | 119 | 9/21/2026 |
| 1.0.12 | 201 | 8/17/2026 |
| 1.0.11 | 155 | 6/24/2026 |
| 1.0.10 | 189 | 6/16/2026 |
| 1.0.9 | 145 | 6/15/2026 |
| 1.0.8 | 144 | 6/15/2026 |
| 1.0.7 | 145 | 6/12/2026 |
| 1.0.6 | 145 | 6/12/2026 |
| 1.0.5 | 155 | 6/11/2026 |
| 1.0.4 | 142 | 5/14/2026 |