PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Subscriptions / resources / admin / components / SubscriptionDetailsPage / Tabs / Overview / SubscriptionSummary / index.tsx
give / src / Subscriptions / resources / admin / components / SubscriptionDetailsPage / Tabs / Overview / SubscriptionSummary Last commit date
index.tsx 8 months ago styles.module.scss 10 months ago
index.tsx
128 lines
1 import {Header, OverviewPanel, SummaryItem, SummaryTable} from '@givewp/admin/components';
2 import {amountFormatter, formatTimestamp} from '@givewp/admin/common';
3 import {Subscription} from '@givewp/subscriptions/admin/components/types';
4 import {dateI18n} from '@wordpress/date';
5 import {__} from '@wordpress/i18n';
6 import styles from './styles.module.scss';
7 import {getSubscriptionEmbeds} from '@givewp/subscriptions/common';
8
9
10 /**
11 * Calculates the end date of a subscription based on its billing parameters.
12 *
13 * The calculation uses the formula: End Date = Start Date + (Installments - 1) × Frequency × Period
14 *
15 * For example:
16 * - A monthly subscription with 12 installments: Start Date + 11 months
17 * - A weekly subscription with 4 installments: Start Date + 3 weeks
18 * - A yearly subscription with 5 installments: Start Date + 4 years
19 *
20 * @param subscription - The subscription object containing billing parameters
21 * @returns ISO string of the calculated end date, or null if calculation is not possible
22 *
23 * @since 4.8.0
24 */
25 const calculateEndDate = (subscription: Subscription): string | null => {
26 if (!subscription) {
27 return null;
28 }
29
30 // If installments is 0, the subscription is ongoing (no end date)
31 if (subscription.installments === 0) {
32 return null;
33 }
34
35 const startDate = new Date(subscription.createdAt);
36 const period = subscription.period; // day, week, month, quarter, year
37 const frequency = subscription.frequency; // how many periods between each payment
38 const installments = subscription.installments; // total number of payments
39
40 // Calculate total periods to add: (installments - 1) × frequency
41 // We subtract 1 from installments because the first payment is on the start date
42 const totalPeriods = (installments - 1) * frequency;
43
44 const endDate = new Date(startDate);
45
46 // Add the calculated periods based on the billing period type
47 switch (period) {
48 case 'day':
49 endDate.setDate(endDate.getDate() + totalPeriods);
50 break;
51 case 'week':
52 endDate.setDate(endDate.getDate() + totalPeriods * 7);
53 break;
54 case 'month':
55 endDate.setMonth(endDate.getMonth() + totalPeriods);
56 break;
57 case 'quarter':
58 endDate.setMonth(endDate.getMonth() + totalPeriods * 3);
59 break;
60 case 'year':
61 endDate.setFullYear(endDate.getFullYear() + totalPeriods);
62 break;
63 default:
64 return null;
65 }
66
67 return endDate.toISOString();
68 };
69
70 /**
71 * @since 4.8.0
72 */
73 interface SummaryProps {
74 subscription: Subscription;
75 intendedAmount: number;
76 adminUrl: string;
77 isLoading: boolean;
78 }
79
80 /**
81 * @since 4.11.0 fix form link
82 * @since 4.10.0 removed donation from props
83 * @since 4.8.0
84 */
85 export default function Summary({subscription, adminUrl, intendedAmount, isLoading}: SummaryProps) {
86 const {form} = getSubscriptionEmbeds(subscription);
87 const formTitle = form?.title ?? __('Donation Form', 'give');
88 const endDate = calculateEndDate(subscription);
89
90 const summaryItems: SummaryItem[] = [
91 {
92 label: __('Start date', 'give'),
93 value: formatTimestamp(subscription?.createdAt, false),
94 },
95 {
96 label: __('End date', 'give'),
97 value: endDate ? formatTimestamp(endDate, false) : __('Ongoing', 'give'),
98 },
99 {
100 label: __('Donation form', 'give'),
101 value: subscription?.donationFormId ? (
102 <a
103 className={styles.link}
104 href={`${adminUrl}post.php?post=${subscription?.donationFormId}&action=edit`}
105 target="_blank"
106 rel="noopener noreferrer"
107 >
108 {formTitle}
109 </a>
110 ) : '',
111 },
112 {
113 label: __('Renewal', 'give'),
114 value: amountFormatter(subscription?.amount?.currency).format(intendedAmount),
115 },
116 ];
117
118 return (
119 <OverviewPanel className={styles.summaryPanel}>
120 <Header
121 title={__('Summary', 'give')}
122 subtitle={__('Information about the initial recurring donation', 'give')}
123 />
124 <SummaryTable data={summaryItems} isLoading={isLoading} />
125 </OverviewPanel>
126 );
127 }
128