n8n-nodes-centum 0.2.28 → 0.2.30

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.
@@ -38,92 +38,139 @@ class Centum {
38
38
  };
39
39
  const resource = this.getNodeParameter("resource", 0);
40
40
  switch (resource) {
41
- case "articulo": {
42
- const clientId = this.getNodeParameter("clienteId", 0);
43
- const documentDate = this.getNodeParameter("documentDate", 0);
44
- const IdsRubro = this.getNodeParameter("idsRubros", 0);
45
- const completeMigration = this.getNodeParameter("migracionCompleta", 0);
46
- const IdsSubRubro = this.getNodeParameter("idsSubRubros", 0);
47
- const formattedDocumentDate = documentDate.replace(/\..+/, "");
48
- const dateModified = this.getNodeParameter("dateModified", 0);
49
- const dateModifiedImage = this.getNodeParameter("dateModifiedImage", 0);
50
- const priceDateModified = this.getNodeParameter("priceDateModified", 0);
51
- const numeroPagina = this.getNodeParameter("numeroPagina", 0);
52
- const cantidadPorPagina = this.getNodeParameter("cantidadPorPagina", 0);
53
- const bodyToSend = {
54
- idCliente: clientId,
55
- FechaDocumento: formattedDocumentDate,
56
- incluirAtributosArticulos: true,
57
- IdsRubro: IdsRubro ? [IdsRubro] : [],
58
- IdsSubRubro: IdsSubRubro ? [IdsSubRubro] : [""],
59
- fechaModificacionDesde: dateModified ? dateModified : "",
60
- fechaModificacionImagenesDesde: dateModifiedImage ? dateModifiedImage : "",
61
- fechaPrecioActualizadoDesde: priceDateModified,
62
- numeroPagina,
63
- cantidadPorPagina,
64
- };
41
+ case "actualizarCliente": {
42
+ const nuevosDatos = this.getNodeParameter("cuerpoHTTP", 0);
65
43
  try {
66
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
44
+ const updateCustomer = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes/Actualizar`, {
67
45
  method: "POST",
68
- body: bodyToSend,
46
+ body: nuevosDatos,
69
47
  headers,
70
- queryParams: { tipoOrdenArticulos: "Codigo" },
71
48
  });
72
- if (response.Articulos.Items.length > 0) {
73
- const items = response.Articulos.Items;
74
- if (!completeMigration) {
75
- const acc = [];
76
- for (const item of items) {
77
- const groupArticle = item.GrupoArticulo;
78
- if (!groupArticle)
79
- continue;
80
- const body = {
81
- idCliente: clientId,
82
- FechaDocumento: formattedDocumentDate,
83
- incluirAtributosArticulos: true,
84
- IdsRubro: IdsRubro ? [IdsRubro] : [],
85
- IdsSubRubro: IdsSubRubro ? [IdsSubRubro] : [""],
86
- NombreGrupoArticulo: groupArticle.Nombre,
87
- IdGrupoArticulo: groupArticle.IdGrupoArticulo,
88
- };
89
- try {
90
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
91
- method: "POST",
92
- headers: { ...headers },
93
- body,
94
- queryParams: { tipoOrdenArticulos: "Codigo" },
95
- });
96
- if (response.Articulos.Items.length > 0) {
97
- acc.push(...response.Articulos.Items);
98
- }
99
- }
100
- catch (error) {
101
- console.log("Error en solicitud de grupo de artículos", { error });
102
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
103
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
104
- }
105
- }
106
- const combinedArrays = [...acc, ...items];
107
- const filteredArray = Array.from(new Map(combinedArrays.map((obj) => [obj.IdArticulo, obj])).values());
108
- const itemsArray = filteredArray.map((item) => ({
109
- ...item,
110
- AtributosArticulo: item.Habilitado && item.ActivoWeb ? item.AtributosArticulo : [],
111
- }));
112
- return [this.helpers.returnJsonArray(itemsArray)];
113
- }
114
- return [this.helpers.returnJsonArray(items)];
115
- }
116
- else {
117
- return [this.helpers.returnJsonArray({ json: {} })];
49
+ return [this.helpers.returnJsonArray(updateCustomer)];
50
+ }
51
+ catch (error) {
52
+ console.log(error);
53
+ return [this.helpers.returnJsonArray([])];
54
+ }
55
+ }
56
+ case "buscarClientePorCuit": {
57
+ const cuit = this.getNodeParameter("cuit", 0, "");
58
+ if (!cuit) {
59
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar CUIT para buscar clientes.");
60
+ }
61
+ const queryParams = { Cuit: cuit };
62
+ try {
63
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
64
+ method: "GET",
65
+ headers,
66
+ queryParams,
67
+ });
68
+ return [this.helpers.returnJsonArray(response.Items)];
69
+ }
70
+ catch (error) {
71
+ console.log(`[ClientesBusquedaPorCuit] Error:`, error);
72
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
73
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
74
+ }
75
+ }
76
+ case "buscarClientes": {
77
+ const codigo = this.getNodeParameter("codigoCliente", 0, "");
78
+ const cuit = this.getNodeParameter("cuit", 0, "");
79
+ const razonSocial = this.getNodeParameter("razonSocial", 0, "");
80
+ if (!codigo && !cuit && !razonSocial) {
81
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar al menos un campo para la búsqueda (CUIT, Codigo o Razón Social).");
82
+ }
83
+ const queryParams = {};
84
+ if (cuit)
85
+ queryParams.Cuit = cuit;
86
+ if (codigo)
87
+ queryParams.codigo = codigo;
88
+ if (razonSocial)
89
+ queryParams.RazonSocial = razonSocial;
90
+ try {
91
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
92
+ method: "GET",
93
+ headers,
94
+ queryParams,
95
+ });
96
+ console.log(response);
97
+ return [this.helpers.returnJsonArray(response.Items)];
98
+ }
99
+ catch (error) {
100
+ console.log(`[ClientesBusqueda] Error:`, error);
101
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
102
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
103
+ }
104
+ }
105
+ case "buscarContribuyente": {
106
+ const cuit = this.getNodeParameter("cuit", 0, "");
107
+ const razonSocial = this.getNodeParameter("razonSocial", 0, "");
108
+ if (!cuit && !razonSocial) {
109
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar al menos CUIT o Razón Social para buscar contribuyentes.");
110
+ }
111
+ let url = `${centumUrl}/Clientes/BuscarContribuyente`;
112
+ const queryParams = {};
113
+ if (cuit && !razonSocial) {
114
+ url += `/${cuit}`;
115
+ }
116
+ else {
117
+ if (cuit)
118
+ queryParams.Cuit = cuit;
119
+ if (razonSocial)
120
+ queryParams.razonSocial = razonSocial;
121
+ }
122
+ const requestDetails = {
123
+ url,
124
+ headers,
125
+ queryParams,
126
+ };
127
+ try {
128
+ console.log(`[BuscarContribuyente] Request:`, JSON.stringify(requestDetails, null, 2));
129
+ const response = await (0, functions_1.apiRequest)(requestDetails.url, {
130
+ method: "GET",
131
+ headers: requestDetails.headers,
132
+ queryParams: requestDetails.queryParams,
133
+ });
134
+ console.log(`[BuscarContribuyente] Response:`, JSON.stringify(response, null, 2));
135
+ if (response.CantidadTotalItems === 1) {
136
+ return [this.helpers.returnJsonArray(response.Items)];
118
137
  }
138
+ return [this.helpers.returnJsonArray(response)];
119
139
  }
120
140
  catch (error) {
121
- console.log("Error en solicitud de artículos", error);
141
+ console.log(`[BuscarContribuyente] Error:`, error);
142
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
143
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
144
+ }
145
+ }
146
+ case "buscarProductoEnSucursal": {
147
+ const IdSucursalFisica = this.getNodeParameter("idSucursalFisica", 0);
148
+ const idArticulo = this.getNodeParameter("articleId", 0);
149
+ const codigo = this.getNodeParameter("codigoArticulo", 0);
150
+ const nombre = this.getNodeParameter("nombreArticulo", 0);
151
+ const queryParams = {
152
+ IdSucursalFisica: IdSucursalFisica,
153
+ codigoExacto: codigo,
154
+ idsArticulos: idArticulo,
155
+ nombre
156
+ };
157
+ if (!IdSucursalFisica || (!idArticulo && !codigo && !nombre)) {
158
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la sucursal fisica y el id del articulo o el codigo son obligatorios");
159
+ }
160
+ try {
161
+ const dataArticulosExistencias = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosSucursalesFisicas`, {
162
+ headers,
163
+ queryParams,
164
+ });
165
+ return [this.helpers.returnJsonArray(dataArticulosExistencias.Items)];
166
+ }
167
+ catch (error) {
168
+ console.log(error);
122
169
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
123
170
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
124
171
  }
125
172
  }
126
- case "articuloPorId": {
173
+ case "buscarProductoPorCodigo": {
127
174
  const codigo = this.getNodeParameter("codigoArticulo", 0);
128
175
  const articleId = this.getNodeParameter("articleId", 0);
129
176
  const fechaCreacionDesde = this.getNodeParameter("startDate", 0);
@@ -145,7 +192,7 @@ class Centum {
145
192
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
146
193
  }
147
194
  }
148
- case "articuloPorNombre": {
195
+ case "buscarProductoPorNombre": {
149
196
  const nombre = this.getNodeParameter("nombre", 0);
150
197
  if (!nombre) {
151
198
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El nombre del artículo es obligatorio");
@@ -166,226 +213,100 @@ class Centum {
166
213
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
167
214
  }
168
215
  }
169
- case "articulosDatosGenerales": {
216
+ case 'buscarProductos': {
217
+ const nombreArticulo = this.getNodeParameter('nombreArticulo', 0, '');
218
+ const codigoArticulo = this.getNodeParameter('codigoArticulo', 0, '');
170
219
  try {
171
- const ajustesHTTP = functions_1.getHttpSettings.call(this);
172
- const articulosURL = `${centumUrl}/Articulos/DatosGenerales`;
173
- const fetchOptions = {
174
- method: "POST",
220
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/DatosGenerales`, {
221
+ method: 'POST',
175
222
  headers,
176
- body: {},
177
- queryParams: { tipoOrdenArticulos: "Nombre" },
178
- pagination: ajustesHTTP.pagination,
179
- cantidadItemsPorPagina: ajustesHTTP.cantidadItemsPorPagina,
180
- intervaloPagina: ajustesHTTP.intervaloPagina,
181
- };
182
- const paginated = await (0, functions_1.apiPostRequestPaginated)(articulosURL, fetchOptions);
183
- return [this.helpers.returnJsonArray(paginated)];
223
+ body: { Nombre: nombreArticulo, Codigo: codigoArticulo },
224
+ });
225
+ return [this.helpers.returnJsonArray(response)];
226
+ }
227
+ catch (error) {
228
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Hubo un error al buscar el articulo. Error: ${error}`);
229
+ }
230
+ }
231
+ case 'buscarProveedor': {
232
+ const proveedorId = this.getNodeParameter('proveedorId', 0);
233
+ try {
234
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/${proveedorId}`, {
235
+ method: 'GET',
236
+ headers
237
+ });
238
+ return [this.helpers.returnJsonArray(response)];
184
239
  }
185
240
  catch (error) {
186
- console.log("Error en solicitud de artículos", error);
187
241
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
188
242
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
189
243
  }
190
244
  }
191
- case "articulosExistencia": {
192
- const branchOfficeIds = String(this.getNodeParameter("branchOfficeIds", 0));
245
+ case "consultarPrecioProducto": {
246
+ const idArticulos = this.getNodeParameter("codigoArticulo", 0);
247
+ const idLista = this.getNodeParameter("idList", 0);
248
+ if (!idLista || !idArticulos) {
249
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la lista y el artículo son obligatorios.");
250
+ }
193
251
  try {
194
- const dataArticulosExistencia = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosExistencias`, {
252
+ const articulo = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/FiltrosPrecios`, {
253
+ method: "POST",
195
254
  headers,
196
- queryParams: {
197
- idsSucursalesFisicas: branchOfficeIds,
198
- },
255
+ body: { IdsArticulos: idArticulos, IdLista: idLista },
199
256
  });
200
- return [this.helpers.returnJsonArray(dataArticulosExistencia.Items)];
257
+ return [this.helpers.returnJsonArray(articulo)];
201
258
  }
202
259
  catch (error) {
203
- console.log("ArticulosExistencias error: ", error);
204
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
205
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
260
+ console.log("Error en solicitud de artículo por ID:", error);
206
261
  }
207
262
  }
208
- case "articulosImagenes": {
209
- const arrResult = [];
210
- const inputData = this.getInputData();
211
- const requestUrl = `${centumUrl}/ArticulosImagenes`;
212
- for (let i = 0; i < inputData.length; i++) {
213
- const element = inputData[i];
214
- const dataObj = {
215
- idArticulo: element.json.IdArticulo,
216
- images: [],
217
- infoImages: [],
218
- };
219
- const allArticleImages = await (0, functions_1.centumGetArticleImages)(1, element.json.IdArticulo, {
220
- consumerApiPublicId,
221
- publicAccessKey: String(centumApiCredentials.publicAccessKey),
222
- }, requestUrl);
223
- if (allArticleImages instanceof Error) {
224
- console.error(`Failed to download images for article ${element.json.IdArticulo}`, allArticleImages);
225
- continue;
226
- }
227
- if (allArticleImages.length > 0) {
228
- for (let j = 0; j < allArticleImages.length; j++) {
229
- const binary = {};
230
- const dataImage = allArticleImages[j];
231
- const buffer = Buffer.from(dataImage.buffer);
232
- binary["data"] = await this.helpers.prepareBinaryData(buffer);
233
- binary.data.fileName = `${element.json.Codigo}_${j + 1}.${binary.data.fileExtension}`;
234
- dataObj.images.push(binary);
235
- dataObj.infoImages.push({
236
- lastModified: dataImage.lastModified,
237
- orderNumber: dataImage.orderNumber,
238
- });
239
- const existObj = arrResult.find((obj) => obj.idArticulo === element.json.IdArticulo);
240
- if (!existObj) {
241
- arrResult.push(dataObj);
242
- }
243
- }
244
- }
245
- else {
246
- dataObj.images = null;
247
- arrResult.push(dataObj);
248
- }
249
- }
250
- return [this.helpers.returnJsonArray(arrResult)];
251
- }
252
- case "articulosPrecioPorLista": {
253
- const idArticulos = this.getNodeParameter("codigoArticulo", 0);
254
- const idLista = this.getNodeParameter("idList", 0);
255
- if (!idLista || !idArticulos) {
256
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la lista y el artículo son obligatorios.");
257
- }
258
- try {
259
- const articulo = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/FiltrosPrecios`, {
260
- method: "POST",
261
- headers,
262
- body: { IdsArticulos: idArticulos, IdLista: idLista },
263
- });
264
- return [this.helpers.returnJsonArray(articulo)];
265
- }
266
- catch (error) {
267
- console.log("Error en solicitud de artículo por ID:", error);
268
- }
269
- }
270
- case "articulosSucursalesFisicas": {
271
- const IdSucursalFisica = this.getNodeParameter("IdSucursalFisica", 0);
272
- const queryParams = {
273
- idsSucursalesFisicas: IdSucursalFisica,
274
- };
275
- if (!IdSucursalFisica) {
276
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la sucursal fisica es obligatorio");
277
- }
278
- try {
279
- const dataArticulosExistencias = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosSucursalesFisicas`, {
280
- headers,
281
- queryParams,
282
- });
283
- return [this.helpers.returnJsonArray(dataArticulosExistencias.Items)];
284
- }
285
- catch (error) {
286
- console.log(error);
287
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
288
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
289
- }
290
- }
291
- case "articuloSucursalFisica": {
292
- const IdSucursalFisica = this.getNodeParameter("idSucursalFisica", 0);
293
- const idArticulo = this.getNodeParameter("articleId", 0);
294
- const codigo = this.getNodeParameter("codigoArticulo", 0);
295
- const nombre = this.getNodeParameter("nombreArticulo", 0);
296
- const queryParams = {
297
- IdSucursalFisica: IdSucursalFisica,
298
- codigoExacto: codigo,
299
- idsArticulos: idArticulo,
300
- nombre
301
- };
302
- if (!IdSucursalFisica || (!idArticulo && !codigo && !nombre)) {
303
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la sucursal fisica y el id del articulo o el codigo son obligatorios");
263
+ case "consultarSaldoCliente": {
264
+ const clientIdParam = this.getNodeParameter("clienteId", 0);
265
+ const desdeSaldoFecha = this.getNodeParameter("priceDateModified", 0);
266
+ const soloFecha = String(desdeSaldoFecha).split("T")[0];
267
+ const clientId = Number(clientIdParam);
268
+ if (isNaN(clientId) || clientId <= 0) {
269
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
304
270
  }
305
271
  try {
306
- const dataArticulosExistencias = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosSucursalesFisicas`, {
272
+ let url = `${centumUrl}/SaldosCuentasCorrientes/${clientId}`;
273
+ if (soloFecha) {
274
+ url += `?fechaVencimientoHasta=${soloFecha}`;
275
+ }
276
+ const response = await (0, functions_1.apiRequest)(url, {
277
+ method: "GET",
307
278
  headers,
308
- queryParams,
309
279
  });
310
- return [this.helpers.returnJsonArray(dataArticulosExistencias.Items)];
280
+ return [this.helpers.returnJsonArray(response)];
311
281
  }
312
282
  catch (error) {
313
- console.log(error);
314
283
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
315
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
284
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo saldo para cliente ${clientId}: ${errorMessage}`);
316
285
  }
317
286
  }
318
- case 'buscarArticulo': {
319
- const nombreArticulo = this.getNodeParameter('nombreArticulo', 0, '');
320
- const codigoArticulo = this.getNodeParameter('codigoArticulo', 0, '');
287
+ case "consultarStock": {
288
+ const branchOfficeIds = String(this.getNodeParameter("branchOfficeIds", 0));
321
289
  try {
322
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/DatosGenerales`, {
323
- method: 'POST',
290
+ const dataArticulosExistencia = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosExistencias`, {
324
291
  headers,
325
- body: { Nombre: nombreArticulo, Codigo: codigoArticulo },
326
- });
327
- return [this.helpers.returnJsonArray(response)];
328
- }
329
- catch (error) {
330
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Hubo un error al buscar el articulo. Error: ${error}`);
331
- }
332
- }
333
- case "buscarContribuyente": {
334
- const cuit = this.getNodeParameter("cuit", 0, "");
335
- const razonSocial = this.getNodeParameter("razonSocial", 0, "");
336
- if (!cuit && !razonSocial) {
337
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar al menos CUIT o Razón Social para buscar contribuyentes.");
338
- }
339
- let url = `${centumUrl}/Clientes/BuscarContribuyente`;
340
- const queryParams = {};
341
- if (cuit && !razonSocial) {
342
- url += `/${cuit}`;
343
- }
344
- else {
345
- if (cuit)
346
- queryParams.Cuit = cuit;
347
- if (razonSocial)
348
- queryParams.razonSocial = razonSocial;
349
- }
350
- const requestDetails = {
351
- url,
352
- headers,
353
- queryParams,
354
- };
355
- try {
356
- console.log(`[BuscarContribuyente] Request:`, JSON.stringify(requestDetails, null, 2));
357
- const response = await (0, functions_1.apiRequest)(requestDetails.url, {
358
- method: "GET",
359
- headers: requestDetails.headers,
360
- queryParams: requestDetails.queryParams,
292
+ queryParams: {
293
+ idsSucursalesFisicas: branchOfficeIds,
294
+ },
361
295
  });
362
- console.log(`[BuscarContribuyente] Response:`, JSON.stringify(response, null, 2));
363
- if (response.CantidadTotalItems === 1) {
364
- return [this.helpers.returnJsonArray(response.Items)];
365
- }
366
- return [this.helpers.returnJsonArray(response)];
296
+ return [this.helpers.returnJsonArray(dataArticulosExistencia.Items)];
367
297
  }
368
298
  catch (error) {
369
- console.log(`[BuscarContribuyente] Error:`, error);
299
+ console.log("ArticulosExistencias error: ", error);
370
300
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
371
301
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
372
302
  }
373
303
  }
374
- case "categoriasObtener": {
375
- const subRubro = this.getNodeParameter('idsSubRubros', 0);
376
- let url = `${centumUrl}/CategoriasArticulo`;
377
- if (subRubro) {
378
- url = `${url}?idSubRubro=${subRubro}`;
379
- }
380
- try {
381
- const response = await (0, functions_1.apiRequest)(url);
382
- return [this.helpers.returnJsonArray(response)];
383
- }
384
- catch (error) {
385
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Hubo un error al obtener el listado de categorias. Error: ${error}`);
386
- }
304
+ case "convertirProductosParaWooCommerce": {
305
+ const data = this.getInputData();
306
+ const json = (0, functions_1.createJsonProducts)(data);
307
+ return [this.helpers.returnJsonArray(json)];
387
308
  }
388
- case "clienteNuevo": {
309
+ case "crearCliente": {
389
310
  const datosCliente = this.getNodeParameter("cuerpoHTTP", 0);
390
311
  const clienteDNI = this.getNodeParameter("dni", 0);
391
312
  const datosJSON = (0, functions_1.createCustomerJson)(datosCliente, clienteDNI);
@@ -406,137 +327,250 @@ class Centum {
406
327
  return [this.helpers.returnJsonArray(obj)];
407
328
  }
408
329
  }
409
- case "clientes": {
330
+ case "crearCompra": {
331
+ const nombreTipoComprobante = this.getNodeParameter("nombreTipoComprobante", 0, "");
332
+ const codigoComprobante = this.getNodeParameter("codigoComprobante", 0, "");
333
+ const idTipoComprobante = this.getNodeParameter("idTipoComprobante", 0);
334
+ const numeroDocumento = this.getNodeParameter("numeroFactura", 0);
335
+ const puntoVenta = this.getNodeParameter("puntoDeVenta", 0);
336
+ const letraDocumento = this.getNodeParameter("letraDocumento", 0, "");
337
+ const fechaDocumento = this.getNodeParameter("fechaFactura", 0, "");
338
+ const sucursalFisica = this.getNodeParameter("idSucursalFisica", 0);
339
+ const articulosArray = this.getNodeParameter("articlesCollection", 0);
340
+ const idCliente = this.getNodeParameter("clienteId", 0);
341
+ const idProveedor = this.getNodeParameter("idProveedor", 0);
342
+ const fechaProducto = this.getNodeParameter("startDate", 0);
343
+ const separarFecha = String(fechaProducto).split("T")[0];
344
+ const ids = articulosArray.map((a) => a.ID);
345
+ const qtyById = Object.fromEntries(articulosArray.map((a) => [a.ID, a.Cantidad]));
346
+ let bodyProveedor;
347
+ const bodyCompraArticulos = {
348
+ IdCliente: idCliente,
349
+ FechaDocumento: separarFecha,
350
+ Ids: ids,
351
+ };
410
352
  try {
411
- const ajustesHTTP = functions_1.getHttpSettings.call(this);
412
- const clientesURL = `${centumUrl}/Clientes`;
413
- const fetchOptions = {
353
+ const fetchProveedor = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/${idProveedor}`, {
414
354
  method: "GET",
415
- pagination: ajustesHTTP.pagination,
416
- cantidadItemsPorPagina: ajustesHTTP.cantidadItemsPorPagina,
417
- intervaloPagina: ajustesHTTP.intervaloPagina,
418
- itemsField: "Items",
419
- context: this,
420
355
  headers,
421
- };
422
- let clientes = [];
423
- const paginated = await (0, functions_1.apiGetRequest)(clientesURL, fetchOptions);
424
- clientes = paginated;
425
- return [this.helpers.returnJsonArray(clientes)];
356
+ });
357
+ bodyProveedor = fetchProveedor;
426
358
  }
427
359
  catch (error) {
428
360
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
429
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
361
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo el proveedor.\n ${errorMessage}`);
430
362
  }
431
- }
432
- case "clientesActualizar": {
433
- const nuevosDatos = this.getNodeParameter("cuerpoHTTP", 0);
363
+ let articulosVenta;
434
364
  try {
435
- const updateCustomer = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes/Actualizar`, {
365
+ articulosVenta = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
436
366
  method: "POST",
437
- body: nuevosDatos,
438
- headers,
439
- });
440
- return [this.helpers.returnJsonArray(updateCustomer)];
441
- }
442
- catch (error) {
443
- console.log(error);
444
- return [this.helpers.returnJsonArray([])];
445
- }
446
- }
447
- case "clientesBusqueda": {
448
- const codigo = this.getNodeParameter("codigoCliente", 0, "");
449
- const cuit = this.getNodeParameter("cuit", 0, "");
450
- const razonSocial = this.getNodeParameter("razonSocial", 0, "");
451
- if (!codigo && !cuit && !razonSocial) {
452
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar al menos un campo para la búsqueda (CUIT, Codigo o Razón Social).");
453
- }
454
- const queryParams = {};
455
- if (cuit)
456
- queryParams.Cuit = cuit;
457
- if (codigo)
458
- queryParams.codigo = codigo;
459
- if (razonSocial)
460
- queryParams.RazonSocial = razonSocial;
461
- try {
462
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
463
- method: "GET",
367
+ body: bodyCompraArticulos,
464
368
  headers,
465
- queryParams,
466
369
  });
467
- console.log(response);
468
- return [this.helpers.returnJsonArray(response.Items)];
469
370
  }
470
371
  catch (error) {
471
- console.log(`[ClientesBusqueda] Error:`, error);
472
372
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
473
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
474
- }
475
- }
476
- case "clientesBusquedaPorCuit": {
477
- const cuit = this.getNodeParameter("cuit", 0, "");
478
- if (!cuit) {
479
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debe proporcionar CUIT para buscar clientes.");
480
- }
481
- const queryParams = { Cuit: cuit };
482
- try {
483
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
484
- method: "GET",
485
- headers,
486
- queryParams,
487
- });
488
- return [this.helpers.returnJsonArray(response.Items)];
373
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error al obtener la informacion de los articulos ${errorMessage}`);
489
374
  }
490
- catch (error) {
491
- console.log(`[ClientesBusquedaPorCuit] Error:`, error);
375
+ const ventaObj = typeof articulosVenta === "string" ? JSON.parse(articulosVenta) : articulosVenta;
376
+ const itemsRespuesta = ventaObj?.Articulos?.Items ?? ventaObj?.CompraArticulos ?? ventaObj?.Items ?? [];
377
+ const compraConCantidad = itemsRespuesta.map((art) => ({
378
+ ...art,
379
+ Cantidad: qtyById[String(art.IdArticulo)] ?? 0,
380
+ }));
381
+ const finalBody = {
382
+ TipoComprobanteCompra: {
383
+ IdTipoComprobanteCompra: idTipoComprobante,
384
+ Codigo: codigoComprobante,
385
+ Nombre: nombreTipoComprobante,
386
+ },
387
+ SucursalFisica: {
388
+ IdSucursalFisica: sucursalFisica,
389
+ },
390
+ NumeroDocumento: {
391
+ LetraDocumento: letraDocumento,
392
+ PuntoVenta: puntoVenta,
393
+ Numero: numeroDocumento,
394
+ },
395
+ FechaDocumento: fechaDocumento,
396
+ Proveedor: bodyProveedor,
397
+ CompraArticulos: compraConCantidad,
398
+ };
399
+ try {
400
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Compras`, {
401
+ method: "POST",
402
+ headers,
403
+ body: finalBody,
404
+ });
405
+ return [this.helpers.returnJsonArray(response)];
406
+ }
407
+ catch (error) {
492
408
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
493
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
409
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la compra.\n ${errorMessage}`);
494
410
  }
495
411
  }
496
- case "cobros": {
497
- const ordenCliente = this.getNodeParameter("cliente", 0);
498
- const ordenArticulo = this.getNodeParameter("articulo", 0);
499
- const ordenEnvio = this.getNodeParameter("envio", 0);
500
- const bodyCharge = (0, functions_1.createChargeJson)(ordenCliente, ordenArticulo, ordenEnvio);
412
+ case "crearContribuyente": {
413
+ const bodyJson = this.getNodeParameter("cuerpoHTTP", 0);
414
+ const cuit = this.getNodeParameter("cuit", 0);
415
+ console.log(bodyJson);
416
+ if (typeof cuit !== "string" || !/^\d{11}$/.test(cuit)) {
417
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El CUIT debe ser una cadena de 11 dígitos numéricos.");
418
+ }
419
+ const contribuyenteJSON = (0, functions_1.createContribuyenteJson)(bodyJson, cuit);
501
420
  try {
502
- const dataCobros = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros`, {
421
+ const crearCliente = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
503
422
  method: "POST",
504
- body: bodyCharge,
423
+ body: contribuyenteJSON,
505
424
  headers,
506
425
  });
507
- return [this.helpers.returnJsonArray(dataCobros)];
426
+ console.log("Contribuyente creado:", crearCliente);
427
+ return [this.helpers.returnJsonArray([crearCliente])];
508
428
  }
509
429
  catch (error) {
510
- console.log(error);
511
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
512
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
430
+ console.error("Error al crear contribuyente:", error);
431
+ const statusCode = error?.response?.status;
432
+ const responseData = error?.response?.data;
433
+ const errorMessage = responseData?.Message || responseData?.message || error?.message || "Error desconocido al crear el contribuyente.";
434
+ const fullMessage = statusCode ? `Error ${statusCode}: ${errorMessage}` : errorMessage;
435
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), fullMessage, {
436
+ description: responseData?.Detail || "Ocurrió un error inesperado al llamar a la API de Centum.",
437
+ });
513
438
  }
514
439
  }
515
- case "composicionSaldoCliente": {
516
- const clientIdParam = this.getNodeParameter("clienteId", 0);
517
- const desdeSaldoFecha = this.getNodeParameter("priceDateModified", 0);
518
- const separarFecha = String(desdeSaldoFecha).split("T")[0];
519
- const clientId = Number(clientIdParam);
520
- if (isNaN(clientId) || clientId <= 0) {
521
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
522
- }
440
+ case "crearOrdenCompra": {
523
441
  try {
524
- let url = `${centumUrl}/SaldosCuentasCorrientes/Composicion/${clientId}`;
525
- if (separarFecha) {
526
- url += `?fechaVencimientoHasta=${separarFecha}`;
527
- }
528
- const response = await (0, functions_1.apiRequest)(url, {
529
- method: "GET",
442
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/OrdenesCompra`, {
443
+ method: "POST",
530
444
  headers,
445
+ body: {
446
+ "SucursalFisica": {
447
+ "IdSucursalFisica": 6084
448
+ },
449
+ "NumeroDocumento": {
450
+ "LetraDocumento": "O",
451
+ "PuntoVenta": 1,
452
+ "Numero": 6
453
+ },
454
+ "FechaDocumento": "2025-11-07T00:00:00",
455
+ "FechaEntrega": "2026-06-02T00:00:00",
456
+ "Proveedor": {
457
+ "IdProveedor": 6283,
458
+ "Codigo": "006283",
459
+ "RazonSocial": "Proveedores Río 240 EIRL",
460
+ "CUIT": "27260404100",
461
+ "Direccion": null,
462
+ "Localidad": "CONCEPCION ARENAL 7350",
463
+ "CodigoPostal": "7600",
464
+ "Provincia": {
465
+ "IdProvincia": 4876,
466
+ "Codigo": "BSAS",
467
+ "Nombre": "Buenos Aires"
468
+ },
469
+ "Pais": {
470
+ "IdPais": 4657,
471
+ "Codigo": "ARG",
472
+ "Nombre": "Argentina"
473
+ },
474
+ "Telefono": "541166778899",
475
+ "TelefonoAlternativo": "541166778899",
476
+ "Fax": null,
477
+ "Interno": null,
478
+ "Email": "matjul.mdq@hotmail.com",
479
+ "OperadorCompra": {
480
+ "IdOperadorCompra": 1,
481
+ "Codigo": "Operador de Compras Defecto",
482
+ "Nombre": "Operador de Compras Defecto",
483
+ "EsSupervisor": true
484
+ },
485
+ "CondicionIVA": {
486
+ "IdCondicionIVA": 1895,
487
+ "Codigo": "RI",
488
+ "Nombre": "Responsable Inscripto"
489
+ },
490
+ "CondicionIIBB": {
491
+ "IdCondicionIIBB": 6051,
492
+ "Codigo": "Responsable Inscript"
493
+ },
494
+ "NumeroIIBB": "30716828820",
495
+ "FormaPagoProveedor": {
496
+ "IdFormaPagoProveedor": 6091,
497
+ "Nombre": "Efectivo"
498
+ },
499
+ "DiasMorosidad": null,
500
+ "DiasIncobrables": null,
501
+ "CondicionPago": {
502
+ "IdCondicionPago": 4,
503
+ "Codigo": "CC1",
504
+ "Nombre": "7 Dias"
505
+ },
506
+ "CategoriaImpuestoGanancias": {
507
+ "IdCategoriaImpuestoGanancia": 6065,
508
+ "Nombre": "Exento"
509
+ },
510
+ "CategoriaRetencionIVA": null,
511
+ "CategoriaRetencionSUSS": null,
512
+ "ClaseProveedor": {
513
+ "IdClaseProveedor": 8609,
514
+ "Codigo": "02",
515
+ "Nombre": "DISTRIBUIDOR"
516
+ },
517
+ "Zona": {
518
+ "IdZona": 6095,
519
+ "Codigo": "Zona Defecto",
520
+ "Nombre": "Zona Defecto",
521
+ "Activo": true,
522
+ "EntregaLunes": false,
523
+ "EntregaMartes": false,
524
+ "EntregaMiercoles": false,
525
+ "EntregaJueves": false,
526
+ "EntregaViernes": false,
527
+ "EntregaSabado": false,
528
+ "EntregaDomingo": false,
529
+ "DemoraEnHorasFechaEntrega": 24,
530
+ "CostoEntrega": 10000
531
+ },
532
+ "DescuentoProveedor": null,
533
+ "DiasEntrega": 0,
534
+ "Activo": true
535
+ },
536
+ "PorcentajeDescuento": 0.000000,
537
+ "Observaciones": "",
538
+ "OrdenCompraArticulos": [
539
+ {
540
+ "IdArticulo": 2757,
541
+ "Codigo": "00002757",
542
+ "Nombre": "GALL MARYSOL MARINERAS 300gr",
543
+ "Cantidad": 1.000,
544
+ "SegundoControlStock": 0.000,
545
+ "Precio": 7.0,
546
+ "PorcentajeDescuento1": 0.000,
547
+ "PorcentajeDescuento2": 0.000,
548
+ "PorcentajeDescuento3": 0.000,
549
+ "DescuentoCalculado": 0.000000,
550
+ "CategoriaImpuestoIVA": {
551
+ "IdCategoriaImpuestoIVA": 4,
552
+ "Codigo": "5",
553
+ "Nombre": "IVA 21.00",
554
+ "Tasa": 21.000
555
+ },
556
+ "ImpuestoInterno": 0.000,
557
+ "Observaciones": ""
558
+ }
559
+ ],
560
+ "FechaVencimiento": "2029-11-07T00:00:00",
561
+ "OperadorCompra": {
562
+ "IdOperadorCompra": 1,
563
+ "Codigo": "1",
564
+ "Nombre": "Operador de Compras Defecto",
565
+ "EsSupervisor": false
566
+ },
567
+ }
531
568
  });
532
- if (!response || typeof response !== "object") {
533
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
534
- }
535
569
  return [this.helpers.returnJsonArray(response)];
536
570
  }
537
571
  catch (error) {
538
572
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
539
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo composición de saldo para cliente ${clientId}: ${errorMessage}`);
573
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la compra.\n ${errorMessage}`);
540
574
  }
541
575
  }
542
576
  case "crearPedidoVenta": {
@@ -676,261 +710,71 @@ class Centum {
676
710
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
677
711
  }
678
712
  }
679
- case "departamentosLista": {
680
- const idProvincia = this.getNodeParameter("idProvincia", 0, "");
681
- try {
682
- const queryParams = {};
683
- if (idProvincia) {
684
- queryParams.idProvincia = idProvincia;
685
- }
686
- const departamentos = await (0, functions_1.apiRequest)(`${centumUrl}/Departamentos`, {
687
- method: "GET",
688
- headers,
689
- queryParams,
690
- });
691
- return [this.helpers.returnJsonArray(departamentos.map((d) => ({ ...d })))];
692
- }
693
- catch (error) {
694
- console.log(error);
695
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
696
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
697
- }
698
- }
699
- case "generarProductosWoo": {
700
- const data = this.getInputData();
701
- const json = (0, functions_1.createJsonProducts)(data);
702
- return [this.helpers.returnJsonArray(json)];
703
- }
704
- case "generarCompras": {
705
- const nombreTipoComprobante = this.getNodeParameter("nombreTipoComprobante", 0, "");
706
- const codigoComprobante = this.getNodeParameter("codigoComprobante", 0, "");
707
- const idTipoComprobante = this.getNodeParameter("idTipoComprobante", 0);
708
- const numeroDocumento = this.getNodeParameter("numeroFactura", 0);
709
- const puntoVenta = this.getNodeParameter("puntoDeVenta", 0);
710
- const letraDocumento = this.getNodeParameter("letraDocumento", 0, "");
711
- const fechaDocumento = this.getNodeParameter("fechaFactura", 0, "");
712
- const sucursalFisica = this.getNodeParameter("idSucursalFisica", 0);
713
- const articulosArray = this.getNodeParameter("articlesCollection", 0);
714
- const idCliente = this.getNodeParameter("clienteId", 0);
715
- const idProveedor = this.getNodeParameter("idProveedor", 0);
716
- const fechaProducto = this.getNodeParameter("startDate", 0);
717
- const separarFecha = String(fechaProducto).split("T")[0];
718
- const ids = articulosArray.map((a) => a.ID);
719
- const qtyById = Object.fromEntries(articulosArray.map((a) => [a.ID, a.Cantidad]));
720
- let bodyProveedor;
721
- const bodyCompraArticulos = {
722
- IdCliente: idCliente,
723
- FechaDocumento: separarFecha,
724
- Ids: ids,
725
- };
726
- try {
727
- const fetchProveedor = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/${idProveedor}`, {
728
- method: "GET",
729
- headers,
730
- });
731
- bodyProveedor = fetchProveedor;
732
- }
733
- catch (error) {
734
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
735
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo el proveedor.\n ${errorMessage}`);
736
- }
737
- let articulosVenta;
738
- try {
739
- articulosVenta = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
740
- method: "POST",
741
- body: bodyCompraArticulos,
742
- headers,
743
- });
744
- }
745
- catch (error) {
746
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
747
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error al obtener la informacion de los articulos ${errorMessage}`);
748
- }
749
- const ventaObj = typeof articulosVenta === "string" ? JSON.parse(articulosVenta) : articulosVenta;
750
- const itemsRespuesta = ventaObj?.Articulos?.Items ?? ventaObj?.CompraArticulos ?? ventaObj?.Items ?? [];
751
- const compraConCantidad = itemsRespuesta.map((art) => ({
752
- ...art,
753
- Cantidad: qtyById[String(art.IdArticulo)] ?? 0,
754
- }));
755
- const finalBody = {
756
- TipoComprobanteCompra: {
757
- IdTipoComprobanteCompra: idTipoComprobante,
758
- Codigo: codigoComprobante,
759
- Nombre: nombreTipoComprobante,
713
+ case 'crearProveedor': {
714
+ const codigo = this.getNodeParameter('codigoArticulo', 0, '');
715
+ const razonSocial = this.getNodeParameter('razonSocial', 0, '');
716
+ const cuit = this.getNodeParameter('cuit', 0);
717
+ const provincia = this.getNodeParameter('idProvincia', 0);
718
+ const pais = this.getNodeParameter('idPais', 0);
719
+ const condicionIVA = this.getNodeParameter('condicionIVA', 0, '');
720
+ const formaPagoProveedor = this.getNodeParameter('formaPagoProveedor', 0);
721
+ const condicionPago = this.getNodeParameter('condicionDePago', 0);
722
+ const categoriaImpuestoGanancias = this.getNodeParameter('categoriaImpuestosGanancias', 0);
723
+ const claseProveedor = this.getNodeParameter('claseProveedor', 0);
724
+ const activo = this.getNodeParameter('active', 0);
725
+ const idOperadorCompra = this.getNodeParameter('idOperadorCompra', 0);
726
+ const idZona = this.getNodeParameter('idZona', 0);
727
+ const idDescuentoProveedor = this.getNodeParameter('idDescuentoProveedor', 0);
728
+ const body = {
729
+ Codigo: codigo,
730
+ RazonSocial: razonSocial,
731
+ CUIT: cuit,
732
+ Provincia: {
733
+ IdProvincia: provincia
760
734
  },
761
- SucursalFisica: {
762
- IdSucursalFisica: sucursalFisica,
735
+ Pais: {
736
+ IdPais: pais
763
737
  },
764
- NumeroDocumento: {
765
- LetraDocumento: letraDocumento,
766
- PuntoVenta: puntoVenta,
767
- Numero: numeroDocumento,
738
+ CondicionIVA: {
739
+ IdCondicionIVA: condicionIVA
768
740
  },
769
- FechaDocumento: fechaDocumento,
770
- Proveedor: bodyProveedor,
771
- CompraArticulos: compraConCantidad,
741
+ FormaPagoProveedor: {
742
+ IdFormaPagoProveedor: formaPagoProveedor
743
+ },
744
+ CondicionPago: {
745
+ IdCondicionPago: condicionPago
746
+ },
747
+ CategoriaImpuestoGanancias: {
748
+ IdCategoriaImpuestoGanancia: categoriaImpuestoGanancias
749
+ },
750
+ ClaseProveedor: {
751
+ IdClaseProveedor: claseProveedor
752
+ },
753
+ OperadorCompra: {
754
+ IdOperadorCompra: idOperadorCompra
755
+ },
756
+ Activo: activo,
757
+ Zona: {
758
+ IdZona: idZona
759
+ },
760
+ DescuentoProveedor: {
761
+ IdDescuentoProveedor: idDescuentoProveedor
762
+ }
772
763
  };
773
764
  try {
774
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Compras`, {
775
- method: "POST",
776
- headers,
777
- body: finalBody,
778
- });
779
- return [this.helpers.returnJsonArray(response)];
780
- }
781
- catch (error) {
782
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
783
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la compra.\n ${errorMessage}`);
784
- }
785
- }
786
- case "generarOrdenCompra": {
787
- try {
788
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/OrdenesCompra`, {
789
- method: "POST",
765
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/`, {
766
+ method: 'POST',
790
767
  headers,
791
- body: {
792
- "SucursalFisica": {
793
- "IdSucursalFisica": 6084
794
- },
795
- "NumeroDocumento": {
796
- "LetraDocumento": "O",
797
- "PuntoVenta": 1,
798
- "Numero": 6
799
- },
800
- "FechaDocumento": "2025-11-07T00:00:00",
801
- "FechaEntrega": "2026-06-02T00:00:00",
802
- "Proveedor": {
803
- "IdProveedor": 6283,
804
- "Codigo": "006283",
805
- "RazonSocial": "Proveedores Río 240 EIRL",
806
- "CUIT": "27260404100",
807
- "Direccion": null,
808
- "Localidad": "CONCEPCION ARENAL 7350",
809
- "CodigoPostal": "7600",
810
- "Provincia": {
811
- "IdProvincia": 4876,
812
- "Codigo": "BSAS",
813
- "Nombre": "Buenos Aires"
814
- },
815
- "Pais": {
816
- "IdPais": 4657,
817
- "Codigo": "ARG",
818
- "Nombre": "Argentina"
819
- },
820
- "Telefono": "541166778899",
821
- "TelefonoAlternativo": "541166778899",
822
- "Fax": null,
823
- "Interno": null,
824
- "Email": "matjul.mdq@hotmail.com",
825
- "OperadorCompra": {
826
- "IdOperadorCompra": 1,
827
- "Codigo": "Operador de Compras Defecto",
828
- "Nombre": "Operador de Compras Defecto",
829
- "EsSupervisor": true
830
- },
831
- "CondicionIVA": {
832
- "IdCondicionIVA": 1895,
833
- "Codigo": "RI",
834
- "Nombre": "Responsable Inscripto"
835
- },
836
- "CondicionIIBB": {
837
- "IdCondicionIIBB": 6051,
838
- "Codigo": "Responsable Inscript"
839
- },
840
- "NumeroIIBB": "30716828820",
841
- "FormaPagoProveedor": {
842
- "IdFormaPagoProveedor": 6091,
843
- "Nombre": "Efectivo"
844
- },
845
- "DiasMorosidad": null,
846
- "DiasIncobrables": null,
847
- "CondicionPago": {
848
- "IdCondicionPago": 4,
849
- "Codigo": "CC1",
850
- "Nombre": "7 Dias"
851
- },
852
- "CategoriaImpuestoGanancias": {
853
- "IdCategoriaImpuestoGanancia": 6065,
854
- "Nombre": "Exento"
855
- },
856
- "CategoriaRetencionIVA": null,
857
- "CategoriaRetencionSUSS": null,
858
- "ClaseProveedor": {
859
- "IdClaseProveedor": 8609,
860
- "Codigo": "02",
861
- "Nombre": "DISTRIBUIDOR"
862
- },
863
- "Zona": {
864
- "IdZona": 6095,
865
- "Codigo": "Zona Defecto",
866
- "Nombre": "Zona Defecto",
867
- "Activo": true,
868
- "EntregaLunes": false,
869
- "EntregaMartes": false,
870
- "EntregaMiercoles": false,
871
- "EntregaJueves": false,
872
- "EntregaViernes": false,
873
- "EntregaSabado": false,
874
- "EntregaDomingo": false,
875
- "DemoraEnHorasFechaEntrega": 24,
876
- "CostoEntrega": 10000
877
- },
878
- "DescuentoProveedor": null,
879
- "DiasEntrega": 0,
880
- "Activo": true
881
- },
882
- "PorcentajeDescuento": 0.000000,
883
- "Observaciones": "",
884
- "OrdenCompraArticulos": [
885
- {
886
- "IdArticulo": 2757,
887
- "Codigo": "00002757",
888
- "Nombre": "GALL MARYSOL MARINERAS 300gr",
889
- "Cantidad": 1.000,
890
- "SegundoControlStock": 0.000,
891
- "Precio": 7.0,
892
- "PorcentajeDescuento1": 0.000,
893
- "PorcentajeDescuento2": 0.000,
894
- "PorcentajeDescuento3": 0.000,
895
- "DescuentoCalculado": 0.000000,
896
- "CategoriaImpuestoIVA": {
897
- "IdCategoriaImpuestoIVA": 4,
898
- "Codigo": "5",
899
- "Nombre": "IVA 21.00",
900
- "Tasa": 21.000
901
- },
902
- "ImpuestoInterno": 0.000,
903
- "Observaciones": ""
904
- }
905
- ],
906
- "FechaVencimiento": "2029-11-07T00:00:00",
907
- "OperadorCompra": {
908
- "IdOperadorCompra": 1,
909
- "Codigo": "1",
910
- "Nombre": "Operador de Compras Defecto",
911
- "EsSupervisor": false
912
- },
913
- }
768
+ body
914
769
  });
915
770
  return [this.helpers.returnJsonArray(response)];
916
771
  }
917
772
  catch (error) {
918
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
919
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la compra.\n ${errorMessage}`);
920
- }
921
- }
922
- case "generarToken": {
923
- try {
924
- const tokenGenerado = (0, functions_1.createHash)(headers.publicAccessKey);
925
- return [this.helpers.returnJsonArray(tokenGenerado)];
926
- }
927
- catch (error) {
928
- console.log(error);
929
773
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
930
774
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
931
775
  }
932
776
  }
933
- case "generarVentas": {
777
+ case "crearVenta": {
934
778
  const numeroPuntoDeVenta = this.getNodeParameter("puntoDeVenta", 0);
935
779
  const bonificacion = this.getNodeParameter("bonificacion", 0, "");
936
780
  const esContado = this.getNodeParameter("esContado", 0);
@@ -1032,30 +876,412 @@ class Centum {
1032
876
  const response = await (0, functions_1.apiRequest)(url, {
1033
877
  method: "POST",
1034
878
  headers,
1035
- body: bodyVenta,
879
+ body: bodyVenta,
880
+ });
881
+ return [this.helpers.returnJsonArray(response)];
882
+ }
883
+ catch (error) {
884
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
885
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la venta.\n${errorMessage}`);
886
+ }
887
+ }
888
+ case "descargarImagenesProductos": {
889
+ const arrResult = [];
890
+ const inputData = this.getInputData();
891
+ const requestUrl = `${centumUrl}/ArticulosImagenes`;
892
+ for (let i = 0; i < inputData.length; i++) {
893
+ const element = inputData[i];
894
+ const dataObj = {
895
+ idArticulo: element.json.IdArticulo,
896
+ images: [],
897
+ infoImages: [],
898
+ };
899
+ const allArticleImages = await (0, functions_1.centumGetArticleImages)(1, element.json.IdArticulo, {
900
+ consumerApiPublicId,
901
+ publicAccessKey: String(centumApiCredentials.publicAccessKey),
902
+ }, requestUrl);
903
+ if (allArticleImages instanceof Error) {
904
+ console.error(`Failed to download images for article ${element.json.IdArticulo}`, allArticleImages);
905
+ continue;
906
+ }
907
+ if (allArticleImages.length > 0) {
908
+ for (let j = 0; j < allArticleImages.length; j++) {
909
+ const binary = {};
910
+ const dataImage = allArticleImages[j];
911
+ const buffer = Buffer.from(dataImage.buffer);
912
+ binary["data"] = await this.helpers.prepareBinaryData(buffer);
913
+ binary.data.fileName = `${element.json.Codigo}_${j + 1}.${binary.data.fileExtension}`;
914
+ dataObj.images.push(binary);
915
+ dataObj.infoImages.push({
916
+ lastModified: dataImage.lastModified,
917
+ orderNumber: dataImage.orderNumber,
918
+ });
919
+ const existObj = arrResult.find((obj) => obj.idArticulo === element.json.IdArticulo);
920
+ if (!existObj) {
921
+ arrResult.push(dataObj);
922
+ }
923
+ }
924
+ }
925
+ else {
926
+ dataObj.images = null;
927
+ arrResult.push(dataObj);
928
+ }
929
+ }
930
+ return [this.helpers.returnJsonArray(arrResult)];
931
+ }
932
+ case "estadisticaVentaRanking": {
933
+ const fechaDesdeString = this.getNodeParameter('startDate', 0);
934
+ const fechaHastaString = this.getNodeParameter('endDate', 0);
935
+ const tipoDeRanking = this.getNodeParameter('tipoDeRanking', 0);
936
+ const orderByRanking = this.getNodeParameter('ventaRankingOrderBy', 0);
937
+ const orderAsc = this.getNodeParameter('orderAsc', 0);
938
+ const cantItems = this.getNodeParameter('cantidadDeItems', 0);
939
+ const fechaDesde = String(fechaDesdeString).split("T")[0];
940
+ const fechaHasta = String(fechaHastaString).split("T")[0];
941
+ let url = `${centumUrl}/EstadisticaVentaRanking/${cantItems}`;
942
+ if (fechaDesde && fechaHasta) {
943
+ url += `?fechaDocumentoDesde=${fechaDesde}&fechaDocumentoHasta=${fechaHasta}`;
944
+ }
945
+ else {
946
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Ambos periodos de fecha son necesarios.');
947
+ }
948
+ if (tipoDeRanking) {
949
+ if (tipoDeRanking === 'esRankingClientes') {
950
+ url += `&${tipoDeRanking}=true`;
951
+ }
952
+ if (tipoDeRanking === 'esRankingArticulos') {
953
+ url += `&${tipoDeRanking}=true`;
954
+ }
955
+ if (tipoDeRanking === 'esRankingVendedores') {
956
+ url += `&${tipoDeRanking}=true`;
957
+ }
958
+ }
959
+ if (orderByRanking) {
960
+ if (orderByRanking === 'CantidadUnidadNivel0') {
961
+ url += `&tipoOrdenEstadisticaVentaRanking=${orderByRanking}`;
962
+ }
963
+ if (orderByRanking === 'CantidadUnidadNivel1') {
964
+ url += `&tipoOrdenEstadisticaVentaRanking=${orderByRanking}`;
965
+ }
966
+ if (orderByRanking === 'CantidadUnidadNivel2') {
967
+ url += `&tipoOrdenEstadisticaVentaRanking=${orderByRanking}`;
968
+ }
969
+ if (orderByRanking === 'ImporteTotalNeto') {
970
+ url += `&tipoOrdenEstadisticaVentaRanking=${orderByRanking}`;
971
+ }
972
+ if (orderByRanking === 'ImporteTotalFinal') {
973
+ url += `&tipoOrdenEstadisticaVentaRanking=${orderByRanking}`;
974
+ }
975
+ }
976
+ if (orderAsc !== null) {
977
+ url += `&ordenEstadisticaVentaRankingAscendente=${orderAsc}`;
978
+ }
979
+ try {
980
+ const response = await (0, functions_1.apiRequest)(`${url}`, {
981
+ method: "GET",
982
+ headers,
983
+ });
984
+ return [this.helpers.returnJsonArray(response)];
985
+ }
986
+ catch (error) {
987
+ console.log("Error en solicitud de promociones para el cliente:", error);
988
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
989
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo el listado de precios. \n ${errorMessage}`);
990
+ }
991
+ }
992
+ case "generarTokenSeguridad": {
993
+ try {
994
+ const tokenGenerado = (0, functions_1.createHash)(headers.publicAccessKey);
995
+ return [this.helpers.returnJsonArray(tokenGenerado)];
996
+ }
997
+ catch (error) {
998
+ console.log(error);
999
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1000
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1001
+ }
1002
+ }
1003
+ case 'listarBonificaciones': {
1004
+ try {
1005
+ const bonificaciones = await (0, functions_1.apiRequest)(`${centumUrl}/Bonificaciones`, {
1006
+ method: "GET",
1007
+ headers
1008
+ });
1009
+ return [this.helpers.returnJsonArray([bonificaciones])];
1010
+ }
1011
+ catch (error) {
1012
+ console.error("Error al obtener las bonificaciones:", error);
1013
+ const statusCode = error?.response?.status;
1014
+ const responseData = error?.response?.data;
1015
+ const errorMessage = responseData?.Message || responseData?.message || error?.message || "Error desconocido al crear el contribuyente.";
1016
+ const fullMessage = statusCode ? `Error ${statusCode}: ${errorMessage}` : errorMessage;
1017
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), fullMessage, {
1018
+ description: responseData?.Detail || "Ocurrió un error inesperado al llamar a la API de Centum.",
1019
+ });
1020
+ }
1021
+ }
1022
+ case "listarCategorias": {
1023
+ const subRubro = this.getNodeParameter('idsSubRubros', 0);
1024
+ let url = `${centumUrl}/CategoriasArticulo`;
1025
+ if (subRubro) {
1026
+ url = `${url}?idSubRubro=${subRubro}`;
1027
+ }
1028
+ try {
1029
+ const response = await (0, functions_1.apiRequest)(url);
1030
+ return [this.helpers.returnJsonArray(response)];
1031
+ }
1032
+ catch (error) {
1033
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Hubo un error al obtener el listado de categorias. Error: ${error}`);
1034
+ }
1035
+ }
1036
+ case "listarClientes": {
1037
+ try {
1038
+ const ajustesHTTP = functions_1.getHttpSettings.call(this);
1039
+ const clientesURL = `${centumUrl}/Clientes`;
1040
+ const fetchOptions = {
1041
+ method: "GET",
1042
+ pagination: ajustesHTTP.pagination,
1043
+ cantidadItemsPorPagina: ajustesHTTP.cantidadItemsPorPagina,
1044
+ intervaloPagina: ajustesHTTP.intervaloPagina,
1045
+ itemsField: "Items",
1046
+ context: this,
1047
+ headers,
1048
+ };
1049
+ let clientes = [];
1050
+ const paginated = await (0, functions_1.apiGetRequest)(clientesURL, fetchOptions);
1051
+ clientes = paginated;
1052
+ return [this.helpers.returnJsonArray(clientes)];
1053
+ }
1054
+ catch (error) {
1055
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1056
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1057
+ }
1058
+ }
1059
+ case "listarCobros": {
1060
+ const idCliente = this.getNodeParameter("clienteId", 0);
1061
+ const idCobro = this.getNodeParameter("idCobro", 0);
1062
+ const fechaDesde = this.getNodeParameter("startDate", 0, "");
1063
+ const fechaHasta = this.getNodeParameter("endDate", 0, "");
1064
+ const separarFechaDesde = String(fechaDesde).split("T")[0];
1065
+ const separarFechaHasta = String(fechaHasta).split("T")[0];
1066
+ if (!idCliente && !separarFechaDesde && !separarFechaHasta && !idCobro) {
1067
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1068
+ }
1069
+ const body = {
1070
+ idCliente,
1071
+ fechaDocumentoDesde: separarFechaDesde,
1072
+ fechaDocumentoHasta: separarFechaHasta,
1073
+ idCobro,
1074
+ };
1075
+ try {
1076
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros/FiltrosCobro`, {
1077
+ method: "POST",
1078
+ headers,
1079
+ body,
1080
+ });
1081
+ return [this.helpers.returnJsonArray(response)];
1082
+ }
1083
+ catch (error) {
1084
+ console.log("Error en obtener el listado de cobros:", error);
1085
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1086
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error en obtener el listado de cobros para cliente ${idCliente}: ${errorMessage}`);
1087
+ }
1088
+ }
1089
+ case "listarCompras": {
1090
+ const idCliente = this.getNodeParameter("clienteId", 0);
1091
+ const idCompra = this.getNodeParameter("idCompra", 0);
1092
+ const fechaDesde = this.getNodeParameter("startDate", 0, "");
1093
+ const fechaHasta = this.getNodeParameter("endDate", 0, "");
1094
+ const separarFechaDesde = String(fechaDesde).split("T")[0];
1095
+ const separarFechaHasta = String(fechaHasta).split("T")[0];
1096
+ if (!idCliente && !separarFechaDesde && !separarFechaHasta && !idCompra) {
1097
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1098
+ }
1099
+ const body = {
1100
+ idCliente,
1101
+ fechaDocumentoDesde: separarFechaDesde,
1102
+ fechaDocumentoHasta: separarFechaHasta,
1103
+ idCompra,
1104
+ };
1105
+ try {
1106
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Compras/FiltrosCompra`, {
1107
+ method: "POST",
1108
+ headers,
1109
+ body,
1110
+ });
1111
+ return [this.helpers.returnJsonArray(response)];
1112
+ }
1113
+ catch (error) {
1114
+ console.log("Error en obtener el listado de cobros:", error);
1115
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1116
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error en obtener el listado de cobros para cliente ${idCliente}: ${errorMessage}`);
1117
+ }
1118
+ }
1119
+ case "listarConceptos": {
1120
+ let url = `${centumUrl}/Conceptos`;
1121
+ try {
1122
+ const response = await (0, functions_1.apiRequest)(url, {
1123
+ method: "GET",
1124
+ headers
1125
+ });
1126
+ return [this.helpers.returnJsonArray(response)];
1127
+ }
1128
+ catch (error) {
1129
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Hubo un error al obtener el listado de conceptos. Error: ${error}`);
1130
+ }
1131
+ }
1132
+ case "listarDepartamentos": {
1133
+ const idProvincia = this.getNodeParameter("idProvincia", 0, "");
1134
+ try {
1135
+ const queryParams = {};
1136
+ if (idProvincia) {
1137
+ queryParams.idProvincia = idProvincia;
1138
+ }
1139
+ const departamentos = await (0, functions_1.apiRequest)(`${centumUrl}/Departamentos`, {
1140
+ method: "GET",
1141
+ headers,
1142
+ queryParams,
1143
+ });
1144
+ return [this.helpers.returnJsonArray(departamentos.map((d) => ({ ...d })))];
1145
+ }
1146
+ catch (error) {
1147
+ console.log(error);
1148
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1149
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1150
+ }
1151
+ }
1152
+ case "listarEstadosPedidosVenta": {
1153
+ try {
1154
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/EstadosPedidoVenta?bIncluirTodosEstados=true`, {
1155
+ method: "GET",
1156
+ headers,
1157
+ });
1158
+ return [this.helpers.returnJsonArray(response)];
1159
+ }
1160
+ catch (error) {
1161
+ console.log(error);
1162
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1163
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1164
+ }
1165
+ }
1166
+ case "listarFacturasCobros": {
1167
+ const clientIdParam = this.getNodeParameter("clienteId", 0);
1168
+ const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1169
+ const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1170
+ const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1171
+ const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1172
+ const clientId = Number(clientIdParam);
1173
+ if (isNaN(clientId) || clientId <= 0) {
1174
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1175
+ }
1176
+ if (!desdeSaldoFecha) {
1177
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1178
+ }
1179
+ if (!hastaSaldoFecha) {
1180
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1181
+ }
1182
+ try {
1183
+ const body = {
1184
+ fechaDocumentoDesde: separarFechaDesde,
1185
+ fechaDocumentoHasta: separarFechaHasta,
1186
+ IdCliente: clientId,
1187
+ };
1188
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros/FiltrosCobro`, {
1189
+ method: "POST",
1190
+ headers,
1191
+ body,
1036
1192
  });
1193
+ if (!response || typeof response !== "object") {
1194
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1195
+ }
1037
1196
  return [this.helpers.returnJsonArray(response)];
1038
1197
  }
1039
1198
  catch (error) {
1199
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1040
1200
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1041
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error creando la venta.\n${errorMessage}`);
1201
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo facturas pedidos ventas para cliente ${clientId}: ${errorMessage}`);
1202
+ }
1203
+ }
1204
+ case "listarFacturasVenta": {
1205
+ const idCliente = this.getNodeParameter('clienteId', 0);
1206
+ const idVenta = this.getNodeParameter('ventaId', 0);
1207
+ const idSucursal = this.getNodeParameter('sucursalId', 0);
1208
+ const idDivisionEmpresa = this.getNodeParameter('divisionEmpresaId', 0);
1209
+ const incluirAnulados = this.getNodeParameter('incluirAnulados', 0);
1210
+ const idUsuarioCreador = this.getNodeParameter('usuarioCreadorId', 0);
1211
+ const idTransporte = this.getNodeParameter('transporteId', 0);
1212
+ const idTipoComprobante = this.getNodeParameter('idTipoComprobante', 0);
1213
+ const idClienteCuentaCorriente = this.getNodeParameter('cuentaCorrienteId', 0);
1214
+ const idVendedor = this.getNodeParameter('idVendedor', 0);
1215
+ const idCanalVenta = this.getNodeParameter('canalVentaId', 0);
1216
+ const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1217
+ const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1218
+ if (!desdeSaldoFecha || !hastaSaldoFecha) {
1219
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Las fechas desde y hasta son requeridas");
1042
1220
  }
1221
+ const body = {
1222
+ fechaDocumentoDesde: String(desdeSaldoFecha).split("T")[0],
1223
+ fechaDocumentoHasta: String(hastaSaldoFecha).split("T")[0],
1224
+ };
1225
+ idCliente && (body.idCliente = idCliente);
1226
+ idVenta && (body.idVenta = idVenta);
1227
+ idSucursal && (body.idSucursal = idSucursal);
1228
+ idDivisionEmpresa && (body.idDivisionEmpresa = idDivisionEmpresa);
1229
+ idUsuarioCreador && (body.idUsuarioCreador = idUsuarioCreador);
1230
+ idTransporte && (body.idTransporte = idTransporte);
1231
+ idTipoComprobante && (body.idTipoComprobante = idTipoComprobante);
1232
+ idClienteCuentaCorriente && (body.idClienteCuentaCorriente = idClienteCuentaCorriente);
1233
+ idVendedor && (body.idVendedor = idVendedor);
1234
+ idCanalVenta && (body.idCanalVenta = idCanalVenta);
1235
+ incluirAnulados && (body.incluirAnulados = incluirAnulados);
1236
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Ventas/FiltrosVentaConsulta`, {
1237
+ method: "POST",
1238
+ headers,
1239
+ body,
1240
+ });
1241
+ if (!response || typeof response !== "object") {
1242
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1243
+ }
1244
+ return [this.helpers.returnJsonArray(response)];
1043
1245
  }
1044
- case "listaPrecios": {
1246
+ case "listarFacturasVentasPorCliente": {
1247
+ const clientIdParam = this.getNodeParameter("clienteId", 0);
1248
+ const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1249
+ const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1250
+ const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1251
+ const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1252
+ const clientId = Number(clientIdParam);
1253
+ if (isNaN(clientId) || clientId <= 0) {
1254
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1255
+ }
1256
+ if (!desdeSaldoFecha) {
1257
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1258
+ }
1259
+ if (!hastaSaldoFecha) {
1260
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1261
+ }
1045
1262
  try {
1046
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/ListasPrecios`, {
1047
- method: "GET",
1263
+ const body = {
1264
+ fechaDocumentoDesde: separarFechaDesde,
1265
+ fechaDocumentoHasta: separarFechaHasta,
1266
+ IdCliente: clientId,
1267
+ };
1268
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Ventas/FiltrosVenta`, {
1269
+ method: "POST",
1048
1270
  headers,
1271
+ body,
1049
1272
  });
1273
+ if (!response || typeof response !== "object") {
1274
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1275
+ }
1050
1276
  return [this.helpers.returnJsonArray(response)];
1051
1277
  }
1052
1278
  catch (error) {
1053
- console.log("Error en solicitud de promociones para el cliente:", error);
1279
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1054
1280
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1055
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo el listado de precios. \n ${errorMessage}`);
1281
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo facturas pedidos ventas para cliente ${clientId}: ${errorMessage}`);
1056
1282
  }
1057
1283
  }
1058
- case "marcasObtener": {
1284
+ case "listarMarcas": {
1059
1285
  try {
1060
1286
  const response = await (0, functions_1.apiRequest)(`${centumUrl}/MarcasArticulo`, {
1061
1287
  method: 'GET',
@@ -1069,71 +1295,88 @@ class Centum {
1069
1295
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error en obtener el listado de marcas. \n ${errorMessage}`);
1070
1296
  }
1071
1297
  }
1072
- case "nuevoContribuyente": {
1073
- const bodyJson = this.getNodeParameter("cuerpoHTTP", 0);
1074
- const cuit = this.getNodeParameter("cuit", 0);
1075
- console.log(bodyJson);
1076
- if (typeof cuit !== "string" || !/^\d{11}$/.test(cuit)) {
1077
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El CUIT debe ser una cadena de 11 dígitos numéricos.");
1298
+ case "listarOrdenesCompra": {
1299
+ const idProveedor = this.getNodeParameter("proveedorId", 0);
1300
+ const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1301
+ const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1302
+ const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1303
+ const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1304
+ if (!desdeSaldoFecha) {
1305
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1306
+ }
1307
+ if (!hastaSaldoFecha) {
1308
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1078
1309
  }
1079
- const contribuyenteJSON = (0, functions_1.createContribuyenteJson)(bodyJson, cuit);
1080
1310
  try {
1081
- const crearCliente = await (0, functions_1.apiRequest)(`${centumUrl}/Clientes`, {
1311
+ const body = {
1312
+ fechaDocumentoDesde: separarFechaDesde,
1313
+ fechaDocumentoHasta: separarFechaHasta,
1314
+ idProveedor
1315
+ };
1316
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/OrdenesCompra/FiltrosOrdenCompra`, {
1082
1317
  method: "POST",
1083
- body: contribuyenteJSON,
1084
1318
  headers,
1319
+ body,
1085
1320
  });
1086
- console.log("Contribuyente creado:", crearCliente);
1087
- return [this.helpers.returnJsonArray([crearCliente])];
1321
+ if (!response || typeof response !== "object") {
1322
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1323
+ }
1324
+ return [this.helpers.returnJsonArray(response)];
1088
1325
  }
1089
1326
  catch (error) {
1090
- console.error("Error al crear contribuyente:", error);
1091
- const statusCode = error?.response?.status;
1092
- const responseData = error?.response?.data;
1093
- const errorMessage = responseData?.Message || responseData?.message || error?.message || "Error desconocido al crear el contribuyente.";
1094
- const fullMessage = statusCode ? `Error ${statusCode}: ${errorMessage}` : errorMessage;
1095
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), fullMessage, {
1096
- description: responseData?.Detail || "Ocurrió un error inesperado al llamar a la API de Centum.",
1097
- });
1327
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1328
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1329
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo ordenes de compra del proveedor ${idProveedor}: ${errorMessage}`);
1098
1330
  }
1099
1331
  }
1100
- case 'obtenerBonificaciones': {
1332
+ case "listarPedidosVenta": {
1333
+ const idCliente = this.getNodeParameter("clienteId", 0);
1334
+ const idsEstado = this.getNodeParameter("statusId", 0);
1335
+ const fechaDesde = this.getNodeParameter("startDate", 0, "");
1336
+ const fechaHasta = this.getNodeParameter("endDate", 0, "");
1337
+ const separarFechaDesde = String(fechaDesde).split("T")[0];
1338
+ const separarFechaHasta = String(fechaHasta).split("T")[0];
1339
+ if (!idCliente && !idsEstado && !separarFechaDesde && !separarFechaHasta) {
1340
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1341
+ }
1342
+ const body = {
1343
+ idCliente,
1344
+ fechaDocumentoDesde: separarFechaDesde,
1345
+ fechaDocumentoHasta: separarFechaHasta,
1346
+ idsEstado,
1347
+ };
1101
1348
  try {
1102
- const bonificaciones = await (0, functions_1.apiRequest)(`${centumUrl}/Bonificaciones`, {
1103
- method: "GET",
1104
- headers
1349
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/FiltrosPedidoVenta`, {
1350
+ method: "POST",
1351
+ headers,
1352
+ body,
1105
1353
  });
1106
- return [this.helpers.returnJsonArray([bonificaciones])];
1354
+ return [this.helpers.returnJsonArray(response)];
1107
1355
  }
1108
1356
  catch (error) {
1109
- console.error("Error al obtener las bonificaciones:", error);
1110
- const statusCode = error?.response?.status;
1111
- const responseData = error?.response?.data;
1112
- const errorMessage = responseData?.Message || responseData?.message || error?.message || "Error desconocido al crear el contribuyente.";
1113
- const fullMessage = statusCode ? `Error ${statusCode}: ${errorMessage}` : errorMessage;
1114
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), fullMessage, {
1115
- description: responseData?.Detail || "Ocurrió un error inesperado al llamar a la API de Centum.",
1116
- });
1357
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1358
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1359
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los pedidos ventas para cliente ${idCliente}: ${errorMessage}`);
1117
1360
  }
1118
1361
  }
1119
- case "obtenerCobros": {
1362
+ case "listarPedidosVentaFiltrados": {
1120
1363
  const idCliente = this.getNodeParameter("clienteId", 0);
1121
- const idCobro = this.getNodeParameter("idCobro", 0);
1364
+ const idsEstado = this.getNodeParameter("statusId", 0);
1122
1365
  const fechaDesde = this.getNodeParameter("startDate", 0, "");
1123
1366
  const fechaHasta = this.getNodeParameter("endDate", 0, "");
1124
1367
  const separarFechaDesde = String(fechaDesde).split("T")[0];
1125
1368
  const separarFechaHasta = String(fechaHasta).split("T")[0];
1126
- if (!idCliente && !separarFechaDesde && !separarFechaHasta && !idCobro) {
1369
+ if (!idCliente && !idsEstado && !separarFechaDesde && !separarFechaHasta) {
1127
1370
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1128
1371
  }
1129
1372
  const body = {
1130
1373
  idCliente,
1131
1374
  fechaDocumentoDesde: separarFechaDesde,
1132
1375
  fechaDocumentoHasta: separarFechaHasta,
1133
- idCobro,
1376
+ idsEstado,
1134
1377
  };
1135
1378
  try {
1136
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros/FiltrosCobro`, {
1379
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/FiltrosPedidoVentaConsulta`, {
1137
1380
  method: "POST",
1138
1381
  headers,
1139
1382
  body,
@@ -1141,48 +1384,124 @@ class Centum {
1141
1384
  return [this.helpers.returnJsonArray(response)];
1142
1385
  }
1143
1386
  catch (error) {
1144
- console.log("Error en obtener el listado de cobros:", error);
1387
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1388
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1389
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los pedidos ventas para cliente ${idCliente}: ${errorMessage}`);
1390
+ }
1391
+ }
1392
+ case "listarPrecios": {
1393
+ try {
1394
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/ListasPrecios`, {
1395
+ method: "GET",
1396
+ headers,
1397
+ });
1398
+ return [this.helpers.returnJsonArray(response)];
1399
+ }
1400
+ catch (error) {
1401
+ console.log("Error en solicitud de promociones para el cliente:", error);
1402
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1403
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo el listado de precios. \n ${errorMessage}`);
1404
+ }
1405
+ }
1406
+ case "listarProductosDisponibles": {
1407
+ const clientId = this.getNodeParameter("clienteId", 0);
1408
+ const documentDate = this.getNodeParameter("documentDate", 0);
1409
+ const IdsRubro = this.getNodeParameter("idsRubros", 0);
1410
+ const completeMigration = this.getNodeParameter("migracionCompleta", 0);
1411
+ const IdsSubRubro = this.getNodeParameter("idsSubRubros", 0);
1412
+ const formattedDocumentDate = documentDate.replace(/\..+/, "");
1413
+ const dateModified = this.getNodeParameter("dateModified", 0);
1414
+ const dateModifiedImage = this.getNodeParameter("dateModifiedImage", 0);
1415
+ const priceDateModified = this.getNodeParameter("priceDateModified", 0);
1416
+ const numeroPagina = this.getNodeParameter("numeroPagina", 0);
1417
+ const cantidadPorPagina = this.getNodeParameter("cantidadPorPagina", 0);
1418
+ const bodyToSend = {
1419
+ idCliente: clientId,
1420
+ FechaDocumento: formattedDocumentDate,
1421
+ incluirAtributosArticulos: true,
1422
+ IdsRubro: IdsRubro ? [IdsRubro] : [],
1423
+ IdsSubRubro: IdsSubRubro ? [IdsSubRubro] : [""],
1424
+ fechaModificacionDesde: dateModified ? dateModified : "",
1425
+ fechaModificacionImagenesDesde: dateModifiedImage ? dateModifiedImage : "",
1426
+ fechaPrecioActualizadoDesde: priceDateModified,
1427
+ numeroPagina,
1428
+ cantidadPorPagina,
1429
+ };
1430
+ try {
1431
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
1432
+ method: "POST",
1433
+ body: bodyToSend,
1434
+ headers,
1435
+ queryParams: { tipoOrdenArticulos: "Codigo" },
1436
+ });
1437
+ if (response.Articulos.Items.length > 0) {
1438
+ const items = response.Articulos.Items;
1439
+ if (!completeMigration) {
1440
+ const acc = [];
1441
+ for (const item of items) {
1442
+ const groupArticle = item.GrupoArticulo;
1443
+ if (!groupArticle)
1444
+ continue;
1445
+ const body = {
1446
+ idCliente: clientId,
1447
+ FechaDocumento: formattedDocumentDate,
1448
+ incluirAtributosArticulos: true,
1449
+ IdsRubro: IdsRubro ? [IdsRubro] : [],
1450
+ IdsSubRubro: IdsSubRubro ? [IdsSubRubro] : [""],
1451
+ NombreGrupoArticulo: groupArticle.Nombre,
1452
+ IdGrupoArticulo: groupArticle.IdGrupoArticulo,
1453
+ };
1454
+ try {
1455
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Articulos/Venta`, {
1456
+ method: "POST",
1457
+ headers: { ...headers },
1458
+ body,
1459
+ queryParams: { tipoOrdenArticulos: "Codigo" },
1460
+ });
1461
+ if (response.Articulos.Items.length > 0) {
1462
+ acc.push(...response.Articulos.Items);
1463
+ }
1464
+ }
1465
+ catch (error) {
1466
+ console.log("Error en solicitud de grupo de artículos", { error });
1467
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1468
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1469
+ }
1470
+ }
1471
+ const combinedArrays = [...acc, ...items];
1472
+ const filteredArray = Array.from(new Map(combinedArrays.map((obj) => [obj.IdArticulo, obj])).values());
1473
+ const itemsArray = filteredArray.map((item) => ({
1474
+ ...item,
1475
+ AtributosArticulo: item.Habilitado && item.ActivoWeb ? item.AtributosArticulo : [],
1476
+ }));
1477
+ return [this.helpers.returnJsonArray(itemsArray)];
1478
+ }
1479
+ return [this.helpers.returnJsonArray(items)];
1480
+ }
1481
+ else {
1482
+ return [this.helpers.returnJsonArray({ json: {} })];
1483
+ }
1484
+ }
1485
+ catch (error) {
1486
+ console.log("Error en solicitud de artículos", error);
1145
1487
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1146
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error en obtener el listado de cobros para cliente ${idCliente}: ${errorMessage}`);
1488
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1147
1489
  }
1148
1490
  }
1149
- case "obtenerCompras": {
1150
- const idCliente = this.getNodeParameter("clienteId", 0);
1151
- const idCompra = this.getNodeParameter("idCompra", 0);
1152
- const fechaDesde = this.getNodeParameter("startDate", 0, "");
1153
- const fechaHasta = this.getNodeParameter("endDate", 0, "");
1154
- const separarFechaDesde = String(fechaDesde).split("T")[0];
1155
- const separarFechaHasta = String(fechaHasta).split("T")[0];
1156
- if (!idCliente && !separarFechaDesde && !separarFechaHasta && !idCompra) {
1157
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1158
- }
1159
- const body = {
1160
- idCliente,
1161
- fechaDocumentoDesde: separarFechaDesde,
1162
- fechaDocumentoHasta: separarFechaHasta,
1163
- idCompra,
1491
+ case "listarProductosPorSucursal": {
1492
+ const IdSucursalFisica = this.getNodeParameter("IdSucursalFisica", 0);
1493
+ const queryParams = {
1494
+ idsSucursalesFisicas: IdSucursalFisica,
1164
1495
  };
1165
- try {
1166
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Compras/FiltrosCompra`, {
1167
- method: "POST",
1168
- headers,
1169
- body,
1170
- });
1171
- return [this.helpers.returnJsonArray(response)];
1172
- }
1173
- catch (error) {
1174
- console.log("Error en obtener el listado de cobros:", error);
1175
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1176
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error en obtener el listado de cobros para cliente ${idCliente}: ${errorMessage}`);
1496
+ if (!IdSucursalFisica) {
1497
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la sucursal fisica es obligatorio");
1177
1498
  }
1178
- }
1179
- case "obtenerEstadosPedidosDeVenta": {
1180
1499
  try {
1181
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/EstadosPedidoVenta?bIncluirTodosEstados=true`, {
1182
- method: "GET",
1500
+ const dataArticulosExistencias = await (0, functions_1.apiRequest)(`${centumUrl}/ArticulosSucursalesFisicas`, {
1183
1501
  headers,
1502
+ queryParams,
1184
1503
  });
1185
- return [this.helpers.returnJsonArray(response)];
1504
+ return [this.helpers.returnJsonArray(dataArticulosExistencias.Items)];
1186
1505
  }
1187
1506
  catch (error) {
1188
1507
  console.log(error);
@@ -1190,29 +1509,22 @@ class Centum {
1190
1509
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1191
1510
  }
1192
1511
  }
1193
- case "obtenerFacturasCobros": {
1512
+ case "listarPromocionesCliente": {
1194
1513
  const clientIdParam = this.getNodeParameter("clienteId", 0);
1195
- const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1196
- const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1197
- const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1198
- const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1514
+ const documentDate = this.getNodeParameter("documentDate", 0);
1515
+ const diaSemana = this.getNodeParameter("diaSemana", 0);
1199
1516
  const clientId = Number(clientIdParam);
1200
- if (isNaN(clientId) || clientId <= 0) {
1201
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1202
- }
1203
- if (!desdeSaldoFecha) {
1204
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1205
- }
1206
- if (!hastaSaldoFecha) {
1207
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1517
+ if (!documentDate) {
1518
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "documentDate es requerido");
1208
1519
  }
1520
+ const formattedDocumentDate = String(documentDate).split("T")[0];
1209
1521
  try {
1210
1522
  const body = {
1211
- fechaDocumentoDesde: separarFechaDesde,
1212
- fechaDocumentoHasta: separarFechaHasta,
1213
- IdCliente: clientId,
1523
+ FechaDocumento: formattedDocumentDate,
1524
+ IdsCliente: clientId,
1525
+ DiaSemana: diaSemana || "",
1214
1526
  };
1215
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros/FiltrosCobro`, {
1527
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/PromocionesComerciales/FiltrosPromocionComercial`, {
1216
1528
  method: "POST",
1217
1529
  headers,
1218
1530
  body,
@@ -1220,235 +1532,165 @@ class Centum {
1220
1532
  if (!response || typeof response !== "object") {
1221
1533
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1222
1534
  }
1535
+ if (response.Items && Array.isArray(response.Items)) {
1536
+ return [this.helpers.returnJsonArray(response.Items)];
1537
+ }
1223
1538
  return [this.helpers.returnJsonArray(response)];
1224
1539
  }
1225
1540
  catch (error) {
1226
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1541
+ console.log("Error en solicitud de promociones para el cliente:", error);
1227
1542
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1228
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo facturas pedidos ventas para cliente ${clientId}: ${errorMessage}`);
1543
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo promociones para el cliente ${clientId}: \n ${errorMessage}`);
1229
1544
  }
1230
1545
  }
1231
- case "obtenerOrdenesCompras": {
1232
- const idProveedor = this.getNodeParameter("proveedorId", 0);
1233
- const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1234
- const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1235
- const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1236
- const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1237
- if (!desdeSaldoFecha) {
1238
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1239
- }
1240
- if (!hastaSaldoFecha) {
1241
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1242
- }
1546
+ case "listarProvincias": {
1547
+ const idPais = this.getNodeParameter("idPais", 0, "");
1243
1548
  try {
1244
- const body = {
1245
- fechaDocumentoDesde: separarFechaDesde,
1246
- fechaDocumentoHasta: separarFechaHasta,
1247
- idProveedor
1248
- };
1249
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/OrdenesCompra/FiltrosOrdenCompra`, {
1250
- method: "POST",
1549
+ const queryParams = {};
1550
+ if (idPais) {
1551
+ queryParams.idPais = idPais;
1552
+ }
1553
+ const provincias = await (0, functions_1.apiRequest)(`${centumUrl}/Provincias`, {
1554
+ method: "GET",
1251
1555
  headers,
1252
- body,
1556
+ queryParams,
1253
1557
  });
1254
- if (!response || typeof response !== "object") {
1255
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1256
- }
1257
- return [this.helpers.returnJsonArray(response)];
1558
+ return [this.helpers.returnJsonArray(provincias.map((p) => ({ ...p })))];
1258
1559
  }
1259
1560
  catch (error) {
1260
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1561
+ console.log(error);
1261
1562
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1262
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo ordenes de compra del proveedor ${idProveedor}: ${errorMessage}`);
1563
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1263
1564
  }
1264
1565
  }
1265
- case "obtenerOrdenCompra": {
1266
- const ordenCompraId = this.getNodeParameter("idCompra", 0);
1267
- if (!ordenCompraId) {
1268
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la compra es requerido");
1269
- }
1566
+ case "listarProveedores": {
1567
+ const codigo = this.getNodeParameter('codigo', 0, "");
1568
+ const razonSocial = this.getNodeParameter('razonSocial', 0);
1569
+ const direccion = this.getNodeParameter('direccion', 0, "");
1570
+ const localidad = this.getNodeParameter('localidad', 0, "");
1571
+ const telefono = this.getNodeParameter('telefono', 0);
1572
+ const telefonoAlt = this.getNodeParameter('telefonoAlt', 0);
1573
+ const codigoPostal = this.getNodeParameter('codigoPostal', 0);
1574
+ const cuit = this.getNodeParameter('cuit', 0);
1575
+ const email = this.getNodeParameter('email', 0, "");
1576
+ const idProvincia = this.getNodeParameter('idProvincia', 0);
1577
+ const idPais = this.getNodeParameter('idPais', 0);
1578
+ const IdClaseProveedor = this.getNodeParameter('idClaseProveedor', 0);
1579
+ const activo = this.getNodeParameter("active", 0);
1580
+ const FechaActualizacionDesde = this.getNodeParameter('fechaActualizacionDesde', 0);
1581
+ const queryParams = Object.fromEntries(Object.entries({
1582
+ idPais,
1583
+ codigo,
1584
+ razonSocial,
1585
+ direccion,
1586
+ localidad,
1587
+ telefono,
1588
+ telefonoAlt,
1589
+ codigoPostal,
1590
+ cuit,
1591
+ email,
1592
+ idProvincia,
1593
+ IdClaseProveedor,
1594
+ activo,
1595
+ FechaActualizacionDesde,
1596
+ }).filter(([, value]) => {
1597
+ if (value === undefined || value === null)
1598
+ return false;
1599
+ if (typeof value === 'string' && value.trim() === '')
1600
+ return false;
1601
+ return true;
1602
+ }));
1603
+ console.log(queryParams);
1270
1604
  try {
1271
- let url = `${centumUrl}/OrdenesCompra/${ordenCompraId}`;
1272
- const response = await (0, functions_1.apiRequest)(`${url}`, {
1605
+ const proveedores = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores`, {
1273
1606
  method: "GET",
1274
- headers
1607
+ headers,
1608
+ queryParams,
1275
1609
  });
1276
- if (!response || typeof response !== "object") {
1277
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1278
- }
1279
- return [this.helpers.returnJsonArray(response)];
1610
+ return [this.helpers.returnJsonArray(proveedores)];
1280
1611
  }
1281
- catch (error) {
1282
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1283
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1284
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo la orden de compra con el id ${ordenCompraId}: ${errorMessage}`);
1612
+ catch (err) {
1285
1613
  }
1286
1614
  }
1287
- case "obtenerFacturasPedidosVentasPorID": {
1288
- const clientIdParam = this.getNodeParameter("clienteId", 0);
1289
- const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1290
- const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1291
- const separarFechaDesde = String(desdeSaldoFecha).split("T")[0];
1292
- const separarFechaHasta = String(hastaSaldoFecha).split("T")[0];
1293
- const clientId = Number(clientIdParam);
1294
- if (isNaN(clientId) || clientId <= 0) {
1295
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1296
- }
1297
- if (!desdeSaldoFecha) {
1298
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModified (fecha desde) es requerido");
1299
- }
1300
- if (!hastaSaldoFecha) {
1301
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "priceDateModifiedSince (fecha hasta) es requerido");
1302
- }
1615
+ case "listarRegimenesEspeciales": {
1303
1616
  try {
1304
- const body = {
1305
- fechaDocumentoDesde: separarFechaDesde,
1306
- fechaDocumentoHasta: separarFechaHasta,
1307
- IdCliente: clientId,
1308
- };
1309
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Ventas/FiltrosVenta`, {
1310
- method: "POST",
1617
+ const dataRegimenesList = await (0, functions_1.apiRequest)(`${centumUrl}/RegimenesEspeciales`, {
1618
+ method: "GET",
1311
1619
  headers,
1312
- body,
1313
1620
  });
1314
- if (!response || typeof response !== "object") {
1315
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1316
- }
1317
- return [this.helpers.returnJsonArray(response)];
1621
+ return [this.helpers.returnJsonArray(dataRegimenesList)];
1318
1622
  }
1319
1623
  catch (error) {
1320
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1624
+ console.log(error);
1321
1625
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1322
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo facturas pedidos ventas para cliente ${clientId}: ${errorMessage}`);
1323
- }
1324
- }
1325
- case "obtenerFacturasPedidosVentas": {
1326
- const idCliente = this.getNodeParameter('clienteId', 0);
1327
- const idVenta = this.getNodeParameter('ventaId', 0);
1328
- const idSucursal = this.getNodeParameter('sucursalId', 0);
1329
- const idDivisionEmpresa = this.getNodeParameter('divisionEmpresaId', 0);
1330
- const incluirAnulados = this.getNodeParameter('incluirAnulados', 0);
1331
- const idUsuarioCreador = this.getNodeParameter('usuarioCreadorId', 0);
1332
- const idTransporte = this.getNodeParameter('transporteId', 0);
1333
- const idTipoComprobante = this.getNodeParameter('idTipoComprobante', 0);
1334
- const idClienteCuentaCorriente = this.getNodeParameter('cuentaCorrienteId', 0);
1335
- const idVendedor = this.getNodeParameter('idVendedor', 0);
1336
- const idCanalVenta = this.getNodeParameter('canalVentaId', 0);
1337
- const desdeSaldoFecha = this.getNodeParameter("startDate", 0);
1338
- const hastaSaldoFecha = this.getNodeParameter("endDate", 0);
1339
- if (!desdeSaldoFecha || !hastaSaldoFecha) {
1340
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Las fechas desde y hasta son requeridas");
1341
- }
1342
- const body = {
1343
- fechaDocumentoDesde: String(desdeSaldoFecha).split("T")[0],
1344
- fechaDocumentoHasta: String(hastaSaldoFecha).split("T")[0],
1345
- };
1346
- idCliente && (body.idCliente = idCliente);
1347
- idVenta && (body.idVenta = idVenta);
1348
- idSucursal && (body.idSucursal = idSucursal);
1349
- idDivisionEmpresa && (body.idDivisionEmpresa = idDivisionEmpresa);
1350
- idUsuarioCreador && (body.idUsuarioCreador = idUsuarioCreador);
1351
- idTransporte && (body.idTransporte = idTransporte);
1352
- idTipoComprobante && (body.idTipoComprobante = idTipoComprobante);
1353
- idClienteCuentaCorriente && (body.idClienteCuentaCorriente = idClienteCuentaCorriente);
1354
- idVendedor && (body.idVendedor = idVendedor);
1355
- idCanalVenta && (body.idCanalVenta = idCanalVenta);
1356
- incluirAnulados && (body.incluirAnulados = incluirAnulados);
1357
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Ventas/FiltrosVentaConsulta`, {
1358
- method: "POST",
1359
- headers,
1360
- body,
1361
- });
1362
- if (!response || typeof response !== "object") {
1363
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1626
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1364
1627
  }
1365
- return [this.helpers.returnJsonArray(response)];
1366
1628
  }
1367
- case "obtenerPedidosDeVenta": {
1368
- const idCliente = this.getNodeParameter("clienteId", 0);
1369
- const idsEstado = this.getNodeParameter("statusId", 0);
1370
- const fechaDesde = this.getNodeParameter("startDate", 0, "");
1371
- const fechaHasta = this.getNodeParameter("endDate", 0, "");
1372
- const separarFechaDesde = String(fechaDesde).split("T")[0];
1373
- const separarFechaHasta = String(fechaHasta).split("T")[0];
1374
- if (!idCliente && !idsEstado && !separarFechaDesde && !separarFechaHasta) {
1375
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1376
- }
1377
- const body = {
1378
- idCliente,
1379
- fechaDocumentoDesde: separarFechaDesde,
1380
- fechaDocumentoHasta: separarFechaHasta,
1381
- idsEstado,
1382
- };
1629
+ case "listarRubros": {
1383
1630
  try {
1384
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/FiltrosPedidoVenta`, {
1385
- method: "POST",
1386
- headers,
1387
- body,
1631
+ const response = await (0, functions_1.apiRequest)(`${centumUrl}/Rubros`, {
1632
+ method: 'GET',
1633
+ headers
1388
1634
  });
1389
1635
  return [this.helpers.returnJsonArray(response)];
1390
1636
  }
1391
1637
  catch (error) {
1392
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1393
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1394
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los pedidos ventas para cliente ${idCliente}: ${errorMessage}`);
1395
- }
1396
- }
1397
- case "obtenerPedidosDeVentaFiltrados": {
1398
- const idCliente = this.getNodeParameter("clienteId", 0);
1399
- const idsEstado = this.getNodeParameter("statusId", 0);
1400
- const fechaDesde = this.getNodeParameter("startDate", 0, "");
1401
- const fechaHasta = this.getNodeParameter("endDate", 0, "");
1402
- const separarFechaDesde = String(fechaDesde).split("T")[0];
1403
- const separarFechaHasta = String(fechaHasta).split("T")[0];
1404
- if (!idCliente && !idsEstado && !separarFechaDesde && !separarFechaHasta) {
1405
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Debes ingresar almenos un parametro para realizar la búsqueda.");
1638
+ console.log(error);
1639
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1640
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1406
1641
  }
1407
- const body = {
1408
- idCliente,
1409
- fechaDocumentoDesde: separarFechaDesde,
1410
- fechaDocumentoHasta: separarFechaHasta,
1411
- idsEstado,
1412
- };
1642
+ }
1643
+ case "listarSucursales": {
1413
1644
  try {
1414
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/FiltrosPedidoVentaConsulta`, {
1415
- method: "POST",
1645
+ const dataListBranches = await (0, functions_1.apiRequest)(`${centumUrl}/SucursalesFisicas`, {
1646
+ method: "GET",
1416
1647
  headers,
1417
- body,
1418
1648
  });
1419
- return [this.helpers.returnJsonArray(response)];
1649
+ return [this.helpers.returnJsonArray(dataListBranches)];
1420
1650
  }
1421
1651
  catch (error) {
1422
- console.log("Error en solicitud de facturas pedidos ventas:", error);
1652
+ console.log(error);
1423
1653
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1424
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los pedidos ventas para cliente ${idCliente}: ${errorMessage}`);
1654
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1425
1655
  }
1426
1656
  }
1427
- case "obtenerSaldoCliente": {
1428
- const clientIdParam = this.getNodeParameter("clienteId", 0);
1429
- const desdeSaldoFecha = this.getNodeParameter("priceDateModified", 0);
1430
- const soloFecha = String(desdeSaldoFecha).split("T")[0];
1431
- const clientId = Number(clientIdParam);
1432
- if (isNaN(clientId) || clientId <= 0) {
1433
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1434
- }
1657
+ case "listarTiposComprobante": {
1435
1658
  try {
1436
- let url = `${centumUrl}/SaldosCuentasCorrientes/${clientId}`;
1437
- if (soloFecha) {
1438
- url += `?fechaVencimientoHasta=${soloFecha}`;
1439
- }
1440
- const response = await (0, functions_1.apiRequest)(url, {
1659
+ const comprobanteList = await (0, functions_1.apiRequest)(`${centumUrl}/TiposComprobante`, {
1441
1660
  method: "GET",
1442
1661
  headers,
1443
1662
  });
1444
- return [this.helpers.returnJsonArray(response)];
1663
+ return [this.helpers.returnJsonArray(comprobanteList)];
1445
1664
  }
1446
1665
  catch (error) {
1666
+ console.log(error);
1447
1667
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1448
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo saldo para cliente ${clientId}: ${errorMessage}`);
1668
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1669
+ }
1670
+ }
1671
+ case "listarTodosLosProductos": {
1672
+ try {
1673
+ const ajustesHTTP = functions_1.getHttpSettings.call(this);
1674
+ const articulosURL = `${centumUrl}/Articulos/DatosGenerales`;
1675
+ const fetchOptions = {
1676
+ method: "POST",
1677
+ headers,
1678
+ body: {},
1679
+ queryParams: { tipoOrdenArticulos: "Nombre" },
1680
+ pagination: ajustesHTTP.pagination,
1681
+ cantidadItemsPorPagina: ajustesHTTP.cantidadItemsPorPagina,
1682
+ intervaloPagina: ajustesHTTP.intervaloPagina,
1683
+ };
1684
+ const paginated = await (0, functions_1.apiPostRequestPaginated)(articulosURL, fetchOptions);
1685
+ return [this.helpers.returnJsonArray(paginated)];
1686
+ }
1687
+ catch (error) {
1688
+ console.log("Error en solicitud de artículos", error);
1689
+ const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1690
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1449
1691
  }
1450
1692
  }
1451
- case 'obtenerTurnoEntrega': {
1693
+ case 'listarTurnosEntrega': {
1452
1694
  try {
1453
1695
  const turnoEntrega = await (0, functions_1.apiRequest)(`${centumUrl}/TurnosEntrega`, {
1454
1696
  method: 'GET',
@@ -1461,7 +1703,7 @@ class Centum {
1461
1703
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los turnos de entrega: ${errorMessage}`);
1462
1704
  }
1463
1705
  }
1464
- case 'obtenerVendedores': {
1706
+ case 'listarVendedores': {
1465
1707
  try {
1466
1708
  const turnoEntrega = await (0, functions_1.apiRequest)(`${centumUrl}/Vendedores`, {
1467
1709
  method: 'GET',
@@ -1474,30 +1716,18 @@ class Centum {
1474
1716
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo los vendedores: ${errorMessage}`);
1475
1717
  }
1476
1718
  }
1477
- case "operadoresMoviles": {
1478
- const username = this.getNodeParameter("username", 0, "");
1479
- const password = this.getNodeParameter("password", 0, "");
1480
- try {
1481
- const operadoresActividad = await (0, functions_1.apiRequest)(`
1482
- ${centumUrl}/OperadoresMoviles/Credenciales?Usuario=${username}&Contrasena=${password}`, {
1483
- method: "GET",
1484
- headers,
1485
- });
1486
- return [this.helpers.returnJsonArray(operadoresActividad)];
1487
- }
1488
- catch (error) {
1489
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1490
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1491
- }
1492
- }
1493
- case "pedidoVentaActividad": {
1494
- const pedidoID = this.getNodeParameter("id", 0);
1719
+ case "registrarCobro": {
1720
+ const ordenCliente = this.getNodeParameter("cliente", 0);
1721
+ const ordenArticulo = this.getNodeParameter("articulo", 0);
1722
+ const ordenEnvio = this.getNodeParameter("envio", 0);
1723
+ const bodyCharge = (0, functions_1.createChargeJson)(ordenCliente, ordenArticulo, ordenEnvio);
1495
1724
  try {
1496
- const dataActividad = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/${pedidoID}`, {
1497
- method: "GET",
1725
+ const dataCobros = await (0, functions_1.apiRequest)(`${centumUrl}/Cobros`, {
1726
+ method: "POST",
1727
+ body: bodyCharge,
1498
1728
  headers,
1499
1729
  });
1500
- return [this.helpers.returnJsonArray(dataActividad)];
1730
+ return [this.helpers.returnJsonArray(dataCobros)];
1501
1731
  }
1502
1732
  catch (error) {
1503
1733
  console.log(error);
@@ -1505,7 +1735,7 @@ class Centum {
1505
1735
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1506
1736
  }
1507
1737
  }
1508
- case "procesarImagenes": {
1738
+ case "sincronizarImagenes": {
1509
1739
  const dataImages = this.getNodeParameter("dataImg", 0);
1510
1740
  const db = this.getNodeParameter("lastModifiedImg", 0);
1511
1741
  const result = [];
@@ -1531,145 +1761,36 @@ class Centum {
1531
1761
  }
1532
1762
  return [this.helpers.returnJsonArray(result)];
1533
1763
  }
1534
- case "promocionesCliente": {
1535
- const clientIdParam = this.getNodeParameter("clienteId", 0);
1536
- const documentDate = this.getNodeParameter("documentDate", 0);
1537
- const diaSemana = this.getNodeParameter("diaSemana", 0);
1538
- const clientId = Number(clientIdParam);
1539
- if (!documentDate) {
1540
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), "documentDate es requerido");
1764
+ case "verDetalleOrdenCompra": {
1765
+ const ordenCompraId = this.getNodeParameter("idCompra", 0);
1766
+ if (!ordenCompraId) {
1767
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El id de la compra es requerido");
1541
1768
  }
1542
- const formattedDocumentDate = String(documentDate).split("T")[0];
1543
1769
  try {
1544
- const body = {
1545
- FechaDocumento: formattedDocumentDate,
1546
- IdsCliente: clientId,
1547
- DiaSemana: diaSemana || "",
1548
- };
1549
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/PromocionesComerciales/FiltrosPromocionComercial`, {
1550
- method: "POST",
1551
- headers,
1552
- body,
1770
+ let url = `${centumUrl}/OrdenesCompra/${ordenCompraId}`;
1771
+ const response = await (0, functions_1.apiRequest)(`${url}`, {
1772
+ method: "GET",
1773
+ headers
1553
1774
  });
1554
1775
  if (!response || typeof response !== "object") {
1555
1776
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1556
1777
  }
1557
- if (response.Items && Array.isArray(response.Items)) {
1558
- return [this.helpers.returnJsonArray(response.Items)];
1559
- }
1560
- return [this.helpers.returnJsonArray(response)];
1561
- }
1562
- catch (error) {
1563
- console.log("Error en solicitud de promociones para el cliente:", error);
1564
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1565
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo promociones para el cliente ${clientId}: \n ${errorMessage}`);
1566
- }
1567
- }
1568
- case 'proveedorBuscar': {
1569
- const proveedorId = this.getNodeParameter('proveedorId', 0);
1570
- try {
1571
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/${proveedorId}`, {
1572
- method: 'GET',
1573
- headers
1574
- });
1575
- return [this.helpers.returnJsonArray(response)];
1576
- }
1577
- catch (error) {
1578
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1579
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1580
- }
1581
- }
1582
- case 'proveedorCrear': {
1583
- const codigo = this.getNodeParameter('codigoArticulo', 0, '');
1584
- const razonSocial = this.getNodeParameter('razonSocial', 0, '');
1585
- const cuit = this.getNodeParameter('cuit', 0);
1586
- const provincia = this.getNodeParameter('idProvincia', 0);
1587
- const pais = this.getNodeParameter('idPais', 0);
1588
- const condicionIVA = this.getNodeParameter('condicionIVA', 0, '');
1589
- const formaPagoProveedor = this.getNodeParameter('formaPagoProveedor', 0);
1590
- const condicionPago = this.getNodeParameter('condicionDePago', 0);
1591
- const categoriaImpuestoGanancias = this.getNodeParameter('categoriaImpuestosGanancias', 0);
1592
- const claseProveedor = this.getNodeParameter('claseProveedor', 0);
1593
- const activo = this.getNodeParameter('active', 0);
1594
- const idOperadorCompra = this.getNodeParameter('idOperadorCompra', 0);
1595
- const idZona = this.getNodeParameter('idZona', 0);
1596
- const idDescuentoProveedor = this.getNodeParameter('idDescuentoProveedor', 0);
1597
- const body = {
1598
- Codigo: codigo,
1599
- RazonSocial: razonSocial,
1600
- CUIT: cuit,
1601
- Provincia: {
1602
- IdProvincia: provincia
1603
- },
1604
- Pais: {
1605
- IdPais: pais
1606
- },
1607
- CondicionIVA: {
1608
- IdCondicionIVA: condicionIVA
1609
- },
1610
- FormaPagoProveedor: {
1611
- IdFormaPagoProveedor: formaPagoProveedor
1612
- },
1613
- CondicionPago: {
1614
- IdCondicionPago: condicionPago
1615
- },
1616
- CategoriaImpuestoGanancias: {
1617
- IdCategoriaImpuestoGanancia: categoriaImpuestoGanancias
1618
- },
1619
- ClaseProveedor: {
1620
- IdClaseProveedor: claseProveedor
1621
- },
1622
- OperadorCompra: {
1623
- IdOperadorCompra: idOperadorCompra
1624
- },
1625
- Activo: activo,
1626
- Zona: {
1627
- IdZona: idZona
1628
- },
1629
- DescuentoProveedor: {
1630
- IdDescuentoProveedor: idDescuentoProveedor
1631
- }
1632
- };
1633
- try {
1634
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Proveedores/`, {
1635
- method: 'POST',
1636
- headers,
1637
- body
1638
- });
1639
1778
  return [this.helpers.returnJsonArray(response)];
1640
1779
  }
1641
1780
  catch (error) {
1781
+ console.log("Error en solicitud de facturas pedidos ventas:", error);
1642
1782
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1643
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1644
- }
1645
- }
1646
- case "provinciasLista": {
1647
- const idPais = this.getNodeParameter("idPais", 0, "");
1648
- try {
1649
- const queryParams = {};
1650
- if (idPais) {
1651
- queryParams.idPais = idPais;
1652
- }
1653
- const provincias = await (0, functions_1.apiRequest)(`${centumUrl}/Provincias`, {
1654
- method: "GET",
1655
- headers,
1656
- queryParams,
1657
- });
1658
- return [this.helpers.returnJsonArray(provincias.map((p) => ({ ...p })))];
1659
- }
1660
- catch (error) {
1661
- console.log(error);
1662
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1663
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1783
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo la orden de compra con el id ${ordenCompraId}: ${errorMessage}`);
1664
1784
  }
1665
1785
  }
1666
- case "regimenesEspecialesLista": {
1786
+ case "verDetallePedidoVenta": {
1787
+ const pedidoID = this.getNodeParameter("id", 0);
1667
1788
  try {
1668
- const dataRegimenesList = await (0, functions_1.apiRequest)(`${centumUrl}/RegimenesEspeciales`, {
1789
+ const dataActividad = await (0, functions_1.apiRequest)(`${centumUrl}/PedidosVenta/${pedidoID}`, {
1669
1790
  method: "GET",
1670
1791
  headers,
1671
1792
  });
1672
- return [this.helpers.returnJsonArray(dataRegimenesList)];
1793
+ return [this.helpers.returnJsonArray(dataActividad)];
1673
1794
  }
1674
1795
  catch (error) {
1675
1796
  console.log(error);
@@ -1677,7 +1798,7 @@ class Centum {
1677
1798
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1678
1799
  }
1679
1800
  }
1680
- case "regimenesEspecialesPorId": {
1801
+ case "verDetalleRegimenEspecial": {
1681
1802
  const regimenId = this.getNodeParameter("id", 0);
1682
1803
  if (!regimenId) {
1683
1804
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), "El ID del regimen es requerido");
@@ -1695,44 +1816,45 @@ class Centum {
1695
1816
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1696
1817
  }
1697
1818
  }
1698
- case "rubrosObtener": {
1699
- try {
1700
- const response = await (0, functions_1.apiRequest)(`${centumUrl}/Rubros`, {
1701
- method: 'GET',
1702
- headers
1703
- });
1704
- return [this.helpers.returnJsonArray(response)];
1705
- }
1706
- catch (error) {
1707
- console.log(error);
1708
- const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1709
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1819
+ case "verDetalleSaldoCliente": {
1820
+ const clientIdParam = this.getNodeParameter("clienteId", 0);
1821
+ const desdeSaldoFecha = this.getNodeParameter("priceDateModified", 0);
1822
+ const separarFecha = String(desdeSaldoFecha).split("T")[0];
1823
+ const clientId = Number(clientIdParam);
1824
+ if (isNaN(clientId) || clientId <= 0) {
1825
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "clienteId debe ser un número positivo");
1710
1826
  }
1711
- }
1712
- case "sucursalesFisicas": {
1713
1827
  try {
1714
- const dataListBranches = await (0, functions_1.apiRequest)(`${centumUrl}/SucursalesFisicas`, {
1828
+ let url = `${centumUrl}/SaldosCuentasCorrientes/Composicion/${clientId}`;
1829
+ if (separarFecha) {
1830
+ url += `?fechaVencimientoHasta=${separarFecha}`;
1831
+ }
1832
+ const response = await (0, functions_1.apiRequest)(url, {
1715
1833
  method: "GET",
1716
1834
  headers,
1717
1835
  });
1718
- return [this.helpers.returnJsonArray(dataListBranches)];
1836
+ if (!response || typeof response !== "object") {
1837
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Respuesta inválida del servidor");
1838
+ }
1839
+ return [this.helpers.returnJsonArray(response)];
1719
1840
  }
1720
1841
  catch (error) {
1721
- console.log(error);
1722
1842
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1723
- throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1843
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Error obteniendo composición de saldo para cliente ${clientId}: ${errorMessage}`);
1724
1844
  }
1725
1845
  }
1726
- case "tipoComprobante": {
1846
+ case "verificarCredencialesOperador": {
1847
+ const username = this.getNodeParameter("username", 0, "");
1848
+ const password = this.getNodeParameter("password", 0, "");
1727
1849
  try {
1728
- const comprobanteList = await (0, functions_1.apiRequest)(`${centumUrl}/TiposComprobante`, {
1850
+ const operadoresActividad = await (0, functions_1.apiRequest)(`
1851
+ ${centumUrl}/OperadoresMoviles/Credenciales?Usuario=${username}&Contrasena=${password}`, {
1729
1852
  method: "GET",
1730
1853
  headers,
1731
1854
  });
1732
- return [this.helpers.returnJsonArray(comprobanteList)];
1855
+ return [this.helpers.returnJsonArray(operadoresActividad)];
1733
1856
  }
1734
1857
  catch (error) {
1735
- console.log(error);
1736
1858
  const errorMessage = error?.response?.data?.Message || error.message || "Error desconocido";
1737
1859
  throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage);
1738
1860
  }