@poweredbysous/storefront-admin-sdk 3.1.0 → 3.3.0

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.cts CHANGED
@@ -577,6 +577,50 @@ interface paths {
577
577
  patch?: never;
578
578
  trace?: never;
579
579
  };
580
+ "/api/v1/admin/products/{product_id}/deposit/": {
581
+ parameters: {
582
+ query?: never;
583
+ header?: never;
584
+ path?: never;
585
+ cookie?: never;
586
+ };
587
+ /**
588
+ * Get a product's deposit (Pfand)
589
+ * @description Read or set one product's deposit (Pfand) from the Price tab.
590
+ *
591
+ * The portal sends an amount, not a surcharge id: this turns it into an
592
+ * attachment (``services.set_product_deposit``) and leaves the product's
593
+ * other surcharges alone, unlike ``AdminProductSurchargesView`` which
594
+ * replaces the whole set.
595
+ *
596
+ * Adding a deposit is refused unless the store's compliance profile offers
597
+ * one, so a store outside Germany — or with no country — cannot get a
598
+ * deposit by calling the API directly when the portal never shows the
599
+ * section. Removing one is always allowed.
600
+ */
601
+ get: operations["admin_products_deposit_retrieve"];
602
+ /**
603
+ * Set a product's deposit (Pfand)
604
+ * @description Read or set one product's deposit (Pfand) from the Price tab.
605
+ *
606
+ * The portal sends an amount, not a surcharge id: this turns it into an
607
+ * attachment (``services.set_product_deposit``) and leaves the product's
608
+ * other surcharges alone, unlike ``AdminProductSurchargesView`` which
609
+ * replaces the whole set.
610
+ *
611
+ * Adding a deposit is refused unless the store's compliance profile offers
612
+ * one, so a store outside Germany — or with no country — cannot get a
613
+ * deposit by calling the API directly when the portal never shows the
614
+ * section. Removing one is always allowed.
615
+ */
616
+ put: operations["admin_products_deposit_update"];
617
+ post?: never;
618
+ delete?: never;
619
+ options?: never;
620
+ head?: never;
621
+ patch?: never;
622
+ trace?: never;
623
+ };
580
624
  "/api/v1/admin/products/{product_id}/surcharges/": {
581
625
  parameters: {
582
626
  query?: never;
@@ -3164,6 +3208,7 @@ interface components {
3164
3208
  /** Format: decimal */
3165
3209
  value_numeric?: string | null;
3166
3210
  selected_choice_slugs?: string[];
3211
+ value_json?: unknown;
3167
3212
  };
3168
3213
  /**
3169
3214
  * @description The request body of the admin attribute-value upsert.
@@ -3183,6 +3228,21 @@ interface components {
3183
3228
  AdminAttributeValuesRequest: {
3184
3229
  values: components["schemas"]["AdminAttributeValueWrite"][];
3185
3230
  };
3231
+ /**
3232
+ * @description A product's deposit (Pfand) as the merchant portal's Price tab edits it.
3233
+ *
3234
+ * ``amount`` is the per-unit deposit in the store's currency, VAT-inclusive
3235
+ * like every surcharge amount: positive, in cents. Optional even when
3236
+ * ``applies`` is true — the amount is not hard-blocking (PAT-2275), and
3237
+ * ``{"applies": true, "amount": null}`` is a saved state in which nothing
3238
+ * is charged or shown until an amount is set. Ignored (and read back as
3239
+ * ``null``) when ``applies`` is false, and must be between 0.01 and 10.00.
3240
+ */
3241
+ AdminProductDeposit: {
3242
+ applies: boolean;
3243
+ /** Format: decimal */
3244
+ amount?: string | null;
3245
+ };
3186
3246
  /**
3187
3247
  * @description Lightweight product row for the merchant-portal product picker.
3188
3248
  *
@@ -3331,8 +3391,8 @@ interface components {
3331
3391
  AdminStoreComplianceDefaults: {
3332
3392
  /** @description Merchant-authored statement of how a customer returns a deposit-carrying container for the Pfand refund (D7). The platform charges and displays the deposit; the merchant runs the return — this is the platform's disclosure of that process, not the process itself. A store with any active deposit-charging product must set this before that product can list (see ``compliance.resolver.validate_products``). Empty means unset. */
3333
3393
  deposit_return_policy?: string;
3334
- /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A product-level value always takes precedence. Empty means unset. */
3335
- default_responsible_business?: string;
3394
+ /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A structured object of the operator's address sub-fields (company, street, postal_code, city, country). A product-level value always takes precedence. An empty object means unset. */
3395
+ default_responsible_business?: unknown;
3336
3396
  /** @description Fallback ``country_of_origin`` compliance value for this store's own prepacked products (D26). A product-level value always takes precedence. Empty means unset. */
3337
3397
  default_country_of_origin?: string;
3338
3398
  /** @description Whether this store offers reusable delivery packaging. German VerpackG §33 obliges eligible restaurants to offer and display the option; stores outside that scope leave it off and see no change. */
@@ -3536,24 +3596,10 @@ interface components {
3536
3596
  /**
3537
3597
  * @description How many products this category shows, descendants included.
3538
3598
  *
3539
- * Counted through the compliance gate (D15), because the count and the
3540
- * listing are one read model: ``/categories/`` reported 5 while
3541
- * ``/categories/<id>/products/`` returned 0, which discloses how many
3542
- * hidden products sit in each category and, by diffing, which categories
3543
- * are affected. Search's ``total`` had already closed the same gap.
3544
- *
3545
- * No ``annotated_product_count`` shortcut any more: a ``Count()`` in the
3546
- * view cannot know the verdict, so such an annotation would be an ungated
3547
- * number that silently won over this one.
3548
- *
3549
3599
  * The listing precomputes every category's count in one pass
3550
- * (``views._build_gated_counts``) and passes it in context, because doing
3551
- * it per category asked the gate — a fixed handful of queries however
3552
- * many ids it is given — once per category in the tree. ``MAX_DEPTH = 4``
3553
- * bounds the depth but not the breadth, and breadth is what drives it.
3554
- *
3555
- * The fallback below is the single-object path (retrieve), where there is
3556
- * no tree to amortise over and one gate call is the whole cost.
3600
+ * (``views._build_product_counts``) and passes it in context; the
3601
+ * fallback below is the single-object path (retrieve), which counts its
3602
+ * own subtree directly.
3557
3603
  */
3558
3604
  readonly product_count: number;
3559
3605
  };
@@ -3623,12 +3669,13 @@ interface components {
3623
3669
  label: string;
3624
3670
  choices: components["schemas"]["ComplianceChoice"][];
3625
3671
  inherits_store_default: boolean;
3626
- inherited_value: string | null;
3672
+ inherited_value: unknown;
3627
3673
  };
3628
3674
  ComplianceSchemaResponse: {
3629
3675
  product_type: string;
3630
3676
  product_type_classified: boolean;
3631
3677
  requires_attestation: boolean;
3678
+ deposit_config_enabled: boolean;
3632
3679
  fields: components["schemas"]["ComplianceSchemaField"][];
3633
3680
  };
3634
3681
  ConfirmEdit: {
@@ -3805,6 +3852,14 @@ interface components {
3805
3852
  /** Format: date-time */
3806
3853
  disabled_at: string | null;
3807
3854
  };
3855
+ /**
3856
+ * @description What merchant-portal-backend's publish needs to know about a store
3857
+ * whose delivery methods the portal's toggles own.
3858
+ */
3859
+ DeliveryMethodToggles: {
3860
+ wizard_choice_applies: components["schemas"]["WizardChoiceApplies"];
3861
+ publish_readiness: string[];
3862
+ };
3808
3863
  /**
3809
3864
  * @description Merchant-facing CRUD serializer for :class:`Discount`.
3810
3865
  *
@@ -3970,12 +4025,14 @@ interface components {
3970
4025
  * * `datetime` - Date & Time
3971
4026
  * * `dropdown` - Dropdown
3972
4027
  * * `multiselect` - Multi-select
4028
+ * * `structured_list` - Structured List
4029
+ * * `structured_object` - Structured Object
3973
4030
  * * `file` - File
3974
4031
  * * `reference` - Reference
3975
4032
  * * `color` - Color
3976
4033
  * @enum {string}
3977
4034
  */
3978
- InputTypeEnum: "text" | "rich_text" | "numeric" | "boolean" | "date" | "datetime" | "dropdown" | "multiselect" | "file" | "reference" | "color";
4035
+ InputTypeEnum: "text" | "rich_text" | "numeric" | "boolean" | "date" | "datetime" | "dropdown" | "multiselect" | "structured_list" | "structured_object" | "file" | "reference" | "color";
3979
4036
  Invoice: {
3980
4037
  id: string;
3981
4038
  /** Format: int64 */
@@ -4259,6 +4316,11 @@ interface components {
4259
4316
  * @description Aggregated non-discountable surcharges (VAT-inclusive)
4260
4317
  */
4261
4318
  surcharge_total?: string;
4319
+ /**
4320
+ * Format: decimal
4321
+ * @description Deposits (subset of surcharge_total), shown separately.
4322
+ */
4323
+ deposit_total?: string;
4262
4324
  cancellation_reason?: string;
4263
4325
  /** Format: decimal */
4264
4326
  total: string;
@@ -4402,6 +4464,11 @@ interface components {
4402
4464
  tax_amount: string;
4403
4465
  /** Format: decimal */
4404
4466
  line_total: string;
4467
+ /**
4468
+ * Format: decimal
4469
+ * @description Deposit charged on this line, snapshotted at order time so removing the line refunds it.
4470
+ */
4471
+ deposit_amount?: string;
4405
4472
  fulfillment_type: string;
4406
4473
  /** Format: date */
4407
4474
  fulfillment_date?: string | null;
@@ -4782,8 +4849,8 @@ interface components {
4782
4849
  PatchedAdminStoreComplianceDefaults: {
4783
4850
  /** @description Merchant-authored statement of how a customer returns a deposit-carrying container for the Pfand refund (D7). The platform charges and displays the deposit; the merchant runs the return — this is the platform's disclosure of that process, not the process itself. A store with any active deposit-charging product must set this before that product can list (see ``compliance.resolver.validate_products``). Empty means unset. */
4784
4851
  deposit_return_policy?: string;
4785
- /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A product-level value always takes precedence. Empty means unset. */
4786
- default_responsible_business?: string;
4852
+ /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A structured object of the operator's address sub-fields (company, street, postal_code, city, country). A product-level value always takes precedence. An empty object means unset. */
4853
+ default_responsible_business?: unknown;
4787
4854
  /** @description Fallback ``country_of_origin`` compliance value for this store's own prepacked products (D26). A product-level value always takes precedence. Empty means unset. */
4788
4855
  default_country_of_origin?: string;
4789
4856
  /** @description Whether this store offers reusable delivery packaging. German VerpackG §33 obliges eligible restaurants to offer and display the option; stores outside that scope leave it off and see no change. */
@@ -5061,7 +5128,7 @@ interface components {
5061
5128
  amount?: string;
5062
5129
  /**
5063
5130
  * Format: decimal
5064
- * @description VAT rate for this surcharge, independent of the product's rate. German Pfand is charged at the standard rate (19%) while the food line is often reduced (7%), so the surcharge cannot inherit the product's rate. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5131
+ * @description VAT rate for this surcharge. Not used for a deposit attached to a product or modifier: German Pfand is an ancillary charge on the container and is taxed at the rate of the item it is attached to (UStAE A 10.1 Abs. 8). A deposit's rate here only applies when it is charged per order as the reusable-packaging deposit. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5065
5132
  */
5066
5133
  vat_rate?: string;
5067
5134
  /** @description Category: sup, deposit, bag_fee, packaging, etc. */
@@ -5136,6 +5203,7 @@ interface components {
5136
5203
  value_file?: string;
5137
5204
  /** Format: int64 */
5138
5205
  value_reference?: number | null;
5206
+ value_json?: unknown;
5139
5207
  readonly selected_choices: components["schemas"]["AttributeChoice"][];
5140
5208
  };
5141
5209
  /**
@@ -5265,6 +5333,8 @@ interface components {
5265
5333
  /** Format: decimal */
5266
5334
  price: string;
5267
5335
  /** Format: decimal */
5336
+ readonly deposit_amount: string | null;
5337
+ /** Format: decimal */
5268
5338
  compare_at_price?: string | null;
5269
5339
  currency?: string;
5270
5340
  /** Format: decimal */
@@ -5774,6 +5844,7 @@ interface components {
5774
5844
  readonly updated_at: string;
5775
5845
  readonly brand_assets: components["schemas"]["StoreBrandAsset"][];
5776
5846
  readonly uber_direct_supported_countries: string[];
5847
+ readonly delivery_method_toggles: components["schemas"]["DeliveryMethodToggles"] | null;
5777
5848
  };
5778
5849
  /**
5779
5850
  * @description * `draft` - Draft
@@ -5787,6 +5858,8 @@ interface components {
5787
5858
  price: string;
5788
5859
  currency: string;
5789
5860
  image_url: string;
5861
+ /** Format: decimal */
5862
+ deposit_amount?: string | null;
5790
5863
  reason: string;
5791
5864
  };
5792
5865
  Surcharge: {
@@ -5802,7 +5875,7 @@ interface components {
5802
5875
  amount: string;
5803
5876
  /**
5804
5877
  * Format: decimal
5805
- * @description VAT rate for this surcharge, independent of the product's rate. German Pfand is charged at the standard rate (19%) while the food line is often reduced (7%), so the surcharge cannot inherit the product's rate. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5878
+ * @description VAT rate for this surcharge. Not used for a deposit attached to a product or modifier: German Pfand is an ancillary charge on the container and is taxed at the rate of the item it is attached to (UStAE A 10.1 Abs. 8). A deposit's rate here only applies when it is charged per order as the reusable-packaging deposit. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5806
5879
  */
5807
5880
  vat_rate: string;
5808
5881
  /** @description Category: sup, deposit, bag_fee, packaging, etc. */
@@ -5953,6 +6026,7 @@ interface components {
5953
6026
  value_file?: string;
5954
6027
  /** Format: int64 */
5955
6028
  value_reference?: number | null;
6029
+ value_json?: unknown;
5956
6030
  readonly selected_choices: components["schemas"]["AttributeChoice"][];
5957
6031
  };
5958
6032
  VariantPriceOverride: {
@@ -5996,6 +6070,11 @@ interface components {
5996
6070
  readonly updated_at: string;
5997
6071
  secret?: string;
5998
6072
  };
6073
+ /** @description Per delivery method: whether the wizard's toggle still decides it. */
6074
+ WizardChoiceApplies: {
6075
+ uber_direct: boolean;
6076
+ lieferando: boolean;
6077
+ };
5999
6078
  /** @description Schedule/scope block the storefront re-judges at render time. */
6000
6079
  _DiscountRestrictions: {
6001
6080
  /** @description IANA name the backend judges the schedule in. Re-judge the window against this, not against the browser clock or a locally configured merchant timezone. Null when this store has no usable configured timezone - keep your own fallback in that case, rather than treating the absence as a value. */
@@ -8605,6 +8684,168 @@ interface operations {
8605
8684
  };
8606
8685
  };
8607
8686
  };
8687
+ admin_products_deposit_retrieve: {
8688
+ parameters: {
8689
+ query?: never;
8690
+ header?: {
8691
+ /** @description Company the request acts on. Ignored for merchant tokens (scoped to their own company); required for admin tokens to select a company. */
8692
+ "X-Sous-Company-Id"?: number;
8693
+ };
8694
+ path: {
8695
+ product_id: number;
8696
+ };
8697
+ cookie?: never;
8698
+ };
8699
+ requestBody?: never;
8700
+ responses: {
8701
+ 200: {
8702
+ headers: {
8703
+ [name: string]: unknown;
8704
+ };
8705
+ content: {
8706
+ "application/json": components["schemas"]["AdminProductDeposit"];
8707
+ };
8708
+ };
8709
+ /** @description Possible error codes include `VALIDATION_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8710
+ 400: {
8711
+ headers: {
8712
+ [name: string]: unknown;
8713
+ };
8714
+ content: {
8715
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8716
+ };
8717
+ };
8718
+ /** @description Possible error codes include `UNAUTHORIZED`. Use `x-error-codes` for machine-readable retryability metadata. */
8719
+ 401: {
8720
+ headers: {
8721
+ [name: string]: unknown;
8722
+ };
8723
+ content: {
8724
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8725
+ };
8726
+ };
8727
+ /** @description Possible error codes include `FORBIDDEN`. Use `x-error-codes` for machine-readable retryability metadata. */
8728
+ 403: {
8729
+ headers: {
8730
+ [name: string]: unknown;
8731
+ };
8732
+ content: {
8733
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8734
+ };
8735
+ };
8736
+ /** @description Possible error codes include `NOT_FOUND`. Use `x-error-codes` for machine-readable retryability metadata. */
8737
+ 404: {
8738
+ headers: {
8739
+ [name: string]: unknown;
8740
+ };
8741
+ content: {
8742
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8743
+ };
8744
+ };
8745
+ /** @description Possible error codes include `RATE_LIMITED`. Use `x-error-codes` for machine-readable retryability metadata. */
8746
+ 429: {
8747
+ headers: {
8748
+ [name: string]: unknown;
8749
+ };
8750
+ content: {
8751
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8752
+ };
8753
+ };
8754
+ /** @description Possible error codes include `INTERNAL_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8755
+ 500: {
8756
+ headers: {
8757
+ [name: string]: unknown;
8758
+ };
8759
+ content: {
8760
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8761
+ };
8762
+ };
8763
+ };
8764
+ };
8765
+ admin_products_deposit_update: {
8766
+ parameters: {
8767
+ query?: never;
8768
+ header?: {
8769
+ /** @description Company the request acts on. Ignored for merchant tokens (scoped to their own company); required for admin tokens to select a company. */
8770
+ "X-Sous-Company-Id"?: number;
8771
+ };
8772
+ path: {
8773
+ product_id: number;
8774
+ };
8775
+ cookie?: never;
8776
+ };
8777
+ requestBody: {
8778
+ content: {
8779
+ "application/json": components["schemas"]["AdminProductDeposit"];
8780
+ "application/x-www-form-urlencoded": components["schemas"]["AdminProductDeposit"];
8781
+ "multipart/form-data": components["schemas"]["AdminProductDeposit"];
8782
+ };
8783
+ };
8784
+ responses: {
8785
+ 200: {
8786
+ headers: {
8787
+ [name: string]: unknown;
8788
+ };
8789
+ content: {
8790
+ "application/json": components["schemas"]["AdminProductDeposit"];
8791
+ };
8792
+ };
8793
+ /** @description Possible error codes include `VALIDATION_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8794
+ 400: {
8795
+ headers: {
8796
+ [name: string]: unknown;
8797
+ };
8798
+ content: {
8799
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8800
+ };
8801
+ };
8802
+ /** @description Possible error codes include `UNAUTHORIZED`. Use `x-error-codes` for machine-readable retryability metadata. */
8803
+ 401: {
8804
+ headers: {
8805
+ [name: string]: unknown;
8806
+ };
8807
+ content: {
8808
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8809
+ };
8810
+ };
8811
+ /** @description Possible error codes include `FORBIDDEN`. Use `x-error-codes` for machine-readable retryability metadata. */
8812
+ 403: {
8813
+ headers: {
8814
+ [name: string]: unknown;
8815
+ };
8816
+ content: {
8817
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8818
+ };
8819
+ };
8820
+ /** @description Possible error codes include `NOT_FOUND`. Use `x-error-codes` for machine-readable retryability metadata. */
8821
+ 404: {
8822
+ headers: {
8823
+ [name: string]: unknown;
8824
+ };
8825
+ content: {
8826
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8827
+ };
8828
+ };
8829
+ /** @description Possible error codes include `RATE_LIMITED`. Use `x-error-codes` for machine-readable retryability metadata. */
8830
+ 429: {
8831
+ headers: {
8832
+ [name: string]: unknown;
8833
+ };
8834
+ content: {
8835
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8836
+ };
8837
+ };
8838
+ /** @description Possible error codes include `INTERNAL_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8839
+ 500: {
8840
+ headers: {
8841
+ [name: string]: unknown;
8842
+ };
8843
+ content: {
8844
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8845
+ };
8846
+ };
8847
+ };
8848
+ };
8608
8849
  admin_products_surcharges_update: {
8609
8850
  parameters: {
8610
8851
  query?: never;
package/dist/index.d.ts CHANGED
@@ -577,6 +577,50 @@ interface paths {
577
577
  patch?: never;
578
578
  trace?: never;
579
579
  };
580
+ "/api/v1/admin/products/{product_id}/deposit/": {
581
+ parameters: {
582
+ query?: never;
583
+ header?: never;
584
+ path?: never;
585
+ cookie?: never;
586
+ };
587
+ /**
588
+ * Get a product's deposit (Pfand)
589
+ * @description Read or set one product's deposit (Pfand) from the Price tab.
590
+ *
591
+ * The portal sends an amount, not a surcharge id: this turns it into an
592
+ * attachment (``services.set_product_deposit``) and leaves the product's
593
+ * other surcharges alone, unlike ``AdminProductSurchargesView`` which
594
+ * replaces the whole set.
595
+ *
596
+ * Adding a deposit is refused unless the store's compliance profile offers
597
+ * one, so a store outside Germany — or with no country — cannot get a
598
+ * deposit by calling the API directly when the portal never shows the
599
+ * section. Removing one is always allowed.
600
+ */
601
+ get: operations["admin_products_deposit_retrieve"];
602
+ /**
603
+ * Set a product's deposit (Pfand)
604
+ * @description Read or set one product's deposit (Pfand) from the Price tab.
605
+ *
606
+ * The portal sends an amount, not a surcharge id: this turns it into an
607
+ * attachment (``services.set_product_deposit``) and leaves the product's
608
+ * other surcharges alone, unlike ``AdminProductSurchargesView`` which
609
+ * replaces the whole set.
610
+ *
611
+ * Adding a deposit is refused unless the store's compliance profile offers
612
+ * one, so a store outside Germany — or with no country — cannot get a
613
+ * deposit by calling the API directly when the portal never shows the
614
+ * section. Removing one is always allowed.
615
+ */
616
+ put: operations["admin_products_deposit_update"];
617
+ post?: never;
618
+ delete?: never;
619
+ options?: never;
620
+ head?: never;
621
+ patch?: never;
622
+ trace?: never;
623
+ };
580
624
  "/api/v1/admin/products/{product_id}/surcharges/": {
581
625
  parameters: {
582
626
  query?: never;
@@ -3164,6 +3208,7 @@ interface components {
3164
3208
  /** Format: decimal */
3165
3209
  value_numeric?: string | null;
3166
3210
  selected_choice_slugs?: string[];
3211
+ value_json?: unknown;
3167
3212
  };
3168
3213
  /**
3169
3214
  * @description The request body of the admin attribute-value upsert.
@@ -3183,6 +3228,21 @@ interface components {
3183
3228
  AdminAttributeValuesRequest: {
3184
3229
  values: components["schemas"]["AdminAttributeValueWrite"][];
3185
3230
  };
3231
+ /**
3232
+ * @description A product's deposit (Pfand) as the merchant portal's Price tab edits it.
3233
+ *
3234
+ * ``amount`` is the per-unit deposit in the store's currency, VAT-inclusive
3235
+ * like every surcharge amount: positive, in cents. Optional even when
3236
+ * ``applies`` is true — the amount is not hard-blocking (PAT-2275), and
3237
+ * ``{"applies": true, "amount": null}`` is a saved state in which nothing
3238
+ * is charged or shown until an amount is set. Ignored (and read back as
3239
+ * ``null``) when ``applies`` is false, and must be between 0.01 and 10.00.
3240
+ */
3241
+ AdminProductDeposit: {
3242
+ applies: boolean;
3243
+ /** Format: decimal */
3244
+ amount?: string | null;
3245
+ };
3186
3246
  /**
3187
3247
  * @description Lightweight product row for the merchant-portal product picker.
3188
3248
  *
@@ -3331,8 +3391,8 @@ interface components {
3331
3391
  AdminStoreComplianceDefaults: {
3332
3392
  /** @description Merchant-authored statement of how a customer returns a deposit-carrying container for the Pfand refund (D7). The platform charges and displays the deposit; the merchant runs the return — this is the platform's disclosure of that process, not the process itself. A store with any active deposit-charging product must set this before that product can list (see ``compliance.resolver.validate_products``). Empty means unset. */
3333
3393
  deposit_return_policy?: string;
3334
- /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A product-level value always takes precedence. Empty means unset. */
3335
- default_responsible_business?: string;
3394
+ /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A structured object of the operator's address sub-fields (company, street, postal_code, city, country). A product-level value always takes precedence. An empty object means unset. */
3395
+ default_responsible_business?: unknown;
3336
3396
  /** @description Fallback ``country_of_origin`` compliance value for this store's own prepacked products (D26). A product-level value always takes precedence. Empty means unset. */
3337
3397
  default_country_of_origin?: string;
3338
3398
  /** @description Whether this store offers reusable delivery packaging. German VerpackG §33 obliges eligible restaurants to offer and display the option; stores outside that scope leave it off and see no change. */
@@ -3536,24 +3596,10 @@ interface components {
3536
3596
  /**
3537
3597
  * @description How many products this category shows, descendants included.
3538
3598
  *
3539
- * Counted through the compliance gate (D15), because the count and the
3540
- * listing are one read model: ``/categories/`` reported 5 while
3541
- * ``/categories/<id>/products/`` returned 0, which discloses how many
3542
- * hidden products sit in each category and, by diffing, which categories
3543
- * are affected. Search's ``total`` had already closed the same gap.
3544
- *
3545
- * No ``annotated_product_count`` shortcut any more: a ``Count()`` in the
3546
- * view cannot know the verdict, so such an annotation would be an ungated
3547
- * number that silently won over this one.
3548
- *
3549
3599
  * The listing precomputes every category's count in one pass
3550
- * (``views._build_gated_counts``) and passes it in context, because doing
3551
- * it per category asked the gate — a fixed handful of queries however
3552
- * many ids it is given — once per category in the tree. ``MAX_DEPTH = 4``
3553
- * bounds the depth but not the breadth, and breadth is what drives it.
3554
- *
3555
- * The fallback below is the single-object path (retrieve), where there is
3556
- * no tree to amortise over and one gate call is the whole cost.
3600
+ * (``views._build_product_counts``) and passes it in context; the
3601
+ * fallback below is the single-object path (retrieve), which counts its
3602
+ * own subtree directly.
3557
3603
  */
3558
3604
  readonly product_count: number;
3559
3605
  };
@@ -3623,12 +3669,13 @@ interface components {
3623
3669
  label: string;
3624
3670
  choices: components["schemas"]["ComplianceChoice"][];
3625
3671
  inherits_store_default: boolean;
3626
- inherited_value: string | null;
3672
+ inherited_value: unknown;
3627
3673
  };
3628
3674
  ComplianceSchemaResponse: {
3629
3675
  product_type: string;
3630
3676
  product_type_classified: boolean;
3631
3677
  requires_attestation: boolean;
3678
+ deposit_config_enabled: boolean;
3632
3679
  fields: components["schemas"]["ComplianceSchemaField"][];
3633
3680
  };
3634
3681
  ConfirmEdit: {
@@ -3805,6 +3852,14 @@ interface components {
3805
3852
  /** Format: date-time */
3806
3853
  disabled_at: string | null;
3807
3854
  };
3855
+ /**
3856
+ * @description What merchant-portal-backend's publish needs to know about a store
3857
+ * whose delivery methods the portal's toggles own.
3858
+ */
3859
+ DeliveryMethodToggles: {
3860
+ wizard_choice_applies: components["schemas"]["WizardChoiceApplies"];
3861
+ publish_readiness: string[];
3862
+ };
3808
3863
  /**
3809
3864
  * @description Merchant-facing CRUD serializer for :class:`Discount`.
3810
3865
  *
@@ -3970,12 +4025,14 @@ interface components {
3970
4025
  * * `datetime` - Date & Time
3971
4026
  * * `dropdown` - Dropdown
3972
4027
  * * `multiselect` - Multi-select
4028
+ * * `structured_list` - Structured List
4029
+ * * `structured_object` - Structured Object
3973
4030
  * * `file` - File
3974
4031
  * * `reference` - Reference
3975
4032
  * * `color` - Color
3976
4033
  * @enum {string}
3977
4034
  */
3978
- InputTypeEnum: "text" | "rich_text" | "numeric" | "boolean" | "date" | "datetime" | "dropdown" | "multiselect" | "file" | "reference" | "color";
4035
+ InputTypeEnum: "text" | "rich_text" | "numeric" | "boolean" | "date" | "datetime" | "dropdown" | "multiselect" | "structured_list" | "structured_object" | "file" | "reference" | "color";
3979
4036
  Invoice: {
3980
4037
  id: string;
3981
4038
  /** Format: int64 */
@@ -4259,6 +4316,11 @@ interface components {
4259
4316
  * @description Aggregated non-discountable surcharges (VAT-inclusive)
4260
4317
  */
4261
4318
  surcharge_total?: string;
4319
+ /**
4320
+ * Format: decimal
4321
+ * @description Deposits (subset of surcharge_total), shown separately.
4322
+ */
4323
+ deposit_total?: string;
4262
4324
  cancellation_reason?: string;
4263
4325
  /** Format: decimal */
4264
4326
  total: string;
@@ -4402,6 +4464,11 @@ interface components {
4402
4464
  tax_amount: string;
4403
4465
  /** Format: decimal */
4404
4466
  line_total: string;
4467
+ /**
4468
+ * Format: decimal
4469
+ * @description Deposit charged on this line, snapshotted at order time so removing the line refunds it.
4470
+ */
4471
+ deposit_amount?: string;
4405
4472
  fulfillment_type: string;
4406
4473
  /** Format: date */
4407
4474
  fulfillment_date?: string | null;
@@ -4782,8 +4849,8 @@ interface components {
4782
4849
  PatchedAdminStoreComplianceDefaults: {
4783
4850
  /** @description Merchant-authored statement of how a customer returns a deposit-carrying container for the Pfand refund (D7). The platform charges and displays the deposit; the merchant runs the return — this is the platform's disclosure of that process, not the process itself. A store with any active deposit-charging product must set this before that product can list (see ``compliance.resolver.validate_products``). Empty means unset. */
4784
4851
  deposit_return_policy?: string;
4785
- /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A product-level value always takes precedence. Empty means unset. */
4786
- default_responsible_business?: string;
4852
+ /** @description Fallback ``responsible_business`` compliance value for this store's own prepacked products, so a merchant can supply it once instead of on every product (D26). A structured object of the operator's address sub-fields (company, street, postal_code, city, country). A product-level value always takes precedence. An empty object means unset. */
4853
+ default_responsible_business?: unknown;
4787
4854
  /** @description Fallback ``country_of_origin`` compliance value for this store's own prepacked products (D26). A product-level value always takes precedence. Empty means unset. */
4788
4855
  default_country_of_origin?: string;
4789
4856
  /** @description Whether this store offers reusable delivery packaging. German VerpackG §33 obliges eligible restaurants to offer and display the option; stores outside that scope leave it off and see no change. */
@@ -5061,7 +5128,7 @@ interface components {
5061
5128
  amount?: string;
5062
5129
  /**
5063
5130
  * Format: decimal
5064
- * @description VAT rate for this surcharge, independent of the product's rate. German Pfand is charged at the standard rate (19%) while the food line is often reduced (7%), so the surcharge cannot inherit the product's rate. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5131
+ * @description VAT rate for this surcharge. Not used for a deposit attached to a product or modifier: German Pfand is an ancillary charge on the container and is taxed at the rate of the item it is attached to (UStAE A 10.1 Abs. 8). A deposit's rate here only applies when it is charged per order as the reusable-packaging deposit. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5065
5132
  */
5066
5133
  vat_rate?: string;
5067
5134
  /** @description Category: sup, deposit, bag_fee, packaging, etc. */
@@ -5136,6 +5203,7 @@ interface components {
5136
5203
  value_file?: string;
5137
5204
  /** Format: int64 */
5138
5205
  value_reference?: number | null;
5206
+ value_json?: unknown;
5139
5207
  readonly selected_choices: components["schemas"]["AttributeChoice"][];
5140
5208
  };
5141
5209
  /**
@@ -5265,6 +5333,8 @@ interface components {
5265
5333
  /** Format: decimal */
5266
5334
  price: string;
5267
5335
  /** Format: decimal */
5336
+ readonly deposit_amount: string | null;
5337
+ /** Format: decimal */
5268
5338
  compare_at_price?: string | null;
5269
5339
  currency?: string;
5270
5340
  /** Format: decimal */
@@ -5774,6 +5844,7 @@ interface components {
5774
5844
  readonly updated_at: string;
5775
5845
  readonly brand_assets: components["schemas"]["StoreBrandAsset"][];
5776
5846
  readonly uber_direct_supported_countries: string[];
5847
+ readonly delivery_method_toggles: components["schemas"]["DeliveryMethodToggles"] | null;
5777
5848
  };
5778
5849
  /**
5779
5850
  * @description * `draft` - Draft
@@ -5787,6 +5858,8 @@ interface components {
5787
5858
  price: string;
5788
5859
  currency: string;
5789
5860
  image_url: string;
5861
+ /** Format: decimal */
5862
+ deposit_amount?: string | null;
5790
5863
  reason: string;
5791
5864
  };
5792
5865
  Surcharge: {
@@ -5802,7 +5875,7 @@ interface components {
5802
5875
  amount: string;
5803
5876
  /**
5804
5877
  * Format: decimal
5805
- * @description VAT rate for this surcharge, independent of the product's rate. German Pfand is charged at the standard rate (19%) while the food line is often reduced (7%), so the surcharge cannot inherit the product's rate. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5878
+ * @description VAT rate for this surcharge. Not used for a deposit attached to a product or modifier: German Pfand is an ancillary charge on the container and is taxed at the rate of the item it is attached to (UStAE A 10.1 Abs. 8). A deposit's rate here only applies when it is charged per order as the reusable-packaging deposit. Stored as a fraction — the convention every VAT rate in this codebase carries: 19% is stored as 0.19, never 19.00. Required, like Product.vat_rate and ProductModifier.vat_rate: a missing rate must fail loudly rather than silently invoice at 0%.
5806
5879
  */
5807
5880
  vat_rate: string;
5808
5881
  /** @description Category: sup, deposit, bag_fee, packaging, etc. */
@@ -5953,6 +6026,7 @@ interface components {
5953
6026
  value_file?: string;
5954
6027
  /** Format: int64 */
5955
6028
  value_reference?: number | null;
6029
+ value_json?: unknown;
5956
6030
  readonly selected_choices: components["schemas"]["AttributeChoice"][];
5957
6031
  };
5958
6032
  VariantPriceOverride: {
@@ -5996,6 +6070,11 @@ interface components {
5996
6070
  readonly updated_at: string;
5997
6071
  secret?: string;
5998
6072
  };
6073
+ /** @description Per delivery method: whether the wizard's toggle still decides it. */
6074
+ WizardChoiceApplies: {
6075
+ uber_direct: boolean;
6076
+ lieferando: boolean;
6077
+ };
5999
6078
  /** @description Schedule/scope block the storefront re-judges at render time. */
6000
6079
  _DiscountRestrictions: {
6001
6080
  /** @description IANA name the backend judges the schedule in. Re-judge the window against this, not against the browser clock or a locally configured merchant timezone. Null when this store has no usable configured timezone - keep your own fallback in that case, rather than treating the absence as a value. */
@@ -8605,6 +8684,168 @@ interface operations {
8605
8684
  };
8606
8685
  };
8607
8686
  };
8687
+ admin_products_deposit_retrieve: {
8688
+ parameters: {
8689
+ query?: never;
8690
+ header?: {
8691
+ /** @description Company the request acts on. Ignored for merchant tokens (scoped to their own company); required for admin tokens to select a company. */
8692
+ "X-Sous-Company-Id"?: number;
8693
+ };
8694
+ path: {
8695
+ product_id: number;
8696
+ };
8697
+ cookie?: never;
8698
+ };
8699
+ requestBody?: never;
8700
+ responses: {
8701
+ 200: {
8702
+ headers: {
8703
+ [name: string]: unknown;
8704
+ };
8705
+ content: {
8706
+ "application/json": components["schemas"]["AdminProductDeposit"];
8707
+ };
8708
+ };
8709
+ /** @description Possible error codes include `VALIDATION_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8710
+ 400: {
8711
+ headers: {
8712
+ [name: string]: unknown;
8713
+ };
8714
+ content: {
8715
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8716
+ };
8717
+ };
8718
+ /** @description Possible error codes include `UNAUTHORIZED`. Use `x-error-codes` for machine-readable retryability metadata. */
8719
+ 401: {
8720
+ headers: {
8721
+ [name: string]: unknown;
8722
+ };
8723
+ content: {
8724
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8725
+ };
8726
+ };
8727
+ /** @description Possible error codes include `FORBIDDEN`. Use `x-error-codes` for machine-readable retryability metadata. */
8728
+ 403: {
8729
+ headers: {
8730
+ [name: string]: unknown;
8731
+ };
8732
+ content: {
8733
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8734
+ };
8735
+ };
8736
+ /** @description Possible error codes include `NOT_FOUND`. Use `x-error-codes` for machine-readable retryability metadata. */
8737
+ 404: {
8738
+ headers: {
8739
+ [name: string]: unknown;
8740
+ };
8741
+ content: {
8742
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8743
+ };
8744
+ };
8745
+ /** @description Possible error codes include `RATE_LIMITED`. Use `x-error-codes` for machine-readable retryability metadata. */
8746
+ 429: {
8747
+ headers: {
8748
+ [name: string]: unknown;
8749
+ };
8750
+ content: {
8751
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8752
+ };
8753
+ };
8754
+ /** @description Possible error codes include `INTERNAL_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8755
+ 500: {
8756
+ headers: {
8757
+ [name: string]: unknown;
8758
+ };
8759
+ content: {
8760
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8761
+ };
8762
+ };
8763
+ };
8764
+ };
8765
+ admin_products_deposit_update: {
8766
+ parameters: {
8767
+ query?: never;
8768
+ header?: {
8769
+ /** @description Company the request acts on. Ignored for merchant tokens (scoped to their own company); required for admin tokens to select a company. */
8770
+ "X-Sous-Company-Id"?: number;
8771
+ };
8772
+ path: {
8773
+ product_id: number;
8774
+ };
8775
+ cookie?: never;
8776
+ };
8777
+ requestBody: {
8778
+ content: {
8779
+ "application/json": components["schemas"]["AdminProductDeposit"];
8780
+ "application/x-www-form-urlencoded": components["schemas"]["AdminProductDeposit"];
8781
+ "multipart/form-data": components["schemas"]["AdminProductDeposit"];
8782
+ };
8783
+ };
8784
+ responses: {
8785
+ 200: {
8786
+ headers: {
8787
+ [name: string]: unknown;
8788
+ };
8789
+ content: {
8790
+ "application/json": components["schemas"]["AdminProductDeposit"];
8791
+ };
8792
+ };
8793
+ /** @description Possible error codes include `VALIDATION_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8794
+ 400: {
8795
+ headers: {
8796
+ [name: string]: unknown;
8797
+ };
8798
+ content: {
8799
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8800
+ };
8801
+ };
8802
+ /** @description Possible error codes include `UNAUTHORIZED`. Use `x-error-codes` for machine-readable retryability metadata. */
8803
+ 401: {
8804
+ headers: {
8805
+ [name: string]: unknown;
8806
+ };
8807
+ content: {
8808
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8809
+ };
8810
+ };
8811
+ /** @description Possible error codes include `FORBIDDEN`. Use `x-error-codes` for machine-readable retryability metadata. */
8812
+ 403: {
8813
+ headers: {
8814
+ [name: string]: unknown;
8815
+ };
8816
+ content: {
8817
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8818
+ };
8819
+ };
8820
+ /** @description Possible error codes include `NOT_FOUND`. Use `x-error-codes` for machine-readable retryability metadata. */
8821
+ 404: {
8822
+ headers: {
8823
+ [name: string]: unknown;
8824
+ };
8825
+ content: {
8826
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8827
+ };
8828
+ };
8829
+ /** @description Possible error codes include `RATE_LIMITED`. Use `x-error-codes` for machine-readable retryability metadata. */
8830
+ 429: {
8831
+ headers: {
8832
+ [name: string]: unknown;
8833
+ };
8834
+ content: {
8835
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8836
+ };
8837
+ };
8838
+ /** @description Possible error codes include `INTERNAL_ERROR`. Use `x-error-codes` for machine-readable retryability metadata. */
8839
+ 500: {
8840
+ headers: {
8841
+ [name: string]: unknown;
8842
+ };
8843
+ content: {
8844
+ "application/json": components["schemas"]["APIErrorEnvelope"];
8845
+ };
8846
+ };
8847
+ };
8848
+ };
8608
8849
  admin_products_surcharges_update: {
8609
8850
  parameters: {
8610
8851
  query?: never;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poweredbysous/storefront-admin-sdk",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "Type-safe TypeScript SDK for SOUS Storefront Backend admin endpoints",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,