@fas-core/shared-types 1.0.101 → 1.0.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -39,7 +39,6 @@ interface ISEOMetaData {
39
39
  description: string;
40
40
  keywords: string[];
41
41
  headerTag: string;
42
- canonicalUrl: string;
43
42
  }
44
43
  interface IBannerSlide {
45
44
  desktop: string;
@@ -54,6 +53,7 @@ interface IBannerSlide {
54
53
  interface IMediaAsset {
55
54
  url: string;
56
55
  sortOrder: number;
56
+ alt?: string;
57
57
  }
58
58
  interface IPrice {
59
59
  price: number;
@@ -158,9 +158,15 @@ interface IStore extends BaseEntity {
158
158
  storeAdmins: Array<string | Types.ObjectId>;
159
159
  }
160
160
 
161
+ declare const DISCOUNT_TYPE_VALUES: ("PERCENTAGE" | "FIXED" | "FREE_SHIPPING")[];
161
162
  declare const DiscountTypeEnum: {
162
163
  readonly PERCENTAGE: "PERCENTAGE";
163
164
  readonly FIXED: "FIXED";
165
+ /**
166
+ * Waives the shipping charge instead of discounting the goods, so `value` is unused and stays 0.
167
+ * NetSuite expresses this as a promotion with a `freeshipmethod` and no rate.
168
+ */
169
+ readonly FREE_SHIPPING: "FREE_SHIPPING";
164
170
  };
165
171
  type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];
166
172
  interface IDiscountType {
@@ -169,6 +175,7 @@ interface IDiscountType {
169
175
  }
170
176
  interface ICoupon extends BaseEntity {
171
177
  title: string;
178
+ description: string;
172
179
  couponCode: string;
173
180
  startTime: Date;
174
181
  endTime: Date;
@@ -177,6 +184,20 @@ interface ICoupon extends BaseEntity {
177
184
  isPromotional: boolean;
178
185
  status: boolean;
179
186
  stores: IStore[];
187
+ netsuite?: CouponNetsuiteLink | null;
188
+ metaData: Metadata;
189
+ }
190
+ interface CouponNetsuiteLink {
191
+ promotionId: string;
192
+ promotionName?: string;
193
+ couponId?: string;
194
+ discountItemId?: string;
195
+ discountItemName?: string;
196
+ discountReducesTax: boolean;
197
+ singleUse: boolean;
198
+ itemSkus: string[];
199
+ applyDiscountTo?: string;
200
+ syncedAt?: Date | string;
180
201
  }
181
202
 
182
203
  interface IBrand extends BaseEntity {
@@ -189,15 +210,24 @@ interface IBrand extends BaseEntity {
189
210
  sortOrder: number;
190
211
  status: boolean;
191
212
  isOnline: boolean;
213
+ netsuiteId: string;
192
214
  metaData: Metadata;
193
215
  seoMetaData: ISEOMetaData;
194
216
  }
195
217
 
218
+ interface ICategorySubcategory {
219
+ category: ICategory | string;
220
+ name: string;
221
+ urlFragment: string;
222
+ image: string;
223
+ sortOrder: number;
224
+ }
196
225
  interface ICategory extends BaseEntity {
197
226
  name: string;
198
227
  slug: string;
199
228
  description: string;
200
229
  parent: ICategory;
230
+ subcategories?: ICategorySubcategory[];
201
231
  stores: (IStore | string)[];
202
232
  childOnly?: boolean;
203
233
  image: string;
@@ -205,9 +235,9 @@ interface ICategory extends BaseEntity {
205
235
  sortOrder: number;
206
236
  status: boolean;
207
237
  isOnline: boolean;
238
+ netsuiteId: string;
208
239
  metaData: Metadata;
209
240
  seoMetaData: ISEOMetaData;
210
- subCategories?: ICategory[];
211
241
  }
212
242
 
213
243
  declare const StockStatusEnum: {
@@ -258,6 +288,15 @@ interface IProductVariantFields {
258
288
  price: IPrice;
259
289
  saleType?: SaleType;
260
290
  quantity: number;
291
+ minimumQuantity?: number;
292
+ maximumQuantity?: number;
293
+ enforceMinimum?: boolean;
294
+ isSparePart?: boolean;
295
+ stockDescription?: string;
296
+ noPriceMessage?: string;
297
+ itemType?: string;
298
+ isSeriesComponent?: boolean;
299
+ flexWarrantyEligible?: boolean;
261
300
  inventoryPolicy: InventoryPolicy;
262
301
  brand: IBrand;
263
302
  stores: (IStore | string)[];
@@ -345,17 +384,23 @@ interface IAddonConfig extends BaseEntity {
345
384
  name: string;
346
385
  key: string;
347
386
  description: string;
387
+ longDescription?: string;
348
388
  stores: (IStore | string)[];
349
389
  price: number;
350
390
  pricingType: PricingType;
351
391
  quantity: number;
352
392
  sortOrder: number;
353
393
  applyToAll: boolean;
394
+ appliesFromPrice?: number;
395
+ appliesToPrice?: number;
354
396
  isDefault: boolean;
355
397
  isVisible: boolean;
356
398
  status: boolean;
399
+ metaData: Metadata;
400
+ netsuite?: AddonNetsuiteLink | null;
357
401
  }
358
402
  interface IAddonGroup extends BaseEntity {
403
+ netsuite?: AddonGroupNetsuiteLink | null;
359
404
  name: string;
360
405
  key: string;
361
406
  description: string;
@@ -364,10 +409,21 @@ interface IAddonGroup extends BaseEntity {
364
409
  isVisible: boolean;
365
410
  status: boolean;
366
411
  }
412
+ interface AddonGroupNetsuiteLink {
413
+ requiresField?: string;
414
+ syncedAt?: Date | string;
415
+ }
416
+ interface AddonNetsuiteLink {
417
+ itemId: string;
418
+ itemName?: string;
419
+ syncedAt?: Date | string;
420
+ }
367
421
 
368
422
  interface ProductAddonScope {
369
423
  storeId?: string;
370
424
  productAddonIds?: string[];
425
+ productPrice?: number;
426
+ productFlags?: Record<string, boolean | undefined>;
371
427
  }
372
428
  declare const resolveProductAddonGroups: (groups: IAddonGroup[], scope?: ProductAddonScope) => IAddonGroup[];
373
429
  declare const groupHasDefaultAddon: (group: IAddonGroup) => boolean;
@@ -381,16 +437,135 @@ interface ResolvedAddonSelection extends AddonSelectionRef {
381
437
  declare const resolveAddonSelections: (groups: IAddonGroup[], selections: AddonSelectionRef[]) => ResolvedAddonSelection[];
382
438
 
383
439
  interface IProduct extends BaseEntity, IProductVariantFields {
440
+ netsuiteId: string;
384
441
  name: string;
385
442
  slug: string;
386
443
  sku: string;
387
444
  hasVariants: boolean;
388
- variantType?: ProductVariantType;
445
+ variantType: ProductVariantType;
389
446
  variantOptions?: IProductVariantOptionGroup[];
390
447
  variantOptionSignatures?: string[];
391
448
  variants: IVariant[];
392
449
  relationGroups: IProductRelationGroup[];
393
450
  addons: (IAddonConfig | string)[];
451
+ googleCategory: string;
452
+ department: string;
453
+ }
454
+
455
+ interface ICartItem extends BaseEntity {
456
+ cart: ICart;
457
+ product: IProduct;
458
+ variant?: IVariant;
459
+ pricing: ILinePricing;
460
+ metaData: Metadata;
461
+ /** Buyer-entered line note. Survives to the order and appears on the confirmation. */
462
+ note?: string;
463
+ }
464
+
465
+ interface StockDemandLine {
466
+ key: string;
467
+ quantity: number;
468
+ }
469
+ declare const demandByKey: (lines: StockDemandLine[]) => Map<string, number>;
470
+ declare const StockVerdictEnum: {
471
+ readonly OK: "OK";
472
+ readonly OUT_OF_STOCK: "OUT_OF_STOCK";
473
+ readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
474
+ };
475
+ type StockVerdict = {
476
+ type: typeof StockVerdictEnum.OK;
477
+ } | {
478
+ type: typeof StockVerdictEnum.OUT_OF_STOCK;
479
+ available: 0;
480
+ requested: number;
481
+ } | {
482
+ type: typeof StockVerdictEnum.INSUFFICIENT_STOCK;
483
+ available: number;
484
+ requested: number;
485
+ };
486
+ declare const stockVerdict: (available: number, requested: number) => StockVerdict;
487
+
488
+ interface OfferedAddon {
489
+ addonKey: string;
490
+ name: string;
491
+ description: string;
492
+ price: number;
493
+ pricingType: PricingType;
494
+ }
495
+ interface OfferedAddonGroup {
496
+ groupKey: string;
497
+ name: string;
498
+ addons: OfferedAddon[];
499
+ }
500
+ declare const CartStatusEnum: {
501
+ readonly ACTIVE: "ACTIVE";
502
+ readonly CONVERTED: "CONVERTED";
503
+ readonly QUOTED: "QUOTED";
504
+ readonly ABANDONED: "ABANDONED";
505
+ };
506
+ type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];
507
+ declare const CART_STATUS_VALUES: ("ACTIVE" | "CONVERTED" | "QUOTED" | "ABANDONED")[];
508
+ declare const RETIRED_CART_STATUSES: CartStatusEnum[];
509
+ interface ICart extends BaseEntity {
510
+ tax?: AppliedTax | null;
511
+ shippingMethod?: SelectedShippingMethod | null;
512
+ cartId: string;
513
+ cartItems: ICartItem[];
514
+ user?: ICustomer;
515
+ coupon?: ICoupon;
516
+ store: IStore;
517
+ metaData: Metadata;
518
+ optionalFees?: Record<string, boolean>;
519
+ pricing: ISummaryPricing;
520
+ selectedShippingRate?: IShippingRate;
521
+ status: CartStatusEnum;
522
+ type: SaleType;
523
+ order?: IOrder | string;
524
+ convertedAt?: Date;
525
+ quoteToken?: string;
526
+ quotedAt?: Date;
527
+ quoteEmail?: string;
528
+ sourceCart?: ICart | string;
529
+ }
530
+ declare const CartIssueTypes: {
531
+ readonly ITEM_UNAVAILABLE: "ITEM_UNAVAILABLE";
532
+ readonly OUT_OF_STOCK: "OUT_OF_STOCK";
533
+ readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
534
+ readonly BELOW_MINIMUM_QUANTITY: "BELOW_MINIMUM_QUANTITY";
535
+ readonly COUPON_INVALID: "COUPON_INVALID";
536
+ };
537
+ type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];
538
+ interface CartIssue {
539
+ type: CartIssueType;
540
+ itemId?: string;
541
+ name?: string;
542
+ available?: number;
543
+ requested?: number;
544
+ minimum?: number;
545
+ message: string;
546
+ }
547
+ interface CartValidation {
548
+ ok: boolean;
549
+ issues: CartIssue[];
550
+ }
551
+ interface SelectedShippingMethod {
552
+ id: string;
553
+ name: string;
554
+ shipping: number;
555
+ handling: number;
556
+ total: number;
557
+ free: boolean;
558
+ estimated: boolean;
559
+ cartFingerprint?: string;
560
+ }
561
+ interface AppliedTax {
562
+ rate: number;
563
+ state: string;
564
+ county?: string;
565
+ groupId: string;
566
+ groupName: string;
567
+ shippingTaxable: boolean;
568
+ cartFingerprint?: string;
394
569
  }
395
570
 
396
571
  interface IOrderItem extends BaseEntity {
@@ -423,23 +598,20 @@ declare const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[];
423
598
  declare const paymentStatusColorMap: Record<PaymentStatusEnum, string>;
424
599
  declare const PaymentMethodEnum: {
425
600
  readonly CREDIT_CARD: "CREDIT_CARD";
426
- readonly PAYPAL: "PAYPAL";
427
601
  readonly STRIPE: "STRIPE";
428
602
  readonly CHECK: "CHECK";
429
603
  readonly APPLE_PAY: "APPLE_PAY";
430
604
  readonly PURCHASE_ORDER: "PURCHASE_ORDER";
431
605
  };
432
606
  type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];
433
- declare const PAYMENT_METHOD_VALUES: ("CREDIT_CARD" | "PAYPAL" | "STRIPE" | "CHECK" | "APPLE_PAY" | "PURCHASE_ORDER")[];
607
+ declare const PAYMENT_METHOD_VALUES: ("CREDIT_CARD" | "STRIPE" | "CHECK" | "APPLE_PAY" | "PURCHASE_ORDER")[];
434
608
  declare const paymentMethodColorMap: Record<PaymentMethodEnum, string>;
435
609
  declare const PaymentGatewayEnum: {
436
610
  readonly STRIPE: "STRIPE";
437
- readonly PAYPAL: "PAYPAL";
438
- readonly BRAINTREE: "BRAINTREE";
439
611
  readonly MANUAL: "MANUAL";
440
612
  };
441
613
  type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];
442
- declare const PAYMENT_GATEWAY_VALUES: ("MANUAL" | "PAYPAL" | "STRIPE" | "BRAINTREE")[];
614
+ declare const PAYMENT_GATEWAY_VALUES: ("MANUAL" | "STRIPE")[];
443
615
  declare const TransactionTypeEnum: {
444
616
  readonly ORDER: "ORDER";
445
617
  readonly REFUND: "REFUND";
@@ -471,28 +643,54 @@ interface IRefundTransaction extends ITransactionBase {
471
643
  originalTransaction?: ITransactionBase;
472
644
  }
473
645
 
646
+ interface INetsuiteOrderLink {
647
+ id: string;
648
+ recordType: string;
649
+ externalId?: string;
650
+ tranId?: string;
651
+ statusText?: string;
652
+ total?: number;
653
+ entityId?: string;
654
+ entityLabel?: string;
655
+ recordUrl?: string;
656
+ createdDate?: string;
657
+ httpStatus?: number;
658
+ pushedAt?: Date | string;
659
+ statusCode?: string;
660
+ statusCheckedAt?: Date | string;
661
+ }
662
+ interface IOrderShipment {
663
+ netsuiteId: string;
664
+ tranId?: string;
665
+ carrier?: string;
666
+ shipMethod?: string;
667
+ shippedAt?: Date | string;
668
+ trackingNumbers: string[];
669
+ syncedAt?: Date | string;
670
+ }
474
671
  declare const OrderStatusEnum: {
475
672
  readonly CREATED: "CREATED";
476
- readonly RECEIVED: "RECEIVED";
477
- readonly PENDING: "PENDING";
478
- readonly CONFIRMED: "CONFIRMED";
479
- readonly PROCESSING: "PROCESSING";
480
- readonly SHIPPED: "SHIPPED";
481
- readonly DELIVERED: "DELIVERED";
482
- readonly CANCELED: "CANCELED";
483
- readonly FAILED: "FAILED";
673
+ readonly PAYMENT_FAILED: "PAYMENT_FAILED";
674
+ readonly PENDING_APPROVAL: "PENDING_APPROVAL";
675
+ readonly PENDING_FULFILLMENT: "PENDING_FULFILLMENT";
676
+ readonly PARTIALLY_FULFILLED: "PARTIALLY_FULFILLED";
677
+ readonly PENDING_BILLING: "PENDING_BILLING";
678
+ readonly BILLED: "BILLED";
679
+ readonly CLOSED: "CLOSED";
680
+ readonly CANCELLED: "CANCELLED";
681
+ readonly PENDING_RECEIPT: "PENDING_RECEIPT";
682
+ readonly PENDING_REFUND: "PENDING_REFUND";
484
683
  readonly REFUNDED: "REFUNDED";
485
684
  readonly PARTIALLY_REFUNDED: "PARTIALLY_REFUNDED";
486
- readonly ARCHIVED: "ARCHIVED";
487
- readonly RETURNED: "RETURNED";
488
685
  readonly QUOTE_REQUESTED: "QUOTE_REQUESTED";
489
- readonly QUOTED: "QUOTED";
490
- readonly QUOTE_ACCEPTED: "QUOTE_ACCEPTED";
491
- readonly QUOTE_DECLINED: "QUOTE_DECLINED";
686
+ readonly QUOTE_OPEN: "QUOTE_OPEN";
687
+ readonly QUOTE_PROCESSED: "QUOTE_PROCESSED";
688
+ readonly QUOTE_CLOSED: "QUOTE_CLOSED";
689
+ readonly QUOTE_VOIDED: "QUOTE_VOIDED";
492
690
  readonly QUOTE_EXPIRED: "QUOTE_EXPIRED";
493
691
  };
494
692
  type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];
495
- declare const ORDER_STATUS_VALUES: ("PENDING" | "PROCESSING" | "FAILED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "RECEIVED" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELED" | "ARCHIVED" | "RETURNED" | "QUOTE_REQUESTED" | "QUOTED" | "QUOTE_ACCEPTED" | "QUOTE_DECLINED" | "QUOTE_EXPIRED")[];
693
+ declare const ORDER_STATUS_VALUES: ("CANCELLED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "PAYMENT_FAILED" | "PENDING_APPROVAL" | "PENDING_FULFILLMENT" | "PARTIALLY_FULFILLED" | "PENDING_BILLING" | "BILLED" | "CLOSED" | "PENDING_RECEIPT" | "PENDING_REFUND" | "QUOTE_REQUESTED" | "QUOTE_OPEN" | "QUOTE_PROCESSED" | "QUOTE_CLOSED" | "QUOTE_VOIDED" | "QUOTE_EXPIRED")[];
496
694
  declare const statusColors: Record<OrderStatusEnum, string>;
497
695
  declare const PURCHASE_ORDER_STATUSES: OrderStatusEnum[];
498
696
  declare const OPEN_ORDER_STATUSES: OrderStatusEnum[];
@@ -504,7 +702,7 @@ interface IOrder extends BaseEntity {
504
702
  coupon: ICoupon;
505
703
  store: IStore;
506
704
  status: OrderStatusEnum;
507
- type?: SaleType;
705
+ type: SaleType;
508
706
  sourceQuote?: IOrder | string;
509
707
  convertedOrder?: IOrder | string;
510
708
  quoteValidUntil?: Date;
@@ -513,9 +711,17 @@ interface IOrder extends BaseEntity {
513
711
  paymentGateway: PaymentGatewayEnum;
514
712
  shippingAddress: IAddress;
515
713
  billingAddress: IAddress;
516
- shippingMethod: string;
714
+ shippingMethod?: SelectedShippingMethod | null;
715
+ shipments?: IOrderShipment[];
716
+ tax?: AppliedTax | null;
517
717
  acceptedTermsAt: Date;
518
718
  customerNote: string;
719
+ netsuite?: INetsuiteOrderLink | null;
720
+ netsuiteLastError?: {
721
+ message: string;
722
+ recordType?: string;
723
+ failedAt?: Date | string;
724
+ } | null;
519
725
  metaData: Metadata;
520
726
  orderTransactions: IOrderTransaction[];
521
727
  refundTransactions: IRefundTransaction[];
@@ -523,6 +729,7 @@ interface IOrder extends BaseEntity {
523
729
  }
524
730
 
525
731
  interface ICustomer extends BaseEntity {
732
+ netsuiteId: string;
526
733
  firstName: string;
527
734
  lastName: string;
528
735
  profileImage: string;
@@ -542,6 +749,7 @@ interface ICustomer extends BaseEntity {
542
749
  resetPasswordTokenHash: string;
543
750
  resetPasswordTokenExpiresAt: Date | null;
544
751
  marketingOptOut?: boolean;
752
+ metaData: Metadata;
545
753
  unsubscribeToken?: string;
546
754
  }
547
755
 
@@ -630,6 +838,10 @@ declare const ADMIN_RESOURCE_LIST: readonly [{
630
838
  readonly value: "store-fees";
631
839
  readonly label: "Store Fees";
632
840
  readonly group: "Commerce";
841
+ }, {
842
+ readonly value: "tax-rates";
843
+ readonly label: "Tax Rates";
844
+ readonly group: "Commerce";
633
845
  }, {
634
846
  readonly value: "customers";
635
847
  readonly label: "Customers";
@@ -691,7 +903,7 @@ declare const ADMIN_RESOURCE_LIST: readonly [{
691
903
  readonly label: "Account";
692
904
  readonly group: "Settings";
693
905
  }];
694
- declare const ADMIN_RESOURCES: ("stores" | "dashboard" | "metrics" | "products" | "categories" | "brands" | "technical-specs" | "addon-configs" | "relation-groups" | "configurators" | "orders" | "quotes" | "carts" | "transactions" | "coupons" | "store-fees" | "customers" | "contact-us" | "subscribers" | "blog" | "faqs" | "podcast" | "email-templates" | "notifications" | "campaigns" | "currencies" | "redirects" | "cache" | "admins" | "account")[];
906
+ declare const ADMIN_RESOURCES: ("stores" | "categories" | "podcast" | "blog" | "dashboard" | "metrics" | "products" | "brands" | "technical-specs" | "addon-configs" | "relation-groups" | "configurators" | "orders" | "quotes" | "carts" | "transactions" | "coupons" | "store-fees" | "tax-rates" | "customers" | "contact-us" | "subscribers" | "faqs" | "email-templates" | "notifications" | "campaigns" | "currencies" | "redirects" | "cache" | "admins" | "account")[];
695
907
  type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];
696
908
  declare const ADMIN_ACTIONS: readonly ["read", "write", "delete"];
697
909
  type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];
@@ -842,6 +1054,7 @@ declare const FeeAppliesToEnum: {
842
1054
  type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];
843
1055
  declare const FEE_APPLIES_TO_VALUES: ("SUBTOTAL" | "TOTAL")[];
844
1056
  interface IStoreFee extends BaseEntity {
1057
+ netsuiteId?: string;
845
1058
  stores: (IStore | string)[];
846
1059
  name: string;
847
1060
  key: string;
@@ -855,6 +1068,7 @@ interface IStoreFee extends BaseEntity {
855
1068
  defaultSelected: boolean;
856
1069
  sortOrder: number;
857
1070
  status: boolean;
1071
+ metaData: Metadata;
858
1072
  }
859
1073
  interface ISelectableFee {
860
1074
  key: string;
@@ -883,7 +1097,7 @@ declare const EmailTemplateEventEnum: {
883
1097
  readonly NOTIFICATION: "NOTIFICATION";
884
1098
  };
885
1099
  type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];
886
- declare const EMAIL_TEMPLATE_EVENT_VALUES: ("QUOTE" | "QUOTE_REQUESTED" | "QUOTE_DECLINED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "WELCOME" | "PASSWORD_RESET" | "QUOTE_SENT" | "INVOICE" | "PROMOTIONAL" | "CONTACT_US" | "NOTIFICATION")[];
1100
+ declare const EMAIL_TEMPLATE_EVENT_VALUES: ("QUOTE" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "WELCOME" | "PASSWORD_RESET" | "QUOTE_SENT" | "QUOTE_DECLINED" | "INVOICE" | "PROMOTIONAL" | "CONTACT_US" | "NOTIFICATION")[];
887
1101
  declare const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[];
888
1102
  declare const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>>;
889
1103
  interface IEmailTemplate extends BaseEntity {
@@ -1129,7 +1343,7 @@ declare const OrderLogTypeEnum: {
1129
1343
  readonly NOTE: "NOTE";
1130
1344
  };
1131
1345
  type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];
1132
- declare const ORDER_LOG_TYPE_VALUES: ("REFUND" | "ORDER_PLACED" | "PAYMENT_PENDING" | "PAYMENT_SUCCEEDED" | "PAYMENT_FAILED" | "PAYMENT_CANCELLED" | "ORDER_STATUS" | "EMAIL" | "NOTE")[];
1346
+ declare const ORDER_LOG_TYPE_VALUES: ("REFUND" | "PAYMENT_FAILED" | "ORDER_PLACED" | "PAYMENT_PENDING" | "PAYMENT_SUCCEEDED" | "PAYMENT_CANCELLED" | "ORDER_STATUS" | "EMAIL" | "NOTE")[];
1133
1347
  declare const orderLogTypeColorMap: Record<OrderLogTypeEnum, string>;
1134
1348
  interface IOrderLog extends BaseEntity {
1135
1349
  order: IOrder | string;
@@ -1162,87 +1376,6 @@ interface IPaymentLink extends BaseEntity {
1162
1376
  baseUrl: string;
1163
1377
  }
1164
1378
 
1165
- interface ICartItem extends BaseEntity {
1166
- cart: ICart;
1167
- product: IProduct;
1168
- variant?: IVariant;
1169
- pricing: ILinePricing;
1170
- metaData: Metadata;
1171
- /** Buyer-entered line note. Survives to the order and appears on the confirmation. */
1172
- note?: string;
1173
- }
1174
-
1175
- interface StockDemandLine {
1176
- key: string;
1177
- quantity: number;
1178
- }
1179
- declare const demandByKey: (lines: StockDemandLine[]) => Map<string, number>;
1180
- declare const StockVerdictEnum: {
1181
- readonly OK: "OK";
1182
- readonly OUT_OF_STOCK: "OUT_OF_STOCK";
1183
- readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
1184
- };
1185
- type StockVerdict = {
1186
- type: typeof StockVerdictEnum.OK;
1187
- } | {
1188
- type: typeof StockVerdictEnum.OUT_OF_STOCK;
1189
- available: 0;
1190
- requested: number;
1191
- } | {
1192
- type: typeof StockVerdictEnum.INSUFFICIENT_STOCK;
1193
- available: number;
1194
- requested: number;
1195
- };
1196
- declare const stockVerdict: (available: number, requested: number) => StockVerdict;
1197
-
1198
- declare const CartStatusEnum: {
1199
- readonly ACTIVE: "ACTIVE";
1200
- readonly CONVERTED: "CONVERTED";
1201
- readonly QUOTED: "QUOTED";
1202
- readonly ABANDONED: "ABANDONED";
1203
- };
1204
- type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];
1205
- declare const CART_STATUS_VALUES: ("QUOTED" | "ACTIVE" | "CONVERTED" | "ABANDONED")[];
1206
- declare const RETIRED_CART_STATUSES: CartStatusEnum[];
1207
- interface ICart extends BaseEntity {
1208
- cartId: string;
1209
- cartItems: ICartItem[];
1210
- user?: ICustomer;
1211
- coupon?: ICoupon;
1212
- store: IStore;
1213
- metaData: Metadata;
1214
- optionalFees?: Record<string, boolean>;
1215
- pricing: ISummaryPricing;
1216
- selectedShippingRate?: IShippingRate;
1217
- status: CartStatusEnum;
1218
- type: SaleType;
1219
- order?: IOrder | string;
1220
- convertedAt?: Date;
1221
- quoteToken?: string;
1222
- quotedAt?: Date;
1223
- quoteEmail?: string;
1224
- sourceCart?: ICart | string;
1225
- }
1226
- declare const CartIssueTypes: {
1227
- readonly ITEM_UNAVAILABLE: "ITEM_UNAVAILABLE";
1228
- readonly OUT_OF_STOCK: "OUT_OF_STOCK";
1229
- readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
1230
- readonly COUPON_INVALID: "COUPON_INVALID";
1231
- };
1232
- type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];
1233
- interface CartIssue {
1234
- type: CartIssueType;
1235
- itemId?: string;
1236
- name?: string;
1237
- available?: number;
1238
- requested?: number;
1239
- message: string;
1240
- }
1241
- interface CartValidation {
1242
- ok: boolean;
1243
- issues: CartIssue[];
1244
- }
1245
-
1246
1379
  declare const SubscriptionChannelEnum: {
1247
1380
  readonly EMAIL: "EMAIL";
1248
1381
  readonly SMS: "SMS";
@@ -1304,7 +1437,7 @@ declare const CampaignRecipientStatusEnum: {
1304
1437
  readonly FAILED: "FAILED";
1305
1438
  };
1306
1439
  type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];
1307
- declare const CAMPAIGN_RECIPIENT_STATUS_VALUES: ("FAILED" | "DELIVERED" | "SENT" | "QUEUED" | "OPENED" | "CLICKED" | "BOUNCED" | "COMPLAINED")[];
1440
+ declare const CAMPAIGN_RECIPIENT_STATUS_VALUES: ("FAILED" | "SENT" | "QUEUED" | "DELIVERED" | "OPENED" | "CLICKED" | "BOUNCED" | "COMPLAINED")[];
1308
1441
  interface ICampaignStats {
1309
1442
  sent: number;
1310
1443
  delivered: number;
@@ -1340,34 +1473,32 @@ interface ICampaignRecipient extends BaseEntity {
1340
1473
  }
1341
1474
 
1342
1475
  interface IBlogAuthor extends BaseEntity {
1476
+ netsuiteId: string;
1343
1477
  name: string;
1344
1478
  slug: string;
1345
1479
  bio: string;
1346
1480
  avatar: string;
1347
1481
  role: string;
1348
1482
  status: boolean;
1349
- isOnline: boolean;
1350
1483
  metaData: Metadata;
1351
1484
  seoMetaData: ISEOMetaData;
1352
1485
  }
1353
1486
  interface IBlogCategory extends BaseEntity {
1487
+ netsuiteId: string;
1354
1488
  name: string;
1355
1489
  slug: string;
1356
1490
  description: string;
1357
1491
  image: string;
1358
1492
  sortOrder: number;
1359
1493
  status: boolean;
1360
- isOnline: boolean;
1361
1494
  metaData: Metadata;
1362
1495
  seoMetaData: ISEOMetaData;
1363
1496
  }
1364
- interface IBlogCitation {
1365
- label: string;
1366
- url: string;
1367
- source?: string;
1368
- }
1369
1497
  interface IBlogPost extends BaseEntity {
1498
+ netsuiteId: string;
1499
+ netsuitePostId: string;
1370
1500
  title: string;
1501
+ subtitle: string;
1371
1502
  slug: string;
1372
1503
  excerpt: string;
1373
1504
  content: string;
@@ -1378,13 +1509,12 @@ interface IBlogPost extends BaseEntity {
1378
1509
  author: IBlogAuthor | string | null;
1379
1510
  category: IBlogCategory | string | null;
1380
1511
  tags: string[];
1381
- citations: IBlogCitation[];
1512
+ pinnedTo: string[];
1382
1513
  relatedProducts: unknown[];
1383
1514
  readingMinutes: number;
1384
1515
  publishedAt: Date | string | null;
1385
1516
  stores: IStore[];
1386
1517
  status: boolean;
1387
- isOnline: boolean;
1388
1518
  metaData: Metadata;
1389
1519
  seoMetaData: ISEOMetaData;
1390
1520
  }
@@ -1444,6 +1574,4071 @@ interface IPodcastEpisode extends BaseEntity {
1444
1574
  seoMetaData: ISEOMetaData;
1445
1575
  }
1446
1576
 
1577
+ declare const BRAND_FIELDS: {
1578
+ readonly name: {
1579
+ readonly before: "commercecategory.name";
1580
+ readonly after: "item.manufacturer";
1581
+ readonly target: "name";
1582
+ readonly policy: "always";
1583
+ };
1584
+ readonly online: {
1585
+ readonly before: "isonline";
1586
+ readonly after: "custitem_display_online";
1587
+ readonly target: "isOnline";
1588
+ readonly policy: "always";
1589
+ };
1590
+ readonly netsuiteId: {
1591
+ readonly before: "commercecategory.id";
1592
+ readonly target: "netsuiteId";
1593
+ readonly policy: "always";
1594
+ readonly conditional: true;
1595
+ readonly note: "No successor. The manufacturer name becomes the key.";
1596
+ };
1597
+ readonly slug: {
1598
+ readonly before: "commercecategory.urlfragment";
1599
+ readonly target: "slug";
1600
+ readonly policy: "seed";
1601
+ readonly identity: true;
1602
+ readonly note: string;
1603
+ readonly caution: string;
1604
+ };
1605
+ readonly logo: {
1606
+ readonly before: "thumbnail";
1607
+ readonly target: "logo";
1608
+ readonly policy: "always";
1609
+ readonly conditional: true;
1610
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
1611
+ };
1612
+ readonly description: {
1613
+ readonly before: "commercecategory.description";
1614
+ readonly target: "description";
1615
+ readonly policy: "always";
1616
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1617
+ };
1618
+ readonly sortOrder: {
1619
+ readonly before: "sequencenumber";
1620
+ readonly target: "sortOrder";
1621
+ readonly policy: "always";
1622
+ readonly conditional: true;
1623
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1624
+ };
1625
+ readonly seoTitle: {
1626
+ readonly before: "pagetitle";
1627
+ readonly target: "seoMetaData.title";
1628
+ readonly policy: "always";
1629
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1630
+ };
1631
+ readonly seoDescription: {
1632
+ readonly before: "metadescription";
1633
+ readonly target: "seoMetaData.description";
1634
+ readonly policy: "always";
1635
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1636
+ };
1637
+ readonly seoKeywords: {
1638
+ readonly before: "metakeywords";
1639
+ readonly target: "seoMetaData.keywords";
1640
+ readonly policy: "always";
1641
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1642
+ };
1643
+ readonly status: {
1644
+ readonly before: "isinactive + displayinsite";
1645
+ readonly target: "status";
1646
+ readonly policy: "always";
1647
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1648
+ };
1649
+ readonly headerTag: {
1650
+ readonly before: "pageheading";
1651
+ readonly target: "seoMetaData.headerTag";
1652
+ readonly policy: "always";
1653
+ readonly note: string;
1654
+ };
1655
+ readonly banners: {
1656
+ readonly before: "pagebanner";
1657
+ readonly target: "banners";
1658
+ readonly policy: "seed";
1659
+ readonly note: string;
1660
+ };
1661
+ readonly logoUrl: {
1662
+ readonly before: "custrecord35";
1663
+ readonly target: "logo";
1664
+ readonly policy: "seed";
1665
+ readonly pending: true;
1666
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
1667
+ };
1668
+ };
1669
+
1670
+ declare const CATEGORY_FIELDS: {
1671
+ readonly name: {
1672
+ readonly before: "commercecategory.name";
1673
+ readonly after: "custitem_category";
1674
+ readonly target: "name";
1675
+ readonly policy: "always";
1676
+ readonly note: "After is a flat string stamped on the item, not a record.";
1677
+ };
1678
+ readonly online: {
1679
+ readonly before: "isonline";
1680
+ readonly after: "custitem_display_online";
1681
+ readonly target: "isOnline";
1682
+ readonly policy: "always";
1683
+ };
1684
+ readonly netsuiteId: {
1685
+ readonly before: "commercecategory.id";
1686
+ readonly target: "netsuiteId";
1687
+ readonly policy: "always";
1688
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1689
+ };
1690
+ readonly slug: {
1691
+ readonly before: "urlfragment";
1692
+ readonly target: "slug";
1693
+ readonly policy: "seed";
1694
+ readonly identity: true;
1695
+ readonly note: string;
1696
+ readonly caution: string;
1697
+ };
1698
+ readonly image: {
1699
+ readonly before: "thumbnail";
1700
+ readonly target: "image";
1701
+ readonly policy: "always";
1702
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
1703
+ };
1704
+ readonly description: {
1705
+ readonly before: "commercecategory.description";
1706
+ readonly target: "description";
1707
+ readonly policy: "always";
1708
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1709
+ };
1710
+ readonly sortOrder: {
1711
+ readonly before: "sequencenumber";
1712
+ readonly target: "sortOrder";
1713
+ readonly policy: "always";
1714
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1715
+ };
1716
+ readonly seoTitle: {
1717
+ readonly before: "pagetitle";
1718
+ readonly target: "seoMetaData.title";
1719
+ readonly policy: "always";
1720
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1721
+ };
1722
+ readonly seoDescription: {
1723
+ readonly before: "metadescription";
1724
+ readonly target: "seoMetaData.description";
1725
+ readonly policy: "always";
1726
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1727
+ };
1728
+ readonly seoKeywords: {
1729
+ readonly before: "metakeywords";
1730
+ readonly target: "seoMetaData.keywords";
1731
+ readonly policy: "always";
1732
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1733
+ };
1734
+ readonly status: {
1735
+ readonly before: "isinactive + displayinsite";
1736
+ readonly target: "status";
1737
+ readonly policy: "always";
1738
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1739
+ };
1740
+ readonly parent: {
1741
+ readonly before: "primaryparent";
1742
+ readonly after: "custitem_primary_category";
1743
+ readonly target: "parent";
1744
+ readonly policy: "always";
1745
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
1746
+ };
1747
+ readonly subcategories: {
1748
+ readonly before: "commercecategoryassociation.subcategory";
1749
+ readonly target: "subcategories";
1750
+ readonly policy: "always";
1751
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
1752
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
1753
+ };
1754
+ readonly headerTag: {
1755
+ readonly before: "pageheading";
1756
+ readonly target: "seoMetaData.headerTag";
1757
+ readonly policy: "always";
1758
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
1759
+ };
1760
+ readonly banners: {
1761
+ readonly before: "pagebanner";
1762
+ readonly target: "banners";
1763
+ readonly policy: "seed";
1764
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
1765
+ };
1766
+ readonly imageUrl: {
1767
+ readonly before: "custrecord35";
1768
+ readonly target: "image";
1769
+ readonly policy: "seed";
1770
+ readonly pending: true;
1771
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
1772
+ };
1773
+ readonly faq: {
1774
+ readonly before: "custrecord_faq_q1";
1775
+ readonly target: "metaData.faq";
1776
+ readonly policy: "seed";
1777
+ readonly pending: true;
1778
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
1779
+ };
1780
+ };
1781
+
1782
+ declare const PRODUCT_FIELDS: {
1783
+ readonly netsuiteId: {
1784
+ readonly before: "item.id";
1785
+ readonly target: "netsuiteId";
1786
+ readonly policy: "always";
1787
+ readonly conditional: true;
1788
+ readonly note: string;
1789
+ };
1790
+ readonly sku: {
1791
+ readonly before: "item.itemid";
1792
+ readonly target: "sku";
1793
+ readonly policy: "always";
1794
+ readonly conditional: true;
1795
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1796
+ };
1797
+ readonly originalPrice: {
1798
+ readonly before: "itemprice at the Base Price level (1)";
1799
+ readonly target: "price.originalPrice";
1800
+ readonly policy: "always";
1801
+ readonly conditional: true;
1802
+ readonly note: string;
1803
+ };
1804
+ readonly discount: {
1805
+ readonly before: "derived from Base Price vs Online Price";
1806
+ readonly target: "price.discount";
1807
+ readonly policy: "always";
1808
+ readonly conditional: true;
1809
+ readonly note: string;
1810
+ };
1811
+ readonly weight: {
1812
+ readonly before: "weight + weightunit";
1813
+ readonly target: "shipping.weightLb";
1814
+ readonly policy: "always";
1815
+ readonly conditional: true;
1816
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
1817
+ };
1818
+ readonly dimensions: {
1819
+ readonly target: "shipping.lengthIn";
1820
+ readonly policy: "seed";
1821
+ readonly note: string;
1822
+ };
1823
+ readonly price: {
1824
+ readonly before: "itemprice at the online price level";
1825
+ readonly target: "price";
1826
+ readonly policy: "always";
1827
+ readonly conditional: true;
1828
+ readonly note: string;
1829
+ };
1830
+ readonly quantity: {
1831
+ readonly before: "quantityavailable";
1832
+ readonly target: "quantity";
1833
+ readonly policy: "always";
1834
+ readonly conditional: true;
1835
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1836
+ };
1837
+ readonly minimumQuantity: {
1838
+ readonly before: "minimumquantity";
1839
+ readonly target: "minimumQuantity";
1840
+ readonly policy: "always";
1841
+ readonly conditional: true;
1842
+ readonly note: string;
1843
+ };
1844
+ readonly maximumQuantity: {
1845
+ readonly before: "maximumquantity";
1846
+ readonly target: "maximumQuantity";
1847
+ readonly policy: "always";
1848
+ readonly conditional: true;
1849
+ readonly note: string;
1850
+ };
1851
+ readonly enforceMinimum: {
1852
+ readonly before: "enforceminqtyinternally";
1853
+ readonly target: "enforceMinimum";
1854
+ readonly policy: "always";
1855
+ readonly conditional: true;
1856
+ readonly note: string;
1857
+ };
1858
+ readonly isSparePart: {
1859
+ readonly before: "custitem303";
1860
+ readonly target: "isSparePart";
1861
+ readonly policy: "always";
1862
+ readonly conditional: true;
1863
+ readonly note: string;
1864
+ };
1865
+ readonly itemType: {
1866
+ readonly before: "itemtype";
1867
+ readonly target: "itemType";
1868
+ readonly policy: "always";
1869
+ readonly conditional: true;
1870
+ readonly note: string;
1871
+ };
1872
+ readonly stockDescription: {
1873
+ readonly before: "stockdescription";
1874
+ readonly target: "stockDescription";
1875
+ readonly policy: "always";
1876
+ readonly conditional: true;
1877
+ readonly note: string;
1878
+ };
1879
+ readonly noPriceMessage: {
1880
+ readonly before: "nopricemessage";
1881
+ readonly target: "noPriceMessage";
1882
+ readonly policy: "always";
1883
+ readonly conditional: true;
1884
+ readonly note: string;
1885
+ };
1886
+ readonly isSeriesComponent: {
1887
+ readonly before: "custitem40";
1888
+ readonly target: "isSeriesComponent";
1889
+ readonly policy: "always";
1890
+ readonly conditional: true;
1891
+ readonly note: string;
1892
+ };
1893
+ readonly flexWarrantyEligible: {
1894
+ readonly before: "custitem520";
1895
+ readonly target: "flexWarrantyEligible";
1896
+ readonly policy: "always";
1897
+ readonly conditional: true;
1898
+ readonly note: string;
1899
+ };
1900
+ readonly inventoryPolicy: {
1901
+ readonly before: "outofstockbehavior";
1902
+ readonly target: "inventoryPolicy";
1903
+ readonly policy: "always";
1904
+ readonly conditional: true;
1905
+ readonly note: string;
1906
+ };
1907
+ readonly status: {
1908
+ readonly before: "isinactive";
1909
+ readonly target: "status";
1910
+ readonly policy: "always";
1911
+ readonly conditional: true;
1912
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1913
+ };
1914
+ readonly shipping: {
1915
+ readonly before: "weight + weightunit";
1916
+ readonly target: "shipping";
1917
+ readonly policy: "always";
1918
+ readonly conditional: true;
1919
+ readonly note: string;
1920
+ };
1921
+ readonly slug: {
1922
+ readonly before: "urlcomponent";
1923
+ readonly after: "custitem_slug";
1924
+ readonly target: "slug";
1925
+ readonly policy: "seed";
1926
+ readonly identity: true;
1927
+ readonly note: "The storefront URL never moves once a product exists.";
1928
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
1929
+ };
1930
+ readonly name: {
1931
+ readonly before: "storedisplayname";
1932
+ readonly after: "custitem_product_name";
1933
+ readonly target: "name";
1934
+ readonly policy: "always";
1935
+ readonly conditional: true;
1936
+ readonly note: string;
1937
+ };
1938
+ readonly featured: {
1939
+ readonly before: "featureddescription";
1940
+ readonly after: "custitem_product_featured_description";
1941
+ readonly target: "description";
1942
+ readonly policy: "always";
1943
+ readonly conditional: true;
1944
+ readonly note: string;
1945
+ };
1946
+ readonly overview: {
1947
+ readonly before: "storedetaileddescription";
1948
+ readonly after: "custitem_product_description";
1949
+ readonly target: "overview";
1950
+ readonly policy: "always";
1951
+ readonly conditional: true;
1952
+ };
1953
+ readonly pageTitle: {
1954
+ readonly before: "pagetitle";
1955
+ readonly after: "custitem_page_title";
1956
+ readonly target: "seoMetaData.title";
1957
+ readonly policy: "always";
1958
+ readonly conditional: true;
1959
+ };
1960
+ readonly online: {
1961
+ readonly before: "isonline";
1962
+ readonly after: "custitem_display_online";
1963
+ readonly target: "isOnline";
1964
+ readonly policy: "always";
1965
+ readonly conditional: true;
1966
+ readonly note: string;
1967
+ };
1968
+ readonly saleType: {
1969
+ readonly before: "dontshowprice";
1970
+ readonly after: "custitem_quote_only";
1971
+ readonly target: "saleType";
1972
+ readonly policy: "always";
1973
+ readonly conditional: true;
1974
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
1975
+ };
1976
+ readonly quoteOnly: {
1977
+ readonly before: "dontshowprice";
1978
+ readonly after: "custitem_quote_only";
1979
+ readonly target: "metaData.quoteOnly";
1980
+ readonly policy: "seed";
1981
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
1982
+ };
1983
+ readonly image: {
1984
+ readonly before: "storedisplayimage";
1985
+ readonly after: "custitem_itemimages";
1986
+ readonly target: "images";
1987
+ readonly policy: "always";
1988
+ readonly conditional: true;
1989
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
1990
+ };
1991
+ readonly category: {
1992
+ readonly before: "commercecategoryitemassociation.category";
1993
+ readonly after: "custitem_primary_category";
1994
+ readonly target: "category";
1995
+ readonly policy: "always";
1996
+ readonly conditional: true;
1997
+ readonly note: string;
1998
+ };
1999
+ readonly seoDescription: {
2000
+ readonly before: "metataghtml";
2001
+ readonly after: "custitem_meta_description";
2002
+ readonly target: "seoMetaData.description";
2003
+ readonly policy: "always";
2004
+ readonly conditional: true;
2005
+ readonly note: "The replacement exists but carries no data yet.";
2006
+ };
2007
+ readonly brand: {
2008
+ readonly before: "manufacturer";
2009
+ readonly target: "brand";
2010
+ readonly policy: "always";
2011
+ readonly conditional: true;
2012
+ readonly note: string;
2013
+ };
2014
+ readonly googleCategory: {
2015
+ readonly after: "custitemproducttype";
2016
+ readonly target: "googleCategory";
2017
+ readonly policy: "always";
2018
+ readonly conditional: true;
2019
+ readonly note: string;
2020
+ };
2021
+ readonly department: {
2022
+ readonly after: "custitemfas_product_category";
2023
+ readonly target: "department";
2024
+ readonly policy: "always";
2025
+ readonly conditional: true;
2026
+ readonly note: string;
2027
+ };
2028
+ readonly imageAlt: {
2029
+ readonly after: "custitemaltimgtext";
2030
+ readonly target: "images.alt";
2031
+ readonly policy: "always";
2032
+ readonly conditional: true;
2033
+ readonly note: string;
2034
+ };
2035
+ readonly family: {
2036
+ readonly after: "custitem_family";
2037
+ readonly target: "metaData.family";
2038
+ readonly policy: "seed";
2039
+ readonly pending: true;
2040
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
2041
+ };
2042
+ readonly primaryCategory: {
2043
+ readonly before: "commercecategoryitemassociation.primarycategory";
2044
+ readonly after: "custitem_primary_category";
2045
+ readonly target: "metaData.primaryCategory";
2046
+ readonly policy: "seed";
2047
+ readonly note: string;
2048
+ };
2049
+ readonly additionalCategories: {
2050
+ readonly sourceTable: "commercecategoryitemassociation";
2051
+ readonly after: "custitem_additional_categories";
2052
+ readonly target: "categories";
2053
+ readonly policy: "always";
2054
+ readonly note: string;
2055
+ readonly caution: string;
2056
+ };
2057
+ readonly micrositeDescription: {
2058
+ readonly after: "custitem_microsite_description";
2059
+ readonly target: "metaData.micrositeDescription";
2060
+ readonly policy: "seed";
2061
+ readonly pending: true;
2062
+ readonly note: "Populated on 2,284 items.";
2063
+ };
2064
+ readonly features: {
2065
+ readonly after: "custitem_features";
2066
+ readonly target: "metaData.features";
2067
+ readonly policy: "seed";
2068
+ readonly pending: true;
2069
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2070
+ };
2071
+ readonly childStoreOnly: {
2072
+ readonly after: "custitem_child_store_only";
2073
+ readonly target: "childOnly";
2074
+ readonly policy: "seed";
2075
+ readonly pending: true;
2076
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
2077
+ };
2078
+ };
2079
+
2080
+ type SyncPolicy = "always" | "seed";
2081
+ interface FieldMapping {
2082
+ before?: string;
2083
+ after?: string;
2084
+ sourceTable?: string;
2085
+ target: string;
2086
+ policy: SyncPolicy;
2087
+ pending?: boolean;
2088
+ conditional?: boolean;
2089
+ identity?: boolean;
2090
+ caution?: string;
2091
+ note?: string;
2092
+ }
2093
+ type FieldMap = Record<string, FieldMapping>;
2094
+
2095
+ declare const readMapped: (row: Record<string, unknown>, field: FieldMapping) => string | undefined;
2096
+ declare class NetsuiteFieldProvider<M extends FieldMap> {
2097
+ readonly entity: string;
2098
+ readonly fields: M;
2099
+ constructor(entity: string, fields: M);
2100
+ columns(extra?: readonly string[]): string[];
2101
+ select(alias: string, extra?: readonly string[]): string;
2102
+ read(row: Record<string, unknown>, key: keyof M): string | undefined;
2103
+ alwaysWritten(): string[];
2104
+ orphaned(): Array<[string, FieldMapping]>;
2105
+ pending(): Array<[string, FieldMapping]>;
2106
+ targetForSource(column: string): string | undefined;
2107
+ private entries;
2108
+ }
2109
+
2110
+ declare const RELATION_FIELDS: {
2111
+ readonly accessories: {
2112
+ readonly after: "custitem_accessories";
2113
+ readonly target: "relationGroups.accessories";
2114
+ readonly policy: "seed";
2115
+ readonly pending: true;
2116
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2117
+ };
2118
+ readonly toolKits: {
2119
+ readonly after: "custitem_tool_kits";
2120
+ readonly target: "relationGroups.tool-kits";
2121
+ readonly policy: "seed";
2122
+ readonly pending: true;
2123
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2124
+ };
2125
+ readonly parts: {
2126
+ readonly after: "custitem_parts";
2127
+ readonly target: "relationGroups.parts";
2128
+ readonly policy: "seed";
2129
+ readonly pending: true;
2130
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2131
+ };
2132
+ readonly similarProducts: {
2133
+ readonly after: "custitem_similiar_products";
2134
+ readonly target: "relationGroups.similar-products";
2135
+ readonly policy: "seed";
2136
+ readonly pending: true;
2137
+ readonly note: "The scriptid misspells Similar. That spelling is the real identifier.";
2138
+ };
2139
+ readonly frequentlyBought: {
2140
+ readonly before: "itemcorrelateditem";
2141
+ readonly after: "custitem_frequently_bought";
2142
+ readonly target: "relationGroups.frequently-bought-together";
2143
+ readonly policy: "seed";
2144
+ readonly pending: true;
2145
+ readonly note: "Before is NetSuite's own correlation feed, 894 rows, derived from SuiteCommerce traffic.";
2146
+ };
2147
+ readonly includedItems: {
2148
+ readonly after: "custitem_included_items";
2149
+ readonly target: "relationGroups.kit-contents";
2150
+ readonly policy: "seed";
2151
+ readonly pending: true;
2152
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2153
+ };
2154
+ readonly modelsAvailable: {
2155
+ readonly after: "custitem_models_available";
2156
+ readonly target: "relationGroups.models-available";
2157
+ readonly policy: "seed";
2158
+ readonly pending: true;
2159
+ readonly note: "Populated on 1,365 items. No relation group is seeded for it yet.";
2160
+ };
2161
+ };
2162
+
2163
+ declare const productFields: NetsuiteFieldProvider<{
2164
+ readonly netsuiteId: {
2165
+ readonly before: "item.id";
2166
+ readonly target: "netsuiteId";
2167
+ readonly policy: "always";
2168
+ readonly conditional: true;
2169
+ readonly note: string;
2170
+ };
2171
+ readonly sku: {
2172
+ readonly before: "item.itemid";
2173
+ readonly target: "sku";
2174
+ readonly policy: "always";
2175
+ readonly conditional: true;
2176
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2177
+ };
2178
+ readonly originalPrice: {
2179
+ readonly before: "itemprice at the Base Price level (1)";
2180
+ readonly target: "price.originalPrice";
2181
+ readonly policy: "always";
2182
+ readonly conditional: true;
2183
+ readonly note: string;
2184
+ };
2185
+ readonly discount: {
2186
+ readonly before: "derived from Base Price vs Online Price";
2187
+ readonly target: "price.discount";
2188
+ readonly policy: "always";
2189
+ readonly conditional: true;
2190
+ readonly note: string;
2191
+ };
2192
+ readonly weight: {
2193
+ readonly before: "weight + weightunit";
2194
+ readonly target: "shipping.weightLb";
2195
+ readonly policy: "always";
2196
+ readonly conditional: true;
2197
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
2198
+ };
2199
+ readonly dimensions: {
2200
+ readonly target: "shipping.lengthIn";
2201
+ readonly policy: "seed";
2202
+ readonly note: string;
2203
+ };
2204
+ readonly price: {
2205
+ readonly before: "itemprice at the online price level";
2206
+ readonly target: "price";
2207
+ readonly policy: "always";
2208
+ readonly conditional: true;
2209
+ readonly note: string;
2210
+ };
2211
+ readonly quantity: {
2212
+ readonly before: "quantityavailable";
2213
+ readonly target: "quantity";
2214
+ readonly policy: "always";
2215
+ readonly conditional: true;
2216
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2217
+ };
2218
+ readonly minimumQuantity: {
2219
+ readonly before: "minimumquantity";
2220
+ readonly target: "minimumQuantity";
2221
+ readonly policy: "always";
2222
+ readonly conditional: true;
2223
+ readonly note: string;
2224
+ };
2225
+ readonly maximumQuantity: {
2226
+ readonly before: "maximumquantity";
2227
+ readonly target: "maximumQuantity";
2228
+ readonly policy: "always";
2229
+ readonly conditional: true;
2230
+ readonly note: string;
2231
+ };
2232
+ readonly enforceMinimum: {
2233
+ readonly before: "enforceminqtyinternally";
2234
+ readonly target: "enforceMinimum";
2235
+ readonly policy: "always";
2236
+ readonly conditional: true;
2237
+ readonly note: string;
2238
+ };
2239
+ readonly isSparePart: {
2240
+ readonly before: "custitem303";
2241
+ readonly target: "isSparePart";
2242
+ readonly policy: "always";
2243
+ readonly conditional: true;
2244
+ readonly note: string;
2245
+ };
2246
+ readonly itemType: {
2247
+ readonly before: "itemtype";
2248
+ readonly target: "itemType";
2249
+ readonly policy: "always";
2250
+ readonly conditional: true;
2251
+ readonly note: string;
2252
+ };
2253
+ readonly stockDescription: {
2254
+ readonly before: "stockdescription";
2255
+ readonly target: "stockDescription";
2256
+ readonly policy: "always";
2257
+ readonly conditional: true;
2258
+ readonly note: string;
2259
+ };
2260
+ readonly noPriceMessage: {
2261
+ readonly before: "nopricemessage";
2262
+ readonly target: "noPriceMessage";
2263
+ readonly policy: "always";
2264
+ readonly conditional: true;
2265
+ readonly note: string;
2266
+ };
2267
+ readonly isSeriesComponent: {
2268
+ readonly before: "custitem40";
2269
+ readonly target: "isSeriesComponent";
2270
+ readonly policy: "always";
2271
+ readonly conditional: true;
2272
+ readonly note: string;
2273
+ };
2274
+ readonly flexWarrantyEligible: {
2275
+ readonly before: "custitem520";
2276
+ readonly target: "flexWarrantyEligible";
2277
+ readonly policy: "always";
2278
+ readonly conditional: true;
2279
+ readonly note: string;
2280
+ };
2281
+ readonly inventoryPolicy: {
2282
+ readonly before: "outofstockbehavior";
2283
+ readonly target: "inventoryPolicy";
2284
+ readonly policy: "always";
2285
+ readonly conditional: true;
2286
+ readonly note: string;
2287
+ };
2288
+ readonly status: {
2289
+ readonly before: "isinactive";
2290
+ readonly target: "status";
2291
+ readonly policy: "always";
2292
+ readonly conditional: true;
2293
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2294
+ };
2295
+ readonly shipping: {
2296
+ readonly before: "weight + weightunit";
2297
+ readonly target: "shipping";
2298
+ readonly policy: "always";
2299
+ readonly conditional: true;
2300
+ readonly note: string;
2301
+ };
2302
+ readonly slug: {
2303
+ readonly before: "urlcomponent";
2304
+ readonly after: "custitem_slug";
2305
+ readonly target: "slug";
2306
+ readonly policy: "seed";
2307
+ readonly identity: true;
2308
+ readonly note: "The storefront URL never moves once a product exists.";
2309
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
2310
+ };
2311
+ readonly name: {
2312
+ readonly before: "storedisplayname";
2313
+ readonly after: "custitem_product_name";
2314
+ readonly target: "name";
2315
+ readonly policy: "always";
2316
+ readonly conditional: true;
2317
+ readonly note: string;
2318
+ };
2319
+ readonly featured: {
2320
+ readonly before: "featureddescription";
2321
+ readonly after: "custitem_product_featured_description";
2322
+ readonly target: "description";
2323
+ readonly policy: "always";
2324
+ readonly conditional: true;
2325
+ readonly note: string;
2326
+ };
2327
+ readonly overview: {
2328
+ readonly before: "storedetaileddescription";
2329
+ readonly after: "custitem_product_description";
2330
+ readonly target: "overview";
2331
+ readonly policy: "always";
2332
+ readonly conditional: true;
2333
+ };
2334
+ readonly pageTitle: {
2335
+ readonly before: "pagetitle";
2336
+ readonly after: "custitem_page_title";
2337
+ readonly target: "seoMetaData.title";
2338
+ readonly policy: "always";
2339
+ readonly conditional: true;
2340
+ };
2341
+ readonly online: {
2342
+ readonly before: "isonline";
2343
+ readonly after: "custitem_display_online";
2344
+ readonly target: "isOnline";
2345
+ readonly policy: "always";
2346
+ readonly conditional: true;
2347
+ readonly note: string;
2348
+ };
2349
+ readonly saleType: {
2350
+ readonly before: "dontshowprice";
2351
+ readonly after: "custitem_quote_only";
2352
+ readonly target: "saleType";
2353
+ readonly policy: "always";
2354
+ readonly conditional: true;
2355
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
2356
+ };
2357
+ readonly quoteOnly: {
2358
+ readonly before: "dontshowprice";
2359
+ readonly after: "custitem_quote_only";
2360
+ readonly target: "metaData.quoteOnly";
2361
+ readonly policy: "seed";
2362
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
2363
+ };
2364
+ readonly image: {
2365
+ readonly before: "storedisplayimage";
2366
+ readonly after: "custitem_itemimages";
2367
+ readonly target: "images";
2368
+ readonly policy: "always";
2369
+ readonly conditional: true;
2370
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
2371
+ };
2372
+ readonly category: {
2373
+ readonly before: "commercecategoryitemassociation.category";
2374
+ readonly after: "custitem_primary_category";
2375
+ readonly target: "category";
2376
+ readonly policy: "always";
2377
+ readonly conditional: true;
2378
+ readonly note: string;
2379
+ };
2380
+ readonly seoDescription: {
2381
+ readonly before: "metataghtml";
2382
+ readonly after: "custitem_meta_description";
2383
+ readonly target: "seoMetaData.description";
2384
+ readonly policy: "always";
2385
+ readonly conditional: true;
2386
+ readonly note: "The replacement exists but carries no data yet.";
2387
+ };
2388
+ readonly brand: {
2389
+ readonly before: "manufacturer";
2390
+ readonly target: "brand";
2391
+ readonly policy: "always";
2392
+ readonly conditional: true;
2393
+ readonly note: string;
2394
+ };
2395
+ readonly googleCategory: {
2396
+ readonly after: "custitemproducttype";
2397
+ readonly target: "googleCategory";
2398
+ readonly policy: "always";
2399
+ readonly conditional: true;
2400
+ readonly note: string;
2401
+ };
2402
+ readonly department: {
2403
+ readonly after: "custitemfas_product_category";
2404
+ readonly target: "department";
2405
+ readonly policy: "always";
2406
+ readonly conditional: true;
2407
+ readonly note: string;
2408
+ };
2409
+ readonly imageAlt: {
2410
+ readonly after: "custitemaltimgtext";
2411
+ readonly target: "images.alt";
2412
+ readonly policy: "always";
2413
+ readonly conditional: true;
2414
+ readonly note: string;
2415
+ };
2416
+ readonly family: {
2417
+ readonly after: "custitem_family";
2418
+ readonly target: "metaData.family";
2419
+ readonly policy: "seed";
2420
+ readonly pending: true;
2421
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
2422
+ };
2423
+ readonly primaryCategory: {
2424
+ readonly before: "commercecategoryitemassociation.primarycategory";
2425
+ readonly after: "custitem_primary_category";
2426
+ readonly target: "metaData.primaryCategory";
2427
+ readonly policy: "seed";
2428
+ readonly note: string;
2429
+ };
2430
+ readonly additionalCategories: {
2431
+ readonly sourceTable: "commercecategoryitemassociation";
2432
+ readonly after: "custitem_additional_categories";
2433
+ readonly target: "categories";
2434
+ readonly policy: "always";
2435
+ readonly note: string;
2436
+ readonly caution: string;
2437
+ };
2438
+ readonly micrositeDescription: {
2439
+ readonly after: "custitem_microsite_description";
2440
+ readonly target: "metaData.micrositeDescription";
2441
+ readonly policy: "seed";
2442
+ readonly pending: true;
2443
+ readonly note: "Populated on 2,284 items.";
2444
+ };
2445
+ readonly features: {
2446
+ readonly after: "custitem_features";
2447
+ readonly target: "metaData.features";
2448
+ readonly policy: "seed";
2449
+ readonly pending: true;
2450
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2451
+ };
2452
+ readonly childStoreOnly: {
2453
+ readonly after: "custitem_child_store_only";
2454
+ readonly target: "childOnly";
2455
+ readonly policy: "seed";
2456
+ readonly pending: true;
2457
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
2458
+ };
2459
+ }>;
2460
+ declare const addonFields: NetsuiteFieldProvider<{
2461
+ readonly netsuiteItemId: {
2462
+ readonly before: "item.id";
2463
+ readonly target: "netsuite.itemId";
2464
+ readonly policy: "always";
2465
+ readonly conditional: true;
2466
+ readonly note: string;
2467
+ };
2468
+ readonly netsuiteItemName: {
2469
+ readonly before: "item.itemid";
2470
+ readonly target: "netsuite.itemName";
2471
+ readonly policy: "always";
2472
+ readonly conditional: true;
2473
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
2474
+ };
2475
+ readonly groupAndOption: {
2476
+ readonly before: "storedisplayname";
2477
+ readonly target: "name";
2478
+ readonly policy: "always";
2479
+ readonly conditional: true;
2480
+ readonly identity: true;
2481
+ readonly note: string;
2482
+ };
2483
+ readonly key: {
2484
+ readonly before: "urlcomponent";
2485
+ readonly target: "key";
2486
+ readonly policy: "always";
2487
+ readonly identity: true;
2488
+ readonly note: string;
2489
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
2490
+ };
2491
+ readonly active: {
2492
+ readonly before: "isinactive";
2493
+ readonly target: "status";
2494
+ readonly policy: "always";
2495
+ readonly conditional: true;
2496
+ readonly note: string;
2497
+ };
2498
+ readonly visible: {
2499
+ readonly before: "isonline";
2500
+ readonly target: "isVisible";
2501
+ readonly policy: "always";
2502
+ readonly conditional: true;
2503
+ readonly note: string;
2504
+ };
2505
+ readonly pricingType: {
2506
+ readonly target: "pricingType";
2507
+ readonly policy: "seed";
2508
+ readonly note: string;
2509
+ };
2510
+ readonly price: {
2511
+ readonly before: "itemprice at price level 1";
2512
+ readonly target: "price";
2513
+ readonly policy: "always";
2514
+ readonly conditional: true;
2515
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
2516
+ };
2517
+ readonly sellingPoints: {
2518
+ readonly before: "salesdescription";
2519
+ readonly target: "description";
2520
+ readonly policy: "always";
2521
+ readonly conditional: true;
2522
+ readonly note: string;
2523
+ };
2524
+ readonly detail: {
2525
+ readonly before: "storedetaileddescription";
2526
+ readonly target: "longDescription";
2527
+ readonly policy: "always";
2528
+ readonly conditional: true;
2529
+ readonly note: string;
2530
+ };
2531
+ readonly priceBand: {
2532
+ readonly before: "featureddescription";
2533
+ readonly target: "appliesFromPrice / appliesToPrice";
2534
+ readonly policy: "always";
2535
+ readonly conditional: true;
2536
+ readonly note: string;
2537
+ };
2538
+ readonly eligibilityGate: {
2539
+ readonly before: "custitem520";
2540
+ readonly target: "AddonGroup.netsuite.requiresField";
2541
+ readonly policy: "seed";
2542
+ readonly note: string;
2543
+ };
2544
+ }>;
2545
+ declare const brandFields: NetsuiteFieldProvider<{
2546
+ readonly name: {
2547
+ readonly before: "commercecategory.name";
2548
+ readonly after: "item.manufacturer";
2549
+ readonly target: "name";
2550
+ readonly policy: "always";
2551
+ };
2552
+ readonly online: {
2553
+ readonly before: "isonline";
2554
+ readonly after: "custitem_display_online";
2555
+ readonly target: "isOnline";
2556
+ readonly policy: "always";
2557
+ };
2558
+ readonly netsuiteId: {
2559
+ readonly before: "commercecategory.id";
2560
+ readonly target: "netsuiteId";
2561
+ readonly policy: "always";
2562
+ readonly conditional: true;
2563
+ readonly note: "No successor. The manufacturer name becomes the key.";
2564
+ };
2565
+ readonly slug: {
2566
+ readonly before: "commercecategory.urlfragment";
2567
+ readonly target: "slug";
2568
+ readonly policy: "seed";
2569
+ readonly identity: true;
2570
+ readonly note: string;
2571
+ readonly caution: string;
2572
+ };
2573
+ readonly logo: {
2574
+ readonly before: "thumbnail";
2575
+ readonly target: "logo";
2576
+ readonly policy: "always";
2577
+ readonly conditional: true;
2578
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
2579
+ };
2580
+ readonly description: {
2581
+ readonly before: "commercecategory.description";
2582
+ readonly target: "description";
2583
+ readonly policy: "always";
2584
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2585
+ };
2586
+ readonly sortOrder: {
2587
+ readonly before: "sequencenumber";
2588
+ readonly target: "sortOrder";
2589
+ readonly policy: "always";
2590
+ readonly conditional: true;
2591
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2592
+ };
2593
+ readonly seoTitle: {
2594
+ readonly before: "pagetitle";
2595
+ readonly target: "seoMetaData.title";
2596
+ readonly policy: "always";
2597
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2598
+ };
2599
+ readonly seoDescription: {
2600
+ readonly before: "metadescription";
2601
+ readonly target: "seoMetaData.description";
2602
+ readonly policy: "always";
2603
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2604
+ };
2605
+ readonly seoKeywords: {
2606
+ readonly before: "metakeywords";
2607
+ readonly target: "seoMetaData.keywords";
2608
+ readonly policy: "always";
2609
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2610
+ };
2611
+ readonly status: {
2612
+ readonly before: "isinactive + displayinsite";
2613
+ readonly target: "status";
2614
+ readonly policy: "always";
2615
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2616
+ };
2617
+ readonly headerTag: {
2618
+ readonly before: "pageheading";
2619
+ readonly target: "seoMetaData.headerTag";
2620
+ readonly policy: "always";
2621
+ readonly note: string;
2622
+ };
2623
+ readonly banners: {
2624
+ readonly before: "pagebanner";
2625
+ readonly target: "banners";
2626
+ readonly policy: "seed";
2627
+ readonly note: string;
2628
+ };
2629
+ readonly logoUrl: {
2630
+ readonly before: "custrecord35";
2631
+ readonly target: "logo";
2632
+ readonly policy: "seed";
2633
+ readonly pending: true;
2634
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
2635
+ };
2636
+ }>;
2637
+ declare const categoryFields: NetsuiteFieldProvider<{
2638
+ readonly name: {
2639
+ readonly before: "commercecategory.name";
2640
+ readonly after: "custitem_category";
2641
+ readonly target: "name";
2642
+ readonly policy: "always";
2643
+ readonly note: "After is a flat string stamped on the item, not a record.";
2644
+ };
2645
+ readonly online: {
2646
+ readonly before: "isonline";
2647
+ readonly after: "custitem_display_online";
2648
+ readonly target: "isOnline";
2649
+ readonly policy: "always";
2650
+ };
2651
+ readonly netsuiteId: {
2652
+ readonly before: "commercecategory.id";
2653
+ readonly target: "netsuiteId";
2654
+ readonly policy: "always";
2655
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2656
+ };
2657
+ readonly slug: {
2658
+ readonly before: "urlfragment";
2659
+ readonly target: "slug";
2660
+ readonly policy: "seed";
2661
+ readonly identity: true;
2662
+ readonly note: string;
2663
+ readonly caution: string;
2664
+ };
2665
+ readonly image: {
2666
+ readonly before: "thumbnail";
2667
+ readonly target: "image";
2668
+ readonly policy: "always";
2669
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
2670
+ };
2671
+ readonly description: {
2672
+ readonly before: "commercecategory.description";
2673
+ readonly target: "description";
2674
+ readonly policy: "always";
2675
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2676
+ };
2677
+ readonly sortOrder: {
2678
+ readonly before: "sequencenumber";
2679
+ readonly target: "sortOrder";
2680
+ readonly policy: "always";
2681
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2682
+ };
2683
+ readonly seoTitle: {
2684
+ readonly before: "pagetitle";
2685
+ readonly target: "seoMetaData.title";
2686
+ readonly policy: "always";
2687
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2688
+ };
2689
+ readonly seoDescription: {
2690
+ readonly before: "metadescription";
2691
+ readonly target: "seoMetaData.description";
2692
+ readonly policy: "always";
2693
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2694
+ };
2695
+ readonly seoKeywords: {
2696
+ readonly before: "metakeywords";
2697
+ readonly target: "seoMetaData.keywords";
2698
+ readonly policy: "always";
2699
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2700
+ };
2701
+ readonly status: {
2702
+ readonly before: "isinactive + displayinsite";
2703
+ readonly target: "status";
2704
+ readonly policy: "always";
2705
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2706
+ };
2707
+ readonly parent: {
2708
+ readonly before: "primaryparent";
2709
+ readonly after: "custitem_primary_category";
2710
+ readonly target: "parent";
2711
+ readonly policy: "always";
2712
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
2713
+ };
2714
+ readonly subcategories: {
2715
+ readonly before: "commercecategoryassociation.subcategory";
2716
+ readonly target: "subcategories";
2717
+ readonly policy: "always";
2718
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
2719
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
2720
+ };
2721
+ readonly headerTag: {
2722
+ readonly before: "pageheading";
2723
+ readonly target: "seoMetaData.headerTag";
2724
+ readonly policy: "always";
2725
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
2726
+ };
2727
+ readonly banners: {
2728
+ readonly before: "pagebanner";
2729
+ readonly target: "banners";
2730
+ readonly policy: "seed";
2731
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
2732
+ };
2733
+ readonly imageUrl: {
2734
+ readonly before: "custrecord35";
2735
+ readonly target: "image";
2736
+ readonly policy: "seed";
2737
+ readonly pending: true;
2738
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
2739
+ };
2740
+ readonly faq: {
2741
+ readonly before: "custrecord_faq_q1";
2742
+ readonly target: "metaData.faq";
2743
+ readonly policy: "seed";
2744
+ readonly pending: true;
2745
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
2746
+ };
2747
+ }>;
2748
+ declare const couponFields: NetsuiteFieldProvider<{
2749
+ promotionId: {
2750
+ before: string;
2751
+ target: string;
2752
+ policy: "always";
2753
+ conditional: true;
2754
+ note: string;
2755
+ };
2756
+ title: {
2757
+ before: string;
2758
+ target: string;
2759
+ policy: "always";
2760
+ conditional: true;
2761
+ note: string;
2762
+ };
2763
+ promotionName: {
2764
+ before: string;
2765
+ target: string;
2766
+ policy: "always";
2767
+ conditional: true;
2768
+ note: string;
2769
+ };
2770
+ couponCode: {
2771
+ before: string;
2772
+ target: string;
2773
+ policy: "always";
2774
+ identity: true;
2775
+ note: string;
2776
+ caution: string;
2777
+ };
2778
+ discountType: {
2779
+ before: string;
2780
+ target: string;
2781
+ policy: "always";
2782
+ conditional: true;
2783
+ note: string;
2784
+ };
2785
+ discountValue: {
2786
+ before: string;
2787
+ target: string;
2788
+ policy: "always";
2789
+ conditional: true;
2790
+ note: string;
2791
+ };
2792
+ startTime: {
2793
+ before: string;
2794
+ target: string;
2795
+ policy: "always";
2796
+ conditional: true;
2797
+ note: string;
2798
+ };
2799
+ endTime: {
2800
+ before: string;
2801
+ target: string;
2802
+ policy: "always";
2803
+ conditional: true;
2804
+ note: string;
2805
+ };
2806
+ status: {
2807
+ before: string;
2808
+ target: string;
2809
+ policy: "always";
2810
+ conditional: true;
2811
+ note: string;
2812
+ };
2813
+ discountItemId: {
2814
+ before: string;
2815
+ target: string;
2816
+ policy: "always";
2817
+ conditional: true;
2818
+ note: string;
2819
+ };
2820
+ discountItemName: {
2821
+ before: string;
2822
+ target: string;
2823
+ policy: "always";
2824
+ conditional: true;
2825
+ note: string;
2826
+ };
2827
+ discountReducesTax: {
2828
+ before: string;
2829
+ target: string;
2830
+ policy: "always";
2831
+ conditional: true;
2832
+ note: string;
2833
+ };
2834
+ applyDiscountTo: {
2835
+ before: string;
2836
+ target: string;
2837
+ policy: "always";
2838
+ conditional: true;
2839
+ note: string;
2840
+ };
2841
+ freeShipping: {
2842
+ before: string;
2843
+ target: string;
2844
+ policy: "always";
2845
+ conditional: true;
2846
+ note: string;
2847
+ };
2848
+ description: {
2849
+ before: string;
2850
+ target: string;
2851
+ policy: "always";
2852
+ conditional: true;
2853
+ note: string;
2854
+ };
2855
+ isPromotional: {
2856
+ before: string;
2857
+ target: string;
2858
+ policy: "always";
2859
+ conditional: true;
2860
+ note: string;
2861
+ };
2862
+ singleUse: {
2863
+ before: string;
2864
+ target: string;
2865
+ policy: "always";
2866
+ conditional: true;
2867
+ note: string;
2868
+ };
2869
+ itemRestrictions: {
2870
+ before: string;
2871
+ target: string;
2872
+ policy: "always";
2873
+ conditional: true;
2874
+ note: string;
2875
+ };
2876
+ minimumAmount: {
2877
+ before: string;
2878
+ target: string;
2879
+ policy: "always";
2880
+ conditional: true;
2881
+ note: string;
2882
+ };
2883
+ stores: {
2884
+ target: string;
2885
+ policy: "seed";
2886
+ note: string;
2887
+ };
2888
+ }>;
2889
+ declare const podcastFields: NetsuiteFieldProvider<{
2890
+ guid: {
2891
+ before: string;
2892
+ target: string;
2893
+ policy: "always";
2894
+ conditional: true;
2895
+ note: string;
2896
+ };
2897
+ title: {
2898
+ before: string;
2899
+ target: string;
2900
+ policy: "always";
2901
+ conditional: true;
2902
+ note: string;
2903
+ };
2904
+ slug: {
2905
+ target: string;
2906
+ policy: "seed";
2907
+ identity: true;
2908
+ note: string;
2909
+ caution: string;
2910
+ };
2911
+ summary: {
2912
+ before: string;
2913
+ target: string;
2914
+ policy: "always";
2915
+ conditional: true;
2916
+ note: string;
2917
+ };
2918
+ showNotes: {
2919
+ before: string;
2920
+ target: string;
2921
+ policy: "always";
2922
+ conditional: true;
2923
+ note: string;
2924
+ };
2925
+ audioUrl: {
2926
+ before: string;
2927
+ target: string;
2928
+ policy: "always";
2929
+ conditional: true;
2930
+ note: string;
2931
+ };
2932
+ artwork: {
2933
+ before: string;
2934
+ target: string;
2935
+ policy: "always";
2936
+ conditional: true;
2937
+ note: string;
2938
+ };
2939
+ durationSeconds: {
2940
+ before: string;
2941
+ target: string;
2942
+ policy: "always";
2943
+ conditional: true;
2944
+ note: string;
2945
+ };
2946
+ episodeNumber: {
2947
+ before: string;
2948
+ target: string;
2949
+ policy: "always";
2950
+ conditional: true;
2951
+ note: string;
2952
+ };
2953
+ seasonNumber: {
2954
+ before: string;
2955
+ target: string;
2956
+ policy: "always";
2957
+ conditional: true;
2958
+ note: string;
2959
+ };
2960
+ publishedAt: {
2961
+ before: string;
2962
+ target: string;
2963
+ policy: "always";
2964
+ conditional: true;
2965
+ note: string;
2966
+ };
2967
+ externalUrl: {
2968
+ before: string;
2969
+ target: string;
2970
+ policy: "always";
2971
+ conditional: true;
2972
+ note: string;
2973
+ };
2974
+ seoTitle: {
2975
+ before: string;
2976
+ target: string;
2977
+ policy: "always";
2978
+ conditional: true;
2979
+ note: string;
2980
+ };
2981
+ seoDescription: {
2982
+ before: string;
2983
+ target: string;
2984
+ policy: "always";
2985
+ conditional: true;
2986
+ note: string;
2987
+ };
2988
+ transcript: {
2989
+ target: string;
2990
+ policy: "seed";
2991
+ note: string;
2992
+ };
2993
+ relatedProducts: {
2994
+ target: string;
2995
+ policy: "seed";
2996
+ note: string;
2997
+ };
2998
+ stores: {
2999
+ target: string;
3000
+ policy: "seed";
3001
+ note: string;
3002
+ };
3003
+ status: {
3004
+ target: string;
3005
+ policy: "seed";
3006
+ note: string;
3007
+ };
3008
+ isOnline: {
3009
+ target: string;
3010
+ policy: "seed";
3011
+ note: string;
3012
+ };
3013
+ }>;
3014
+ declare const blogPostFields: NetsuiteFieldProvider<{
3015
+ netsuiteId: {
3016
+ before: string;
3017
+ target: string;
3018
+ policy: "always";
3019
+ conditional: true;
3020
+ note: string;
3021
+ };
3022
+ netsuitePostId: {
3023
+ before: string;
3024
+ target: string;
3025
+ policy: "always";
3026
+ conditional: true;
3027
+ note: string;
3028
+ };
3029
+ title: {
3030
+ before: string;
3031
+ target: string;
3032
+ policy: "always";
3033
+ conditional: true;
3034
+ note: string;
3035
+ };
3036
+ slug: {
3037
+ before: string;
3038
+ target: string;
3039
+ policy: "always";
3040
+ conditional: true;
3041
+ note: string;
3042
+ caution: string;
3043
+ };
3044
+ subtitle: {
3045
+ before: string;
3046
+ target: string;
3047
+ policy: "always";
3048
+ conditional: true;
3049
+ note: string;
3050
+ };
3051
+ content: {
3052
+ before: string;
3053
+ target: string;
3054
+ policy: "always";
3055
+ conditional: true;
3056
+ note: string;
3057
+ };
3058
+ publishedAt: {
3059
+ before: string;
3060
+ target: string;
3061
+ policy: "always";
3062
+ conditional: true;
3063
+ note: string;
3064
+ };
3065
+ author: {
3066
+ before: string;
3067
+ target: string;
3068
+ policy: "always";
3069
+ conditional: true;
3070
+ note: string;
3071
+ };
3072
+ category: {
3073
+ before: string;
3074
+ target: string;
3075
+ policy: "always";
3076
+ conditional: true;
3077
+ note: string;
3078
+ };
3079
+ headerImage: {
3080
+ before: string;
3081
+ target: string;
3082
+ policy: "always";
3083
+ conditional: true;
3084
+ note: string;
3085
+ };
3086
+ headerImageAlt: {
3087
+ before: string;
3088
+ target: string;
3089
+ policy: "always";
3090
+ conditional: true;
3091
+ note: string;
3092
+ };
3093
+ thumbnail: {
3094
+ before: string;
3095
+ target: string;
3096
+ policy: "always";
3097
+ conditional: true;
3098
+ note: string;
3099
+ };
3100
+ thumbnailAlt: {
3101
+ before: string;
3102
+ target: string;
3103
+ policy: "always";
3104
+ conditional: true;
3105
+ note: string;
3106
+ };
3107
+ excerpt: {
3108
+ before: string;
3109
+ target: string;
3110
+ policy: "always";
3111
+ conditional: true;
3112
+ note: string;
3113
+ };
3114
+ tags: {
3115
+ before: string;
3116
+ target: string;
3117
+ policy: "always";
3118
+ conditional: true;
3119
+ note: string;
3120
+ };
3121
+ pinnedTo: {
3122
+ before: string;
3123
+ target: string;
3124
+ policy: "always";
3125
+ conditional: true;
3126
+ note: string;
3127
+ };
3128
+ status: {
3129
+ before: string;
3130
+ target: string;
3131
+ policy: "always";
3132
+ conditional: true;
3133
+ note: string;
3134
+ };
3135
+ seoTitle: {
3136
+ before: string;
3137
+ target: string;
3138
+ policy: "always";
3139
+ conditional: true;
3140
+ note: string;
3141
+ };
3142
+ seoDescription: {
3143
+ before: string;
3144
+ target: string;
3145
+ policy: "always";
3146
+ conditional: true;
3147
+ note: string;
3148
+ };
3149
+ seoKeywords: {
3150
+ before: string;
3151
+ target: string;
3152
+ policy: "always";
3153
+ conditional: true;
3154
+ note: string;
3155
+ };
3156
+ headerTag: {
3157
+ before: string;
3158
+ target: string;
3159
+ policy: "always";
3160
+ conditional: true;
3161
+ note: string;
3162
+ };
3163
+ readingMinutes: {
3164
+ target: string;
3165
+ policy: "seed";
3166
+ note: string;
3167
+ };
3168
+ relatedProducts: {
3169
+ target: string;
3170
+ policy: "seed";
3171
+ note: string;
3172
+ };
3173
+ stores: {
3174
+ target: string;
3175
+ policy: "seed";
3176
+ note: string;
3177
+ };
3178
+ }>;
3179
+ declare const blogAuthorFields: NetsuiteFieldProvider<{
3180
+ netsuiteId: {
3181
+ before: string;
3182
+ target: string;
3183
+ policy: "always";
3184
+ conditional: true;
3185
+ note: string;
3186
+ };
3187
+ name: {
3188
+ before: string;
3189
+ target: string;
3190
+ policy: "always";
3191
+ conditional: true;
3192
+ note: string;
3193
+ };
3194
+ status: {
3195
+ before: string;
3196
+ target: string;
3197
+ policy: "always";
3198
+ conditional: true;
3199
+ note: string;
3200
+ };
3201
+ slug: {
3202
+ target: string;
3203
+ policy: "seed";
3204
+ identity: true;
3205
+ note: string;
3206
+ caution: string;
3207
+ };
3208
+ bio: {
3209
+ target: string;
3210
+ policy: "seed";
3211
+ note: string;
3212
+ };
3213
+ seoTitle: {
3214
+ target: string;
3215
+ policy: "seed";
3216
+ note: string;
3217
+ };
3218
+ seoDescription: {
3219
+ target: string;
3220
+ policy: "seed";
3221
+ note: string;
3222
+ };
3223
+ seoKeywords: {
3224
+ target: string;
3225
+ policy: "seed";
3226
+ note: string;
3227
+ };
3228
+ role: {
3229
+ target: string;
3230
+ policy: "seed";
3231
+ note: string;
3232
+ };
3233
+ avatar: {
3234
+ target: string;
3235
+ policy: "seed";
3236
+ note: string;
3237
+ };
3238
+ }>;
3239
+ declare const blogCategoryFields: NetsuiteFieldProvider<{
3240
+ netsuiteId: {
3241
+ before: string;
3242
+ target: string;
3243
+ policy: "always";
3244
+ conditional: true;
3245
+ note: string;
3246
+ };
3247
+ name: {
3248
+ before: string;
3249
+ target: string;
3250
+ policy: "always";
3251
+ conditional: true;
3252
+ note: string;
3253
+ };
3254
+ status: {
3255
+ before: string;
3256
+ target: string;
3257
+ policy: "always";
3258
+ conditional: true;
3259
+ note: string;
3260
+ };
3261
+ slug: {
3262
+ target: string;
3263
+ policy: "seed";
3264
+ identity: true;
3265
+ note: string;
3266
+ caution: string;
3267
+ };
3268
+ description: {
3269
+ target: string;
3270
+ policy: "seed";
3271
+ note: string;
3272
+ };
3273
+ seoTitle: {
3274
+ target: string;
3275
+ policy: "seed";
3276
+ note: string;
3277
+ };
3278
+ seoDescription: {
3279
+ target: string;
3280
+ policy: "seed";
3281
+ note: string;
3282
+ };
3283
+ seoKeywords: {
3284
+ target: string;
3285
+ policy: "seed";
3286
+ note: string;
3287
+ };
3288
+ image: {
3289
+ target: string;
3290
+ policy: "seed";
3291
+ note: string;
3292
+ };
3293
+ sortOrder: {
3294
+ target: string;
3295
+ policy: "seed";
3296
+ note: string;
3297
+ };
3298
+ }>;
3299
+ declare const PROVIDERS: readonly [NetsuiteFieldProvider<{
3300
+ readonly netsuiteId: {
3301
+ readonly before: "item.id";
3302
+ readonly target: "netsuiteId";
3303
+ readonly policy: "always";
3304
+ readonly conditional: true;
3305
+ readonly note: string;
3306
+ };
3307
+ readonly sku: {
3308
+ readonly before: "item.itemid";
3309
+ readonly target: "sku";
3310
+ readonly policy: "always";
3311
+ readonly conditional: true;
3312
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3313
+ };
3314
+ readonly originalPrice: {
3315
+ readonly before: "itemprice at the Base Price level (1)";
3316
+ readonly target: "price.originalPrice";
3317
+ readonly policy: "always";
3318
+ readonly conditional: true;
3319
+ readonly note: string;
3320
+ };
3321
+ readonly discount: {
3322
+ readonly before: "derived from Base Price vs Online Price";
3323
+ readonly target: "price.discount";
3324
+ readonly policy: "always";
3325
+ readonly conditional: true;
3326
+ readonly note: string;
3327
+ };
3328
+ readonly weight: {
3329
+ readonly before: "weight + weightunit";
3330
+ readonly target: "shipping.weightLb";
3331
+ readonly policy: "always";
3332
+ readonly conditional: true;
3333
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
3334
+ };
3335
+ readonly dimensions: {
3336
+ readonly target: "shipping.lengthIn";
3337
+ readonly policy: "seed";
3338
+ readonly note: string;
3339
+ };
3340
+ readonly price: {
3341
+ readonly before: "itemprice at the online price level";
3342
+ readonly target: "price";
3343
+ readonly policy: "always";
3344
+ readonly conditional: true;
3345
+ readonly note: string;
3346
+ };
3347
+ readonly quantity: {
3348
+ readonly before: "quantityavailable";
3349
+ readonly target: "quantity";
3350
+ readonly policy: "always";
3351
+ readonly conditional: true;
3352
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3353
+ };
3354
+ readonly minimumQuantity: {
3355
+ readonly before: "minimumquantity";
3356
+ readonly target: "minimumQuantity";
3357
+ readonly policy: "always";
3358
+ readonly conditional: true;
3359
+ readonly note: string;
3360
+ };
3361
+ readonly maximumQuantity: {
3362
+ readonly before: "maximumquantity";
3363
+ readonly target: "maximumQuantity";
3364
+ readonly policy: "always";
3365
+ readonly conditional: true;
3366
+ readonly note: string;
3367
+ };
3368
+ readonly enforceMinimum: {
3369
+ readonly before: "enforceminqtyinternally";
3370
+ readonly target: "enforceMinimum";
3371
+ readonly policy: "always";
3372
+ readonly conditional: true;
3373
+ readonly note: string;
3374
+ };
3375
+ readonly isSparePart: {
3376
+ readonly before: "custitem303";
3377
+ readonly target: "isSparePart";
3378
+ readonly policy: "always";
3379
+ readonly conditional: true;
3380
+ readonly note: string;
3381
+ };
3382
+ readonly itemType: {
3383
+ readonly before: "itemtype";
3384
+ readonly target: "itemType";
3385
+ readonly policy: "always";
3386
+ readonly conditional: true;
3387
+ readonly note: string;
3388
+ };
3389
+ readonly stockDescription: {
3390
+ readonly before: "stockdescription";
3391
+ readonly target: "stockDescription";
3392
+ readonly policy: "always";
3393
+ readonly conditional: true;
3394
+ readonly note: string;
3395
+ };
3396
+ readonly noPriceMessage: {
3397
+ readonly before: "nopricemessage";
3398
+ readonly target: "noPriceMessage";
3399
+ readonly policy: "always";
3400
+ readonly conditional: true;
3401
+ readonly note: string;
3402
+ };
3403
+ readonly isSeriesComponent: {
3404
+ readonly before: "custitem40";
3405
+ readonly target: "isSeriesComponent";
3406
+ readonly policy: "always";
3407
+ readonly conditional: true;
3408
+ readonly note: string;
3409
+ };
3410
+ readonly flexWarrantyEligible: {
3411
+ readonly before: "custitem520";
3412
+ readonly target: "flexWarrantyEligible";
3413
+ readonly policy: "always";
3414
+ readonly conditional: true;
3415
+ readonly note: string;
3416
+ };
3417
+ readonly inventoryPolicy: {
3418
+ readonly before: "outofstockbehavior";
3419
+ readonly target: "inventoryPolicy";
3420
+ readonly policy: "always";
3421
+ readonly conditional: true;
3422
+ readonly note: string;
3423
+ };
3424
+ readonly status: {
3425
+ readonly before: "isinactive";
3426
+ readonly target: "status";
3427
+ readonly policy: "always";
3428
+ readonly conditional: true;
3429
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3430
+ };
3431
+ readonly shipping: {
3432
+ readonly before: "weight + weightunit";
3433
+ readonly target: "shipping";
3434
+ readonly policy: "always";
3435
+ readonly conditional: true;
3436
+ readonly note: string;
3437
+ };
3438
+ readonly slug: {
3439
+ readonly before: "urlcomponent";
3440
+ readonly after: "custitem_slug";
3441
+ readonly target: "slug";
3442
+ readonly policy: "seed";
3443
+ readonly identity: true;
3444
+ readonly note: "The storefront URL never moves once a product exists.";
3445
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
3446
+ };
3447
+ readonly name: {
3448
+ readonly before: "storedisplayname";
3449
+ readonly after: "custitem_product_name";
3450
+ readonly target: "name";
3451
+ readonly policy: "always";
3452
+ readonly conditional: true;
3453
+ readonly note: string;
3454
+ };
3455
+ readonly featured: {
3456
+ readonly before: "featureddescription";
3457
+ readonly after: "custitem_product_featured_description";
3458
+ readonly target: "description";
3459
+ readonly policy: "always";
3460
+ readonly conditional: true;
3461
+ readonly note: string;
3462
+ };
3463
+ readonly overview: {
3464
+ readonly before: "storedetaileddescription";
3465
+ readonly after: "custitem_product_description";
3466
+ readonly target: "overview";
3467
+ readonly policy: "always";
3468
+ readonly conditional: true;
3469
+ };
3470
+ readonly pageTitle: {
3471
+ readonly before: "pagetitle";
3472
+ readonly after: "custitem_page_title";
3473
+ readonly target: "seoMetaData.title";
3474
+ readonly policy: "always";
3475
+ readonly conditional: true;
3476
+ };
3477
+ readonly online: {
3478
+ readonly before: "isonline";
3479
+ readonly after: "custitem_display_online";
3480
+ readonly target: "isOnline";
3481
+ readonly policy: "always";
3482
+ readonly conditional: true;
3483
+ readonly note: string;
3484
+ };
3485
+ readonly saleType: {
3486
+ readonly before: "dontshowprice";
3487
+ readonly after: "custitem_quote_only";
3488
+ readonly target: "saleType";
3489
+ readonly policy: "always";
3490
+ readonly conditional: true;
3491
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
3492
+ };
3493
+ readonly quoteOnly: {
3494
+ readonly before: "dontshowprice";
3495
+ readonly after: "custitem_quote_only";
3496
+ readonly target: "metaData.quoteOnly";
3497
+ readonly policy: "seed";
3498
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
3499
+ };
3500
+ readonly image: {
3501
+ readonly before: "storedisplayimage";
3502
+ readonly after: "custitem_itemimages";
3503
+ readonly target: "images";
3504
+ readonly policy: "always";
3505
+ readonly conditional: true;
3506
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
3507
+ };
3508
+ readonly category: {
3509
+ readonly before: "commercecategoryitemassociation.category";
3510
+ readonly after: "custitem_primary_category";
3511
+ readonly target: "category";
3512
+ readonly policy: "always";
3513
+ readonly conditional: true;
3514
+ readonly note: string;
3515
+ };
3516
+ readonly seoDescription: {
3517
+ readonly before: "metataghtml";
3518
+ readonly after: "custitem_meta_description";
3519
+ readonly target: "seoMetaData.description";
3520
+ readonly policy: "always";
3521
+ readonly conditional: true;
3522
+ readonly note: "The replacement exists but carries no data yet.";
3523
+ };
3524
+ readonly brand: {
3525
+ readonly before: "manufacturer";
3526
+ readonly target: "brand";
3527
+ readonly policy: "always";
3528
+ readonly conditional: true;
3529
+ readonly note: string;
3530
+ };
3531
+ readonly googleCategory: {
3532
+ readonly after: "custitemproducttype";
3533
+ readonly target: "googleCategory";
3534
+ readonly policy: "always";
3535
+ readonly conditional: true;
3536
+ readonly note: string;
3537
+ };
3538
+ readonly department: {
3539
+ readonly after: "custitemfas_product_category";
3540
+ readonly target: "department";
3541
+ readonly policy: "always";
3542
+ readonly conditional: true;
3543
+ readonly note: string;
3544
+ };
3545
+ readonly imageAlt: {
3546
+ readonly after: "custitemaltimgtext";
3547
+ readonly target: "images.alt";
3548
+ readonly policy: "always";
3549
+ readonly conditional: true;
3550
+ readonly note: string;
3551
+ };
3552
+ readonly family: {
3553
+ readonly after: "custitem_family";
3554
+ readonly target: "metaData.family";
3555
+ readonly policy: "seed";
3556
+ readonly pending: true;
3557
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
3558
+ };
3559
+ readonly primaryCategory: {
3560
+ readonly before: "commercecategoryitemassociation.primarycategory";
3561
+ readonly after: "custitem_primary_category";
3562
+ readonly target: "metaData.primaryCategory";
3563
+ readonly policy: "seed";
3564
+ readonly note: string;
3565
+ };
3566
+ readonly additionalCategories: {
3567
+ readonly sourceTable: "commercecategoryitemassociation";
3568
+ readonly after: "custitem_additional_categories";
3569
+ readonly target: "categories";
3570
+ readonly policy: "always";
3571
+ readonly note: string;
3572
+ readonly caution: string;
3573
+ };
3574
+ readonly micrositeDescription: {
3575
+ readonly after: "custitem_microsite_description";
3576
+ readonly target: "metaData.micrositeDescription";
3577
+ readonly policy: "seed";
3578
+ readonly pending: true;
3579
+ readonly note: "Populated on 2,284 items.";
3580
+ };
3581
+ readonly features: {
3582
+ readonly after: "custitem_features";
3583
+ readonly target: "metaData.features";
3584
+ readonly policy: "seed";
3585
+ readonly pending: true;
3586
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3587
+ };
3588
+ readonly childStoreOnly: {
3589
+ readonly after: "custitem_child_store_only";
3590
+ readonly target: "childOnly";
3591
+ readonly policy: "seed";
3592
+ readonly pending: true;
3593
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
3594
+ };
3595
+ }>, NetsuiteFieldProvider<{
3596
+ readonly netsuiteItemId: {
3597
+ readonly before: "item.id";
3598
+ readonly target: "netsuite.itemId";
3599
+ readonly policy: "always";
3600
+ readonly conditional: true;
3601
+ readonly note: string;
3602
+ };
3603
+ readonly netsuiteItemName: {
3604
+ readonly before: "item.itemid";
3605
+ readonly target: "netsuite.itemName";
3606
+ readonly policy: "always";
3607
+ readonly conditional: true;
3608
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
3609
+ };
3610
+ readonly groupAndOption: {
3611
+ readonly before: "storedisplayname";
3612
+ readonly target: "name";
3613
+ readonly policy: "always";
3614
+ readonly conditional: true;
3615
+ readonly identity: true;
3616
+ readonly note: string;
3617
+ };
3618
+ readonly key: {
3619
+ readonly before: "urlcomponent";
3620
+ readonly target: "key";
3621
+ readonly policy: "always";
3622
+ readonly identity: true;
3623
+ readonly note: string;
3624
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
3625
+ };
3626
+ readonly active: {
3627
+ readonly before: "isinactive";
3628
+ readonly target: "status";
3629
+ readonly policy: "always";
3630
+ readonly conditional: true;
3631
+ readonly note: string;
3632
+ };
3633
+ readonly visible: {
3634
+ readonly before: "isonline";
3635
+ readonly target: "isVisible";
3636
+ readonly policy: "always";
3637
+ readonly conditional: true;
3638
+ readonly note: string;
3639
+ };
3640
+ readonly pricingType: {
3641
+ readonly target: "pricingType";
3642
+ readonly policy: "seed";
3643
+ readonly note: string;
3644
+ };
3645
+ readonly price: {
3646
+ readonly before: "itemprice at price level 1";
3647
+ readonly target: "price";
3648
+ readonly policy: "always";
3649
+ readonly conditional: true;
3650
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
3651
+ };
3652
+ readonly sellingPoints: {
3653
+ readonly before: "salesdescription";
3654
+ readonly target: "description";
3655
+ readonly policy: "always";
3656
+ readonly conditional: true;
3657
+ readonly note: string;
3658
+ };
3659
+ readonly detail: {
3660
+ readonly before: "storedetaileddescription";
3661
+ readonly target: "longDescription";
3662
+ readonly policy: "always";
3663
+ readonly conditional: true;
3664
+ readonly note: string;
3665
+ };
3666
+ readonly priceBand: {
3667
+ readonly before: "featureddescription";
3668
+ readonly target: "appliesFromPrice / appliesToPrice";
3669
+ readonly policy: "always";
3670
+ readonly conditional: true;
3671
+ readonly note: string;
3672
+ };
3673
+ readonly eligibilityGate: {
3674
+ readonly before: "custitem520";
3675
+ readonly target: "AddonGroup.netsuite.requiresField";
3676
+ readonly policy: "seed";
3677
+ readonly note: string;
3678
+ };
3679
+ }>, NetsuiteFieldProvider<{
3680
+ readonly name: {
3681
+ readonly before: "commercecategory.name";
3682
+ readonly after: "item.manufacturer";
3683
+ readonly target: "name";
3684
+ readonly policy: "always";
3685
+ };
3686
+ readonly online: {
3687
+ readonly before: "isonline";
3688
+ readonly after: "custitem_display_online";
3689
+ readonly target: "isOnline";
3690
+ readonly policy: "always";
3691
+ };
3692
+ readonly netsuiteId: {
3693
+ readonly before: "commercecategory.id";
3694
+ readonly target: "netsuiteId";
3695
+ readonly policy: "always";
3696
+ readonly conditional: true;
3697
+ readonly note: "No successor. The manufacturer name becomes the key.";
3698
+ };
3699
+ readonly slug: {
3700
+ readonly before: "commercecategory.urlfragment";
3701
+ readonly target: "slug";
3702
+ readonly policy: "seed";
3703
+ readonly identity: true;
3704
+ readonly note: string;
3705
+ readonly caution: string;
3706
+ };
3707
+ readonly logo: {
3708
+ readonly before: "thumbnail";
3709
+ readonly target: "logo";
3710
+ readonly policy: "always";
3711
+ readonly conditional: true;
3712
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
3713
+ };
3714
+ readonly description: {
3715
+ readonly before: "commercecategory.description";
3716
+ readonly target: "description";
3717
+ readonly policy: "always";
3718
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3719
+ };
3720
+ readonly sortOrder: {
3721
+ readonly before: "sequencenumber";
3722
+ readonly target: "sortOrder";
3723
+ readonly policy: "always";
3724
+ readonly conditional: true;
3725
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3726
+ };
3727
+ readonly seoTitle: {
3728
+ readonly before: "pagetitle";
3729
+ readonly target: "seoMetaData.title";
3730
+ readonly policy: "always";
3731
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3732
+ };
3733
+ readonly seoDescription: {
3734
+ readonly before: "metadescription";
3735
+ readonly target: "seoMetaData.description";
3736
+ readonly policy: "always";
3737
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3738
+ };
3739
+ readonly seoKeywords: {
3740
+ readonly before: "metakeywords";
3741
+ readonly target: "seoMetaData.keywords";
3742
+ readonly policy: "always";
3743
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3744
+ };
3745
+ readonly status: {
3746
+ readonly before: "isinactive + displayinsite";
3747
+ readonly target: "status";
3748
+ readonly policy: "always";
3749
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3750
+ };
3751
+ readonly headerTag: {
3752
+ readonly before: "pageheading";
3753
+ readonly target: "seoMetaData.headerTag";
3754
+ readonly policy: "always";
3755
+ readonly note: string;
3756
+ };
3757
+ readonly banners: {
3758
+ readonly before: "pagebanner";
3759
+ readonly target: "banners";
3760
+ readonly policy: "seed";
3761
+ readonly note: string;
3762
+ };
3763
+ readonly logoUrl: {
3764
+ readonly before: "custrecord35";
3765
+ readonly target: "logo";
3766
+ readonly policy: "seed";
3767
+ readonly pending: true;
3768
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
3769
+ };
3770
+ }>, NetsuiteFieldProvider<{
3771
+ readonly name: {
3772
+ readonly before: "commercecategory.name";
3773
+ readonly after: "custitem_category";
3774
+ readonly target: "name";
3775
+ readonly policy: "always";
3776
+ readonly note: "After is a flat string stamped on the item, not a record.";
3777
+ };
3778
+ readonly online: {
3779
+ readonly before: "isonline";
3780
+ readonly after: "custitem_display_online";
3781
+ readonly target: "isOnline";
3782
+ readonly policy: "always";
3783
+ };
3784
+ readonly netsuiteId: {
3785
+ readonly before: "commercecategory.id";
3786
+ readonly target: "netsuiteId";
3787
+ readonly policy: "always";
3788
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3789
+ };
3790
+ readonly slug: {
3791
+ readonly before: "urlfragment";
3792
+ readonly target: "slug";
3793
+ readonly policy: "seed";
3794
+ readonly identity: true;
3795
+ readonly note: string;
3796
+ readonly caution: string;
3797
+ };
3798
+ readonly image: {
3799
+ readonly before: "thumbnail";
3800
+ readonly target: "image";
3801
+ readonly policy: "always";
3802
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
3803
+ };
3804
+ readonly description: {
3805
+ readonly before: "commercecategory.description";
3806
+ readonly target: "description";
3807
+ readonly policy: "always";
3808
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3809
+ };
3810
+ readonly sortOrder: {
3811
+ readonly before: "sequencenumber";
3812
+ readonly target: "sortOrder";
3813
+ readonly policy: "always";
3814
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3815
+ };
3816
+ readonly seoTitle: {
3817
+ readonly before: "pagetitle";
3818
+ readonly target: "seoMetaData.title";
3819
+ readonly policy: "always";
3820
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3821
+ };
3822
+ readonly seoDescription: {
3823
+ readonly before: "metadescription";
3824
+ readonly target: "seoMetaData.description";
3825
+ readonly policy: "always";
3826
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3827
+ };
3828
+ readonly seoKeywords: {
3829
+ readonly before: "metakeywords";
3830
+ readonly target: "seoMetaData.keywords";
3831
+ readonly policy: "always";
3832
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3833
+ };
3834
+ readonly status: {
3835
+ readonly before: "isinactive + displayinsite";
3836
+ readonly target: "status";
3837
+ readonly policy: "always";
3838
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3839
+ };
3840
+ readonly parent: {
3841
+ readonly before: "primaryparent";
3842
+ readonly after: "custitem_primary_category";
3843
+ readonly target: "parent";
3844
+ readonly policy: "always";
3845
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
3846
+ };
3847
+ readonly subcategories: {
3848
+ readonly before: "commercecategoryassociation.subcategory";
3849
+ readonly target: "subcategories";
3850
+ readonly policy: "always";
3851
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
3852
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
3853
+ };
3854
+ readonly headerTag: {
3855
+ readonly before: "pageheading";
3856
+ readonly target: "seoMetaData.headerTag";
3857
+ readonly policy: "always";
3858
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
3859
+ };
3860
+ readonly banners: {
3861
+ readonly before: "pagebanner";
3862
+ readonly target: "banners";
3863
+ readonly policy: "seed";
3864
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
3865
+ };
3866
+ readonly imageUrl: {
3867
+ readonly before: "custrecord35";
3868
+ readonly target: "image";
3869
+ readonly policy: "seed";
3870
+ readonly pending: true;
3871
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
3872
+ };
3873
+ readonly faq: {
3874
+ readonly before: "custrecord_faq_q1";
3875
+ readonly target: "metaData.faq";
3876
+ readonly policy: "seed";
3877
+ readonly pending: true;
3878
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
3879
+ };
3880
+ }>, NetsuiteFieldProvider<{
3881
+ readonly accessories: {
3882
+ readonly after: "custitem_accessories";
3883
+ readonly target: "relationGroups.accessories";
3884
+ readonly policy: "seed";
3885
+ readonly pending: true;
3886
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3887
+ };
3888
+ readonly toolKits: {
3889
+ readonly after: "custitem_tool_kits";
3890
+ readonly target: "relationGroups.tool-kits";
3891
+ readonly policy: "seed";
3892
+ readonly pending: true;
3893
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3894
+ };
3895
+ readonly parts: {
3896
+ readonly after: "custitem_parts";
3897
+ readonly target: "relationGroups.parts";
3898
+ readonly policy: "seed";
3899
+ readonly pending: true;
3900
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3901
+ };
3902
+ readonly similarProducts: {
3903
+ readonly after: "custitem_similiar_products";
3904
+ readonly target: "relationGroups.similar-products";
3905
+ readonly policy: "seed";
3906
+ readonly pending: true;
3907
+ readonly note: "The scriptid misspells Similar. That spelling is the real identifier.";
3908
+ };
3909
+ readonly frequentlyBought: {
3910
+ readonly before: "itemcorrelateditem";
3911
+ readonly after: "custitem_frequently_bought";
3912
+ readonly target: "relationGroups.frequently-bought-together";
3913
+ readonly policy: "seed";
3914
+ readonly pending: true;
3915
+ readonly note: "Before is NetSuite's own correlation feed, 894 rows, derived from SuiteCommerce traffic.";
3916
+ };
3917
+ readonly includedItems: {
3918
+ readonly after: "custitem_included_items";
3919
+ readonly target: "relationGroups.kit-contents";
3920
+ readonly policy: "seed";
3921
+ readonly pending: true;
3922
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3923
+ };
3924
+ readonly modelsAvailable: {
3925
+ readonly after: "custitem_models_available";
3926
+ readonly target: "relationGroups.models-available";
3927
+ readonly policy: "seed";
3928
+ readonly pending: true;
3929
+ readonly note: "Populated on 1,365 items. No relation group is seeded for it yet.";
3930
+ };
3931
+ }>, NetsuiteFieldProvider<{
3932
+ netsuiteId: {
3933
+ before: string;
3934
+ target: string;
3935
+ policy: "always";
3936
+ conditional: true;
3937
+ note: string;
3938
+ };
3939
+ netsuitePostId: {
3940
+ before: string;
3941
+ target: string;
3942
+ policy: "always";
3943
+ conditional: true;
3944
+ note: string;
3945
+ };
3946
+ title: {
3947
+ before: string;
3948
+ target: string;
3949
+ policy: "always";
3950
+ conditional: true;
3951
+ note: string;
3952
+ };
3953
+ slug: {
3954
+ before: string;
3955
+ target: string;
3956
+ policy: "always";
3957
+ conditional: true;
3958
+ note: string;
3959
+ caution: string;
3960
+ };
3961
+ subtitle: {
3962
+ before: string;
3963
+ target: string;
3964
+ policy: "always";
3965
+ conditional: true;
3966
+ note: string;
3967
+ };
3968
+ content: {
3969
+ before: string;
3970
+ target: string;
3971
+ policy: "always";
3972
+ conditional: true;
3973
+ note: string;
3974
+ };
3975
+ publishedAt: {
3976
+ before: string;
3977
+ target: string;
3978
+ policy: "always";
3979
+ conditional: true;
3980
+ note: string;
3981
+ };
3982
+ author: {
3983
+ before: string;
3984
+ target: string;
3985
+ policy: "always";
3986
+ conditional: true;
3987
+ note: string;
3988
+ };
3989
+ category: {
3990
+ before: string;
3991
+ target: string;
3992
+ policy: "always";
3993
+ conditional: true;
3994
+ note: string;
3995
+ };
3996
+ headerImage: {
3997
+ before: string;
3998
+ target: string;
3999
+ policy: "always";
4000
+ conditional: true;
4001
+ note: string;
4002
+ };
4003
+ headerImageAlt: {
4004
+ before: string;
4005
+ target: string;
4006
+ policy: "always";
4007
+ conditional: true;
4008
+ note: string;
4009
+ };
4010
+ thumbnail: {
4011
+ before: string;
4012
+ target: string;
4013
+ policy: "always";
4014
+ conditional: true;
4015
+ note: string;
4016
+ };
4017
+ thumbnailAlt: {
4018
+ before: string;
4019
+ target: string;
4020
+ policy: "always";
4021
+ conditional: true;
4022
+ note: string;
4023
+ };
4024
+ excerpt: {
4025
+ before: string;
4026
+ target: string;
4027
+ policy: "always";
4028
+ conditional: true;
4029
+ note: string;
4030
+ };
4031
+ tags: {
4032
+ before: string;
4033
+ target: string;
4034
+ policy: "always";
4035
+ conditional: true;
4036
+ note: string;
4037
+ };
4038
+ pinnedTo: {
4039
+ before: string;
4040
+ target: string;
4041
+ policy: "always";
4042
+ conditional: true;
4043
+ note: string;
4044
+ };
4045
+ status: {
4046
+ before: string;
4047
+ target: string;
4048
+ policy: "always";
4049
+ conditional: true;
4050
+ note: string;
4051
+ };
4052
+ seoTitle: {
4053
+ before: string;
4054
+ target: string;
4055
+ policy: "always";
4056
+ conditional: true;
4057
+ note: string;
4058
+ };
4059
+ seoDescription: {
4060
+ before: string;
4061
+ target: string;
4062
+ policy: "always";
4063
+ conditional: true;
4064
+ note: string;
4065
+ };
4066
+ seoKeywords: {
4067
+ before: string;
4068
+ target: string;
4069
+ policy: "always";
4070
+ conditional: true;
4071
+ note: string;
4072
+ };
4073
+ headerTag: {
4074
+ before: string;
4075
+ target: string;
4076
+ policy: "always";
4077
+ conditional: true;
4078
+ note: string;
4079
+ };
4080
+ readingMinutes: {
4081
+ target: string;
4082
+ policy: "seed";
4083
+ note: string;
4084
+ };
4085
+ relatedProducts: {
4086
+ target: string;
4087
+ policy: "seed";
4088
+ note: string;
4089
+ };
4090
+ stores: {
4091
+ target: string;
4092
+ policy: "seed";
4093
+ note: string;
4094
+ };
4095
+ }>, NetsuiteFieldProvider<{
4096
+ netsuiteId: {
4097
+ before: string;
4098
+ target: string;
4099
+ policy: "always";
4100
+ conditional: true;
4101
+ note: string;
4102
+ };
4103
+ name: {
4104
+ before: string;
4105
+ target: string;
4106
+ policy: "always";
4107
+ conditional: true;
4108
+ note: string;
4109
+ };
4110
+ status: {
4111
+ before: string;
4112
+ target: string;
4113
+ policy: "always";
4114
+ conditional: true;
4115
+ note: string;
4116
+ };
4117
+ slug: {
4118
+ target: string;
4119
+ policy: "seed";
4120
+ identity: true;
4121
+ note: string;
4122
+ caution: string;
4123
+ };
4124
+ bio: {
4125
+ target: string;
4126
+ policy: "seed";
4127
+ note: string;
4128
+ };
4129
+ seoTitle: {
4130
+ target: string;
4131
+ policy: "seed";
4132
+ note: string;
4133
+ };
4134
+ seoDescription: {
4135
+ target: string;
4136
+ policy: "seed";
4137
+ note: string;
4138
+ };
4139
+ seoKeywords: {
4140
+ target: string;
4141
+ policy: "seed";
4142
+ note: string;
4143
+ };
4144
+ role: {
4145
+ target: string;
4146
+ policy: "seed";
4147
+ note: string;
4148
+ };
4149
+ avatar: {
4150
+ target: string;
4151
+ policy: "seed";
4152
+ note: string;
4153
+ };
4154
+ }>, NetsuiteFieldProvider<{
4155
+ netsuiteId: {
4156
+ before: string;
4157
+ target: string;
4158
+ policy: "always";
4159
+ conditional: true;
4160
+ note: string;
4161
+ };
4162
+ name: {
4163
+ before: string;
4164
+ target: string;
4165
+ policy: "always";
4166
+ conditional: true;
4167
+ note: string;
4168
+ };
4169
+ status: {
4170
+ before: string;
4171
+ target: string;
4172
+ policy: "always";
4173
+ conditional: true;
4174
+ note: string;
4175
+ };
4176
+ slug: {
4177
+ target: string;
4178
+ policy: "seed";
4179
+ identity: true;
4180
+ note: string;
4181
+ caution: string;
4182
+ };
4183
+ description: {
4184
+ target: string;
4185
+ policy: "seed";
4186
+ note: string;
4187
+ };
4188
+ seoTitle: {
4189
+ target: string;
4190
+ policy: "seed";
4191
+ note: string;
4192
+ };
4193
+ seoDescription: {
4194
+ target: string;
4195
+ policy: "seed";
4196
+ note: string;
4197
+ };
4198
+ seoKeywords: {
4199
+ target: string;
4200
+ policy: "seed";
4201
+ note: string;
4202
+ };
4203
+ image: {
4204
+ target: string;
4205
+ policy: "seed";
4206
+ note: string;
4207
+ };
4208
+ sortOrder: {
4209
+ target: string;
4210
+ policy: "seed";
4211
+ note: string;
4212
+ };
4213
+ }>, NetsuiteFieldProvider<{
4214
+ promotionId: {
4215
+ before: string;
4216
+ target: string;
4217
+ policy: "always";
4218
+ conditional: true;
4219
+ note: string;
4220
+ };
4221
+ title: {
4222
+ before: string;
4223
+ target: string;
4224
+ policy: "always";
4225
+ conditional: true;
4226
+ note: string;
4227
+ };
4228
+ promotionName: {
4229
+ before: string;
4230
+ target: string;
4231
+ policy: "always";
4232
+ conditional: true;
4233
+ note: string;
4234
+ };
4235
+ couponCode: {
4236
+ before: string;
4237
+ target: string;
4238
+ policy: "always";
4239
+ identity: true;
4240
+ note: string;
4241
+ caution: string;
4242
+ };
4243
+ discountType: {
4244
+ before: string;
4245
+ target: string;
4246
+ policy: "always";
4247
+ conditional: true;
4248
+ note: string;
4249
+ };
4250
+ discountValue: {
4251
+ before: string;
4252
+ target: string;
4253
+ policy: "always";
4254
+ conditional: true;
4255
+ note: string;
4256
+ };
4257
+ startTime: {
4258
+ before: string;
4259
+ target: string;
4260
+ policy: "always";
4261
+ conditional: true;
4262
+ note: string;
4263
+ };
4264
+ endTime: {
4265
+ before: string;
4266
+ target: string;
4267
+ policy: "always";
4268
+ conditional: true;
4269
+ note: string;
4270
+ };
4271
+ status: {
4272
+ before: string;
4273
+ target: string;
4274
+ policy: "always";
4275
+ conditional: true;
4276
+ note: string;
4277
+ };
4278
+ discountItemId: {
4279
+ before: string;
4280
+ target: string;
4281
+ policy: "always";
4282
+ conditional: true;
4283
+ note: string;
4284
+ };
4285
+ discountItemName: {
4286
+ before: string;
4287
+ target: string;
4288
+ policy: "always";
4289
+ conditional: true;
4290
+ note: string;
4291
+ };
4292
+ discountReducesTax: {
4293
+ before: string;
4294
+ target: string;
4295
+ policy: "always";
4296
+ conditional: true;
4297
+ note: string;
4298
+ };
4299
+ applyDiscountTo: {
4300
+ before: string;
4301
+ target: string;
4302
+ policy: "always";
4303
+ conditional: true;
4304
+ note: string;
4305
+ };
4306
+ freeShipping: {
4307
+ before: string;
4308
+ target: string;
4309
+ policy: "always";
4310
+ conditional: true;
4311
+ note: string;
4312
+ };
4313
+ description: {
4314
+ before: string;
4315
+ target: string;
4316
+ policy: "always";
4317
+ conditional: true;
4318
+ note: string;
4319
+ };
4320
+ isPromotional: {
4321
+ before: string;
4322
+ target: string;
4323
+ policy: "always";
4324
+ conditional: true;
4325
+ note: string;
4326
+ };
4327
+ singleUse: {
4328
+ before: string;
4329
+ target: string;
4330
+ policy: "always";
4331
+ conditional: true;
4332
+ note: string;
4333
+ };
4334
+ itemRestrictions: {
4335
+ before: string;
4336
+ target: string;
4337
+ policy: "always";
4338
+ conditional: true;
4339
+ note: string;
4340
+ };
4341
+ minimumAmount: {
4342
+ before: string;
4343
+ target: string;
4344
+ policy: "always";
4345
+ conditional: true;
4346
+ note: string;
4347
+ };
4348
+ stores: {
4349
+ target: string;
4350
+ policy: "seed";
4351
+ note: string;
4352
+ };
4353
+ }>, NetsuiteFieldProvider<{
4354
+ guid: {
4355
+ before: string;
4356
+ target: string;
4357
+ policy: "always";
4358
+ conditional: true;
4359
+ note: string;
4360
+ };
4361
+ title: {
4362
+ before: string;
4363
+ target: string;
4364
+ policy: "always";
4365
+ conditional: true;
4366
+ note: string;
4367
+ };
4368
+ slug: {
4369
+ target: string;
4370
+ policy: "seed";
4371
+ identity: true;
4372
+ note: string;
4373
+ caution: string;
4374
+ };
4375
+ summary: {
4376
+ before: string;
4377
+ target: string;
4378
+ policy: "always";
4379
+ conditional: true;
4380
+ note: string;
4381
+ };
4382
+ showNotes: {
4383
+ before: string;
4384
+ target: string;
4385
+ policy: "always";
4386
+ conditional: true;
4387
+ note: string;
4388
+ };
4389
+ audioUrl: {
4390
+ before: string;
4391
+ target: string;
4392
+ policy: "always";
4393
+ conditional: true;
4394
+ note: string;
4395
+ };
4396
+ artwork: {
4397
+ before: string;
4398
+ target: string;
4399
+ policy: "always";
4400
+ conditional: true;
4401
+ note: string;
4402
+ };
4403
+ durationSeconds: {
4404
+ before: string;
4405
+ target: string;
4406
+ policy: "always";
4407
+ conditional: true;
4408
+ note: string;
4409
+ };
4410
+ episodeNumber: {
4411
+ before: string;
4412
+ target: string;
4413
+ policy: "always";
4414
+ conditional: true;
4415
+ note: string;
4416
+ };
4417
+ seasonNumber: {
4418
+ before: string;
4419
+ target: string;
4420
+ policy: "always";
4421
+ conditional: true;
4422
+ note: string;
4423
+ };
4424
+ publishedAt: {
4425
+ before: string;
4426
+ target: string;
4427
+ policy: "always";
4428
+ conditional: true;
4429
+ note: string;
4430
+ };
4431
+ externalUrl: {
4432
+ before: string;
4433
+ target: string;
4434
+ policy: "always";
4435
+ conditional: true;
4436
+ note: string;
4437
+ };
4438
+ seoTitle: {
4439
+ before: string;
4440
+ target: string;
4441
+ policy: "always";
4442
+ conditional: true;
4443
+ note: string;
4444
+ };
4445
+ seoDescription: {
4446
+ before: string;
4447
+ target: string;
4448
+ policy: "always";
4449
+ conditional: true;
4450
+ note: string;
4451
+ };
4452
+ transcript: {
4453
+ target: string;
4454
+ policy: "seed";
4455
+ note: string;
4456
+ };
4457
+ relatedProducts: {
4458
+ target: string;
4459
+ policy: "seed";
4460
+ note: string;
4461
+ };
4462
+ stores: {
4463
+ target: string;
4464
+ policy: "seed";
4465
+ note: string;
4466
+ };
4467
+ status: {
4468
+ target: string;
4469
+ policy: "seed";
4470
+ note: string;
4471
+ };
4472
+ isOnline: {
4473
+ target: string;
4474
+ policy: "seed";
4475
+ note: string;
4476
+ };
4477
+ }>];
4478
+ declare const BY_ENTITY: {
4479
+ readonly product: NetsuiteFieldProvider<{
4480
+ readonly netsuiteId: {
4481
+ readonly before: "item.id";
4482
+ readonly target: "netsuiteId";
4483
+ readonly policy: "always";
4484
+ readonly conditional: true;
4485
+ readonly note: string;
4486
+ };
4487
+ readonly sku: {
4488
+ readonly before: "item.itemid";
4489
+ readonly target: "sku";
4490
+ readonly policy: "always";
4491
+ readonly conditional: true;
4492
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4493
+ };
4494
+ readonly originalPrice: {
4495
+ readonly before: "itemprice at the Base Price level (1)";
4496
+ readonly target: "price.originalPrice";
4497
+ readonly policy: "always";
4498
+ readonly conditional: true;
4499
+ readonly note: string;
4500
+ };
4501
+ readonly discount: {
4502
+ readonly before: "derived from Base Price vs Online Price";
4503
+ readonly target: "price.discount";
4504
+ readonly policy: "always";
4505
+ readonly conditional: true;
4506
+ readonly note: string;
4507
+ };
4508
+ readonly weight: {
4509
+ readonly before: "weight + weightunit";
4510
+ readonly target: "shipping.weightLb";
4511
+ readonly policy: "always";
4512
+ readonly conditional: true;
4513
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
4514
+ };
4515
+ readonly dimensions: {
4516
+ readonly target: "shipping.lengthIn";
4517
+ readonly policy: "seed";
4518
+ readonly note: string;
4519
+ };
4520
+ readonly price: {
4521
+ readonly before: "itemprice at the online price level";
4522
+ readonly target: "price";
4523
+ readonly policy: "always";
4524
+ readonly conditional: true;
4525
+ readonly note: string;
4526
+ };
4527
+ readonly quantity: {
4528
+ readonly before: "quantityavailable";
4529
+ readonly target: "quantity";
4530
+ readonly policy: "always";
4531
+ readonly conditional: true;
4532
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4533
+ };
4534
+ readonly minimumQuantity: {
4535
+ readonly before: "minimumquantity";
4536
+ readonly target: "minimumQuantity";
4537
+ readonly policy: "always";
4538
+ readonly conditional: true;
4539
+ readonly note: string;
4540
+ };
4541
+ readonly maximumQuantity: {
4542
+ readonly before: "maximumquantity";
4543
+ readonly target: "maximumQuantity";
4544
+ readonly policy: "always";
4545
+ readonly conditional: true;
4546
+ readonly note: string;
4547
+ };
4548
+ readonly enforceMinimum: {
4549
+ readonly before: "enforceminqtyinternally";
4550
+ readonly target: "enforceMinimum";
4551
+ readonly policy: "always";
4552
+ readonly conditional: true;
4553
+ readonly note: string;
4554
+ };
4555
+ readonly isSparePart: {
4556
+ readonly before: "custitem303";
4557
+ readonly target: "isSparePart";
4558
+ readonly policy: "always";
4559
+ readonly conditional: true;
4560
+ readonly note: string;
4561
+ };
4562
+ readonly itemType: {
4563
+ readonly before: "itemtype";
4564
+ readonly target: "itemType";
4565
+ readonly policy: "always";
4566
+ readonly conditional: true;
4567
+ readonly note: string;
4568
+ };
4569
+ readonly stockDescription: {
4570
+ readonly before: "stockdescription";
4571
+ readonly target: "stockDescription";
4572
+ readonly policy: "always";
4573
+ readonly conditional: true;
4574
+ readonly note: string;
4575
+ };
4576
+ readonly noPriceMessage: {
4577
+ readonly before: "nopricemessage";
4578
+ readonly target: "noPriceMessage";
4579
+ readonly policy: "always";
4580
+ readonly conditional: true;
4581
+ readonly note: string;
4582
+ };
4583
+ readonly isSeriesComponent: {
4584
+ readonly before: "custitem40";
4585
+ readonly target: "isSeriesComponent";
4586
+ readonly policy: "always";
4587
+ readonly conditional: true;
4588
+ readonly note: string;
4589
+ };
4590
+ readonly flexWarrantyEligible: {
4591
+ readonly before: "custitem520";
4592
+ readonly target: "flexWarrantyEligible";
4593
+ readonly policy: "always";
4594
+ readonly conditional: true;
4595
+ readonly note: string;
4596
+ };
4597
+ readonly inventoryPolicy: {
4598
+ readonly before: "outofstockbehavior";
4599
+ readonly target: "inventoryPolicy";
4600
+ readonly policy: "always";
4601
+ readonly conditional: true;
4602
+ readonly note: string;
4603
+ };
4604
+ readonly status: {
4605
+ readonly before: "isinactive";
4606
+ readonly target: "status";
4607
+ readonly policy: "always";
4608
+ readonly conditional: true;
4609
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4610
+ };
4611
+ readonly shipping: {
4612
+ readonly before: "weight + weightunit";
4613
+ readonly target: "shipping";
4614
+ readonly policy: "always";
4615
+ readonly conditional: true;
4616
+ readonly note: string;
4617
+ };
4618
+ readonly slug: {
4619
+ readonly before: "urlcomponent";
4620
+ readonly after: "custitem_slug";
4621
+ readonly target: "slug";
4622
+ readonly policy: "seed";
4623
+ readonly identity: true;
4624
+ readonly note: "The storefront URL never moves once a product exists.";
4625
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
4626
+ };
4627
+ readonly name: {
4628
+ readonly before: "storedisplayname";
4629
+ readonly after: "custitem_product_name";
4630
+ readonly target: "name";
4631
+ readonly policy: "always";
4632
+ readonly conditional: true;
4633
+ readonly note: string;
4634
+ };
4635
+ readonly featured: {
4636
+ readonly before: "featureddescription";
4637
+ readonly after: "custitem_product_featured_description";
4638
+ readonly target: "description";
4639
+ readonly policy: "always";
4640
+ readonly conditional: true;
4641
+ readonly note: string;
4642
+ };
4643
+ readonly overview: {
4644
+ readonly before: "storedetaileddescription";
4645
+ readonly after: "custitem_product_description";
4646
+ readonly target: "overview";
4647
+ readonly policy: "always";
4648
+ readonly conditional: true;
4649
+ };
4650
+ readonly pageTitle: {
4651
+ readonly before: "pagetitle";
4652
+ readonly after: "custitem_page_title";
4653
+ readonly target: "seoMetaData.title";
4654
+ readonly policy: "always";
4655
+ readonly conditional: true;
4656
+ };
4657
+ readonly online: {
4658
+ readonly before: "isonline";
4659
+ readonly after: "custitem_display_online";
4660
+ readonly target: "isOnline";
4661
+ readonly policy: "always";
4662
+ readonly conditional: true;
4663
+ readonly note: string;
4664
+ };
4665
+ readonly saleType: {
4666
+ readonly before: "dontshowprice";
4667
+ readonly after: "custitem_quote_only";
4668
+ readonly target: "saleType";
4669
+ readonly policy: "always";
4670
+ readonly conditional: true;
4671
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
4672
+ };
4673
+ readonly quoteOnly: {
4674
+ readonly before: "dontshowprice";
4675
+ readonly after: "custitem_quote_only";
4676
+ readonly target: "metaData.quoteOnly";
4677
+ readonly policy: "seed";
4678
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
4679
+ };
4680
+ readonly image: {
4681
+ readonly before: "storedisplayimage";
4682
+ readonly after: "custitem_itemimages";
4683
+ readonly target: "images";
4684
+ readonly policy: "always";
4685
+ readonly conditional: true;
4686
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
4687
+ };
4688
+ readonly category: {
4689
+ readonly before: "commercecategoryitemassociation.category";
4690
+ readonly after: "custitem_primary_category";
4691
+ readonly target: "category";
4692
+ readonly policy: "always";
4693
+ readonly conditional: true;
4694
+ readonly note: string;
4695
+ };
4696
+ readonly seoDescription: {
4697
+ readonly before: "metataghtml";
4698
+ readonly after: "custitem_meta_description";
4699
+ readonly target: "seoMetaData.description";
4700
+ readonly policy: "always";
4701
+ readonly conditional: true;
4702
+ readonly note: "The replacement exists but carries no data yet.";
4703
+ };
4704
+ readonly brand: {
4705
+ readonly before: "manufacturer";
4706
+ readonly target: "brand";
4707
+ readonly policy: "always";
4708
+ readonly conditional: true;
4709
+ readonly note: string;
4710
+ };
4711
+ readonly googleCategory: {
4712
+ readonly after: "custitemproducttype";
4713
+ readonly target: "googleCategory";
4714
+ readonly policy: "always";
4715
+ readonly conditional: true;
4716
+ readonly note: string;
4717
+ };
4718
+ readonly department: {
4719
+ readonly after: "custitemfas_product_category";
4720
+ readonly target: "department";
4721
+ readonly policy: "always";
4722
+ readonly conditional: true;
4723
+ readonly note: string;
4724
+ };
4725
+ readonly imageAlt: {
4726
+ readonly after: "custitemaltimgtext";
4727
+ readonly target: "images.alt";
4728
+ readonly policy: "always";
4729
+ readonly conditional: true;
4730
+ readonly note: string;
4731
+ };
4732
+ readonly family: {
4733
+ readonly after: "custitem_family";
4734
+ readonly target: "metaData.family";
4735
+ readonly policy: "seed";
4736
+ readonly pending: true;
4737
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
4738
+ };
4739
+ readonly primaryCategory: {
4740
+ readonly before: "commercecategoryitemassociation.primarycategory";
4741
+ readonly after: "custitem_primary_category";
4742
+ readonly target: "metaData.primaryCategory";
4743
+ readonly policy: "seed";
4744
+ readonly note: string;
4745
+ };
4746
+ readonly additionalCategories: {
4747
+ readonly sourceTable: "commercecategoryitemassociation";
4748
+ readonly after: "custitem_additional_categories";
4749
+ readonly target: "categories";
4750
+ readonly policy: "always";
4751
+ readonly note: string;
4752
+ readonly caution: string;
4753
+ };
4754
+ readonly micrositeDescription: {
4755
+ readonly after: "custitem_microsite_description";
4756
+ readonly target: "metaData.micrositeDescription";
4757
+ readonly policy: "seed";
4758
+ readonly pending: true;
4759
+ readonly note: "Populated on 2,284 items.";
4760
+ };
4761
+ readonly features: {
4762
+ readonly after: "custitem_features";
4763
+ readonly target: "metaData.features";
4764
+ readonly policy: "seed";
4765
+ readonly pending: true;
4766
+ readonly note: "Field exists in NetSuite and carries no data yet.";
4767
+ };
4768
+ readonly childStoreOnly: {
4769
+ readonly after: "custitem_child_store_only";
4770
+ readonly target: "childOnly";
4771
+ readonly policy: "seed";
4772
+ readonly pending: true;
4773
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
4774
+ };
4775
+ }>;
4776
+ readonly addon: NetsuiteFieldProvider<{
4777
+ readonly netsuiteItemId: {
4778
+ readonly before: "item.id";
4779
+ readonly target: "netsuite.itemId";
4780
+ readonly policy: "always";
4781
+ readonly conditional: true;
4782
+ readonly note: string;
4783
+ };
4784
+ readonly netsuiteItemName: {
4785
+ readonly before: "item.itemid";
4786
+ readonly target: "netsuite.itemName";
4787
+ readonly policy: "always";
4788
+ readonly conditional: true;
4789
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
4790
+ };
4791
+ readonly groupAndOption: {
4792
+ readonly before: "storedisplayname";
4793
+ readonly target: "name";
4794
+ readonly policy: "always";
4795
+ readonly conditional: true;
4796
+ readonly identity: true;
4797
+ readonly note: string;
4798
+ };
4799
+ readonly key: {
4800
+ readonly before: "urlcomponent";
4801
+ readonly target: "key";
4802
+ readonly policy: "always";
4803
+ readonly identity: true;
4804
+ readonly note: string;
4805
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
4806
+ };
4807
+ readonly active: {
4808
+ readonly before: "isinactive";
4809
+ readonly target: "status";
4810
+ readonly policy: "always";
4811
+ readonly conditional: true;
4812
+ readonly note: string;
4813
+ };
4814
+ readonly visible: {
4815
+ readonly before: "isonline";
4816
+ readonly target: "isVisible";
4817
+ readonly policy: "always";
4818
+ readonly conditional: true;
4819
+ readonly note: string;
4820
+ };
4821
+ readonly pricingType: {
4822
+ readonly target: "pricingType";
4823
+ readonly policy: "seed";
4824
+ readonly note: string;
4825
+ };
4826
+ readonly price: {
4827
+ readonly before: "itemprice at price level 1";
4828
+ readonly target: "price";
4829
+ readonly policy: "always";
4830
+ readonly conditional: true;
4831
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
4832
+ };
4833
+ readonly sellingPoints: {
4834
+ readonly before: "salesdescription";
4835
+ readonly target: "description";
4836
+ readonly policy: "always";
4837
+ readonly conditional: true;
4838
+ readonly note: string;
4839
+ };
4840
+ readonly detail: {
4841
+ readonly before: "storedetaileddescription";
4842
+ readonly target: "longDescription";
4843
+ readonly policy: "always";
4844
+ readonly conditional: true;
4845
+ readonly note: string;
4846
+ };
4847
+ readonly priceBand: {
4848
+ readonly before: "featureddescription";
4849
+ readonly target: "appliesFromPrice / appliesToPrice";
4850
+ readonly policy: "always";
4851
+ readonly conditional: true;
4852
+ readonly note: string;
4853
+ };
4854
+ readonly eligibilityGate: {
4855
+ readonly before: "custitem520";
4856
+ readonly target: "AddonGroup.netsuite.requiresField";
4857
+ readonly policy: "seed";
4858
+ readonly note: string;
4859
+ };
4860
+ }>;
4861
+ readonly brand: NetsuiteFieldProvider<{
4862
+ readonly name: {
4863
+ readonly before: "commercecategory.name";
4864
+ readonly after: "item.manufacturer";
4865
+ readonly target: "name";
4866
+ readonly policy: "always";
4867
+ };
4868
+ readonly online: {
4869
+ readonly before: "isonline";
4870
+ readonly after: "custitem_display_online";
4871
+ readonly target: "isOnline";
4872
+ readonly policy: "always";
4873
+ };
4874
+ readonly netsuiteId: {
4875
+ readonly before: "commercecategory.id";
4876
+ readonly target: "netsuiteId";
4877
+ readonly policy: "always";
4878
+ readonly conditional: true;
4879
+ readonly note: "No successor. The manufacturer name becomes the key.";
4880
+ };
4881
+ readonly slug: {
4882
+ readonly before: "commercecategory.urlfragment";
4883
+ readonly target: "slug";
4884
+ readonly policy: "seed";
4885
+ readonly identity: true;
4886
+ readonly note: string;
4887
+ readonly caution: string;
4888
+ };
4889
+ readonly logo: {
4890
+ readonly before: "thumbnail";
4891
+ readonly target: "logo";
4892
+ readonly policy: "always";
4893
+ readonly conditional: true;
4894
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
4895
+ };
4896
+ readonly description: {
4897
+ readonly before: "commercecategory.description";
4898
+ readonly target: "description";
4899
+ readonly policy: "always";
4900
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4901
+ };
4902
+ readonly sortOrder: {
4903
+ readonly before: "sequencenumber";
4904
+ readonly target: "sortOrder";
4905
+ readonly policy: "always";
4906
+ readonly conditional: true;
4907
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4908
+ };
4909
+ readonly seoTitle: {
4910
+ readonly before: "pagetitle";
4911
+ readonly target: "seoMetaData.title";
4912
+ readonly policy: "always";
4913
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4914
+ };
4915
+ readonly seoDescription: {
4916
+ readonly before: "metadescription";
4917
+ readonly target: "seoMetaData.description";
4918
+ readonly policy: "always";
4919
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4920
+ };
4921
+ readonly seoKeywords: {
4922
+ readonly before: "metakeywords";
4923
+ readonly target: "seoMetaData.keywords";
4924
+ readonly policy: "always";
4925
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4926
+ };
4927
+ readonly status: {
4928
+ readonly before: "isinactive + displayinsite";
4929
+ readonly target: "status";
4930
+ readonly policy: "always";
4931
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4932
+ };
4933
+ readonly headerTag: {
4934
+ readonly before: "pageheading";
4935
+ readonly target: "seoMetaData.headerTag";
4936
+ readonly policy: "always";
4937
+ readonly note: string;
4938
+ };
4939
+ readonly banners: {
4940
+ readonly before: "pagebanner";
4941
+ readonly target: "banners";
4942
+ readonly policy: "seed";
4943
+ readonly note: string;
4944
+ };
4945
+ readonly logoUrl: {
4946
+ readonly before: "custrecord35";
4947
+ readonly target: "logo";
4948
+ readonly policy: "seed";
4949
+ readonly pending: true;
4950
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
4951
+ };
4952
+ }>;
4953
+ readonly category: NetsuiteFieldProvider<{
4954
+ readonly name: {
4955
+ readonly before: "commercecategory.name";
4956
+ readonly after: "custitem_category";
4957
+ readonly target: "name";
4958
+ readonly policy: "always";
4959
+ readonly note: "After is a flat string stamped on the item, not a record.";
4960
+ };
4961
+ readonly online: {
4962
+ readonly before: "isonline";
4963
+ readonly after: "custitem_display_online";
4964
+ readonly target: "isOnline";
4965
+ readonly policy: "always";
4966
+ };
4967
+ readonly netsuiteId: {
4968
+ readonly before: "commercecategory.id";
4969
+ readonly target: "netsuiteId";
4970
+ readonly policy: "always";
4971
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4972
+ };
4973
+ readonly slug: {
4974
+ readonly before: "urlfragment";
4975
+ readonly target: "slug";
4976
+ readonly policy: "seed";
4977
+ readonly identity: true;
4978
+ readonly note: string;
4979
+ readonly caution: string;
4980
+ };
4981
+ readonly image: {
4982
+ readonly before: "thumbnail";
4983
+ readonly target: "image";
4984
+ readonly policy: "always";
4985
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
4986
+ };
4987
+ readonly description: {
4988
+ readonly before: "commercecategory.description";
4989
+ readonly target: "description";
4990
+ readonly policy: "always";
4991
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4992
+ };
4993
+ readonly sortOrder: {
4994
+ readonly before: "sequencenumber";
4995
+ readonly target: "sortOrder";
4996
+ readonly policy: "always";
4997
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4998
+ };
4999
+ readonly seoTitle: {
5000
+ readonly before: "pagetitle";
5001
+ readonly target: "seoMetaData.title";
5002
+ readonly policy: "always";
5003
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5004
+ };
5005
+ readonly seoDescription: {
5006
+ readonly before: "metadescription";
5007
+ readonly target: "seoMetaData.description";
5008
+ readonly policy: "always";
5009
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5010
+ };
5011
+ readonly seoKeywords: {
5012
+ readonly before: "metakeywords";
5013
+ readonly target: "seoMetaData.keywords";
5014
+ readonly policy: "always";
5015
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5016
+ };
5017
+ readonly status: {
5018
+ readonly before: "isinactive + displayinsite";
5019
+ readonly target: "status";
5020
+ readonly policy: "always";
5021
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5022
+ };
5023
+ readonly parent: {
5024
+ readonly before: "primaryparent";
5025
+ readonly after: "custitem_primary_category";
5026
+ readonly target: "parent";
5027
+ readonly policy: "always";
5028
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
5029
+ };
5030
+ readonly subcategories: {
5031
+ readonly before: "commercecategoryassociation.subcategory";
5032
+ readonly target: "subcategories";
5033
+ readonly policy: "always";
5034
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
5035
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
5036
+ };
5037
+ readonly headerTag: {
5038
+ readonly before: "pageheading";
5039
+ readonly target: "seoMetaData.headerTag";
5040
+ readonly policy: "always";
5041
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
5042
+ };
5043
+ readonly banners: {
5044
+ readonly before: "pagebanner";
5045
+ readonly target: "banners";
5046
+ readonly policy: "seed";
5047
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
5048
+ };
5049
+ readonly imageUrl: {
5050
+ readonly before: "custrecord35";
5051
+ readonly target: "image";
5052
+ readonly policy: "seed";
5053
+ readonly pending: true;
5054
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
5055
+ };
5056
+ readonly faq: {
5057
+ readonly before: "custrecord_faq_q1";
5058
+ readonly target: "metaData.faq";
5059
+ readonly policy: "seed";
5060
+ readonly pending: true;
5061
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
5062
+ };
5063
+ }>;
5064
+ readonly coupon: NetsuiteFieldProvider<{
5065
+ promotionId: {
5066
+ before: string;
5067
+ target: string;
5068
+ policy: "always";
5069
+ conditional: true;
5070
+ note: string;
5071
+ };
5072
+ title: {
5073
+ before: string;
5074
+ target: string;
5075
+ policy: "always";
5076
+ conditional: true;
5077
+ note: string;
5078
+ };
5079
+ promotionName: {
5080
+ before: string;
5081
+ target: string;
5082
+ policy: "always";
5083
+ conditional: true;
5084
+ note: string;
5085
+ };
5086
+ couponCode: {
5087
+ before: string;
5088
+ target: string;
5089
+ policy: "always";
5090
+ identity: true;
5091
+ note: string;
5092
+ caution: string;
5093
+ };
5094
+ discountType: {
5095
+ before: string;
5096
+ target: string;
5097
+ policy: "always";
5098
+ conditional: true;
5099
+ note: string;
5100
+ };
5101
+ discountValue: {
5102
+ before: string;
5103
+ target: string;
5104
+ policy: "always";
5105
+ conditional: true;
5106
+ note: string;
5107
+ };
5108
+ startTime: {
5109
+ before: string;
5110
+ target: string;
5111
+ policy: "always";
5112
+ conditional: true;
5113
+ note: string;
5114
+ };
5115
+ endTime: {
5116
+ before: string;
5117
+ target: string;
5118
+ policy: "always";
5119
+ conditional: true;
5120
+ note: string;
5121
+ };
5122
+ status: {
5123
+ before: string;
5124
+ target: string;
5125
+ policy: "always";
5126
+ conditional: true;
5127
+ note: string;
5128
+ };
5129
+ discountItemId: {
5130
+ before: string;
5131
+ target: string;
5132
+ policy: "always";
5133
+ conditional: true;
5134
+ note: string;
5135
+ };
5136
+ discountItemName: {
5137
+ before: string;
5138
+ target: string;
5139
+ policy: "always";
5140
+ conditional: true;
5141
+ note: string;
5142
+ };
5143
+ discountReducesTax: {
5144
+ before: string;
5145
+ target: string;
5146
+ policy: "always";
5147
+ conditional: true;
5148
+ note: string;
5149
+ };
5150
+ applyDiscountTo: {
5151
+ before: string;
5152
+ target: string;
5153
+ policy: "always";
5154
+ conditional: true;
5155
+ note: string;
5156
+ };
5157
+ freeShipping: {
5158
+ before: string;
5159
+ target: string;
5160
+ policy: "always";
5161
+ conditional: true;
5162
+ note: string;
5163
+ };
5164
+ description: {
5165
+ before: string;
5166
+ target: string;
5167
+ policy: "always";
5168
+ conditional: true;
5169
+ note: string;
5170
+ };
5171
+ isPromotional: {
5172
+ before: string;
5173
+ target: string;
5174
+ policy: "always";
5175
+ conditional: true;
5176
+ note: string;
5177
+ };
5178
+ singleUse: {
5179
+ before: string;
5180
+ target: string;
5181
+ policy: "always";
5182
+ conditional: true;
5183
+ note: string;
5184
+ };
5185
+ itemRestrictions: {
5186
+ before: string;
5187
+ target: string;
5188
+ policy: "always";
5189
+ conditional: true;
5190
+ note: string;
5191
+ };
5192
+ minimumAmount: {
5193
+ before: string;
5194
+ target: string;
5195
+ policy: "always";
5196
+ conditional: true;
5197
+ note: string;
5198
+ };
5199
+ stores: {
5200
+ target: string;
5201
+ policy: "seed";
5202
+ note: string;
5203
+ };
5204
+ }>;
5205
+ readonly podcast: NetsuiteFieldProvider<{
5206
+ guid: {
5207
+ before: string;
5208
+ target: string;
5209
+ policy: "always";
5210
+ conditional: true;
5211
+ note: string;
5212
+ };
5213
+ title: {
5214
+ before: string;
5215
+ target: string;
5216
+ policy: "always";
5217
+ conditional: true;
5218
+ note: string;
5219
+ };
5220
+ slug: {
5221
+ target: string;
5222
+ policy: "seed";
5223
+ identity: true;
5224
+ note: string;
5225
+ caution: string;
5226
+ };
5227
+ summary: {
5228
+ before: string;
5229
+ target: string;
5230
+ policy: "always";
5231
+ conditional: true;
5232
+ note: string;
5233
+ };
5234
+ showNotes: {
5235
+ before: string;
5236
+ target: string;
5237
+ policy: "always";
5238
+ conditional: true;
5239
+ note: string;
5240
+ };
5241
+ audioUrl: {
5242
+ before: string;
5243
+ target: string;
5244
+ policy: "always";
5245
+ conditional: true;
5246
+ note: string;
5247
+ };
5248
+ artwork: {
5249
+ before: string;
5250
+ target: string;
5251
+ policy: "always";
5252
+ conditional: true;
5253
+ note: string;
5254
+ };
5255
+ durationSeconds: {
5256
+ before: string;
5257
+ target: string;
5258
+ policy: "always";
5259
+ conditional: true;
5260
+ note: string;
5261
+ };
5262
+ episodeNumber: {
5263
+ before: string;
5264
+ target: string;
5265
+ policy: "always";
5266
+ conditional: true;
5267
+ note: string;
5268
+ };
5269
+ seasonNumber: {
5270
+ before: string;
5271
+ target: string;
5272
+ policy: "always";
5273
+ conditional: true;
5274
+ note: string;
5275
+ };
5276
+ publishedAt: {
5277
+ before: string;
5278
+ target: string;
5279
+ policy: "always";
5280
+ conditional: true;
5281
+ note: string;
5282
+ };
5283
+ externalUrl: {
5284
+ before: string;
5285
+ target: string;
5286
+ policy: "always";
5287
+ conditional: true;
5288
+ note: string;
5289
+ };
5290
+ seoTitle: {
5291
+ before: string;
5292
+ target: string;
5293
+ policy: "always";
5294
+ conditional: true;
5295
+ note: string;
5296
+ };
5297
+ seoDescription: {
5298
+ before: string;
5299
+ target: string;
5300
+ policy: "always";
5301
+ conditional: true;
5302
+ note: string;
5303
+ };
5304
+ transcript: {
5305
+ target: string;
5306
+ policy: "seed";
5307
+ note: string;
5308
+ };
5309
+ relatedProducts: {
5310
+ target: string;
5311
+ policy: "seed";
5312
+ note: string;
5313
+ };
5314
+ stores: {
5315
+ target: string;
5316
+ policy: "seed";
5317
+ note: string;
5318
+ };
5319
+ status: {
5320
+ target: string;
5321
+ policy: "seed";
5322
+ note: string;
5323
+ };
5324
+ isOnline: {
5325
+ target: string;
5326
+ policy: "seed";
5327
+ note: string;
5328
+ };
5329
+ }>;
5330
+ readonly blog: NetsuiteFieldProvider<{
5331
+ netsuiteId: {
5332
+ before: string;
5333
+ target: string;
5334
+ policy: "always";
5335
+ conditional: true;
5336
+ note: string;
5337
+ };
5338
+ netsuitePostId: {
5339
+ before: string;
5340
+ target: string;
5341
+ policy: "always";
5342
+ conditional: true;
5343
+ note: string;
5344
+ };
5345
+ title: {
5346
+ before: string;
5347
+ target: string;
5348
+ policy: "always";
5349
+ conditional: true;
5350
+ note: string;
5351
+ };
5352
+ slug: {
5353
+ before: string;
5354
+ target: string;
5355
+ policy: "always";
5356
+ conditional: true;
5357
+ note: string;
5358
+ caution: string;
5359
+ };
5360
+ subtitle: {
5361
+ before: string;
5362
+ target: string;
5363
+ policy: "always";
5364
+ conditional: true;
5365
+ note: string;
5366
+ };
5367
+ content: {
5368
+ before: string;
5369
+ target: string;
5370
+ policy: "always";
5371
+ conditional: true;
5372
+ note: string;
5373
+ };
5374
+ publishedAt: {
5375
+ before: string;
5376
+ target: string;
5377
+ policy: "always";
5378
+ conditional: true;
5379
+ note: string;
5380
+ };
5381
+ author: {
5382
+ before: string;
5383
+ target: string;
5384
+ policy: "always";
5385
+ conditional: true;
5386
+ note: string;
5387
+ };
5388
+ category: {
5389
+ before: string;
5390
+ target: string;
5391
+ policy: "always";
5392
+ conditional: true;
5393
+ note: string;
5394
+ };
5395
+ headerImage: {
5396
+ before: string;
5397
+ target: string;
5398
+ policy: "always";
5399
+ conditional: true;
5400
+ note: string;
5401
+ };
5402
+ headerImageAlt: {
5403
+ before: string;
5404
+ target: string;
5405
+ policy: "always";
5406
+ conditional: true;
5407
+ note: string;
5408
+ };
5409
+ thumbnail: {
5410
+ before: string;
5411
+ target: string;
5412
+ policy: "always";
5413
+ conditional: true;
5414
+ note: string;
5415
+ };
5416
+ thumbnailAlt: {
5417
+ before: string;
5418
+ target: string;
5419
+ policy: "always";
5420
+ conditional: true;
5421
+ note: string;
5422
+ };
5423
+ excerpt: {
5424
+ before: string;
5425
+ target: string;
5426
+ policy: "always";
5427
+ conditional: true;
5428
+ note: string;
5429
+ };
5430
+ tags: {
5431
+ before: string;
5432
+ target: string;
5433
+ policy: "always";
5434
+ conditional: true;
5435
+ note: string;
5436
+ };
5437
+ pinnedTo: {
5438
+ before: string;
5439
+ target: string;
5440
+ policy: "always";
5441
+ conditional: true;
5442
+ note: string;
5443
+ };
5444
+ status: {
5445
+ before: string;
5446
+ target: string;
5447
+ policy: "always";
5448
+ conditional: true;
5449
+ note: string;
5450
+ };
5451
+ seoTitle: {
5452
+ before: string;
5453
+ target: string;
5454
+ policy: "always";
5455
+ conditional: true;
5456
+ note: string;
5457
+ };
5458
+ seoDescription: {
5459
+ before: string;
5460
+ target: string;
5461
+ policy: "always";
5462
+ conditional: true;
5463
+ note: string;
5464
+ };
5465
+ seoKeywords: {
5466
+ before: string;
5467
+ target: string;
5468
+ policy: "always";
5469
+ conditional: true;
5470
+ note: string;
5471
+ };
5472
+ headerTag: {
5473
+ before: string;
5474
+ target: string;
5475
+ policy: "always";
5476
+ conditional: true;
5477
+ note: string;
5478
+ };
5479
+ readingMinutes: {
5480
+ target: string;
5481
+ policy: "seed";
5482
+ note: string;
5483
+ };
5484
+ relatedProducts: {
5485
+ target: string;
5486
+ policy: "seed";
5487
+ note: string;
5488
+ };
5489
+ stores: {
5490
+ target: string;
5491
+ policy: "seed";
5492
+ note: string;
5493
+ };
5494
+ }>;
5495
+ readonly 'blog-author': NetsuiteFieldProvider<{
5496
+ netsuiteId: {
5497
+ before: string;
5498
+ target: string;
5499
+ policy: "always";
5500
+ conditional: true;
5501
+ note: string;
5502
+ };
5503
+ name: {
5504
+ before: string;
5505
+ target: string;
5506
+ policy: "always";
5507
+ conditional: true;
5508
+ note: string;
5509
+ };
5510
+ status: {
5511
+ before: string;
5512
+ target: string;
5513
+ policy: "always";
5514
+ conditional: true;
5515
+ note: string;
5516
+ };
5517
+ slug: {
5518
+ target: string;
5519
+ policy: "seed";
5520
+ identity: true;
5521
+ note: string;
5522
+ caution: string;
5523
+ };
5524
+ bio: {
5525
+ target: string;
5526
+ policy: "seed";
5527
+ note: string;
5528
+ };
5529
+ seoTitle: {
5530
+ target: string;
5531
+ policy: "seed";
5532
+ note: string;
5533
+ };
5534
+ seoDescription: {
5535
+ target: string;
5536
+ policy: "seed";
5537
+ note: string;
5538
+ };
5539
+ seoKeywords: {
5540
+ target: string;
5541
+ policy: "seed";
5542
+ note: string;
5543
+ };
5544
+ role: {
5545
+ target: string;
5546
+ policy: "seed";
5547
+ note: string;
5548
+ };
5549
+ avatar: {
5550
+ target: string;
5551
+ policy: "seed";
5552
+ note: string;
5553
+ };
5554
+ }>;
5555
+ readonly 'blog-category': NetsuiteFieldProvider<{
5556
+ netsuiteId: {
5557
+ before: string;
5558
+ target: string;
5559
+ policy: "always";
5560
+ conditional: true;
5561
+ note: string;
5562
+ };
5563
+ name: {
5564
+ before: string;
5565
+ target: string;
5566
+ policy: "always";
5567
+ conditional: true;
5568
+ note: string;
5569
+ };
5570
+ status: {
5571
+ before: string;
5572
+ target: string;
5573
+ policy: "always";
5574
+ conditional: true;
5575
+ note: string;
5576
+ };
5577
+ slug: {
5578
+ target: string;
5579
+ policy: "seed";
5580
+ identity: true;
5581
+ note: string;
5582
+ caution: string;
5583
+ };
5584
+ description: {
5585
+ target: string;
5586
+ policy: "seed";
5587
+ note: string;
5588
+ };
5589
+ seoTitle: {
5590
+ target: string;
5591
+ policy: "seed";
5592
+ note: string;
5593
+ };
5594
+ seoDescription: {
5595
+ target: string;
5596
+ policy: "seed";
5597
+ note: string;
5598
+ };
5599
+ seoKeywords: {
5600
+ target: string;
5601
+ policy: "seed";
5602
+ note: string;
5603
+ };
5604
+ image: {
5605
+ target: string;
5606
+ policy: "seed";
5607
+ note: string;
5608
+ };
5609
+ sortOrder: {
5610
+ target: string;
5611
+ policy: "seed";
5612
+ note: string;
5613
+ };
5614
+ }>;
5615
+ };
5616
+ type NetsuiteOwnedEntity = keyof typeof BY_ENTITY;
5617
+ declare const NETSUITE_OWNED_FIELDS: Record<NetsuiteOwnedEntity, readonly string[]>;
5618
+ declare const isNetsuiteOwned: (entity: NetsuiteOwnedEntity, field: string) => boolean;
5619
+ type SyncRisk = 'overwritten' | 'identity' | 'seeded' | 'ours';
5620
+ declare const netsuiteFieldRisk: (entity: NetsuiteOwnedEntity, field: string, linked?: boolean) => SyncRisk;
5621
+ declare const netsuiteFieldConditional: (entity: NetsuiteOwnedEntity, field: string) => boolean;
5622
+ interface FieldSource {
5623
+ now?: string;
5624
+ after?: string;
5625
+ }
5626
+ declare const netsuiteFieldSource: (entity: NetsuiteOwnedEntity, field: string) => FieldSource | undefined;
5627
+ declare const netsuiteFieldNote: (entity: NetsuiteOwnedEntity, field: string) => string | undefined;
5628
+ declare const netsuiteFieldCaution: (entity: NetsuiteOwnedEntity, field: string) => string | undefined;
5629
+ interface NetsuiteRelationSource {
5630
+ field: string;
5631
+ note?: string;
5632
+ }
5633
+ declare const netsuiteRelationSource: (groupKey: string) => NetsuiteRelationSource | undefined;
5634
+ declare const NETSUITE_RELATION_GROUPS: readonly string[];
5635
+
5636
+ /**
5637
+ * Which system owns an entity's data. Everything is NetSuite except the podcast, which is pulled from
5638
+ * the Apple Podcasts lookup feed — the flag must name the real owner, not "NetSuite".
5639
+ */
5640
+ declare const syncOwnerFor: (entity: NetsuiteOwnedEntity) => string;
5641
+
1447
5642
  interface CheckoutAddressInput {
1448
5643
  addressLine1: string;
1449
5644
  addressLine2?: string;
@@ -1501,7 +5696,7 @@ declare const NotificationTypeEnum: {
1501
5696
  readonly QUOTE_REQUESTED: "QUOTE_REQUESTED";
1502
5697
  };
1503
5698
  type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];
1504
- declare const NOTIFICATION_TYPE_VALUES: ("REFUND" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "PAYMENT_SUCCEEDED" | "PAYMENT_FAILED" | "ORDER_STATUS")[];
5699
+ declare const NOTIFICATION_TYPE_VALUES: ("REFUND" | "PAYMENT_FAILED" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "PAYMENT_SUCCEEDED" | "ORDER_STATUS")[];
1505
5700
  interface INotification extends BaseEntity {
1506
5701
  type: NotificationTypeEnum;
1507
5702
  title: string;
@@ -1524,4 +5719,4 @@ interface IWishlist extends BaseEntity {
1524
5719
  items: IWishlistItem[];
1525
5720
  }
1526
5721
 
1527
- export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
5722
+ export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonGroupNetsuiteLink, type AddonNetsuiteLink, type AddonSelectionRef, type ApiResponse, type AppliedTax, BRAND_FIELDS, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CATEGORY_FIELDS, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, type CouponNetsuiteLink, DEFAULT_SUBSCRIPTION_TOPICS, DISCOUNT_TYPE_VALUES, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type FieldMap, type FieldMapping, type FieldSource, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type ICategorySubcategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INetsuiteOrderLink, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderShipment, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NETSUITE_OWNED_FIELDS, NETSUITE_RELATION_GROUPS, NOTIFICATION_TYPE_VALUES, NetsuiteFieldProvider, type NetsuiteOwnedEntity, type NetsuiteRelationSource, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, type OfferedAddon, type OfferedAddonGroup, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_FIELDS, PRODUCT_VARIANT_TYPE_VALUES, PROVIDERS, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RELATION_FIELDS, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type SelectedShippingMethod, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, type SyncPolicy, type SyncRisk, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonFields, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, blogAuthorFields, blogCategoryFields, blogPostFields, brandFields, can, canAny, canonicalizePath, canonicalizeSlug, categoryFields, conditionHolds, couponFields, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNetsuiteOwned, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, netsuiteFieldCaution, netsuiteFieldConditional, netsuiteFieldNote, netsuiteFieldRisk, netsuiteFieldSource, netsuiteRelationSource, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, podcastFields, productFields, readMapped, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, syncOwnerFor, toIdString, typeColorMap };