PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.10.1
GiveWP – Donation Plugin and Fundraising Platform v4.10.1
4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 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 10 months ago styles.module.scss 11 months ago
index.tsx
127 lines
1 import {Header, OverviewPanel, SummaryItem, SummaryTable} from '@givewp/admin/components';
2 import {amountFormatter} from '@givewp/src/Admin/utils';
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.10.0 removed donation from props
82 * @since 4.8.0
83 */
84 export default function Summary({subscription, adminUrl, intendedAmount, isLoading}: SummaryProps) {
85 const {form} = getSubscriptionEmbeds(subscription);
86 const formTitle = form?.title ?? __('Donation Form', 'give');
87 const endDate = calculateEndDate(subscription);
88
89 const summaryItems: SummaryItem[] = [
90 {
91 label: __('Start date', 'give'),
92 value: dateI18n('jS M, Y', subscription?.createdAt, undefined),
93 },
94 {
95 label: __('End date', 'give'),
96 value: endDate ? dateI18n('jS M, Y', endDate, undefined) : __('Ongoing', 'give'),
97 },
98 {
99 label: __('Donation form', 'give'),
100 value: subscription?.donationFormId ? (
101 <a
102 className={styles.link}
103 href={`${adminUrl}edit.php?post_type=give_forms&page=givewp-form-builder&donationFormID=${subscription?.donationFormId}`}
104 target="_blank"
105 rel="noopener noreferrer"
106 >
107 {formTitle}
108 </a>
109 ) : '',
110 },
111 {
112 label: __('Renewal', 'give'),
113 value: amountFormatter(subscription?.amount?.currency).format(intendedAmount),
114 },
115 ];
116
117 return (
118 <OverviewPanel className={styles.summaryPanel}>
119 <Header
120 title={__('Summary', 'give')}
121 subtitle={__('Information about the initial recurring donation', 'give')}
122 />
123 <SummaryTable data={summaryItems} isLoading={isLoading} />
124 </OverviewPanel>
125 );
126 }
127