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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="HQS.DataBridge.Foundation" Version="2.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="HQS.DataBridge.Foundation" Version="2.1.0" />
                    
Directory.Packages.props
<PackageReference Include="HQS.DataBridge.Foundation" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add HQS.DataBridge.Foundation --version 2.1.0
                    
#r "nuget: HQS.DataBridge.Foundation, 2.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package HQS.DataBridge.Foundation@2.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=HQS.DataBridge.Foundation&version=2.1.0
                    
Install as a Cake Addin
#tool nuget:?package=HQS.DataBridge.Foundation&version=2.1.0
                    
Install as a Cake Tool

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 (tipos ResponseContract<T> y SearchContract)

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
  • Comprobante es el identificador único del comprobante dentro del ERP para la empresa (EmpresaCodigo).
  • Search recibe el valor de Comprobante en SearchContract.Id. La empresa se indica con un filtro Field = EmpresaCodigo en SearchContract.Filters; sin ese filtro, el wrapper usa la empresa por defecto de su configuración.
  • En Save, quien llama envía siempre Tipo, Letra, Talonario, Numero y Comprobante, 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

  • Codigo de identidad (AbstractElementContract.Codigo) nunca es null: se inicializa en "" porque es la clave de join entre contratos.
  • Un campo *Codigo contiene el código de la entidad referenciada (por ejemplo ArticuloContract.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 string sin inicializador o una propiedad de valor nullable (int?, decimal?, bool?) en null significa "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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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