contentoh-components-library 21.5.95 → 21.5.97

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.
@@ -143,8 +143,9 @@ const ProviderProductEditionView = ({
143
143
  useEffect(() => {
144
144
  const setProductData = () => {
145
145
  try {
146
-
147
- const product = productSelected ? productSelected : JSON.parse(sessionStorage.getItem("productSelected"));
146
+ const product = productSelected
147
+ ? productSelected
148
+ : JSON.parse(sessionStorage.getItem("productSelected"));
148
149
 
149
150
  const productNormalized = normalizeProduct(product);
150
151
 
@@ -152,10 +153,35 @@ const ProviderProductEditionView = ({
152
153
  type: "SET_PRODUCT",
153
154
  payload: productNormalized,
154
155
  });
155
- dispatch({
156
- type: "SET_ACTIVE_RETAILER",
157
- payload: productNormalized.categoryRetailer[0],
158
- });
156
+ if (
157
+ productNormalized.categoryRetailerInOrder.length > 0 &&
158
+ productNormalized.statusByRetailer
159
+ ) {
160
+ dispatch({
161
+ type: "SET_ACTIVE_RETAILER",
162
+ payload: productNormalized.categoryRetailerInOrder[0],
163
+ });
164
+ const firstRetailerStatus =
165
+ productNormalized.statusByRetailer[
166
+ productNormalized.categoryRetailerInOrder[0].id_retailer
167
+ ];
168
+ const initialTab = firstRetailerStatus.description
169
+ ? "Descripción"
170
+ : firstRetailerStatus.datasheet
171
+ ? "Ficha técnica"
172
+ : firstRetailerStatus.images
173
+ ? "Imágenes"
174
+ : "Imágenes";
175
+ dispatch({
176
+ type: "SET_ACTIVE_TAB",
177
+ payload: initialTab,
178
+ });
179
+ } else {
180
+ dispatch({
181
+ type: "SET_ACTIVE_RETAILER",
182
+ payload: productNormalized.categoryRetailer[0],
183
+ });
184
+ }
159
185
  } catch (error) {
160
186
  console.log("Error setting product data: ", error);
161
187
  }
@@ -199,7 +225,7 @@ const ProviderProductEditionView = ({
199
225
  id_category,
200
226
  version,
201
227
  token,
202
- id_retailer
228
+ id_retailer,
203
229
  ),
204
230
  getPercentage({ data, headers }),
205
231
  getServicesData({
@@ -213,14 +239,14 @@ const ProviderProductEditionView = ({
213
239
  const percentages =
214
240
  JSON.parse(percentageRes?.[0]?.body)?.[0]?.relations ?? [];
215
241
 
216
- const orderMap = services[2].inputsByRetailer
217
- .flat()
218
- .reduce((acc, item) => {
242
+ const orderMap =
243
+ services[2].inputsByRetailer ??
244
+ [].flat().reduce((acc, item) => {
219
245
  acc[item.id_image] = item.order;
220
246
  return acc;
221
247
  }, {});
222
248
 
223
- const orderedValues = [...services[2].values].sort((a, b) => {
249
+ const orderedValues = [...(services[2].values ?? [])].sort((a, b) => {
224
250
  const orderA = orderMap[a.image_id] ?? Number.MAX_SAFE_INTEGER;
225
251
  const orderB = orderMap[b.image_id] ?? Number.MAX_SAFE_INTEGER;
226
252
 
@@ -229,22 +255,26 @@ const ProviderProductEditionView = ({
229
255
 
230
256
  //Cuando carguemos la información de los servicios, las actualizamos en el estado del producto
231
257
 
232
- const updatedStatusByRetailer = servicesDataRes.reduce((acc, current, idx) => {
233
-
234
- const { id_retailer, service, status } = current;
235
-
236
- if(!acc[id_retailer]) acc[id_retailer] = {};
258
+ const updatedStatusByRetailer = servicesDataRes.reduce(
259
+ (acc, current, idx) => {
260
+ const { id_retailer, service, status } = current;
237
261
 
238
- acc[id_retailer][service] = status;
262
+ if (!acc[id_retailer]) acc[id_retailer] = {};
239
263
 
240
- return acc;
264
+ acc[id_retailer][service] = status;
241
265
 
242
- }, {});
266
+ return acc;
267
+ },
268
+ {},
269
+ );
243
270
 
244
- dispatch({ type: "SET_PRODUCT", payload: {
245
- ...state.product,
246
- statusByRetailer: updatedStatusByRetailer
247
- }});
271
+ dispatch({
272
+ type: "SET_PRODUCT",
273
+ payload: {
274
+ ...state.product,
275
+ statusByRetailer: updatedStatusByRetailer,
276
+ },
277
+ });
248
278
 
249
279
  dispatch({
250
280
  type: "SET_SERVICES",
@@ -295,45 +325,49 @@ const ProviderProductEditionView = ({
295
325
  const updateInputsActiveRetailer = () => {
296
326
  if (!state.services) return;
297
327
 
298
- const retailerDatasheets =
299
- state.services.datasheets[state.active_retailer.id_retailer];
300
-
301
- const datasheetsActiveRetailer = {
302
- ...retailerDatasheets,
303
- data: Object.values(retailerDatasheets.data),
304
- };
305
-
306
- const descriptionsActiveRetailer = state.services.descriptions.filter(
307
- (item) => item.id === state.active_retailer.id_retailer
308
- );
328
+ if (state.services.datasheets) {
329
+ const retailerDatasheets =
330
+ state.services.datasheets[state.active_retailer.id_retailer];
331
+ const datasheetsActiveRetailer = {
332
+ ...retailerDatasheets,
333
+ data: Object.values(retailerDatasheets.data),
334
+ };
335
+ dispatch({
336
+ type: "SET_DATASHEETS_INPUTS",
337
+ payload: [datasheetsActiveRetailer, state.services.datasheets.inputs],
338
+ });
339
+ }
309
340
 
310
- const filteredValues = state.services.images.values.filter((value) => {
311
- return state.services.images.inputsByRetailer.some((retailerInput) =>
312
- retailerInput.some(
313
- (input) =>
314
- input.id_retailer === state.active_retailer.id_retailer &&
315
- input.id_image === value.image_id
316
- )
341
+ if (state.services.descriptions) {
342
+ const descriptionsActiveRetailer = state.services.descriptions.filter(
343
+ (item) => item.id === state.active_retailer.id_retailer,
317
344
  );
318
- });
319
345
 
320
- dispatch({
321
- type: "SET_DATASHEETS_INPUTS",
322
- payload: [datasheetsActiveRetailer, state.services.datasheets.inputs],
323
- });
346
+ dispatch({
347
+ type: "SET_DESCRIPTIONS_INPUTS",
348
+ payload: descriptionsActiveRetailer,
349
+ });
350
+ }
324
351
 
325
- dispatch({
326
- type: "SET_DESCRIPTIONS_INPUTS",
327
- payload: descriptionsActiveRetailer,
328
- });
352
+ if (state.services.images) {
353
+ const filteredValues = state.services.images.values.filter((value) => {
354
+ return state.services.images.inputsByRetailer.some((retailerInput) =>
355
+ retailerInput.some(
356
+ (input) =>
357
+ input.id_retailer === state.active_retailer.id_retailer &&
358
+ input.id_image === value.image_id,
359
+ ),
360
+ );
361
+ });
329
362
 
330
- dispatch({
331
- type: "SET_IMAGES_VALUES",
332
- payload: {
333
- ...state.services.images,
334
- values: filteredValues,
335
- },
336
- });
363
+ dispatch({
364
+ type: "SET_IMAGES_VALUES",
365
+ payload: {
366
+ ...state.services.images,
367
+ values: filteredValues,
368
+ },
369
+ });
370
+ }
337
371
  };
338
372
 
339
373
  updateInputsActiveRetailer();
@@ -343,38 +377,41 @@ const ProviderProductEditionView = ({
343
377
  const canShowValidationButtons = () => {
344
378
  if (!state.product?.statusByRetailer) return false;
345
379
 
346
- const currentService = getConceptByTab(state.active_tab);
347
- // const currentStatus = state.product[`${currentService}_status`];
348
- const currentRetailer = state.active_retailer.id_retailer;
349
-
350
- //Información del servicio de la cadena seleccionada
351
- const {
352
- status: currentStatus
353
- } = state.services_data.find(service => service.service === currentService && service.id_retailer === currentRetailer);
380
+ try {
381
+ const currentService = getConceptByTab(state.active_tab);
382
+ // const currentStatus = state.product[`${currentService}_status`];
383
+ const currentRetailer = state.active_retailer.id_retailer;
384
+
385
+ //Información del servicio de la cadena seleccionada
386
+ const { status: currentStatus } = state.services_data.find(
387
+ (service) =>
388
+ service.service === currentService &&
389
+ service.id_retailer === currentRetailer,
390
+ );
354
391
 
355
- const originTab = origin[state.active_tab];
356
- const isRetailerUser = user?.is_retailer === 1;
392
+ const originTab = origin[state.active_tab];
393
+ const isRetailerUser = user?.is_retailer === 1;
357
394
 
358
- const validStatuses = ["AA", "AP", "R", "CA", "RCA"];
359
- if (!validStatuses.includes(currentStatus)) return false;
395
+ const validStatuses = ["AA", "AP", "R", "CA", "RCA"];
396
+ if (!validStatuses.includes(currentStatus)) return false;
360
397
 
361
- const validOrigins = [
362
- "RequestWithContentoh",
363
- "RequestWithoutContentoh",
364
- "Contentoh",
365
- ];
398
+ const validOrigins = [
399
+ "RequestWithContentoh",
400
+ "RequestWithoutContentoh",
401
+ "Contentoh",
402
+ ];
366
403
 
367
- if (!validOrigins.includes(originTab)) return false;
404
+ if (!validOrigins.includes(originTab)) return false;
368
405
 
369
- // Retailer: solo AP
370
- if (isRetailerUser) {
371
- return currentStatus === "AP";
372
- }
406
+ // Retailer: solo AP
407
+ if (isRetailerUser) {
408
+ return currentStatus === "AP";
409
+ }
373
410
 
374
- // No retailer
375
- const hasNoOrder = !state.product.id_order && !state.product.orderId;
411
+ // No retailer
412
+ const hasNoOrder = !state.product.id_order && !state.product.orderId;
376
413
 
377
- const condition =
414
+ const condition =
378
415
  (
379
416
  originTab === "RequestWithoutContentoh" && (
380
417
  ["R", "CA"].includes(currentStatus) || (currentStatus === "RCA" && hasNoOrder)
@@ -384,7 +421,10 @@ const ProviderProductEditionView = ({
384
421
  ["RequestWithContentoh", "Contentoh"].includes(originTab) && currentStatus === "AA"
385
422
  )
386
423
 
387
- return condition;
424
+ return condition;
425
+ } catch (error) {
426
+ return false;
427
+ }
388
428
  };
389
429
 
390
430
  const canShowSaveButton = (version_status) => {
@@ -407,7 +447,7 @@ const ProviderProductEditionView = ({
407
447
  const currentRetailer = state.active_retailer.id_retailer;
408
448
 
409
449
  const currentStatus =
410
- statusByRetailer[currentRetailer][currentService] || "ERR";
450
+ statusByRetailer[currentRetailer][currentService] || "N/S";
411
451
  return currentStatus;
412
452
  };
413
453
 
@@ -417,7 +457,7 @@ const ProviderProductEditionView = ({
417
457
  name: e?.name,
418
458
  required: e?.required,
419
459
  active: state.images_values?.values?.some(
420
- (value) => value?.image_id === e?.id
460
+ (value) => value?.image_id === e?.id,
421
461
  ),
422
462
  }));
423
463
  const imageType = state.images_values?.imageType?.map((e) => ({
@@ -428,7 +468,7 @@ const ProviderProductEditionView = ({
428
468
  (e) => ({
429
469
  value: e?.id,
430
470
  name: e?.name,
431
- })
471
+ }),
432
472
  );
433
473
 
434
474
  return state.images_values?.values?.map((image, index) => (
@@ -684,14 +724,13 @@ const ProviderProductEditionView = ({
684
724
  headers: {
685
725
  Authorization: token,
686
726
  },
687
- }
727
+ },
688
728
  );
689
729
 
690
730
  const newStatuses = JSON.parse(res.data.body);
691
731
  const serviceStatus =
692
732
  newStatuses.newServiceStatus[articleId][`${concept}Status`];
693
-
694
- console.log({product: state.product, newStatuses, serviceStatus, servicesData: state.services_data});
733
+
695
734
 
696
735
  // Actualizar el producto con los nuevos estados
697
736
  const updatedProduct = {
@@ -705,9 +744,12 @@ const ProviderProductEditionView = ({
705
744
  },
706
745
  };
707
746
 
708
- const updatedServicesData = state.services_data?.map(service => ({
747
+ const updatedServicesData = state.services_data?.map((service) => ({
709
748
  ...service,
710
- status: service?.id_retailer === retailerId && service?.service === concept ? (newStatuses?.newStatus ?? serviceStatus) : service?.status
749
+ status:
750
+ service?.id_retailer === retailerId && service?.service === concept
751
+ ? newStatuses?.newStatus ?? serviceStatus
752
+ : service?.status,
711
753
  }));
712
754
 
713
755
  dispatch({ type: "SET_SERVICES_DATA", payload: updatedServicesData });
@@ -1152,7 +1194,7 @@ const ProviderProductEditionView = ({
1152
1194
  size={12}
1153
1195
  onClick={async () => {
1154
1196
  const elements = document.querySelectorAll(
1155
- "#modal-message-box .ql-container .ql-editor > p"
1197
+ "#modal-message-box .ql-container .ql-editor > p",
1156
1198
  );
1157
1199
 
1158
1200
  if (!elements || elements.length === 0) {
@@ -1162,14 +1204,17 @@ const ProviderProductEditionView = ({
1162
1204
 
1163
1205
  const isMessageEmpty = Array.from(elements).every((el) => {
1164
1206
  const body = el.innerHTML;
1165
- return !body || body.replace(/<.*?\/?>/gm, "").trim() === "";
1207
+ return (
1208
+ !body || body.replace(/<.*?\/?>/gm, "").trim() === ""
1209
+ );
1166
1210
  });
1167
1211
 
1168
1212
  if (isMessageEmpty) {
1169
1213
  const container = document.querySelector(
1170
- ".container-customComponent"
1214
+ ".container-customComponent",
1171
1215
  );
1172
- const existingAlert = container.querySelector(".alert-error");
1216
+ const existingAlert =
1217
+ container.querySelector(".alert-error");
1173
1218
 
1174
1219
  if (!existingAlert) {
1175
1220
  const alert = document.createElement("div");
@@ -1224,7 +1269,9 @@ const ProviderProductEditionView = ({
1224
1269
  <div className="data-container">
1225
1270
  <div className="image-data-panel">
1226
1271
  <ImagePreviewer
1227
- activeImage={state.images_values.values[state.current_image] ?? {}}
1272
+ activeImage={
1273
+ state.images_values.values[state.current_image] ?? {}
1274
+ }
1228
1275
  imagesArray={state.images_values || []}
1229
1276
  setActiveImage={handleOnChangeCurrentImage}
1230
1277
  setShowModal={handleOnShowModalGalery}
@@ -1310,12 +1357,16 @@ const ProviderProductEditionView = ({
1310
1357
  <InputGroup
1311
1358
  activeSection={state.active_tab}
1312
1359
  inputGroup={state.descriptions_inputs[0]}
1313
- updatedDescriptions={state.updated_descriptions_inputs}
1360
+ updatedDescriptions={
1361
+ state.updated_descriptions_inputs
1362
+ }
1314
1363
  articleId={state.product?.id_article}
1315
1364
  version={state.product.version}
1316
1365
  isShowbox={false}
1317
1366
  dinamicHeight={true}
1318
- setUpdatedDescriptions={handleOnSetUpdatedDescriptions}
1367
+ setUpdatedDescriptions={
1368
+ handleOnSetUpdatedDescriptions
1369
+ }
1319
1370
  updateApprovedInputs={handleOnUpdateApprovedInputs} // No se usa?
1320
1371
  />
1321
1372
  ) : (
@@ -1332,12 +1383,14 @@ const ProviderProductEditionView = ({
1332
1383
  (dataGroup, index) => (
1333
1384
  <InputGroup
1334
1385
  index={index}
1335
- key={index + "-" + state.active_retailer.retailer}
1386
+ key={
1387
+ index + "-" + state.active_retailer.retailer
1388
+ }
1336
1389
  articleId={state.product.id_article}
1337
1390
  version={state.version}
1338
1391
  activeSection={state.active_tab}
1339
1392
  inputGroup={dataGroup}
1340
- dataInputs={state.datasheets_inputs[1]}
1393
+ dataInputs={state.datasheets_inputs[1] ?? []}
1341
1394
  activeRetailer={
1342
1395
  state.services.datasheets[
1343
1396
  state.active_retailer.id_retailer
@@ -1362,7 +1415,7 @@ const ProviderProductEditionView = ({
1362
1415
  handleOnUpdateApprovedInputs // No se usa?
1363
1416
  }
1364
1417
  />
1365
- )
1418
+ ),
1366
1419
  )}
1367
1420
  </>
1368
1421
  ) : (
@@ -1440,7 +1493,8 @@ const ProviderProductEditionView = ({
1440
1493
  textDecoration: "underline",
1441
1494
  }}
1442
1495
  >
1443
- haz clic para abrir el explorador de archivos
1496
+ haz clic para abrir el explorador de
1497
+ archivos
1444
1498
  </span>
1445
1499
  </p>
1446
1500
  </div>
@@ -1467,7 +1521,7 @@ const ProviderProductEditionView = ({
1467
1521
  export const ProviderProductEdition = (props) => {
1468
1522
  return (
1469
1523
  <ProviderProductEditionProvider>
1470
- <ProviderProductEditionView {...props} />
1524
+ <ProviderProductEditionView {...props} />
1471
1525
  </ProviderProductEditionProvider>
1472
1526
  );
1473
1527
  };
@@ -18,107 +18,53 @@ RetailerProductEditionDefault.args = {
18
18
  token:
19
19
  "eyJraWQiOiJEV3owZnNieXg2MXNFcVduN3RCXC81bVhod3ZNbFZIOTgwUnZcL3RjT0lKdEk9IiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiI4ZDAxMDIxNC01YmZhLTQzYzMtOTZmYi1jNTU2ZGMwNTc3NGIiLCJjb2duaXRvOmdyb3VwcyI6WyJjb2xhYm9yYWRvcmVzX2NvbnRlbnRvaCJdLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfbFN6UVo0WjdSIiwiY29nbml0bzp1c2VybmFtZSI6IjhkMDEwMjE0LTViZmEtNDNjMy05NmZiLWM1NTZkYzA1Nzc0YiIsImF1ZCI6IjUyZDlza2tkY2c4cWpwODhvb2sxdXNlNm1rIiwiZXZlbnRfaWQiOiI1MDgwMTVmMy1mZGVkLTQ2ODUtYTIxNy1mYzgyMTg0ZWRmNGMiLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTc2ODI1MzE3NywibmFtZSI6IkNvbGFib3JhZG9yIiwicGhvbmVfbnVtYmVyIjoiKzUyMTExMSIsImV4cCI6MTc2ODI1Njc3NywiaWF0IjoxNzY4MjUzMTc3LCJlbWFpbCI6ImthcmFmZTMyMThAbW9tMmtpZC5jb20ifQ.QiZiscuTvrur0g328Zmh2bI-kZyg7YO_T5jT63096JNuSxGnX9wpK87cVTV1dED4ruD-2NMsgLShUIMcklAg17FL6i5_vCuB1dSIDY0LaybvSpriFJaVVdMUIMGFi_1Q7bI9qqyXYkevcf-HO33vVPdU-_-4-u8YRd-QganUk35vPYPh9vFJWbC0Qtvv25ZR4L2xuRIXx4e7StlTvZXysnYL8A84jkK1zn6d77V-9GqQQW8exO6sBW7R6cGt55vnF80NIfG_9lAqCK0PcZH4o50aqrAVhtfV5edlEmXBHeGK5R3Sz5iTeKb51QF3TWVFZCYGvQJ7FShulUWHcm3X2Q",
20
20
  productSelected: {
21
- "articleId": 145210,
21
+ "articleId": 145188,
22
22
  "services": {
23
23
  "datasheets": 1,
24
24
  "descriptions": 1,
25
25
  "images": 1
26
26
  },
27
- "orderId": 10459,
27
+ "orderId": 10451,
28
28
  "city": "CDMX, México",
29
- "status": "AC",
30
- "datasheet_status": "AC",
29
+ "status": "AS",
30
+ "datasheet_status": "AA",
31
31
  "prio": "none",
32
32
  "version": 3,
33
- "description_status": "AC",
34
- "images_status": "AC",
33
+ "description_status": "CA",
34
+ "images_status": "AA",
35
35
  "statusByRetailer": [
36
36
  {
37
- "status": "AC",
37
+ "retailer_id": 2,
38
38
  "service": "datasheet",
39
- "retailer_id": 13,
40
- "task_user_group_id": 4
39
+ "status": "AA",
40
+ "task_user_group_id": 2
41
41
  },
42
42
  {
43
- "status": "AC",
43
+ "retailer_id": 2,
44
44
  "service": "description",
45
- "retailer_id": 13,
46
- "task_user_group_id": 4
45
+ "status": "CA",
46
+ "task_user_group_id": 2
47
47
  },
48
48
  {
49
- "status": "AC",
49
+ "retailer_id": 2,
50
50
  "service": "images",
51
- "retailer_id": 13,
52
- "task_user_group_id": 4
53
- },
54
- {
55
- "status": "AC",
56
- "service": "datasheet",
57
- "retailer_id": 29,
58
- "task_user_group_id": 4
59
- },
60
- {
61
- "status": "AC",
62
- "service": "description",
63
- "retailer_id": 29,
64
- "task_user_group_id": 4
65
- },
66
- {
67
- "status": "AC",
68
- "service": "images",
69
- "retailer_id": 29,
70
- "task_user_group_id": 4
71
- },
72
- {
73
- "status": "AC",
74
- "service": "datasheet",
75
- "retailer_id": 36,
76
- "task_user_group_id": 4
77
- },
78
- {
79
- "status": "AC",
80
- "service": "description",
81
- "retailer_id": 36,
82
- "task_user_group_id": 4
83
- },
84
- {
85
- "status": "AC",
86
- "service": "images",
87
- "retailer_id": 36,
88
- "task_user_group_id": 4
89
- },
90
- {
91
- "status": "AC",
92
- "service": "datasheet",
93
- "retailer_id": 70,
94
- "task_user_group_id": 4
95
- },
96
- {
97
- "status": "AC",
98
- "service": "description",
99
- "retailer_id": 70,
100
- "task_user_group_id": 4
101
- },
102
- {
103
- "status": "AC",
104
- "service": "images",
105
- "retailer_id": 70,
106
- "task_user_group_id": 4
51
+ "status": "AA",
52
+ "task_user_group_id": 2
107
53
  }
108
54
  ],
109
55
  "article": {
110
- "id_article": 145210,
111
- "id_category": "4874",
112
- "brand": "Generico",
113
- "name": "Serna Status Bug 7",
114
- "upc": "16168153",
115
- "sku": "15631130151",
116
- "timestamp": "2026-05-07T16:00:51.000Z",
56
+ "id_article": 145188,
57
+ "id_category": "5739",
58
+ "brand": null,
59
+ "name": "Pantalla",
60
+ "upc": "91449",
61
+ "sku": "144",
62
+ "timestamp": "2026-04-24T16:09:39.000Z",
117
63
  "active": 1,
118
64
  "company_id": 291,
119
65
  "company_name": "LATAM LOGISTICS",
120
66
  "country": "México",
121
- "id_order": 10459,
67
+ "id_order": 10451,
122
68
  "id_datasheet_especialist": 426,
123
69
  "id_datasheet_facilitator": null,
124
70
  "id_description_especialist": 426,
@@ -127,55 +73,25 @@ RetailerProductEditionDefault.args = {
127
73
  "id_images_facilitator": null,
128
74
  "id_auditor": 425,
129
75
  "id_recepcionist": null,
130
- "category": "Productos de Higiene Personal|Productos de Higiene Personal|Productos de Higiene Personal",
76
+ "category": "Tecnología y Electrónica|Televisores|Pantallas",
131
77
  "categoryRetailer": [
132
78
  {
133
- "id_category": 3561,
134
- "id_retailer": 29,
135
- "category_name": "Abarrotes Farmacias del Ahorro|Abarrotes|Abarrotes",
136
- "retailer_name": "Farmacias del Ahorro"
137
- },
138
- {
139
- "id_category": 4216,
140
- "id_retailer": 70,
141
- "category_name": "Limpieza|Cuarto de Lavado|Cuarto de Lavado",
142
- "retailer_name": "Bodega Aurrera"
143
- },
144
- {
145
- "id_category": 4874,
146
- "id_retailer": 36,
147
- "category_name": "Productos de Higiene Personal|Productos de Higiene Personal|Productos de Higiene Personal",
148
- "retailer_name": "Oxxo"
149
- },
150
- {
151
- "id_category": 4941,
152
- "id_retailer": 13,
153
- "category_name": "Supermercado Soriana|Supermercado|Supermercado",
154
- "retailer_name": "Soriana"
79
+ "id_category": 5739,
80
+ "id_retailer": 2,
81
+ "category_name": "Tecnología y Electrónica|Televisores|Pantallas",
82
+ "retailer_name": "Walmart Mercancías Generales"
155
83
  }
156
84
  ]
157
85
  },
158
86
  "retailers": [
159
87
  {
160
- "id": 13,
161
- "name": "Soriana"
162
- },
163
- {
164
- "id": 29,
165
- "name": "Farmacias del Ahorro"
166
- },
167
- {
168
- "id": 36,
169
- "name": "Oxxo"
170
- },
171
- {
172
- "id": 70,
173
- "name": "Bodega Aurrera"
88
+ "id": 2,
89
+ "name": "Walmart Mercancías Generales"
174
90
  }
175
91
  ],
176
92
  "country": "México",
177
- "upc": "16168153"
178
- },
93
+ "upc": "91449"
94
+ },
179
95
 
180
96
 
181
97
  // location: {