@carlonicora/nextjs-jsonapi 6.10.0 → 6.10.1

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/messages/en.json CHANGED
@@ -782,7 +782,7 @@
782
782
  },
783
783
  "proration": {
784
784
  "net_due_today": "Net Due Today",
785
- "next_invoice": "Next invoice on {date} for {amount}",
785
+ "next_invoice": "Charged today: {amount}",
786
786
  "title": "Proration Breakdown"
787
787
  },
788
788
  "subscription": {
@@ -859,6 +859,7 @@
859
859
  "amount_off": "{amount} off",
860
860
  "card_on_file": "{brand} ending in {last4}",
861
861
  "charge_now": "Amount to charge now:",
862
+ "credit_now": "Credit to your account:",
862
863
  "confirm_change": "Confirm Plan Change",
863
864
  "due_now": "Amount due now:",
864
865
  "interval_monthly": "monthly",
@@ -870,7 +871,8 @@
870
871
  "percent_off": "{value}% off",
871
872
  "processing": "Processing...",
872
873
  "promotion_code": "Promotion Code",
873
- "proration_description": "Your next charge will be adjusted to account for the plan change.",
874
+ "proration_credit_description": "The unused time becomes account credit, used on your next invoices.",
875
+ "proration_description": "The difference is charged today on a new invoice.",
874
876
  "proration_summary": "Proration Summary",
875
877
  "selected_plan": "Selected Plan",
876
878
  "subscribe_now": "Subscribe Now",
package/messages/it.json CHANGED
@@ -782,7 +782,7 @@
782
782
  },
783
783
  "proration": {
784
784
  "net_due_today": "Netto dovuto oggi",
785
- "next_invoice": "Prossima fattura il {date} di {amount}",
785
+ "next_invoice": "Addebito oggi: {amount}",
786
786
  "title": "Dettaglio del conguaglio"
787
787
  },
788
788
  "subscription": {
@@ -859,6 +859,7 @@
859
859
  "amount_off": "{amount} di sconto",
860
860
  "card_on_file": "{brand} che termina con {last4}",
861
861
  "charge_now": "Importo da addebitare ora:",
862
+ "credit_now": "Credito sul tuo account:",
862
863
  "confirm_change": "Conferma il cambio di piano",
863
864
  "due_now": "Importo dovuto ora:",
864
865
  "interval_monthly": "mensile",
@@ -870,7 +871,8 @@
870
871
  "percent_off": "{value}% di sconto",
871
872
  "processing": "Elaborazione...",
872
873
  "promotion_code": "Codice promozionale",
873
- "proration_description": "Il tuo prossimo addebito verrà adeguato per tenere conto del cambio di piano.",
874
+ "proration_credit_description": "Il tempo non usato diventa credito sul tuo account, usato nelle prossime fatture.",
875
+ "proration_description": "La differenza viene addebitata oggi con una nuova fattura.",
874
876
  "proration_summary": "Riepilogo del conguaglio",
875
877
  "selected_plan": "Piano selezionato",
876
878
  "subscribe_now": "Abbonati ora",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "6.10.0",
3
+ "version": "6.10.1",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -375,6 +375,7 @@ export const BILLING_UI_I18N_KEYS = [
375
375
  "billing.ui.wizard.review.amount_off",
376
376
  "billing.ui.wizard.review.card_on_file",
377
377
  "billing.ui.wizard.review.charge_now",
378
+ "billing.ui.wizard.review.credit_now",
378
379
  "billing.ui.wizard.review.confirm_change",
379
380
  "billing.ui.wizard.review.discount_carries_over",
380
381
  "billing.ui.wizard.review.due_now",
@@ -387,6 +388,7 @@ export const BILLING_UI_I18N_KEYS = [
387
388
  "billing.ui.wizard.review.percent_off",
388
389
  "billing.ui.wizard.review.processing",
389
390
  "billing.ui.wizard.review.promotion_code",
391
+ "billing.ui.wizard.review.proration_credit_description",
390
392
  "billing.ui.wizard.review.proration_description",
391
393
  "billing.ui.wizard.review.proration_summary",
392
394
  "billing.ui.wizard.review.selected_plan",
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useTranslations } from "next-intl";
4
4
  import { ProrationPreviewInterface } from "../../../stripe-invoice/data/stripe-invoice.interface";
5
- import { formatCurrency, formatDate, useBillingFormatOptions } from "../../../components/utils";
5
+ import { formatCurrency, useBillingFormatOptions } from "../../../components/utils";
6
6
 
7
7
  type ProrationPreviewProps = {
8
8
  preview: ProrationPreviewInterface;
@@ -35,7 +35,6 @@ export function ProrationPreview({ preview }: ProrationPreviewProps) {
35
35
  {preview.lineItems.length > 0 && preview.lineItems[0].period && (
36
36
  <div className="text-muted-foreground mt-2 text-xs">
37
37
  {t("billing.ui.proration.next_invoice", {
38
- date: formatDate(preview.lineItems[0].period.end, fmt),
39
38
  amount: formatCurrency(preview.amountDue, preview.currency, fmt),
40
39
  })}
41
40
  </div>
@@ -107,6 +107,11 @@ export function WizardStepReview({
107
107
  // Calculate discounted immediate charge for proration preview
108
108
  const discountedImmediateCharge = applyDiscount(prorationPreview?.immediateCharge, discount);
109
109
 
110
+ // A negative charge is a credit: Stripe keeps it on the account for the next invoices.
111
+ const isProrationCredit =
112
+ !isTrialUpgrade && (discountedImmediateCharge ?? prorationPreview?.immediateCharge ?? 0) < 0;
113
+ const prorationAmount = (amount: number) => (isProrationCredit ? Math.abs(amount) : amount);
114
+
110
115
  // Format the discount description
111
116
  const getDiscountDescription = (): string | null => {
112
117
  if (!discount) return null;
@@ -171,24 +176,30 @@ export function WizardStepReview({
171
176
  ? discountedImmediateCharge !== null
172
177
  ? t("billing.ui.wizard.review.trial_upgrade_description_discounted")
173
178
  : t("billing.ui.wizard.review.trial_upgrade_description")
174
- : t("billing.ui.wizard.review.proration_description")}
179
+ : isProrationCredit
180
+ ? t("billing.ui.wizard.review.proration_credit_description")
181
+ : t("billing.ui.wizard.review.proration_description")}
175
182
  </p>
176
183
  <div className="flex justify-between text-sm">
177
184
  <span className={`${isTrialUpgrade ? "text-warning" : "text-muted-foreground"}`}>
178
- {isTrialUpgrade ? t("billing.ui.wizard.review.charge_now") : t("billing.ui.wizard.review.due_now")}
185
+ {isTrialUpgrade
186
+ ? t("billing.ui.wizard.review.charge_now")
187
+ : isProrationCredit
188
+ ? t("billing.ui.wizard.review.credit_now")
189
+ : t("billing.ui.wizard.review.due_now")}
179
190
  </span>
180
191
  <span className={`font-medium ${isTrialUpgrade ? "text-warning" : "text-foreground"}`}>
181
192
  {discountedImmediateCharge !== null ? (
182
193
  <>
183
194
  <span className="line-through text-muted-foreground me-2">
184
- {formatCurrency(prorationPreview.immediateCharge, prorationPreview.currency, fmt)}
195
+ {formatCurrency(prorationAmount(prorationPreview.immediateCharge), prorationPreview.currency, fmt)}
185
196
  </span>
186
197
  <span className="text-success">
187
- {formatCurrency(discountedImmediateCharge, prorationPreview.currency, fmt)}
198
+ {formatCurrency(prorationAmount(discountedImmediateCharge), prorationPreview.currency, fmt)}
188
199
  </span>
189
200
  </>
190
201
  ) : (
191
- formatCurrency(prorationPreview.immediateCharge, prorationPreview.currency, fmt)
202
+ formatCurrency(prorationAmount(prorationPreview.immediateCharge), prorationPreview.currency, fmt)
192
203
  )}
193
204
  </span>
194
205
  </div>