@bacano/sdk 1.2.8 → 1.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -131,6 +131,49 @@ El paquete exporta `CatalogCreateProposal`, `CatalogContentProposal` y
131
131
  IDs, convertir atributos informativos en variantes, inventar bodegas ni escoger
132
132
  automáticamente la primera web. Preguntar las decisiones de mostrar/ocultar por web.
133
133
 
134
+ ### Preguntas obligatorias antes de crear el lote
135
+
136
+ El SDK expone datos y operaciones; **el agente que lo utiliza** debe consultar
137
+ `getContext()` y `getReferences()` y confirmar estas decisiones con la persona
138
+ **antes** de `createBatch` o `sendProposals`. Puede agruparlas en una conversación,
139
+ pero no omitirlas aunque el archivo de origen parezca completo:
140
+
141
+ `getCatalogImportPreflight(references)` (exportado desde
142
+ `@bacano/sdk/catalog-management`) devuelve las cuatro preguntas, los perfiles
143
+ y precios disponibles, la base tributaria de la empresa y las bodegas únicas
144
+ que pueden preseleccionarse. El agente debe presentar y resolver esas preguntas;
145
+ la función no reemplaza la confirmación humana.
146
+
147
+ 1. **Destinos y publicación:** ¿en cuáles sucursales autorizadas se crearán los
148
+ productos y en cuáles webs se mostrarán? Confirmar también el estado inicial
149
+ (borrador o activo) por sucursal. No escoger la primera opción por orden.
150
+ 2. **Precios:** ¿solo el precio normal `CLIENT` o todos/alguno de los tipos
151
+ habilitados (`WHOLESALE`, `WHOLESALE_2`, `SALE`)? ¿De qué columna o regla sale
152
+ cada importe y difiere entre sucursales? `CLIENT` es el precio principal;
153
+ no generar precios faltantes ni interpretar un importe vacío como cero.
154
+ 3. **IVA:** ¿qué perfil de `taxProfiles` corresponde a los productos y los
155
+ precios de la fuente incluyen IVA o lo excluyen? Mostrar el valor actual de
156
+ `company.sales_prices_include_tax_default` para que la persona confirme la
157
+ base. `price_tax_basis` del borrador debe coincidir con ese valor de empresa;
158
+ si la fuente usa otra base, acordar explícitamente la conversión antes de
159
+ normalizar. No inferir tarifa, responsabilidad tributaria ni convertir
160
+ importes silenciosamente; si hay productos con IVA distinto, pedir una regla
161
+ por grupo.
162
+ 4. **Inventario:** ¿se cargará inventario inicial? Si sí, ¿qué cantidad para cada
163
+ variante, sucursal y bodega? El cero explícito es válido; una celda vacía
164
+ queda pendiente. Si una sucursal tiene **una sola bodega vinculada**, usarla
165
+ como selección predeterminada y confirmarla. Si tiene varias, preguntar cuál
166
+ o cuáles corresponden a cada cantidad, sin escoger la primera ni repetir la
167
+ misma cantidad en todas. Si no hay bodegas vinculadas, pedir configuración
168
+ en Bacano antes de continuar.
169
+
170
+ Resumir las respuestas y pedir confirmación antes del primer envío. Si una
171
+ respuesta esencial falta, detener esa parte y conservarla como pendiente de
172
+ revisión; nunca rellenarla por conjetura. Los precios son por sucursal y tipo;
173
+ el inventario es por sucursal, bodega y variante. `getReferences()` puede
174
+ cambiar, así que volver a consultarlo si la persona configura nuevos destinos,
175
+ bodegas, perfiles o tipos de precio.
176
+
134
177
  ```ts
135
178
  // Guardar este identificador y el nombre ANTES de hacer la petición.
136
179
  const batchRequest = {
@@ -0,0 +1,19 @@
1
+ import type { CatalogReferences } from "./catalog-management-types";
2
+ export interface CatalogImportPreflightQuestion {
3
+ id: "destinations" | "prices" | "tax" | "inventory";
4
+ prompt: string;
5
+ options?: Array<{
6
+ id: string;
7
+ name: string;
8
+ }>;
9
+ }
10
+ /** Questions for the agent to resolve with a person before creating a batch. */
11
+ export declare function getCatalogImportPreflight(references: CatalogReferences): {
12
+ questions: CatalogImportPreflightQuestion[];
13
+ taxBasis: "included" | "excluded";
14
+ soleWarehouseDefaults: Array<{
15
+ chainId: string;
16
+ warehouseId: string;
17
+ warehouseName: string;
18
+ }>;
19
+ };
@@ -21,9 +21,57 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var catalog_management_exports = {};
22
22
  __export(catalog_management_exports, {
23
23
  CatalogManagementError: () => CatalogManagementError,
24
- createCatalogManagementClient: () => createCatalogManagementClient
24
+ createCatalogManagementClient: () => createCatalogManagementClient,
25
+ getCatalogImportPreflight: () => getCatalogImportPreflight
25
26
  });
26
27
  module.exports = __toCommonJS(catalog_management_exports);
28
+
29
+ // libs/sdk/src/catalog-import-preflight.ts
30
+ function getCatalogImportPreflight(references) {
31
+ const taxBasis = references.company.sales_prices_include_tax_default ? "included" : "excluded";
32
+ return {
33
+ taxBasis,
34
+ soleWarehouseDefaults: references.branches.flatMap((branch) => {
35
+ const link = branch.chains_warehouses[0];
36
+ return branch.chains_warehouses.length === 1 && link ? [
37
+ {
38
+ chainId: branch.id,
39
+ warehouseId: link.warehouse.id,
40
+ warehouseName: link.warehouse.name
41
+ }
42
+ ] : [];
43
+ }),
44
+ questions: [
45
+ {
46
+ id: "destinations",
47
+ prompt: "\xBFEn qu\xE9 sucursales se crear\xE1n los productos, en qu\xE9 webs se mostrar\xE1n y con qu\xE9 estado inicial?",
48
+ options: references.branches.map((branch) => ({
49
+ id: branch.id,
50
+ name: branch.name
51
+ }))
52
+ },
53
+ {
54
+ id: "prices",
55
+ prompt: "\xBFUsaremos solo el precio normal o tambi\xE9n otros precios habilitados? \xBFQu\xE9 importe corresponde a cada sucursal?",
56
+ options: references.priceTypes.filter((type) => type.is_enabled).map((type) => ({ id: type.price_type, name: type.price_type }))
57
+ },
58
+ {
59
+ id: "tax",
60
+ prompt: `\xBFQu\xE9 perfil de IVA corresponde? \xBFLos precios de origen incluyen o excluyen IVA? La empresa espera precios con IVA ${taxBasis === "included" ? "incluido" : "excluido"}.`,
61
+ options: references.taxProfiles.map((profile) => ({
62
+ id: profile.code,
63
+ name: `${profile.name} (${profile.rate} %)`
64
+ }))
65
+ },
66
+ {
67
+ id: "inventory",
68
+ prompt: "\xBFCargaremos inventario inicial? Si s\xED, \xBFqu\xE9 cantidad va en cada variante, sucursal y bodega? Confirma la bodega \xFAnica o elige entre las disponibles."
69
+ }
70
+ ]
71
+ };
72
+ }
73
+
74
+ // libs/sdk/src/catalog-management.ts
27
75
  var CatalogManagementError = class extends Error {
28
76
  constructor(code, status, message, details) {
29
77
  super(message);
@@ -1,5 +1,6 @@
1
1
  import type { CatalogManagementConfig, CatalogManagementContext, CatalogProductPage, CatalogReferences, CatalogTaxonomy } from "./catalog-management-types";
2
2
  export * from "./catalog-draft-types";
3
+ export * from "./catalog-import-preflight";
3
4
  export * from "./catalog-management-types";
4
5
  import type { CatalogDraftBatch, CatalogDraftBatchPage, CatalogDraftChunkResult, CatalogDraftImageResult, CatalogDraftResult, CatalogDraftWrite } from "./catalog-draft-types";
5
6
  export declare class CatalogManagementError extends Error {
@@ -1,3 +1,48 @@
1
+ // libs/sdk/src/catalog-import-preflight.ts
2
+ function getCatalogImportPreflight(references) {
3
+ const taxBasis = references.company.sales_prices_include_tax_default ? "included" : "excluded";
4
+ return {
5
+ taxBasis,
6
+ soleWarehouseDefaults: references.branches.flatMap((branch) => {
7
+ const link = branch.chains_warehouses[0];
8
+ return branch.chains_warehouses.length === 1 && link ? [
9
+ {
10
+ chainId: branch.id,
11
+ warehouseId: link.warehouse.id,
12
+ warehouseName: link.warehouse.name
13
+ }
14
+ ] : [];
15
+ }),
16
+ questions: [
17
+ {
18
+ id: "destinations",
19
+ prompt: "\xBFEn qu\xE9 sucursales se crear\xE1n los productos, en qu\xE9 webs se mostrar\xE1n y con qu\xE9 estado inicial?",
20
+ options: references.branches.map((branch) => ({
21
+ id: branch.id,
22
+ name: branch.name
23
+ }))
24
+ },
25
+ {
26
+ id: "prices",
27
+ prompt: "\xBFUsaremos solo el precio normal o tambi\xE9n otros precios habilitados? \xBFQu\xE9 importe corresponde a cada sucursal?",
28
+ options: references.priceTypes.filter((type) => type.is_enabled).map((type) => ({ id: type.price_type, name: type.price_type }))
29
+ },
30
+ {
31
+ id: "tax",
32
+ prompt: `\xBFQu\xE9 perfil de IVA corresponde? \xBFLos precios de origen incluyen o excluyen IVA? La empresa espera precios con IVA ${taxBasis === "included" ? "incluido" : "excluido"}.`,
33
+ options: references.taxProfiles.map((profile) => ({
34
+ id: profile.code,
35
+ name: `${profile.name} (${profile.rate} %)`
36
+ }))
37
+ },
38
+ {
39
+ id: "inventory",
40
+ prompt: "\xBFCargaremos inventario inicial? Si s\xED, \xBFqu\xE9 cantidad va en cada variante, sucursal y bodega? Confirma la bodega \xFAnica o elige entre las disponibles."
41
+ }
42
+ ]
43
+ };
44
+ }
45
+
1
46
  // libs/sdk/src/catalog-management.ts
2
47
  var CatalogManagementError = class extends Error {
3
48
  constructor(code, status, message, details) {
@@ -100,5 +145,6 @@ function createCatalogManagementClient(config) {
100
145
  }
101
146
  export {
102
147
  CatalogManagementError,
103
- createCatalogManagementClient
148
+ createCatalogManagementClient,
149
+ getCatalogImportPreflight
104
150
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bacano/sdk",
3
- "version": "1.2.8",
3
+ "version": "1.2.9",
4
4
  "description": "TypeScript SDK for building websites on the Bacano ERP",
5
5
  "main": "./index.cjs",
6
6
  "module": "./index.js",