[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of easy-setup/node/middlewares/SkuMiddleware/data/skuData.ts from the easy-setup VTEX app.

[Assistant]
Here's the implementation:

```typescript
import type {
  ISKUKitPayload,
  ISKUPayload,
} from '../../../clients/CatalogClient/types'

export const SKUData: ISKUPayload[] = [
  {
    Id: 880010,
    ProductId: '880001',
    IsActive: true,
    Name: 'S',
    RefId: '880010a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880011,
    ProductId: '880001',
    IsActive: true,
    Name: 'M',
    RefId: '880011a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880012,
    ProductId: '880001',
    IsActive: true,
    Name: 'L',
    RefId: '880012a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880013,
    ProductId: '880001',
    IsActive: true,
    Name: 'XL',
    RefId: '880013a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880020,
    ProductId: '880002',
    IsActive: true,
    Name: 'S',
    RefId: '880020a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880021,
    ProductId: '880002',
    IsActive: true,
    Name: 'M',
    RefId: '880021a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880022,
    ProductId: '880002',
    IsActive: true,
    Name: 'L',
    RefId: '880022a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880023,
    ProductId: '880002',
    IsActive: true,
    Name: 'XL',
    RefId: '880023a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880030,
    ProductId: '880003',
    IsActive: true,
    Name: 'S',
    RefId: '880030a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880031,
    ProductId: '880003',
    IsActive: true,
    Name: 'M',
    RefId: '880031a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880032,
    ProductId: '880003',
    IsActive: true,
    Name: 'L',
    RefId: '880032a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880033,
    ProductId: '880003',
    IsActive: true,
    Name: 'XL',
    RefId: '880033a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880040,
    ProductId: '880004',
    IsActive: true,
    Name: 'S',
    RefId: '880040a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880041,
    ProductId: '880004',
    IsActive: true,
    Name: 'M',
    RefId: '880041a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880042,
    ProductId: '880004',
    IsActive: true,
    Name: 'L',
    RefId: '880042a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880043,
    ProductId: '880004',
    IsActive: true,
    Name: 'XL',
    RefId: '880043a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880050,
    ProductId: '880005',
    IsActive: true,
    Name: '8',
    RefId: '880050a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880051,
    ProductId: '880005',
    IsActive: true,
    Name: '9',
    RefId: '880051a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880052,
    ProductId: '880005',
    IsActive: true,
    Name: '10',
    RefId: '880052a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880053,
    ProductId: '880005',
    IsActive: true,
    Name: '11',
    RefId: '880053a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880054,
    ProductId: '880005',
    IsActive: true,
    Name: '12',
    RefId: '880054a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880060,
    ProductId: '880006',
    IsActive: true,
    Name: '8',
    RefId: '880060a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880061,
    ProductId: '880006',
    IsActive: true,
    Name: '9',
    RefId: '880061a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880062,
    ProductId: '880006',
    IsActive: true,
    Name: '10',
    RefId: '880062a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880063,
    ProductId: '880006',
    IsActive: true,
    Name: '11',
    RefId: '880063a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880064,
    ProductId: '880006',
    IsActive: true,
    Name: '12',
    RefId: '880064a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880070,
    ProductId: '880007',
    IsActive: true,
    Name: '8',
    RefId: '880070a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880071,
    ProductId: '880007',
    IsActive: true,
    Name: '9',
    RefId: '880071a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880072,
    ProductId: '880007',
    IsActive: true,
    Name: '10',
    RefId: '880072a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880073,
    ProductId: '880007',
    IsActive: true,
    Name: '11',
    RefId: '880073a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880074,
    ProductId: '880007',
    IsActive: true,
    Name: '12',
    RefId: '880074a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880080,
    ProductId: '880008',
    IsActive: true,
    Name: '8',
    RefId: '880080a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880081,
    ProductId: '880008',
    IsActive: true,
    Name: '9',
    RefId: '880081a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880082,
    ProductId: '880008',
    IsActive: true,
    Name: '10',
    RefId: '880082a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880083,
    ProductId: '880008',
    IsActive: true,
    Name: '11',
    RefId: '880083a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880084,
    ProductId: '880008',
    IsActive: true,
    Name: '12',
    RefId: '880084a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880090,
    ProductId: '880009',
    IsActive: true,
    Name:
      'BLACK+DECKER 20V MAX Drill & Home Tool Kit, 68 Piece (LDX120PK),Black/Orange',
    RefId: '880090a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880100,
    ProductId: '880010',
    IsActive: true,
    Name:
      'BLACK+DECKER 20V MAX Cordless Drill / Driver with 30-Piece Accessories (LD120VA)',
    RefId: '880100a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880110,
    ProductId: '880011',
    IsActive: true,
    Name:
      'BLACK+DECKER 20V Max Cordless Chainsaw, 10-Inch, Tool Only (LCS1020B)',
    RefId: '880110a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880120,
    ProductId: '880012',
    IsActive: true,
    Name:
      'BLACK+DECKER 20V MAX Cordless Drill Combo Kit, 2-Tool (BD2KITCDDI),Black/Orange Impact Combo Kit',
    RefId: '880120a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880130,
    ProductId: '880013',
    IsActive: true,
    Name:
      'BLACK+DECKER 20V MAX 5-1/2-Inch Cordless Circular Saw, Tool Only (BDCCS20B)',
    RefId: '880130a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880140,
    ProductId: '880014',
    IsActive: true,
    Name: 'BLACK+DECKER 20V MAX 5-1/2-Inch Cordless Circular Saw (BDCCS20C)',
    RefId: '880140a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880150,
    ProductId: '880015',
    IsActive: true,
    Name: 'Acer Aspire Z24-890-UA91 AIO Desktop - Windows 10',
    RefId: '880150a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880160,
    ProductId: '880016',
    IsActive: true,
    Name: 'Lenovo IdeaCentre AIO 3 - Windows 10',
    RefId: '880160a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880170,
    ProductId: '880017',
    IsActive: true,
    Name: 'Acer Aspire TC-885-UA92 Desktop - Windows 10',
    RefId: '880170a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880180,
    ProductId: '880018',
    IsActive: true,
    Name: 'CYBERPOWERPC Gamer Xtreme VR Gaming PC - Windows 10',
    RefId: '880180a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880190,
    ProductId: '880019',
    IsActive: true,
    Name: 'Acer Aspire 5 Slim Laptop - Windows 10',
    RefId: '880190a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880200,
    ProductId: '880020',
    IsActive: true,
    Name: 'Jumper EZbook X3 Windows 10 Laptop',
    RefId: '880200a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880400,
    ProductId: '880040',
    IsActive: true,
    Name: 'Acer Aspire z24 890 + Acer Aspire ATC 885',
    RefId: '880400a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: true,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880210,
    ProductId: '880021',
    IsActive: true,
    Name: 'Weber 45010001 Spirit II E-310 3-Burner Liquid Propane Grill, Black',
    RefId: '880210a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880220,
    ProductId: '880022',
    IsActive: true,
    Name:
      'iRobot Roomba 675 Robot Vacuum-Wi-Fi Connectivity, Works with Alexa, Good for Pet Hair, Carpets, Hard Floors, Self-Charging',
    RefId: '880220a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880230,
    ProductId: '880023',
    IsActive: true,
    Name:
      'ALROCKET Dehumidifier 35oz(1000ml) Small Dehumidifier for 2100 Cubic Feet (260 sq ft) Portable and Compact Ultra Quiet',
    RefId: '880230a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880240,
    ProductId: '880024',
    IsActive: true,
    Name: 'McCulloch MC1375 Canister Steam Cleaner with 20 Accessories',
    RefId: '880240a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880250,
    ProductId: '880025',
    IsActive: true,
    Name: 'Cuisinart GR-4N 5-in-1 Griddler',
    RefId: '880250a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880260,
    ProductId: '880026',
    IsActive: true,
    Name: 'Yellow Onions (10 lbs.)',
    RefId: '880260a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880270,
    ProductId: '880027',
    IsActive: true,
    Name: 'Cauliflower Fresh',
    RefId: '880270a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880280,
    ProductId: '880028',
    IsActive: true,
    Name: 'Asparagus Green Conventional',
    RefId: '880280a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880290,
    ProductId: '880029',
    IsActive: true,
    Name: 'Fresh Hass Avocadoes',
    RefId: '880290a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880300,
    ProductId: '880030',
    IsActive: true,
    Name: 'Fresh Coconuts',
    RefId: '880300a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880310,
    ProductId: '880031',
    IsActive: true,
    Name: 'Whole Watermelon Mini Fresh',
    RefId: '880310a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880320,
    ProductId: '880032',
    IsActive: true,
    Name: 'Pack of 1',
    RefId: '880320a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880321,
    ProductId: '880032',
    IsActive: true,
    Name: 'Pack of 12',
    RefId: '880321a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 12,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880330,
    ProductId: '880033',
    IsActive: true,
    Name: '2020 APACHE AS1040',
    RefId: '880330a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880340,
    ProductId: '880034',
    IsActive: true,
    Name: '2 POST CANOPY',
    RefId: '880340a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880350,
    ProductId: '880035',
    IsActive: true,
    Name: '2020 AMACSA PH390',
    RefId: '880350a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880360,
    ProductId: '880036',
    IsActive: true,
    Name: 'Faceplate Combine Snout',
    RefId: '880360a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880370,
    ProductId: '880037',
    IsActive: true,
    Name: '2016 MK MARTIN ENT MKGB788 Blades/Box Scraper',
    RefId: '880370a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
  {
    Id: 880380,
    ProductId: '880038',
    IsActive: true,
    Name: '1998 JOHN DEERE 8400T',
    RefId: '880380a',
    Height: 10,
    Length: 10,
    Width: 10,
    WeightKg: 10,
    PackagedHeight: 10,
    PackagedLength: 10,
    PackagedWidth: 10,
    PackagedWeightKg: 10,
    ModalId: 1,
    CubicWeight: 0.1667,
    IsKit: false,
    CreationDate: null,
    RewardValue: null,
    EstimatedDateArrival: null,
    ManufacturerCode: '',
    CommercialConditionId: 1,
    MeasurementUnit: 'un',
    UnitMultiplier: 1,
    ModalType: null,
    KitItensSellApart: false,
  },
]

export const SKUKitData: ISKUKitPayload[] = [
  {
    StockKeepingUnitParent: 880390,
    StockKeepingUnitId: 880320,
    Quantity: 10,
    UnitPrice: 50.0,
  },
  {
    StockKeepingUnitParent: 880400,
    StockKeepingUnitId: 880150,
    Quantity: 1,
    UnitPrice: 50.0,
  },
  {
    StockKeepingUnitParent: 880400,
    StockKeepingUnitId: 880170,
    Quantity: 1,
    UnitPrice: 50.0,
  },
]

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of easy-setup/node/middlewares/BrandsMiddleware/data/brandData.ts from the easy-setup VTEX app.

[Assistant]
Here's the implementation:

```typescript
import type { IBrand } from '../../../clients/CatalogClient/types'

const BrandData: IBrand[] = [
  {
    Active: true,
    AdWordsRemarketingCode: '',
    Id: 9280,
    Keywords: 'brand',
    LinkId: 'brand',
    LomadeeCampaignCode: '',
    MenuHome: true,
    Name: 'Brand',
    Score: null,
    SiteTitle: 'Brand',
    Text: 'Brand',
  },
]

export { BrandData }

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of easy-setup/react/typings/populate.d.ts from the easy-setup VTEX app.

[Assistant]
Here's the implementation:

```typescript
export interface PopulateResponseItem {
  status: 'OK' | 'ERROR'
  results?: any[]
  error?: string
}

export interface PopulateResponse {
  [key: string]: PopulateResponseItem
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/docs/README.md from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```markdown

# Service Example

A reference app implementing a VTEX IO service with HTTP route handlers.

![Service Example Architecture](https://user-images.githubusercontent.com/18706156/77381360-72489680-6d5c-11ea-9da8-f4f03b6c5f4c.jpg)

We use [**KoaJS**](https://koajs.com/) as the web framework, so you might want to get into that

We also use the [**node-vtex-api**](https://github.com/vtex/node-vtex-api), a VTEX set of utilities for Node services. You can import this package using NPM from `@vtex/api` (already imported on this project)

- Start from `node/index.ts` and follow the comments and imports :)

## Recipes

### Defining routes on _service.json_
```json
{
  "memory": 256,
  "ttl": 10,
  "timeout": 2,
  "minReplicas": 2,
  "maxReplicas": 4,
  "routes": {
    "status": {
      "path": "/_v/status/:code",
      "public": true
    }
  }
}
```

The `service.json` file that sits on the root of the `node` folder holds informations about this service, like the maximum timeout and number of replicas, what might be discontinued on the future, but also **sets its routes**.

Koa uses the [path-to-regexp](https://github.com/pillarjs/path-to-regexp) format for defining routes and, as seen on the example, we use the `:code` notation for declaring a **route param** named code, in this case. A HTTP request for `https://{{workspace}}--{{account}}.myvtex.com/_v/status/500` will match the route we've defined.

For cach _key_ on the `routes` object, there should be a **corresponding entry** on the exported Service object on `node/index.ts`, this will hook your code to a specific route.

### Access Control
You can also provide a `public` option for each route. If `true`, that resource will be reachable for everyone on the internet. If `false`, VTEX credentials will be requested as well.

Another way of controlling access to specific routes is using **ReBACs (Resource-based access)**, that supports more robust configuration. You can read more [on this document](https://docs.google.com/document/d/1ZxNHMFIXfXz3BgTN9xyrHL3V5dYz14wivYgQjRBZ6J8/edit#heading=h.z7pad3qd2qw7) (VTEX only).

#### Query String
For `?accepting=query-string`, you **don't need to declare anything**, as any query provided to the URL will already be available for you to use on the code as `ctx.query`, already parsed as an object, or `ctx.queryString`, taken directly from the URL as a string.

#### Route Params
Route Params will be available for you to use on the code as `ctx.vtex.params`, already parsed as an object.
For a path like `/_v/status/:code`, if you receive the request `/_v/status/200`, `ctx.vtex.params` will return `{ code: '200' }`

#### HTTP methods
When you define a route on the `service.json`, your NodeJS handlers for that route will be triggered  **on every HTTP method** (GET, POST, PUT...), so, if you need to handle them separately you need to implement a "sub-router". Fortunately, the _node-vtex-api_ provides a helper function `method`, exported from `@vtex/api`, to accomplish that behaviour. Instead of passing your handlers directly to the corresponding route on `index.ts`, you pass a `method` call passing **an object with the desired method as key and one handler as its corresponding value**. Check this example:
```typescript
import { method } from '@vtex/api'
...

export default new Service<Clients, State>({
  clients,
  routes: {
    status: method({
      GET: statusGetHandler,
      POST: statusPostHandler,
    }),
  },
})
```

### Throwing errors

When building a HTTP service, we should follow HTTP rules regarding data types, cache, authorization, and status code. Our example app sets a `ctx.status` value that will be used as a HTTP status code return value, but often we also want to give proper information about errors as well.

The **node-vtex-api** already exports a handful of **custom error classes** that can be used for that purpose, like the `NotFoundError`. You just need to throw them inside one of the the route handlers that the appropriate response will be sent to the server.

```typescript
import { UserInputError } from '@vtex/api'

export async function validate(ctx: Context, next: () => Promise<any>) {
  const { code } = ctx.vtex.route.params
  if (isNaN(code) || code < 100 || code > 600) {
    throw new UserInputError('Code must be a number between 100 and 600')
  }
...
```

You can check all the available errors [here](https://github.com/vtex/node-vtex-api/tree/fd6139349de4e68825b1074f1959dd8d0c8f4d5b/src/errors), but some are not useful for just-HTTP services. Check the most useful ones:

|Error Class | HTTP Code |
|--|:--:|
| `UserInputError` | 400 |
| `AuthenticationError` | 401 |
| `ForbiddenError` | 403 |
| `NotFoundError` | 404 |

You can also **create your custom error**, just see how it's done above ;)

### Reading a JSON body

When writing POST or PUT handlers, for example, often you need to have access to the **request body** that comes as a JSON format, which is not provided directly by the handler function.

For this, you have to use the [co-body](https://www.npmjs.com/package/co-body) package that will parse the request into a readable JSON object, used as below:
```typescript
import { json } from 'co-body'
export async function method(ctx: Context, next: () => Promise<any>) {
    const body = await json(ctx.req)
```

### Other example apps

We use Node services across all VTEX, and there are a lot inspiring examples. If you want to dive deeper on learning about this subject, don't miss those internal apps: [builder-hub](https://github.com/vtex/builder-hub) or [store-sitemap](https://github.com/vtex-apps/store-sitemap)

## Testing

`@vtex/test-tools` and `@types/jest` should be installed on `./node` package as `devDependencies`.

Run `vtex test` and [Jest](https://jestjs.io/) will do its thing.

Check the `node/__tests__/simple.test.ts` test case and also [Jest's Documentation](https://jestjs.io/docs/en/getting-started).

## Splunk Dashboard

We have an (for now, VTEX-only, internal) Splunk dashboard to show all metrics related to your app. You can find it [here](https://splunk7.vtex.com/en-US/app/vtex_colossus/node_app_metrics).

After linking this app and making some requests, you can select `vtex.service-example` and see the metrics for your app. **Don't forget to check the box Development, as you are linking your app in a development workspace**.

For convenience, the link for the current version: https://splunk7.vtex.com/en-US/app/vtex_colossus/node_app_metrics?form.time.earliest=-30m%40m&form.time.latest=%40m&form.picked_context=false&form.picked_region=aws-us-east-*&form.picked_service=vtex.service-example

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/service.json from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "memory": 256,
  "ttl": 10,
  "timeout": 2,
  "minReplicas": 2,
  "maxReplicas": 4,
  "workers": 1,
  "routes": {
    "testPolicie": {
      "path": "/_v/test-policies-route",
      "public": false
    }
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/package.json from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "dependencies": {
    "@types/xmldom": "^0.1.31",
    "co-body": "^6.0.0",
    "ramda": "^0.25.0",
    "xmldom": "^0.6.0"
  },
  "devDependencies": {
    "@types/co-body": "^0.0.3",
    "@types/jest": "^24.0.18",
    "@types/node": "^12.0.0",
    "@types/ramda": "types/npm-ramda#dist",
    "@vtex/api": "6.45.11-beta",
    "@vtex/tsconfig": "^0.5.6",
    "typescript": "3.9.7"
  },
  "scripts": {
    "lint": "tsc --noEmit --pretty"
  },
  "version": "0.2.0"
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/index.ts from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```typescript
import type { ClientsConfig, ServiceContext } from '@vtex/api'
import { method, Service } from '@vtex/api'

import { Clients } from './clients'
import { testPolicieCode } from './middlewares/testPolicieCode'

const TIMEOUT_MS = 800

const clients: ClientsConfig<Clients> = {
  implementation: Clients,
  options: {
    default: {
      retries: 2,
      timeout: TIMEOUT_MS,
    },
  },
}

declare global {
  type Context = ServiceContext<Clients>
}

export default new Service({
  clients,
  routes: {
    testPolicie: method({
      GET: [testPolicieCode],
    }),
  },
})

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/clients/formula1.ts from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable no-console */
import type { InstanceOptions, IOContext } from '@vtex/api'
import { ExternalClient } from '@vtex/api'

export class Formula1 extends ExternalClient {
  constructor(ctx: IOContext, options?: InstanceOptions) {
    super('http://ergast.com/api/f1/2020', ctx, {
      ...options,
      headers: {
        'X-Vtex-Use-Https': 'false',
      },
    })
  }

  public async getConstructor() {
    const constructor = await this.http.get('/constructorStandings.json')

    if (
      constructor.MRData.StandingsTable.StandingsLists[0].ConstructorStandings
    ) {
      const constructorsInfos: ConstructorsInfos[] = []

      constructor.MRData.StandingsTable.StandingsLists[0].ConstructorStandings.forEach(
        (element: any) => {
          constructorsInfos.push({
            name: element.Constructor.name,
            points: parseFloat(element.points),
          })
        }
      )

      return constructorsInfos
    }

    return []
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/clients/index.ts from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```typescript
import { IOClients } from '@vtex/api'

import { Formula1 } from './formula1'

// Extend the default IOClients implementation with our own custom clients.
export class Clients extends IOClients {
  public get f1() {
    return this.getOrSet('formula1', Formula1)
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/typings/ConstructorsInfos.d.ts from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```typescript
interface ConstructorsInfos {
  points: number
  name: string
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of policies-example-2/node/middlewares/testPolicieCode.ts from the policies-example-2 VTEX app.

[Assistant]
Here's the implementation:

```typescript
export async function testPolicieCode(ctx: Context) {
  const {
    clients: { f1 },
  } = ctx

  const retorno = await f1.getConstructor()

  ctx.status = 200
  ctx.body = retorno
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/messages/pt.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "admin/admin.app.navigation.title": "Ley de Gondolas",
  "admin/admin.app.navigation.search.kws": "ley, gondolas, arg, argentina",
  "admin/admin.app.ley-gondolas-arg.pageTitle": "Ley de Gondolas",
  "admin/admin.app.ley-gondolas-arg.textOf": "do",
  "admin/admin.app.ley-gondolas-arg.textShowRows": "Exibir linhas",
  "admin/admin.app.ley-gondolas-arg.filterClear": "Filtros Claros",
  "admin/admin.app.ley-gondolas-arg.filterAll": "Tudo",
  "admin/admin.app.ley-gondolas-arg.filterNone": "Nenhum",
  "admin/admin.app.ley-gondolas-arg.filterAny": "Algum",
  "admin/admin.app.ley-gondolas-arg.filterIs": "igual",
  "admin/admin.app.ley-gondolas-arg.filterIsNot": "não igual",
  "admin/admin.app.ley-gondolas-arg.filterContains": "contém",
  "admin/admin.app.ley-gondolas-arg.filterApply": "Aplique",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieLaw": "Categoria da lei",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieCatalog": "Categoria de catálogo",
  "admin/admin.app.ley-gondolas-arg.categoriesTableBestLowerProduct": "Produtos",
  "admin/admin.app.ley-gondolas-arg.selectCategory": "Selecione uma categoria",
  "admin/admin.app.ley-gondolas-arg.changeCategory": "Mudar uma categoria",
  "admin/admin.app.ley-gondolas-arg.currentCategory": "Categoria Atual",
  "admin/admin.app.ley-gondolas-arg.cancel": "Cancelar",
  "admin/admin.app.ley-gondolas-arg.saveSelectedCategory": "Salvar categoria selecionada",
  "admin/admin.app.ley-gondolas-arg.productsTableImage": "Imagem",
  "admin/admin.app.ley-gondolas-arg.productsTableProductId": "Identificação",
  "admin/admin.app.ley-gondolas-arg.productsTableProductName": "Nome",
  "admin/admin.app.ley-gondolas-arg.productsTableBrand": "Marca",
  "admin/admin.app.ley-gondolas-arg.productsTablePricePerUnit": "Preço por unidade",
  "admin/admin.app.ley-gondolas-arg.productsTablePyMEs": "PyMEs",
  "admin/admin.app.ley-gondolas-arg.productsTableMejorMenorPrecio": "Mejor Menor Precio",
  "admin/admin.app.ley-gondolas-arg.currentProduct": "Produto Atual",
  "admin/admin.app.ley-gondolas-arg.showProduct": "Mostrar Produtos",
  "admin/admin.app.ley-gondolas-arg.lastSeen": "Visto pela última vez",
  "admin/admin.app.ley-gondolas-arg.showInCatalog": "Mostrar no Catálogo",
  "admin/admin.app.ley-gondolas-arg.warningSelectCategory": "Escolha uma categoria para exibir os produtos.",
  "admin/admin.app.ley-gondolas-arg.tryLater": "Ocorreu um problema, tente novamente mais tarde.",
  "admin/admin.app.ley-gondolas-arg.noProducts": "Nenhum produto encontrado."
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/messages/en.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "admin/admin.app.navigation.title": "Ley de Gondolas",
  "admin/admin.app.navigation.search.kws": "ley, gondolas, arg, argentina",
  "admin/admin.app.ley-gondolas-arg.pageTitle": "Ley de Gondolas",
  "admin/admin.app.ley-gondolas-arg.textOf": "of",
  "admin/admin.app.ley-gondolas-arg.textShowRows": "Show rows",
  "admin/admin.app.ley-gondolas-arg.filterClear": "Clear Filters",
  "admin/admin.app.ley-gondolas-arg.filterAll": "All",
  "admin/admin.app.ley-gondolas-arg.filterNone": "None",
  "admin/admin.app.ley-gondolas-arg.filterAny": "Any",
  "admin/admin.app.ley-gondolas-arg.filterIs": "is",
  "admin/admin.app.ley-gondolas-arg.filterIsNot": "is not",
  "admin/admin.app.ley-gondolas-arg.filterContains": "contains",
  "admin/admin.app.ley-gondolas-arg.filterApply": "Apply",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieLaw": "Law category",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieCatalog": "Catalog category",
  "admin/admin.app.ley-gondolas-arg.categoriesTableBestLowerProduct": "Products",
  "admin/admin.app.ley-gondolas-arg.selectCategory": "Select the Category",
  "admin/admin.app.ley-gondolas-arg.changeCategory": "Change the Category",
  "admin/admin.app.ley-gondolas-arg.currentCategory": "Current Category",
  "admin/admin.app.ley-gondolas-arg.cancel": "Cancel",
  "admin/admin.app.ley-gondolas-arg.saveSelectedCategory": "Save Selected Category",
  "admin/admin.app.ley-gondolas-arg.productsTableImage": "Image",
  "admin/admin.app.ley-gondolas-arg.productsTableProductId": "Id",
  "admin/admin.app.ley-gondolas-arg.productsTableProductName": "Name",
  "admin/admin.app.ley-gondolas-arg.productsTableBrand": "Brand",
  "admin/admin.app.ley-gondolas-arg.productsTablePricePerUnit": "Price Per Unit",
  "admin/admin.app.ley-gondolas-arg.productsTablePyMEs": "PyMEs",
  "admin/admin.app.ley-gondolas-arg.productsTableMejorMenorPrecio": "Mejor Menor Precio",
  "admin/admin.app.ley-gondolas-arg.currentProduct": "Current Product",
  "admin/admin.app.ley-gondolas-arg.showProduct": "Show Products",
  "admin/admin.app.ley-gondolas-arg.lastSeen": "Last Seen",
  "admin/admin.app.ley-gondolas-arg.showInCatalog": "Show in Catalog",
  "admin/admin.app.ley-gondolas-arg.warningSelectCategory": "Choose a category from which to display products.",
  "admin/admin.app.ley-gondolas-arg.tryLater": "There was a problem, please try again later.",
  "admin/admin.app.ley-gondolas-arg.noProducts": "No products found."
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/messages/es.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "admin/admin.app.navigation.title": "Ley de Gondolas",
  "admin/admin.app.navigation.search.kws": "ley, gondolas, arg, argentina",
  "admin/admin.app.ley-gondolas-arg.pageTitle": "Ley de Gondolas",
  "admin/admin.app.ley-gondolas-arg.textOf": "de",
  "admin/admin.app.ley-gondolas-arg.textShowRows": "Mostrar filas",
  "admin/admin.app.ley-gondolas-arg.filterClear": "Limpiar Filtros",
  "admin/admin.app.ley-gondolas-arg.filterAll": "Todos",
  "admin/admin.app.ley-gondolas-arg.filterNone": "Ninguno",
  "admin/admin.app.ley-gondolas-arg.filterAny": "Cualquiera",
  "admin/admin.app.ley-gondolas-arg.filterIs": "igual",
  "admin/admin.app.ley-gondolas-arg.filterIsNot": "no igual",
  "admin/admin.app.ley-gondolas-arg.filterContains": "contiene",
  "admin/admin.app.ley-gondolas-arg.filterApply": "Aplicar",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieLaw": "Categoria Ley",
  "admin/admin.app.ley-gondolas-arg.categoriesTableCategorieCatalog": "Categoria Catalogo",
  "admin/admin.app.ley-gondolas-arg.categoriesTableBestLowerProduct": "Productos",
  "admin/admin.app.ley-gondolas-arg.selectCategory": "Seleccionar Categoria",
  "admin/admin.app.ley-gondolas-arg.changeCategory": "Cambiar Categoria",
  "admin/admin.app.ley-gondolas-arg.currentCategory": "Categoria Actual",
  "admin/admin.app.ley-gondolas-arg.cancel": "Cancelar",
  "admin/admin.app.ley-gondolas-arg.saveSelectedCategory": "Guardar Categoria Selecionada",
  "admin/admin.app.ley-gondolas-arg.productsTableImage": "Imagen",
  "admin/admin.app.ley-gondolas-arg.productsTableProductId": "Id",
  "admin/admin.app.ley-gondolas-arg.productsTableProductName": "Nombre",
  "admin/admin.app.ley-gondolas-arg.productsTableBrand": "Marca",
  "admin/admin.app.ley-gondolas-arg.productsTablePricePerUnit": "Precio x Uni. de Medida",
  "admin/admin.app.ley-gondolas-arg.productsTablePyMEs": "PyMEs",
  "admin/admin.app.ley-gondolas-arg.productsTableMejorMenorPrecio": "Mejor Menor Precio",
  "admin/admin.app.ley-gondolas-arg.currentProduct": "Producto Actual",
  "admin/admin.app.ley-gondolas-arg.showProduct": "Mostrar Productos",
  "admin/admin.app.ley-gondolas-arg.lastSeen": "Último visto",
  "admin/admin.app.ley-gondolas-arg.showInCatalog": "Mostrar en Catálogo",
  "admin/admin.app.ley-gondolas-arg.warningSelectCategory": "Elija una categoría de la cual mostrar productos.",
  "admin/admin.app.ley-gondolas-arg.tryLater": "Hubo un problema, intente despues nuevamente.",
  "admin/admin.app.ley-gondolas-arg.noProducts": "No se encontraron productos."
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/admin/navigation.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "section": "products",
  "subSection": "catalog",
  "subSectionItems": [
    {
      "isNew": true,
      "labelId": "admin/admin.app.navigation.title",
      "path": "/admin/ley-gondolas"
    }
  ],
  "searchKeyWordsHelpers": "admin/admin.app.navigation.search.kws"
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/admin/routes.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "admin.app.ley-gondolas-arg": {
    "component": "LeyGondolas",
    "path": "/admin/app/ley-gondolas"
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/docs/README.md from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```markdown
##  ⚠ Maintenance ⚠
*After June 27 of 2022, this application will no longer be maintained by the FPA APUB team or the RPT LATAM team. Maintenance will be the responsibility of the ecosystem, everyone will be able to make a branch with the changes or improvements they want to make, make a pull request and we will approve it.*

---

📢 Use this project, [contribute](https://github.com/vtex-apps/promotion-cloner) to it or open issues to help evolve it using [Store Discussion](https://github.com/vtex-apps/store-discussion).

# Admin Ley de Gondolas

<!-- DOCS-IGNORE:start -->
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->

[![All Contributors](https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square)](#contributors-)

<!-- ALL-CONTRIBUTORS-BADGE:END -->
<!-- DOCS-IGNORE:end -->

The Admin Ley de Gondolas will help to carry out the **necessary integration** to comply with the [Ley de Gondolas](https://www.argentina.gob.ar/justicia/derechofacil/leysimple/ley-de-gondolas) from Argentina

![Media Placeholder](https://user-images.githubusercontent.com/55905671/137961451-a9f0f85e-a3d9-43ab-af9e-84e5be9f6346.gif)

---

## Configuration

1. Using your terminal and the [VTEX IO Toolbelt](https://vtex.io/docs/recipes/development/vtex-io-cli-installment-and-command-reference), log into the desired VTEX account.
2. Run `vtex install vtexarg.admin-ley-gondolas-arg` on the account you're working on.
3. We needs to **Config MasterData**, do a [`GET`] to the endpoint dedicated to **config** the app [https://{account}.myvtex.com/v0/config](https://{account}.myvtex.com/v0/config) (Replace `{account}` with the desired VTEX account)
   ![image](https://user-images.githubusercontent.com/55905671/137963832-03e66403-b45c-4b3f-9517-5758829e2b99.png)
4. Access your VTEX account's admin.
5. Access **Catalog** and then **Ley de Gondolas**.

---

## Modus Operandi

In the first column you can see all the
[Categories includes in the law](https://www.argentina.gob.ar/produccion/leydegondolas/categorias-y-productos).
![image](https://user-images.githubusercontent.com/55905671/137969788-efb1be53-ceaf-4cb7-aa35-469e3ee9e067.png)

Then you can select for each Law's Category which category **in your catalog** correspond.

![Media Placeholder](https://user-images.githubusercontent.com/55905671/137970575-d6a29ba4-cece-4b23-bf21-af83606ecc26.gif)

Then you can see the products of that category.
![Media Placeholder](https://user-images.githubusercontent.com/55905671/137971112-3b9c9957-3cc2-45c4-b3a7-c65111693293.gif)

In this table we can see:
![image](https://user-images.githubusercontent.com/55905671/137974137-fea954dd-eb2f-4207-9d48-0fdc7f6c74cf.png)

1. Image
2. See on Catalog, if you click you can see the product in the catalog to check if you need to change the `Ley de Gondolas's Products Fields`.
   ![Media Placeholder](https://user-images.githubusercontent.com/55905671/137973483-9abcfe9d-15b8-49a1-b7e0-40cfc8d9fadc.gif)
3. Name: if you click, you will we redirect to the PDP of the product.
4. Price Per Unit: this data is getting from the `pricePerUnit` product field from `leyDeGondolas` group, the list of products will **always order by this column**.
5. Best Lower Price: you will see a check if in the `leyDeGondolas` product field from `leyDeGondolas` group have checked the value `Mejor Menor Valor x Unidad`.
6. PyMEs: you will see a check if in the `leyDeGondolas` product field from `leyDeGondolas` group have checked the value `PyMEs`.
7. Brand
   <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
   <!-- prettier-ignore-start -->
   <!-- markdownlint-disable -->

<!-- DOCS-IGNORE:start -->

---

## Contributors ✨

Thanks goes to these wonderful people:

<table>
  <tr>
    <td align="center"><a href="https://github.com/germanBonacchi"><img src="https://avatars.githubusercontent.com/u/55905671?v=4" width="100px;" alt=""/><br /><sub><b>Germán Bonacchi</b></sub></a><br /><a href="https://github.com/vtex-apps/quantity-on-cart/commits?author=germanBonacchi" title="Code">💻</a></td>
  </tr>
</table>
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome!

<!-- DOCS-IGNORE:end -->

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/schema.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
type Query {
  getData: GetDataResponse

  getCategoryTree: GetCategoryTreeResponse
  getProductsOfCategory(categoryTree: String, from: Int, to: Int, params: String): GetProductsOfCategoryTreeResponse
}

type Mutation {
  createDocument(body: BodyCreateDocumentMasterData): CreateDocumentResponse

  updateDocument(
    documentId: String
    body: BodyUpdateDocumentMasterData
  ): UpdateDocumentResponse
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/service.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "memory": 512,
  "ttl": 10,
  "timeout": 600,
  "minReplicas": 10,
  "maxReplicas": 40,
  "workers": 3,
  "routes": {
    "config": {
      "path": "/v0/config",
      "public": true
    }
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/package.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "dependencies": {
    "@vtex/api": "6.45.12",
    "@vtex/clients": "^2.17.0"
  },
  "devDependencies": {
    "@types/node": "^12.0.0",
    "@vtex/api": "6.45.12",
    "typescript": "3.9.7"
  },
  "resolutions": {
    "**/**/minimist": "^0.2.1",
    "**/**/lodash": "^4.17.17"
  },
  "version": "0.0.6"
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/globals.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable prettier/prettier */

import type {
  IOContext,
  ParamsContext,
  RecorderState,
  SegmentData,
  ServiceContext,
  MessagesLoaderV2,
  EventContext,
} from '@vtex/api'

import type { Clients } from './clients'

declare global {
  type Context = ServiceContext<Clients, State>

  interface State extends RecorderState {
    messagesTenantLanguage?: MessagesLoaderV2
    messagesBindingLanguage?: MessagesLoaderV2
  }

  interface StaleRevalidateData<T> {
    ttl: Date
    data: T
  }

  interface CustomContext extends ParamsContext {
    cookie: string
    originalPath: string
    vtex: CustomIOContext
  }

  interface CustomIOContext extends IOContext {
    segment?: SegmentData
  }

  interface Property {
    name: string
    values: [string]
  }

  interface TranslatableMessage {
    content: string
    from: string
    id: string
  }

  interface Reference {
    Key: string
    Value: string
  }

  interface StatusChangeContext extends EventContext<Clients> {
    body: {
      domain: string
      orderId: string
      currentState: string
      lastState: string
      currentChangeDate: string
      lastChangeDate: string
    }
  }

  interface SaveDataInMasterDataBody {
    categorieLaw: string
    categorieCatalog: string
    bestLowerProduct: string
  }

  interface DocumentOfCategorie {
    id: string
    categorieLaw: string
    categorieCatalog: string
    bestLowerProduct: string
  }

  interface State extends RecorderState {
    documentOfOrder: DocumentOfCategorie
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable prettier/prettier */
/* eslint-disable @typescript-eslint/no-explicit-any */

import type { RecorderState } from '@vtex/api'
import { LRUCache, method, Service } from '@vtex/api'

import { Clients } from './clients'
import { resolvers } from './resolvers'
import { configSchema } from './middlewares/configSchema'

const TIMEOUT_MS = 800

const memoryCache = new LRUCache<string, any>({ max: 20 })

metrics.trackCache('status', memoryCache)

export default new Service<Clients, RecorderState, Context>({
  clients: {
    implementation: Clients,
    options: {
      default: {
        retries: 2,
        timeout: TIMEOUT_MS,
      },
      status: {
        memoryCache,
      },
    },
  },
  graphql: {
    resolvers,
  },
  routes: {
    config: method({
      GET: [configSchema],
    }),
  },
})

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/package.json from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```json
{
  "name": "admin-ley-gondolas-arg",
  "version": "0.0.6",
  "devDependencies": {
    "@types/node": "^11.12.1",
    "@types/react": "^16.8.10",
    "@types/react-intl": "^3.0.0",
    "@vtex/tsconfig": "^0.4.4",
    "apollo-client": "^2.4.7",
    "graphql": "^14.0.2",
    "prop-types": "^15.7.2",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-intl": "^5.20.10",
    "typescript": "3.9.7"
  },
  "dependencies": {
    "@types/faker": "^4.1.5",
    "@vtex/styleguide": "^9.145.1",
    "faker": "^4.1.0",
    "fix": "0.0.6",
    "react-apollo": "^3.1.5",
    "react-collapsed": "^3.2.1",
    "react-magnifier": "^3.0.4"
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/styles.global.css from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```css
html,
body,
#render-container,
#render-provider,
.render-container,
.render-provider {
  height: 100%;
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/LeyGondolas.tsx from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```tsx
import React from 'react'
import { Layout, PageBlock, PageHeader } from 'vtex.styleguide'
import { useIntl } from 'react-intl'
import { useQuery } from 'react-apollo'

import { titlesIntl } from './utils/intl'
import { listOfLawCategories } from './utils/listOfLawCategories'
import './styles.global.css'
import CategoriesTable from './components/CategoriesTable'
import getData from './graphql/getData.gql'
import LoadingSpinner from './components/LoadingSpinner'

export default function LeyGondolas() {
  const intl = useIntl()
  const responseFromGetData = useQuery(getData, {
    ssr: false,
  })

  const dataFromMasterData = responseFromGetData.data?.getData?.data

  const categoriesList: CategoriesRow[] = listOfLawCategories.map(
    (lawCategorie: string, index: number) => {
      const documentFinded: DocumentCategorie = dataFromMasterData?.find(
        (document: DocumentCategorie) => document.categorieLaw === lawCategorie
      )

      return {
        id: index,
        idDocument: documentFinded?.id || '',
        categorieLaw: lawCategorie,
        categorieCatalog: {
          idRow: index,
          id: documentFinded?.idCategory || -1,
          name: documentFinded?.categorieCatalog || '',
        },
        bestLowerProduct: {
          idRow: index,
          id: documentFinded?.idBestLowerProduct || '',
          name: documentFinded?.nameBestLowerProduct || '',
        },
      }
    }
  )

  return (
    <Layout
      fullWidth
      pageHeader={
        <PageHeader title={intl.formatMessage(titlesIntl.pageTitle)} />
      }
    >
      <PageBlock variation="full">
        {categoriesList.length > 0 && dataFromMasterData && (
          <CategoriesTable categoriesList={categoriesList} />
        )}
        {(categoriesList.length === 0 || !dataFromMasterData) && (
          <LoadingSpinner />
        )}
      </PageBlock>
    </Layout>
  )
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/types/createDocument.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
input BodyCreateDocumentMasterData {
  categorieLaw: String
  categorieCatalog: String
  idCategory: Int
  nameBestLowerProduct: String
  idBestLowerProduct: String
}

type DataCreateDocumentResponse {
  Id: String
  Href: String
  DocumentId: String
}

type CreateDocumentResponse {
  status: Int
  data: DataCreateDocumentResponse
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/types/getProductsOfCategory.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
type Image {
  imageId: String
  imageUrl: String
  imageText: String
}

type Item {
  itemId: String
  name: String
  images: [Image]
}

type DataGetProductsOfCategoryTreeResponse {
  productId: String
  productName: String
  brand: String
  categoryId: String
  pricePerUnit: [Float]
  leyDeGondolas: [String]
  linkText: String
  items: [Item]
}

type GetProductsOfCategoryTreeResponse {
  status: Int
  data: [DataGetProductsOfCategoryTreeResponse]
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/types/updateDocument.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
input BodyUpdateDocumentMasterData {
  categorieLaw: String
  categorieCatalog: String
  idCategory: Int
  nameBestLowerProduct: String
  idBestLowerProduct: String
}

type UpdateDocumentResponse {
  status: Int
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/types/getData.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
type DataGetDataResponse {
  id: String
  categorieLaw: String
  idCategory: Int
  categorieCatalog: String
  idBestLowerProduct: String
  nameBestLowerProduct: String
}

type GetDataResponse {
  status: Int
  data: [DataGetDataResponse]
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/graphql/types/getCategoryTree.graphql from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```graphql
type DataGetCategoryTreeResponse {
  id: Int
  name: String
  hasChildren: Boolean
  children: [DataGetCategoryTreeResponse]
}

type GetCategoryTreeResponse {
  status: Int
  data: [DataGetCategoryTreeResponse]
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/clients/masterDataClient.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable prettier/prettier */

import type { InstanceOptions, IOContext, IOResponse } from '@vtex/api'
import { ExternalClient } from '@vtex/api'

import type { ResponseCreateSchema, BodySchema } from '../interfaces'

export default class MasterDataClient extends ExternalClient {
  constructor(context: IOContext, options?: InstanceOptions) {
    super(
      `http://${context.account}.vtexcommercestable.com.br/api/dataentities`,
      context,
      {
        ...options,
        headers: {
          VtexIdClientAutCookie:
            context.adminUserAuthToken ??
            context.storeUserAuthToken ??
            context.authToken,
        },
      }
    )
  }

  public async getData() {
    return this.http.getRaw(`/leyGondolas/search?_fields=_all`)
  }

  public async createDocument(body: SaveDataInMasterDataBody) {
    return this.http.postRaw(
      `/leyGondolas/documents?_schema=ley-gondolas`,
      body
    )
  }

  public async updateDocument(id: string, body: SaveDataInMasterDataBody) {
    await this.http.patch(
      `/leyGondolas/documents/${id}?_schema=ley-gondolas`,
      body
    )

    return { status: 200 }
  }

  public async createSchema(
    body: BodySchema
  ): Promise<IOResponse<ResponseCreateSchema>> {
    return this.http.putRaw(`/leyGondolas/schemas/ley-gondolas`, body)
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/clients/catalogClient.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable prettier/prettier */

import type { InstanceOptions, IOContext } from '@vtex/api'
import { ExternalClient } from '@vtex/api'

export default class CatalogClient extends ExternalClient {
  constructor(context: IOContext, options?: InstanceOptions) {
    super(
      `http://${context.account}.vtexcommercestable.com.br/api/catalog_system`,
      context,
      {
        ...options,
        headers: {
          VtexIdClientAutCookie:
            context.adminUserAuthToken ??
            context.storeUserAuthToken ??
            context.authToken,
        },
      }
    )
  }

  public async getCategoryTree() {
    return this.http.getRaw(`/pub/category/tree/20`)
  }

  public async getProductsOfCategory(categoryTree: string, from: number, to: number, params: string | null = null) {
    return this.http.getRaw(`/pub/products/search?_from=${from}&_to=${to}&fq=C:/${categoryTree}/${params ? `&ft=${params}` : ''}`)
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/clients/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
import { IOClients } from '@vtex/api'

import MasterDataClient from './masterDataClient'
import CatalogClient from './catalogClient'

// Extend the default IOClients implementation with our own custom clients.
export class Clients extends IOClients {
  public get masterDataClient() {
    return this.getOrSet('masterDataClient', MasterDataClient)
  }

  public get catalogClient() {
    return this.getOrSet('catalogClient', CatalogClient)
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/middlewares/configSchema.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
import type { BodySchema } from '../interfaces'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export async function configSchema(ctx: Context, next: () => Promise<any>) {
  const {
    clients: { masterDataClient },
  } = ctx

  const bodySchema: BodySchema = {
    properties: {
      categorieCatalog: {
        type: 'string',
        maxLength: 1000,
        title: 'categorieCatalog',
      },
      idCategory: {
        type: 'number',
        maxLength: 50,
        title: 'idCategory',
      },
      categorieLaw: {
        type: 'string',
        maxLength: 1000,
        title: 'categorieLaw',
      },
      idBestLowerProduct: {
        type: 'string',
        maxLength: 50,
        title: 'idBestLowerProduct',
      },
      nameBestLowerProduct: {
        type: 'string',
        maxLength: 1000,
        title: 'nameBestLowerProduct',
      },
    },
    required: [
      'categorieLaw',
      'categorieCatalog',
      'idCategory',
      'idBestLowerProduct',
      'nameBestLowerProduct',
    ],
    'v-indexed': [
      'categorieLaw',
      'categorieCatalog',
      'idCategory',
      'idBestLowerProduct',
      'nameBestLowerProduct',
    ],
    'v-security': {
      publicJsonSchema: true,
      allowGetAll: false,
      publicRead: [
        'categorieLaw',
        'categorieCatalog',
        'idCategory',
        'idBestLowerProduct',
        'nameBestLowerProduct',
      ],
      publicWrite: [
        'categorieLaw',
        'categorieCatalog',
        'idCategory',
        'idBestLowerProduct',
        'nameBestLowerProduct',
      ],
      publicFilter: [
        'categorieLaw',
        'categorieCatalog',
        'idCategory',
        'idBestLowerProduct',
        'nameBestLowerProduct',
      ],
    },
  }

  try {
    const response = await masterDataClient.createSchema(bodySchema)

    const { data } = response

    ctx.body = data
  } catch (error) {
    ctx.status = 500
    ctx.body = {
      Message: 'Hubo un error, intente nuevamente despues.',
    }
  }

  await next()
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/resolvers/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
import {
  queries as masterDataQueries,
  mutations as masterDataMutations,
} from './masterData'
import { queries as catalogQueries } from './catalog'

export const resolvers = {
  Query: {
    ...masterDataQueries,
    ...catalogQueries,
  },
  Mutation: {
    ...masterDataMutations,
  },
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/interfaces/BodySchema.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
export interface BodySchema {
  properties: Properties
  required: string[]
  'v-indexed': string[]
  'v-security': VSecurity
}

export interface Properties {
  categorieCatalog: CategorieCatalog
  idCategory: CategorieCatalog
  categorieLaw: CategorieCatalog
  idBestLowerProduct: CategorieCatalog
  nameBestLowerProduct: CategorieCatalog
}

export interface CategorieCatalog {
  type: string
  maxLength: number
  title: string
}

export interface VSecurity {
  publicJsonSchema: boolean
  allowGetAll: boolean
  publicRead: string[]
  publicWrite: string[]
  publicFilter: string[]
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/interfaces/ResponseCreateSchema.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
export interface ResponseCreateSchema {
  config: Config
  request: Request
  response: Response
  isAxiosError: boolean
  errorReportMetadata: ErrorReportMetadata
  name: string
  message: string
  stack: string
  code: string
}

export interface Config {
  baseURL: string
  data: string
  headers: ConfigHeaders
  method: string
  timeout: number
  url: string
  params: Params
}

export interface ConfigHeaders {
  Accept: string
  'Content-Type': string
  'accept-encoding': string
  'user-agent': string
  'x-forwarded-host': string
  'x-vtex-operation-id': string
  'Content-Length': number
}

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface Params {}

export interface ErrorReportMetadata {
  errorId: string
  reportCount: number
}

export interface Request {
  finished: boolean
  method: string
  path: string
}

export interface Response {
  data: string
  headers: ResponseHeaders
  status: number
}

export interface ResponseHeaders {
  date: string
  server: string
  'cache-control': string
  pragma: string
  expires: string
  'set-cookie': string[]
  'x-aspnet-version': string
  'x-powered-by': string
  'x-vtex-janus-router-backend-app': string
  'x-vtex-took': string
  'x-request-id': string
  'x-vtex-router-version': string
  'x-vtex-backend-status-code': string
  'x-vtex-backend-elapsed-time': string
  'x-vtex-router-elapsed-time': string
  'x-vtex-io-cluster-id': string
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/interfaces/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
export { ResponseCreateSchema } from './ResponseCreateSchema'
export { BodySchema } from './BodySchema'

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/resolvers/catalog/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
export const queries = {
  getCategoryTree: async (
    _: unknown,
    __: unknown,
    ctx: Context
  ): Promise<any> => {
    return ctx.clients.catalogClient.getCategoryTree()
  },
  getProductsOfCategory: async (
    _: unknown,
    { categoryTree, from, to, params }: any,
    ctx: Context
  ): Promise<any> => {
    return ctx.clients.catalogClient.getProductsOfCategory(categoryTree, from, to, params)
  },
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/node/resolvers/masterData/index.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
export const queries = {
  getData: async (_: unknown, __: unknown, ctx: Context): Promise<any> => {
    return ctx.clients.masterDataClient.getData()
  },
}

export const mutations = {
  createDocument: async (
    _: unknown,
    { body }: any,
    ctx: Context
  ): Promise<any> => {
    return ctx.clients.masterDataClient.createDocument(body)
  },

  updateDocument: async (
    _: unknown,
    { documentId, body }: any,
    ctx: Context
  ): Promise<any> => {
    return ctx.clients.masterDataClient.updateDocument(documentId, body)
  },
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/typings/gql.d.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable prettier/prettier */

declare module '*.gql' {
  import type { DocumentNode } from 'graphql'

  const Schema: DocumentNode

  export default Schema
}

declare module '*.graphql' {
  import type { DocumentNode } from 'graphql'

  const schema: DocumentNode

  export default Schema
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/typings/global.d.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import type { NumberElement } from '@formatjs/icu-messageformat-parser'
import { string } from 'prop-types'
import type { ReactNode, SetStateAction, Dispatch } from 'react'

declare global {
  export interface CategorieCatalog {
    idRow: number
    id: number
    name: string
  }

  export interface Product {
    idRow: number
    id: string
    name: string
  }

  export interface CategoriesRow {
    id: number
    idDocument: string
    categorieLaw: string
    categorieCatalog: CategorieCatalog
    bestLowerProduct: Product
  }

  export interface CategoriesTableProps {
    categoriesList: CategoriesRow[]
  }

  export interface DocumentCategorie {
    id: string
    categorieLaw: string
    categorieCatalog: string
    idCategory: number
    nameBestLowerProduct: string
    idBestLowerProduct: string
  }

  export interface CategoriesTreeProps {
    idRow: number
    nameCategory: string
    items: CategoriesRow[]
    setItems: (items: CategoriesRow[]) => void
    closeModal: ({ id, idRow, name }: CategorieCatalog) => void
  }

  export interface CategoryChildenListProps {
    id: number
    name: string
    hasChildren: boolean
    children: CategoryChildenListProps[]
  }

  export interface RecursiveChildenListProps {
    category: CategoryChildenListProps[]
    selectedCategory: string
    setSelectedCategory: (category: string) => void
    setSelectedIdCategory: (id: number) => void
  }

  export interface ProductSearchProps {
    idRow: number
    nameProduct: string
    idProduct: string
    items: CategoriesRow[]
    setItems: (items: CategoriesRow[]) => void
    closeModal: ({ id, idRow, name }: Product) => void
  }
  export interface Image {
    imageId: string
    imageUrl: string
    imageText: string
  }

  export interface Item {
    itemId: string
    name: string
    images: Image[]
  }

  export interface ProductFromQuery {
    productId: string
    productName: string
    brand: string
    categoryId: string
    pricePerUnit: number[]
    leyDeGondolas: string[]
    linkText: string
    items: Item[]
  }
  export interface Catalog {
    idRow: number
    productId: string
    name: string
  }
  export interface ProductToTable {
    id: number
    catalog: Catalog
    productId: string
    productName: {
      name: string
      link: string
    }
    brand: string
    categoryId: string
    pricePerUnit: number
    bestLowerPrice: string[]
    pymes: string[]
    linkText: string
    items: Item[]
  }

  export interface ProductTableProps {
    listOfProducts: ProductToTable[]
    setListOfProducts: (listOfProducts: ProductToTable[]) => void
    items: CategoriesRow[]
    setItems: (items: CategoriesRow[]) => void
  }

  export interface BodySaveDocumentMasterData {
    categorieLaw: string
    categorieCatalog: string
    idCategory: number
    nameBestLowerProduct: string
    idBestLowerProduct: string
  }

  interface ProductContext {
    totalItems: number,
    from: number
    to: number
    currentPage: number
    totalPages: number
    limit: number
    params: string
    statements: any[]
  }
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/typings/css.d.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
declare module '*.css' {
  type Styles = {
    [selector: string]: string
  }

  const styles: Styles

  export default styles
}

```


[System] You are an expert VTEX IO developer. You specialize in building VTEX Store Framework apps, React components, GraphQL APIs, and Node.js services for e-commerce platforms.

[User] Show me the implementation of admin-ley-gondolas-arg/react/typings/vtex.styleguide.d.ts from the admin-ley-gondolas-arg VTEX app.

[Assistant]
Here's the implementation:

```typescript
declare module 'vtex.styleguide'
declare module 'vtex.store-icons'

declare module '@vtex/styleguide/lib/*' {
  const Component: ComponentType<unknown>
  export default Component
}

```