@doswiftly/storefront-operations 1.0.5

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.
@@ -0,0 +1,1152 @@
1
+ # ============================================
2
+ # DoSwiftly Storefront API - Fragments
3
+ # SSOT: Backend defines all reusable fragments
4
+ # ============================================
5
+
6
+ # ============================================
7
+ # Common Fragments
8
+ # ============================================
9
+
10
+ fragment PageInfo on PageInfo {
11
+ hasNextPage
12
+ hasPreviousPage
13
+ startCursor
14
+ endCursor
15
+ }
16
+
17
+ fragment UserError on UserError {
18
+ message
19
+ code
20
+ field
21
+ }
22
+
23
+ fragment Image on Image {
24
+ id
25
+ url
26
+ altText
27
+ width
28
+ height
29
+ }
30
+
31
+ # Simple money (for originalPrice fields and non-converted prices)
32
+ fragment Money on Money {
33
+ amount
34
+ currencyCode
35
+ }
36
+
37
+ # Full price with conversion transparency (for price fields that support currency conversion)
38
+ fragment PriceMoney on PriceMoney {
39
+ amount
40
+ currencyCode
41
+ baseAmount
42
+ baseCurrencyCode
43
+ exchangeRate
44
+ marginApplied
45
+ rateTimestamp
46
+ isConverted
47
+ }
48
+
49
+ fragment SelectedOption on SelectedOption {
50
+ name
51
+ value
52
+ }
53
+
54
+ # ============================================
55
+ # Product Fragments
56
+ # ============================================
57
+
58
+ fragment ProductVariant on ProductVariant {
59
+ id
60
+ title
61
+ sku
62
+ price {
63
+ ...PriceMoney
64
+ }
65
+ originalPrice {
66
+ ...Money
67
+ }
68
+ compareAtPrice {
69
+ ...PriceMoney
70
+ }
71
+ originalCompareAtPrice {
72
+ ...Money
73
+ }
74
+ available
75
+ quantityAvailable
76
+ image {
77
+ ...Image
78
+ }
79
+ selectedOptions {
80
+ ...SelectedOption
81
+ }
82
+ barcode
83
+ weight
84
+ position
85
+ }
86
+
87
+ fragment ProductBase on Product {
88
+ id
89
+ handle
90
+ title
91
+ description
92
+ descriptionHtml
93
+ featuredImage {
94
+ ...Image
95
+ }
96
+ priceRange {
97
+ minVariantPrice {
98
+ ...PriceMoney
99
+ }
100
+ maxVariantPrice {
101
+ ...PriceMoney
102
+ }
103
+ }
104
+ originalPriceRange {
105
+ minVariantPrice {
106
+ ...Money
107
+ }
108
+ maxVariantPrice {
109
+ ...Money
110
+ }
111
+ }
112
+ compareAtPriceRange {
113
+ minVariantPrice {
114
+ ...PriceMoney
115
+ }
116
+ maxVariantPrice {
117
+ ...PriceMoney
118
+ }
119
+ }
120
+ originalCompareAtPriceRange {
121
+ minVariantPrice {
122
+ ...Money
123
+ }
124
+ maxVariantPrice {
125
+ ...Money
126
+ }
127
+ }
128
+ totalInventory
129
+ vendor
130
+ productType
131
+ type
132
+ collectRecipientInfo
133
+ tags
134
+ createdAt
135
+ updatedAt
136
+ averageRating
137
+ reviewCount
138
+ availableForSale
139
+ }
140
+
141
+ fragment ProductFull on Product {
142
+ ...ProductBase
143
+ images(first: 20) {
144
+ ...Image
145
+ }
146
+ variants(first: 100) {
147
+ ...ProductVariant
148
+ }
149
+ seo {
150
+ title
151
+ description
152
+ }
153
+ }
154
+
155
+ # ============================================
156
+ # Collection Fragments
157
+ # ============================================
158
+
159
+ fragment Collection on Collection {
160
+ id
161
+ handle
162
+ title
163
+ description
164
+ descriptionHtml
165
+ image {
166
+ ...Image
167
+ }
168
+ seo {
169
+ title
170
+ description
171
+ }
172
+ createdAt
173
+ updatedAt
174
+ }
175
+
176
+ # ============================================
177
+ # Category Fragments
178
+ # ============================================
179
+
180
+ fragment Category on Category {
181
+ id
182
+ name
183
+ slug
184
+ description
185
+ image {
186
+ ...Image
187
+ }
188
+ level
189
+ path
190
+ productCount
191
+ sortOrder
192
+ }
193
+
194
+ # ============================================
195
+ # Customer Fragments
196
+ # ============================================
197
+
198
+ fragment MailingAddress on MailingAddress {
199
+ id
200
+ address1
201
+ address2
202
+ city
203
+ company
204
+ country
205
+ countryCode
206
+ firstName
207
+ lastName
208
+ phone
209
+ province
210
+ provinceCode
211
+ zip
212
+ isDefault
213
+ }
214
+
215
+ fragment CustomerAccessToken on CustomerAccessToken {
216
+ accessToken
217
+ expiresAt
218
+ }
219
+
220
+ fragment Customer on Customer {
221
+ id
222
+ email
223
+ firstName
224
+ lastName
225
+ displayName
226
+ phone
227
+ emailVerified
228
+ acceptsMarketing
229
+ defaultAddress {
230
+ ...MailingAddress
231
+ }
232
+ ordersCount
233
+ totalSpent {
234
+ ...Money
235
+ }
236
+ createdAt
237
+ updatedAt
238
+ }
239
+
240
+ fragment Order on Order {
241
+ id
242
+ orderNumber
243
+ totalPrice {
244
+ ...Money
245
+ }
246
+ subtotalPrice {
247
+ ...Money
248
+ }
249
+ totalTax {
250
+ ...Money
251
+ }
252
+ totalShipping {
253
+ ...Money
254
+ }
255
+ financialStatus
256
+ fulfillmentStatus
257
+ processedAt
258
+ shippingAddress {
259
+ ...MailingAddress
260
+ }
261
+ lineItemsCount
262
+ }
263
+
264
+ # Order with shipments for tracking pages
265
+ fragment OrderWithShipments on Order {
266
+ id
267
+ orderNumber
268
+ totalPrice {
269
+ ...Money
270
+ }
271
+ subtotalPrice {
272
+ ...Money
273
+ }
274
+ totalTax {
275
+ ...Money
276
+ }
277
+ totalShipping {
278
+ ...Money
279
+ }
280
+ financialStatus
281
+ fulfillmentStatus
282
+ processedAt
283
+ shippingAddress {
284
+ ...MailingAddress
285
+ }
286
+ lineItemsCount
287
+ shipments {
288
+ ...Shipment
289
+ }
290
+ }
291
+
292
+ # ============================================
293
+ # Cart Fragments
294
+ # ============================================
295
+
296
+ fragment CartCost on CartCost {
297
+ totalAmount {
298
+ ...PriceMoney
299
+ }
300
+ subtotalAmount {
301
+ ...PriceMoney
302
+ }
303
+ totalTaxAmount {
304
+ ...PriceMoney
305
+ }
306
+ totalDutyAmount {
307
+ ...PriceMoney
308
+ }
309
+ }
310
+
311
+ fragment CartLineCost on CartLineCost {
312
+ amountPerQuantity {
313
+ ...PriceMoney
314
+ }
315
+ subtotalAmount {
316
+ ...PriceMoney
317
+ }
318
+ totalAmount {
319
+ ...PriceMoney
320
+ }
321
+ compareAtAmountPerQuantity {
322
+ ...PriceMoney
323
+ }
324
+ }
325
+
326
+ fragment CartLine on CartLine {
327
+ id
328
+ quantity
329
+ merchandise {
330
+ ...ProductVariant
331
+ }
332
+ cost {
333
+ ...CartLineCost
334
+ }
335
+ attributes {
336
+ key
337
+ value
338
+ }
339
+ productId
340
+ productTitle
341
+ productHandle
342
+ productType
343
+ }
344
+
345
+ fragment CartBuyerIdentity on CartBuyerIdentity {
346
+ email
347
+ phone
348
+ countryCode
349
+ }
350
+
351
+ fragment CartDiscountCode on CartDiscountCode {
352
+ code
353
+ applicable
354
+ }
355
+
356
+ fragment CartDiscountAllocation on CartDiscountAllocation {
357
+ discountCode
358
+ amount {
359
+ ...Money
360
+ }
361
+ }
362
+
363
+ fragment Cart on Cart {
364
+ id
365
+ checkoutUrl
366
+ totalQuantity
367
+ cost {
368
+ ...CartCost
369
+ }
370
+ lines(first: 100) {
371
+ ...CartLine
372
+ }
373
+ buyerIdentity {
374
+ ...CartBuyerIdentity
375
+ }
376
+ discountCodes {
377
+ ...CartDiscountCode
378
+ }
379
+ discountAllocations {
380
+ ...CartDiscountAllocation
381
+ }
382
+ note
383
+ attributes {
384
+ key
385
+ value
386
+ }
387
+ createdAt
388
+ updatedAt
389
+ }
390
+
391
+ # ============================================
392
+ # Shop Fragments
393
+ # ============================================
394
+
395
+ fragment ShopColors on ShopColors {
396
+ primary
397
+ secondary
398
+ accent
399
+ background
400
+ text
401
+ }
402
+
403
+ fragment ShopFonts on ShopFonts {
404
+ primary
405
+ heading
406
+ }
407
+
408
+ fragment SocialLinks on SocialLinks {
409
+ facebook
410
+ instagram
411
+ twitter
412
+ youtube
413
+ tiktok
414
+ linkedin
415
+ pinterest
416
+ }
417
+
418
+ fragment ShopAddress on ShopAddress {
419
+ address1
420
+ address2
421
+ city
422
+ state
423
+ postalCode
424
+ country
425
+ }
426
+
427
+ fragment BusinessHour on BusinessHour {
428
+ day
429
+ openTime
430
+ closeTime
431
+ isClosed
432
+ }
433
+
434
+ fragment ShopBranding on ShopBranding {
435
+ logo {
436
+ ...Image
437
+ }
438
+ favicon {
439
+ ...Image
440
+ }
441
+ colors {
442
+ ...ShopColors
443
+ }
444
+ fonts {
445
+ ...ShopFonts
446
+ }
447
+ socialLinks {
448
+ ...SocialLinks
449
+ }
450
+ }
451
+
452
+ fragment Shop on Shop {
453
+ id
454
+ name
455
+ description
456
+ primaryDomain
457
+ currencyCode
458
+ supportedCurrencies
459
+ paymentCurrencies
460
+ logo {
461
+ ...Image
462
+ }
463
+ contactEmail
464
+ contactPhone
465
+ address {
466
+ ...ShopAddress
467
+ }
468
+ businessHours {
469
+ ...BusinessHour
470
+ }
471
+ branding {
472
+ ...ShopBranding
473
+ }
474
+ }
475
+
476
+ # ============================================
477
+ # Payment Method Fragments (R23 - Payment Methods)
478
+ # ============================================
479
+
480
+ fragment PaymentMethod on PaymentMethod {
481
+ id
482
+ name
483
+ provider
484
+ type
485
+ icon
486
+ description
487
+ isDefault
488
+ supportedCurrencies
489
+ position
490
+ }
491
+
492
+ fragment AvailablePaymentMethods on AvailablePaymentMethods {
493
+ methods {
494
+ ...PaymentMethod
495
+ }
496
+ defaultMethod {
497
+ ...PaymentMethod
498
+ }
499
+ }
500
+
501
+ # ============================================
502
+ # Checkout Fragments
503
+ # ============================================
504
+
505
+ fragment CheckoutUserError on CheckoutUserError {
506
+ field
507
+ message
508
+ code
509
+ }
510
+
511
+ fragment ShippingRate on ShippingRate {
512
+ handle
513
+ title
514
+ price {
515
+ ...Money
516
+ }
517
+ }
518
+
519
+ fragment TaxLine on TaxLine {
520
+ title
521
+ rate
522
+ price {
523
+ ...Money
524
+ }
525
+ }
526
+
527
+ fragment DiscountAffectedItem on DiscountAffectedItem {
528
+ productId
529
+ variantId
530
+ title
531
+ quantity
532
+ originalPrice {
533
+ ...Money
534
+ }
535
+ discountedPrice {
536
+ ...Money
537
+ }
538
+ savings {
539
+ ...Money
540
+ }
541
+ isFreeItem
542
+ }
543
+
544
+ fragment DiscountApplication on DiscountApplication {
545
+ code
546
+ applicable
547
+ type
548
+ value {
549
+ ...Money
550
+ }
551
+ title
552
+ # BXGY (Buy X Get Y) specific fields
553
+ affectedItems {
554
+ ...DiscountAffectedItem
555
+ }
556
+ buyQuantity
557
+ getQuantity
558
+ getDiscountPercent
559
+ }
560
+
561
+ fragment DiscountCode on DiscountCode {
562
+ code
563
+ applicable
564
+ }
565
+
566
+ fragment CheckoutLineItem on CheckoutLineItem {
567
+ id
568
+ title
569
+ variantTitle
570
+ quantity
571
+ unitPrice {
572
+ ...Money
573
+ }
574
+ totalPrice {
575
+ ...Money
576
+ }
577
+ variantId
578
+ productId
579
+ sku
580
+ }
581
+
582
+ # GAP-001: Gift Card Checkout Integration
583
+ fragment AppliedGiftCard on AppliedGiftCard {
584
+ maskedCode
585
+ lastCharacters
586
+ appliedAmount {
587
+ ...Money
588
+ }
589
+ remainingBalance {
590
+ ...Money
591
+ }
592
+ }
593
+
594
+ fragment Checkout on Checkout {
595
+ id
596
+ ready
597
+ completed
598
+ completedOrderId
599
+ webUrl
600
+ lineItems {
601
+ ...CheckoutLineItem
602
+ }
603
+ totalQuantity
604
+ shippingAddress {
605
+ ...MailingAddress
606
+ }
607
+ billingAddress {
608
+ ...MailingAddress
609
+ }
610
+ shippingLine {
611
+ ...ShippingRate
612
+ }
613
+ availableShippingRates {
614
+ ...ShippingRate
615
+ }
616
+ shippingRatesReady
617
+ email
618
+ phone
619
+ customerId
620
+ discountCodes {
621
+ ...DiscountCode
622
+ }
623
+ discountApplications {
624
+ ...DiscountApplication
625
+ }
626
+ availablePaymentMethods {
627
+ ...PaymentMethod
628
+ }
629
+ selectedPaymentMethodId
630
+ subtotalPrice {
631
+ ...Money
632
+ }
633
+ totalShippingPrice {
634
+ ...Money
635
+ }
636
+ totalTax {
637
+ ...Money
638
+ }
639
+ taxLines {
640
+ ...TaxLine
641
+ }
642
+ totalDiscounts {
643
+ ...Money
644
+ }
645
+ totalPrice {
646
+ ...Money
647
+ }
648
+ # GAP-001: Gift Card Checkout Integration
649
+ appliedGiftCards {
650
+ ...AppliedGiftCard
651
+ }
652
+ totalGiftCardAmount {
653
+ ...Money
654
+ }
655
+ paymentDue {
656
+ ...Money
657
+ }
658
+ currencyCode
659
+ note
660
+ createdAt
661
+ updatedAt
662
+ }
663
+
664
+ # ============================================
665
+ # Shipment Fragments (R29 - Shipment Tracking)
666
+ # ============================================
667
+
668
+ fragment ShipmentEvent on ShipmentEvent {
669
+ id
670
+ status
671
+ description
672
+ location
673
+ occurredAt
674
+ providerEventCode
675
+ }
676
+
677
+ fragment ShipmentPackage on ShipmentPackage {
678
+ weight
679
+ length
680
+ width
681
+ height
682
+ }
683
+
684
+ fragment ShipmentItem on ShipmentItem {
685
+ id
686
+ title
687
+ variantTitle
688
+ sku
689
+ quantity
690
+ imageUrl
691
+ }
692
+
693
+ fragment Shipment on Shipment {
694
+ id
695
+ orderId
696
+ provider
697
+ serviceCode
698
+ trackingNumber
699
+ trackingUrl
700
+ labelUrl
701
+ status
702
+ estimatedDeliveryDate
703
+ shippedAt
704
+ deliveredAt
705
+ recipientAddress {
706
+ ...MailingAddress
707
+ }
708
+ packages {
709
+ ...ShipmentPackage
710
+ }
711
+ items {
712
+ ...ShipmentItem
713
+ }
714
+ events {
715
+ ...ShipmentEvent
716
+ }
717
+ createdAt
718
+ updatedAt
719
+ }
720
+
721
+ fragment ShipmentBasic on Shipment {
722
+ id
723
+ orderId
724
+ provider
725
+ trackingNumber
726
+ trackingUrl
727
+ status
728
+ estimatedDeliveryDate
729
+ shippedAt
730
+ deliveredAt
731
+ createdAt
732
+ }
733
+
734
+ # ============================================
735
+ # Return Fragments (R30 - Returns/RMA)
736
+ # ============================================
737
+
738
+ fragment ReturnShippingLabel on ReturnShippingLabel {
739
+ url
740
+ carrier
741
+ trackingNumber
742
+ expiresAt
743
+ }
744
+
745
+ fragment ReturnItemPhoto on ReturnItemPhoto {
746
+ id
747
+ url
748
+ alt
749
+ description
750
+ createdAt
751
+ }
752
+
753
+ fragment ReturnItem on ReturnItem {
754
+ id
755
+ variantId
756
+ productTitle
757
+ variantTitle
758
+ sku
759
+ imageUrl
760
+ quantity
761
+ reason
762
+ condition
763
+ unitPrice {
764
+ ...Money
765
+ }
766
+ photos {
767
+ ...ReturnItemPhoto
768
+ }
769
+ status
770
+ approvedQuantity
771
+ }
772
+
773
+ fragment Return on Return {
774
+ id
775
+ returnNumber
776
+ orderId
777
+ orderNumber
778
+ status
779
+ reason
780
+ customerNote
781
+ compensationType
782
+ items {
783
+ ...ReturnItem
784
+ }
785
+ refundAmount {
786
+ ...Money
787
+ }
788
+ shippingLabel {
789
+ ...ReturnShippingLabel
790
+ }
791
+ requestedAt
792
+ approvedAt
793
+ receivedAt
794
+ refundedAt
795
+ completedAt
796
+ createdAt
797
+ updatedAt
798
+ }
799
+
800
+ fragment ReturnBasic on Return {
801
+ id
802
+ returnNumber
803
+ orderId
804
+ orderNumber
805
+ status
806
+ reason
807
+ createdAt
808
+ updatedAt
809
+ }
810
+
811
+ fragment ReturnReasonOption on ReturnReasonOption {
812
+ value
813
+ label
814
+ description
815
+ }
816
+
817
+ # ============================================
818
+ # Gift Card Fragments (R32 - Gift Cards)
819
+ # ============================================
820
+
821
+ fragment GiftCardTransaction on GiftCardTransaction {
822
+ id
823
+ type
824
+ amount {
825
+ ...Money
826
+ }
827
+ balanceAfter {
828
+ ...Money
829
+ }
830
+ orderId
831
+ createdAt
832
+ }
833
+
834
+ fragment GiftCard on GiftCard {
835
+ id
836
+ maskedCode
837
+ lastCharacters
838
+ status
839
+ initialAmount {
840
+ ...Money
841
+ }
842
+ balance {
843
+ ...Money
844
+ }
845
+ expiresAt
846
+ recipientName
847
+ message
848
+ transactions {
849
+ ...GiftCardTransaction
850
+ }
851
+ createdAt
852
+ }
853
+
854
+ fragment GiftCardError on GiftCardError {
855
+ code
856
+ message
857
+ }
858
+
859
+ fragment GiftCardValidation on GiftCardValidation {
860
+ valid
861
+ availableBalance {
862
+ ...Money
863
+ }
864
+ error {
865
+ ...GiftCardError
866
+ }
867
+ giftCard {
868
+ ...GiftCard
869
+ }
870
+ }
871
+
872
+ # ============================================
873
+ # Shipping Method Fragments (R33 - Shipping Methods)
874
+ # ============================================
875
+
876
+ fragment ShippingCarrier on ShippingCarrier {
877
+ id
878
+ name
879
+ logoUrl
880
+ serviceCode
881
+ }
882
+
883
+ fragment DeliveryEstimate on DeliveryEstimate {
884
+ minDays
885
+ maxDays
886
+ description
887
+ }
888
+
889
+ fragment FreeShippingProgress on FreeShippingProgress {
890
+ qualifies
891
+ currentAmount {
892
+ ...Money
893
+ }
894
+ threshold {
895
+ ...Money
896
+ }
897
+ remaining {
898
+ ...Money
899
+ }
900
+ progressPercent
901
+ message
902
+ }
903
+
904
+ fragment AvailableShippingMethod on AvailableShippingMethod {
905
+ id
906
+ name
907
+ description
908
+ carrier {
909
+ ...ShippingCarrier
910
+ }
911
+ price {
912
+ ...Money
913
+ }
914
+ isFree
915
+ estimatedDelivery {
916
+ ...DeliveryEstimate
917
+ }
918
+ freeShippingProgress {
919
+ ...FreeShippingProgress
920
+ }
921
+ sortOrder
922
+ }
923
+
924
+ # ============================================
925
+ # Attribute Filter Fragments (R35 - Dynamic Attributes)
926
+ # ============================================
927
+
928
+ fragment AttributeSwatch on AttributeSwatch {
929
+ colorHex
930
+ imageUrl
931
+ }
932
+
933
+ fragment AttributeRangeBounds on AttributeRangeBounds {
934
+ min
935
+ max
936
+ currencyCode
937
+ }
938
+
939
+ fragment AttributeFilterValue on AttributeFilterValue {
940
+ id
941
+ value
942
+ label
943
+ productCount
944
+ swatch {
945
+ ...AttributeSwatch
946
+ }
947
+ priceModifier {
948
+ ...Money
949
+ }
950
+ sortOrder
951
+ }
952
+
953
+ fragment AttributeDefinition on AttributeDefinition {
954
+ id
955
+ name
956
+ handle
957
+ type
958
+ isFilterable
959
+ isVisible
960
+ displayOrder
961
+ filterValues {
962
+ ...AttributeFilterValue
963
+ }
964
+ rangeBounds {
965
+ ...AttributeRangeBounds
966
+ }
967
+ }
968
+
969
+ fragment PriceRangeFilter on PriceRange {
970
+ min {
971
+ ...Money
972
+ }
973
+ max {
974
+ ...Money
975
+ }
976
+ }
977
+
978
+ fragment CategoryFilterOption on CategoryFilterOption {
979
+ id
980
+ name
981
+ slug
982
+ productCount
983
+ level
984
+ parentId
985
+ }
986
+
987
+ fragment AvailableFilters on AvailableFilters {
988
+ attributes {
989
+ ...AttributeDefinition
990
+ }
991
+ priceRange {
992
+ ...PriceRangeFilter
993
+ }
994
+ categories {
995
+ ...CategoryFilterOption
996
+ }
997
+ activeFilterCount
998
+ totalProducts
999
+ }
1000
+
1001
+ # ============================================
1002
+ # Loyalty Program Fragments
1003
+ # ============================================
1004
+
1005
+ fragment LoyaltyPageInfo on LoyaltyPageInfo {
1006
+ hasNextPage
1007
+ hasPreviousPage
1008
+ startCursor
1009
+ endCursor
1010
+ }
1011
+
1012
+ fragment LoyaltyTier on LoyaltyTier {
1013
+ id
1014
+ name
1015
+ type
1016
+ minPoints
1017
+ minAnnualSpend {
1018
+ ...Money
1019
+ }
1020
+ pointsMultiplier
1021
+ customBenefits {
1022
+ name
1023
+ description
1024
+ icon
1025
+ }
1026
+ }
1027
+
1028
+ fragment LoyaltyPointsSummary on LoyaltyPointsSummary {
1029
+ totalPoints
1030
+ currentPoints
1031
+ pendingPoints
1032
+ redeemedPoints
1033
+ expiredPoints
1034
+ expiringPoints
1035
+ nextExpiryDate
1036
+ }
1037
+
1038
+ fragment TierProgress on TierProgress {
1039
+ currentTier {
1040
+ ...LoyaltyTier
1041
+ }
1042
+ nextTier {
1043
+ ...LoyaltyTier
1044
+ }
1045
+ pointsToNextTier
1046
+ progressPercent
1047
+ spendToNextTier {
1048
+ ...Money
1049
+ }
1050
+ }
1051
+
1052
+ fragment LoyaltyMember on LoyaltyMember {
1053
+ id
1054
+ customerId
1055
+ points {
1056
+ ...LoyaltyPointsSummary
1057
+ }
1058
+ tier {
1059
+ ...LoyaltyTier
1060
+ }
1061
+ tierProgress {
1062
+ ...TierProgress
1063
+ }
1064
+ annualSpend {
1065
+ ...Money
1066
+ }
1067
+ lastActivityAt
1068
+ enrolledAt
1069
+ }
1070
+
1071
+ fragment LoyaltyTransaction on LoyaltyTransaction {
1072
+ id
1073
+ type
1074
+ points
1075
+ balanceAfter
1076
+ orderId
1077
+ description
1078
+ expiresAt
1079
+ createdAt
1080
+ }
1081
+
1082
+ fragment LoyaltyReward on LoyaltyReward {
1083
+ id
1084
+ name
1085
+ slug
1086
+ type
1087
+ pointsCost
1088
+ discountPercent
1089
+ discountAmount {
1090
+ ...Money
1091
+ }
1092
+ description
1093
+ image {
1094
+ ...Image
1095
+ }
1096
+ available
1097
+ tierRequired {
1098
+ ...LoyaltyTier
1099
+ }
1100
+ remainingRedemptions
1101
+ }
1102
+
1103
+ fragment PointsEstimate on PointsEstimate {
1104
+ basePoints
1105
+ bonusPoints
1106
+ totalPoints
1107
+ multiplier
1108
+ }
1109
+
1110
+ fragment LoyaltyAction on LoyaltyAction {
1111
+ type
1112
+ enabled
1113
+ points
1114
+ }
1115
+
1116
+ fragment LoyaltySettings on LoyaltySettings {
1117
+ enabled
1118
+ pointsName
1119
+ pointsPerCurrency
1120
+ pointsExpiryMonths
1121
+ availableActions {
1122
+ ...LoyaltyAction
1123
+ }
1124
+ referralEnabled
1125
+ referralPoints
1126
+ referralBonusPoints
1127
+ }
1128
+
1129
+ fragment ReferralStats on ReferralStats {
1130
+ referralCode
1131
+ shareUrl
1132
+ totalReferred
1133
+ completedReferrals
1134
+ pendingReferrals
1135
+ totalPointsEarned
1136
+ }
1137
+
1138
+ # GAP-003: PRODUCT and GIFT_CARD Reward Types
1139
+ fragment RedeemRewardPayload on RedeemRewardPayload {
1140
+ success
1141
+ discountCode
1142
+ productDiscountCode
1143
+ giftCardCode
1144
+ userErrors
1145
+ }
1146
+
1147
+ fragment GenerateReferralCodePayload on GenerateReferralCodePayload {
1148
+ success
1149
+ referralCode
1150
+ shareUrl
1151
+ userErrors
1152
+ }