@mohasinac/appkit 4.42.11 → 4.42.12

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.
@@ -535,7 +535,25 @@ async function createOrderForGroup(group, orderType, ctx) {
535
535
  shipmentProtectionAddon: !adminBypass && shipmentProtectionFee > 0 ? true : undefined,
536
536
  shipmentProtectionFee: !adminBypass && shipmentProtectionFee > 0 ? shipmentProtectionFee : undefined,
537
537
  taxableAmount: gstBreakdown?.taxableAmount,
538
- gstAmount: gstBreakdown?.gstAmount,
538
+ /*
539
+ * 🛑 This must include the GST on the PLATFORM FEE, not just product GST.
540
+ *
541
+ * `gstBreakdown` exists only when product GST is non-zero, and this
542
+ * catalogue's products carry no `gstRate` — so for every real order so far
543
+ * this resolved to `undefined`. Measured 2026-10-03: 0 of 40 live orders
544
+ * had a `gstAmount`, and the order page's Tax row (which maps from it via
545
+ * adapters.ts `tax: doc.gstAmount`) had therefore NEVER rendered.
546
+ *
547
+ * Meanwhile the buyer IS charged `platformFeeGst` — it is a term in the
548
+ * `orderTotal` expression above — and checkout displays it: a real order
549
+ * showed "GST ₹1.80" at checkout and an order page whose lines summed
550
+ * ₹1.80 short of its own total, with nothing naming the gap.
551
+ *
552
+ * Summing both is what makes the order reconcile. Keep `cgst`/`sgst`/`igst`
553
+ * as the product-only split; they describe the intra/inter-state breakdown
554
+ * of goods, which fee GST is not part of.
555
+ */
556
+ gstAmount: (gstBreakdown?.gstAmount ?? 0) + platformFeeGst || undefined,
539
557
  cgst: gstBreakdown?.cgst || undefined,
540
558
  sgst: gstBreakdown?.sgst || undefined,
541
559
  igst: gstBreakdown?.igst || undefined,
@@ -212,6 +212,70 @@ const _rawProductsStandardSeedData = [
212
212
  createdAt: new Date("2026-04-10"),
213
213
  updatedAt: new Date("2026-05-01"),
214
214
  },
215
+ /*
216
+ * 🛑 CROSS-STORE PAIR — these two exist ONLY so the cross-store bundle
217
+ * refusal can be exercised. They are deliberately in DIFFERENT stores,
218
+ * which is the shape all four bundle write routes must reject via
219
+ * findBundleMemberStores().
220
+ *
221
+ * Added 2026-10-03: CLAUDE.md asserted these were seeded and they were not —
222
+ * a full reseed produced 70 products with zero tester fixtures, so the guard
223
+ * had nothing that could trigger it and the case was unrunnable. A guard with
224
+ * no data that triggers it is a guard nobody can verify.
225
+ *
226
+ * isTestData marks them for the sandbox cleanup sweep; keep the expiry far
227
+ * enough out that a run cannot outlive them.
228
+ */
229
+ {
230
+ id: "product-tester-crossstore-a",
231
+ slug: "product-tester-crossstore-a",
232
+ title: "QA Cross-store A — Beyblade Arena",
233
+ description: "Tester fixture. Paired with product-tester-crossstore-b, which belongs to a DIFFERENT store, so that a bundle spanning both must be refused at save time.",
234
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
235
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
236
+ brandSlug: "brand-beyblade",
237
+ brand: "Beyblade",
238
+ price: 499,
239
+ currency: "INR",
240
+ stockQuantity: 5,
241
+ availableQuantity: 5,
242
+ isSold: false,
243
+ mainImage: seedPhoto("product-image-tester-crossstore-a-1-20261003", 900, 900),
244
+ images: [seedPhoto("product-image-tester-crossstore-a-1-20261003", 900, 900)],
245
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
246
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
247
+ tags: ["qa-fixture"],
248
+ storeId: "store-beyblade-arena",
249
+ storeName: "Beyblade Arena",
250
+ isTestData: true,
251
+ createdAt: new Date("2026-10-03"),
252
+ updatedAt: new Date("2026-10-03"),
253
+ },
254
+ {
255
+ id: "product-tester-crossstore-b",
256
+ slug: "product-tester-crossstore-b",
257
+ title: "QA Cross-store B — LetItRip Official",
258
+ description: "Tester fixture. Paired with product-tester-crossstore-a, which belongs to a DIFFERENT store, so that a bundle spanning both must be refused at save time.",
259
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
260
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
261
+ brandSlug: "brand-beyblade",
262
+ brand: "Beyblade",
263
+ price: 499,
264
+ currency: "INR",
265
+ stockQuantity: 5,
266
+ availableQuantity: 5,
267
+ isSold: false,
268
+ mainImage: seedPhoto("product-image-tester-crossstore-b-1-20261003", 900, 900),
269
+ images: [seedPhoto("product-image-tester-crossstore-b-1-20261003", 900, 900)],
270
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
271
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
272
+ tags: ["qa-fixture"],
273
+ storeId: "store-letitrip-official",
274
+ storeName: "LetItRip Official",
275
+ isTestData: true,
276
+ createdAt: new Date("2026-10-03"),
277
+ updatedAt: new Date("2026-10-03"),
278
+ },
215
279
  {
216
280
  id: "product-beyblade-original-driger-v",
217
281
  slug: "product-beyblade-original-driger-v",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mohasinac/appkit",
3
- "version": "4.42.11",
3
+ "version": "4.42.12",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"