@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.
- package/CATALOG_MANAGEMENT.md +43 -0
- package/catalog-import-preflight.d.ts +19 -0
- package/catalog-management.cjs +49 -1
- package/catalog-management.d.ts +1 -0
- package/catalog-management.js +47 -1
- package/package.json +1 -1
package/CATALOG_MANAGEMENT.md
CHANGED
|
@@ -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
|
+
};
|
package/catalog-management.cjs
CHANGED
|
@@ -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);
|
package/catalog-management.d.ts
CHANGED
|
@@ -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 {
|
package/catalog-management.js
CHANGED
|
@@ -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
|
};
|