Paid Memberships Pro - Version 1.4.6

Version Description

  • No longer trying to setup a subscription with Stripe for levels with only an Initial Payment amount.
  • Updated recaptchalib.php, which fixes issues with using recaptcha.
  • Now setting the first_name and last_name meta fields at checkout to match the business first and last name. (Previous scripts to add additional first/last names to the checkout field should override these.)
  • Updated the save profile code to only null out the expiration date for a membership if a blank expiration is explicitly passed through the form. If you had other plugins allowing users to edit their profile, etc, it might not have been passing the expiration date and thus updating users expiration dates. Admins and users would have gotten emails.
  • Some updates to applydiscountcodes.php service to support plugging into how discount codes function. Added the pmpro_discount_code_level filter to applydiscountcodes.php.
Download this release

Release Info

Developer strangerstudios
Plugin Icon 128x128 Paid Memberships Pro
Version 1.4.6
Comparing to
See all releases

Code changes from version 1.7.14 to 1.4.6

Files changed (205) hide show
  1. adminpages/addons.php +0 -142
  2. adminpages/addons/hide-admin-bar-from-non-admins.php +0 -32
  3. adminpages/addons/images/pmpro-aweber.gif +0 -0
  4. adminpages/addons/images/pmpro-bbpress.jpg +0 -0
  5. adminpages/addons/images/pmpro-constant-contact.gif +0 -0
  6. adminpages/addons/images/pmpro-email-templates.gif +0 -0
  7. adminpages/addons/images/pmpro-infusionsoft.jpg +0 -0
  8. adminpages/addons/images/pmpro-mailchimp.jpg +0 -0
  9. adminpages/addons/images/pmpro-network.gif +0 -0
  10. adminpages/addons/images/pmpro-post-affiliate-pro.jpg +0 -0
  11. adminpages/addons/images/pmpro-register-helper.gif +0 -0
  12. adminpages/addons/images/pmpro-series.gif +0 -0
  13. adminpages/addons/images/pmpro-woocommerce.gif +0 -0
  14. adminpages/addons/images/pmpro-wp-affiliate-platform.jpg +0 -0
  15. adminpages/addons/images/wp-bouncer.gif +0 -0
  16. adminpages/addons/pmpro-addon-packages.php +0 -30
  17. adminpages/addons/pmpro-affiliates.php +0 -30
  18. adminpages/addons/pmpro-aweber.php +0 -31
  19. adminpages/addons/pmpro-bbpress.php +0 -31
  20. adminpages/addons/pmpro-constant-contact.php +0 -31
  21. adminpages/addons/pmpro-disable-emails.php +0 -28
  22. adminpages/addons/pmpro-email-templates.php +0 -31
  23. adminpages/addons/pmpro-expiration.php +0 -30
  24. adminpages/addons/pmpro-freeaddress.php +0 -30
  25. adminpages/addons/pmpro-infusionsoft.php +0 -31
  26. adminpages/addons/pmpro-international-addresses.php +0 -31
  27. adminpages/addons/pmpro-level-cost-text.php +0 -30
  28. adminpages/addons/pmpro-mailchimp.php +0 -31
  29. adminpages/addons/pmpro-network-subsite.php +0 -31
  30. adminpages/addons/pmpro-network.php +0 -31
  31. adminpages/addons/pmpro-post-affiliate-pro.php +0 -31
  32. adminpages/addons/pmpro-register-helper.php +0 -31
  33. adminpages/addons/pmpro-require-code-to-register.php +0 -28
  34. adminpages/addons/pmpro-series.php +0 -31
  35. adminpages/addons/pmpro-shipping.php +0 -31
  36. adminpages/addons/pmpro-user-pages.php +0 -30
  37. adminpages/addons/pmpro-woocommerce.php +0 -31
  38. adminpages/addons/pmpro-wp-affiliate.php +0 -31
  39. adminpages/addons/tml.php +0 -32
  40. adminpages/addons/wp-bouncer.php +0 -31
  41. adminpages/admin_footer.php +0 -1
  42. adminpages/admin_header.php +22 -92
  43. adminpages/advancedsettings.php +37 -127
  44. adminpages/dashboard.php +4 -4
  45. adminpages/discountcodes.php +640 -636
  46. adminpages/emailsettings.php +126 -181
  47. adminpages/functions.php +0 -222
  48. adminpages/membershiplevels.php +555 -588
  49. adminpages/memberslist-csv.php +62 -188
  50. adminpages/memberslist.php +177 -238
  51. adminpages/orders-csv.php +0 -297
  52. adminpages/orders.php +0 -996
  53. adminpages/pagesettings.php +27 -75
  54. adminpages/paymentsettings.php +323 -538
  55. adminpages/reports.php +0 -62
  56. adminpages/reports/login.php +0 -412
  57. adminpages/reports/memberships.php +0 -651
  58. adminpages/reports/sales.php +0 -397
  59. classes/class.memberorder.php +60 -241
  60. classes/class.pmproemail.php +86 -276
  61. classes/gateways/class.pmprogateway.php +8 -27
  62. classes/gateways/class.pmprogateway_authorizenet.php +27 -35
  63. classes/gateways/class.pmprogateway_braintree.php +0 -422
  64. classes/gateways/class.pmprogateway_check.php +0 -208
  65. classes/gateways/class.pmprogateway_cybersource.php +0 -765
  66. classes/gateways/class.pmprogateway_payflowpro.php +0 -448
  67. classes/gateways/class.pmprogateway_paypal.php +42 -45
  68. classes/gateways/class.pmprogateway_paypalexpress.php +35 -86
  69. classes/gateways/class.pmprogateway_paypalstandard.php +0 -302
  70. classes/gateways/class.pmprogateway_stripe.php +32 -123
  71. classes/gateways/class.pmprogateway_twocheckout.php +0 -145
  72. css/admin-rtl.css +0 -63
  73. css/admin.css +61 -97
  74. css/frontend-rtl.css +0 -111
  75. css/frontend.css +99 -173
  76. email/admin_change.html +1 -1
  77. email/billing.html +4 -1
  78. email/billing_admin.html +1 -1
  79. email/billing_failure.html +5 -1
  80. email/billing_failure_admin.html +5 -1
  81. email/cancel.html +1 -1
  82. email/cancel_admin.html +1 -3
  83. email/checkout_check.html +0 -17
  84. email/checkout_check_admin.html +0 -17
  85. email/checkout_express.html +2 -2
  86. email/checkout_express_admin.html +2 -2
  87. email/checkout_freetrial.html +4 -1
  88. email/checkout_freetrial_admin.html +4 -1
  89. email/checkout_paid.html +4 -1
  90. email/checkout_paid_admin.html +4 -1
  91. email/checkout_trial.html +4 -1
  92. email/checkout_trial_admin.html +4 -1
  93. email/credit_card_expiring.html +0 -13
  94. email/invoice.html +5 -2
  95. images/Paid-Memberships-Pro.png +0 -0
  96. images/Paid-Memberships-Pro_watermark.png +0 -0
  97. images/bg_grad-chrome.gif +0 -0
  98. images/bg_grad-grey.gif +0 -0
  99. images/icon-pmproadmin16-sprite.png +0 -0
  100. images/icon-pmproadmin16-sprite_2x.png +0 -0
  101. images/icon-pmproadmin32.png +0 -0
  102. images/icon-pmproadmin32_2x.png +0 -0
  103. includes/adminpages.php +0 -226
  104. includes/cleanup.php +0 -40
  105. includes/content.php +0 -405
  106. includes/countries.php +2 -1
  107. includes/currencies.php +1 -17
  108. includes/email.php +0 -111
  109. includes/filters.php +0 -150
  110. includes/functions.php +1122 -1742
  111. includes/https.php +0 -185
  112. includes/init.php +0 -240
  113. includes/lib/Braintree/Braintree.php +0 -172
  114. includes/lib/Braintree/Braintree/AddOn.php +0 -15
  115. includes/lib/Braintree/Braintree/Address.php +0 -352
  116. includes/lib/Braintree/Braintree/Collection.php +0 -159
  117. includes/lib/Braintree/Braintree/Configuration.php +0 -346
  118. includes/lib/Braintree/Braintree/CreditCard.php +0 -591
  119. includes/lib/Braintree/Braintree/CreditCardVerification.php +0 -41
  120. includes/lib/Braintree/Braintree/CreditCardVerificationSearch.php +0 -34
  121. includes/lib/Braintree/Braintree/Customer.php +0 -562
  122. includes/lib/Braintree/Braintree/CustomerSearch.php +0 -31
  123. includes/lib/Braintree/Braintree/Descriptor.php +0 -4
  124. includes/lib/Braintree/Braintree/Digest.php +0 -59
  125. includes/lib/Braintree/Braintree/Discount.php +0 -15
  126. includes/lib/Braintree/Braintree/EqualityNode.php +0 -10
  127. includes/lib/Braintree/Braintree/Error/Codes.php +0 -206
  128. includes/lib/Braintree/Braintree/Error/ErrorCollection.php +0 -118
  129. includes/lib/Braintree/Braintree/Error/Validation.php +0 -64
  130. includes/lib/Braintree/Braintree/Error/ValidationErrorCollection.php +0 -135
  131. includes/lib/Braintree/Braintree/Exception.php +0 -20
  132. includes/lib/Braintree/Braintree/Exception/Authentication.php +0 -21
  133. includes/lib/Braintree/Braintree/Exception/Authorization.php +0 -23
  134. includes/lib/Braintree/Braintree/Exception/Configuration.php +0 -20
  135. includes/lib/Braintree/Braintree/Exception/DownForMaintenance.php +0 -20
  136. includes/lib/Braintree/Braintree/Exception/ForgedQueryString.php +0 -23
  137. includes/lib/Braintree/Braintree/Exception/InvalidSignature.php +0 -5
  138. includes/lib/Braintree/Braintree/Exception/NotFound.php +0 -20
  139. includes/lib/Braintree/Braintree/Exception/SSLCaFileNotFound.php +0 -20
  140. includes/lib/Braintree/Braintree/Exception/SSLCertificate.php +0 -20
  141. includes/lib/Braintree/Braintree/Exception/ServerError.php +0 -20
  142. includes/lib/Braintree/Braintree/Exception/Unexpected.php +0 -21
  143. includes/lib/Braintree/Braintree/Exception/UpgradeRequired.php +0 -12
  144. includes/lib/Braintree/Braintree/Exception/ValidationsFailed.php +0 -21
  145. includes/lib/Braintree/Braintree/Http.php +0 -99
  146. includes/lib/Braintree/Braintree/Instance.php +0 -70
  147. includes/lib/Braintree/Braintree/IsNode.php +0 -22
  148. includes/lib/Braintree/Braintree/KeyValueNode.php +0 -22
  149. includes/lib/Braintree/Braintree/Modification.php +0 -23
  150. includes/lib/Braintree/Braintree/MultipleValueNode.php +0 -37
  151. includes/lib/Braintree/Braintree/MultipleValueOrTextNode.php +0 -46
  152. includes/lib/Braintree/Braintree/PartialMatchNode.php +0 -16
  153. includes/lib/Braintree/Braintree/Plan.php +0 -55
  154. includes/lib/Braintree/Braintree/RangeNode.php +0 -38
  155. includes/lib/Braintree/Braintree/ResourceCollection.php +0 -148
  156. includes/lib/Braintree/Braintree/Result/CreditCardVerification.php +0 -86
  157. includes/lib/Braintree/Braintree/Result/Error.php +0 -107
  158. includes/lib/Braintree/Braintree/Result/Successful.php +0 -78
  159. includes/lib/Braintree/Braintree/SettlementBatchSummary.php +0 -74
  160. includes/lib/Braintree/Braintree/Subscription.php +0 -256
  161. includes/lib/Braintree/Braintree/SubscriptionSearch.php +0 -64
  162. includes/lib/Braintree/Braintree/SubscriptionStatus.php +0 -0
  163. includes/lib/Braintree/Braintree/Test/CreditCardNumbers.php +0 -76
  164. includes/lib/Braintree/Braintree/Test/TransactionAmounts.php +0 -24
  165. includes/lib/Braintree/Braintree/TextNode.php +0 -10
  166. includes/lib/Braintree/Braintree/Transaction.php +0 -664
  167. includes/lib/Braintree/Braintree/Transaction/AddressDetails.php +0 -32
  168. includes/lib/Braintree/Braintree/Transaction/CreditCardDetails.php +0 -43
  169. includes/lib/Braintree/Braintree/Transaction/CustomerDetails.php +0 -29
  170. includes/lib/Braintree/Braintree/Transaction/StatusDetails.php +0 -25
  171. includes/lib/Braintree/Braintree/Transaction/SubscriptionDetails.php +0 -22
  172. includes/lib/Braintree/Braintree/TransactionSearch.php +0 -124
  173. includes/lib/Braintree/Braintree/TransparentRedirect.php +0 -327
  174. includes/lib/Braintree/Braintree/Util.php +0 -290
  175. includes/lib/Braintree/Braintree/Version.php +0 -39
  176. includes/lib/Braintree/Braintree/WebhookNotification.php +0 -66
  177. includes/lib/Braintree/Braintree/WebhookTesting.php +0 -52
  178. includes/lib/Braintree/Braintree/Xml.php +0 -43
  179. includes/lib/Braintree/Braintree/Xml/Generator.php +0 -144
  180. includes/lib/Braintree/Braintree/Xml/Parser.php +0 -179
  181. includes/lib/Braintree/ssl/sandbox_braintreegateway_com.ca.crt +0 -19
  182. includes/lib/Braintree/ssl/www_braintreegateway_com.ca.crt +0 -202
  183. includes/lib/CyberSource/cyber_source_soap_client.php +0 -87
  184. includes/lib/Stripe/Stripe.php +26 -15
  185. includes/lib/Stripe/Stripe/Account.php +0 -15
  186. includes/lib/Stripe/Stripe/ApiRequestor.php +52 -157
  187. includes/lib/Stripe/Stripe/ApiResource.php +18 -59
  188. includes/lib/Stripe/Stripe/ApplicationFee.php +0 -53
  189. includes/lib/Stripe/Stripe/AttachedObject.php +0 -23
  190. includes/lib/Stripe/Stripe/Balance.php +0 -15
  191. includes/lib/Stripe/Stripe/BalanceTransaction.php +0 -39
  192. includes/lib/Stripe/Stripe/Card.php +0 -54
  193. includes/lib/Stripe/Stripe/CardError.php +2 -4
  194. includes/lib/Stripe/Stripe/Charge.php +6 -63
  195. includes/lib/Stripe/Stripe/Coupon.php +7 -24
  196. includes/lib/Stripe/Stripe/Customer.php +6 -69
  197. includes/lib/Stripe/Stripe/Error.php +7 -9
  198. includes/lib/Stripe/Stripe/Event.php +6 -12
  199. includes/lib/Stripe/Stripe/InvalidRequestError.php +2 -4
  200. includes/lib/Stripe/Stripe/Invoice.php +2 -47
  201. includes/lib/Stripe/Stripe/InvoiceItem.php +6 -24
  202. includes/lib/Stripe/Stripe/List.php +0 -37
  203. includes/lib/Stripe/Stripe/Object.php +14 -127
  204. includes/lib/Stripe/Stripe/Plan.php +6 -26
  205. includes/lib/Stripe/Stripe/Recipient.php +0 -9
adminpages/addons.php DELETED
@@ -1,142 +0,0 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_addons")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt, $pmpro_addons;
9
-
10
- /*
11
- Addon lists
12
- */
13
- $pmpro_addon_lists = array(
14
- 'repo' => array('Plugins in the WordPress Repository', 'These official PMPro plugins are available in the WordPress repository and can be installed through Plugins --> Add New.'),
15
- 'thirdparty' => array('Third-party Integration', 'These official PMPro plugins integrate with specific third-party tools and software.'),
16
- 'recommended' => array('Recommended Plugins', 'These plugins are not developed by the PMPro team, but are recommended for sites running PMPro.'),
17
- 'github' => array('Plugins on GitHub', 'These official PMPro plugins must be downloaded from GitHub and installed through Plugins --> Add New --> Upload, then activated. These plugins cannot be automatically updated and may require more developer input.'),
18
- 'gists' => array('Code Gists', 'These are bits of code that generally must be added to your active theme\'s functions.php file or included in a custom plugin. Most gists require customization and are recommended for developers only.')
19
- );
20
-
21
- /*
22
- Function to add an addon
23
- */
24
- function pmpro_add_addon($list, $addon)
25
- {
26
- global $pmpro_addons;
27
-
28
- //make sure we have the base array
29
- if(empty($pmpro_addons))
30
- $pmpro_addons = array();
31
-
32
- //make sure we have an array for the list
33
- if(empty($pmpro_addons[$list]))
34
- $pmpro_addons[$list] = array();
35
-
36
- //add addon to list
37
- $pmpro_addons[$list][] = $addon;
38
- }
39
-
40
- /*
41
- Load All Addons
42
- */
43
- $pmpro_addons_dir = dirname(__FILE__) . "/../adminpages/addons/";
44
- $cwd = getcwd();
45
- chdir($pmpro_addons_dir);
46
- $count = 0;
47
- foreach (glob("*.php") as $filename)
48
- {
49
- $count++;
50
- require_once($filename);
51
- }
52
- chdir($cwd);
53
-
54
- require_once(dirname(__FILE__) . "/admin_header.php");
55
- ?>
56
-
57
- <h2>Add Ons</h2>
58
- <ul id="addon-filters" class="subsubsub">
59
- <li id="addon-filters-all"><a href="javascript:void(0);" class="current all tab">All</a> <span>(<?php echo $count;?>)</span></li>
60
- <?php foreach($pmpro_addon_lists as $list => $list_info) { ?>
61
- <li id="addon-filters-<?php echo $list;?>"> | <a href="javascript:void(0);>" class="tab"><?php echo $list_info[0];?></a> <span>(<?php echo count($pmpro_addons[$list]);?>)</span></li>
62
- <?php } ?>
63
- </ul>
64
-
65
- <?php foreach($pmpro_addon_lists as $list => $list_info) { ?>
66
- <div id="pmpro-<?php echo $list;?>" class="pmpro-addon-list widgets-holder-wrap">
67
-
68
- <h3 class="section-title"><?php echo $list_info[0];?></h3>
69
- <p class="description"><?php echo $list_info[1];?></p>
70
- <br class="clear" />
71
-
72
- <div id="addons-list-<?php echo $list;?>" class="addon-list">
73
-
74
- <?php foreach($pmpro_addons[$list] as $slug => $addon) { ?>
75
- <div id="addon-<?php echo $slug;?>" class="widget <?php if($addon['enabled']) echo "enabled"; else echo "disabled";?>">
76
- <div class="widget-top">
77
- <div class="widget-title">
78
- <h4>
79
- <span class="status-label"><?php if($addon['enabled']) echo __("Enabled", "pmpro"); else echo __("Disabled", "pmpro");?></span>
80
- <span class="title"><?php echo $addon['title'];?></span>
81
- <span class="version pmpro_tag-grey"><?php echo $addon['version'];?></span>
82
- <span class="in-widget-title"></span>
83
- </h4>
84
- </div> <!-- end widget-title -->
85
- </div> <!-- end widget-top -->
86
- <div class="widget-inside">
87
- <?php call_user_func($addon['widget'], $addon);?>
88
- </div> <!-- end addon-inside -->
89
- </div> <!-- end widget -->
90
- <?php } ?>
91
-
92
- <br class="clear" />
93
- </div> <!-- end addon-list -->
94
-
95
- </div> <!-- end pmpro-<?php echo $list;?> -->
96
- <?php } ?>
97
-
98
- <script>
99
- //tabs
100
- jQuery(document).ready(function() {
101
- jQuery('#addon-filters a.tab').click(function() {
102
- //which tab?
103
- var tab = jQuery(this).parent().attr('id').replace('addon-filters-', '');
104
-
105
- //un select tabs
106
- jQuery('#addon-filters a.tab').removeClass('current');
107
-
108
- //select this tab
109
- jQuery('#addon-filters-'+tab+' a').addClass('current');
110
-
111
- //show all?
112
- if(tab == 'all')
113
- jQuery('div.pmpro-addon-list').show();
114
- else
115
- {
116
- //hide all
117
- jQuery('div.pmpro-addon-list').hide();
118
-
119
- //show this one
120
- jQuery('#pmpro-'+tab).show();
121
- }
122
- });
123
- });
124
-
125
- //resize addon boxes
126
- jQuery(document).ready(function() {
127
- jQuery('.addon-list').each(function() {
128
- //what's the tallest p in the list?
129
- var tallest = 32;
130
- jQuery(this).find('div.info p').each(function() {
131
- tallest = Math.max(tallest, jQuery(this).height());
132
- });
133
-
134
- //set all p's to match
135
- jQuery(this).find('div.info p').css('height', tallest);
136
- });
137
- });
138
- </script>
139
-
140
- <?php
141
- require_once(dirname(__FILE__) . "/admin_footer.php");
142
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/hide-admin-bar-from-non-admins.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- /*
3
- Addon: Hide Admin Bar From Non-Admins
4
- Slug: hide-admin-bar-from-non-admins
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'Hide Admin Bar From Non-Admins',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_hide_admin_bar_from_non_admins_widget',
10
- 'enabled' => function_exists('habfna_disable_admin_bar')
11
- )
12
- );
13
-
14
- function pmpro_addon_hide_admin_bar_from_non_admins_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Perfect for sites where there is only one admin who needs access to the dashboard and the admin bar. When activated only administrators will see the admin bar.</p>
19
- <div class="actions">
20
- <form method="post" name="component-actions" action="">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php'), 'activate-plugin_hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=hide-admin-bar-from-non-admins'), 'install-plugin_hide-admin-bar-from-non-admins'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </form>
29
- </div>
30
- </div> <!-- end info -->
31
- <?php
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/images/pmpro-aweber.gif DELETED
Binary file
adminpages/addons/images/pmpro-bbpress.jpg DELETED
Binary file
adminpages/addons/images/pmpro-constant-contact.gif DELETED
Binary file
adminpages/addons/images/pmpro-email-templates.gif DELETED
Binary file
adminpages/addons/images/pmpro-infusionsoft.jpg DELETED
Binary file
adminpages/addons/images/pmpro-mailchimp.jpg DELETED
Binary file
adminpages/addons/images/pmpro-network.gif DELETED
Binary file
adminpages/addons/images/pmpro-post-affiliate-pro.jpg DELETED
Binary file
adminpages/addons/images/pmpro-register-helper.gif DELETED
Binary file
adminpages/addons/images/pmpro-series.gif DELETED
Binary file
adminpages/addons/images/pmpro-woocommerce.gif DELETED
Binary file
adminpages/addons/images/pmpro-wp-affiliate-platform.jpg DELETED
Binary file
adminpages/addons/images/wp-bouncer.gif DELETED
Binary file
adminpages/addons/pmpro-addon-packages.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Addon Packages
4
- Slug: pmpro-addon-packages
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Addon Packages',
8
- 'version' => '.4.3',
9
- 'widget' => 'pmpro_addon_pmpro_addon_packages_widget',
10
- 'enabled' => function_exists('pmproap_post_meta')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_addon_packages_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Sell access to individual pages or posts for a flat fee. This is a workaround if you would like to allow multiple membership levels per user.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-addon-packages/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-addon-packages/pmpro-addon-packages.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-addon-packages/pmpro-addon-packages.php'), 'activate-plugin_pmpro-addon-packages/pmpro-addon-packages.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="https://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-addon-packages.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-affiliates.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Affiliates
4
- Slug: pmpro-affiliates
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Affiliates',
8
- 'version' => '.2.4',
9
- 'widget' => 'pmpro_addon_pmpro_affiliates_widget',
10
- 'enabled' => function_exists('pmpro_affiliates_dependencies')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_affiliates_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Lightweight Affiliate system. Create affiliate accounts and codes; tracks checkouts by affiliate account.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-affiliates/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-affiliates/pmpro-affiliates.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-affiliates/pmpro-affiliates.php'), 'activate-plugin_pmpro-affiliates/pmpro-affiliates.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-affiliates.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-aweber.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro AWeber Integration
4
- Slug: pmpro-aweber
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro AWeber Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_aweber_widget',
10
- 'enabled' => function_exists('pmproaw_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_aweber_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-aweber.gif" />
18
- <div class="info">
19
- <p>Integrate User Registrations with AWeber. Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-aweber/pmpro-aweber.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-aweber/pmpro-aweber.php'), 'activate-plugin_pmpro-aweber/pmpro-aweber.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-aweber'), 'install-plugin_pmpro-aweber'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-bbpress.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro bbPress
4
- Slug: pmpro-bbpress
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'PMPro bbPress',
8
- 'version' => '1.0.1',
9
- 'widget' => 'pmpro_addon_pmpro_bbpress_widget',
10
- 'enabled' => function_exists('pmprobbp_add_meta_box')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_bbpress_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-bbpress.jpg" />
18
- <div class="info">
19
- <p>Locking down bbPress Forums by Membership Level and Forum ID.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-bbpress/pmpro-bbpress.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-bbpress/pmpro-bbpress.php'), 'activate-plugin_pmpro-bbpress/pmpro-bbpress.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-bbpress'), 'install-plugin_pmpro-bbpress'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-constant-contact.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Constant Contact Integration
4
- Slug: pmpro-constant-contact
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Constant Contact Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_constant_contact_widget',
10
- 'enabled' => function_exists('pmprocc_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_constant_contact_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-constant-contact.gif" />
18
- <div class="info">
19
- <p>Integrate User Registrations with Constant Contact . Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-constant-contact/pmpro-constant-contact.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-constant-contact/pmpro-constant-contact.php'), 'activate-plugin_pmpro-constant-contact/pmpro-constant-contact.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-constant-contact'), 'install-plugin_pmpro-constant-contact'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-disable-emails.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Disable PMPro Emails
4
- Slug: pmpro-disable-emails
5
- */
6
- pmpro_add_addon('gists', array(
7
- 'title' => 'PMPro Disable Emails',
8
- 'version' => '.1',
9
- 'widget' => 'pmpro_addon_pmpro_disable_emails_widget',
10
- 'enabled' => function_exists('dae_pmpro_email_recipient')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_disable_emails_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Disable all or specific emails sent by the PMPro plugin.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a target="_blank" href="https://gist.github.com/strangerstudios/3667545" class="button">Enabled</a>
22
- <?php } else { ?>
23
- <a target="_blank" href="https://gist.github.com/strangerstudios/3667545" class="button button-primary">View Gist</a>
24
- <?php } ?>
25
- </div>
26
- </div> <!-- end info -->
27
- <?php
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-email-templates.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Email Templates Editor
4
- Slug: pmpro-email-templates-addon
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'PMPro Email Templates',
8
- 'version' => '.5.2',
9
- 'widget' => 'pmpro_addon_email_templates_widget',
10
- 'enabled' => function_exists('pmproet_scripts')
11
- )
12
- );
13
-
14
- function pmpro_addon_email_templates_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-email-templates.gif" />
18
- <div class="info">
19
- <p>Easily edit system-generated Email Templates from the WordPress admin.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="http://wordpress.org/plugins/pmpro-email-templates-addon/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-email-templates-addon/pmpro-email-templates.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-email-templates-addon/pmpro-email-templates.php'), 'activate-plugin_pmpro-email-templates-addon/pmpro-email-templates.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-email-templates-addon'), 'install-plugin_pmpro-email-templates-addon'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-expiration.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Expiration Date
4
- Slug: pmpro-expiration
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Set Expiration Dates',
8
- 'version' => '.1.1',
9
- 'widget' => 'pmpro_addon_pmpro_expiration_widget',
10
- 'enabled' => function_exists('pmprosed_pmpro_checkout_level')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_expiration_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Set a specific expiration date (e.g. 2013-12-31) for a PMPro membership level or discount code.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-set-expiration-dates/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-set-expiration-dates/pmpro-set-expiration-dates.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-set-expiration-dates/pmpro-set-expiration-dates.php'), 'activate-plugin_pmpro-set-expiration-dates/pmpro-set-expiration-dates.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-set-expiration-dates.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-freeaddress.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Require Name and Address for Free Level
4
- Slug: pmpro-freerequire
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Require Name/Address for Free Level',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_freerequire_widget',
10
- 'enabled' => function_exists('my_pmpro_checkout_boxes_require_address')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_freerequire_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Require name/address for free Membership Level checkout.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-address-for-free-levels" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-address-for-free-levels/pmpro-address-for-free-levels.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-address-for-free-levels/pmpro-address-for-free-levels.php'), 'activate-plugin_pmpro-address-for-free-levels/pmpro-address-for-free-levels.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-address-for-free-levels.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-infusionsoft.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Infusionsoft Integration
4
- Slug: pmpro-infusionsoft
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Infusionsoft Integration',
8
- 'version' => '1.2',
9
- 'widget' => 'pmpro_addon_pmpro_infusionsoft_widget',
10
- 'enabled' => function_exists('pmprois_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_infusionsoft_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-infusionsoft.jpg" />
18
- <div class="info">
19
- <p>Integrate with Infusionsoft. Add members to email lists (groups, tags) based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-infusionsoft/pmpro-infusionsoft.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-infusionsoft/pmpro-infusionsoft.php'), 'activate-plugin_pmpro-infusionsoft/pmpro-infusionsoft.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-infusionsoft'), 'install-plugin_pmpro-infusionsoft'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-international-addresses.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro International Addresses
4
- Slug: pmpro-international-addresses
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro International Addresses',
8
- 'version' => '.2.2',
9
- 'widget' => 'pmpro_addon_pmpro_international_addresses_widget',
10
- 'enabled' => function_exists('pmproia_pmpro_international_addresses')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_international_addresses_widget($addon)
15
- {
16
- ?>
17
- <?php /* <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-international-addresses.jpg" /> */ ?>
18
- <div class="info">
19
- <p>Adds long form addresses to the PMPro checkout.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-international-addresses/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-international-addresses/pmpro-international-addresses.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-international-addresses/pmpro-international-addresses.php'), 'activate-plugin_pmpro-international-addresses/pmpro-international-addresses.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-international-addresses.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-level-cost-text.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Custom Level Cost Text
4
- Slug: pmpro-level-cost-text
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Level Cost Text',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_level_cost_text_widget',
10
- 'enabled' => function_exists('pclct_pmpro_discount_code_after_level_settings')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_level_cost_text_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Adds a "level cost text" field to PMPro Membership Levels and Discount Codes to allow you to override the automatically generated level cost text PMPro provides.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-level-cost-text/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-level-cost-text/pmpro-level-cost-text.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-level-cost-text/pmpro-level-cost-text.php'), 'activate-plugin_pmpro-level-cost-text/pmpro-level-cost-text.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-level-cost-text.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-mailchimp.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro MailChimp Integration
4
- Slug: pmpro-mailchimp
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro MailChimp Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_mailchimp_widget',
10
- 'enabled' => function_exists('pmpromc_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_mailchimp_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-mailchimp.jpg" />
18
- <div class="info">
19
- <p>Integrate User Registrations with Mailchimp. Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-mailchimp/pmpro-mailchimp.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-mailchimp/pmpro-mailchimp.php'), 'activate-plugin_pmpro-mailchimp/pmpro-mailchimp.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-mailchimp'), 'install-plugin_pmpro-mailchimp'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-network-subsite.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Network
4
- Slug: pmpro-network-subsite
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Network Subsite Helper',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_network_subsite_widget',
10
- 'enabled' => function_exists('pmpron_subsite_activated_plugin')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_network_subsite_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-network.gif" />
18
- <div class="info">
19
- <p>Have network subsites use membership data from a "main" site to handle access restrictions.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-network-subsite" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-network-subsite/pmpro-network-subsite.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-network-subsite/pmpro-network-subsite.php'), 'activate-plugin_pmpro-network-subsite/pmpro-network-subsite.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-network-subsite.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-network.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Network
4
- Slug: pmpro-network
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Network',
8
- 'version' => '.3.1',
9
- 'widget' => 'pmpro_addon_pmpro_network_widget',
10
- 'enabled' => function_exists('pmpron_new_blogs_settings')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_network_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-network.gif" />
18
- <div class="info">
19
- <p>Allow users to checkout for a membership to create a site on your WordPress multisite network.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-network/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-network/pmpro-network.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-network/pmpro-network.php'), 'activate-plugin_pmpro-network/pmpro-network.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-network.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-post-affiliate-pro.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Post Affiliate Pro Integration
4
- Slug: pmpro-post-affiliate-pro
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Post Affiliate Pro Integration',
8
- 'version' => '.2.1.1',
9
- 'widget' => 'pmpro_addon_pmpro_post_affiliate_pro_widget',
10
- 'enabled' => function_exists('pap_pmpro_track_sale')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_post_affiliate_pro_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-post-affiliate-pro.jpg" />
18
- <div class="info">
19
- <p>Integrate Paid Memberships Pro with the Post Affiliate Pro platform.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-post-affiliate-pro/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php'), 'activate-plugin_pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-post-affiliate-pro.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-register-helper.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Register Helper
4
- Slug: pmpro-register-helper
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Register Helper',
8
- 'version' => '.5.16.1',
9
- 'widget' => 'pmpro_addon_pmpro_register_helper_widget',
10
- 'enabled' => class_exists('PMProRH_Field')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_register_helper_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-register-helper.gif" />
18
- <div class="info">
19
- <p>Add additional meta fields to your PMPro checkout page and/or "Your Profile" pages. Support for text, select, multi-select, textarea, hidden, and custom HTML. Loop into existing checkout/profile field sections or add new ones.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-register-helper/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-register-helper/pmpro-register-helper.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-register-helper/pmpro-register-helper.php'), 'activate-plugin_pmpro-register-helper/pmpro-register-helper.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-register-helper.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-require-code-to-register.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Require Code to Register
4
- Slug: pmpro-require-code-to-register
5
- */
6
- pmpro_add_addon('gists', array(
7
- 'title' => 'PMPro Require a Code to Register',
8
- 'version' => '.1',
9
- 'widget' => 'pmpro_addon_pmpro_require_code_to_register_widget',
10
- 'enabled' => function_exists('my_pmpro_registration_checks_require_code_to_register')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_require_code_to_register_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Require a discount code to checkout for a specific level.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a target="_blank" href="https://gist.github.com/strangerstudios/5573829" class="button">Enabled</a>
22
- <?php } else { ?>
23
- <a target="_blank" href="https://gist.github.com/strangerstudios/5573829" class="button button-primary">View Gist</a>
24
- <?php } ?>
25
- </div>
26
- </div> <!-- end info -->
27
- <?php
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-series.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Series
4
- Slug: pmpro-series
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Series',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_series_widget',
10
- 'enabled' => class_exists("PMProSeries")
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_series_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-series.gif" />
18
- <div class="info">
19
- <p>"Drip feed" content to your members over the course of their membership. Serializes content by # of days post-registration.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("edit.php?post_type=pmpro_series");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-series/pmpro-series.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-series/pmpro-series.php'), 'activate-plugin_pmpro-series/pmpro-series.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-series.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-shipping.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Shipping Add On
4
- Slug: pmpro-shipping
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Shipping Add On',
8
- 'version' => '.2.6',
9
- 'widget' => 'pmpro_addon_pmpro_shipping_widget',
10
- 'enabled' => function_exists('pmproship_pmpro_checkout_boxes')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_shipping_widget($addon)
15
- {
16
- ?>
17
- <?php /* <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-shipping.jpg" /> */ ?>
18
- <div class="info">
19
- <p>Adds shipping fields to the checkout page, confirmation page, confirmation emails, member's list and edit user profile pages.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-shipping/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-shipping/pmpro-shipping.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-shipping/pmpro-shipping.php'), 'activate-plugin_pmpro-shipping/pmpro-shipping.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-shipping.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-user-pages.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro User Pages
4
- Slug: pmpro-user-pages
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro User Pages',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_user_pages_widget',
10
- 'enabled' => function_exists('pmproup_pmpro_after_checkout')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_user_pages_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Creates a unique page for each Member after checkout, giving the Admin access to write customized content for each specific member.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-user-pages/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-user-pages/pmpro-user-pages.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-user-pages/pmpro-user-pages.php'), 'activate-plugin_pmpro-user-pages/pmpro-user-pages.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-user-pages.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-woocommerce.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro WooCommerce
4
- Slug: pmpro-woocommerce
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro WooCommerce',
8
- 'version' => '1.2.2',
9
- 'widget' => 'pmpro_addon_pmpro_woocommerce_widget',
10
- 'enabled' => function_exists('pmprowoo_add_membership_from_order')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_woocommerce_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-woocommerce.gif" />
18
- <div class="info">
19
- <p>Use WooCommerce to purchase membership or set members-only product pricing.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-woocommerce/pmpro-woocommerce.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-woocommerce/pmpro-woocommerce.php'), 'activate-plugin_pmpro-woocommerce/pmpro-woocommerce.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-woocommerce'), 'install-plugin_pmpro-woocommerce'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-wp-affiliate.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro WP Affiliate Platform Integration
4
- Slug: pmpro-wp-affiliate
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro WP Affiliate Platform Integration',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_wp_affiliate_widget',
10
- 'enabled' => function_exists('wpa_pmpro_after_checkout')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_wp_affiliate_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-wp-affiliate-platform.jpg" />
18
- <div class="info">
19
- <p>Process an affiliate via WP Affiliate Platform after a PMPro checkout.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-wp-affiliate-platform/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php'), 'activate-plugin_pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-wp-affiliate-platform.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/tml.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- /*
3
- Addon: Theme My Login
4
- Slug: pmpro-tml
5
- */
6
- pmpro_add_addon('recommended', array(
7
- 'title' => 'Theme My Login',
8
- 'widget' => 'pmpro_addon_tml_widget',
9
- 'enabled' => class_exists('Theme_My_Login'),
10
- 'version' => '6.3.10'
11
- )
12
- );
13
-
14
- function pmpro_addon_tml_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>This plugin themes the WordPress login, registration and forgot password pages according to your current theme. By <a href="http://www.jfarthing.com/" target="_blank">Jeff Farthing</a></p>
19
- <div class="actions">
20
- <form method="post" name="component-actions" action="">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../theme-my-login/theme-my-login.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=theme-my-login/theme-my-login.php'), 'activate-plugin_theme-my-login/theme-my-login.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=theme-my-login'), 'install-plugin_theme-my-login'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </form>
29
- </div>
30
- </div> <!-- end info -->
31
- <?php
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/wp-bouncer.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: WP Bouncer
4
- Slug: wp-bouncer
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'WP Bouncer',
8
- 'version' => '1.1',
9
- 'widget' => 'pmpro_addon_wp_bouncer_widget',
10
- 'enabled' => class_exists('WP_Bouncer')
11
- )
12
- );
13
-
14
- function pmpro_addon_wp_bouncer_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/wp-bouncer.gif" />
18
- <div class="info">
19
- <p>Make sure users are only logged in from one computer or device at a time.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="http://wordpress.org/plugins/wp-bouncer/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../wp-bouncer/wp-bouncer.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=wp-bouncer/wp-bouncer.php'), 'activate-plugin_wp-bouncer/wp-bouncer.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=wp-bouncer'), 'install-plugin_wp-bouncer'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/admin_footer.php CHANGED
@@ -1,2 +1 @@
1
- <div class="clear"></div>
2
  </div>
 
1
  </div>
adminpages/admin_header.php CHANGED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once(dirname(__FILE__) . "/functions.php");
3
-
4
  if(isset($_REQUEST['page']))
5
  $view = $_REQUEST['page'];
6
  else
@@ -22,95 +20,34 @@
22
  if(empty($msg))
23
  $msg = -1;
24
  if(empty($pmpro_level_ready) && empty($edit))
25
- $msgt .= " <a href=\"?page=pmpro-membershiplevels&edit=-1\">" . __("Add a membership level to get started.", "pmpro") . "</a>";
26
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
27
- $msgt .= " <a href=\"?page=pmpro-pagesettings\">" . __("Setup the membership pages", "pmpro") . "</a>.";
28
  elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings")
29
- $msgt .= " <a href=\"?page=pmpro-paymentsettings\">" . __("Setup your SSL certificate and payment gateway", "pmpro") . "</a>.";
30
 
31
  if(empty($msgt))
32
  $msg = false;
33
  }
34
 
35
- if(!pmpro_checkLevelForStripeCompatibility())
36
  {
37
  $msg = -1;
38
- $msgt = __("The billing details for some of your membership levels is not supported by Stripe.", "pmpro");
39
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
40
  {
41
- if(!pmpro_checkLevelForStripeCompatibility($_REQUEST['edit']))
42
  {
43
  global $pmpro_stripe_error;
44
  $pmpro_stripe_error = true;
45
  $msg = -1;
46
- $msgt = __("The billing details for this level are not supported by Stripe. Please review the notes in the Billing Details section below.", "pmpro");
47
  }
48
  }
49
  elseif($view == "pmpro-membershiplevels")
50
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
51
  else
52
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
53
- }
54
-
55
- if(!pmpro_checkLevelForPayflowCompatibility())
56
- {
57
- $msg = -1;
58
- $msgt = __("The billing details for some of your membership levels is not supported by Payflow.", "pmpro");
59
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
60
- {
61
- if(!pmpro_checkLevelForPayflowCompatibility($_REQUEST['edit']))
62
- {
63
- global $pmpro_payflow_error;
64
- $pmpro_payflow_error = true;
65
- $msg = -1;
66
- $msgt = __("The billing details for this level are not supported by Payflow. Please review the notes in the Billing Details section below.", "pmpro");
67
- }
68
- }
69
- elseif($view == "pmpro-membershiplevels")
70
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
71
- else
72
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
73
- }
74
-
75
- if(!pmpro_checkLevelForBraintreeCompatibility())
76
- {
77
- $msg = -1;
78
- $msgt = __("The billing details for some of your membership levels is not supported by Braintree.", "pmpro");
79
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
80
- {
81
- if(!pmpro_checkLevelForBraintreeCompatibility($_REQUEST['edit']))
82
- {
83
- global $pmpro_braintree_error;
84
- $pmpro_braintree_error = true;
85
- $msg = -1;
86
- $msgt = __("The billing details for this level are not supported by Braintree. Please review the notes in the Billing Details section below.", "pmpro");
87
- }
88
- }
89
- elseif($view == "pmpro-membershiplevels")
90
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
91
- else
92
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
93
- }
94
-
95
- if(!pmpro_checkLevelForTwoCheckoutCompatibility())
96
- {
97
- $msg = -1;
98
- $msgt = __("The billing details for some of your membership levels is not supported by TwoCheckout.", "pmpro");
99
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
100
- {
101
- if(!pmpro_checkLevelForTwoCheckoutCompatibility($_REQUEST['edit']))
102
- {
103
- global $pmpro_twocheckout_error;
104
- $pmpro_twocheckout_error = true;
105
-
106
- $msg = -1;
107
- $msgt = __("The billing details for this level are not supported by 2Checkout. Please review the notes in the Billing Details section below.", "pmpro");
108
- }
109
- }
110
- elseif($view == "pmpro-membershiplevels")
111
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
112
- else
113
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
114
  }
115
 
116
  if(!empty($msg))
@@ -122,35 +59,28 @@
122
 
123
  ?>
124
  <div class="wrap pmpro_admin">
125
- <div class="pmpro_banner">
126
- <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/Paid-Memberships-Pro.png" width="350" height="75" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
127
- <div class="pmpro_meta"><span class="pmpro_tag-grey">v<?php echo PMPRO_VERSION?></span><a target="_blank" class="pmpro_tag-blue" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><?php _e('Plugin Support', 'pmpro');?></a><a target="_blank" class="pmpro_tag-blue" href="http://www.paidmembershipspro.com/forums/"><?php _e('User Forum', 'pmpro');?></a></div>
128
 
129
- <br style="clear:both;" />
130
- </div>
 
131
 
132
  <div id="pmpro_notifications">
133
  </div>
134
  <script>
135
  jQuery(document).ready(function() {
136
  jQuery.get('<?php echo get_admin_url(NULL, "/admin-ajax.php?action=pmpro_notifications"); ?>', function(data) {
137
- if(data && data != 'NULL')
138
- jQuery('#pmpro_notifications').html(data);
139
  });
140
  });
141
  </script>
142
 
143
- <?php
144
- $settings_tabs = array("pmpro-membershiplevels", "pmpro-pagesettings", "pmpro-paymentsettings", "pmpro-emailsettings", "pmpro-advancedsettings", "pmpro-addons");
145
- if(in_array($view, $settings_tabs))
146
- {
147
- ?>
148
  <h3 class="nav-tab-wrapper">
149
- <a href="admin.php?page=pmpro-membershiplevels" class="nav-tab<?php if($view == 'pmpro-membershiplevels') { ?> nav-tab-active<?php } ?>"><?php _e('Membership Levels', 'pmpro');?></a>
150
- <a href="admin.php?page=pmpro-pagesettings" class="nav-tab<?php if($view == 'pmpro-pagesettings') { ?> nav-tab-active<?php } ?>"><?php _e('Pages', 'pmpro');?></a>
151
- <a href="admin.php?page=pmpro-paymentsettings" class="nav-tab<?php if($view == 'pmpro-paymentsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Payment Gateway &amp; SSL', 'pmpro');?></a>
152
- <a href="admin.php?page=pmpro-emailsettings" class="nav-tab<?php if($view == 'pmpro-emailsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Email', 'pmpro');?></a>
153
- <a href="admin.php?page=pmpro-advancedsettings" class="nav-tab<?php if($view == 'pmpro-advancedsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Advanced', 'pmpro');?></a>
154
- <a href="admin.php?page=pmpro-addons" class="nav-tab<?php if($view == 'pmpro-addons') { ?> nav-tab-active<?php } ?>"><?php _e('Add Ons', 'pmpro');?></a>
155
  </h3>
156
- <?php } ?>
1
  <?php
 
 
2
  if(isset($_REQUEST['page']))
3
  $view = $_REQUEST['page'];
4
  else
20
  if(empty($msg))
21
  $msg = -1;
22
  if(empty($pmpro_level_ready) && empty($edit))
23
+ $msgt .= " <a href=\"?page=pmpro-membershiplevels&edit=-1\">Add a membership level</a> to get started.";
24
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
25
+ $msgt .= " <a href=\"?page=pmpro-pagesettings\">Setup the membership pages</a>.";
26
  elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings")
27
+ $msgt .= " <a href=\"?page=pmpro-paymentsettings\">Setup your SSL certificate and payment gateway</a>.";
28
 
29
  if(empty($msgt))
30
  $msg = false;
31
  }
32
 
33
+ if(!pmpro_checkLevelForStripeCompatibilty())
34
  {
35
  $msg = -1;
36
+ $msgt = "The billing details for some of your membership levels is not supported by Stripe.";
37
+ if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']))
38
  {
39
+ if(!pmpro_checkLevelForStripeCompatibilty($_REQUEST['edit']))
40
  {
41
  global $pmpro_stripe_error;
42
  $pmpro_stripe_error = true;
43
  $msg = -1;
44
+ $msgt = "The billing details for this level are not supported by Stripe. Please review the notes in the Billing Details section below.";
45
  }
46
  }
47
  elseif($view == "pmpro-membershiplevels")
48
+ $msgt .= " The levels with issues are highlighted below.";
49
  else
50
+ $msgt .= " <a href=\"?page=pmpro-membershiplevels\">Please edit your levels</a>.";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
52
 
53
  if(!empty($msg))
59
 
60
  ?>
61
  <div class="wrap pmpro_admin">
62
+ <div class="pmpro_banner">
63
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
64
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
65
 
66
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
67
+ </div>
68
+ <br style="clear:both;" />
69
 
70
  <div id="pmpro_notifications">
71
  </div>
72
  <script>
73
  jQuery(document).ready(function() {
74
  jQuery.get('<?php echo get_admin_url(NULL, "/admin-ajax.php?action=pmpro_notifications"); ?>', function(data) {
75
+ jQuery('#pmpro_notifications').html(data);
 
76
  });
77
  });
78
  </script>
79
 
 
 
 
 
 
80
  <h3 class="nav-tab-wrapper">
81
+ <a href="admin.php?page=pmpro-membershiplevels" class="nav-tab<?php if($view == 'pmpro-membershiplevels') { ?> nav-tab-active<?php } ?>">Membership Levels</a>
82
+ <a href="admin.php?page=pmpro-pagesettings" class="nav-tab<?php if($view == 'pmpro-pagesettings') { ?> nav-tab-active<?php } ?>">Pages</a>
83
+ <a href="admin.php?page=pmpro-paymentsettings" class="nav-tab<?php if($view == 'pmpro-paymentsettings') { ?> nav-tab-active<?php } ?>">Payment Gateway &amp; SSL</a>
84
+ <a href="admin.php?page=pmpro-emailsettings" class="nav-tab<?php if($view == 'pmpro-emailsettings') { ?> nav-tab-active<?php } ?>">Email</a>
85
+ <a href="admin.php?page=pmpro-advancedsettings" class="nav-tab<?php if($view == 'pmpro-advancedsettings') { ?> nav-tab-active<?php } ?>">Advanced</a>
 
86
  </h3>
 
adminpages/advancedsettings.php CHANGED
@@ -1,10 +1,4 @@
1
  <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_advancedsettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
  global $wpdb, $msg, $msgt;
9
 
10
  //get/set settings
@@ -14,7 +8,6 @@
14
  pmpro_setOption("nonmembertext");
15
  pmpro_setOption("notloggedintext");
16
  pmpro_setOption("rsstext");
17
- pmpro_setOption("filterqueries");
18
  pmpro_setOption("showexcerpts");
19
  pmpro_setOption("hideads");
20
  pmpro_setOption("hideadslevels");
@@ -30,24 +23,16 @@
30
 
31
  //footer link
32
  pmpro_setOption("hide_footer_link");
33
-
34
- // custom settings (added with pmpro_custom_advanced_settings hook)
35
- foreach($_REQUEST as $key => $value ) {
36
- if (strpos($key, 'custom_') === 0) {
37
- pmpro_setOption($key);
38
- }
39
- }
40
 
41
  //assume success
42
  $msg = true;
43
- $msgt = __("Your advanced settings have been updated.", "pmpro");
44
  }
45
 
46
  $nonmembertext = pmpro_getOption("nonmembertext");
47
  $notloggedintext = pmpro_getOption("notloggedintext");
48
  $rsstext = pmpro_getOption("rsstext");
49
  $hideads = pmpro_getOption("hideads");
50
- $filterqueries = pmpro_getOption('filterqueries');
51
  $showexcerpts = pmpro_getOption("showexcerpts");
52
  $hideadslevels = pmpro_getOption("hideadslevels");
53
 
@@ -65,17 +50,17 @@
65
  //default settings
66
  if(!$nonmembertext)
67
  {
68
- $nonmembertext = sprintf( __( 'This content is for !!levels!! members only. <a href="%s">Register here</a>.', 'pmpro' ), wp_login_url() . "?action=register" );
69
  pmpro_setOption("nonmembertext", $nonmembertext);
70
  }
71
  if(!$notloggedintext)
72
  {
73
- $notloggedintext = sprintf( __( 'Please <a href="%s">login</a> to view this content. (<a href="%s">Register here</a>.)', 'pmpro' ), wp_login_url( get_permalink() ), wp_login_url() . "?action=register" );
74
  pmpro_setOption("notloggedintext", $notloggedintext);
75
  }
76
  if(!$rsstext)
77
  {
78
- $rsstext = __( 'This content is for members only. Visit the site and log in/register to read.', 'pmpro' );
79
  pmpro_setOption("rsstext", $rsstext);
80
  }
81
 
@@ -85,77 +70,66 @@
85
  ?>
86
 
87
  <form action="" method="post" enctype="multipart/form-data">
88
- <h2><?php _e('Advanced Settings', 'pmpro');?></h2>
89
 
90
  <table class="form-table">
91
  <tbody>
92
  <tr>
93
  <th scope="row" valign="top">
94
- <label for="nonmembertext"><?php _e('Message for Logged-in Non-members', 'pmpro');?>:</label>
95
  </th>
96
  <td>
97
  <textarea name="nonmembertext" rows="3" cols="80"><?php echo stripslashes($nonmembertext)?></textarea><br />
98
- <small class="litegray"><?php _e('This message replaces the post content for non-members. Available variables', 'pmpro');?>: !!levels!!, !!referrer!!</small>
99
  </td>
100
  </tr>
101
  <tr>
102
  <th scope="row" valign="top">
103
- <label for="notloggedintext"><?php _e('Message for Logged-out Users', 'pmpro');?>:</label>
104
  </th>
105
  <td>
106
  <textarea name="notloggedintext" rows="3" cols="80"><?php echo stripslashes($notloggedintext)?></textarea><br />
107
- <small class="litegray"><?php _e('This message replaces the post content for logged-out visitors.', 'pmpro');?></small>
108
  </td>
109
  </tr>
110
  <tr>
111
  <th scope="row" valign="top">
112
- <label for="rsstext"><?php _e('Message for RSS Feed', 'pmpro');?>:</label>
113
  </th>
114
  <td>
115
  <textarea name="rsstext" rows="3" cols="80"><?php echo stripslashes($rsstext)?></textarea><br />
116
- <small class="litegray"><?php _e('This message replaces the post content in RSS feeds.', 'pmpro');?></small>
117
  </td>
118
  </tr>
119
 
120
  <tr>
121
  <th scope="row" valign="top">
122
- <label for="filterqueries"><?php _e("Filter searches and archives?", 'pmpro');?></label>
123
  </th>
124
  <td>
125
- <select id="filterqueries" name="filterqueries">
126
- <option value="0" <?php if(!$filterqueries) { ?>selected="selected"<?php } ?>><?php _e('No - Non-members will see restricted posts/pages in searches and archives.', 'pmpro');?></option>
127
- <option value="1" <?php if($filterqueries == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Only members will see restricted posts/pages in searches and archives.', 'pmpro');?></option>
128
  </select>
129
  </td>
130
  </tr>
131
  <tr>
132
- <th scope="row" valign="top">
133
- <label for="showexcerpts"><?php _e('Show Excerpts to Non-Members?', 'pmpro');?></label>
134
- </th>
135
- <td>
136
- <select id="showexcerpts" name="showexcerpts">
137
- <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>><?php _e('No - Hide excerpts.', 'pmpro');?></option>
138
- <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Show excerpts.', 'pmpro');?></option>
139
- </select>
140
- </td>
141
- </tr>
142
- <tr>
143
  <th scope="row" valign="top">
144
  <label for="hideads">Hide Ads From Members?</label>
145
  </th>
146
  <td>
147
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
148
- <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
149
- <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From All Members', 'pmpro');?></option>
150
- <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From Certain Members', 'pmpro');?></option>
151
  </select>
152
  </td>
153
  </tr>
154
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
155
  <th scope="row" valign="top">&nbsp;</th>
156
  <td>
157
- <p class="top0em"><?php _e('Ads from the following plugins will be automatically turned off', 'pmpro');?>: <em>Easy Adsense</em>, ...</p>
158
- <p><?php _e('To hide ads in your template code, use code like the following', 'pmpro');?>:</p>
159
  <pre lang="PHP">
160
  if(pmpro_displayAds())
161
  {
@@ -166,7 +140,7 @@ if(pmpro_displayAds())
166
  </tr>
167
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
168
  <th scope="row" valign="top">
169
- <label for="hideadslevels"><?php _e('Choose Levels to Hide Ads From', 'pmpro');?>:</label>
170
  </th>
171
  <td>
172
  <div class="checkbox_box" <?php if(count($levels) > 5) { ?>style="height: 100px; overflow: auto;"<?php } ?>>
@@ -200,49 +174,49 @@ if(pmpro_displayAds())
200
  <?php if(is_multisite()) { ?>
201
  <tr>
202
  <th scope="row" valign="top">
203
- <label for="redirecttosubscription"><?php _e('Redirect all traffic from registration page to /susbcription/?', 'pmpro');?>: <em>(<?php _e('multisite only', 'pmpro');?>)</em></label>
204
  </th>
205
  <td>
206
  <select id="redirecttosubscription" name="redirecttosubscription">
207
- <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
208
- <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
209
  </select>
210
  </td>
211
  </tr>
212
  <?php } ?>
213
  <tr>
214
  <th scope="row" valign="top">
215
- <label for="recaptcha"><?php _e('Use reCAPTCHA?', 'pmpro');?>:</label>
216
  </th>
217
  <td>
218
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
219
- <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
220
- <option value="1" <?php if($recaptcha == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Free memberships only.', 'pmpro');?></option>
221
- <option value="2" <?php if($recaptcha == 2) { ?>selected="selected"<?php } ?>><?php _e('Yes - All memberships.', 'pmpro');?></option>
222
  </select><br />
223
- <small><?php _e('A free reCAPTCHA key is required.', 'pmpro');?> <a href="https://www.google.com/recaptcha/admin/create"><?php _e('Click here to signup for reCAPTCHA', 'pmpro');?></a>.</small>
224
  </td>
225
  </tr>
226
  <tr id="recaptcha_tr" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
227
  <th scope="row" valign="top">&nbsp;</th>
228
  <td>
229
- <label for="recaptcha_publickey"><?php _e('reCAPTCHA Public Key', 'pmpro');?>:</label>
230
  <input type="text" name="recaptcha_publickey" size="60" value="<?php echo $recaptcha_publickey?>" />
231
  <br /><br />
232
- <label for="recaptcha_privatekey"><?php _e('reCAPTCHA Private Key', 'pmpro');?>:</label>
233
  <input type="text" name="recaptcha_privatekey" size="60" value="<?php echo $recaptcha_privatekey?>" />
234
  </td>
235
  </tr>
236
  <tr>
237
  <th scope="row" valign="top">
238
- <label for="tospage"><?php _e('Require Terms of Service on signups?', 'pmpro');?></label>
239
  </th>
240
  <td>
241
  <?php
242
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
243
  ?>
244
  <br />
245
- <small><?php _e('If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.', 'pmpro');?></small>
246
  </td>
247
  </tr>
248
 
@@ -257,73 +231,9 @@ if(pmpro_displayAds())
257
  <option value="1" <?php if($hide_footer_link == 1) { ?>selected="selected"<?php } ?>>Yes - Hide the link.</option>
258
  </select>
259
  </td>
260
- </tr>
261
- */
262
-
263
- // Filter to Add More Advanced Settings for Misc Plugin Options, etc.
264
- if (has_action('pmpro_custom_advanced_settings')) {
265
- $custom_fields = apply_filters('pmpro_custom_advanced_settings', $custom_fields);
266
- foreach ($custom_fields as $field) {
267
- ?>
268
- <tr>
269
- <th valign="top" scope="row">
270
- <label
271
- for="<?php _e($field['field_name'], 'pmpro'); ?>"><?php _e($field['label'], 'pmpro'); ?></label>
272
- </th>
273
- <td>
274
- <?php
275
- switch ($field['field_type']) {
276
- case 'select':
277
- ?>
278
- <select id="<?php _e($field['field_name'], 'pmpro'); ?>"
279
- name="<?php _e($field['field_name'], 'pmpro'); ?>">
280
- <?php foreach ($field['options'] as $option) {
281
- ?>
282
- <option value="<?php _e($option, 'pmpro'); ?>"
283
- <?php
284
- if ($option == pmpro_getOption($field['field_name'])) {
285
- _e('selected', 'pmpro');
286
- }
287
- ?>
288
- ><?php _e($option, 'pmpro'); ?></option>
289
- <?php
290
- } ?>
291
- </select>
292
- <?php
293
- break;
294
- case 'text':
295
- ?>
296
- <input id="<?php _e($field['field_name'], 'pmpro'); ?>"
297
- name="<?php _e($field['field_name'], 'pmpro'); ?>"
298
- type="<?php _e($field['field_type'], 'pmpro'); ?>"
299
- value="<?php echo pmpro_getOption($field['field_name']); ?> ">
300
- <?php
301
- break;
302
- case 'textarea':
303
- ?>
304
- <textarea id="<?php _e($field['field_name'], 'pmpro'); ?>"
305
- name="<?php _e($field['field_name'], 'pmpro'); ?>">
306
- <?php echo pmpro_getOption($field['field_name']); ?>
307
- </textarea>
308
- <?php
309
- break;
310
- default:
311
- break;
312
- }
313
- if (!empty($field['description'])) {
314
- ?>
315
- <br>
316
- <small><?php _e($field['description'], 'pmpro'); ?></small>
317
- <?php
318
- }
319
- ?>
320
- </td>
321
- <?php
322
- }
323
- }
324
- ?>
325
- </tr>
326
- </tbody>
327
  </table>
328
  <script>
329
  function pmpro_updateHideAdsTRs()
@@ -365,7 +275,7 @@ if(pmpro_displayAds())
365
  </script>
366
 
367
  <p class="submit">
368
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
369
  </p>
370
  </form>
371
 
1
  <?php
 
 
 
 
 
 
2
  global $wpdb, $msg, $msgt;
3
 
4
  //get/set settings
8
  pmpro_setOption("nonmembertext");
9
  pmpro_setOption("notloggedintext");
10
  pmpro_setOption("rsstext");
 
11
  pmpro_setOption("showexcerpts");
12
  pmpro_setOption("hideads");
13
  pmpro_setOption("hideadslevels");
23
 
24
  //footer link
25
  pmpro_setOption("hide_footer_link");
 
 
 
 
 
 
 
26
 
27
  //assume success
28
  $msg = true;
29
+ $msgt = "Your advanced settings have been updated.";
30
  }
31
 
32
  $nonmembertext = pmpro_getOption("nonmembertext");
33
  $notloggedintext = pmpro_getOption("notloggedintext");
34
  $rsstext = pmpro_getOption("rsstext");
35
  $hideads = pmpro_getOption("hideads");
 
36
  $showexcerpts = pmpro_getOption("showexcerpts");
37
  $hideadslevels = pmpro_getOption("hideadslevels");
38
 
50
  //default settings
51
  if(!$nonmembertext)
52
  {
53
+ $nonmembertext = "This content is for !!levels!! members only. <a href=\"" . wp_login_url() . "?action=register\">Register here</a>.";
54
  pmpro_setOption("nonmembertext", $nonmembertext);
55
  }
56
  if(!$notloggedintext)
57
  {
58
+ $notloggedintext = "Please <a href=\"" . wp_login_url( get_permalink() ) . "\">login</a> to view this content. (<a href=\"" . wp_login_url() . "?action=register\">Register here</a>.)";
59
  pmpro_setOption("notloggedintext", $notloggedintext);
60
  }
61
  if(!$rsstext)
62
  {
63
+ $rsstext = "This content is for members only. Visit the site and log in/register to read.";
64
  pmpro_setOption("rsstext", $rsstext);
65
  }
66
 
70
  ?>
71
 
72
  <form action="" method="post" enctype="multipart/form-data">
73
+ <h2>Advanced Settings</h2>
74
 
75
  <table class="form-table">
76
  <tbody>
77
  <tr>
78
  <th scope="row" valign="top">
79
+ <label for="nonmembertext">Message for Logged-in Non-members:</label>
80
  </th>
81
  <td>
82
  <textarea name="nonmembertext" rows="3" cols="80"><?php echo stripslashes($nonmembertext)?></textarea><br />
83
+ <small class="litegray">This message replaces the post content for non-members. Available variables: !!levels!!, !!referrer!!</small>
84
  </td>
85
  </tr>
86
  <tr>
87
  <th scope="row" valign="top">
88
+ <label for="notloggedintext">Message for Logged-out Users:</label>
89
  </th>
90
  <td>
91
  <textarea name="notloggedintext" rows="3" cols="80"><?php echo stripslashes($notloggedintext)?></textarea><br />
92
+ <small class="litegray">This message replaces the post content for logged-out visitors.</small>
93
  </td>
94
  </tr>
95
  <tr>
96
  <th scope="row" valign="top">
97
+ <label for="rsstext">Message for RSS Feed:</label>
98
  </th>
99
  <td>
100
  <textarea name="rsstext" rows="3" cols="80"><?php echo stripslashes($rsstext)?></textarea><br />
101
+ <small class="litegray">This message replaces the post content in RSS feeds.</small>
102
  </td>
103
  </tr>
104
 
105
  <tr>
106
  <th scope="row" valign="top">
107
+ <label for="showexcerpts">Show Excerpts to Non-Members?</label>
108
  </th>
109
  <td>
110
+ <select id="showexcerpts" name="showexcerpts">
111
+ <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>>No - Hide excerpts.</option>
112
+ <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>>Yes - Show excerpts.</option>
113
  </select>
114
  </td>
115
  </tr>
116
  <tr>
 
 
 
 
 
 
 
 
 
 
 
117
  <th scope="row" valign="top">
118
  <label for="hideads">Hide Ads From Members?</label>
119
  </th>
120
  <td>
121
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
122
+ <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>>No</option>
123
+ <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>>Hide Ads From All Members</option>
124
+ <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>>Hide Ads From Certain Members</option>
125
  </select>
126
  </td>
127
  </tr>
128
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
129
  <th scope="row" valign="top">&nbsp;</th>
130
  <td>
131
+ <p class="top0em">Ads from the following plugins will be automatically turned off: <em>Easy Adsense</em>, ...</p>
132
+ <p>To hide ads in your template code, use code like the following:</p>
133
  <pre lang="PHP">
134
  if(pmpro_displayAds())
135
  {
140
  </tr>
141
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
142
  <th scope="row" valign="top">
143
+ <label for="hideadslevels">Choose Levels to Hide Ads From:</label>
144
  </th>
145
  <td>
146
  <div class="checkbox_box" <?php if(count($levels) > 5) { ?>style="height: 100px; overflow: auto;"<?php } ?>>
174
  <?php if(is_multisite()) { ?>
175
  <tr>
176
  <th scope="row" valign="top">
177
+ <label for="redirecttosubscription">Redirect all traffic from registration page to /susbcription/?: <em>(multisite only)</em></label>
178
  </th>
179
  <td>
180
  <select id="redirecttosubscription" name="redirecttosubscription">
181
+ <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>>No</option>
182
+ <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>>Yes</option>
183
  </select>
184
  </td>
185
  </tr>
186
  <?php } ?>
187
  <tr>
188
  <th scope="row" valign="top">
189
+ <label for="recaptcha">Use reCAPTCHA?:</label>
190
  </th>
191
  <td>
192
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
193
+ <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>>No</option>
194
+ <option value="1" <?php if($recaptcha == 1) { ?>selected="selected"<?php } ?>>Yes - Free memberships only.</option>
195
+ <option value="2" <?php if($recaptcha == 2) { ?>selected="selected"<?php } ?>>Yes - All memberships.</option>
196
  </select><br />
197
+ <small>A free reCAPTCHA key is required. <a href="https://www.google.com/recaptcha/admin/create">Click here to signup for reCAPTCHA</a>.</small>
198
  </td>
199
  </tr>
200
  <tr id="recaptcha_tr" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
201
  <th scope="row" valign="top">&nbsp;</th>
202
  <td>
203
+ <label for="recaptcha_publickey">reCAPTCHA Public Key:</label>
204
  <input type="text" name="recaptcha_publickey" size="60" value="<?php echo $recaptcha_publickey?>" />
205
  <br /><br />
206
+ <label for="recaptcha_privatekey">reCAPTCHA Private Key:</label>
207
  <input type="text" name="recaptcha_privatekey" size="60" value="<?php echo $recaptcha_privatekey?>" />
208
  </td>
209
  </tr>
210
  <tr>
211
  <th scope="row" valign="top">
212
+ <label for="tospage">Require Terms of Service on signups?</label>
213
  </th>
214
  <td>
215
  <?php
216
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
217
  ?>
218
  <br />
219
+ <small>If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.</small>
220
  </td>
221
  </tr>
222
 
231
  <option value="1" <?php if($hide_footer_link == 1) { ?>selected="selected"<?php } ?>>Yes - Hide the link.</option>
232
  </select>
233
  </td>
234
+ </tr>
235
+ */ ?>
236
+ </tbody>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
  </table>
238
  <script>
239
  function pmpro_updateHideAdsTRs()
275
  </script>
276
 
277
  <p class="submit">
278
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
279
  </p>
280
  </form>
281
 
adminpages/dashboard.php CHANGED
@@ -97,7 +97,7 @@
97
  foreach ( $rss_items as $item ) {
98
  echo '<li class="pmpro_news">';
99
  echo '<a class="rsswidget" href="'.esc_url( $item->get_permalink(), $protocolls=null, 'display' ).'">'. esc_html( $item->get_title() ) .'</a>';
100
- echo ' <span class="rss-date">'. $item->get_date(get_option('date_format')) .'</span>';
101
  echo '<div class="rssSummary">'. esc_html( pmpro_text_limit( strip_tags( $item->get_description() ), 150 ) ).'</div>';
102
  echo '</li>';
103
  }
@@ -105,9 +105,9 @@
105
 
106
  echo '</ul>';
107
  echo '<br class="clear"/><div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">';
108
- echo '<a target="_blank" href="'.$pmpro_feed.'"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/rss.png" alt=""/> Subscribe with RSS</a>';
109
  echo ' &nbsp; &nbsp; &nbsp; ';
110
- echo '<a target="_blank" href="http://www.paidmembershipspro.com/blog/">View Online</a>';
111
  echo '<form class="alignright" method="post"><input type="hidden" name="pmpro_removedbwidget" value="true"/><input title="Remove this widget from all users dashboards" class="button" type="submit" value="X"/></form>';
112
  echo '</div>';
113
  }
@@ -124,4 +124,4 @@
124
  }
125
 
126
  add_action( 'wp_dashboard_setup', 'pmpro_widget_setup');
127
- ?>
97
  foreach ( $rss_items as $item ) {
98
  echo '<li class="pmpro_news">';
99
  echo '<a class="rsswidget" href="'.esc_url( $item->get_permalink(), $protocolls=null, 'display' ).'">'. esc_html( $item->get_title() ) .'</a>';
100
+ echo ' <span class="rss-date">'. $item->get_date('F j, Y') .'</span>';
101
  echo '<div class="rssSummary">'. esc_html( pmpro_text_limit( strip_tags( $item->get_description() ), 150 ) ).'</div>';
102
  echo '</li>';
103
  }
105
 
106
  echo '</ul>';
107
  echo '<br class="clear"/><div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">';
108
+ echo '<a href="'.$pmpro_feed.'"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/rss.png" alt=""/> Subscribe with RSS</a>';
109
  echo ' &nbsp; &nbsp; &nbsp; ';
110
+ echo '<a href="http://www.paidmembershipspro.com/"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/wpmini-blue.png" alt=""/> View Online</a>';
111
  echo '<form class="alignright" method="post"><input type="hidden" name="pmpro_removedbwidget" value="true"/><input title="Remove this widget from all users dashboards" class="button" type="submit" value="X"/></form>';
112
  echo '</div>';
113
  }
124
  }
125
 
126
  add_action( 'wp_dashboard_setup', 'pmpro_widget_setup');
127
+ ?>
adminpages/discountcodes.php CHANGED
@@ -1,636 +1,640 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_discountcodes")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- //vars
9
- global $wpdb, $pmpro_currency_symbol;
10
-
11
- if(isset($_REQUEST['edit']))
12
- $edit = $_REQUEST['edit'];
13
- else
14
- $edit = false;
15
-
16
- if(isset($_REQUEST['delete']))
17
- $delete = $_REQUEST['delete'];
18
- else
19
- $delete = false;
20
-
21
- if(isset($_REQUEST['saveid']))
22
- $saveid = $_POST['saveid'];
23
- else
24
- $saveid = false;
25
-
26
- if($saveid)
27
- {
28
- //get vars
29
- $code = $_POST['code'];
30
- $starts_month = $_POST['starts_month'];
31
- $starts_day = $_POST['starts_day'];
32
- $starts_year = $_POST['starts_year'];
33
- $expires_month = $_POST['expires_month'];
34
- $expires_day = $_POST['expires_day'];
35
- $expires_year = $_POST['expires_year'];
36
- $uses = $_POST['uses'];
37
-
38
- //fix up dates
39
- $starts = date("Y-m-d", strtotime($starts_month . "/" . $starts_day . "/" . $starts_year, current_time("timestamp")));
40
- $expires = date("Y-m-d", strtotime($expires_month . "/" . $expires_day . "/" . $expires_year, current_time("timestamp")));
41
-
42
- //updating or new?
43
- if($saveid > 0)
44
- {
45
- $sqlQuery = "UPDATE $wpdb->pmpro_discount_codes SET code = '" . esc_sql($code) . "', starts = '" . $starts . "', expires = '" . $expires . "', uses = '" . intval($uses) . "' WHERE id = '" . $saveid . "' LIMIT 1";
46
- if($wpdb->query($sqlQuery) !== false)
47
- {
48
- $pmpro_msg = __("Discount code updated successfully.", "pmpro");
49
- $pmpro_msgt = "success";
50
- $saved = true;
51
- $edit = $saveid;
52
- }
53
- else
54
- {
55
- $pmpro_msg = __("Error updating discount code. That code may already be in use.", "pmpro");
56
- $pmpro_msgt = "error";
57
- }
58
- }
59
- else
60
- {
61
- $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes (code, starts, expires, uses) VALUES('" . esc_sql($code) . "', '" . $starts . "', '" . $expires . "', '" . intval($uses) . "')";
62
- if($wpdb->query($sqlQuery) !== false)
63
- {
64
- $pmpro_msg = __("Discount code added successfully.", "pmpro");
65
- $pmpro_msgt = "success";
66
- $saved = true;
67
- $edit = $wpdb->insert_id;
68
- }
69
- else
70
- {
71
- $pmpro_msg = __("Error adding discount code. That code may already be in use.", "pmpro") . $wpdb->last_error;
72
- $pmpro_msgt = "error";
73
- }
74
- }
75
-
76
- //now add the membership level rows
77
- if($saved && $edit > 0)
78
- {
79
- //get the submitted values
80
- $all_levels_a = $_REQUEST['all_levels'];
81
- if(!empty($_REQUEST['levels']))
82
- $levels_a = $_REQUEST['levels'];
83
- else
84
- $levels_a = array();
85
- $initial_payment_a = $_REQUEST['initial_payment'];
86
- if(!empty($_REQUEST['recurring']))
87
- $recurring_a = $_REQUEST['recurring'];
88
- $billing_amount_a = $_REQUEST['billing_amount'];
89
- $cycle_number_a = $_REQUEST['cycle_number'];
90
- $cycle_period_a = $_REQUEST['cycle_period'];
91
- $billing_limit_a = $_REQUEST['billing_limit'];
92
- if(!empty($_REQUEST['custom_trial']))
93
- $custom_trial_a = $_REQUEST['custom_trial'];
94
- $trial_amount_a = $_REQUEST['trial_amount'];
95
- $trial_limit_a = $_REQUEST['trial_limit'];
96
- if(!empty($_REQUEST['expiration']))
97
- $expiration_a = $_REQUEST['expiration'];
98
- $expiration_number_a = $_REQUEST['expiration_number'];
99
- $expiration_period_a = $_REQUEST['expiration_period'];
100
-
101
- //clear the old rows
102
- $sqlQuery = "DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $edit . "'";
103
- $wpdb->query($sqlQuery);
104
-
105
- //add a row for each checked level
106
- if(!empty($levels_a))
107
- {
108
- foreach($levels_a as $level_id)
109
- {
110
- //get the values ready
111
- $n = array_search($level_id, $all_levels_a); //this is the key location of this level's values
112
- $initial_payment = $initial_payment_a[$n];
113
-
114
- //is this recurring?
115
- if(!empty($recurring_a))
116
- {
117
- if(in_array($level_id, $recurring_a))
118
- $recurring = 1;
119
- else
120
- $recurring = 0;
121
- }
122
- else
123
- $recurring = 0;
124
-
125
- if(!empty($recurring))
126
- {
127
- $billing_amount = $billing_amount_a[$n];
128
- $cycle_number = $cycle_number_a[$n];
129
- $cycle_period = $cycle_period_a[$n];
130
- $billing_limit = $billing_limit_a[$n];
131
-
132
- //custom trial
133
- if(!empty($custom_trial_a))
134
- {
135
- if(in_array($level_id, $custom_trial_a))
136
- $custom_trial = 1;
137
- else
138
- $custom_trial = 0;
139
- }
140
- else
141
- $custom_trial = 0;
142
-
143
- if(!empty($custom_trial))
144
- {
145
- $trial_amount = $trial_amount_a[$n];
146
- $trial_limit = $trial_limit_a[$n];
147
- }
148
- else
149
- {
150
- $trial_amount = '';
151
- $trial_limit = '';
152
- }
153
- }
154
- else
155
- {
156
- $billing_amount = '';
157
- $cycle_number = '';
158
- $cycle_period = 'Month';
159
- $billing_limit = '';
160
- $custom_trial = 0;
161
- $trial_amount = '';
162
- $trial_limit = '';
163
- }
164
-
165
- if(!empty($expiration_a))
166
- {
167
- if(in_array($level_id, $expiration_a))
168
- $expiration = 1;
169
- else
170
- $expiration = 0;
171
- }
172
- else
173
- $expiration = 0;
174
-
175
- if(!empty($expiration))
176
- {
177
- $expiration_number = $expiration_number_a[$n];
178
- $expiration_period = $expiration_period_a[$n];
179
- }
180
- else
181
- {
182
- $expiration_number = '';
183
- $expiration_period = 'Month';
184
- }
185
-
186
- //okay, do the insert
187
- $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes_levels (code_id, level_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period) VALUES('" . esc_sql($edit) . "', '" . esc_sql($level_id) . "', '" . (double)esc_sql($initial_payment) . "', '" . (double)esc_sql($billing_amount) . "', '" . intval(esc_sql($cycle_number)) . "', '" . esc_sql($cycle_period) . "', '" . intval(esc_sql($billing_limit)) . "', '" . (double)esc_sql($trial_amount) . "', '" . intval(esc_sql($trial_limit)) . "', '" . intval(esc_sql($expiration_number)) . "', '" . esc_sql($expiration_period) . "')";
188
-
189
- if($wpdb->query($sqlQuery) !== false)
190
- {
191
- //okay
192
- do_action("pmpro_save_discount_code_level", $edit, $level_id);
193
- }
194
- else
195
- {
196
- $level_errors[] = sprintf(__("Error saving values for the %s level.", "pmpro"), $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1"));
197
- }
198
- }
199
- }
200
-
201
- //errors?
202
- if(!empty($level_errors))
203
- {
204
- $pmpro_msg = __("There were errors updating the level values: ", "pmpro") . implode(" ", $level_errors);
205
- $pmpro_msgt = "error";
206
- }
207
- else
208
- {
209
- //all good. set edit = NULL so we go back to the overview page
210
- $edit = NULL;
211
-
212
- do_action("pmpro_save_discount_code", $saveid);
213
- }
214
- }
215
- }
216
-
217
- //are we deleting?
218
- if(!empty($delete))
219
- {
220
- //is this a code?
221
- $code = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
222
- if(!empty($code))
223
- {
224
- //action
225
- do_action("pmpro_delete_discount_code", $delete);
226
-
227
- //delete the code levels
228
- $r1 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $delete . "'");
229
-
230
- if($r1 !== false)
231
- {
232
- //delete the code
233
- $r2 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
234
-
235
- if($r2 !== false)
236
- {
237
- $pmpro_msg = sprintf(__("Code %s deleted successfully.", "pmpro"), $code);
238
- $pmpro_msgt = "success";
239
- }
240
- else
241
- {
242
- $pmpro_msg = __("Error deleting discount code. The code was only partially deleted. Please try again.", "pmpro");
243
- $pmpro_msgt = "error";
244
- }
245
- }
246
- else
247
- {
248
- $pmpro_msg = __("Error deleting code. Please try again.", "pmpro");
249
- $pmpro_msgt = "error";
250
- }
251
- }
252
- else
253
- {
254
- $pmpro_msg = __("Code not found.", "pmpro");
255
- $pmpro_msgt = "error";
256
- }
257
- }
258
-
259
- require_once(dirname(__FILE__) . "/admin_header.php");
260
- ?>
261
-
262
- <?php if($edit) { ?>
263
-
264
- <h2>
265
- <?php
266
- if($edit > 0)
267
- echo __("Edit Discount Code", "pmpro");
268
- else
269
- echo __("Add New Discount Code", "pmpro");
270
- ?>
271
- </h2>
272
-
273
- <?php if(!empty($pmpro_msg)) { ?>
274
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
275
- <?php } ?>
276
-
277
- <div>
278
- <?php
279
- // get the code...
280
- if($edit > 0)
281
- {
282
- $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $edit . "' LIMIT 1", OBJECT);
283
- $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
284
- $levels = $wpdb->get_results("SELECT l.id, l.name, cl.initial_payment, cl.billing_amount, cl.cycle_number, cl.cycle_period, cl.billing_limit, cl.trial_amount, cl.trial_limit FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->code . "'");
285
- $temp_id = $code->id;
286
- }
287
- elseif(!empty($copy) && $copy > 0)
288
- {
289
- $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $copy . "' LIMIT 1", OBJECT);
290
- $temp_id = $level->id;
291
- $level->id = NULL;
292
- }
293
-
294
- // didn't find a discount code, let's add a new one...
295
- if(empty($code->id)) $edit = -1;
296
-
297
- //defaults for new codes
298
- if($edit == -1)
299
- {
300
- $code = new stdClass();
301
- $code->code = pmpro_getDiscountCode();
302
- }
303
- ?>
304
- <form action="" method="post">
305
- <input name="saveid" type="hidden" value="<?php echo $edit?>" />
306
- <table class="form-table">
307
- <tbody>
308
- <tr>
309
- <th scope="row" valign="top"><label><?php _e('ID', 'pmpro');?>:</label></th>
310
- <td class="pmpro_lite"><?php if(!empty($code->id)) echo $code->id; else echo __("This will be generated when you save.", "pmpro");?></td>
311
- </tr>
312
-
313
- <tr>
314
- <th scope="row" valign="top"><label for="code"><?php _e('Code', 'pmpro');?>:</label></th>
315
- <td><input name="code" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($code->code))?>" /></td>
316
- </tr>
317
-
318
- <?php
319
- //some vars for the dates
320
- $current_day = date("j");
321
- if(!empty($code->starts))
322
- $selected_starts_day = date("j", $code->starts);
323
- else
324
- $selected_starts_day = $current_day;
325
- if(!empty($code->expires))
326
- $selected_expires_day = date("j", $code->expires);
327
- else
328
- $selected_expires_day = $current_day;
329
-
330
- $current_month = date("M");
331
- if(!empty($code->starts))
332
- $selected_starts_month = date("m", $code->starts);
333
- else
334
- $selected_starts_month = date("m");
335
- if(!empty($code->expires))
336
- $selected_expires_month = date("m", $code->expires);
337
- else
338
- $selected_expires_month = date("m");
339
-
340
- $current_year = date("Y");
341
- if(!empty($code->starts))
342
- $selected_starts_year = date("Y", $code->starts);
343
- else
344
- $selected_starts_year = $current_year;
345
- if(!empty($code->expires))
346
- $selected_expires_year = date("Y", $code->expires);
347
- else
348
- $selected_expires_year = (int)$current_year + 1;
349
- ?>
350
-
351
- <tr>
352
- <th scope="row" valign="top"><label for="starts"><?php _e('Start Date', 'pmpro');?>:</label></th>
353
- <td>
354
- <select name="starts_month">
355
- <?php
356
- for($i = 1; $i < 13; $i++)
357
- {
358
- ?>
359
- <option value="<?php echo $i?>" <?php if($i == $selected_starts_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")))?></option>
360
- <?php
361
- }
362
- ?>
363
- </select>
364
- <input name="starts_day" type="text" size="2" value="<?php echo $selected_starts_day?>" />
365
- <input name="starts_year" type="text" size="4" value="<?php echo $selected_starts_year?>" />
366
- </td>
367
- </tr>
368
-
369
- <tr>
370
- <th scope="row" valign="top"><label for="expires"><?php _e('Expiration Date', 'pmpro');?>:</label></th>
371
- <td>
372
- <select name="expires_month">
373
- <?php
374
- for($i = 1; $i < 13; $i++)
375
- {
376
- ?>
377
- <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")))?></option>
378
- <?php
379
- }
380
- ?>
381
- </select>
382
- <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
383
- <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
384
- </td>
385
- </tr>
386
-
387
- <tr>
388
- <th scope="row" valign="top"><label for="uses"><?php _e('Uses', 'pmpro');?>:</label></th>
389
- <td>
390
- <input name="uses" type="text" size="10" value="<?php if(!empty($code->uses)) echo str_replace("\"", "&quot;", stripslashes($code->uses));?>" />
391
- <small class="pmpro_lite"><?php _e('Leave blank for unlimited uses.', 'pmpro');?></small>
392
- </td>
393
- </tr>
394
-
395
- </tbody>
396
- </table>
397
-
398
- <?php do_action("pmpro_discount_code_after_settings"); ?>
399
-
400
- <h3><?php _e('Which Levels Will This Code Apply To?', 'pmpro'); ?></h3>
401
-
402
- <div class="pmpro_discount_levels">
403
- <?php
404
- $levels = $wpdb->get_results("SELECT * FROM $wpdb->pmpro_membership_levels");
405
- foreach($levels as $level)
406
- {
407
- //if this level is already managed for this discount code, use the code values
408
- if($edit > 0)
409
- {
410
- $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $edit . "' AND cl.level_id = '" . $level->id . "' LIMIT 1");
411
- if($code_level)
412
- {
413
- $level = $code_level;
414
- $level->checked = true;
415
- }
416
- else
417
- $level_checked = false;
418
- }
419
- else
420
- $level_checked = false;
421
- ?>
422
- <div>
423
- <input type="hidden" name="all_levels[]" value="<?php echo $level->id?>" />
424
- <input type="checkbox" name="levels[]" value="<?php echo $level->id?>" <?php if(!empty($level->checked)) { ?>checked="checked"<?php } ?> onclick="if(jQuery(this).is(':checked')) jQuery(this).next().show(); else jQuery(this).next().hide();" />
425
- <?php echo $level->name?>
426
- <div class="pmpro_discount_levels_pricing level_<?php echo $level->id?>" <?php if(empty($level->checked)) { ?>style="display: none;"<?php } ?>>
427
- <table class="form-table">
428
- <tbody>
429
- <tr>
430
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'pmpro');?>:</label></th>
431
- <td><?php echo $pmpro_currency_symbol?><input name="initial_payment[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small><?php _e('The initial amount collected at registration.', 'pmpro');?></small></td>
432
- </tr>
433
-
434
- <tr>
435
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'pmpro');?>:</label></th>
436
- <td><input class="recurring_checkbox" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <small><?php _e('Check if this level has a recurring subscription payment.', 'pmpro');?></small></td>
437
- </tr>
438
-
439
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
440
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'pmpro');?>:</label></th>
441
- <td>
442
- <?php echo $pmpro_currency_symbol?><input name="billing_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
443
- <input name="cycle_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
444
- <select name="cycle_period[]" onchange="updateCyclePeriod();">
445
- <?php
446
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
447
- foreach ( $cycles as $name => $value ) {
448
- echo "<option value='$value'";
449
- if ( $level->cycle_period == $value ) echo " selected='selected'";
450
- echo ">$name</option>";
451
- }
452
- ?>
453
- </select>
454
- <br /><small><?php _e('The amount to be billed one cycle after the initial payment.', 'pmpro');?></small>
455
- </td>
456
- </tr>
457
-
458
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
459
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'pmpro');?>:</label></th>
460
- <td>
461
- <input name="billing_limit[]" type="text" size="20" value="<?php echo $level->billing_limit?>" />
462
- <br /><small><?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'pmpro');?></small>
463
- </td>
464
- </tr>
465
-
466
- <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
467
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'pmpro');?>:</label></th>
468
- <td><input id="custom_trial_<?php echo $level->id?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <?php _e('Check to add a custom trial period.', 'pmpro');?></td>
469
- </tr>
470
-
471
- <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
472
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'pmpro');?>:</label></th>
473
- <td>
474
- <?php echo $pmpro_currency_symbol?><input name="trial_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
475
- <small><?php _e('for the first', 'pmpro');?></small>
476
- <input name="trial_limit[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
477
- <small><?php _e('subscription payments', 'pmpro');?>.</small>
478
- </td>
479
- </tr>
480
-
481
- <tr>
482
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'pmpro');?>:</label></th>
483
- <td><input id="expiration" name="expiration[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).is(':checked')) { jQuery(this).parent().parent().siblings('.expiration_info').show(); } else { jQuery(this).parent().parent().siblings('.expiration_info').hide();}" /> <?php _e('Check this to set when membership access expires.', 'pmpro');?></td>
484
- </tr>
485
-
486
- <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
487
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'pmpro');?>:</label></th>
488
- <td>
489
- <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
490
- <select id="expiration_period" name="expiration_period[]">
491
- <?php
492
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
493
- foreach ( $cycles as $name => $value ) {
494
- echo "<option value='$value'";
495
- if ( $level->expiration_period == $value ) echo " selected='selected'";
496
- echo ">$name</option>";
497
- }
498
- ?>
499
- </select>
500
- <br /><small><?php _e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'pmpro');?></small>
501
- </td>
502
- </tr>
503
- </tbody>
504
- </table>
505
-
506
- <?php do_action("pmpro_discount_code_after_level_settings", $edit, $level); ?>
507
-
508
- </div>
509
- </div>
510
- <script>
511
-
512
- </script>
513
- <?php
514
- }
515
- ?>
516
- </div>
517
-
518
- <p class="submit topborder">
519
- <input name="save" type="submit" class="button button-primary" value="Save Code" />
520
- <input name="cancel" type="button" class="button button-secondary" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes')?>';" />
521
- </p>
522
- </form>
523
- </div>
524
-
525
- <?php } else { ?>
526
-
527
- <h2>
528
- <?php _e('Memberships Discount Codes', 'pmpro');?>
529
- <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="add-new-h2"><?php _e('Add New Discount Code', 'pmpro');?></a>
530
- </h2>
531
-
532
- <?php if(!empty($pmpro_msg)) { ?>
533
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
534
- <?php } ?>
535
-
536
- <form id="posts-filter" method="get" action="">
537
- <p class="search-box">
538
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Discount Codes', 'pmpro');?>:</label>
539
- <input type="hidden" name="page" value="pmpro-discountcodes" />
540
- <input id="post-search-input" type="text" value="<?php if(!empty($s)) echo $s;?>" name="s" size="30" />
541
- <input class="button" type="submit" value="<?php _e('Search', 'pmpro');?>" id="search-submit "/>
542
- </p>
543
- </form>
544
-
545
- <br class="clear" />
546
- <?php
547
- $sqlQuery = "SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes ";
548
- if(!empty($s))
549
- $sqlQuery .= "WHERE code LIKE '%$s%' ";
550
- $sqlQuery .= "ORDER BY id ASC";
551
-
552
- $codes = $wpdb->get_results($sqlQuery, OBJECT);
553
- ?>
554
- <table class="widefat">
555
- <thead>
556
- <tr>
557
- <th><?php _e('ID', 'pmpro');?></th>
558
- <th><?php _e('Code', 'pmpro');?></th>
559
- <th><?php _e('Starts', 'pmpro');?></th>
560
- <th><?php _e('Expires', 'pmpro');?></th>
561
- <th><?php _e('Uses', 'pmpro');?></th>
562
- <th><?php _e('Levels', 'pmpro');?></th>
563
- <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
564
- <th></th>
565
- <th></th>
566
- </tr>
567
- </thead>
568
- <tbody>
569
- <?php
570
- if(!$codes)
571
- {
572
- ?>
573
- <tr><td colspan="7" class="pmpro_pad20">
574
- <p><?php _e('Discount codes allow you to offer your memberships at discounted prices to select customers.', 'pmpro');?> <a href="admin.php?page=pmpro-discountcodes&edit=-1"><?php _e('Create your first discount code now', 'pmpro');?></a>.</p>
575
- </td></tr>
576
- <?php
577
- }
578
- else
579
- {
580
- foreach($codes as $code)
581
- {
582
- ?>
583
- <tr>
584
- <td><?php echo $code->id?></td>
585
- <td>
586
- <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php echo $code->code?></a>
587
- </td>
588
- <td>
589
- <?php echo date(get_option('date_format'), $code->starts)?>
590
- </td>
591
- <td>
592
- <?php echo date(get_option('date_format'), $code->expires)?>
593
- </td>
594
- <td>
595
- <?php
596
- $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
597
- if($code->uses > 0)
598
- echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
599
- else
600
- echo "<strong>" . (int)$uses . "</strong>/unlimited";
601
- ?>
602
- </td>
603
- <td>
604
- <?php
605
- $sqlQuery = "SELECT l.id, l.name FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->id . "'";
606
- $levels = $wpdb->get_results($sqlQuery);
607
-
608
- $level_names = array();
609
- foreach($levels as $level)
610
- $level_names[] = "<a target=\"_blank\" href=\"" . pmpro_url("checkout", "?level=" . $level->id . "&discount_code=" . $code->code) . "\">" . $level->name . "</a>";
611
- if($level_names)
612
- echo implode(", ", $level_names);
613
- else
614
- echo "None";
615
- ?>
616
- </td>
617
- <?php do_action("pmpro_discountcodes_extra_cols_body", $code);?>
618
- <td>
619
- <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php _e('edit', 'pmpro');?></a>
620
- </td>
621
- <td>
622
- <a href="javascript:askfirst('<?php printf(__('Are you sure you want to delete the %s discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', 'pmpro'), $code->code);?>', '?page=pmpro-discountcodes&delete=<?php echo $code->id?>'); void(0);"><?php _e('delete', 'pmpro');?></a>
623
- </td>
624
- </tr>
625
- <?php
626
- }
627
- }
628
- ?>
629
- </tbody>
630
- </table>
631
-
632
- <?php } ?>
633
-
634
- <?php
635
- require_once(dirname(__FILE__) . "/admin_footer.php");
636
- ?>
 
 
 
 
1
+ <?php
2
+ //vars
3
+ global $wpdb, $pmpro_currency_symbol;
4
+
5
+ if(isset($_REQUEST['edit']))
6
+ $edit = $_REQUEST['edit'];
7
+ else
8
+ $edit = false;
9
+
10
+ if(isset($_REQUEST['delete']))
11
+ $delete = $_REQUEST['delete'];
12
+ else
13
+ $delete = false;
14
+
15
+ if(isset($_REQUEST['saveid']))
16
+ $saveid = $_POST['saveid'];
17
+ else
18
+ $saveid = false;
19
+
20
+ if($saveid)
21
+ {
22
+ //get vars
23
+ $code = $_POST['code'];
24
+ $starts_month = $_POST['starts_month'];
25
+ $starts_day = $_POST['starts_day'];
26
+ $starts_year = $_POST['starts_year'];
27
+ $expires_month = $_POST['expires_month'];
28
+ $expires_day = $_POST['expires_day'];
29
+ $expires_year = $_POST['expires_year'];
30
+ $uses = $_POST['uses'];
31
+
32
+ //fix up dates
33
+ $starts = date("Y-m-d", strtotime($starts_month . "/" . $starts_day . "/" . $starts_year));
34
+ $expires = date("Y-m-d", strtotime($expires_month . "/" . $expires_day . "/" . $expires_year));
35
+
36
+ //updating or new?
37
+ if($saveid > 0)
38
+ {
39
+ $sqlQuery = "UPDATE $wpdb->pmpro_discount_codes SET code = '" . $wpdb->escape($code) . "', starts = '" . $starts . "', expires = '" . $expires . "', uses = '" . $uses . "' WHERE id = '" . $saveid . "' LIMIT 1";
40
+ if($wpdb->query($sqlQuery) !== false)
41
+ {
42
+ $pmpro_msg = "Discount code updated successfully.";
43
+ $pmpro_msgt = "success";
44
+ $saved = true;
45
+ $edit = $saveid;
46
+ }
47
+ else
48
+ {
49
+ $pmpro_msg = "Error updating discount code. That code may already be in use.";
50
+ $pmpro_msgt = "error";
51
+ }
52
+ }
53
+ else
54
+ {
55
+ $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes (id, code, starts, expires, uses) VALUES('', '" . $wpdb->escape($code) . "', '" . $starts . "', '" . $expires . "', '" . $uses . "')";
56
+ if($wpdb->query($sqlQuery) !== false)
57
+ {
58
+ $pmpro_msg = "Discount code added successfully.";
59
+ $pmpro_msgt = "success";
60
+ $saved = true;
61
+ $edit = $wpdb->insert_id;
62
+ }
63
+ else
64
+ {
65
+ $pmpro_msg = "Error adding discount code. That code may already be in use.";
66
+ $pmpro_msgt = "error";
67
+ }
68
+ }
69
+
70
+ //now add the membership level rows
71
+ if($saved && $edit > 0)
72
+ {
73
+ //get the submitted values
74
+ $all_levels_a = $_REQUEST['all_levels'];
75
+ if(!empty($_REQUEST['levels']))
76
+ $levels_a = $_REQUEST['levels'];
77
+ else
78
+ $levels_a = array();
79
+ $initial_payment_a = $_REQUEST['initial_payment'];
80
+ $recurring_a = $_REQUEST['recurring'];
81
+ $billing_amount_a = $_REQUEST['billing_amount'];
82
+ $cycle_number_a = $_REQUEST['cycle_number'];
83
+ $cycle_period_a = $_REQUEST['cycle_period'];
84
+ $billing_limit_a = $_REQUEST['billing_limit'];
85
+ if(!empty($_REQUEST['custom_trial']))
86
+ $custom_trial_a = $_REQUEST['custom_trial'];
87
+ $trial_amount_a = $_REQUEST['trial_amount'];
88
+ $trial_limit_a = $_REQUEST['trial_limit'];
89
+ $expiration_a = $_REQUEST['expiration'];
90
+ $expiration_number_a = $_REQUEST['expiration_number'];
91
+ $expiration_period_a = $_REQUEST['expiration_period'];
92
+
93
+ //clear the old rows
94
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $edit . "'";
95
+ $wpdb->query($sqlQuery);
96
+
97
+ //add a row for each checked level
98
+ if(!empty($levels_a))
99
+ {
100
+ foreach($levels_a as $level_id)
101
+ {
102
+ //get the values ready
103
+ $n = array_search($level_id, $all_levels_a); //this is the key location of this level's values
104
+ $initial_payment = $initial_payment_a[$n];
105
+
106
+ //is this recurring?
107
+ if($recurring_a)
108
+ {
109
+ if(in_array($level_id, $recurring_a))
110
+ $recurring = 1;
111
+ else
112
+ $recurring = 0;
113
+ }
114
+ else
115
+ $recurring = 0;
116
+
117
+ if($recurring)
118
+ {
119
+ $billing_amount = $billing_amount_a[$n];
120
+ $cycle_number = $cycle_number_a[$n];
121
+ $cycle_period = $cycle_period_a[$n];
122
+ $billing_limit = $billing_limit_a[$n];
123
+
124
+ //custom trial
125
+ if(!empty($custom_trial_a))
126
+ {
127
+ if(in_array($level_id, $custom_trial_a))
128
+ $custom_trial = 1;
129
+ else
130
+ $custom_trial = 0;
131
+ }
132
+ else
133
+ $custom_trial = 0;
134
+
135
+ if(!empty($custom_trial))
136
+ {
137
+ $trial_amount = $trial_amount_a[$n];
138
+ $trial_limit = $trial_limit_a[$n];
139
+ }
140
+ else
141
+ {
142
+ $trial_amount = '';
143
+ $trial_limit = '';
144
+ }
145
+ }
146
+ else
147
+ {
148
+ $billing_amount = '';
149
+ $cycle_number = '';
150
+ $cycle_period = '';
151
+ $billing_limit = '';
152
+ $custom_trial = 0;
153
+ $trial_amount = '';
154
+ $trial_limit = '';
155
+ }
156
+
157
+ if(!empty($expiration_a))
158
+ {
159
+ if(in_array($level_id, $expiration_a))
160
+ $expiration = 1;
161
+ else
162
+ $expiration = 0;
163
+ }
164
+ else
165
+ $expiration = 0;
166
+
167
+ if(!empty($expiration))
168
+ {
169
+ $expiration_number = $expiration_number_a[$n];
170
+ $expiration_period = $expiration_period_a[$n];
171
+ }
172
+ else
173
+ {
174
+ $expiration_number = '';
175
+ $expiration_period = '';
176
+ }
177
+
178
+ //okay, do the insert
179
+ $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes_levels (code_id, level_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period) VALUES('" . $wpdb->escape($edit) . "', '" . $wpdb->escape($level_id) . "', '" . $wpdb->escape($initial_payment) . "', '" . $wpdb->escape($billing_amount) . "', '" . $wpdb->escape($cycle_number) . "', '" . $wpdb->escape($cycle_period) . "', '" . $wpdb->escape($billing_limit) . "', '" . $wpdb->escape($trial_amount) . "', '" . $wpdb->escape($trial_limit) . "', '" . $wpdb->escape($expiration_number) . "', '" . $wpdb->escape($expiration_period) . "')";
180
+
181
+ if($wpdb->query($sqlQuery) !== false)
182
+ {
183
+ //okay
184
+ do_action("pmpro_save_discount_code_level", $saveid, $level_id);
185
+ }
186
+ else
187
+ {
188
+ $level_errors[] = "Error saving values for the " . $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1") . " level.";
189
+ }
190
+ }
191
+ }
192
+
193
+ //errors?
194
+ if(!empty($level_errors))
195
+ {
196
+ $pmpro_msg = "There were errors updating the level values: " . explode(" ", $level_errors);
197
+ $pmpro_msgt = "error";
198
+ }
199
+ else
200
+ {
201
+ //all good. set edit = NULL so we go back to the overview page
202
+ $edit = NULL;
203
+
204
+ do_action("pmpro_save_discount_code", $saveid);
205
+ }
206
+ }
207
+ }
208
+
209
+ //are we deleting?
210
+ if(!empty($delete))
211
+ {
212
+ //is this a code?
213
+ $code = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
214
+ if(!empty($code))
215
+ {
216
+ //delete the code levels
217
+ $r1 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $delete . "'");
218
+
219
+ if($r1 !== false)
220
+ {
221
+ //delete the code
222
+ $r2 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
223
+
224
+ if($r2 !== false)
225
+ {
226
+ $pmpro_msg = "Code $code deleted successfully.";
227
+ $pmpro_msgt = "success";
228
+ }
229
+ else
230
+ {
231
+ $pmpro_msg = "Error deleting discount code. The code was only partially deleted. Please try again.";
232
+ $pmpro_msgt = "error";
233
+ }
234
+ }
235
+ else
236
+ {
237
+ $pmpro_msg = "Error deleting code. Please try again.";
238
+ $pmpro_msgt = "error";
239
+ }
240
+ }
241
+ else
242
+ {
243
+ $pmpro_msg = "Code not found.";
244
+ $pmpro_msgt = "error";
245
+ }
246
+ }
247
+ ?>
248
+ <div class="wrap pmpro_admin">
249
+ <div class="pmpro_banner">
250
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
251
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
252
+
253
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
254
+ </div>
255
+ <br style="clear:both;" />
256
+
257
+ <?php
258
+ //include(pmpro_https_filter("http://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION));
259
+ ?>
260
+ <div id="pmpro_notifications">
261
+ </div>
262
+ <script>
263
+ jQuery.get('<?php echo pmpro_https_filter("http://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION)?>', function(data) {
264
+ jQuery('#pmpro_notifications').html(data);
265
+ });
266
+ </script>
267
+
268
+ <?php if($edit) { ?>
269
+
270
+ <h2>
271
+ <?php
272
+ if($edit > 0)
273
+ echo "Edit Discount Code";
274
+ else
275
+ echo "Add New Discount Code";
276
+ ?>
277
+ </h2>
278
+
279
+ <?php if(!empty($pmpro_msg)) { ?>
280
+ <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
281
+ <?php } ?>
282
+
283
+ <div>
284
+ <?php
285
+ // get the code...
286
+ if($edit > 0)
287
+ {
288
+ $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $edit . "' LIMIT 1", OBJECT);
289
+ $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
290
+ $levels = $wpdb->get_results("SELECT l.id, l.name, cl.initial_payment, cl.billing_amount, cl.cycle_number, cl.period, cl.billing_limit, cl.trial_amount, cl.trial_limit FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->code . "'");
291
+ $temp_id = $code->id;
292
+ }
293
+ elseif(!empty($copy) && $copy > 0)
294
+ {
295
+ $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $copy . "' LIMIT 1", OBJECT);
296
+ $temp_id = $level->id;
297
+ $level->id = NULL;
298
+ }
299
+
300
+ // didn't find a discount code, let's add a new one...
301
+ if(empty($code->id)) $edit = -1;
302
+
303
+ //defaults for new codes
304
+ if($edit == -1)
305
+ {
306
+ $code = NULL;
307
+ $code->code = pmpro_getDiscountCode();
308
+ }
309
+ ?>
310
+ <form action="" method="post">
311
+ <input name="saveid" type="hidden" value="<?php echo $edit?>" />
312
+ <table class="form-table">
313
+ <tbody>
314
+ <tr>
315
+ <th scope="row" valign="top"><label>ID:</label></th>
316
+ <td class="pmpro_lite"><?php if(!empty($code->id)) echo $code->id; else echo "This will be generated when you save.";?></td>
317
+ </tr>
318
+
319
+ <tr>
320
+ <th scope="row" valign="top"><label for="code">Code:</label></th>
321
+ <td><input name="code" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($code->code))?>" /></td>
322
+ </tr>
323
+
324
+ <?php
325
+ //some vars for the dates
326
+ $current_day = date("j");
327
+ if(!empty($code->starts))
328
+ $selected_starts_day = date("j", $code->starts);
329
+ else
330
+ $selected_starts_day = $current_day;
331
+ if(!empty($code->expires))
332
+ $selected_expires_day = date("j", $code->expires);
333
+ else
334
+ $selected_expires_day = $current_day;
335
+
336
+ $current_month = date("M");
337
+ if(!empty($code->starts))
338
+ $selected_starts_month = date("m", $code->starts);
339
+ else
340
+ $selected_starts_month = date("m");
341
+ if(!empty($code->expires))
342
+ $selected_expires_month = date("m", $code->expires);
343
+ else
344
+ $selected_expires_month = date("m");
345
+
346
+ $current_year = date("Y");
347
+ if(!empty($code->starts))
348
+ $selected_starts_year = date("Y", $code->starts);
349
+ else
350
+ $selected_starts_year = $current_year;
351
+ if(!empty($code->expires))
352
+ $selected_expires_year = date("Y", $code->expires);
353
+ else
354
+ $selected_expires_year = (int)$current_year + 1;
355
+ ?>
356
+
357
+ <tr>
358
+ <th scope="row" valign="top"><label for="starts">Start Date:</label></th>
359
+ <td>
360
+ <select name="starts_month">
361
+ <?php
362
+ for($i = 1; $i < 13; $i++)
363
+ {
364
+ ?>
365
+ <option value="<?php echo $i?>" <?php if($i == $selected_starts_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year))?></option>
366
+ <?php
367
+ }
368
+ ?>
369
+ </select>
370
+ <input name="starts_day" type="text" size="2" value="<?php echo $selected_starts_day?>" />
371
+ <input name="starts_year" type="text" size="4" value="<?php echo $selected_starts_year?>" />
372
+ </td>
373
+ </tr>
374
+
375
+ <tr>
376
+ <th scope="row" valign="top"><label for="expires">Expiration Date:</label></th>
377
+ <td>
378
+ <select name="expires_month">
379
+ <?php
380
+ for($i = 1; $i < 13; $i++)
381
+ {
382
+ ?>
383
+ <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year))?></option>
384
+ <?php
385
+ }
386
+ ?>
387
+ </select>
388
+ <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
389
+ <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
390
+ </td>
391
+ </tr>
392
+
393
+ <tr>
394
+ <th scope="row" valign="top"><label for="uses">Uses:</label></th>
395
+ <td>
396
+ <input name="uses" type="text" size="10" value="<?php if(!empty($code->uses)) echo str_replace("\"", "&quot;", stripslashes($code->uses));?>" />
397
+ <small class="pmpro_lite">Leave blank for unlimited uses.</small>
398
+ </td>
399
+ </tr>
400
+
401
+ </tbody>
402
+ </table>
403
+
404
+ <?php do_action("pmpro_discount_code_after_settings"); ?>
405
+
406
+ <h3>Which Levels Will This Code Apply To?</h3>
407
+
408
+ <div class="pmpro_discount_levels">
409
+ <?php
410
+ $levels = $wpdb->get_results("SELECT * FROM $wpdb->pmpro_membership_levels");
411
+ foreach($levels as $level)
412
+ {
413
+ //if this level is already managed for this discount code, use the code values
414
+ if($edit > 0)
415
+ {
416
+ $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $edit . "' AND cl.level_id = '" . $level->id . "' LIMIT 1");
417
+ if($code_level)
418
+ {
419
+ $level = $code_level;
420
+ $level->checked = true;
421
+ }
422
+ else
423
+ $level_checked = false;
424
+ }
425
+ else
426
+ $level_checked = false;
427
+ ?>
428
+ <div>
429
+ <input type="hidden" name="all_levels[]" value="<?php echo $level->id?>" />
430
+ <input type="checkbox" name="levels[]" value="<?php echo $level->id?>" <?php if(!empty($level->checked)) { ?>checked="checked"<?php } ?> onclick="if(jQuery(this).is(':checked')) jQuery(this).next().show(); else jQuery(this).next().hide();" />
431
+ <?php echo $level->name?>
432
+ <div class="pmpro_discount_levels_pricing level_<?php echo $level->id?>" <?php if(empty($level->checked)) { ?>style="display: none;"<?php } ?>>
433
+ <table class="form-table">
434
+ <tbody>
435
+ <tr>
436
+ <th scope="row" valign="top"><label for="initial_payment">Initial Payment:</label></th>
437
+ <td><?php echo $pmpro_currency_symbol?><input name="initial_payment[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small>The initial amount collected at registration.</small></td>
438
+ </tr>
439
+
440
+ <tr>
441
+ <th scope="row" valign="top"><label>Recurring Subscription:</label></th>
442
+ <td><input class="recurring_checkbox" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <small>Check if this level has a recurring subscription payment.</small></td>
443
+ </tr>
444
+
445
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
446
+ <th scope="row" valign="top"><label for="billing_amount">Billing Amount:</label></th>
447
+ <td>
448
+ <?php echo $pmpro_currency_symbol?><input name="billing_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
449
+ <input name="cycle_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
450
+ <select name="cycle_period[]" onchange="updateCyclePeriod();">
451
+ <?php
452
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
453
+ foreach ( $cycles as $name => $value ) {
454
+ echo "<option value='$value'";
455
+ if ( $level->cycle_period == $value ) echo " selected='selected'";
456
+ echo ">$name</option>";
457
+ }
458
+ ?>
459
+ </select>
460
+ <br /><small>The amount to be billed one cycle after the initial payment.</small>
461
+ </td>
462
+ </tr>
463
+
464
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
465
+ <th scope="row" valign="top"><label for="billing_limit">Billing Cycle Limit:</label></th>
466
+ <td>
467
+ <input name="billing_limit[]" type="text" size="20" value="<?php echo $level->billing_limit?>" />
468
+ <br /><small>The <strong>total</strong> number of billing cycles for this level, including the trial period (if applicable). Set to zero if membership is indefinite.</small>
469
+ </td>
470
+ </tr>
471
+
472
+ <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
473
+ <th scope="row" valign="top"><label>Custom Trial:</label></th>
474
+ <td><input id="custom_trial_<?php echo $level->id?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> Check to add a custom trial period.</td>
475
+ </tr>
476
+
477
+ <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
478
+ <th scope="row" valign="top"><label for="trial_amount">Trial Billing Amount:</label></th>
479
+ <td>
480
+ <?php echo $pmpro_currency_symbol?><input name="trial_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
481
+ <small>for the first</small>
482
+ <input name="trial_limit[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
483
+ <small>subscription payments.</small>
484
+ </td>
485
+ </tr>
486
+
487
+ <tr>
488
+ <th scope="row" valign="top"><label>Membership Expiration:</label></th>
489
+ <td><input id="expiration" name="expiration[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).is(':checked')) { jQuery(this).parent().parent().siblings('.expiration_info').show(); } else { jQuery(this).parent().parent().siblings('.expiration_info').hide();}" /> <small>Check this to set an expiration date for new sign ups.</small></td>
490
+ </tr>
491
+
492
+ <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
493
+ <th scope="row" valign="top"><label for="billing_amount">Expire In:</label></th>
494
+ <td>
495
+ <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
496
+ <select id="expiration_period" name="expiration_period[]">
497
+ <?php
498
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
499
+ foreach ( $cycles as $name => $value ) {
500
+ echo "<option value='$value'";
501
+ if ( $level->expiration_period == $value ) echo " selected='selected'";
502
+ echo ">$name</option>";
503
+ }
504
+ ?>
505
+ </select>
506
+ <br /><small>How long before the expiration expires. Not that any future payments will be canceled when the membership expires.</small>
507
+ </td>
508
+ </tr>
509
+ </tbody>
510
+ </table>
511
+
512
+ <?php do_action("pmpro_discount_code_after_level_settings", $edit, $level); ?>
513
+
514
+ </div>
515
+ </div>
516
+ <script>
517
+
518
+ </script>
519
+ <?php
520
+ }
521
+ ?>
522
+ </div>
523
+
524
+ <p class="submit topborder">
525
+ <input name="save" type="submit" class="button-primary" value="Save Code" />
526
+ <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes')?>';" />
527
+ </p>
528
+ </form>
529
+ </div>
530
+
531
+ <?php } else { ?>
532
+
533
+ <h2>
534
+ Memberships Discount Codes
535
+ <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="button add-new-h2">Add New Discount Code</a>
536
+ </h2>
537
+
538
+ <?php if(!empty($pmpro_msg)) { ?>
539
+ <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
540
+ <?php } ?>
541
+
542
+ <form id="posts-filter" method="get" action="">
543
+ <p class="search-box">
544
+ <label class="screen-reader-text" for="post-search-input">Search Discount Codes:</label>
545
+ <input type="hidden" name="page" value="pmpro-discountcodes" />
546
+ <input id="post-search-input" type="text" value="<?php if(!empty($s)) echo $s;?>" name="s" size="30" />
547
+ <input class="button" type="submit" value="Search" id="search-submit "/>
548
+ </p>
549
+ </form>
550
+
551
+ <br class="clear" />
552
+
553
+ <table class="widefat">
554
+ <thead>
555
+ <tr>
556
+ <th>ID</th>
557
+ <th>Code</th>
558
+ <th>Starts</th>
559
+ <th>Expires</th>
560
+ <th>Uses</th>
561
+ <th>Levels</th>
562
+ <th></th>
563
+ <th></th>
564
+ </tr>
565
+ </thead>
566
+ <tbody>
567
+ <?php
568
+ $sqlQuery = "SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes ";
569
+ if(!empty($s))
570
+ $sqlQuery .= "WHERE code LIKE '%$s%' ";
571
+ $sqlQuery .= "ORDER BY id ASC";
572
+
573
+ $codes = $wpdb->get_results($sqlQuery, OBJECT);
574
+
575
+ if(!$codes)
576
+ {
577
+ ?>
578
+ <tr><td colspan="7" class="pmpro_pad20">
579
+ <p>Discount codes allow you to offer your memberships at discounted prices to select customers. <a href="admin.php?page=pmpro-discountcodes&edit=-1">Create your first discount code now</a>.</p>
580
+ </td></tr>
581
+ <?php
582
+ }
583
+ else
584
+ {
585
+ foreach($codes as $code)
586
+ {
587
+ ?>
588
+ <tr>
589
+ <td><?php echo $code->id?></td>
590
+ <td>
591
+ <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php echo $code->code?></a>
592
+ </td>
593
+ <td>
594
+ <?php echo date("m/d/Y", $code->starts)?>
595
+ </td>
596
+ <td>
597
+ <?php echo date("m/d/Y", $code->expires)?>
598
+ </td>
599
+ <td>
600
+ <?php
601
+ $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
602
+ if($code->uses > 0)
603
+ echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
604
+ else
605
+ echo "<strong>" . (int)$uses . "</strong>/unlimited";
606
+ ?>
607
+ </td>
608
+ <td>
609
+ <?php
610
+ $sqlQuery = "SELECT l.id, l.name FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->id . "'";
611
+ $levels = $wpdb->get_results($sqlQuery);
612
+
613
+ $level_names = array();
614
+ foreach($levels as $level)
615
+ $level_names[] = "<a target=\"_blank\" href=\"" . pmpro_url("checkout", "?level=" . $level->id . "&discount_code=" . $code->code) . "\">" . $level->name . "</a>";
616
+ if($level_names)
617
+ echo implode(", ", $level_names);
618
+ else
619
+ echo "None";
620
+ ?>
621
+ </td>
622
+ <td>
623
+ <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>">edit</a>
624
+ </td>
625
+ <td>
626
+ <a href="javascript:askfirst('Are you sure you want to delete the <?php echo $code->code?> discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', '?page=pmpro-discountcodes&delete=<?php echo $code->id?>'); void(0);">delete</a>
627
+ </td>
628
+ </tr>
629
+ <?php
630
+ }
631
+ }
632
+ ?>
633
+ </tbody>
634
+ </table>
635
+
636
+ <?php } ?>
637
+
638
+ </div>
639
+ <?php
640
+ ?>
adminpages/emailsettings.php CHANGED
@@ -1,181 +1,126 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_emailsettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt;
9
-
10
- //get/set settings
11
- global $pmpro_pages;
12
- if(!empty($_REQUEST['savesettings']))
13
- {
14
- //email options
15
- pmpro_setOption("from_email");
16
- pmpro_setOption("from_name");
17
- pmpro_setOption("only_filter_pmpro_emails");
18
-
19
- pmpro_setOption("email_admin_checkout");
20
- pmpro_setOption("email_admin_changes");
21
- pmpro_setOption("email_admin_cancels");
22
- pmpro_setOption("email_admin_billing");
23
-
24
- pmpro_setOption("email_member_notification");
25
-
26
- //assume success
27
- $msg = true;
28
- $msgt = "Your email settings have been updated.";
29
- }
30
-
31
- $from_email = pmpro_getOption("from_email");
32
- $from_name = pmpro_getOption("from_name");
33
- $only_filter_pmpro_emails = pmpro_getOption("only_filter_pmpro_emails");
34
-
35
- $email_admin_checkout = pmpro_getOption("email_admin_checkout");
36
- $email_admin_changes = pmpro_getOption("email_admin_changes");
37
- $email_admin_cancels = pmpro_getOption("email_admin_cancels");
38
- $email_admin_billing = pmpro_getOption("email_admin_billing");
39
-
40
- $email_member_notification = pmpro_getOption("email_member_notification");
41
-
42
- if(empty($from_email))
43
- {
44
- $parsed = parse_url(home_url());
45
- $hostname = $parsed[host];
46
- $hostparts = split("\.", $hostname);
47
- $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
48
- $from_email = "wordpress@" . $email_domain;
49
- pmpro_setOption("from_email", $from_email);
50
- }
51
-
52
- if(empty($from_name))
53
- {
54
- $from_name = "WordPress";
55
- pmpro_setOption("from_name", $from_name);
56
- }
57
-
58
- // default from email wordpress@sitename
59
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
60
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
61
- $sitename = substr( $sitename, 4 );
62
- }
63
- $default_from_email = 'wordpress@' . $sitename;
64
-
65
- require_once(dirname(__FILE__) . "/admin_header.php");
66
- ?>
67
-
68
- <form action="" method="post" enctype="multipart/form-data">
69
- <h2><?php _e('Email Settings', 'pmpro');?></h2>
70
- <p><?php _e('By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below.', 'pmpro');?></p>
71
-
72
- <p><?php _e('To modify the appearance of system generated emails, add the files <em>email_header.html</em> and <em>email_footer.html</em> to your theme\'s directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. <a title="Paid Memberships Pro - Member Communications" target="_blank" href="http://www.paidmembershipspro.com/documentation/member-communications/">Click here to learn more about Paid Memberships Pro emails</a>.', 'pmpro');?></p>
73
-
74
- <table class="form-table">
75
- <tbody>
76
- <tr>
77
- <th scope="row" valign="top">
78
- <label for="from_email"><?php _e('From Email', 'pmpro');?>:</label>
79
- </th>
80
- <td>
81
- <input type="text" name="from_email" size="60" value="<?php echo $from_email?>" />
82
- </td>
83
- </tr>
84
- <tr>
85
- <th scope="row" valign="top">
86
- <label for="from_name"><?php _e('From Name', 'pmpro');?>:</label>
87
- </th>
88
- <td>
89
- <input type="text" name="from_name" size="60" value="<?php echo $from_name?>" />
90
- </td>
91
- </tr>
92
- <tr>
93
- <th scope="row" valign="top">
94
- <label for="only_filter_pmpro_emails"><?php _e('Only Filter PMPro Emails?', 'pmpro');?>:</label>
95
- </th>
96
- <td>
97
- <input type="checkbox" id="only_filter_pmpro_emails" name="only_filter_pmpro_emails" value="1" <?php if(!empty($only_filter_pmpro_emails)) { ?>checked="checked"<?php } ?> />
98
- <?php _e('If unchecked, all emails from "WordPress &lt;' . $default_from_email . '&gt;" will be filtered to use the above settings.', 'pmpro');?>
99
- </td>
100
- </tr>
101
- </tbody>
102
- </table>
103
-
104
- <?php /* going to put something like this here in next version
105
- <h3><?php _e('Modify System-generated Email Templates', 'pmpro');?>:</h3>
106
- <?php
107
- if (function_exists('pmproet_scripts'))
108
- {
109
- _e('You have installed the PMPro Email Templates add on. <a href="' . admin_url('admin.php?page=pmpro-email-templates') . '">Click here to modify email templates</a>');
110
- }
111
- ?>
112
- <p><?php _e('To modify the subject line and body content of system generated emails, <a title="Paid Memberships Pro - Email Templates Plugin" target="_blank" href="' . wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-email-templates-addon'), 'install-plugin_pmpro-email-templates-addon') . '">Install and Activate the PMPro Email Templates add on</a>.', 'pmpro'); ?></p>
113
- */ ?>
114
-
115
- <h3><?php _e('Send the site admin emails', 'pmpro');?>:</h3>
116
-
117
- <table class="form-table">
118
- <tbody>
119
- <tr>
120
- <th scope="row" valign="top">
121
- <label for="email_admin_checkout"><?php _e('Checkout', 'pmpro');?>:</label>
122
- </th>
123
- <td>
124
- <input type="checkbox" id="email_admin_checkout" name="email_admin_checkout" value="1" <?php if(!empty($email_admin_checkout)) { ?>checked="checked"<?php } ?> />
125
- <?php _e('when a member checks out.', 'pmpro');?>
126
- </td>
127
- </tr>
128
- <tr>
129
- <th scope="row" valign="top">
130
- <label for="email_admin_changes"><?php _e('Admin Changes', 'pmpro');?>:</label>
131
- </th>
132
- <td>
133
- <input type="checkbox" id="email_admin_changes" name="email_admin_changes" value="1" <?php if(!empty($email_admin_changes)) { ?>checked="checked"<?php } ?> />
134
- <?php _e('when an admin changes a user\'s membership level through the dashboard.', 'pmpro');?>
135
- </td>
136
- </tr>
137
- <tr>
138
- <th scope="row" valign="top">
139
- <label for="email_admin_cancels"><?php _e('Cancellation', 'pmpro');?>:</label>
140
- </th>
141
- <td>
142
- <input type="checkbox" id="email_admin_cancels" name="email_admin_cancels" value="1" <?php if(!empty($email_admin_cancels)) { ?>checked="checked"<?php } ?> />
143
- <?php _e('when a user cancels his or her account.', 'pmpro');?>
144
- </td>
145
- </tr>
146
- <tr>
147
- <th scope="row" valign="top">
148
- <label for="email_admin_billing"><?php _e('Bill Updates', 'pmpro');?>:</label>
149
- </th>
150
- <td>
151
- <input type="checkbox" id="email_admin_billing" name="email_admin_billing" value="1" <?php if(!empty($email_admin_billing)) { ?>checked="checked"<?php } ?> />
152
- <?php _e('when a user updates his or her billing information.', 'pmpro');?>
153
- </td>
154
- </tr>
155
- </tbody>
156
- </table>
157
-
158
- <h3><?php _e('Send members emails', 'pmpro');?>:</h3>
159
-
160
- <table class="form-table">
161
- <tbody>
162
- <tr>
163
- <th scope="row" valign="top">
164
- <label for="email_admin_checkout"><?php _e('New Users', 'pmpro');?>:</label>
165
- </th>
166
- <td>
167
- <input type="checkbox" id="email_member_notification" name="email_member_notification" value="1" <?php if(!empty($email_member_notification)) { ?>checked="checked"<?php } ?> />
168
- <?php _e('Default WP notification email. (Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.)', 'pmpro');?>
169
- </td>
170
- </tr>
171
- </tbody>
172
- </table>
173
-
174
- <p class="submit">
175
- <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
176
- </p>
177
- </form>
178
-
179
- <?php
180
- require_once(dirname(__FILE__) . "/admin_footer.php");
181
- ?>
1
+ <?php
2
+ global $wpdb, $msg, $msgt;
3
+
4
+ //get/set settings
5
+ global $pmpro_pages;
6
+ if(!empty($_REQUEST['savesettings']))
7
+ {
8
+ //email options
9
+ pmpro_setOption("from_email");
10
+ pmpro_setOption("from_name");
11
+
12
+ pmpro_setOption("email_admin_checkout");
13
+ pmpro_setOption("email_admin_changes");
14
+ pmpro_setOption("email_admin_cancels");
15
+ pmpro_setOption("email_admin_billing");
16
+
17
+ //assume success
18
+ $msg = true;
19
+ $msgt = "Your email settings have been updated.";
20
+ }
21
+
22
+ $from_email = pmpro_getOption("from_email");
23
+ $from_name = pmpro_getOption("from_name");
24
+
25
+ $email_admin_checkout = pmpro_getOption("email_admin_checkout");
26
+ $email_admin_changes = pmpro_getOption("email_admin_changes");
27
+ $email_admin_cancels = pmpro_getOption("email_admin_cancels");
28
+ $email_admin_billing = pmpro_getOption("email_admin_billing");
29
+
30
+ if(empty($from_email))
31
+ {
32
+ $parsed = parse_url(home_url());
33
+ $hostname = $parsed[host];
34
+ $hostparts = split("\.", $hostname);
35
+ $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
36
+ $from_email = "wordpress@" . $email_domain;
37
+ pmpro_setOption("from_email", $from_email);
38
+ }
39
+
40
+ if(empty($from_name))
41
+ {
42
+ $from_name = "WordPress";
43
+ pmpro_setOption("from_name", $from_name);
44
+ }
45
+
46
+ require_once(dirname(__FILE__) . "/admin_header.php");
47
+ ?>
48
+
49
+ <form action="" method="post" enctype="multipart/form-data">
50
+ <h2>Email Settings</h2>
51
+ <p>By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below.</p>
52
+
53
+ <p>To modify the appearance of system generated emails, add the files <em>email_header.html</em> and <em>email_footer.html</em> to your theme's directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. <a title="Paid Memberships Pro - Member Communications" target="_blank" href="http://www.paidmembershipspro.com/support/member-communications/">Click here to learn more about Paid Memberships Pro emails</a>.</p>
54
+
55
+ <table class="form-table">
56
+ <tbody>
57
+ <tr>
58
+ <th scope="row" valign="top">
59
+ <label for="from_email">From Email:</label>
60
+ </th>
61
+ <td>
62
+ <input type="text" name="from_email" size="60" value="<?php echo $from_email?>" />
63
+ </td>
64
+ </tr>
65
+ <tr>
66
+ <th scope="row" valign="top">
67
+ <label for="from_name">From Name:</label>
68
+ </th>
69
+ <td>
70
+ <input type="text" name="from_name" size="60" value="<?php echo $from_name?>" />
71
+ </td>
72
+ </tr>
73
+ </tbody>
74
+ </table>
75
+
76
+ <h3>Send the site admin emails:</h3>
77
+
78
+ <table class="form-table">
79
+ <tbody>
80
+ <tr>
81
+ <th scope="row" valign="top">
82
+ <label for="email_admin_checkout">Checkout:</label>
83
+ </th>
84
+ <td>
85
+ <input type="checkbox" id="email_admin_checkout" name="email_admin_checkout" value="1" <?php if(!empty($email_admin_checkout)) { ?>checked="checked"<?php } ?> />
86
+ when a member checks out.
87
+ </td>
88
+ </tr>
89
+ <tr>
90
+ <th scope="row" valign="top">
91
+ <label for="email_admin_changes">Admin Changes:</label>
92
+ </th>
93
+ <td>
94
+ <input type="checkbox" id="email_admin_changes" name="email_admin_changes" value="1" <?php if(!empty($email_admin_changes)) { ?>checked="checked"<?php } ?> />
95
+ when an admin changes a user's membership level through the dashboard.
96
+ </td>
97
+ </tr>
98
+ <tr>
99
+ <th scope="row" valign="top">
100
+ <label for="email_admin_cancels">Cancellation:</label>
101
+ </th>
102
+ <td>
103
+ <input type="checkbox" id="email_admin_cancels" name="email_admin_cancels" value="1" <?php if(!empty($email_admin_cancels)) { ?>checked="checked"<?php } ?> />
104
+ when a user cancel's his or her account.
105
+ </td>
106
+ </tr>
107
+ <tr>
108
+ <th scope="row" valign="top">
109
+ <label for="email_admin_billing">Bill Updates:</label>
110
+ </th>
111
+ <td>
112
+ <input type="checkbox" id="email_admin_billing" name="email_admin_billing" value="1" <?php if(!empty($email_admin_billing)) { ?>checked="checked"<?php } ?> />
113
+ when a user updates his or her billing information.
114
+ </td>
115
+ </tr>
116
+ </tbody>
117
+ </table>
118
+
119
+ <p class="submit">
120
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
121
+ </p>
122
+ </form>
123
+
124
+ <?php
125
+ require_once(dirname(__FILE__) . "/admin_footer.php");
126
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/functions.php DELETED
@@ -1,222 +0,0 @@
1
- <?php
2
- /****************************************************************
3
-
4
- IMPORTANT. PLEASE READ.
5
-
6
- DO NOT EDIT THIS FILE or any other file in the /wp-content/plugins/paid-memberships-pro/ directory.
7
- Doing so could break the PMPro plugin and/or keep you from upgrading this plugin in the future.
8
- We regularly release updates to the plugin, including important security fixes and new features.
9
- You want to be able to upgrade.
10
-
11
- If you were asked to insert code into "your functions.php file", it was meant that you edit the functions.php
12
- in the root folder of your active theme. e.g. /wp-content/themes/twentytwelve/functions.php
13
- You can also create a custom plugin to place customization code into. Instructions are here:
14
- http://www.paidmembershipspro.com/2012/08/create-a-plugin-for-pmpro-customizations/
15
-
16
- Further documentation for customizing Paid Memberships Pro can be found here:
17
- http://www.paidmembershipspro.com/documentation/
18
-
19
- ****************************************************************/
20
-
21
- /*
22
- Checks if PMPro settings are complete or if there are any errors.
23
- */
24
- function pmpro_checkLevelForStripeCompatibility($level = NULL)
25
- {
26
- $gateway = pmpro_getOption("gateway");
27
- if($gateway == "stripe")
28
- {
29
- global $wpdb;
30
-
31
- //check ALL the levels
32
- if(empty($level))
33
- {
34
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
35
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
36
- if(!empty($levels))
37
- {
38
- foreach($levels as $level)
39
- {
40
- /*
41
- Stripe currently does not support:
42
- * Trial Amounts > 0.
43
- * Daily billing periods.
44
- * Billing Limits.
45
- */
46
- if($level->trial_amount > 0 ||
47
- ($level->cycle_number > 0 && $level->cycle_period == "Day") ||
48
- $level->billing_limit > 0)
49
- {
50
- return false;
51
- }
52
- }
53
- }
54
- }
55
- else
56
- {
57
- //need to look it up?
58
- if(is_numeric($level))
59
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
60
-
61
- //check this level
62
- if($level->trial_amount > 0 ||
63
- ($level->cycle_number > 0 && $level->cycle_period == "Day") ||
64
- $level->billing_limit > 0)
65
- {
66
- return false;
67
- }
68
- }
69
- }
70
-
71
- return true;
72
- }
73
-
74
- /*
75
- Checks if PMPro settings are complete or if there are any errors.
76
- */
77
- function pmpro_checkLevelForPayflowCompatibility($level = NULL)
78
- {
79
- $gateway = pmpro_getOption("gateway");
80
- if($gateway == "payflowpro")
81
- {
82
- global $wpdb;
83
-
84
- //check ALL the levels
85
- if(empty($level))
86
- {
87
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
88
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
89
- if(!empty($levels))
90
- {
91
- foreach($levels as $level)
92
- {
93
- /*
94
- Payflow currently does not support:
95
- * Trial Amounts > 0.
96
- * Daily billing periods.
97
- */
98
-
99
- if($level->trial_amount > 0 ||
100
- $level->cycle_number > 1 ||
101
- ($level->cycle_number == 1 && $level->cycle_period == "Day"))
102
- {
103
- return false;
104
- }
105
- }
106
- }
107
- }
108
- else
109
- {
110
- //need to look it up?
111
- if(is_numeric($level))
112
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
113
-
114
- //check this level
115
- if($level->trial_amount > 0 ||
116
- $level->cycle_number > 1 ||
117
- ($level->cycle_number == 1 && $level->cycle_period == "Day"))
118
- {
119
- return false;
120
- }
121
- }
122
- }
123
-
124
- return true;
125
- }
126
-
127
- /*
128
- Checks if PMPro settings are complete or if there are any errors.
129
- */
130
- function pmpro_checkLevelForBraintreeCompatibility($level = NULL)
131
- {
132
- $gateway = pmpro_getOption("gateway");
133
- if($gateway == "braintree")
134
- {
135
- global $wpdb;
136
-
137
- //check ALL the levels
138
- if(empty($level))
139
- {
140
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
141
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
142
- if(!empty($levels))
143
- {
144
- foreach($levels as $level)
145
- {
146
- /*
147
- Braintree currently does not support:
148
- * Trial Amounts > 0.
149
- * Daily or Weekly billing periods.
150
- */
151
- if($level->trial_amount > 0 ||
152
- ($level->cycle_number > 0 && ($level->cycle_period == "Day" || $level->cycle_period == "Week")))
153
- {
154
- return false;
155
- }
156
- }
157
- }
158
- }
159
- else
160
- {
161
- //need to look it up?
162
- if(is_numeric($level))
163
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
164
-
165
- //check this level
166
- if($level->trial_amount > 0 ||
167
- ($level->cycle_number > 0 && ($level->cycle_period == "Day" || $level->cycle_period == "Week")))
168
- {
169
- return false;
170
- }
171
- }
172
- }
173
-
174
- return true;
175
- }
176
-
177
- /*
178
- Checks if PMPro settings are complete or if there are any errors.
179
- */
180
- function pmpro_checkLevelForTwoCheckoutCompatibility($level = NULL)
181
- {
182
- $gateway = pmpro_getOption("gateway");
183
- if($gateway == "twocheckout")
184
- {
185
- global $wpdb;
186
-
187
- //check ALL the levels
188
- if(empty($level))
189
- {
190
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
191
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
192
- if(!empty($levels))
193
- {
194
- foreach($levels as $level)
195
- {
196
- /*
197
- 2Checkout currently does not support:
198
- * Trial amounts less than or greater than the absolute value of amonthly recurring amount.
199
- */
200
- if(pmpro_isLevelTrial($level))
201
- {
202
- return false;
203
- }
204
- }
205
- }
206
- }
207
- else
208
- {
209
- //need to look it up?
210
- if(is_numeric($level))
211
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
212
-
213
- //check this level
214
- if(pmpro_isLevelTrial($level))
215
- {
216
- return false;
217
- }
218
- }
219
- }
220
-
221
- return true;
222
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/membershiplevels.php CHANGED
@@ -1,588 +1,555 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_membershiplevels")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt, $pmpro_currency_symbol;
9
-
10
- //some vars
11
- $gateway = pmpro_getOption("gateway");
12
- global $pmpro_stripe_error, $pmpro_braintree_error, $pmpro_payflow_error, $pmpro_twocheckout_error, $wp_version;
13
-
14
- if(isset($_REQUEST['edit']))
15
- $edit = $_REQUEST['edit'];
16
- else
17
- $edit = false;
18
- if(isset($_REQUEST['copy']))
19
- $copy = $_REQUEST['copy'];
20
- if(isset($_REQUEST['s']))
21
- $s = $_REQUEST['s'];
22
- else
23
- $s = "";
24
-
25
- if(isset($_REQUEST['action']))
26
- $action = $_REQUEST['action'];
27
- else
28
- $action = false;
29
-
30
- if(isset($_REQUEST['saveandnext']))
31
- $saveandnext = $_REQUEST['saveandnext'];
32
-
33
- if(isset($_REQUEST['saveid']))
34
- $saveid = $_REQUEST['saveid'];
35
- if(isset($_REQUEST['deleteid']))
36
- $deleteid = $_REQUEST['deleteid'];
37
-
38
- if($action == "save_membershiplevel")
39
- {
40
- $ml_name = addslashes($_REQUEST['name']);
41
- $ml_description = $_REQUEST['description'];
42
- $ml_confirmation = $_REQUEST['confirmation'];
43
- $ml_initial_payment = addslashes($_REQUEST['initial_payment']);
44
- if(!empty($_REQUEST['recurring']))
45
- $ml_recurring = 1;
46
- else
47
- $ml_recurring = 0;
48
- $ml_billing_amount = addslashes($_REQUEST['billing_amount']);
49
- $ml_cycle_number = addslashes($_REQUEST['cycle_number']);
50
- $ml_cycle_period = addslashes($_REQUEST['cycle_period']);
51
- $ml_billing_limit = addslashes($_REQUEST['billing_limit']);
52
- if(!empty($_REQUEST['custom_trial']))
53
- $ml_custom_trial = 1;
54
- else
55
- $ml_custom_trial = 0;
56
- $ml_trial_amount = addslashes($_REQUEST['trial_amount']);
57
- $ml_trial_limit = addslashes($_REQUEST['trial_limit']);
58
- if(!empty($_REQUEST['expiration']))
59
- $ml_expiration = 1;
60
- else
61
- $ml_expiration = 0;
62
- $ml_expiration_number = addslashes($_REQUEST['expiration_number']);
63
- $ml_expiration_period = addslashes($_REQUEST['expiration_period']);
64
- $ml_categories = array();
65
-
66
- //reversing disable to allow here
67
- if(empty($_REQUEST['disable_signups']))
68
- $ml_allow_signups = 1;
69
- else
70
- $ml_allow_signups = 0;
71
-
72
- foreach ( $_REQUEST as $key => $value )
73
- {
74
- if ( $value == 'yes' && preg_match( '/^membershipcategory_(\d+)$/i', $key, $matches ) )
75
- {
76
- $ml_categories[] = $matches[1];
77
- }
78
- }
79
-
80
- //clearing out values if checkboxes aren't checked
81
- if(empty($ml_recurring))
82
- {
83
- $ml_billing_amount = $ml_cycle_number = $ml_cycle_period = $ml_billing_limit = $ml_trial_amount = $ml_trial_limit = 0;
84
- }
85
- elseif(empty($ml_custom_trial))
86
- {
87
- $ml_trial_amount = $ml_trial_limit = 0;
88
- }
89
- if(empty($ml_expiration))
90
- {
91
- $ml_expiration_number = $ml_expiration_period = 0;
92
- }
93
-
94
- if($saveid > 0)
95
- {
96
- $sqlQuery = " UPDATE {$wpdb->pmpro_membership_levels}
97
- SET name = '" . esc_sql($ml_name) . "',
98
- description = '" . esc_sql($ml_description) . "',
99
- confirmation = '" . esc_sql($ml_confirmation) . "',
100
- initial_payment = '" . esc_sql($ml_initial_payment) . "',
101
- billing_amount = '" . esc_sql($ml_billing_amount) . "',
102
- cycle_number = '" . esc_sql($ml_cycle_number) . "',
103
- cycle_period = '" . esc_sql($ml_cycle_period) . "',
104
- billing_limit = '" . esc_sql($ml_billing_limit) . "',
105
- trial_amount = '" . esc_sql($ml_trial_amount) . "',
106
- trial_limit = '" . esc_sql($ml_trial_limit) . "',
107
- expiration_number = '" . esc_sql($ml_expiration_number) . "',
108
- expiration_period = '" . esc_sql($ml_expiration_period) . "',
109
- allow_signups = '" . esc_sql($ml_allow_signups) . "'
110
- WHERE id = '$saveid' LIMIT 1;";
111
- $wpdb->query($sqlQuery);
112
-
113
- pmpro_updateMembershipCategories( $saveid, $ml_categories );
114
- if(!mysql_errno())
115
- {
116
- $edit = false;
117
- $msg = 2;
118
- $msgt = __("Membership level updated successfully.", "pmpro");
119
- }
120
- else
121
- {
122
- $msg = -2;
123
- $msg = true;
124
- $msgt = __("Error updating membership level.", "pmpro");
125
- }
126
- }
127
- else
128
- {
129
- $sqlQuery = " INSERT INTO {$wpdb->pmpro_membership_levels}
130
- ( name, description, confirmation, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period, allow_signups)
131
- VALUES
132
- ( '" . esc_sql($ml_name) . "', '" . esc_sql($ml_description) . "', '" . esc_sql($ml_confirmation) . "', '" . esc_sql($ml_initial_payment) . "', '" . esc_sql($ml_billing_amount) . "', '" . esc_sql($ml_cycle_number) . "', '" . esc_sql($ml_cycle_period) . "', '" . esc_sql($ml_billing_limit) . "', '" . esc_sql($ml_trial_amount) . "', '" . esc_sql($ml_trial_limit) . "', '" . esc_sql($ml_expiration_number) . "', '" . esc_sql($ml_expiration_period) . "', '" . esc_sql($ml_allow_signups) . "' )";
133
- $wpdb->query($sqlQuery);
134
- if(!mysql_errno())
135
- {
136
- $saveid = $wpdb->insert_id;
137
- pmpro_updateMembershipCategories( $saveid, $ml_categories );
138
-
139
- $edit = false;
140
- $msg = 1;
141
- $msgt = __("Membership level added successfully.", "pmpro");
142
- }
143
- else
144
- {
145
- $msg = -1;
146
- $msgt = __("Error adding membership level.", "pmpro");
147
- }
148
- }
149
-
150
- do_action("pmpro_save_membership_level", $saveid);
151
- }
152
- elseif($action == "delete_membership_level")
153
- {
154
- global $wpdb;
155
-
156
- $ml_id = $_REQUEST['deleteid'];
157
-
158
- if($ml_id > 0)
159
- {
160
- do_action("pmpro_delete_membership_level", $ml_id);
161
-
162
- //remove any categories from the ml
163
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE membership_id = '$ml_id'";
164
- $r1 = $wpdb->query($sqlQuery);
165
-
166
- //cancel any subscriptions to the ml
167
- $r2 = true;
168
- $user_ids = $wpdb->get_col("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE membership_id = '$ml_id' AND status = 'active'");
169
- foreach($user_ids as $user_id)
170
- {
171
- //change there membership level to none. that will handle the cancel
172
- if(pmpro_changeMembershipLevel(0, $user_id))
173
- {
174
- //okay
175
- }
176
- else
177
- {
178
- //couldn't delete the subscription
179
- //we should probably notify the admin
180
- $pmproemail = new PMProEmail();
181
- $pmproemail->data = array("body"=>"<p>" . sprintf(__("There was an error canceling the subscription for user with ID=%d. You will want to check your payment gateway to see if their subscription is still active.", "pmpro"), $user_id) . "</p>");
182
- $last_order = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
183
- if($last_order)
184
- $pmproemail->data["body"] .= "<p>" . __("Last Invoice", "pmpro") . ":<br />" . nl2br(var_export($last_order, true)) . "</p>";
185
- $pmproemail->sendEmail(get_bloginfo("admin_email"));
186
-
187
- $r2 = false;
188
- }
189
- }
190
-
191
- //delete the ml
192
- $sqlQuery = "DELETE FROM $wpdb->pmpro_membership_levels WHERE id = '$ml_id' LIMIT 1";
193
- $r3 = $wpdb->query($sqlQuery);
194
-
195
- if($r1 !== FALSE && $r2 !== FALSE && $r3 !== FALSE)
196
- {
197
- $msg = 3;
198
- $msgt = __("Membership level deleted successfully.", "pmpro");
199
- }
200
- else
201
- {
202
- $msg = -3;
203
- $msgt = __("Error deleting membership level.", "pmpro");
204
- }
205
- }
206
- else
207
- {
208
- $msg = -3;
209
- $msgt = __("Error deleting membership level.", "pmpro");
210
- }
211
- }
212
-
213
- require_once(dirname(__FILE__) . "/admin_header.php");
214
- ?>
215
-
216
- <?php
217
- if($edit)
218
- {
219
- ?>
220
-
221
- <h2>
222
- <?php
223
- if($edit > 0)
224
- echo __("Edit Membership Level", "pmpro");
225
- else
226
- echo __("Add New Membership Level", "pmpro");
227
- ?>
228
- </h2>
229
-
230
- <div>
231
- <?php
232
- // get the level...
233
- if(!empty($edit) && $edit > 0)
234
- {
235
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$edit' LIMIT 1", OBJECT);
236
- $temp_id = $level->id;
237
- }
238
- elseif(!empty($copy) && $copy > 0)
239
- {
240
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$copy' LIMIT 1", OBJECT);
241
- $temp_id = $level->id;
242
- $level->id = NULL;
243
- }
244
- else
245
-
246
- // didn't find a membership level, let's add a new one...
247
- if(empty($level))
248
- {
249
- $level = new stdClass();
250
- $level->id = NULL;
251
- $level->name = NULL;
252
- $level->description = NULL;
253
- $level->confirmation = NULL;
254
- $level->billing_amount = NULL;
255
- $level->trial_amount = NULL;
256
- $level->initial_payment = NULL;
257
- $level->billing_limit = NULL;
258
- $level->trial_limit = NULL;
259
- $level->expiration_number = NULL;
260
- $level->expiration_period = NULL;
261
- $edit = -1;
262
- }
263
-
264
- //defaults for new levels
265
- if(empty($copy) && $edit == -1)
266
- {
267
- $level->cycle_number = 1;
268
- $level->cycle_period = "Month";
269
- }
270
-
271
- // grab the categories for the given level...
272
- if(!empty($temp_id))
273
- $level->categories = $wpdb->get_col("SELECT c.category_id
274
- FROM $wpdb->pmpro_memberships_categories c
275
- WHERE c.membership_id = '" . $temp_id . "'");
276
- if(empty($level->categories))
277
- $level->categories = array();
278
-
279
- ?>
280
- <form action="" method="post" enctype="multipart/form-data">
281
- <input name="saveid" type="hidden" value="<?php echo $edit?>" />
282
- <input type="hidden" name="action" value="save_membershiplevel" />
283
- <table class="form-table">
284
- <tbody>
285
- <tr>
286
- <th scope="row" valign="top"><label><?php _e('ID', 'pmpro');?>:</label></th>
287
- <td>
288
- <?php echo $level->id?>
289
- </td>
290
- </tr>
291
-
292
- <tr>
293
- <th scope="row" valign="top"><label for="name"><?php _e('Name', 'pmpro');?>:</label></th>
294
- <td><input name="name" type="text" size="50" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->name))?>" /></td>
295
- </tr>
296
-
297
- <tr>
298
- <th scope="row" valign="top"><label for="description"><?php _e('Description', 'pmpro');?>:</label></th>
299
- <td>
300
- <div id="poststuff" class="pmpro_description">
301
- <?php
302
- if(version_compare($wp_version, "3.3") >= 0)
303
- wp_editor(stripslashes($level->description), "description", array("textarea_rows"=>5));
304
- else
305
- {
306
- ?>
307
- <textarea rows="10" cols="80" name="description" id="description"><?php echo stripslashes($level->description)?></textarea>
308
- <?php
309
- }
310
- ?>
311
- </div>
312
- </td>
313
- </tr>
314
-
315
- <tr>
316
- <th scope="row" valign="top"><label for="confirmation"><?php _e('Confirmation Message', 'pmpro');?>:</label></th>
317
- <td>
318
- <div class="pmpro_confirmation">
319
- <?php
320
- if(version_compare($wp_version, "3.3") >= 0)
321
- wp_editor(stripslashes($level->confirmation), "confirmation", array("textarea_rows"=>5));
322
- else
323
- {
324
- ?>
325
- <textarea rows="10" cols="80" name="confirmation" id="confirmation"><?php echo stripslashes($level->confirmation)?></textarea>
326
- <?php
327
- }
328
- ?>
329
- </div>
330
- </td>
331
- </tr>
332
- </tbody>
333
- </table>
334
-
335
- <h3 class="topborder"><?php _e('Billing Details', 'pmpro');?></h3>
336
- <table class="form-table">
337
- <tbody>
338
- <tr>
339
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'pmpro');?>:</label></th>
340
- <td><?php echo $pmpro_currency_symbol?><input name="initial_payment" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small><?php _e('The initial amount collected at registration.', 'pmpro');?></small></td>
341
- </tr>
342
-
343
- <tr>
344
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'pmpro');?>:</label></th>
345
- <td><input id="recurring" name="recurring" type="checkbox" value="yes" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#recurring').is(':checked')) { jQuery('.recurring_info').show(); if(jQuery('#custom_trial').is(':checked')) {jQuery('.trial_info').show();} else {jQuery('.trial_info').hide();} } else { jQuery('.recurring_info').hide();}" /> <small><?php _e('Check if this level has a recurring subscription payment.', 'pmpro');?></small></td>
346
- </tr>
347
-
348
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
349
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'pmpro');?>:</label></th>
350
- <td>
351
- <?php echo $pmpro_currency_symbol?><input name="billing_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small><?php _e('per', 'pmpro');?></small>
352
- <input id="cycle_number" name="cycle_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
353
- <select id="cycle_period" name="cycle_period">
354
- <?php
355
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
356
- foreach ( $cycles as $name => $value ) {
357
- echo "<option value='$value'";
358
- if ( $level->cycle_period == $value ) echo " selected='selected'";
359
- echo ">$name</option>";
360
- }
361
- ?>
362
- </select>
363
- <br /><small>
364
- <?php _e('The amount to be billed one cycle after the initial payment.', 'pmpro');?>
365
- <?php if($gateway == "stripe") { ?>
366
- <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently only supports billing periods of "Week", "Month" or "Year".', 'pmpro');?>
367
- <?php } elseif($gateway == "braintree") { ?>
368
- <br /><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'pmpro');?>
369
- <?php } elseif($gateway == "payflowpro") { ?>
370
- <br /><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently only supports billing frequencies of 1 and billing periods of "Week", "Month" or "Year".', 'pmpro');?>
371
- <?php } ?>
372
- </small>
373
- <?php if($gateway == "braintree" && $edit < 0) { ?>
374
- <p class="pmpro_message"><strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('After saving this level, make note of the ID and create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to <em>pmpro_#</em>, where # is the level ID.', 'pmpro');?></p>
375
- <?php } elseif($gateway == "braintree") { ?>
376
- <p class="pmpro_message"><strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to', 'pmpro');?> <em>pmpro_<?php echo $level->id;?></em>.</p>
377
- <?php } ?>
378
- </td>
379
- </tr>
380
-
381
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
382
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'pmpro');?>:</label></th>
383
- <td>
384
- <input name="billing_limit" type="text" size="20" value="<?php echo $level->billing_limit?>" />
385
- <br /><small>
386
- <?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'pmpro');?>
387
- <?php if($gateway == "stripe") { ?>
388
- <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support billing limits. You can still set an expiration date below.', 'pmpro');?></strong>
389
- <?php } ?>
390
- </small>
391
- </td>
392
- </tr>
393
-
394
- <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
395
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'pmpro');?>:</label></th>
396
- <td>
397
- <input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> <?php _e('Check to add a custom trial period.', 'pmpro');?>
398
-
399
- <?php if($gateway == "twocheckout") { ?>
400
- <br /><small><strong <?php if(!empty($pmpro_twocheckout_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount.', 'pmpro');?></strong></small>
401
- <?php } ?>
402
- </td>
403
- </tr>
404
-
405
- <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
406
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'pmpro');?>:</label></th>
407
- <td>
408
- <?php echo $pmpro_currency_symbol?><input name="trial_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
409
- <small><?php _e('for the first', 'pmpro');?></small>
410
- <input name="trial_limit" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
411
- <small><?php _e('subscription payments', 'pmpro');?>.</small>
412
- <?php if($gateway == "stripe") { ?>
413
- <br /><small>
414
- <strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
415
- </small>
416
- <?php } elseif($gateway == "braintree") { ?>
417
- <br /><small>
418
- <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
419
- </small>
420
- <?php } elseif($gateway == "payflowpro") { ?>
421
- <br /><small>
422
- <strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
423
- </small>
424
- <?php } ?>
425
- </td>
426
- </tr>
427
-
428
- </tbody>
429
- </table>
430
- <h3 class="topborder"><?php _e('Other Settings', 'pmpro');?></h3>
431
- <table class="form-table">
432
- <tbody>
433
- <tr>
434
- <th scope="row" valign="top"><label><?php _e('Disable New Signups', 'pmpro');?>:</label></th>
435
- <td><input name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> <?php _e('Check to hide this level from the membership levels page and disable registration.', 'pmpro');?></td>
436
- </tr>
437
-
438
- <tr>
439
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'pmpro');?>:</label></th>
440
- <td><input id="expiration" name="expiration" type="checkbox" value="yes" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#expiration').is(':checked')) { jQuery('.expiration_info').show(); } else { jQuery('.expiration_info').hide();}" /> <?php _e('Check this to set when membership access expires.', 'pmpro');?></td>
441
- </tr>
442
-
443
- <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
444
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'pmpro');?>:</label></th>
445
- <td>
446
- <input id="expiration_number" name="expiration_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
447
- <select id="expiration_period" name="expiration_period">
448
- <?php
449
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
450
- foreach ( $cycles as $name => $value ) {
451
- echo "<option value='$value'";
452
- if ( $level->expiration_period == $value ) echo " selected='selected'";
453
- echo ">$name</option>";
454
- }
455
- ?>
456
- </select>
457
- <br /><small><?php _e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'pmpro');?></small>
458
- </td>
459
- </tr>
460
- </tbody>
461
- </table>
462
-
463
- <?php do_action("pmpro_membership_level_after_other_settings"); ?>
464
-
465
- <h3 class="topborder"><?php _e('Content Settings', 'pmpro');?></h3>
466
- <table class="form-table">
467
- <tbody>
468
- <tr>
469
- <th scope="row" valign="top"><label><?php _e('Categories', 'pmpro');?>:</label></th>
470
- <td>
471
- <?php
472
- $categories = get_categories( array( 'hide_empty' => 0 ) );
473
- echo "<ul>";
474
- foreach ( $categories as $cat )
475
- {
476
- $checked = in_array( $cat->term_id, $level->categories ) ? "checked='checked'" : '';
477
- echo "<li><input name='membershipcategory_{$cat->term_id}' type='checkbox' value='yes' $checked /> {$cat->name}</li>\n";
478
- }
479
- echo "</ul>";
480
- ?>
481
- </td>
482
- </tr>
483
- </tbody>
484
- </table>
485
- <p class="submit topborder">
486
- <input name="save" type="submit" class="button-primary" value="Save Level" />
487
- <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels')?>';" />
488
- </p>
489
- </form>
490
- </div>
491
-
492
- <?php
493
- }
494
- else
495
- {
496
- ?>
497
-
498
- <h2><?php _e('Membership Levels', 'pmpro');?> <a href="admin.php?page=pmpro-membershiplevels&edit=-1" class="add-new-h2"><?php _e('Add New Level', 'pmpro');?></a></h2>
499
- <form id="posts-filter" method="get" action="">
500
- <p class="search-box">
501
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Levels', 'pmpro');?>:</label>
502
- <input type="hidden" name="page" value="pmpro-membershiplevels" />
503
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s" size="30" />
504
- <input class="button" type="submit" value="<?php _e('Search Levels', 'pmpro');?>" id="search-submit" />
505
- </p>
506
- </form>
507
-
508
- <br class="clear" />
509
-
510
- <table class="widefat">
511
- <thead>
512
- <tr>
513
- <th><?php _e('ID', 'pmpro');?></th>
514
- <th><?php _e('Name', 'pmpro');?></th>
515
- <th><?php _e('Initial Payment', 'pmpro');?></th>
516
- <th><?php _e('Billing Cycle', 'pmpro');?></th>
517
- <th><?php _e('Trial Cycle', 'pmpro');?></th>
518
- <th><?php _e('Expiration', 'pmpro');?></th>
519
- <th><?php _e('Allow Signups', 'pmpro');?></th>
520
- <th></th>
521
- <th></th>
522
- <th></th>
523
- </tr>
524
- </thead>
525
- <tbody>
526
- <?php
527
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
528
- if($s)
529
- $sqlQuery .= "WHERE name LIKE '%$s%' ";
530
- $sqlQuery .= "ORDER BY id ASC";
531
-
532
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
533
-
534
- foreach($levels as $level)
535
- {
536
- ?>
537
- <tr class="<?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level) || !pmpro_checkLevelForPayflowCompatibility($level) || !pmpro_checkLevelForTwoCheckoutCompatibility($level)) { ?>pmpro_error<?php } ?>">
538
- <td><?php echo $level->id?></td>
539
- <td><?php echo $level->name?></td>
540
- <td>
541
- <?php if(pmpro_isLevelFree($level)) { ?>
542
- <?php _e('FREE', 'pmpro');?>
543
- <?php } else { ?>
544
- <?php echo $pmpro_currency_symbol?><?php echo $level->initial_payment?>
545
- <?php } ?>
546
- </td>
547
- <td>
548
- <?php if(!pmpro_isLevelRecurring($level)) { ?>
549
- --
550
- <?php } else { ?>
551
- <?php echo $pmpro_currency_symbol?><?php echo $level->billing_amount?> <?php _e('every', 'pmpro');?> <?php echo $level->cycle_number.' '.pmpro_translate_billing_period($level->cycle_period,$level->cycle_number)?>
552
-
553
- <?php if($level->billing_limit) { ?>(<?php _e('for', 'pmpro');?> <?php echo $level->billing_limit?> <?php echo sornot($level->cycle_period,$level->billing_limit)?>)<?php } ?>
554
-
555
- <?php } ?>
556
- </td>
557
- <td>
558
- <?php if(!pmpro_isLevelTrial($level)) { ?>
559
- --
560
- <?php } else { ?>
561
- <?php echo $pmpro_currency_symbol?><?php echo $level->trial_amount?> <?php _e('for', 'pmpro');?> <?php echo $level->trial_limit?> <?php echo sornot("payment",$level->trial_limit)?>
562
- <?php } ?>
563
- </td>
564
- <td>
565
- <?php if(!pmpro_isLevelExpiring($level)) { ?>
566
- --
567
- <?php } else { ?>
568
- <?php _e('After', 'pmpro');?> <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
569
- <?php } ?>
570
- </td>
571
- <td><?php if($level->allow_signups) { ?><?php _e('Yes', 'pmpro');?><?php } else { ?><?php _e('No', 'pmpro');?><?php } ?></td>
572
- <td align="center"><a href="admin.php?page=pmpro-membershiplevels&amp;edit=<?php echo $level->id?>" class="edit"><?php _e('edit', 'pmpro');?></a></td>
573
- <td align="center"><a href="admin.php?page=pmpro-membershiplevels&amp;copy=<?php echo $level->id?>&amp;edit=-1" class="edit"><?php _e('copy', 'pmpro');?></a></td>
574
- <td align="center"><a href="javascript: askfirst('<?php printf(__("Are you sure you want to delete membership level %s? All subscriptions will be cancelled.", "pmpro"), $level->name);?>','admin.php?page=pmpro-membershiplevels&amp;action=delete_membership_level&amp;deleteid=<?php echo $level->id?>'); void(0);" class="delete"><?php _e('delete', 'pmpro');?></a></td>
575
- </tr>
576
- <?php
577
- }
578
- ?>
579
- </tbody>
580
- </table>
581
- <?php
582
- }
583
- ?>
584
-
585
- <?php
586
- require_once(dirname(__FILE__) . "/admin_footer.php");
587
- ?>
588
-
1
+ <?php
2
+ global $wpdb, $msg, $msgt, $pmpro_currency_symbol;
3
+
4
+ //some vars
5
+ $gateway = pmpro_getOption("gateway");
6
+ global $pmpro_stripe_error, $wp_version;
7
+
8
+ if(isset($_REQUEST['edit']))
9
+ $edit = $_REQUEST['edit'];
10
+ else
11
+ $edit = false;
12
+ if(isset($_REQUEST['copy']))
13
+ $copy = $_REQUEST['copy'];
14
+ if(isset($_REQUEST['s']))
15
+ $s = $_REQUEST['s'];
16
+ else
17
+ $s = "";
18
+
19
+ if(isset($_REQUEST['action']))
20
+ $action = $_REQUEST['action'];
21
+ else
22
+ $action = false;
23
+
24
+ if(isset($_REQUEST['saveandnext']))
25
+ $saveandnext = $_REQUEST['saveandnext'];
26
+
27
+ if(isset($_REQUEST['saveid']))
28
+ $saveid = $_REQUEST['saveid'];
29
+ if(isset($_REQUEST['deleteid']))
30
+ $deleteid = $_REQUEST['deleteid'];
31
+
32
+ if($action == "save_membershiplevel")
33
+ {
34
+ $ml_name = addslashes($_REQUEST['name']);
35
+ $ml_description = $_REQUEST['description'];
36
+ $ml_confirmation = $_REQUEST['confirmation'];
37
+ $ml_initial_payment = addslashes($_REQUEST['initial_payment']);
38
+ if(!empty($_REQUEST['recurring']))
39
+ $ml_recurring = 1;
40
+ else
41
+ $ml_recurring = 0;
42
+ $ml_billing_amount = addslashes($_REQUEST['billing_amount']);
43
+ $ml_cycle_number = addslashes($_REQUEST['cycle_number']);
44
+ $ml_cycle_period = addslashes($_REQUEST['cycle_period']);
45
+ $ml_billing_limit = addslashes($_REQUEST['billing_limit']);
46
+ if(!empty($_REQUEST['custom_trial']))
47
+ $ml_custom_trial = 1;
48
+ else
49
+ $ml_custom_trial = 0;
50
+ $ml_trial_amount = addslashes($_REQUEST['trial_amount']);
51
+ $ml_trial_limit = addslashes($_REQUEST['trial_limit']);
52
+ if(!empty($_REQUEST['expiration']))
53
+ $ml_expiration = 1;
54
+ else
55
+ $ml_expiration = 0;
56
+ $ml_expiration_number = addslashes($_REQUEST['expiration_number']);
57
+ $ml_expiration_period = addslashes($_REQUEST['expiration_period']);
58
+ $ml_categories = array();
59
+
60
+ //reversing disable to allow here
61
+ if(empty($_REQUEST['disable_signups']))
62
+ $ml_allow_signups = 1;
63
+ else
64
+ $ml_allow_signups = 0;
65
+
66
+ foreach ( $_REQUEST as $key => $value )
67
+ {
68
+ if ( $value == 'yes' && preg_match( '/^membershipcategory_(\d+)$/i', $key, $matches ) )
69
+ {
70
+ $ml_categories[] = $matches[1];
71
+ }
72
+ }
73
+
74
+ //clearing out values if checkboxes aren't checked
75
+ if(empty($ml_recurring))
76
+ {
77
+ $ml_billing_amount = $ml_cycle_number = $ml_cycle_period = $ml_billing_limit = $ml_trial_amount = $ml_trial_limit = 0;
78
+ }
79
+ elseif(empty($ml_custom_trial))
80
+ {
81
+ $ml_trial_amount = $ml_trial_limit = 0;
82
+ }
83
+ if(empty($ml_expiration))
84
+ {
85
+ $ml_expiration_number = $ml_expiration_period = 0;
86
+ }
87
+
88
+ if($saveid > 0)
89
+ {
90
+ $sqlQuery = " UPDATE {$wpdb->pmpro_membership_levels}
91
+ SET name = '" . $wpdb->escape($ml_name) . "',
92
+ description = '" . $wpdb->escape($ml_description) . "',
93
+ confirmation = '" . $wpdb->escape($ml_confirmation) . "',
94
+ initial_payment = '" . $wpdb->escape($ml_initial_payment) . "',
95
+ billing_amount = '" . $wpdb->escape($ml_billing_amount) . "',
96
+ cycle_number = '" . $wpdb->escape($ml_cycle_number) . "',
97
+ cycle_period = '" . $wpdb->escape($ml_cycle_period) . "',
98
+ billing_limit = '" . $wpdb->escape($ml_billing_limit) . "',
99
+ trial_amount = '" . $wpdb->escape($ml_trial_amount) . "',
100
+ trial_limit = '" . $wpdb->escape($ml_trial_limit) . "',
101
+ expiration_number = '" . $wpdb->escape($ml_expiration_number) . "',
102
+ expiration_period = '" . $wpdb->escape($ml_expiration_period) . "',
103
+ allow_signups = '" . $wpdb->escape($ml_allow_signups) . "'
104
+ WHERE id = '$saveid' LIMIT 1;";
105
+ $wpdb->query($sqlQuery);
106
+
107
+ pmpro_updateMembershipCategories( $saveid, $ml_categories );
108
+ if(!mysql_errno())
109
+ {
110
+ $edit = false;
111
+ $msg = 2;
112
+ $msgt = "Membership level updated successfully.";
113
+ }
114
+ else
115
+ {
116
+ $msg = -2;
117
+ $msg = true;
118
+ $msgt = "Error updating membership level.";
119
+ }
120
+ }
121
+ else
122
+ {
123
+ $sqlQuery = " INSERT INTO {$wpdb->pmpro_membership_levels}
124
+ ( name, description, confirmation, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period, allow_signups)
125
+ VALUES
126
+ ( '" . $wpdb->escape($ml_name) . "', '" . $wpdb->escape($ml_description) . "', '" . $wpdb->escape($ml_confirmation) . "', '" . $wpdb->escape($ml_initial_payment) . "', '" . $wpdb->escape($ml_billing_amount) . "', '" . $wpdb->escape($ml_cycle_number) . "', '" . $wpdb->escape($ml_cycle_period) . "', '" . $wpdb->escape($ml_billing_limit) . "', '" . $wpdb->escape($ml_trial_amount) . "', '" . $wpdb->escape($ml_trial_limit) . "', '" . $wpdb->escape($ml_expiration_number) . "', '" . $wpdb->escape($ml_expiration_period) . "', '" . $wpdb->escape($ml_allow_signups) . "' )";
127
+ $wpdb->query($sqlQuery);
128
+ if(!mysql_errno())
129
+ {
130
+ $saveid = $wpdb->insert_id;
131
+ pmpro_updateMembershipCategories( $saveid, $ml_categories );
132
+
133
+ $edit = false;
134
+ $msg = 1;
135
+ $msgt = "Membership level added successfully.";
136
+ }
137
+ else
138
+ {
139
+ $msg = -1;
140
+ $msgt = "Error adding membership level.";
141
+ }
142
+ }
143
+
144
+ do_action("pmpro_save_membership_level", $saveid);
145
+ }
146
+ elseif($action == "delete_membership_level")
147
+ {
148
+ global $wpdb;
149
+
150
+ $ml_id = $_REQUEST['deleteid'];
151
+
152
+ if($ml_id > 0)
153
+ {
154
+ //remove any categories from the ml
155
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE membership_id = '$ml_id'";
156
+ $r1 = $wpdb->query($sqlQuery);
157
+
158
+ //cancel any subscriptions to the ml
159
+ $r2 = true;
160
+ $user_ids = $wpdb->get_col("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE membership_id = '$ml_id'");
161
+ foreach($user_ids as $user_id)
162
+ {
163
+ //change there membership level to none. that will handle the cancel
164
+ if(pmpro_changeMembershipLevel(0, $user_id))
165
+ {
166
+ //okay
167
+ }
168
+ else
169
+ {
170
+ //couldn't delete the subscription
171
+ //we should probably notify the admin
172
+ $pmproemail = new PMProEmail();
173
+ $pmproemail->data = array("body"=>"<p>There was an error canceling the subscription for user with ID=" . $user_id . ". You will want to check your payment gateway to see if their subscription is still active.</p>");
174
+ $last_order = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
175
+ if($last_order)
176
+ $pmproemail->data["body"] .= "<p>Last Invoice:<br />" . nl2br(var_export($last_order, true)) . "</p>";
177
+ $pmproemail->sendEmail(get_bloginfo("admin_email"));
178
+
179
+ $r2 = false;
180
+ }
181
+ }
182
+
183
+ //delete the ml
184
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_membership_levels WHERE id = '$ml_id' LIMIT 1";
185
+ $r3 = $wpdb->query($sqlQuery);
186
+
187
+ if($r1 !== FALSE && $r2 !== FALSE && $r3 !== FALSE)
188
+ {
189
+ $msg = 3;
190
+ $msgt = "Membership level deleted successfully.";
191
+ }
192
+ else
193
+ {
194
+ $msg = -3;
195
+ $msgt = "Error deleting membership level.";
196
+ }
197
+ }
198
+ else
199
+ {
200
+ $msg = -3;
201
+ $msgt = "Error deleting membership level.";
202
+ }
203
+ }
204
+
205
+ require_once(dirname(__FILE__) . "/admin_header.php");
206
+ ?>
207
+
208
+ <?php
209
+ if($edit)
210
+ {
211
+ ?>
212
+
213
+ <h2>
214
+ <?php
215
+ if($edit > 0)
216
+ echo "Edit Membership Level";
217
+ else
218
+ echo "Add New Membership Level";
219
+ ?>
220
+ </h2>
221
+
222
+ <div>
223
+ <?php
224
+ // get the level...
225
+ if(!empty($edit) && $edit > 0)
226
+ {
227
+ $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$edit' LIMIT 1", OBJECT);
228
+ $temp_id = $level->id;
229
+ }
230
+ elseif(!empty($copy) && $copy > 0)
231
+ {
232
+ $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$copy' LIMIT 1", OBJECT);
233
+ $temp_id = $level->id;
234
+ $level->id = NULL;
235
+ }
236
+ else
237
+
238
+ // didn't find a membership level, let's add a new one...
239
+ if(empty($level))
240
+ {
241
+ $level = new stdClass();
242
+ $level->id = NULL;
243
+ $level->name = NULL;
244
+ $level->description = NULL;
245
+ $level->confirmation = NULL;
246
+ $level->billing_amount = NULL;
247
+ $level->trial_amount = NULL;
248
+ $level->initial_payment = NULL;
249
+ $level->billing_limit = NULL;
250
+ $level->trial_limit = NULL;
251
+ $level->expiration_number = NULL;
252
+ $level->expiration_period = NULL;
253
+ $edit = -1;
254
+ }
255
+
256
+ //defaults for new levels
257
+ if($edit == -1)
258
+ {
259
+ $level->cycle_number = 1;
260
+ $level->cycle_period = "Month";
261
+ }
262
+
263
+ // grab the categories for the given level...
264
+ if(!empty($temp_id))
265
+ $level->categories = $wpdb->get_col("SELECT c.category_id
266
+ FROM $wpdb->pmpro_memberships_categories c
267
+ WHERE c.membership_id = '" . $temp_id . "'");
268
+ if(empty($level->categories))
269
+ $level->categories = array();
270
+
271
+ ?>
272
+ <form action="" method="post" enctype="multipart/form-data">
273
+ <input name="saveid" type="hidden" value="<?php echo $edit?>" />
274
+ <input type="hidden" name="action" value="save_membershiplevel" />
275
+ <table class="form-table">
276
+ <tbody>
277
+ <tr>
278
+ <th scope="row" valign="top"><label>ID:</label></th>
279
+ <td><?php echo $level->id?></td>
280
+ </tr>
281
+
282
+ <tr>
283
+ <th scope="row" valign="top"><label for="name">Name:</label></th>
284
+ <td><input name="name" type="text" size="50" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->name))?>" /></td>
285
+ </tr>
286
+
287
+ <tr>
288
+ <th scope="row" valign="top"><label for="description">Description:</label></th>
289
+ <td>
290
+ <div id="poststuff" class="pmpro_description">
291
+ <?php
292
+ if(version_compare($wp_version, "3.3") >= 0)
293
+ wp_editor(stripslashes($level->description), "description", array("textarea_rows"=>5));
294
+ else
295
+ {
296
+ ?>
297
+ <textarea rows="10" cols="80" name="description" id="description"><?php echo stripslashes($level->description)?></textarea>
298
+ <?php
299
+ }
300
+ ?>
301
+ </div>
302
+ </td>
303
+ </tr>
304
+
305
+ <tr>
306
+ <th scope="row" valign="top"><label for="confirmation">Confirmation Message:</label></th>
307
+ <td>
308
+ <div class="pmpro_confirmation">
309
+ <?php
310
+ if(version_compare($wp_version, "3.3") >= 0)
311
+ wp_editor(stripslashes($level->confirmation), "confirmation", array("textarea_rows"=>5));
312
+ else
313
+ {
314
+ ?>
315
+ <textarea rows="10" cols="80" name="confirmation" id="confirmation"><?php echo stripslashes($level->confirmation)?></textarea>
316
+ <?php
317
+ }
318
+ ?>
319
+ </div>
320
+ </td>
321
+ </tr>
322
+ </tbody>
323
+ </table>
324
+
325
+ <h3 class="topborder">Billing Details</h3>
326
+ <table class="form-table">
327
+ <tbody>
328
+ <tr>
329
+ <th scope="row" valign="top"><label for="initial_payment">Initial Payment:</label></th>
330
+ <td><?php echo $pmpro_currency_symbol?><input name="initial_payment" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small>The initial amount collected at registration.</small></td>
331
+ </tr>
332
+
333
+ <tr>
334
+ <th scope="row" valign="top"><label>Recurring Subscription:</label></th>
335
+ <td><input id="recurring" name="recurring" type="checkbox" value="yes" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#recurring').is(':checked')) { jQuery('.recurring_info').show(); if(jQuery('#custom_trial').is(':checked')) {jQuery('.trial_info').show();} else {jQuery('.trial_info').hide();} } else { jQuery('.recurring_info').hide();}" /> <small>Check if this level has a recurring subscription payment.</small></td>
336
+ </tr>
337
+
338
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
339
+ <th scope="row" valign="top"><label for="billing_amount">Billing Amount:</label></th>
340
+ <td>
341
+ <?php echo $pmpro_currency_symbol?><input name="billing_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
342
+ <input id="cycle_number" name="cycle_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
343
+ <select id="cycle_period" name="cycle_period">
344
+ <?php
345
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
346
+ foreach ( $cycles as $name => $value ) {
347
+ echo "<option value='$value'";
348
+ if ( $level->cycle_period == $value ) echo " selected='selected'";
349
+ echo ">$name</option>";
350
+ }
351
+ ?>
352
+ </select>
353
+ <br /><small>
354
+ The amount to be billed one cycle after the initial payment.
355
+ <?php if($gateway == "stripe") { ?>
356
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently only supports billing periods of "1 Month" or "1 Year".
357
+ <?php } ?>
358
+ </small>
359
+ </td>
360
+ </tr>
361
+
362
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
363
+ <th scope="row" valign="top"><label for="billing_limit">Billing Cycle Limit:</label></th>
364
+ <td>
365
+ <input name="billing_limit" type="text" size="20" value="<?php echo $level->billing_limit?>" />
366
+ <br /><small>
367
+ The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.
368
+ <?php if($gateway == "stripe") { ?>
369
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently does not support billing limits. You can still set an expiration date below.</strong>
370
+ <?php } ?>
371
+ </small>
372
+ </td>
373
+ </tr>
374
+
375
+ <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
376
+ <th scope="row" valign="top"><label>Custom Trial:</label></th>
377
+ <td><input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> Check to add a custom trial period.</td>
378
+ </tr>
379
+
380
+ <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
381
+ <th scope="row" valign="top"><label for="trial_amount">Trial Billing Amount:</label></th>
382
+ <td>
383
+ <?php echo $pmpro_currency_symbol?><input name="trial_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
384
+ <small>for the first</small>
385
+ <input name="trial_limit" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
386
+ <small>subscription payments.</small>
387
+ <?php if($gateway == "stripe") { ?>
388
+ <br /><small>
389
+ <strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently does not support trial amounts greater than $0.</strong>
390
+ </small>
391
+ <?php } ?>
392
+ </td>
393
+ </tr>
394
+
395
+ </tbody>
396
+ </table>
397
+ <h3 class="topborder">Other Settings</h3>
398
+ <table class="form-table">
399
+ <tbody>
400
+ <tr>
401
+ <th scope="row" valign="top"><label>Disable New Signups:</label></th>
402
+ <td><input name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> Check to hide this level from the membership levels page and disable registration.</td>
403
+ </tr>
404
+
405
+ <tr>
406
+ <th scope="row" valign="top"><label>Membership Expiration:</label></th>
407
+ <td><input id="expiration" name="expiration" type="checkbox" value="yes" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#expiration').is(':checked')) { jQuery('.expiration_info').show(); } else { jQuery('.expiration_info').hide();}" /> Check this to set an expiration date for new sign ups.</td>
408
+ </tr>
409
+
410
+ <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
411
+ <th scope="row" valign="top"><label for="billing_amount">Expire In:</label></th>
412
+ <td>
413
+ <input id="expiration_number" name="expiration_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
414
+ <select id="expiration_period" name="expiration_period">
415
+ <?php
416
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
417
+ foreach ( $cycles as $name => $value ) {
418
+ echo "<option value='$value'";
419
+ if ( $level->expiration_period == $value ) echo " selected='selected'";
420
+ echo ">$name</option>";
421
+ }
422
+ ?>
423
+ </select>
424
+ <br /><small>How long before the expiration expires. Not that any future payments will be canceled when the membership expires.</small>
425
+ </td>
426
+ </tr>
427
+ </tbody>
428
+ </table>
429
+
430
+ <?php do_action("pmpro_membership_level_after_other_settings"); ?>
431
+
432
+ <h3 class="topborder">Content Settings</h3>
433
+ <table class="form-table">
434
+ <tbody>
435
+ <tr>
436
+ <th scope="row" valign="top"><label>Categories:</label></th>
437
+ <td>
438
+ <?php
439
+ $categories = get_categories( array( 'hide_empty' => 0 ) );
440
+ echo "<ul>";
441
+ foreach ( $categories as $cat )
442
+ {
443
+ $checked = in_array( $cat->term_id, $level->categories ) ? "checked='checked'" : '';
444
+ echo "<li><input name='membershipcategory_{$cat->term_id}' type='checkbox' value='yes' $checked /> {$cat->name}</li>\n";
445
+ }
446
+ echo "</ul>";
447
+ ?>
448
+ </td>
449
+ </tr>
450
+ </tbody>
451
+ </table>
452
+ <p class="submit topborder">
453
+ <input name="save" type="submit" class="button-primary" value="Save Level" />
454
+ <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels')?>';" />
455
+ </p>
456
+ </form>
457
+ </div>
458
+
459
+ <?php
460
+ }
461
+ else
462
+ {
463
+ ?>
464
+
465
+ <h2>Membership Levels <a href="admin.php?page=pmpro-membershiplevels&edit=-1" class="button add-new-h2">Add New Level</a></h2>
466
+ <form id="posts-filter" method="get" action="">
467
+ <p class="search-box">
468
+ <label class="screen-reader-text" for="post-search-input">Search Levels:</label>
469
+ <input type="hidden" name="page" value="pmpro-membershiplevels" />
470
+ <input id="post-search-input" type="text" value="<?php echo $s?>" name="s" size="30" />
471
+ <input class="button" type="submit" value="Search Levels" id="search-submit "/>
472
+ </p>
473
+ </form>
474
+
475
+ <br class="clear" />
476
+
477
+ <table class="widefat">
478
+ <thead>
479
+ <tr>
480
+ <th>ID</th>
481
+ <th>Name</th>
482
+ <th>Initial Payment</th>
483
+ <th>Billing Cycle</th>
484
+ <th>Trial Cycle</th>
485
+ <th>Expiration</th>
486
+ <th>Allow Signups</th>
487
+ <th></th>
488
+ <th></th>
489
+ <th></th>
490
+ </tr>
491
+ </thead>
492
+ <tbody>
493
+ <?php
494
+ $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
495
+ if($s)
496
+ $sqlQuery .= "WHERE name LIKE '%$s%' ";
497
+ $sqlQuery .= "ORDER BY id ASC";
498
+
499
+ $levels = $wpdb->get_results($sqlQuery, OBJECT);
500
+
501
+ foreach($levels as $level)
502
+ {
503
+ ?>
504
+ <tr class="<?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibilty($level)) { ?>pmpro_error<?php } ?>">
505
+ <td><?php echo $level->id?></td>
506
+ <td><?php echo $level->name?></td>
507
+ <td>
508
+ <?php if(pmpro_isLevelFree($level)) { ?>
509
+ FREE
510
+ <?php } else { ?>
511
+ <?php echo $pmpro_currency_symbol?><?php echo $level->initial_payment?>
512
+ <?php } ?>
513
+ </td>
514
+ <td>
515
+ <?php if(!pmpro_isLevelRecurring($level)) { ?>
516
+ --
517
+ <?php } else { ?>
518
+ <?php echo $pmpro_currency_symbol?><?php echo $level->billing_amount?> every <?php echo $level->cycle_number.' '.sornot($level->cycle_period,$level->cycle_number)?>
519
+
520
+ <?php if($level->billing_limit) { ?>(for <?php echo $level->billing_limit?> <?php echo sornot($level->cycle_period,$level->billing_limit)?>)<?php } ?>
521
+
522
+ <?php } ?>
523
+ </td>
524
+ <td>
525
+ <?php if(!pmpro_isLevelTrial($level)) { ?>
526
+ --
527
+ <?php } else { ?>
528
+ <?php echo $pmpro_currency_symbol?><?php echo $level->trial_amount?> for <?php echo $level->trial_limit?> <?php echo sornot("payment",$level->trial_limit)?>
529
+ <?php } ?>
530
+ </td>
531
+ <td>
532
+ <?php if(!pmpro_isLevelExpiring($level)) { ?>
533
+ --
534
+ <?php } else { ?>
535
+ After <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
536
+ <?php } ?>
537
+ </td>
538
+ <td><?php if($level->allow_signups) { ?>Yes<?php } else { ?>No<?php } ?></td>
539
+ <td align="center"><a href="admin.php?page=pmpro-membershiplevels&edit=<?php echo $level->id?>" class="edit">edit</a></td>
540
+ <td align="center"><a href="admin.php?page=pmpro-membershiplevels&copy=<?php echo $level->id?>&edit=-1" class="edit">copy</a></td>
541
+ <td align="center"><a href="javascript: askfirst('Are you sure you want to delete membership level <?php echo $level->name?>? All subscriptions will be canceled.','admin.php?page=pmpro-membershiplevels&action=delete_membership_level&deleteid=<?php echo $level->id?>'); void(0);" class="delete">delete</a></td>
542
+ </tr>
543
+ <?php
544
+ }
545
+ ?>
546
+ </tbody>
547
+ </table>
548
+ <?php
549
+ }
550
+ ?>
551
+
552
+ <?php
553
+ require_once(dirname(__FILE__) . "/admin_footer.php");
554
+ ?>
555
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/memberslist-csv.php CHANGED
@@ -1,12 +1,16 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist_csv")))
 
 
 
 
 
 
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
- global $wpdb;
9
-
10
  //get users
11
  if(isset($_REQUEST['s']))
12
  $s = $_REQUEST['s'];
@@ -34,210 +38,80 @@
34
  $end = $pn * $limit;
35
  $start = $end - $limit;
36
  }
37
- else
38
- {
39
- $end = NULL;
40
- $start = NULL;
41
- }
42
-
43
  if($s)
44
  {
45
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
46
-
47
- if($l == "oldmembers")
48
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
49
-
50
- $sqlQuery .= " WHERE mu.membership_id > 0 AND (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') ";
51
 
52
- if($l == "oldmembers")
53
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
54
- elseif($l)
55
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . esc_sql($l) . "' ";
56
- else
57
- $sqlQuery .= " AND mu.status = 'active' ";
58
 
59
- $sqlQuery .= "GROUP BY u.ID ";
60
-
61
- if($l == "oldmembers")
62
- $sqlQuery .= "ORDER BY enddate DESC ";
63
- else
64
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
65
-
66
- if($limit)
67
- $sqlQuery .= "LIMIT $start, $limit";
68
  }
69
  else
70
  {
71
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, UNIX_TIMESTAMP(mu.enddate) as enddate FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
72
-
73
- if($l == "oldmembers")
74
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
75
-
76
- $sqlQuery .= " WHERE mu.membership_id > 0 ";
77
-
78
- if($l == "oldmembers")
79
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
80
- elseif($l)
81
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
82
- else
83
- $sqlQuery .= " AND mu.status = 'active' ";
84
-
85
- $sqlQuery .= "GROUP BY u.ID ";
86
-
87
- if($l == "oldmembers")
88
- $sqlQuery .= "ORDER BY enddate DESC ";
89
- else
90
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
91
-
92
  if($limit)
93
  $sqlQuery .= "LIMIT $start, $limit";
94
  }
95
-
96
- //filter
97
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
98
-
99
- //get users
100
- $theusers = $wpdb->get_col($sqlQuery);
101
 
102
- //begin output
103
- header("Content-type: text/csv");
104
- if($s && $l == "oldmembers")
105
- header("Content-Disposition: attachment; filename=members_list_expired_" . sanitize_file_name($s) . ".csv");
106
- elseif($s && $l)
107
- header("Content-Disposition: attachment; filename=members_list_" . intval($l) . "_level_" . sanitize_file_name($s) . ".csv");
108
- elseif($s)
109
- header("Content-Disposition: attachment; filename=members_list_" . sanitize_file_name($s) . ".csv");
110
- elseif($l == "oldmembers")
111
- header("Content-Disposition: attachment; filename=members_list_expired.csv");
112
- else
113
- header("Content-Disposition: attachment; filename=members_list.csv");
114
-
115
- $heading = "id,username,firstname,lastname,email,billing firstname,billing lastname,address1,address2,city,state,zipcode,country,phone,membership,initial payment,fee,term,discount_code_id,discount_code,joined";
116
-
117
- if($l == "oldmembers")
118
- $heading .= ",ended";
119
- else
120
- $heading .= ",expires";
121
-
122
- $heading = apply_filters("pmpro_members_list_csv_heading", $heading);
123
- $csvoutput = $heading;
124
-
125
- //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
126
- $default_columns = array(
127
- array("theuser", "ID"),
128
- array("theuser", "user_login"),
129
- array("metavalues", "first_name"),
130
- array("metavalues", "last_name"),
131
- array("theuser", "user_email"),
132
- array("metavalues", "pmpro_bfirstname"),
133
- array("metavalues", "pmpro_blastname"),
134
- array("metavalues", "pmpro_baddress1"),
135
- array("metavalues", "pmpro_baddress2"),
136
- array("metavalues", "pmpro_bcity"),
137
- array("metavalues", "pmpro_bstate"),
138
- array("metavalues", "pmpro_bzipcode"),
139
- array("metavalues", "pmpro_bcountry"),
140
- array("metavalues", "pmpro_bphone"),
141
- array("theuser", "membership"),
142
- array("theuser", "initial_payment"),
143
- array("theuser", "billing_amount"),
144
- array("theuser", "cycle_period"),
145
- array("discount_code", "id"),
146
- array("discount_code", "code")
147
- //joindate and enddate are handled specifically below
148
- );
149
-
150
- //filter
151
- $default_columns = apply_filters("pmpro_members_list_csv_default_columns", $default_columns);
152
-
153
- //any extra columns
154
- $extra_columns = apply_filters("pmpro_members_list_csv_extra_columns", array());
155
- if(!empty($extra_columns))
156
- {
157
- foreach($extra_columns as $heading => $callback)
158
- {
159
- $csvoutput .= "," . $heading;
160
- }
161
- }
162
-
163
- $csvoutput .= "\n";
164
-
165
- //output
166
- echo $csvoutput;
167
- $csvoutput = "";
168
 
169
  if($theusers)
170
  {
171
- foreach($theusers as $user_id)
172
  {
173
- //MULTI: This query will need to be updated to support multiple levels per user. Should probably just dump multiple rows for each membership.
174
  //get meta
175
-
176
- if($l == "oldmembers")
177
- $theuser = $wpdb->get_row("SELECT u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE u.ID = '" . $user_id . "' ORDER BY mu.id DESC LIMIT 1");
178
- else
179
- $theuser = $wpdb->get_row("SELECT u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE u.ID = '" . $user_id . "' LIMIT 1");
180
-
181
- $sqlQuery = "SELECT meta_key as `key`, meta_value as `value` FROM $wpdb->usermeta WHERE $wpdb->usermeta.user_id = '" . $user_id . "'";
182
  $metavalues = pmpro_getMetavalues($sqlQuery);
183
- $theuser->metavalues = $metavalues;
184
- $sqlQuery = "SELECT c.id, c.code FROM $wpdb->pmpro_discount_codes_uses cu LEFT JOIN $wpdb->pmpro_discount_codes c ON cu.code_id = c.id WHERE cu.user_id = '" . $theuser->ID . "' ORDER BY c.id DESC LIMIT 1";
185
- $discount_code = $wpdb->get_row($sqlQuery);
186
-
187
- //default columns
188
- if(!empty($default_columns))
189
- {
190
- $count = 0;
191
- foreach($default_columns as $col)
192
- {
193
- //add comma after the first item
194
- $count++;
195
- if($count > 1)
196
- $csvoutput .= ",";
197
-
198
- //checking $object->property. note the double $$
199
- if(!empty($$col[0]->$col[1]))
200
- $csvoutput .= pmpro_enclose($$col[0]->$col[1]); //output the value
201
- }
202
- }
203
-
204
- //joindate and enddate
205
- $csvoutput .= "," . pmpro_enclose(date("Y-m-d", $theuser->joindate)) . ",";
206
-
207
- if($theuser->membership_id)
208
- {
209
- if($theuser->enddate)
210
- $csvoutput .= pmpro_enclose(apply_filters("pmpro_memberslist_expires_column", date("Y-m-d", $theuser->enddate), $theuser));
211
- else
212
- $csvoutput .= pmpro_enclose(apply_filters("pmpro_memberslist_expires_column", "Never", $theuser));
213
- }
214
- elseif($l == "oldmembers" && $theuser->enddate)
215
- {
216
- $csvoutput .= pmpro_enclose(date("Y-m-d", $theuser->enddate));
217
- }
218
  else
219
- $csvoutput .= "N/A";
220
-
221
- //any extra columns
222
- if(!empty($extra_columns))
223
- {
224
- foreach($extra_columns as $heading => $callback)
225
- {
226
- $csvoutput .= "," . pmpro_enclose(call_user_func($callback, $theuser, $heading));
227
- }
228
- }
229
-
230
  $csvoutput .= "\n";
231
-
232
- //output
233
- echo $csvoutput;
234
- $csvoutput = "";
235
  }
236
  }
237
-
 
 
 
 
 
 
 
 
 
 
 
 
238
  print $csvoutput;
239
 
240
- function pmpro_enclose($s)
241
  {
242
  return "\"" . str_replace("\"", "\\\"", $s) . "\"";
243
- }
 
1
+ <?php
2
+ //this file is launched via AJAX to get various data from the DB for the stranger_products plugin
3
+
4
+ //wp includes
5
+ define('WP_USE_THEMES', false);
6
+ require('../../../../wp-load.php');
7
+
8
+ //only admins can get this (PATCH!)
9
+ if(!function_exists("current_user_can") || !current_user_can("manage_options"))
10
  {
11
+ die("You do not have permissions to perform this action.");
12
  }
13
 
 
 
14
  //get users
15
  if(isset($_REQUEST['s']))
16
  $s = $_REQUEST['s'];
38
  $end = $pn * $limit;
39
  $start = $end - $limit;
40
  }
41
+
 
 
 
 
 
42
  if($s)
43
  {
44
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE mu.membership_id > 0 AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
 
 
 
 
 
45
 
46
+ if($l)
47
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
 
 
 
 
48
 
49
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
 
 
 
 
 
 
 
 
50
  }
51
  else
52
  {
53
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
54
+ $sqlQuery .= "WHERE mu.membership_id > 0 ";
55
+ if($l)
56
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
57
+ $sqlQuery .= "ORDER BY user_registered DESC ";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  if($limit)
59
  $sqlQuery .= "LIMIT $start, $limit";
60
  }
 
 
 
 
 
 
61
 
62
+ $theusers = $wpdb->get_results($sqlQuery);
63
+ $csvoutput = "id,username,firstname,lastname,email,billing firstname,billing lastname,address1,address2,city,state,zipcode,phone,membership,fee,term,joined,expires\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
  if($theusers)
66
  {
67
+ foreach($theusers as $theuser)
68
  {
 
69
  //get meta
70
+ $sqlQuery = "SELECT meta_key as `key`, meta_value as `value` FROM $wpdb->usermeta WHERE $wpdb->usermeta.user_id = '" . $theuser->ID . "'";
 
 
 
 
 
 
71
  $metavalues = pmpro_getMetavalues($sqlQuery);
72
+
73
+ $csvoutput .= enclose($theuser->ID) . "," .
74
+ enclose($theuser->user_login) . "," .
75
+ enclose($metavalues->first_name) . "," .
76
+ enclose($metavalues->last_name) . "," .
77
+ enclose($theuser->user_email) . "," .
78
+ enclose($metavalues->pmpro_bfirstname) . "," .
79
+ enclose($metavalues->pmpro_blastname) . "," .
80
+ enclose($metavalues->pmpro_baddress1) . "," .
81
+ enclose($metavalues->pmpro_baddress2) . "," .
82
+ enclose($metavalues->pmpro_bcity) . "," .
83
+ enclose($metavalues->pmpro_bstate) . "," .
84
+ enclose($metavalues->pmpro_bzipcode) . "," .
85
+ enclose($metavalues->pmpro_bphone) . "," .
86
+ enclose($theuser->membership) . "," .
87
+ enclose($theuser->billing_amount) . "," .
88
+ enclose($theuser->cycle_period) . "," .
89
+ enclose(date("m/d/Y", $theuser->joindate)) . ",";
90
+ if($theuser->enddate)
91
+ $csvoutput .= enclose(date("m/d/Y", $theuser->enddate));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  else
93
+ $csvoutput .= enclose("Never");
 
 
 
 
 
 
 
 
 
 
94
  $csvoutput .= "\n";
95
+
 
 
 
96
  }
97
  }
98
+
99
+ $size_in_bytes = strlen($csvoutput);
100
+ header("Content-type: text/csv");
101
+ //header("Content-type: application/vnd.ms-excel");
102
+ if($s && $l)
103
+ header("Content-Disposition: attachment; filename=members_list_" . $l . "_level" . $s . ".csv; size=$size_in_bytes");
104
+ elseif($s)
105
+ header("Content-Disposition: attachment; filename=members_list_" . $s . ".csv; size=$size_in_bytes");
106
+ elseif($l)
107
+ header("Content-Disposition: attachment; filename=members_list_level" . $l . ".csv; size=$size_in_bytes");
108
+ else
109
+ header("Content-Disposition: attachment; filename=members_list.csv; size=$size_in_bytes");
110
+
111
  print $csvoutput;
112
 
113
+ function enclose($s)
114
  {
115
  return "\"" . str_replace("\"", "\\\"", $s) . "\"";
116
+ }
117
+ ?>
adminpages/memberslist.php CHANGED
@@ -1,238 +1,177 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- //vars
9
- global $wpdb, $pmpro_currency_symbol;
10
- if(isset($_REQUEST['s']))
11
- $s = $_REQUEST['s'];
12
- else
13
- $s = "";
14
-
15
- if(isset($_REQUEST['l']))
16
- $l = $_REQUEST['l'];
17
- else
18
- $l = false;
19
-
20
- require_once(dirname(__FILE__) . "/admin_header.php");
21
- ?>
22
-
23
- <form id="posts-filter" method="get" action="">
24
- <h2>
25
- <?php _e('Members List', 'pmpro');?>
26
- <a target="_blank" href="<?php echo admin_url('admin-ajax.php');?>?action=memberslist_csv&s=<?php echo $s?>&l=<?php echo $l?>" class="add-new-h2"><?php _e('Export to CSV', 'pmpro');?></a>
27
- </h2>
28
- <ul class="subsubsub">
29
- <li>
30
- <?php _e('Show', 'pmpro');?>
31
- <select name="l" onchange="jQuery('#posts-filter').submit();">
32
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
33
- <?php
34
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
35
- foreach($levels as $level)
36
- {
37
- ?>
38
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
39
- <?php
40
- }
41
- ?>
42
- <option value="oldmembers" <?php if($l == "oldmembers") { ?>selected="selected"<?php } ?>><?php _e('Old Members', 'pmpro');?></option>
43
- </select>
44
- </li>
45
- </ul>
46
- <p class="search-box">
47
- <label class="hidden" for="post-search-input"><?php _e('Search Members', 'pmpro');?>:</label>
48
- <input type="hidden" name="page" value="pmpro-memberslist" />
49
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
50
- <input class="button" type="submit" value="<?php _e('Search Members', 'pmpro');?>"/>
51
- </p>
52
- <?php
53
- //some vars for the search
54
- if(isset($_REQUEST['pn']))
55
- $pn = $_REQUEST['pn'];
56
- else
57
- $pn = 1;
58
-
59
- if(isset($_REQUEST['limit']))
60
- $limit = $_REQUEST['limit'];
61
- else
62
- $limit = 15;
63
-
64
- $end = $pn * $limit;
65
- $start = $end - $limit;
66
-
67
- if($s)
68
- {
69
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
70
-
71
- if($l == "oldmembers")
72
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
73
-
74
- $sqlQuery .= " WHERE mu.membership_id > 0 AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
75
-
76
- if($l == "oldmembers")
77
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
78
- elseif($l)
79
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
80
- else
81
- $sqlQuery .= " AND mu.status = 'active' ";
82
-
83
- $sqlQuery .= "GROUP BY u.ID ";
84
-
85
- if($l == "oldmembers")
86
- $sqlQuery .= "ORDER BY enddate DESC ";
87
- else
88
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
89
-
90
- $sqlQuery .= "LIMIT $start, $limit";
91
- }
92
- else
93
- {
94
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
95
-
96
- if($l == "oldmembers")
97
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
98
-
99
- $sqlQuery .= " WHERE mu.membership_id > 0 ";
100
-
101
- if($l == "oldmembers")
102
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
103
- elseif($l)
104
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
105
- else
106
- $sqlQuery .= " AND mu.status = 'active' ";
107
- $sqlQuery .= "GROUP BY u.ID ";
108
-
109
- if($l == "oldmembers")
110
- $sqlQuery .= "ORDER BY enddate DESC ";
111
- else
112
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
113
-
114
- $sqlQuery .= "LIMIT $start, $limit";
115
- }
116
-
117
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
118
-
119
- $theusers = $wpdb->get_results($sqlQuery);
120
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
121
-
122
- if($theusers)
123
- {
124
- $calculate_revenue = apply_filters("pmpro_memberslist_calculate_revenue", false);
125
- if($calculate_revenue)
126
- {
127
- $initial_payments = pmpro_calculateInitialPaymentRevenue($s, $l);
128
- $recurring_payments = pmpro_calculateRecurringRevenue($s, $l);
129
- ?>
130
- <p class="clear"><?php echo strval($totalrows)?> members found. These members have paid <strong>$<?php echo number_format($initial_payments)?> in initial payments</strong> and will generate an estimated <strong>$<?php echo number_format($recurring_payments)?> in revenue over the next year</strong>, or <strong>$<?php echo number_format($recurring_payments/12)?>/month</strong>. <span class="pmpro_lite">(This estimate does not take into account trial periods or billing limits.)</span></p>
131
- <?php
132
- }
133
- else
134
- {
135
- ?>
136
- <p class="clear"><?php printf(__("%d members found.", "pmpro"), $totalrows);?></span></p>
137
- <?php
138
- }
139
- }
140
- ?>
141
- <table class="widefat">
142
- <thead>
143
- <tr class="thead">
144
- <th><?php _e('ID', 'pmpro');?></th>
145
- <th><?php _e('Username', 'pmpro');?></th>
146
- <th><?php _e('First&nbsp;Name', 'pmpro');?></th>
147
- <th><?php _e('Last&nbsp;Name', 'pmpro');?></th>
148
- <th><?php _e('Email', 'pmpro');?></th>
149
- <?php do_action("pmpro_memberslist_extra_cols_header", $theusers);?>
150
- <th><?php _e('Billing Address', 'pmpro');?></th>
151
- <th><?php _e('Membership', 'pmpro');?></th>
152
- <th><?php _e('Fee', 'pmpro');?></th>
153
- <th><?php _e('Joined', 'pmpro');?></th>
154
- <th>
155
- <?php
156
- if($l == "oldmembers")
157
- _e('Ended', 'pmpro');
158
- else
159
- _e('Expires', 'pmpro');
160
- ?>
161
- </th>
162
- </tr>
163
- </thead>
164
- <tbody id="users" class="list:user user-list">
165
- <?php
166
- $count = 0;
167
- foreach($theusers as $auser)
168
- {
169
- //get meta
170
- $theuser = get_userdata($auser->ID);
171
- ?>
172
- <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
173
- <td><?php echo $theuser->ID?></td>
174
- <td>
175
- <?php echo get_avatar($theuser->ID, 32)?>
176
- <strong>
177
- <?php
178
- $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
179
- $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
180
- echo $userlink;
181
- ?>
182
- </strong>
183
- </td>
184
- <td><?php echo $theuser->first_name?></td>
185
- <td><?php echo $theuser->last_name?></td>
186
- <td><a href="mailto:<?php echo $theuser->user_email?>"><?php echo $theuser->user_email?></a></td>
187
- <?php do_action("pmpro_memberslist_extra_cols_body", $theuser);?>
188
- <td>
189
- <?php
190
- echo pmpro_formatAddress(trim($theuser->pmpro_bfirstname . " " . $theuser->pmpro_blastname), $theuser->pmpro_baddress1, $theuser->pmpro_baddress2, $theuser->pmpro_bcity, $theuser->pmpro_bstate, $theuser->pmpro_bzipcode, $theuser->pmpro_bcountry, $theuser->pmpro_bphone);
191
- ?>
192
- </td>
193
- <td><?php echo $auser->membership?></td>
194
- <td>
195
- <?php if((float)$auser->initial_payment > 0) { ?>
196
- <?php echo $pmpro_currency_symbol; ?><?php echo $auser->initial_payment?>
197
- <?php } ?>
198
- <?php if((float)$auser->initial_payment > 0 && (float)$auser->billing_amount > 0) { ?>+<br /><?php } ?>
199
- <?php if((float)$auser->billing_amount > 0) { ?>
200
- <?php echo $pmpro_currency_symbol; ?><?php echo $auser->billing_amount?>/<?php echo $auser->cycle_period?>
201
- <?php } ?>
202
- <?php if((float)$auser->initial_payment <= 0 && (float)$auser->billing_amount <= 0) { ?>
203
- -
204
- <?php } ?>
205
- </td>
206
- <td><?php echo date(get_option("date_format"), strtotime($theuser->user_registered, current_time("timestamp")))?></td>
207
- <td>
208
- <?php
209
- if($auser->enddate)
210
- echo apply_filters("pmpro_memberslist_expires_column", date(get_option('date_format'), $auser->enddate), $auser);
211
- else
212
- echo __(apply_filters("pmpro_memberslist_expires_column", "Never", $auser), "pmpro");
213
- ?>
214
- </td>
215
- </tr>
216
- <?php
217
- }
218
-
219
- if(!$theusers)
220
- {
221
- ?>
222
- <tr>
223
- <td colspan="9"><p><?php _e("No members found.", "pmpro");?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>"><?php _e("Search all levels", "pmpro");?></a>.<?php } ?></p></td>
224
- </tr>
225
- <?php
226
- }
227
- ?>
228
- </tbody>
229
- </table>
230
- </form>
231
-
232
- <?php
233
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-memberslist&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
234
- ?>
235
-
236
- <?php
237
- require_once(dirname(__FILE__) . "/admin_footer.php");
238
- ?>
1
+ <?php
2
+ //vars
3
+ global $wpdb;
4
+ if(isset($_REQUEST['s']))
5
+ $s = $_REQUEST['s'];
6
+ else
7
+ $s = "";
8
+
9
+ if(isset($_REQUEST['l']))
10
+ $l = $_REQUEST['l'];
11
+ else
12
+ $l = false;
13
+ ?>
14
+ <div class="wrap pmpro_admin">
15
+ <div class="pmpro_banner">
16
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
17
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
18
+
19
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
20
+ </div>
21
+ <br style="clear:both;" />
22
+
23
+ <form id="posts-filter" method="get" action="">
24
+ <h2>
25
+ Members Report
26
+ <small>(<a target="_blank" href="<?php echo PMPRO_URL?>/adminpages/memberslist-csv.php?s=<?php echo $s?>&l=<?php echo $l?>">Export to CSV</a>)</small>
27
+ </h2>
28
+ <ul class="subsubsub">
29
+ <li>
30
+ Show <select name="l" onchange="jQuery('#posts-filter').submit();">
31
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>>All Levels</option>
32
+ <?php
33
+ $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
34
+ foreach($levels as $level)
35
+ {
36
+ ?>
37
+ <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
38
+ <?php
39
+ }
40
+ ?>
41
+ </select>
42
+ </li>
43
+ </ul>
44
+ <p class="search-box">
45
+ <label class="hidden" for="post-search-input">Search Members:</label>
46
+ <input type="hidden" name="page" value="pmpro-memberslist" />
47
+ <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
48
+ <input class="button" type="submit" value="Search Members"/>
49
+ </p>
50
+ <?php
51
+ //some vars for the search
52
+ if(isset($_REQUEST['pn']))
53
+ $pn = $_REQUEST['pn'];
54
+ else
55
+ $pn = 1;
56
+
57
+ if(isset($_REQUEST['limit']))
58
+ $limit = $_REQUEST['limit'];
59
+ else
60
+ $limit = 15;
61
+
62
+ $end = $pn * $limit;
63
+ $start = $end - $limit;
64
+
65
+ if($s)
66
+ {
67
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE mu.membership_id > 0 AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
68
+
69
+ if($l)
70
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
71
+
72
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
73
+ }
74
+ else
75
+ {
76
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
77
+ $sqlQuery .= "WHERE mu.membership_id > 0 ";
78
+ if($l)
79
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
80
+ $sqlQuery .= "ORDER BY user_registered DESC LIMIT $start, $limit";
81
+ }
82
+
83
+ $theusers = $wpdb->get_results($sqlQuery);
84
+ $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
85
+
86
+ if($theusers)
87
+ {
88
+ $initial_payments = pmpro_calculateInitialPaymentRevenue($s, $l);
89
+ $recurring_payments = pmpro_calculateRecurringRevenue($s, $l);
90
+ ?>
91
+ <p class="clear"><?php echo strval($totalrows)?> members found. These members have paid <strong>$<?php echo number_format($initial_payments)?> in initial payments</strong> and will generate an estimated <strong>$<?php echo number_format($recurring_payments)?> in revenue over the next year</strong>, or <strong>$<?php echo number_format($recurring_payments/12)?>/month</strong>. <span class="pmpro_lite">(This estimate does not take into account trial periods or billing limits.)</span></p>
92
+ <?php
93
+ }
94
+ ?>
95
+ <table class="widefat">
96
+ <thead>
97
+ <tr class="thead">
98
+ <th>ID</th>
99
+ <th>Username</th>
100
+ <th>First&nbsp;Name</th>
101
+ <th>Last&nbsp;Name</th>
102
+ <th>Email</th>
103
+ <th>Billing Address</th>
104
+ <th>Membership</th>
105
+ <th>Fee</th>
106
+ <th>Joined</th>
107
+ <th>Expires</th>
108
+ </tr>
109
+ </thead>
110
+ <tbody id="users" class="list:user user-list">
111
+ <?php
112
+ $count = 0;
113
+ foreach($theusers as $theuser)
114
+ {
115
+ //get meta
116
+ $sqlQuery = "SELECT meta_key as `key`, meta_value as `value` FROM $wpdb->usermeta WHERE $wpdb->usermeta.user_id = '" . $theuser->ID . "'";
117
+ $metavalues = pmpro_getMetavalues($sqlQuery);
118
+ ?>
119
+ <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
120
+ <td><?php echo $theuser->ID?></td>
121
+ <td>
122
+ <?php echo get_avatar($theuser->ID, 32)?>
123
+ <strong><a href="user-edit.php?user_id=<?php echo $theuser->ID?>"><?php echo $theuser->user_login?></a></strong>
124
+ </td>
125
+ <td><?php echo $metavalues->first_name?></td>
126
+ <td><?php echo $metavalues->last_name?></td>
127
+ <td><a href="mailto:<?php echo $theuser->user_email?>"><?php echo $theuser->user_email?></a></td>
128
+ <td>
129
+ <?php echo trim($metavalues->pmpro_bfirstname . " " . $metavalues->pmpro_blastname);?><br />
130
+ <?php echo $metavalues->pmpro_baddress1; ?><br />
131
+ <?php if(!empty($metavalues->pmpro_baddress2)) echo $metavalues->pmpro_baddress2 . "<br />"; ?>
132
+ <?php if($metavalues->pmpro_bcity && $metavalues->pmpro_bstate) { ?>
133
+ <?php echo $metavalues->pmpro_bcity?>, <?php echo $metavalues->pmpro_bstate?> <?php echo $metavalues->pmpro_bzipcode?><br />
134
+ <?php } ?>
135
+ <?php echo formatPhone($metavalues->pmpro_bphone)?>
136
+ </td>
137
+ <td><?php echo $theuser->membership?></td>
138
+ <td>
139
+ <?php if($theuser->billing_amount > 0) { ?>
140
+ $<?php echo $theuser->billing_amount?>/<?php echo $theuser->cycle_period?>
141
+ <?php } else { ?>
142
+ -
143
+ <?php } ?>
144
+ </td>
145
+ <td><?php echo date("m/d/Y", $theuser->joindate)?></td>
146
+ <td>
147
+ <?php
148
+ if($theuser->enddate)
149
+ echo date("m/d/Y", $theuser->enddate);
150
+ else
151
+ echo "Never";
152
+ ?>
153
+ </td>
154
+ </tr>
155
+ <?php
156
+ }
157
+
158
+ if(!$theusers)
159
+ {
160
+ ?>
161
+ <tr>
162
+ <td colspan="9"><p>No members found. <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>">Search all levels</a>.<?php } ?></p></td>
163
+ </tr>
164
+ <?php
165
+ }
166
+ ?>
167
+ </tbody>
168
+ </table>
169
+ </form>
170
+
171
+ <?php
172
+ echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-memberslist&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
173
+ ?>
174
+
175
+ </div>
176
+ <?php
177
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/orders-csv.php DELETED
@@ -1,297 +0,0 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders_csv")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb;
9
-
10
- //get users
11
- if(isset($_REQUEST['s']))
12
- $s = $_REQUEST['s'];
13
- else
14
- $s = "";
15
-
16
- if(isset($_REQUEST['l']))
17
- $l = $_REQUEST['l'];
18
- else
19
- $l = false;
20
-
21
- if(isset($_REQUEST['start-month']))
22
- $start_month = $_REQUEST['start-month'];
23
- else
24
- $start_month = "1";
25
-
26
- if(isset($_REQUEST['start-day']))
27
- $start_day = $_REQUEST['start-day'];
28
- else
29
- $start_day = "1";
30
-
31
- if(isset($_REQUEST['start-year']))
32
- $start_year = $_REQUEST['start-year'];
33
- else
34
- $start_year = date("Y");
35
-
36
- if(isset($_REQUEST['end-month']))
37
- $end_month = $_REQUEST['end-month'];
38
- else
39
- $end_month = date("n");
40
-
41
- if(isset($_REQUEST['end-day']))
42
- $end_day = $_REQUEST['end-day'];
43
- else
44
- $end_day = date("j");
45
-
46
- if(isset($_REQUEST['end-year']))
47
- $end_year = $_REQUEST['end-year'];
48
- else
49
- $end_year = date("Y");
50
-
51
- if(isset($_REQUEST['predefined-date']))
52
- $predefined_date = $_REQUEST['predefined-date'];
53
- else
54
- $predefined_date = "This Month";
55
-
56
- if(isset($_REQUEST['status']))
57
- $status = $_REQUEST['status'];
58
- else
59
- $status = "";
60
-
61
- if(isset($_REQUEST['filter']))
62
- $filter = sanitize_text_field($_REQUEST['filter']);
63
- else
64
- $filter = "all";
65
-
66
- //some vars for the search
67
- if(!empty($_REQUEST['pn']))
68
- $pn = $_REQUEST['pn'];
69
- else
70
- $pn = 1;
71
-
72
- if(!empty($_REQUEST['limit']))
73
- $limit = $_REQUEST['limit'];
74
- else
75
- $limit = false;
76
-
77
- if($limit)
78
- {
79
- $end = $pn * $limit;
80
- $start = $end - $limit;
81
- }
82
- else
83
- {
84
- $end = NULL;
85
- $start = NULL;
86
- }
87
-
88
- //filters
89
- if($filter == "all" || !$filter)
90
- $condition = "1=1";
91
- elseif($filter == "within-a-date-range")
92
- {
93
- $start_date = $start_year."-".$start_month."-".$start_day;
94
- $end_date = $end_year."-".$end_month."-".$end_day;
95
-
96
- //add times to dates
97
- $start_date = $start_date . " 00:00:00";
98
- $end_date = $end_date . " 23:59:59";
99
-
100
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
101
- }
102
- elseif($filter == "predefined-date-range")
103
- {
104
- if($predefined_date == "Last Month")
105
- {
106
- $start_date = date("Y-m-d", strtotime("first day of last month", current_time("timestamp")));
107
- $end_date = date("Y-m-d", strtotime("last day of last month", current_time("timestamp")));
108
- }
109
- elseif($predefined_date == "This Month")
110
- {
111
- $start_date = date("Y-m-d", strtotime("first day of this month", current_time("timestamp")));
112
- $end_date = date("Y-m-d", strtotime("last day of this month", current_time("timestamp")));
113
- }
114
- elseif($predefined_date == "This Year")
115
- {
116
- $year = date('Y');
117
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
118
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
119
- }
120
-
121
- elseif($predefined_date == "Last Year")
122
- {
123
- $year = date('Y') - 1;
124
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
125
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
126
- }
127
-
128
- //add times to dates
129
- $start_date = $start_date . " 00:00:00";
130
- $end_date = $end_date . " 23:59:59";
131
-
132
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
133
- }
134
- elseif($filter == "within-a-level")
135
- {
136
- $condition = "membership_id = $l";
137
- }
138
- elseif($filter == "within-a-status")
139
- {
140
- $condition = "status = '$status' ";
141
- }
142
-
143
- //string search
144
- if($s)
145
- {
146
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS o.id FROM $wpdb->pmpro_membership_orders o LEFT JOIN $wpdb->users u ON o.user_id = u.ID LEFT JOIN $wpdb->pmpro_membership_levels l ON o.membership_id = l.id ";
147
-
148
- $join_with_usermeta = apply_filters("pmpro_orders_search_usermeta", false);
149
- if($join_with_usermeta)
150
- $sqlQuery .= "LEFT JOIN $wpdb->usermeta um ON o.user_id = um.user_id ";
151
-
152
- $sqlQuery .= "WHERE (1=2 ";
153
-
154
- $fields = array("o.id", "o.code", "o.billing_name", "o.billing_street", "o.billing_city", "o.billing_state", "o.billing_zip", "o.billing_phone", "o.payment_type", "o.cardtype", "o.accountnumber", "o.status", "o.gateway", "o.gateway_environment", "o.payment_transaction_id", "o.subscription_transaction_id", "u.user_login", "u.user_email", "u.display_name", "l.name");
155
-
156
- if($join_with_usermeta)
157
- $fields[] = "um.meta_value";
158
-
159
- $fields = apply_filters("pmpro_orders_search_fields", $fields);
160
-
161
- foreach($fields as $field)
162
- $sqlQuery .= " OR " . $field . " LIKE '%" . esc_sql($s) . "%' ";
163
- $sqlQuery .= ") ";
164
-
165
- $sqlQuery .= "AND " . $condition . " ";
166
-
167
- $sqlQuery .= "GROUP BY o.id ORDER BY o.id DESC, o.timestamp DESC ";
168
- }
169
- else
170
- {
171
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders WHERE ".$condition." ORDER BY id DESC, timestamp DESC ";
172
- }
173
-
174
- if(!empty($start) && !empty($limit))
175
- $sqlQuery .= "LIMIT $start, $limit";
176
-
177
- $order_ids = $wpdb->get_col($sqlQuery);
178
-
179
- //begin output
180
- header("Content-type: text/csv");
181
-
182
- $filename = "orders.csv";
183
- /*
184
- Insert logic here for building filename from $filter and other values.
185
- */
186
- header("Content-Disposition: attachment; filename=$filename;");
187
-
188
- $csvoutput = "id,user_id,user_login,first_name,last_name,user_email,billing_name,billing_street,billing_city,billing_state,billing_zip,billing_country,billing_phone,membership_id,level_name,subtotal,tax,couponamount,total,payment_type,cardtype,accountnumber,expirationmonth,expirationyear,status,gateway,gateway_environment,payment_transaction_id,subscription_transaction_id,discount_code_id,discount_code,timestamp";
189
-
190
- //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
191
- $default_columns = array(
192
- array("order", "id"),
193
- array("user", "ID"),
194
- array("user", "user_login"),
195
- array("user", "first_name"),
196
- array("user", "last_name"),
197
- array("user", "user_email"),
198
- array("order", "billing", "name"),
199
- array("order", "billing", "street"),
200
- array("order", "billing", "city"),
201
- array("order", "billing", "state"),
202
- array("order", "billing", "zip"),
203
- array("order", "billing", "country"),
204
- array("order", "billing", "phone"),
205
- array("order", "membership_id"),
206
- array("level", "name"),
207
- array("order", "subtotal"),
208
- array("order", "tax"),
209
- array("order", "couponamount"),
210
- array("order", "total"),
211
- array("order", "payment_type"),
212
- array("order", "cardtype"),
213
- array("order", "accountnumber"),
214
- array("order", "expirationmonth"),
215
- array("order", "expirationyear"),
216
- array("order", "status"),
217
- array("order", "gateway"),
218
- array("order", "gateway_environment"),
219
- array("order", "payment_transaction_id"),
220
- array("order", "subscription_transactiond_id"),
221
- array("discount_code", "id"),
222
- array("discount_code", "code")
223
- );
224
-
225
- //any extra columns
226
- $extra_columns = apply_filters("pmpro_orders_csv_extra_columns", array());
227
- if(!empty($extra_columns))
228
- {
229
- foreach($extra_columns as $heading => $callback)
230
- {
231
- $csvoutput .= "," . $heading;
232
- }
233
- }
234
-
235
- $csvoutput .= "\n";
236
-
237
- //output
238
- echo $csvoutput;
239
- $csvoutput = "";
240
-
241
- if($order_ids)
242
- {
243
- foreach($order_ids as $order_id)
244
- {
245
- $order = new MemberOrder();
246
- $order->nogateway = true;
247
- $order->getMemberOrderByID($order_id);
248
- $user = get_userdata($order->user_id);
249
- $level = $order->getMembershipLevel();
250
- $sqlQuery = "SELECT c.id, c.code FROM $wpdb->pmpro_discount_codes_uses cu LEFT JOIN $wpdb->pmpro_discount_codes c ON cu.code_id = c.id WHERE cu.order_id = '" . $order_id . "' LIMIT 1";
251
- $discount_code = $wpdb->get_row($sqlQuery);
252
-
253
- //default columns
254
- if(!empty($default_columns))
255
- {
256
- $count = 0;
257
- foreach($default_columns as $col)
258
- {
259
- //add comma after the first item
260
- $count++;
261
- if($count > 1)
262
- $csvoutput .= ",";
263
-
264
- //checking $object->property. note the double $$
265
- if(!empty($col[2]) && isset($$col[0]->$col[1]->$col[2]))
266
- $csvoutput .= pmpro_enclose($$col[0]->$col[1]->$col[2]); //output the value
267
- elseif(!empty($$col[0]->$col[1]))
268
- $csvoutput .= pmpro_enclose($$col[0]->$col[1]); //output the value
269
- }
270
- }
271
-
272
- //timestamp
273
- $csvoutput .= "," . pmpro_enclose(date(get_option("date_format"), $order->timestamp));
274
-
275
- //any extra columns
276
- if(!empty($extra_columns))
277
- {
278
- foreach($extra_columns as $heading => $callback)
279
- {
280
- $csvoutput .= "," . pmpro_enclose(call_user_func($callback, $order));
281
- }
282
- }
283
-
284
- $csvoutput .= "\n";
285
-
286
- //output
287
- echo $csvoutput;
288
- $csvoutput = "";
289
- }
290
- }
291
-
292
- print $csvoutput;
293
-
294
- function pmpro_enclose($s)
295
- {
296
- return "\"" . str_replace("\"", "\\\"", $s) . "\"";
297
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/orders.php DELETED
@@ -1,996 +0,0 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- //vars
9
- global $wpdb, $pmpro_currency_symbol;
10
- if(isset($_REQUEST['s']))
11
- $s = $_REQUEST['s'];
12
- else
13
- $s = "";
14
-
15
- if(isset($_REQUEST['l']))
16
- $l = $_REQUEST['l'];
17
- else
18
- $l = false;
19
-
20
- if(isset($_REQUEST['start-month']))
21
- $start_month = $_REQUEST['start-month'];
22
- else
23
- $start_month = "1";
24
-
25
- if(isset($_REQUEST['start-day']))
26
- $start_day = $_REQUEST['start-day'];
27
- else
28
- $start_day = "1";
29
-
30
- if(isset($_REQUEST['start-year']))
31
- $start_year = $_REQUEST['start-year'];
32
- else
33
- $start_year = date("Y");
34
-
35
- if(isset($_REQUEST['end-month']))
36
- $end_month = $_REQUEST['end-month'];
37
- else
38
- $end_month = date("n");
39
-
40
- if(isset($_REQUEST['end-day']))
41
- $end_day = $_REQUEST['end-day'];
42
- else
43
- $end_day = date("j");
44
-
45
- if(isset($_REQUEST['end-year']))
46
- $end_year = $_REQUEST['end-year'];
47
- else
48
- $end_year = date("Y");
49
-
50
- if(isset($_REQUEST['predefined-date']))
51
- $predefined_date = $_REQUEST['predefined-date'];
52
- else
53
- $predefined_date = "This Month";
54
-
55
- if(isset($_REQUEST['status']))
56
- $status = $_REQUEST['status'];
57
- else
58
- $status = "";
59
-
60
-
61
- //deleting?
62
- if(!empty($_REQUEST['delete']))
63
- {
64
- $dorder = new MemberOrder(intval($_REQUEST['delete']));
65
- if($dorder->deleteMe())
66
- {
67
- $pmpro_msg = __("Order deleted successfully.", "pmpro");
68
- $pmpro_msgt = "success";
69
- }
70
- else
71
- {
72
- $pmpro_msg = __("Error deleting order.", "pmpro");
73
- $pmpro_msgt = "error";
74
- }
75
- }
76
-
77
- if(isset($_REQUEST['filter']))
78
- $filter = sanitize_text_field($_REQUEST['filter']);
79
- else
80
- $filter = "all";
81
-
82
- $thisyear = date("Y");
83
-
84
-
85
-
86
- //this array stores fields that should be read only
87
- $read_only_fields = apply_filters("pmpro_orders_read_only_fields", array("code", "payment_transaction_id", "subscription_transaction_id"));
88
-
89
- //saving?
90
- if(!empty($_REQUEST['save']))
91
- {
92
- //start with old order if applicable
93
- $order_id = intval($_REQUEST['order']);
94
- if($order_id > 0)
95
- $order = new MemberOrder($order_id);
96
- else
97
- $order = new MemberOrder();
98
-
99
- //update values
100
- if(!in_array("code", $read_only_fields))
101
- $order->code = $_POST['code'];
102
- if(!in_array("user_id", $read_only_fields))
103
- $order->user_id = intval($_POST['user_id']);
104
- if(!in_array("membership_id", $read_only_fields))
105
- $order->membership_id = intval($_POST['membership_id']);
106
- if(!in_array("billing_name", $read_only_fields))
107
- $order->billing->name = stripslashes($_POST['billing_name']);
108
- if(!in_array("billing_street", $read_only_fields))
109
- $order->billing->street = stripslashes($_POST['billing_street']);
110
- if(!in_array("billing_city", $read_only_fields))
111
- $order->billing->city = stripslashes($_POST['billing_city']);
112
- if(!in_array("billing_state", $read_only_fields))
113
- $order->billing->state = stripslashes($_POST['billing_state']);
114
- if(!in_array("billing_zip", $read_only_fields))
115
- $order->billing->zip = $_POST['billing_zip'];
116
- if(!in_array("billing_country", $read_only_fields))
117
- $order->billing->country = stripslashes($_POST['billing_country']);
118
- if(!in_array("billing_phone", $read_only_fields))
119
- $order->billing->phone = $_POST['billing_phone'];
120
- if(!in_array("subtotal", $read_only_fields))
121
- $order->subtotal = $_POST['subtotal'];
122
- if(!in_array("tax", $read_only_fields))
123
- $order->tax = $_POST['tax'];
124
- if(!in_array("couponamount", $read_only_fields))
125
- $order->couponamount = $_POST['couponamount'];
126
- if(!in_array("total", $read_only_fields))
127
- $order->total = $_POST['total'];
128
- if(!in_array("payment_type", $read_only_fields))
129
- $order->payment_type = $_POST['payment_type'];
130
- if(!in_array("cardtype", $read_only_fields))
131
- $order->cardtype = $_POST['cardtype'];
132
- if(!in_array("accountnumber", $read_only_fields))
133
- $order->accountnumber = $_POST['accountnumber'];
134
- if(!in_array("expirationmonth", $read_only_fields))
135
- $order->expirationmonth = $_POST['expirationmonth'];
136
- if(!in_array("expirationyear", $read_only_fields))
137
- $order->expirationyear = $_POST['expirationyear'];
138
- if(!in_array("ExpirationDate", $read_only_fields))
139
- $order->ExpirationDate = $order->expirationmonth . $order->expirationyear;
140
- if(!in_array("status", $read_only_fields))
141
- $order->status = stripslashes($_POST['status']);
142
- if(!in_array("gateway", $read_only_fields))
143
- $order->gateway = $_POST['gateway'];
144
- if(!in_array("gateway_environment", $read_only_fields))
145
- $order->gateway_environment = $_POST['gateway_environment'];
146
- if(!in_array("payment_transaction_id", $read_only_fields))
147
- $order->payment_transaction_id = $_POST['payment_transaction_id'];
148
- if(!in_array("subscription_transaction_id", $read_only_fields))
149
- $order->subscription_transaction_id = $_POST['subscription_transaction_id'];
150
- if(!in_array("notes", $read_only_fields))
151
- $order->notes = stripslashes($_POST['notes']);
152
-
153
- //affiliate stuff
154
- $affiliates = apply_filters("pmpro_orders_show_affiliate_ids", false);
155
- if(!empty($affiliates))
156
- {
157
- if(!in_array("affiliate_id", $read_only_fields))
158
- $order->affiliate_id = $_POST['affiliate_id'];
159
- if(!in_array("affiliate_subid", $read_only_fields))
160
- $order->affiliate_subid = $_POST['affiliate_subid'];
161
- }
162
-
163
- //save
164
- if($order->saveOrder() !== false)
165
- {
166
- //handle timestamp
167
- if($order->updateTimestamp($_POST['ts_year'], $_POST['ts_month'], $_POST['ts_day']) !== false)
168
- {
169
- $pmpro_msg = __("Order saved successfully.", "pmpro");
170
- $pmpro_msgt = "success";
171
- }
172
- else
173
- {
174
- $pmpro_msg = __("Error updating order timestamp.", "pmpro");
175
- $pmpro_msgt = "error";
176
- }
177
- }
178
- else
179
- {
180
- $pmpro_msg = __("Error saving order.", "pmpro");
181
- $pmpro_msgt = "error";
182
- }
183
- }
184
- else
185
- {
186
- //order passed?
187
- if(!empty($_REQUEST['order']))
188
- {
189
- $order_id = intval($_REQUEST['order']);
190
- if($order_id > 0)
191
- $order = new MemberOrder($order_id);
192
- elseif(!empty($_REQUEST['copy']))
193
- {
194
- $order = new MemberOrder(intval($_REQUEST['copy']));
195
-
196
- //new id
197
- $order->id = NULL;
198
-
199
- //new code
200
- $order->code = $order->getRandomCode();
201
- }
202
- else
203
- {
204
- $order = new MemberOrder(); //new order
205
-
206
- //defaults
207
- $order->code = $order->getRandomCode();
208
- $order->user_id = "";
209
- $order->membership_id = "";
210
- $order->billing->name = "";
211
- $order->billing->street = "";
212
- $order->billing->city = "";
213
- $order->billing->state = "";
214
- $order->billing->zip = "";
215
- $order->billing->country = "";
216
- $order->billing->phone = "";
217
- $order->subtotal = "";
218
- $order->tax = "";
219
- $order->couponamount = "";
220
- $order->total = "";
221
- $order->payment_type = "";
222
- $order->cardtype = "";
223
- $order->accountnumber = "";
224
- $order->expirationmonth = "";
225
- $order->expirationyear = "";
226
- $order->status = "success";
227
- $order->gateway = pmpro_getOption("gateway");
228
- $order->gateway_environment = pmpro_getOption("gateway_environment");
229
- $order->payment_transaction_id = "";
230
- $order->subscription_transaction_id = "";
231
- $order->affiliate_id = "";
232
- $order->affiliate_subid = "";
233
- $order->notes = "";
234
- }
235
- }
236
- }
237
-
238
- require_once(dirname(__FILE__) . "/admin_header.php");
239
- ?>
240
-
241
- <?php if(!empty($order)) { ?>
242
-
243
- <h2>
244
- <?php if(!empty($order->id)) { ?>
245
- <?php _e('Order', 'pmpro');?> #<?php echo $order->id?>: <?php echo $order->code?>
246
- <?php } else { ?>
247
- <?php _e('New Order', 'pmpro');?>
248
- <?php } ?>
249
- </h2>
250
-
251
- <?php if(!empty($pmpro_msg)) { ?>
252
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
253
- <?php } ?>
254
-
255
- <form method="post" action="">
256
-
257
- <table class="form-table">
258
- <tbody>
259
- <tr>
260
- <th scope="row" valign="top"><label>ID:</label></th>
261
- <td><?php if(!empty($order->id)) echo $order->id; else echo __("This will be generated when you save.", "pmpro");?></td>
262
- </tr>
263
-
264
- <tr>
265
- <th scope="row" valign="top"><label for="code"><?php _e('Code', 'pmpro');?>:</label></th>
266
- <td>
267
- <?php if(in_array("code", $read_only_fields)) { echo $order->code; } else { ?>
268
- <input id="code" name="code" type="text" size="50" value="<?php echo esc_attr($order->code);?>" />
269
- <?php } ?>
270
- <?php if($order_id < 0) { ?><small class="pmpro_lite"><?php _e('Randomly generated for you.', 'pmpro');?></small><?php } ?>
271
- </td>
272
- </tr>
273
-
274
- <tr>
275
- <th scope="row" valign="top"><label for="user_id"><?php _e('User ID', 'pmpro');?>:</label></th>
276
- <td>
277
- <?php if(in_array("user_id", $read_only_fields) && $order_id > 0) { echo $order->user_id; } else { ?>
278
- <input id="user_id" name="user_id" type="text" size="50" value="<?php echo esc_attr($order->user_id);?>" />
279
- <?php } ?>
280
- </td>
281
- </tr>
282
-
283
- <tr>
284
- <th scope="row" valign="top"><label for="membership_id"><?php _e('Membership Level ID', 'pmpro');?>:</label></th>
285
- <td>
286
- <?php if(in_array("membership_id", $read_only_fields) && $order_id > 0) { echo $order->membership_id; } else { ?>
287
- <input id="membership_id" name="membership_id" type="text" size="50" value="<?php echo esc_attr($order->membership_id);?>" />
288
- <?php } ?>
289
- </td>
290
- </tr>
291
-
292
- <tr>
293
- <th scope="row" valign="top"><label for="billing_name"><?php _e('Billing Name', 'pmpro');?>:</label></th>
294
- <td>
295
- <?php if(in_array("billing_name", $read_only_fields) && $order_id > 0) { echo $order->billing_name; } else { ?>
296
- <input id="billing_name" name="billing_name" type="text" size="50" value="<?php echo esc_attr($order->billing->name);?>" />
297
- <?php } ?>
298
- </td>
299
- </tr>
300
- <tr>
301
- <th scope="row" valign="top"><label for="billing_street"><?php _e('Billing Street', 'pmpro');?>:</label></th>
302
- <td>
303
- <?php if(in_array("billing_street", $read_only_fields) && $order_id > 0) { echo $order->billing_street; } else { ?>
304
- <input id="billing_street" name="billing_street" type="text" size="50" value="<?php echo esc_attr($order->billing->street);?>" /></td>
305
- <?php } ?>
306
- </tr>
307
- <tr>
308
- <th scope="row" valign="top"><label for="billing_city"><?php _e('Billing City', 'pmpro');?>:</label></th>
309
- <td>
310
- <?php if(in_array("billing_city", $read_only_fields) && $order_id > 0) { echo $order->billing_city; } else { ?>
311
- <input id="billing_city" name="billing_city" type="text" size="50" value="<?php echo esc_attr($order->billing->city);?>" /></td>
312
- <?php } ?>
313
- </tr>
314
- <tr>
315
- <th scope="row" valign="top"><label for="billing_state"><?php _e('Billing State', 'pmpro');?>:</label></th>
316
- <td>
317
- <?php if(in_array("billing_state", $read_only_fields) && $order_id > 0) { echo $order->billing_state; } else { ?>
318
- <input id="billing_state" name="billing_state" type="text" size="50" value="<?php echo esc_attr($order->billing->state);?>" /></td>
319
- <?php } ?>
320
- </tr>
321
- <tr>
322
- <th scope="row" valign="top"><label for="billing_zip"><?php _e('Billing Postal Code', 'pmpro');?>:</label></th>
323
- <td>
324
- <?php if(in_array("billing_zip", $read_only_fields) && $order_id > 0) { echo $order->billing_zip; } else { ?>
325
- <input id="billing_zip" name="billing_zip" type="text" size="50" value="<?php echo esc_attr($order->billing->zip);?>" /></td>
326
- <?php } ?>
327
- </tr>
328
- <tr>
329
- <th scope="row" valign="top"><label for="billing_country"><?php _e('Billing Country', 'pmpro');?>:</label></th>
330
- <td>
331
- <?php if(in_array("billing_country", $read_only_fields) && $order_id > 0) { echo $order->billing_country; } else { ?>
332
- <input id="billing_country" name="billing_country" type="text" size="50" value="<?php echo esc_attr($order->billing->country);?>" />
333
- <?php } ?>
334
- </td>
335
- </tr>
336
- <tr>
337
- <th scope="row" valign="top"><label for="billing_phone"><?php _e('Billing Phone', 'pmpro');?>:</label></th>
338
- <td>
339
- <?php if(in_array("billing_phone", $read_only_fields) && $order_id > 0) { echo $order->billing_phone; } else { ?>
340
- <input id="billing_phone" name="billing_phone" type="text" size="50" value="<?php echo esc_attr($order->billing->phone);?>" />
341
- <?php } ?>
342
- </td>
343
- </tr>
344
-
345
- <tr>
346
- <th scope="row" valign="top"><label for="subtotal"><?php _e('Sub Total', 'pmpro');?>:</label></th>
347
- <td>
348
- <?php if(in_array("subtotal", $read_only_fields) && $order_id > 0) { echo $order->subtotal; } else { ?>
349
- <input id="subtotal" name="subtotal" type="text" size="10" value="<?php echo esc_attr($order->subtotal);?>" />
350
- <?php } ?>
351
- </td>
352
- </tr>
353
- <tr>
354
- <th scope="row" valign="top"><label for="tax"><?php _e('Tax', 'pmpro');?>:</label></th>
355
- <td>
356
- <?php if(in_array("tax", $read_only_fields) && $order_id > 0) { echo $order->tax; } else { ?>
357
- <input id="tax" name="tax" type="text" size="10" value="<?php echo esc_attr($order->tax);?>" />
358
- <?php } ?>
359
- </td>
360
- </tr>
361
- <tr>
362
- <th scope="row" valign="top"><label for="couponamount"><?php _e('Coupon Amount', 'pmpro');?>:</label></th>
363
- <td>
364
- <?php if(in_array("couponamount", $read_only_fields) && $order_id > 0) { echo $order->couponamount; } else { ?>
365
- <input id="couponamount" name="couponamount" type="text" size="10" value="<?php echo esc_attr($order->couponamount);?>" />
366
- <?php } ?>
367
- </td>
368
- </tr>
369
- <tr>
370
- <th scope="row" valign="top"><label for="total"><?php _e('Total', 'pmpro');?>:</label></th>
371
- <td>
372
- <?php if(in_array("total", $read_only_fields) && $order_id > 0) { echo $order->total; } else { ?>
373
- <input id="total" name="total" type="text" size="10" value="<?php echo esc_attr($order->total);?>" />
374
- <?php } ?>
375
- <small class="pmpro_lite"><?php _e('Should be subtotal + tax - couponamount.', 'pmpro');?></small>
376
- </td>
377
- </tr>
378
-
379
- <tr>
380
- <th scope="row" valign="top"><label for="payment_type"><?php _e('Payment Type', 'pmpro');?>:</label></th>
381
- <td>
382
- <?php if(in_array("payment_type", $read_only_fields) && $order_id > 0) { echo $order->payment_type; } else { ?>
383
- <input id="payment_type" name="payment_type" type="text" size="50" value="<?php echo esc_attr($order->payment_type);?>" />
384
- <?php } ?>
385
- <small class="pmpro_lite"><?php _e('e.g. PayPal Express, PayPal Standard, Credit Card.', 'pmpro');?></small>
386
- </td>
387
- </tr>
388
- <tr>
389
- <th scope="row" valign="top"><label for="cardtype"><?php _e('Card Type', 'pmpro');?></label></th>
390
- <td>
391
- <?php if(in_array("cardtype", $read_only_fields) && $order_id > 0) { echo $order->cardtype; } else { ?>
392
- <input id="cardtype" name="cardtype" type="text" size="50" value="<?php echo esc_attr($order->cardtype);?>" />
393
- <?php } ?>
394
- <small class="pmpro_lite"><?php _e('e.g. Visa, MasterCard, AMEX, etc', 'pmpro');?></small>
395
- </td>
396
- </tr>
397
- <tr>
398
- <th scope="row" valign="top"><label for="accountnumber"><?php _e('Account Number', 'pmpro');?>:</label></th>
399
- <td>
400
- <?php if(in_array("accountnumber", $read_only_fields) && $order_id > 0) { echo $order->accountnumber; } else { ?>
401
- <input id="accountnumber" name="accountnumber" type="text" size="50" value="<?php echo esc_attr($order->accountnumber);?>" />
402
- <?php } ?>
403
- <small class="pmpro_lite"><?php _e('Obscure all but last 4 digits.', 'pmpro');?></small>
404
- </td>
405
- </tr>
406
- <?php if(in_array("ExpirationDate", $read_only_fields) && $order_id > 0) { echo $order->ExpirationDate; } else { ?>
407
- <tr>
408
- <th scope="row" valign="top"><label for="expirationmonth"><?php _e('Expiration Month', 'pmpro');?>:</label></th>
409
- <td>
410
- <input id="expirationmonth" name="expirationmonth" type="text" size="10" value="<?php echo esc_attr($order->expirationmonth);?>" />
411
- <small class="pmpro_lite">MM</small>
412
- </td>
413
- </tr>
414
- <tr>
415
- <th scope="row" valign="top"><label for="expirationyear"><?php _e('Expiration Year', 'pmpro');?>:</label></th>
416
- <td>
417
- <input id="expirationyear" name="expirationyear" type="text" size="10" value="<?php echo esc_attr($order->expirationyear);?>" />
418
- <small class="pmpro_lite">YYYY</small>
419
- </td>
420
- </tr>
421
- <?php } ?>
422
- <tr>
423
- <th scope="row" valign="top"><label for="status"><?php _e('Status', 'pmpro');?>:</label></th>
424
- <td>
425
- <?php if(in_array("status", $read_only_fields) && $order_id > 0) { echo $order->status; } else { ?>
426
- <?php
427
- $statuses = array();
428
- $default_statuses = array("", "success", "cancelled", "review", "token", "refunded");
429
- $used_statuses = $wpdb->get_col("SELECT DISTINCT(status) FROM $wpdb->pmpro_membership_orders");
430
- $statuses = array_unique(array_merge($default_statuses, $used_statuses));
431
- asort($statuses);
432
- $statuses = apply_filters("pmpro_order_statuses", $statuses);
433
- ?>
434
- <select id="status" name="status">
435
- <?php foreach($statuses as $status) { ?>
436
- <option value="<?php echo esc_attr($status);?>" <?php selected($order->status, $status);?>><?php echo $status;?></option>
437
- <?php } ?>
438
- </select>
439
- <?php } ?>
440
- </td>
441
- </tr>
442
-
443
- <tr>
444
- <th scope="row" valign="top"><label for="gateway"><?php _e('Gateway', 'pmpro');?>:</label></th>
445
- <td>
446
- <?php if(in_array("gateway", $read_only_fields) && $order_id > 0) { echo $order->gateway; } else { ?>
447
- <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
448
- <option value="" <?php if(empty($order->gateway)) { ?>selected="selected"<?php } ?>><?php _e('Testing Only', 'pmpro');?></option>
449
- <option value="check" <?php if($order->gateway == "check") { ?>selected="selected"<?php } ?>><?php _e('Pay by Check', 'pmpro');?></option>
450
- <option value="stripe" <?php if($order->gateway == "stripe") { ?>selected="selected"<?php } ?>>Stripe</option>
451
- <option value="paypalstandard" <?php if($order->gateway == "paypalstandard") { ?>selected="selected"<?php } ?>>PayPal Standard</option>
452
- <option value="paypalexpress" <?php if($order->gateway == "paypalexpress") { ?>selected="selected"<?php } ?>>PayPal Express</option>
453
- <option value="paypal" <?php if($order->gateway == "paypal") { ?>selected="selected"<?php } ?>>PayPal Website Payments Pro</option>
454
- <option value="payflowpro" <?php if($order->gateway == "payflowpro") { ?>selected="selected"<?php } ?>>PayPal Payflow Pro</option>
455
- <option value="authorizenet" <?php if($order->gateway == "authorizenet") { ?>selected="selected"<?php } ?>>Authorize.net</option>
456
- </select>
457
- <?php } ?>
458
- </td>
459
- </tr>
460
- <tr>
461
- <th scope="row" valign="top"><label for="gateway_environment"><?php _e('Gateway Environment', 'pmpro');?>:</label></th>
462
- <td>
463
- <?php if(in_array("gateway_environment", $read_only_fields) && $order_id > 0) { echo $order->gateway_environment; } else { ?>
464
- <select name="gateway_environment">
465
- <option value="sandbox" <?php if($order->gateway_environment == "sandbox") { ?>selected="selected"<?php } ?>><?php _e('Sandbox/Testing', 'pmpro');?></option>
466
- <option value="live" <?php if($order->gateway_environment == "live") { ?>selected="selected"<?php } ?>><?php _e('Live/Production', 'pmpro');?></option>
467
- </select>
468
- <?php } ?>
469
- </td>
470
- </tr>
471
-
472
- <tr>
473
- <th scope="row" valign="top"><label for="payment_transaction_id"><?php _e('Payment Transaction ID', 'pmpro');?>:</label></th>
474
- <td>
475
- <?php if(in_array("payment_transaction_id", $read_only_fields) && $order_id > 0) { echo $order->payment_transaction_id; } else { ?>
476
- <input id="payment_transaction_id" name="payment_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->payment_transaction_id);?>" />
477
- <?php } ?>
478
- <small class="pmpro_lite"><?php _e('Generated by the gateway. Useful to cross reference orders.', 'pmpro');?></small>
479
- </td>
480
- </tr>
481
- <tr>
482
- <th scope="row" valign="top"><label for="subscription_transaction_id"><?php _e('Subscription Transaction ID', 'pmpro');?>:</label></th>
483
- <td>
484
- <?php if(in_array("subscription_transaction_id", $read_only_fields) && $order_id > 0) { echo $order->subscription_transaction_id; } else { ?>
485
- <input id="subscription_transaction_id" name="subscription_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->subscription_transaction_id);?>" />
486
- <?php } ?>
487
- <small class="pmpro_lite"><?php _e('Generated by the gateway. Useful to cross reference subscriptions.', 'pmpro');?></small>
488
- </td>
489
- </tr>
490
-
491
- <tr>
492
- <th scope="row" valign="top"><label for="ts_month"><?php _e('Date', 'pmpro');?>:</label></th>
493
- <td>
494
- <?php if(in_array("timestamp", $read_only_fields) && $order_id > 0) { echo date(option("date_format"), $order->timestamp); } else { ?>
495
- <?php
496
- //setup date vars
497
- if(!empty($order->timestamp))
498
- $timestamp = $order->timestamp;
499
- else
500
- $timestamp = current_time('timestamp');
501
-
502
- $year = date("Y", $timestamp);
503
- $month = date("n", $timestamp);
504
- $day = date("j", $timestamp);
505
- ?>
506
- <select id="ts_month" name="ts_month">
507
- <?php
508
- for($i = 1; $i < 13; $i++)
509
- {
510
- ?>
511
- <option value="<?php echo $i?>" <?php if($i == $month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $year, current_time("timestamp")))?></option>
512
- <?php
513
- }
514
- ?>
515
- </select>
516
- <input name="ts_day" type="text" size="2" value="<?php echo $day?>" />
517
- <input name="ts_year" type="text" size="4" value="<?php echo $year?>" />
518
- <?php } ?>
519
- </td>
520
- </tr>
521
-
522
- <?php
523
- $affiliates = apply_filters("pmpro_orders_show_affiliate_ids", false);
524
- if(!empty($affiliates)) {
525
- ?>
526
- <tr>
527
- <th scope="row" valign="top"><label for="affiliate_id"><?php _e('Affiliate ID', 'pmpro');?>Affiliate ID:</label></th>
528
- <td>
529
- <?php if(in_array("affiliate_id", $read_only_fields) && $order_id > 0) { echo $order->affiliate_id; } else { ?>
530
- <input id="affiliate_id" name="affiliate_id" type="text" size="50" value="<?php echo esc_attr($order->affiliate_id);?>" />
531
- <?php } ?>
532
- </td>
533
- </tr>
534
- <tr>
535
- <th scope="row" valign="top"><label for="affiliate_subid"><?php _e('Affiliate SubID', 'pmpro');?>Affiliate SubID:</label></th>
536
- <td>
537
- <?php if(in_array("affiliate_subid", $read_only_fields) && $order_id > 0) { echo $order->affiliate_subid; } else { ?>
538
- <input id="affiliate_subid" name="affiliate_subid" type="text" size="50" value="<?php echo esc_attr($order->affiliate_subid);?>" />
539
- <?php } ?>
540
- </td>
541
- </tr>
542
- <?php } ?>
543
-
544
- <tr>
545
- <th scope="row" valign="top"><label for="notes"><?php _e('Notes', 'pmpro');?>:</label></th>
546
- <td>
547
- <?php if(in_array("notes", $read_only_fields) && $order_id > 0) { echo $order->notes; } else { ?>
548
- <textarea id="notes" name="notes" rows="5" cols="80"><?php echo esc_textarea($order->notes);?></textarea>
549
- <?php } ?>
550
- </td>
551
- </tr>
552
-
553
- <?php do_action("pmpro_after_order_settings", $order); ?>
554
-
555
- </tbody>
556
- </table>
557
-
558
- <p class="submit topborder">
559
- <input name="order" type="hidden" value="<?php if(!empty($order->id)) echo $order->id; else echo $order_id;?>" />
560
- <input name="save" type="submit" class="button-primary" value="<?php _e('Save Order', 'pmpro');?>" />
561
- <input name="cancel" type="button" class="cancel button-secondary" value="<?php _e('Cancel', 'pmpro');?>" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-orders')?>';" />
562
- </p>
563
-
564
- </form>
565
-
566
- <?php } else { ?>
567
-
568
- <form id="posts-filter" method="get" action="">
569
- <h2>
570
- <?php _e('Orders', 'pmpro');?>
571
- <a href="admin.php?page=pmpro-orders&order=-1" class="add-new-h2">+ <?php _e('Add New Order', 'pmpro');?></a>
572
-
573
- <?php
574
- //build the export URL
575
- $export_url = admin_url('admin-ajax.php') . "?action=orders_csv";
576
- $url_params = array(
577
- "filter"=>$filter,
578
- "s"=>$s,
579
- "l"=>$l,
580
- "start-month"=>$start_month,
581
- "start-day"=>$start_day,
582
- "start-year"=>$start_year,
583
- "end-month"=>$end_month,
584
- "end-day"=>$end_day,
585
- "end-year"=>$end_year,
586
- "predefined-date"=>$predefined_date,
587
- "status"=>$status
588
- );
589
- $export_url = add_query_arg($url_params, $export_url);
590
- ?>
591
- <a target="_blank" href="<?php echo $export_url;?>" class="add-new-h2"><?php _e('Export to CSV', 'pmpro');?></a>
592
- </h2>
593
-
594
-
595
-
596
- <?php if(!empty($pmpro_msg)) { ?>
597
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
598
- <?php } ?>
599
-
600
-
601
- <ul class="subsubsub">
602
- <li>
603
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Orders for January', 'pmpro')?>
604
- <select id="filter" name="filter">
605
- <option value="all" <?php selected($filter, "all");?>><?php _e('All', 'pmpro');?></option>
606
- <option value="within-a-date-range" <?php selected($filter, "within-a-date-range");?>><?php _e('Within a Date Range', 'pmpro');?></option>
607
- <option value="predefined-date-range" <?php selected($filter, "predefined-date-range");?>><?php _e('Predefined Date Range', 'pmpro');?></option>
608
- <option value="within-a-level" <?php selected($filter, "within-a-level");?>><?php _e('Within a Level', 'pmpro');?></option>
609
- <option value="within-a-status" <?php selected($filter, "within-a-status");?>><?php _e('Within a Status', 'pmpro');?></option>
610
- </select>
611
-
612
- <span id="from"><?php _ex('From', 'Dropdown label', 'pmpro')?></span>
613
-
614
- <select id="start-month" name="start-month">
615
- <?php for($i = 1; $i < 13; $i++) { ?>
616
- <option value="<?php echo $i;?>" <?php selected($start_month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
617
- <?php } ?>
618
- </select>
619
-
620
- <input id='start-day' name="start-day" type="text" size="2" value="<?php echo $start_day?>" />
621
- <input id='start-year' name="start-year" type="text" size="4" value="<?php echo $start_year?>" />
622
-
623
-
624
- <span id="to"><?php _ex('To', 'Dropdown label', 'pmpro')?></span>
625
-
626
- <select id="end-month" name="end-month">
627
- <?php for($i = 1; $i < 13; $i++) { ?>
628
- <option value="<?php echo $i;?>" <?php selected($end_month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
629
- <?php } ?>
630
- </select>
631
-
632
-
633
- <input id='end-day' name="end-day" type="text" size="2" value="<?php echo $end_day?>" />
634
- <input id='end-year' name="end-year" type="text" size="4" value="<?php echo $end_year?>" />
635
-
636
- <span id="filterby"><?php _ex('filter by ', 'Dropdown label', 'pmpro')?></span>
637
-
638
- <select id="predefined-date" name="predefined-date">
639
-
640
- <option value="<?php echo "This Month";?>" <?php selected($predefined_date, "This Month");?>><?php echo "This Month";?></option>
641
- <option value="<?php echo "Last Month";?>" <?php selected($predefined_date, "Last Month");?>><?php echo "Last Month";?></option>
642
- <option value="<?php echo "This Year";?>" <?php selected($predefined_date, "This Year");?>><?php echo "This Year";?></option>
643
- <option value="<?php echo "Last Year";?>" <?php selected($predefined_date, "Last Year");?>><?php echo "Last Year";?></option>
644
-
645
- </select>
646
-
647
- <?php
648
- //Note: only orders belonging to current levels can be filtered. There is no option for orders belonging to deleted levels
649
- $levels = pmpro_getAllLevels();
650
-
651
- ?>
652
- <select id="l" name="l">
653
- <?php foreach($levels as $level) { ?>
654
- <option value="<?php echo $level->id;?>" <?php selected($l, $level->id);?>><?php echo $level->name;?></option>
655
- <?php } ?>
656
-
657
- </select>
658
-
659
- <?php
660
- $statuses = array();
661
- $default_statuses = array("", "success", "cancelled", "review", "token", "refunded");
662
- $used_statuses = $wpdb->get_col("SELECT DISTINCT(status) FROM $wpdb->pmpro_membership_orders");
663
- $statuses = array_unique(array_merge($default_statuses, $used_statuses));
664
- asort($statuses);
665
- $statuses = apply_filters("pmpro_order_statuses", $statuses);
666
- ?>
667
- <select id="status" name="status">
668
- <?php foreach($statuses as $the_status) { ?>
669
- <option value="<?php echo esc_attr($the_status);?>" <?php selected($the_status, $status);?>><?php echo $the_status;?></option>
670
- <?php } ?>
671
- </select>
672
-
673
-
674
- <input id="submit" type="submit" value="<?php _ex('Filter', 'Submit button value.', 'pmpro');?>" />
675
- </li>
676
- </ul>
677
-
678
- <script>
679
- //update month/year when period dropdown is changed
680
- jQuery(document).ready(function() {
681
- jQuery('#filter').change(function() {
682
- pmpro_ShowMonthOrYear();
683
- });
684
- });
685
-
686
- function pmpro_ShowMonthOrYear()
687
- {
688
- var filter = jQuery('#filter').val();
689
- if(filter == 'all')
690
- {
691
- jQuery('#start-month').hide();
692
- jQuery('#start-day').hide();
693
- jQuery('#start-year').hide();
694
- jQuery('#end-month').hide();
695
- jQuery('#end-day').hide();
696
- jQuery('#end-year').hide();
697
- jQuery('#predefined-date').hide();
698
- jQuery('#status').hide();
699
- jQuery('#l').hide();
700
- jQuery('#from').hide();
701
- jQuery('#to').hide();
702
- jQuery('#submit').show();
703
- jQuery('#filterby').hide();
704
- }
705
- else if(filter == 'within-a-date-range')
706
- {
707
- jQuery('#start-month').show();
708
- jQuery('#start-day').show();
709
- jQuery('#start-year').show();
710
- jQuery('#end-month').show();
711
- jQuery('#end-day').show();
712
- jQuery('#end-year').show();
713
- jQuery('#predefined-date').hide();
714
- jQuery('#status').hide();
715
- jQuery('#l').hide();
716
- jQuery('#submit').show();
717
- jQuery('#from').show();
718
- jQuery('#to').show();
719
- jQuery('#filterby').hide();
720
- }
721
- else if(filter == 'predefined-date-range')
722
- {
723
- jQuery('#start-month').hide();
724
- jQuery('#start-day').hide();
725
- jQuery('#start-year').hide();
726
- jQuery('#end-month').hide();
727
- jQuery('#end-day').hide();
728
- jQuery('#end-year').hide();
729
- jQuery('#predefined-date').show();
730
- jQuery('#status').hide();
731
- jQuery('#l').hide();
732
- jQuery('#submit').show();
733
- jQuery('#from').hide();
734
- jQuery('#to').hide();
735
- jQuery('#filterby').show();
736
- }
737
- else if(filter == 'within-a-level')
738
- {
739
- jQuery('#start-month').hide();
740
- jQuery('#start-day').hide();
741
- jQuery('#start-year').hide();
742
- jQuery('#end-month').hide();
743
- jQuery('#end-day').hide();
744
- jQuery('#end-year').hide();
745
- jQuery('#predefined-date').hide();
746
- jQuery('#status').hide();
747
- jQuery('#l').show();
748
- jQuery('#submit').show();
749
- jQuery('#from').hide();
750
- jQuery('#to').hide();
751
- jQuery('#filterby').show();
752
- }
753
- else if(filter == 'within-a-status')
754
- {
755
- jQuery('#start-month').hide();
756
- jQuery('#start-day').hide();
757
- jQuery('#start-year').hide();
758
- jQuery('#end-month').hide();
759
- jQuery('#end-day').hide();
760
- jQuery('#end-year').hide();
761
- jQuery('#predefined-date').hide();
762
- jQuery('#status').show();
763
- jQuery('#l').hide();
764
- jQuery('#submit').show();
765
- jQuery('#from').hide();
766
- jQuery('#to').hide();
767
- jQuery('#filterby').show();
768
- }
769
- }
770
-
771
- pmpro_ShowMonthOrYear();
772
-
773
-
774
- </script>
775
-
776
- <p class="search-box">
777
- <label class="hidden" for="post-search-input"><?php _e('Search Orders', 'pmpro');?>:</label>
778
- <input type="hidden" name="page" value="pmpro-orders" />
779
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
780
- <input class="button" type="submit" value="<?php _e('Search Orders', 'pmpro');?>"/>
781
- </p>
782
-
783
- <?php
784
- //some vars for the search
785
- if(isset($_REQUEST['pn']))
786
- $pn = $_REQUEST['pn'];
787
- else
788
- $pn = 1;
789
-
790
- if(isset($_REQUEST['limit']))
791
- $limit = $_REQUEST['limit'];
792
- else
793
- $limit = 15;
794
-
795
- $end = $pn * $limit;
796
- $start = $end - $limit;
797
-
798
- //filters
799
- if($filter == "all" || !$filter)
800
- $condition = "1=1";
801
- elseif($filter == "within-a-date-range")
802
- {
803
- $start_date = $start_year."-".$start_month."-".$start_day;
804
- $end_date = $end_year."-".$end_month."-".$end_day;
805
-
806
- //add times to dates
807
- $start_date = $start_date . " 00:00:00";
808
- $end_date = $end_date . " 23:59:59";
809
-
810
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
811
- }
812
- elseif($filter == "predefined-date-range")
813
- {
814
- if($predefined_date == "Last Month")
815
- {
816
- $start_date = date("Y-m-d", strtotime("first day of last month", current_time("timestamp")));
817
- $end_date = date("Y-m-d", strtotime("last day of last month", current_time("timestamp")));
818
- }
819
- elseif($predefined_date == "This Month")
820
- {
821
- $start_date = date("Y-m-d", strtotime("first day of this month", current_time("timestamp")));
822
- $end_date = date("Y-m-d", strtotime("last day of this month", current_time("timestamp")));
823
- }
824
- elseif($predefined_date == "This Year")
825
- {
826
- $year = date('Y');
827
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
828
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
829
- }
830
-
831
- elseif($predefined_date == "Last Year")
832
- {
833
- $year = date('Y') - 1;
834
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
835
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
836
- }
837
-
838
- //add times to dates
839
- $start_date = $start_date . " 00:00:00";
840
- $end_date = $end_date . " 23:59:59";
841
-
842
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
843
- }
844
- elseif($filter == "within-a-level")
845
- {
846
- $condition = "membership_id = $l";
847
- }
848
- elseif($filter == "within-a-status")
849
- {
850
- $condition = "status = '$status' ";
851
- }
852
-
853
- //string search
854
- if($s)
855
- {
856
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS o.id FROM $wpdb->pmpro_membership_orders o LEFT JOIN $wpdb->users u ON o.user_id = u.ID LEFT JOIN $wpdb->pmpro_membership_levels l ON o.membership_id = l.id ";
857
-
858
- $join_with_usermeta = apply_filters("pmpro_orders_search_usermeta", false);
859
- if($join_with_usermeta)
860
- $sqlQuery .= "LEFT JOIN $wpdb->usermeta um ON o.user_id = um.user_id ";
861
-
862
- $sqlQuery .= "WHERE (1=2 ";
863
-
864
- $fields = array("o.id", "o.code", "o.billing_name", "o.billing_street", "o.billing_city", "o.billing_state", "o.billing_zip", "o.billing_phone", "o.payment_type", "o.cardtype", "o.accountnumber", "o.status", "o.gateway", "o.gateway_environment", "o.payment_transaction_id", "o.subscription_transaction_id", "u.user_login", "u.user_email", "u.display_name", "l.name");
865
-
866
- if($join_with_usermeta)
867
- $fields[] = "um.meta_value";
868
-
869
- $fields = apply_filters("pmpro_orders_search_fields", $fields);
870
-
871
- foreach($fields as $field)
872
- $sqlQuery .= " OR " . $field . " LIKE '%" . esc_sql($s) . "%' ";
873
- $sqlQuery .= ") ";
874
-
875
- $sqlQuery .= "AND " . $condition . " ";
876
-
877
- $sqlQuery .= "GROUP BY o.id ORDER BY o.id DESC, o.timestamp DESC ";
878
- }
879
- else
880
- {
881
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders WHERE ".$condition." ORDER BY id DESC, timestamp DESC ";
882
- }
883
-
884
- $sqlQuery .= "LIMIT $start, $limit";
885
-
886
- $order_ids = $wpdb->get_col($sqlQuery);
887
-
888
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
889
-
890
- if($order_ids)
891
- {
892
- ?>
893
- <p class="clear"><?php printf(__("%d orders found.", "pmpro"), $totalrows);?></span></p>
894
- <?php
895
- }
896
- ?>
897
- <table class="widefat">
898
- <thead>
899
- <tr class="thead">
900
- <th><?php _e('ID', 'pmpro');?></th>
901
- <th><?php _e('Code', 'pmpro');?></th>
902
- <th><?php _e('User', 'pmpro');?></th>
903
- <?php do_action("pmpro_orders_extra_cols_header", $order_ids);?>
904
- <th><?php _e('Membership Level', 'pmpro');?></th>
905
- <th><?php _e('Total', 'pmpro');?></th>
906
- <th><?php _e('Payment', 'pmpro');?></th>
907
- <th><?php _e('Gateway', 'pmpro');?></th>
908
- <th><?php _e('Transaction IDs', 'pmpro');?></th>
909
- <th><?php _e('Status', 'pmpro');?></th>
910
- <th><?php _e('Date', 'pmpro');?></th>
911
- <th></th>
912
- <th></th>
913
- <th></th>
914
- </tr>
915
- </thead>
916
- <tbody id="orders" class="list:order orders-list">
917
- <?php
918
- $count = 0;
919
- foreach($order_ids as $order_id)
920
- {
921
- $order = new MemberOrder();
922
- $order->nogateway = true;
923
- $order->getMemberOrderByID($order_id);
924
- ?>
925
- <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
926
- <td><a href="admin.php?page=pmpro-orders&order=<?php echo $order->id?>"><?php echo $order->id;?></a></td>
927
- <td><a href="admin.php?page=pmpro-orders&order=<?php echo $order->id?>"><?php echo $order->code;?></a></td>
928
- <td>
929
- <?php $order->getUser(); ?>
930
- <?php if(!empty($order->user)) { ?>
931
- <a href="user-edit.php?user_id=<?php echo $order->user->ID?>"><?php echo $order->user->user_login?></a>
932
- <?php } else { ?>
933
- [<?php _e('deleted', 'pmpro');?>]
934
- <?php } ?>
935
- </td>
936
- <?php do_action("pmpro_orders_extra_cols_body", $order);?>
937
- <td><?php echo $order->membership_id;?></td>
938
- <td><?php echo $pmpro_currency_symbol . $order->total;?></td>
939
- <td>
940
- <?php if(!empty($order->payment_type)) echo $order->payment_type . "<br />";?>
941
- <?php if(!empty($order->accountnumber)) { ?>
942
- <?php echo $order->cardtype;?>: x<?php echo last4($order->accountnumber);?><br />
943
- <?php } ?>
944
- <?php if(!empty($order->billing->street)) { ?>
945
- <?php echo $order->billing->street; ?><br />
946
- <?php if( $order->billing->city && $order->billing->state) { ?>
947
- <?php echo $order->billing->city?>, <?php echo $order->billing->state?> <?php echo $order->billing->zip?> <?php if(!empty( $order->billing->country)) echo $order->billing->country?><br />
948
- <?php } ?>
949
- <?php } ?>
950
- <?php if(!empty($order->billing->phone)) echo formatPhone($order->billing->phone);?>
951
- </td>
952
- <td><?php echo $order->gateway;?><?php if($order->gateway_environment == "test") echo "(test)";?></td>
953
- <td>
954
- <?php _e('Payment', 'pmpro');?>: <?php if(!empty($order->payment_transaction_id)) echo $order->payment_transaction_id; else echo "N/A";?>
955
- <br />
956
- <?php _e('Subscription', 'pmpro');?>: <?php if(!empty($order->subscription_transaction_id)) echo $order->subscription_transaction_id; else echo "N/A";?>
957
- </td>
958
- <td><?php echo $order->status;?></td>
959
- <td><?php echo date(get_option('date_format'), $order->timestamp);?></td>
960
- <td align="center">
961
- <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id;?>"><?php _e('edit', 'pmpro');?></a>
962
- </td>
963
- <td align="center">
964
- <a href="admin.php?page=pmpro-orders&order=-1&copy=<?php echo $order->id;?>"><?php _e('copy', 'pmpro');?></a>
965
- </td>
966
- <td align="center">
967
- <a href="javascript:askfirst('<?php printf(__("Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?", "pmpro"), str_replace("'", "", $order->code));?>', 'admin.php?page=pmpro-orders&delete=<?php echo $order->id;?>'); void(0);"><?php _e('delete', 'pmpro');?></a>
968
- </td>
969
- </tr>
970
- <?php
971
- }
972
-
973
- if(!$order_ids)
974
- {
975
- ?>
976
- <tr>
977
- <td colspan="9"><p><?php _e('No orders found.', 'pmpro');?></p></td>
978
- </tr>
979
- <?php
980
- }
981
- ?>
982
- </tbody>
983
- </table>
984
- </form>
985
-
986
- <?php
987
- //add normal args
988
- $pagination_url = add_query_arg($url_params, get_admin_url(NULL, "/admin.php?page=pmpro-orders"));
989
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=");
990
- ?>
991
-
992
- <?php } ?>
993
-
994
- <?php
995
- require_once(dirname(__FILE__) . "/admin_footer.php");
996
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/pagesettings.php CHANGED
@@ -1,10 +1,4 @@
1
  <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_pagesettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
  global $wpdb, $msg, $msgt;
9
 
10
  //get/set settings
@@ -46,37 +40,9 @@
46
  {
47
  if(!$pmpro_page_id)
48
  {
49
- switch ($pmpro_page_name) {
50
- case 'account':
51
- $pmpro_page_title = __( 'Membership Account', 'pmpro' );
52
- break;
53
- case 'billing':
54
- $pmpro_page_title = __( 'Membership Billing', 'pmpro' );
55
- break;
56
- case 'cancel':
57
- $pmpro_page_title = __( 'Membership Cancel', 'pmpro' );
58
- break;
59
- case 'checkout':
60
- $pmpro_page_title = __( 'Membership Checkout', 'pmpro' );
61
- break;
62
- case 'confirmation':
63
- $pmpro_page_title = __( 'Membership Confirmation', 'pmpro' );
64
- break;
65
- case 'invoice':
66
- $pmpro_page_title = __( 'Membership Invoice', 'pmpro' );
67
- break;
68
- case 'levels':
69
- $pmpro_page_title = __( 'Membership Levels', 'pmpro' );
70
- break;
71
-
72
- default:
73
- $pmpro_page_title = sprintf( __( 'Membership %s', 'Page title template', 'pmpro' ), ucwords($pmpro_page_name) );
74
- break;
75
- }
76
-
77
  //no id set. create an array to store the page info
78
  $insert = array(
79
- 'post_title' => $pmpro_page_title,
80
  'post_status' => 'publish',
81
  'post_type' => 'page',
82
  'post_content' => '[pmpro_' . $pmpro_page_name . ']',
@@ -108,7 +74,7 @@
108
  if(!empty($pages_created))
109
  {
110
  $msg = true;
111
- $msgt = __("The following pages have been created for you", "pmpro") . ": " . implode(", ", $pages_created) . ".";
112
  }
113
  }
114
 
@@ -117,19 +83,19 @@
117
 
118
 
119
  <form action="" method="post" enctype="multipart/form-data">
120
- <h2><?php _e('Pages', 'pmpro');?></h2>
121
  <?php
122
  global $pmpro_pages_ready;
123
  if($pmpro_pages_ready)
124
  {
125
  ?>
126
- <p><?php _e('Manage the WordPress pages assigned to each required Paid Memberships Pro page.', 'pmpro');?></p>
127
  <?php
128
  }
129
  else
130
  {
131
  ?>
132
- <p><?php _e('Assign the WordPress pages for each required Paid Memberships Pro page or', 'pmpro');?> <a href="?page=pmpro-pagesettings&createpages=1"><?php _e('click here to let us generate them for you', 'pmpro');?></a>.</p>
133
  <?php
134
  }
135
  ?>
@@ -137,118 +103,104 @@
137
  <tbody>
138
  <tr>
139
  <th scope="row" valign="top">
140
- <label for="account_page_id"><?php _e('Account Page', 'pmpro');?>:</label>
141
  </th>
142
  <td>
143
  <?php
144
  wp_dropdown_pages(array("name"=>"account_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['account']));
145
  ?>
146
  <?php if(!empty($pmpro_pages['account'])) { ?>
147
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account'];?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
148
- &nbsp;
149
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['account']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
150
  <?php } ?>
151
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_account].</small>
152
  </td>
153
  <tr>
154
  <th scope="row" valign="top">
155
- <label for="billing_page_id"><?php _e('Billing Information Page', 'pmpro');?>:</label>
156
  </th>
157
  <td>
158
  <?php
159
  wp_dropdown_pages(array("name"=>"billing_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['billing']));
160
  ?>
161
  <?php if(!empty($pmpro_pages['billing'])) { ?>
162
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
163
- &nbsp;
164
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['billing']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
165
  <?php } ?>
166
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_billing].</small>
167
  </td>
168
  <tr>
169
  <th scope="row" valign="top">
170
- <label for="cancel_page_id"><?php _e('Cancel Page', 'pmpro');?>:</label>
171
  </th>
172
  <td>
173
  <?php
174
  wp_dropdown_pages(array("name"=>"cancel_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['cancel']));
175
  ?>
176
  <?php if(!empty($pmpro_pages['cancel'])) { ?>
177
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
178
- &nbsp;
179
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['cancel']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
180
  <?php } ?>
181
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_cancel].</small>
182
  </td>
183
  </tr>
184
  <tr>
185
  <th scope="row" valign="top">
186
- <label for="checkout_page_id"><?php _e('Checkout Page', 'pmpro');?>:</label>
187
  </th>
188
  <td>
189
  <?php
190
  wp_dropdown_pages(array("name"=>"checkout_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['checkout']));
191
  ?>
192
  <?php if(!empty($pmpro_pages['checkout'])) { ?>
193
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
194
- &nbsp;
195
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['checkout']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
196
  <?php } ?>
197
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_checkout].</small>
198
  </td>
199
  </tr>
200
  <tr>
201
  <th scope="row" valign="top">
202
- <label for="confirmation_page_id"><?php _e('Confirmation Page', 'pmpro');?>:</label>
203
  </th>
204
  <td>
205
  <?php
206
  wp_dropdown_pages(array("name"=>"confirmation_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['confirmation']));
207
  ?>
208
  <?php if(!empty($pmpro_pages['confirmation'])) { ?>
209
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
210
- &nbsp;
211
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['confirmation']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
212
  <?php } ?>
213
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_confirmation].</small>
214
  </td>
215
  </tr>
216
  <tr>
217
  <th scope="row" valign="top">
218
- <label for="invoice_page_id"><?php _e('Invoice Page', 'pmpro');?>:</label>
219
  </th>
220
  <td>
221
  <?php
222
  wp_dropdown_pages(array("name"=>"invoice_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['invoice']));
223
  ?>
224
  <?php if(!empty($pmpro_pages['invoice'])) { ?>
225
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
226
- &nbsp;
227
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['invoice']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
228
  <?php } ?>
229
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_invoice].</small>
230
  </td>
231
  </tr>
232
  <tr>
233
  <th scope="row" valign="top">
234
- <label for="levels_page_id"><?php _e('Levels Page', 'pmpro');?>:</label>
235
  </th>
236
  <td>
237
  <?php
238
  wp_dropdown_pages(array("name"=>"levels_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['levels']));
239
  ?>
240
  <?php if(!empty($pmpro_pages['levels'])) { ?>
241
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
242
- &nbsp;
243
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['levels']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
244
  <?php } ?>
245
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_levels].</small>
246
  </td>
247
  </tr>
248
  </tbody>
249
  </table>
250
  <p class="submit">
251
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
252
  </p>
253
  </form>
254
 
1
  <?php
 
 
 
 
 
 
2
  global $wpdb, $msg, $msgt;
3
 
4
  //get/set settings
40
  {
41
  if(!$pmpro_page_id)
42
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  //no id set. create an array to store the page info
44
  $insert = array(
45
+ 'post_title' => 'Membership ' . ucwords($pmpro_page_name),
46
  'post_status' => 'publish',
47
  'post_type' => 'page',
48
  'post_content' => '[pmpro_' . $pmpro_page_name . ']',
74
  if(!empty($pages_created))
75
  {
76
  $msg = true;
77
+ $msgt = "The following pages have been created for you: " . implode(", ", $pages_created) . ".";
78
  }
79
  }
80
 
83
 
84
 
85
  <form action="" method="post" enctype="multipart/form-data">
86
+ <h2>Pages</h2>
87
  <?php
88
  global $pmpro_pages_ready;
89
  if($pmpro_pages_ready)
90
  {
91
  ?>
92
+ <p>Manage the WordPress pages assigned to each required Paid Memberships Pro page.</p>
93
  <?php
94
  }
95
  else
96
  {
97
  ?>
98
+ <p>Assign the WordPress pages for each required Paid Memberships Pro page or <a href="?page=pmpro-pagesettings&createpages=1">click here to let us generate them for you</a>.</p>
99
  <?php
100
  }
101
  ?>
103
  <tbody>
104
  <tr>
105
  <th scope="row" valign="top">
106
+ <label for="account_page_id">Account Page:</label>
107
  </th>
108
  <td>
109
  <?php
110
  wp_dropdown_pages(array("name"=>"account_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['account']));
111
  ?>
112
  <?php if(!empty($pmpro_pages['account'])) { ?>
113
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
114
  <?php } ?>
115
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_account].</small>
116
  </td>
117
  <tr>
118
  <th scope="row" valign="top">
119
+ <label for="billing_page_id">Billing Information Page:</label>
120
  </th>
121
  <td>
122
  <?php
123
  wp_dropdown_pages(array("name"=>"billing_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['billing']));
124
  ?>
125
  <?php if(!empty($pmpro_pages['billing'])) { ?>
126
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
127
  <?php } ?>
128
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_billing].</small>
129
  </td>
130
  <tr>
131
  <th scope="row" valign="top">
132
+ <label for="cancel_page_id">Cancel Page:</label>
133
  </th>
134
  <td>
135
  <?php
136
  wp_dropdown_pages(array("name"=>"cancel_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['cancel']));
137
  ?>
138
  <?php if(!empty($pmpro_pages['cancel'])) { ?>
139
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
140
  <?php } ?>
141
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_cancel].</small>
142
  </td>
143
  </tr>
144
  <tr>
145
  <th scope="row" valign="top">
146
+ <label for="checkout_page_id">Checkout Page:</label>
147
  </th>
148
  <td>
149
  <?php
150
  wp_dropdown_pages(array("name"=>"checkout_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['checkout']));
151
  ?>
152
  <?php if(!empty($pmpro_pages['checkout'])) { ?>
153
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
154
  <?php } ?>
155
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_checkout].</small>
156
  </td>
157
  </tr>
158
  <tr>
159
  <th scope="row" valign="top">
160
+ <label for="confirmation_page_id">Confirmation Page:</label>
161
  </th>
162
  <td>
163
  <?php
164
  wp_dropdown_pages(array("name"=>"confirmation_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['confirmation']));
165
  ?>
166
  <?php if(!empty($pmpro_pages['confirmation'])) { ?>
167
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
168
  <?php } ?>
169
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_confirmation].</small>
170
  </td>
171
  </tr>
172
  <tr>
173
  <th scope="row" valign="top">
174
+ <label for="invoice_page_id">Invoice Page:</label>
175
  </th>
176
  <td>
177
  <?php
178
  wp_dropdown_pages(array("name"=>"invoice_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['invoice']));
179
  ?>
180
  <?php if(!empty($pmpro_pages['invoice'])) { ?>
181
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
182
  <?php } ?>
183
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_invoice].</small>
184
  </td>
185
  </tr>
186
  <tr>
187
  <th scope="row" valign="top">
188
+ <label for="levels_page_id">Levels Page:</label>
189
  </th>
190
  <td>
191
  <?php
192
  wp_dropdown_pages(array("name"=>"levels_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['levels']));
193
  ?>
194
  <?php if(!empty($pmpro_pages['levels'])) { ?>
195
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
196
  <?php } ?>
197
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_levels].</small>
198
  </td>
199
  </tr>
200
  </tbody>
201
  </table>
202
  <p class="submit">
203
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
204
  </p>
205
  </form>
206
 
adminpages/paymentsettings.php CHANGED
@@ -1,538 +1,323 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_paymentsettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $pmpro_currency_symbol, $msg, $msgt;
9
-
10
- //get/set settings
11
- if(!empty($_REQUEST['savesettings']))
12
- {
13
- pmpro_setOption("sslseal");
14
- pmpro_setOption("nuclear_HTTPS");
15
-
16
- //gateway options
17
- pmpro_setOption("gateway");
18
- pmpro_setOption("gateway_environment");
19
- pmpro_setOption("gateway_email");
20
- pmpro_setOption("payflow_partner");
21
- pmpro_setOption("payflow_vendor");
22
- pmpro_setOption("payflow_user");
23
- pmpro_setOption("payflow_pwd");
24
- pmpro_setOption("apiusername");
25
- pmpro_setOption("apipassword");
26
- pmpro_setOption("apisignature");
27
- pmpro_setOption("loginname");
28
- pmpro_setOption("transactionkey");
29
- pmpro_setOption("stripe_secretkey");
30
- pmpro_setOption("stripe_publishablekey");
31
- pmpro_setOption("stripe_billingaddress");
32
- pmpro_setOption("braintree_merchantid");
33
- pmpro_setOption("braintree_publickey");
34
- pmpro_setOption("braintree_privatekey");
35
- pmpro_setOption("braintree_encryptionkey");
36
- pmpro_setOption("twocheckout_apiusername");
37
- pmpro_setOption("twocheckout_apipassword");
38
- pmpro_setOption("twocheckout_accountnumber");
39
- pmpro_setOption("twocheckout_secretword");
40
- pmpro_setOption("cybersource_merchantid");
41
- pmpro_setOption("cybersource_securitykey");
42
-
43
- //currency
44
- pmpro_setOption("currency");
45
-
46
- //credit cards
47
- $pmpro_accepted_credit_cards = array();
48
- if(!empty($_REQUEST['creditcards_visa']))
49
- $pmpro_accepted_credit_cards[] = "Visa";
50
- if(!empty($_REQUEST['creditcards_mastercard']))
51
- $pmpro_accepted_credit_cards[] = "Mastercard";
52
- if(!empty($_REQUEST['creditcards_amex']))
53
- $pmpro_accepted_credit_cards[] = "American Express";
54
- if(!empty($_REQUEST['creditcards_discover']))
55
- $pmpro_accepted_credit_cards[] = "Discover";
56
- if(!empty($_REQUEST['creditcards_dinersclub']))
57
- $pmpro_accepted_credit_cards[] = "Diners Club";
58
- if(!empty($_REQUEST['creditcards_enroute']))
59
- $pmpro_accepted_credit_cards[] = "EnRoute";
60
- if(!empty($_REQUEST['creditcards_jcb']))
61
- $pmpro_accepted_credit_cards[] = "JCB";
62
-
63
- //check instructions
64
- pmpro_setOption("instructions");
65
-
66
- //use_ssl
67
- pmpro_setOption("use_ssl");
68
-
69
- //tax
70
- pmpro_setOption("tax_state");
71
- pmpro_setOption("tax_rate");
72
-
73
- pmpro_setOption("accepted_credit_cards", implode(",", $pmpro_accepted_credit_cards));
74
-
75
- //assume success
76
- $msg = true;
77
- $msgt = __("Your payment settings have been updated.", "pmpro");
78
- }
79
-
80
- $sslseal = pmpro_getOption("sslseal");
81
- $nuclear_HTTPS = pmpro_getOption("nuclear_HTTPS");
82
-
83
- $gateway = pmpro_getOption("gateway");
84
- $gateway_environment = pmpro_getOption("gateway_environment");
85
- $gateway_email = pmpro_getOption("gateway_email");
86
- $payflow_partner = pmpro_getOption("payflow_partner");
87
- $payflow_vendor = pmpro_getOption("payflow_vendor");
88
- $payflow_user = pmpro_getOption("payflow_user");
89
- $payflow_pwd = pmpro_getOption("payflow_pwd");
90
- $apiusername = pmpro_getOption("apiusername");
91
- $apipassword = pmpro_getOption("apipassword");
92
- $apisignature = pmpro_getOption("apisignature");
93
- $loginname = pmpro_getOption("loginname");
94
- $transactionkey = pmpro_getOption("transactionkey");
95
- $stripe_secretkey = pmpro_getOption("stripe_secretkey");
96
- $stripe_publishablekey = pmpro_getOption("stripe_publishablekey");
97
- $stripe_billingaddress = pmpro_getOption("stripe_billingaddress");
98
- $braintree_merchantid = pmpro_getOption("braintree_merchantid");
99
- $braintree_publickey = pmpro_getOption("braintree_publickey");
100
- $braintree_privatekey = pmpro_getOption("braintree_privatekey");
101
- $braintree_encryptionkey = pmpro_getOption("braintree_encryptionkey");
102
- $twocheckout_apiusername = pmpro_getOption("twocheckout_apiusername");
103
- $twocheckout_apipassword = pmpro_getOption("twocheckout_apipassword");
104
- $twocheckout_accountnumber = pmpro_getOption("twocheckout_accountnumber");
105
- $twocheckout_secretword = pmpro_getOption("twocheckout_secretword");
106
- $cybersource_merchantid = pmpro_getOption("cybersource_merchantid");
107
- $cybersource_securitykey = pmpro_getOption("cybersource_securitykey");
108
-
109
- $currency = pmpro_getOption("currency");
110
-
111
- $pmpro_accepted_credit_cards = pmpro_getOption("accepted_credit_cards");
112
-
113
- $instructions = pmpro_getOption("instructions");
114
-
115
- $tax_state = pmpro_getOption("tax_state");
116
- $tax_rate = pmpro_getOption("tax_rate");
117
-
118
- //make sure the tax rate is not > 1
119
- if((double)$tax_rate > 1)
120
- {
121
- //assume the entered X%
122
- $tax_rate = $tax_rate / 100;
123
- pmpro_setOption("tax_rate", $tax_rate);
124
- }
125
-
126
- $use_ssl = pmpro_getOption("use_ssl");
127
-
128
- //default settings
129
- if(empty($gateway_environment))
130
- {
131
- $gateway_environment = "sandbox";
132
- pmpro_setOption("gateway_environment", $gateway_environment);
133
- }
134
- if(empty($pmpro_accepted_credit_cards))
135
- {
136
- $pmpro_accepted_credit_cards = "Visa,Mastercard,American Express,Discover";
137
- pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
138
- }
139
-
140
- $pmpro_accepted_credit_cards = explode(",", $pmpro_accepted_credit_cards);
141
-
142
- require_once(dirname(__FILE__) . "/admin_header.php");
143
- ?>
144
-
145
- <form action="" method="post" enctype="multipart/form-data">
146
- <h2><?php _e('Payment Gateway', 'pmpro');?> &amp; <?php _e('SSL Settings', 'pmpro');?></h2>
147
-
148
- <p><?php _e('Learn more about <a title="Paid Memberships Pro - SSL Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/ssl/">SSL</a> or <a title="Paid Memberships Pro - Payment Gateway Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/payment-gateway/">Payment Gateway Settings</a>.', 'pmpro'); ?></p>
149
-
150
- <table class="form-table">
151
- <tbody>
152
- <tr>
153
- <th scope="row" valign="top">
154
- <label for="gateway"><?php _e('Payment Gateway', 'pmpro');?>:</label>
155
- </th>
156
- <td>
157
- <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
158
- <option value="">Testing Only</option>
159
- <option value="check" <?php selected( $gateway, "check" ); ?>><?php _e('Pay by Check', 'pmpro');?></option>
160
- <option value="stripe" <?php selected( $gateway, "stripe" ); ?>>Stripe</option>
161
- <option value="paypalexpress" <?php selected( $gateway, "paypalexpress" ); ?>>PayPal Express</option>
162
- <option value="paypal" <?php selected( $gateway, "paypal" ); ?>>PayPal Website Payments Pro</option>
163
- <option value="payflowpro" <?php selected( $gateway, "payflowpro" ); ?>>PayPal Payflow Pro/PayPal Pro</option>
164
- <option value="paypalstandard" <?php selected( $gateway, "paypalstandard" ); ?>>PayPal Standard</option>
165
- <option value="authorizenet" <?php selected( $gateway, "authorizenet" ); ?>>Authorize.net</option>
166
- <option value="braintree" <?php selected( $gateway, "braintree" ); ?>>Braintree Payments</option>
167
- <option value="twocheckout" <?php selected( $gateway, "twocheckout" ); ?>>2Checkout</option>
168
- <option value="cybersource" <?php selected( $gateway, "cybersource" ); ?>>CyberSource</option>
169
- </select>
170
- </td>
171
- </tr>
172
- <tr class="gateway gateway_cybersource gateway_twocheckout" <?php if($gateway != "cybersource" && $gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
173
- <td colspan="2">
174
- <strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('This gateway option is in beta. Some functionality may not be available. Please contact Paid Memberships Pro with any issues you run into. <strong>Please be sure to upgrade Paid Memberships Pro to the latest versions when available.</strong>', 'pmpro');?>
175
- </td>
176
- </tr>
177
- <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
178
- <td colspan="2">
179
- <strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('We do not recommend using PayPal Standard. We suggest using PayPal Express, Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). <a target="_blank" href="http://www.paidmembershipspro.com/2013/09/read-using-paypal-standard-paid-memberships-pro/">More information on why can be found here.</a>', 'pmpro');?>
180
- </td>
181
- </tr>
182
- <tr>
183
- <th scope="row" valign="top">
184
- <label for="gateway_environment"><?php _e('Gateway Environment', 'pmpro');?>:</label>
185
- </th>
186
- <td>
187
- <select name="gateway_environment">
188
- <option value="sandbox" <?php selected( $gateway_environment, "sandbox" ); ?>><?php _e('Sandbox/Testing', 'pmpro');?></option>
189
- <option value="live" <?php selected( $gateway_environment, "live" ); ?>><?php _e('Live/Production', 'pmpro');?></option>
190
- </select>
191
- <script>
192
- function pmpro_changeGateway(gateway)
193
- {
194
- //hide all gateway options
195
- jQuery('tr.gateway').hide();
196
- jQuery('tr.gateway_'+gateway).show();
197
- }
198
- pmpro_changeGateway(jQuery('#gateway').val());
199
- </script>
200
- </td>
201
- </tr>
202
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
203
- <th scope="row" valign="top">
204
- <label for="payflow_partner"><?php _e('Partner', 'pmpro');?>:</label>
205
- </th>
206
- <td>
207
- <input type="text" id="payflow_partner" name="payflow_partner" size="60" value="<?php echo esc_attr($payflow_partner)?>" />
208
- </td>
209
- </tr>
210
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
211
- <th scope="row" valign="top">
212
- <label for="payflow_vendor"><?php _e('Vendor', 'pmpro');?>:</label>
213
- </th>
214
- <td>
215
- <input type="text" id="payflow_vendor" name="payflow_vendor" size="60" value="<?php echo esc_attr($payflow_vendor)?>" />
216
- </td>
217
- </tr>
218
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
219
- <th scope="row" valign="top">
220
- <label for="payflow_user"><?php _e('User', 'pmpro');?>:</label>
221
- </th>
222
- <td>
223
- <input type="text" id="payflow_user" name="payflow_user" size="60" value="<?php echo esc_attr($payflow_user)?>" />
224
- </td>
225
- </tr>
226
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
227
- <th scope="row" valign="top">
228
- <label for="payflow_pwd"><?php _e('Password', 'pmpro');?>:</label>
229
- </th>
230
- <td>
231
- <input type="password" id="payflow_pwd" name="payflow_pwd" size="60" value="<?php echo esc_attr($payflow_pwd)?>" />
232
- </td>
233
- </tr>
234
- <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
235
- <th scope="row" valign="top">
236
- <label for="gateway_email"><?php _e('Gateway Account Email', 'pmpro');?>:</label>
237
- </th>
238
- <td>
239
- <input type="text" id="gateway_email" name="gateway_email" size="60" value="<?php echo esc_attr($gateway_email)?>" />
240
- </td>
241
- </tr>
242
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
243
- <th scope="row" valign="top">
244
- <label for="apiusername"><?php _e('API Username', 'pmpro');?>:</label>
245
- </th>
246
- <td>
247
- <input type="text" id="apiusername" name="apiusername" size="60" value="<?php echo esc_attr($apiusername)?>" />
248
- </td>
249
- </tr>
250
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
251
- <th scope="row" valign="top">
252
- <label for="apipassword"><?php _e('API Password', 'pmpro');?>:</label>
253
- </th>
254
- <td>
255
- <input type="text" id="apipassword" name="apipassword" size="60" value="<?php echo esc_attr($apipassword)?>" />
256
- </td>
257
- </tr>
258
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
259
- <th scope="row" valign="top">
260
- <label for="apisignature"><?php _e('API Signature', 'pmpro');?>:</label>
261
- </th>
262
- <td>
263
- <input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($apisignature)?>" />
264
- </td>
265
- </tr>
266
-
267
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
268
- <th scope="row" valign="top">
269
- <label for="loginname"><?php _e('Login Name', 'pmpro');?>:</label>
270
- </th>
271
- <td>
272
- <input type="text" id="loginname" name="loginname" size="60" value="<?php echo esc_attr($loginname)?>" />
273
- </td>
274
- </tr>
275
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
276
- <th scope="row" valign="top">
277
- <label for="transactionkey"><?php _e('Transaction Key', 'pmpro');?>:</label>
278
- </th>
279
- <td>
280
- <input type="text" id="transactionkey" name="transactionkey" size="60" value="<?php echo esc_attr($transactionkey)?>" />
281
- </td>
282
- </tr>
283
-
284
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
285
- <th scope="row" valign="top">
286
- <label for="stripe_secretkey"><?php _e('Secret Key', 'pmpro');?>:</label>
287
- </th>
288
- <td>
289
- <input type="text" id="stripe_secretkey" name="stripe_secretkey" size="60" value="<?php echo esc_attr($stripe_secretkey)?>" />
290
- </td>
291
- </tr>
292
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
293
- <th scope="row" valign="top">
294
- <label for="stripe_publishablekey"><?php _e('Publishable Key', 'pmpro');?>:</label>
295
- </th>
296
- <td>
297
- <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" size="60" value="<?php echo esc_attr($stripe_publishablekey)?>" />
298
- </td>
299
- </tr>
300
-
301
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
302
- <th scope="row" valign="top">
303
- <label for="braintree_merchantid"><?php _e('Merchant ID', 'pmpro');?>:</label>
304
- </th>
305
- <td>
306
- <input type="text" id="braintree_merchantid" name="braintree_merchantid" size="60" value="<?php echo esc_attr($braintree_merchantid)?>" />
307
- </td>
308
- </tr>
309
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
310
- <th scope="row" valign="top">
311
- <label for="braintree_publickey"><?php _e('Public Key', 'pmpro');?>:</label>
312
- </th>
313
- <td>
314
- <input type="text" id="braintree_publickey" name="braintree_publickey" size="60" value="<?php echo esc_attr($braintree_publickey)?>" />
315
- </td>
316
- </tr>
317
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
318
- <th scope="row" valign="top">
319
- <label for="braintree_privatekey"><?php _e('Private Key', 'pmpro');?>:</label>
320
- </th>
321
- <td>
322
- <input type="text" id="braintree_privatekey" name="braintree_privatekey" size="60" value="<?php echo esc_attr($braintree_privatekey)?>" />
323
- </td>
324
- </tr>
325
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
326
- <th scope="row" valign="top">
327
- <label for="braintree_encryptionkey"><?php _e('Client-Side Encryption Key', 'pmpro');?>:</label>
328
- </th>
329
- <td>
330
- <textarea id="braintree_encryptionkey" name="braintree_encryptionkey" rows="3" cols="80"><?php echo esc_textarea($braintree_encryptionkey)?></textarea>
331
- </td>
332
- </tr>
333
-
334
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
335
- <th scope="row" valign="top">
336
- <label for="twocheckout_apiusername"><?php _e('API Username', 'pmpro');?>:</label>
337
- </th>
338
- <td>
339
- <input type="text" id="twocheckout_apiusername" name="twocheckout_apiusername" size="60" value="<?php echo esc_attr($twocheckout_apiusername)?>" />
340
- </td>
341
- </tr>
342
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
343
- <th scope="row" valign="top">
344
- <label for="twocheckout_apipassword"><?php _e('API Password', 'pmpro');?>:</label>
345
- </th>
346
- <td>
347
- <input type="text" id="twocheckout_apipassword" name="twocheckout_apipassword" size="60" value="<?php echo esc_attr($twocheckout_apipassword)?>" />
348
- </td>
349
- </tr>
350
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
351
- <th scope="row" valign="top">
352
- <label for="twocheckout_accountnumber"><?php _e('Account Number', 'pmpro');?>:</label>
353
- </th>
354
- <td>
355
- <input type="text" name="twocheckout_accountnumber" size="60" value="<?php echo $twocheckout_accountnumber?>" />
356
- </td>
357
- </tr>
358
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
359
- <th scope="row" valign="top">
360
- <label for="twocheckout_secretword"><?php _e('Secret Word', 'pmpro');?>:</label>
361
- </th>
362
- <td>
363
- <input type="text" name="twocheckout_secretword" size="60" value="<?php echo $twocheckout_secretword?>" />
364
- </td>
365
- </tr>
366
-
367
- <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
368
- <th scope="row" valign="top">
369
- <label for="cybersource_merchantid"><?php _e('Merchant ID', 'pmpro');?>:</label>
370
- </th>
371
- <td>
372
- <input type="text" id="cybersource_merchantid" name="cybersource_merchantid" size="60" value="<?php echo esc_attr($cybersource_merchantid)?>" />
373
- </td>
374
- </tr>
375
- <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
376
- <th scope="row" valign="top">
377
- <label for="cybersource_securitykey"><?php _e('Transaction Security Key', 'pmpro');?>:</label>
378
- </th>
379
- <td>
380
- <textarea id="cybersource_securitykey" name="cybersource_securitykey" rows="3" cols="80"><?php echo esc_textarea($cybersource_securitykey);?></textarea>
381
- </td>
382
- </tr>
383
-
384
- <tr class="gateway gateway_ gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_braintree gateway_twocheckout gateway_cybersource gateway_stripe gateway_authorizenet gateway_payflowpro gateway_check" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource" && $gateway != "payflowpro" && $gateway != "stripe" && $gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
385
- <th scope="row" valign="top">
386
- <label for="currency"><?php _e('Currency', 'pmpro');?>:</label>
387
- </th>
388
- <td>
389
- <select name="currency">
390
- <?php
391
- global $pmpro_currencies;
392
- foreach($pmpro_currencies as $ccode => $cdescription)
393
- {
394
- ?>
395
- <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
396
- <?php
397
- }
398
- ?>
399
- </select>
400
- <small><?php _e( 'Not all currencies will be supported by every gateway. Please check with your gateway.', 'pmpro' ); ?></small>
401
- </td>
402
- </tr>
403
-
404
- <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_payflowpro gateway_braintree gateway_twocheckout gateway_cybersource" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
405
- <th scope="row" valign="top">
406
- <label for="creditcards"><?php _e('Accepted Credit Card Types', 'pmpro');?></label>
407
- </th>
408
- <td>
409
- <input type="checkbox" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Visa<br />
410
- <input type="checkbox" name="creditcards_mastercard" value="1" <?php if(in_array("Mastercard", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Mastercard<br />
411
- <input type="checkbox" name="creditcards_amex" value="1" <?php if(in_array("American Express", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> American Express<br />
412
- <input type="checkbox" name="creditcards_discover" value="1" <?php if(in_array("Discover", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Discover<br />
413
- <input type="checkbox" name="creditcards_dinersclub" value="1" <?php if(in_array("Diners Club", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> Diner's Club<br />
414
- <input type="checkbox" name="creditcards_enroute" value="1" <?php if(in_array("EnRoute", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> EnRoute<br />
415
- <input type="checkbox" name="creditcards_jcb" value="1" <?php if(in_array("JCB", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> JCB<br />
416
- </td>
417
- </tr>
418
- <tr class="gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
419
- <th scope="row" valign="top">
420
- <label for="instructions"><?php _e('Instructions', 'pmpro');?></label>
421
- </th>
422
- <td>
423
- <textarea id="instructions" name="instructions" rows="3" cols="80"><?php echo esc_textarea($instructions)?></textarea>
424
- <p><small><?php _e('Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages.', 'pmpro');?></small></p>
425
- </td>
426
- </tr>
427
-
428
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
429
- <th scope="row" valign="top">
430
- <label for="stripe_billingaddress"><?php _e('Show Billing Address Fields', 'pmpro');?>:</label>
431
- </th>
432
- <td>
433
- <select id="stripe_billingaddress" name="stripe_billingaddress">
434
- <option value="0" <?php if(empty($stripe_billingaddress)) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
435
- <option value="1" <?php if(!empty($stripe_billingaddress)) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
436
- </select>
437
- <small><?php _e("Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>", 'pmpro');?></small>
438
- </td>
439
- </tr>
440
-
441
- <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_paypalexpress gateway_check gateway_paypalstandard gateway_payflowpro gateway_braintree gateway_twocheckout gateway_cybersource" <?php if(!empty($gateway) && $gateway != "stripe" && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
442
- <th scope="row" valign="top">
443
- <label for="tax"><?php _e('Sales Tax', 'pmpro');?> <small>(<?php _e('optional', 'pmpro');?>)</small></label>
444
- </th>
445
- <td>
446
- <?php _e('Tax State', 'pmpro');?>:
447
- <input type="text" id="tax_state" name="tax_state" size="4" value="<?php echo esc_attr($tax_state)?>" /> <small>(<?php _e('abbreviation, e.g. "PA"', 'pmpro');?>)</small>
448
- &nbsp; Tax Rate:
449
- <input type="text" id="tax_rate" name="tax_rate" size="10" value="<?php echo esc_attr($tax_rate)?>" /> <small>(<?php _e('decimal, e.g. "0.06"', 'pmpro');?>)</small>
450
- <p><small><?php _e('US only. If values are given, tax will be applied for any members ordering from the selected state.<br />For non-US or more complex tax rules, use the <a target="_blank" href="http://www.paidmembershipspro.com/2013/10/non-us-taxes-paid-memberships-pro/">pmpro_tax filter</a>.', 'pmpro');?></small></p>
451
- </td>
452
- </tr>
453
- <tr class="gateway gateway_ gateway_stripe gateway_paypalexpress gateway_check gateway_paypalstandard gateway_braintree gateway_twocheckout gateway_cybersource gateway_payflowpro gateway_authorizenet gateway_paypal">
454
- <th scope="row" valign="top">
455
- <label for="use_ssl"><?php _e('Force SSL', 'pmpro');?>:</label>
456
- </th>
457
- <td>
458
- <select id="use_ssl" name="use_ssl">
459
- <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
460
- <option value="1" <?php if(!empty($use_ssl) && $use_ssl == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
461
- <option value="2" <?php if(!empty($use_ssl) && $use_ssl == 2) { ?>selected="selected"<?php } ?>><?php _e('Yes (with JavaScript redirects)', 'pmpro');?></option>
462
- </select>
463
- <small>Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops.</small>
464
- </td>
465
- </tr>
466
- <tr>
467
- <th scope="row" valign="top">
468
- <label for="sslseal"><?php _e('SSL Seal Code', 'pmpro');?>:</label>
469
- </th>
470
- <td>
471
- <textarea id="sslseal" name="sslseal" rows="3" cols="80"><?php echo stripslashes(esc_textarea($sslseal))?></textarea>
472
- <br /><small>Your <strong><a target="_blank" href="http://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/">SSL Certificate</a></strong> must be installed by your web host. Your <strong>SSL Seal</strong> will be a short HTML or JavaScript snippet that can be pasted here.</small>
473
- </td>
474
- </tr>
475
- <tr>
476
- <th scope="row" valign="top">
477
- <label for="nuclear_HTTPS"><?php _e('HTTPS Nuclear Option', 'pmpro');?>:</label>
478
- </th>
479
- <td>
480
- <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> <?php _e('Use the "Nuclear Option" to use secure (HTTPS) URLs on your secure pages. Check this if you are using SSL and have warnings on your checkout pages.', 'pmpro');?>
481
- </td>
482
- </tr>
483
- <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_payflowpro" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
484
- <th scope="row" valign="top">
485
- <label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
486
- </th>
487
- <td>
488
- <p><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre></p>
489
- </td>
490
- </tr>
491
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
492
- <th scope="row" valign="top">
493
- <label><?php _e('TwoCheckout INS URL', 'pmpro');?>:</label>
494
- </th>
495
- <td>
496
- <p><?php _e('To fully integrate with 2Checkout, be sure to set your 2Checkout INS URL ', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=twocheckout-ins";?></pre></p>
497
- </td>
498
- </tr>
499
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
500
- <th scope="row" valign="top">
501
- <label><?php _e('Silent Post URL', 'pmpro');?>:</label>
502
- </th>
503
- <td>
504
- <p><?php _e('To fully integrate with Authorize.net, be sure to set your Silent Post URL to', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=authnet_silent_post";?></pre></p>
505
- </td>
506
- </tr>
507
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
508
- <th scope="row" valign="top">
509
- <label><?php _e('Web Hook URL', 'pmpro');?>:</label>
510
- </th>
511
- <td>
512
- <p><?php _e('To fully integrate with Stripe, be sure to set your Web Hook URL to', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=stripe_webhook";?></pre></p>
513
- </td>
514
- </tr>
515
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
516
- <th scope="row" valign="top">
517
- <label><?php _e('Web Hook URL', 'pmpro');?>:</label>
518
- </th>
519
- <td>
520
- <p>
521
- <?php _e('To fully integrate with Braintree, be sure to set your Web Hook URL to', 'pmpro');?>
522
- <pre><?php
523
- //echo admin_url("admin-ajax.php") . "?action=braintree_webhook";
524
- echo PMPRO_URL . "/services/braintree-webhook.php";
525
- ?></pre>.
526
- </p>
527
- </td>
528
- </tr>
529
- </tbody>
530
- </table>
531
- <p class="submit">
532
- <input name="savesettings" type="submit" class="button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
533
- </p>
534
- </form>
535
-
536
- <?php
537
- require_once(dirname(__FILE__) . "/admin_footer.php");
538
- ?>
1
+ <?php
2
+ global $wpdb, $pmpro_currency_symbol, $msg, $msgt;
3
+
4
+ //get/set settings
5
+ if(!empty($_REQUEST['savesettings']))
6
+ {
7
+ pmpro_setOption("sslseal");
8
+ pmpro_setOption("nuclear_HTTPS");
9
+
10
+ //gateway options
11
+ pmpro_setOption("gateway");
12
+ pmpro_setOption("gateway_environment");
13
+ pmpro_setOption("gateway_email");
14
+ pmpro_setOption("apiusername");
15
+ pmpro_setOption("apipassword");
16
+ pmpro_setOption("apisignature");
17
+ pmpro_setOption("loginname");
18
+ pmpro_setOption("transactionkey");
19
+ pmpro_setOption("stripe_secretkey");
20
+ pmpro_setOption("stripe_publishablekey");
21
+
22
+ //currency
23
+ $currency_paypal = $_POST['currency_paypal'];
24
+ $currency_fixed = $_POST['currency_fixed'];
25
+ if($_POST['gateway'] == "authorizenet" || $_POST['gateway'] == "stripe")
26
+ pmpro_setOption("currency", $currency_fixed);
27
+ else
28
+ pmpro_setOption("currency", $currency_paypal);
29
+
30
+ //credit cards
31
+ $pmpro_accepted_credit_cards = array();
32
+ if(!empty($_REQUEST['creditcards_visa']))
33
+ $pmpro_accepted_credit_cards[] = "Visa";
34
+ if(!empty($_REQUEST['creditcards_mastercard']))
35
+ $pmpro_accepted_credit_cards[] = "Mastercard";
36
+ if(!empty($_REQUEST['creditcards_amex']))
37
+ $pmpro_accepted_credit_cards[] = "American Express";
38
+ if(!empty($_REQUEST['creditcards_discover']))
39
+ $pmpro_accepted_credit_cards[] = "Discover";
40
+ if(!empty($_REQUEST['creditcards_dinersclub']))
41
+ $pmpro_accepted_credit_cards[] = "Diners Club";
42
+ if(!empty($_REQUEST['creditcards_enroute']))
43
+ $pmpro_accepted_credit_cards[] = "EnRoute";
44
+ if(!empty($_REQUEST['creditcards_jcb']))
45
+ $pmpro_accepted_credit_cards[] = "JCB";
46
+
47
+ //tax
48
+ pmpro_setOption("tax_state");
49
+ pmpro_setOption("tax_rate");
50
+
51
+ pmpro_setOption("accepted_credit_cards", implode(",", $pmpro_accepted_credit_cards));
52
+
53
+ //assume success
54
+ $msg = true;
55
+ $msgt = "Your payment settings have been updated.";
56
+ }
57
+
58
+ $sslseal = pmpro_getOption("sslseal");
59
+ $nuclear_HTTPS = pmpro_getOption("nuclear_HTTPS");
60
+
61
+ $gateway = pmpro_getOption("gateway");
62
+ $gateway_environment = pmpro_getOption("gateway_environment");
63
+ $gateway_email = pmpro_getOption("gateway_email");
64
+ $apiusername = pmpro_getOption("apiusername");
65
+ $apipassword = pmpro_getOption("apipassword");
66
+ $apisignature = pmpro_getOption("apisignature");
67
+ $loginname = pmpro_getOption("loginname");
68
+ $transactionkey = pmpro_getOption("transactionkey");
69
+ $stripe_secretkey = pmpro_getOption("stripe_secretkey");
70
+ $stripe_publishablekey = pmpro_getOption("stripe_publishablekey");
71
+
72
+ //use_ssl is based on gateway
73
+ if($gateway == "paypal" || $gateway == "authorizenet")
74
+ {
75
+ pmpro_setOption("use_ssl", 1);
76
+ $use_ssl = 1;
77
+ }
78
+ else
79
+ {
80
+ pmpro_setOption("use_ssl");
81
+ $use_ssl = pmpro_getOption("use_ssl");
82
+ }
83
+
84
+ $currency = pmpro_getOption("currency");
85
+
86
+ $pmpro_accepted_credit_cards = pmpro_getOption("accepted_credit_cards");
87
+
88
+ $tax_state = pmpro_getOption("tax_state");
89
+ $tax_rate = pmpro_getOption("tax_rate");
90
+
91
+ //make sure the tax rate is not > 1
92
+ if((double)$tax_rate > 1)
93
+ {
94
+ //assume the entered X%
95
+ $tax_rate = $tax_rate / 100;
96
+ pmpro_setOption("tax_rate", $tax_rate);
97
+ }
98
+
99
+ //default settings
100
+ if(empty($gateway_environment))
101
+ {
102
+ $gateway_environment = "sandbox";
103
+ pmpro_setOption("gateway_environment", $gateway_environment);
104
+ }
105
+ if(empty($pmpro_accepted_credit_cards))
106
+ {
107
+ $pmpro_accepted_credit_cards = "Visa,Mastercard,American Express,Discover";
108
+ pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
109
+ }
110
+
111
+ $pmpro_accepted_credit_cards = explode(",", $pmpro_accepted_credit_cards);
112
+
113
+ require_once(dirname(__FILE__) . "/admin_header.php");
114
+ ?>
115
+
116
+ <form action="" method="post" enctype="multipart/form-data">
117
+ <h2>Payment Gateway &amp; SSL Settings</h2>
118
+
119
+ <p>Learn more about <a title="Paid Memberships Pro - SSL Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/ssl/">SSL</a> or <a title="Paid Memberships Pro - Payment Gateway Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/payment-gateway/">Payment Gateway Settings</a>.</p>
120
+
121
+ <table class="form-table">
122
+ <tbody>
123
+ <tr>
124
+ <th scope="row" valign="top">
125
+ <label for="gateway">Payment Gateway:</label>
126
+ </th>
127
+ <td>
128
+ <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
129
+ <option value="">Testing Only</option>
130
+ <option value="stripe" <?php if($gateway == "stripe") { ?>selected="selected"<?php } ?>>Stripe</option>
131
+ <option value="paypalexpress" <?php if($gateway == "paypalexpress") { ?>selected="selected"<?php } ?>>PayPal Express</option>
132
+ <option value="paypal" <?php if($gateway == "paypal") { ?>selected="selected"<?php } ?>>PayPal Website Payments Pro</option>
133
+ <option value="authorizenet" <?php if($gateway == "authorizenet") { ?>selected="selected"<?php } ?>>Authorize.net</option>
134
+ </select>
135
+ </td>
136
+ </tr>
137
+ <tr>
138
+ <th scope="row" valign="top">
139
+ <label for="gateway_environment">Gateway Environment:</label>
140
+ </th>
141
+ <td>
142
+ <select name="gateway_environment">
143
+ <option value="sandbox" <?php if($gateway_environment == "sandbox") { ?>selected="selected"<?php } ?>>Sandbox/Testing</option>
144
+ <option value="live" <?php if($gateway_environment == "live") { ?>selected="selected"<?php } ?>>Live/Production</option>
145
+ </select>
146
+ <script>
147
+ function pmpro_changeGateway(gateway)
148
+ {
149
+ //hide all gateway options
150
+ jQuery('tr.gateway').hide();
151
+ jQuery('tr.gateway_'+gateway).show();
152
+ }
153
+ pmpro_changeGateway(jQuery().val('#gateway'));
154
+ </script>
155
+ </td>
156
+ </tr>
157
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
158
+ <th scope="row" valign="top">
159
+ <label for="gateway_email">Gateway Account Email:</label>
160
+ </th>
161
+ <td>
162
+ <input type="text" name="gateway_email" size="60" value="<?php echo $gateway_email?>" />
163
+ </td>
164
+ </tr>
165
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
166
+ <th scope="row" valign="top">
167
+ <label for="apiusername">API Username:</label>
168
+ </th>
169
+ <td>
170
+ <input type="text" name="apiusername" size="60" value="<?php echo $apiusername?>" />
171
+ </td>
172
+ </tr>
173
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
174
+ <th scope="row" valign="top">
175
+ <label for="apipassword">API Password:</label>
176
+ </th>
177
+ <td>
178
+ <input type="text" name="apipassword" size="60" value="<?php echo $apipassword?>" />
179
+ </td>
180
+ </tr>
181
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
182
+ <th scope="row" valign="top">
183
+ <label for="apisignature">API Signature:</label>
184
+ </th>
185
+ <td>
186
+ <input type="text" name="apisignature" size="60" value="<?php echo $apisignature?>" />
187
+ </td>
188
+ </tr>
189
+
190
+ <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
191
+ <th scope="row" valign="top">
192
+ <label for="loginname">Login Name:</label>
193
+ </th>
194
+ <td>
195
+ <input type="text" name="loginname" size="60" value="<?php echo $loginname?>" />
196
+ </td>
197
+ </tr>
198
+ <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
199
+ <th scope="row" valign="top">
200
+ <label for="transactionkey">Transaction Key:</label>
201
+ </th>
202
+ <td>
203
+ <input type="text" name="transactionkey" size="60" value="<?php echo $transactionkey?>" />
204
+ </td>
205
+ </tr>
206
+
207
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
208
+ <th scope="row" valign="top">
209
+ <label for="stripe_secretkey">Secret Key:</label>
210
+ </th>
211
+ <td>
212
+ <input type="text" name="stripe_secretkey" size="60" value="<?php echo $stripe_secretkey?>" />
213
+ </td>
214
+ </tr>
215
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
216
+ <th scope="row" valign="top">
217
+ <label for="stripe_publishablekey">Publishable Key:</label>
218
+ </th>
219
+ <td>
220
+ <input type="text" name="stripe_publishablekey" size="60" value="<?php echo $stripe_publishablekey?>" />
221
+ </td>
222
+ </tr>
223
+
224
+ <tr class="gateway gateway_stripe gateway_authorizenet" <?php if($gateway != "authorizenet" && $gateway != "stripe") { ?>style="display: none;"<?php } ?>>
225
+ <th scope="row" valign="top">
226
+ <label for="transactionkey">Currency:</label>
227
+ </th>
228
+ <td>
229
+ <input type="hidden" name="currency_fixed" size="60" value="USD" />
230
+ USD
231
+ </td>
232
+ </tr>
233
+
234
+ <tr class="gateway gateway_ gateway_paypal gateway_paypalexpress" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
235
+ <th scope="row" valign="top">
236
+ <label for="transactionkey">Currency:</label>
237
+ </th>
238
+ <td>
239
+ <select name="currency_paypal">
240
+ <?php
241
+ global $pmpro_currencies;
242
+ foreach($pmpro_currencies as $ccode => $cdescription)
243
+ {
244
+ ?>
245
+ <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
246
+ <?php
247
+ }
248
+ ?>
249
+ </select>
250
+ </td>
251
+ </tr>
252
+
253
+ <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe") { ?>style="display: none;"<?php } ?>>
254
+ <th scope="row" valign="top">
255
+ <label for="creditcards">Accepted Credit Card Types</label>
256
+ </th>
257
+ <td>
258
+ <input type="checkbox" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Visa<br />
259
+ <input type="checkbox" name="creditcards_mastercard" value="1" <?php if(in_array("Mastercard", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Mastercard<br />
260
+ <input type="checkbox" name="creditcards_amex" value="1" <?php if(in_array("American Express", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> American Express<br />
261
+ <input type="checkbox" name="creditcards_discover" value="1" <?php if(in_array("Discover", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Discover<br />
262
+ <input type="checkbox" name="creditcards_dinersclub" value="1" <?php if(in_array("Diners Club", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> Diner's Club<br />
263
+ <input type="checkbox" name="creditcards_enroute" value="1" <?php if(in_array("EnRoute", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> EnRoute<br />
264
+ <input type="checkbox" name="creditcards_jcb" value="1" <?php if(in_array("JCB", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> JCB<br />
265
+ </td>
266
+ </tr>
267
+ <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_paypalexpress" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
268
+ <th scope="row" valign="top">
269
+ <label for="tax">Sales Tax <small>(optional)</small></label>
270
+ </th>
271
+ <td>
272
+ Tax State:
273
+ <input type="text" name="tax_state" size="4" value="<?php echo $tax_state?>" /> <small>(abbreviation, e.g. "PA")</small>
274
+ &nbsp; Tax Rate:
275
+ <input type="text" name="tax_rate" size="10" value="<?php echo $tax_rate?>" /> <small>(decimal, e.g. "0.06")</small>
276
+ <p><small>If values are given, tax will be applied for any members ordering from the selected state. For more complex tax rules, use the "pmpro_tax" filter.</small></p>
277
+ </td>
278
+ </tr>
279
+ <tr class="gateway gateway_ gateway_stripe gateway_paypalexpress" <?php if(!empty($gateway) && $gateway != "stripe" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
280
+ <th scope="row" valign="top">
281
+ <label for="use_ssl">Use SSL:</label>
282
+ </th>
283
+ <td>
284
+ <select id="use_ssl" name="use_ssl">
285
+ <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>>No</option>
286
+ <option value="1" <?php if(!empty($use_ssl)) { ?>selected="selected"<?php } ?>>Yes</option>
287
+ </select>
288
+ </td>
289
+ </tr>
290
+ <tr class="gateway gateway_paypal gateway_authorizenet" <?php if($gateway != "paypal" && $gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
291
+ <th scope="row" valign="top">
292
+ <label for="use_ssl">Use SSL:</label>
293
+ </th>
294
+ <td>
295
+ Yes. (Required by this Gateway Option)
296
+ </td>
297
+ </tr>
298
+ <tr>
299
+ <th scope="row" valign="top">
300
+ <label for="sslseal">SSL Seal Code:</label>
301
+ </th>
302
+ <td>
303
+ <textarea id="sslseal" name="sslseal" rows="3" cols="80"><?php echo stripslashes($sslseal)?></textarea>
304
+ </td>
305
+ </tr>
306
+ <tr>
307
+ <th scope="row" valign="top">
308
+ <label for="nuclear_HTTPS">SSL Seal Code:</label>
309
+ </th>
310
+ <td>
311
+ <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> Use the "Nuclear Option" to use secure (HTTPS) URLs on your secure pages. Check this if you are using SSL and have warnings on your checkout pages.
312
+ </td>
313
+ </tr>
314
+ </tbody>
315
+ </table>
316
+ <p class="submit">
317
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
318
+ </p>
319
+ </form>
320
+
321
+ <?php
322
+ require_once(dirname(__FILE__) . "/admin_footer.php");
323
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
- global $pmpro_reports;
3
-
4
- require_once(dirname(__FILE__) . "/admin_header.php");
5
-
6
- //default view, report widgets
7
- if(empty($_REQUEST['report']))
8
- {
9
- //wrapper
10
- ?>
11
- <div id="dashboard-widgets-wrap">
12
- <div id="dashboard-widgets" class="metabox-holder pmpro_reports-holder columns-2">
13
- <div id="postbox-container-1" class="postbox-container">
14
- <div id="normal-sortables" class="meta-box-sortables ui-sortable">
15
- <?php
16
-
17
- //report widgets
18
- $count = 0;
19
- $nreports = count($pmpro_reports);
20
- $split = false;
21
- foreach($pmpro_reports as $report => $title)
22
- {
23
- //make sure title is translated (since these are set before translations happen)
24
- $title = __($title, "pmpro");
25
-
26
- //put half of the report widgets in postbox-container-2
27
- if(!$split && $count++ > $nreports/2)
28
- {
29
- $split = true;
30
- ?>
31
- </div></div><div id="postbox-container-2" class="postbox-container"><div id="side-sortables" class="meta-box-sortables ui-sortable">
32
- <?php
33
- }
34
- ?>
35
- <div id="pmpro_report_<?php echo $report; ?>" class="postbox pmpro_clickable" onclick="location.href='<?php echo admin_url("admin.php?page=pmpro-reports&report=" . $report);?>';">
36
- <h3 class="hndle"><span><?php echo $title; ?></span></h3>
37
- <div class="inside">
38
- <?php call_user_func("pmpro_report_" . $report . "_widget"); ?>
39
- <div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">
40
- <a class="button button-primary" href="<?php echo admin_url("admin.php?page=pmpro-reports&report=" . $report);?>"><?php _e('Details', 'pmpro');?></a>
41
- </div>
42
- </div>
43
- </div>
44
- <?php
45
- }
46
-
47
- //end wrapper
48
- ?>
49
- </div>
50
- </div>
51
- </div>
52
- <?php
53
- }
54
- else
55
- {
56
- //view a single report
57
- $report = $_REQUEST['report'];
58
- call_user_func("pmpro_report_" . $report . "_page");
59
- }
60
-
61
- require_once(dirname(__FILE__) . "/admin_footer.php");
62
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/login.php DELETED
@@ -1,412 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Logins
5
- Slug: login
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
- global $pmpro_reports;
16
- $pmpro_reports['login'] = __('Visits, Views, and Logins', 'pmpro');
17
-
18
- function pmpro_report_login_widget()
19
- {
20
- global $wpdb;
21
- $visits = get_option("pmpro_visits", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
22
- $views = get_option("pmpro_views", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
23
- $logins = get_option("pmpro_logins", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
24
- ?>
25
- <div style="width: 33%; float: left;">
26
- <p><?php _e('Visits Today', 'pmpro')?>: <?php echo $visits['today'];?></p>
27
- <p><?php _e('Visits This Month', 'pmpro')?>: <?php echo $visits['month'];?></p>
28
- <p><?php _e('Visits All Time', 'pmpro')?>: <?php echo $visits['alltime'];?></p>
29
- </div>
30
- <div style="width: 33%; float: left;">
31
- <p><?php _e('Views Today', 'pmpro')?>: <?php echo $views['today'];?></p>
32
- <p><?php _e('Views This Month', 'pmpro')?>: <?php echo $views['month'];?></p>
33
- <p><?php _e('Views All Time', 'pmpro')?>: <?php echo $views['alltime'];?></p>
34
- </div>
35
- <div style="width: 33%; float: left;">
36
- <p><?php _e('Logins Today', 'pmpro')?>: <?php echo $logins['today'];?></p>
37
- <p><?php _e('Logins This Month', 'pmpro')?>: <?php echo $logins['month'];?></p>
38
- <p><?php _e('Logins All Time', 'pmpro')?>: <?php echo $logins['alltime'];?></p>
39
- </div>
40
- <div class="clear"></div>
41
- <?php
42
- }
43
-
44
- function pmpro_report_login_page()
45
- {
46
- global $wpdb;
47
-
48
- //vars
49
- if(!empty($_REQUEST['s']))
50
- $s = $_REQUEST['s'];
51
- else
52
- $s = "";
53
-
54
- if(!empty($_REQUEST['l']))
55
- $l = $_REQUEST['l'];
56
- else
57
- $l = "";
58
- ?>
59
- <form id="posts-filter" method="get" action="">
60
- <h2>
61
- <?php _e('Visits, Views, and Logins Report', 'pmpro');?>
62
- </h2>
63
- <ul class="subsubsub">
64
- <li>
65
- <?php _ex('Show', 'Dropdown label, e.g. Show All Users', 'pmpro')?> <select name="l" onchange="jQuery('#posts-filter').submit();">
66
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Users', 'pmpro')?></option>
67
- <option value="all" <?php if($l == "all") { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro')?></option>
68
- <?php
69
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
70
- foreach($levels as $level)
71
- {
72
- ?>
73
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
74
- <?php
75
- }
76
- ?>
77
- </select>
78
- </li>
79
- </ul>
80
- <p class="search-box">
81
- <label class="hidden" for="post-search-input"><?php _ex('Search', 'Search form label', 'pmpro')?> <?php if(empty($l)) echo "Users"; else echo "Members";?>:</label>
82
- <input type="hidden" name="page" value="pmpro-reports" />
83
- <input type="hidden" name="report" value="login" />
84
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
85
- <input class="button" type="submit" value="Search Members"/>
86
- </p>
87
- <?php
88
- //some vars for the search
89
- if(isset($_REQUEST['pn']))
90
- $pn = $_REQUEST['pn'];
91
- else
92
- $pn = 1;
93
-
94
- if(isset($_REQUEST['limit']))
95
- $limit = $_REQUEST['limit'];
96
- else
97
- $limit = 15;
98
-
99
- $end = $pn * $limit;
100
- $start = $end - $limit;
101
-
102
- if($s)
103
- {
104
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
105
-
106
- if($l == "all")
107
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 ";
108
- elseif($l)
109
- $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
110
-
111
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
112
- }
113
- else
114
- {
115
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
116
- $sqlQuery .= " WHERE 1=1 ";
117
-
118
- if($l == "all")
119
- $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' ";
120
- elseif($l)
121
- $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
122
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
123
- }
124
-
125
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
126
-
127
- $theusers = $wpdb->get_results($sqlQuery);
128
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
129
-
130
- if($theusers)
131
- {
132
- ?>
133
- <p class="clear"><?php echo strval($totalrows)?> <?php if(empty($l)) echo "users"; else echo "members";?> found.
134
- <?php
135
- }
136
- ?>
137
- <table class="widefat">
138
- <thead>
139
- <tr class="thead">
140
- <th><?php _e('ID', 'pmpro')?></th>
141
- <th><?php _e('User', 'pmpro')?></th>
142
- <th><?php _e('Name', 'pmpro')?></th>
143
- <th><?php _e('Membership', 'pmpro')?></th>
144
- <th><?php _e('Joined', 'pmpro')?></th>
145
- <th><?php _e('Expires', 'pmpro')?></th>
146
- <th><?php _e('Last Visit', 'pmpro')?></th>
147
- <th><?php _e('Visits This Month', 'pmpro')?></th>
148
- <th><?php _e('Total Visits', 'pmpro')?></th>
149
- <th><?php _e('Views This Month', 'pmpro')?></th>
150
- <th><?php _e('Total Views', 'pmpro')?></th>
151
- <th><?php _e('Last Login', 'pmpro')?></th>
152
- <th><?php _e('Logins This Month', 'pmpro')?></th>
153
- <th><?php _e('Total Logins', 'pmpro')?></th>
154
- </tr>
155
- </thead>
156
- <tbody id="users" class="list:user user-list">
157
- <?php
158
- $count = 0;
159
- foreach($theusers as $auser)
160
- {
161
- //get meta
162
- $theuser = get_userdata($auser->ID);
163
- $visits = get_user_meta($auser->ID, "pmpro_visits", true);
164
- $views = get_user_meta($auser->ID, "pmpro_views", true);
165
- $logins = get_user_meta($auser->ID, "pmpro_logins", true);
166
- if(empty($logins))
167
- $logins = array("last"=>"N/A", "month"=>"N/A", "alltime"=>"N/A");
168
- ?>
169
- <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
170
- <td><?php echo $theuser->ID?></td>
171
- <td>
172
- <?php echo get_avatar($theuser->ID, 32)?>
173
- <strong>
174
- <?php
175
- $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
176
- $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
177
- echo $userlink;
178
- ?>
179
- </strong>
180
- </td>
181
- <td>
182
- <?php echo $theuser->display_name;?>
183
- </td>
184
- <td><?php echo $auser->membership?></td>
185
- <td><?php echo date("m/d/Y", strtotime($theuser->user_registered, current_time("timestamp")))?></td>
186
- <td>
187
- <?php
188
- if($auser->enddate)
189
- echo date(get_option('date_format'), $auser->enddate);
190
- else
191
- echo "Never";
192
- ?>
193
- </td>
194
- <td><?php if(!empty($visits['last'])) echo $visits['last'];?></td>
195
- <td><?php if(!empty($visits['month'])) echo $visits['month'];?></td>
196
- <td><?php if(!empty($visits['alltime'])) echo $visits['alltime'];?></td>
197
- <td><?php if(!empty($visits['month'])) echo $views['month'];?></td>
198
- <td><?php if(!empty($visits['alltime'])) echo $views['alltime'];?></td>
199
- <td><?php if(!empty($visits['last'])) echo $logins['last'];?></td>
200
- <td><?php if(!empty($visits['month'])) echo $logins['month'];?></td>
201
- <td><?php if(!empty($visits['alltime'])) echo $logins['alltime'];?></td>
202
- </tr>
203
- <?php
204
- }
205
-
206
- if(!$theusers)
207
- {
208
- ?>
209
- <tr>
210
- <td colspan="9"><p><?php _e('No members found.', 'pmpro')?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>"><?php _e('Search all levels', 'pmpro')?></a>.<?php } ?></p></td>
211
- </tr>
212
- <?php
213
- }
214
- ?>
215
- </tbody>
216
- </table>
217
- </form>
218
-
219
- <?php
220
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-reports&report=login&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
221
- ?>
222
- <?php
223
- }
224
-
225
- /*
226
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
227
- */
228
-
229
- //track visits
230
- function pmpro_report_login_wp_visits()
231
- {
232
- //don't track admin
233
- if(is_admin())
234
- return;
235
-
236
- //only track logged in users
237
- if(!is_user_logged_in())
238
- return;
239
-
240
- //check for cookie
241
- if(!empty($_COOKIE['pmpro_visit']))
242
- return;
243
-
244
- //set cookie, then track
245
- setcookie("pmpro_visit", "1", NULL, COOKIEPATH, COOKIE_DOMAIN, false);
246
-
247
- global $current_user;
248
- //track for user
249
- if(!empty($current_user->ID))
250
- {
251
- $visits = $current_user->pmpro_visits;
252
- if(empty($visits))
253
- $visits = array("last"=>"N/A", "thisdate"=>NULL, "month"=>0, "thismonth"=>NULL, "alltime"=>0);
254
-
255
- //track logins for user
256
- $visits['last'] = date(get_option("date_format"));
257
- $visits['alltime']++;
258
- $thismonth = date("n");
259
- if($thismonth == $visits['thismonth'])
260
- $visits['month']++;
261
- else
262
- {
263
- $visits['month'] = 1;
264
- $visits['thismonth'] = $thismonth;
265
- }
266
-
267
- //update user data
268
- update_user_meta($current_user->ID, "pmpro_visits", $visits);
269
- }
270
-
271
- //track for all
272
- $visits = get_option("pmpro_visits");
273
- if(empty($visits))
274
- $visits = array("today"=>0, "thisdate"=>NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
275
-
276
- $visits['alltime']++;
277
- $thisdate = date("Y-d-m");
278
- if($thisdate == $visits['thisdate'])
279
- $visits['today']++;
280
- else
281
- {
282
- $visits['today'] = 1;
283
- $visits['thisdate'] = $thisdate;
284
- }
285
- if($thismonth == $visits['thismonth'])
286
- $visits['month']++;
287
- else
288
- {
289
- $visits['month'] = 1;
290
- $visits['thismonth'] = $thismonth;
291
- }
292
-
293
- update_option("pmpro_visits", $visits);
294
- }
295
- add_action("wp", "pmpro_report_login_wp_visits");
296
-
297
- //we want to clear the pmpro_visit cookie on login/logout
298
- function pmpro_report_login_clear_visit_cookie()
299
- {
300
- if(isset($_COOKIE['pmpro_visit']))
301
- unset($_COOKIE['pmpro_visit']);
302
- }
303
- add_action("wp_login", "pmpro_report_login_clear_visit_cookie");
304
- add_action("wp_logout", "pmpro_report_login_clear_visit_cookie");
305
-
306
- //track views
307
- function pmpro_report_login_wp_views()
308
- {
309
- //don't track admin
310
- if(is_admin())
311
- return;
312
-
313
- global $current_user;
314
- //track for user
315
- if(!empty($current_user->ID))
316
- {
317
- $views = $current_user->pmpro_views;
318
- if(empty($views))
319
- $views = array("last"=>"N/A", "month"=>0, "alltime"=>0);
320
-
321
- //track logins for user
322
- $views['last'] = date(get_option("date_format"));
323
- $views['alltime']++;
324
- $thismonth = date("n");
325
- if(isset($views['thismonth']) && $thismonth == $views['thismonth'])
326
- $views['month']++;
327
- else
328
- {
329
- $views['month'] = 1;
330
- $views['thismonth'] = $thismonth;
331
- }
332
-
333
- //update user data
334
- update_user_meta($current_user->ID, "pmpro_views", $views);
335
- }
336
-
337
- //track for all
338
- $views = get_option("pmpro_views");
339
- if(empty($views))
340
- $views = array("today"=>0, "thisdate"=> NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
341
-
342
- $views['alltime']++;
343
- $thisdate = date("Y-d-m");
344
- if($thisdate == $views['thisdate'])
345
- $views['today']++;
346
- else
347
- {
348
- $views['today'] = 1;
349
- $views['thisdate'] = $thisdate;
350
- }
351
- $thismonth = date("n");
352
- if(isset($views['thismonth']) && $thismonth == $views['thismonth'])
353
- $views['month']++;
354
- else
355
- {
356
- $views['month'] = 1;
357
- $views['thismonth'] = $thismonth;
358
- }
359
-
360
- update_option("pmpro_views", $views);
361
- }
362
- add_action("wp", "pmpro_report_login_wp_views");
363
-
364
- //track logins
365
- function pmpro_report_login_wp_login($user_login)
366
- {
367
- //get user data
368
- $user = get_user_by("login", $user_login);
369
- $logins = $user->pmpro_logins;
370
- if(empty($logins))
371
- $logins = array("last"=>"N/A", "thisdate"=>NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
372
-
373
- //track logins for user
374
- $logins['last'] = date(get_option("date_format"));
375
- $logins['alltime']++;
376
- $thismonth = date("n");
377
- if($thismonth == $logins['thismonth'])
378
- $logins['month']++;
379
- else
380
- {
381
- $logins['month'] = 1;
382
- $logins['thismonth'] = $thismonth;
383
- }
384
-
385
- //update user data
386
- update_user_meta($user->ID, "pmpro_logins", $logins);
387
-
388
- //track logins overall
389
- $logins = get_option("pmpro_logins");
390
- if(empty($logins))
391
- $logins = array("today"=>0, "thisdate"=>NULL, "month"=>0, "thismonth"=>NULL, "alltime"=>0);
392
-
393
- $logins['alltime']++;
394
- $thisdate = date("Y-d-m");
395
- if($thisdate == $logins['thisdate'])
396
- $logins['today']++;
397
- else
398
- {
399
- $logins['today'] = 1;
400
- $logins['thisdate'] = $thisdate;
401
- }
402
- if($thismonth == $logins['thismonth'])
403
- $logins['month']++;
404
- else
405
- {
406
- $logins['month'] = 1;
407
- $logins['thismonth'] = $thismonth;
408
- }
409
-
410
- update_option("pmpro_logins", $logins);
411
- }
412
- add_action("wp_login", "pmpro_report_login_wp_login");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/memberships.php DELETED
@@ -1,651 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Membership Stats
5
- Slug: memberships
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
-
16
- global $pmpro_reports;
17
-
18
- $pmpro_reports['memberships'] = __('Membership Stats', 'pmpro');
19
-
20
- //queue Google Visualization JS on report page
21
- function pmpro_report_memberships_init() {
22
- if(is_admin() && isset($_REQUEST['report']) && $_REQUEST['report'] == "memberships" && isset($_REQUEST['page']) && $_REQUEST['page'] == "pmpro-reports")
23
- wp_enqueue_script("jsapi", "https://www.google.com/jsapi");
24
- }
25
- add_action( 'init', 'pmpro_report_memberships_init' );
26
-
27
-
28
- //widget
29
- function pmpro_report_memberships_widget() {
30
- global $wpdb, $pmpro_currency_symbol;
31
- ?>
32
- <style type="text/css">
33
- #pmpro_report_memberships .section-label {
34
- margin: 15px 0;
35
- font-size: 18px;
36
- text-align: left;
37
- display: block;
38
- }
39
-
40
- #pmpro_report_memberships .section-label:first-child {
41
- margin-top: 0;
42
- }
43
-
44
- #pmpro_report_memberships div {text-align: center;}
45
- #pmpro_report_memberships em {display: block; font-style: normal; font-size: 2em; margin: 5px; line-height: 26px;}
46
- </style>
47
- <span id="pmpro_report_memberships">
48
- <label class="section-label"><?php _e('Signups', 'pmpro');?>:</label>
49
- <div style="width: 25%; float: left;">
50
- <label><?php _e('All Time', 'pmpro');?></label>
51
- <em><?php echo pmpro_getSignups( 'all time' ); ?></em>
52
- </div>
53
- <div style="width: 25%; float: left;">
54
- <label><?php _e('This Year', 'pmpro');?></label>
55
- <em><?php echo pmpro_getSignups( 'this year' ); ?></em>
56
- </div>
57
- <div style="width: 25%; float: left;">
58
- <label><?php _e('This Month', 'pmpro');?></label>
59
- <em><?php echo pmpro_getSignups( 'this month' ); ?></em>
60
- </div>
61
- <div style="width: 25%; float: left;">
62
- <label><?php _e('Today', 'pmpro');?></label>
63
- <em><?php echo pmpro_getSignups( 'today' ); ?></em>
64
- </div>
65
- <div class="clear"></div>
66
-
67
- <label class="section-label"><?php _e('Cancellations', 'pmpro');?>:</label>
68
- <div style="width: 25%; float: left;">
69
- <label><?php _e('All Time', 'pmpro');?></label>
70
- <em><?php echo pmpro_getCancellations( 'all time' ); ?></em>
71
- </div>
72
- <div style="width: 25%; float: left;">
73
- <label><?php _e('This Year', 'pmpro');?></label>
74
- <em><?php echo pmpro_getCancellations( 'this year' ); ?></em>
75
- </div>
76
- <div style="width: 25%; float: left;">
77
- <label><?php _e('This Month', 'pmpro');?></label>
78
- <em><?php echo pmpro_getCancellations( 'this month' ); ?></em>
79
- </div>
80
- <div style="width: 25%; float: left;">
81
- <label><?php _e('Today', 'pmpro');?></label>
82
- <em><?php echo pmpro_getCancellations( 'today' ); ?></em>
83
- </div>
84
- <div class="clear"></div>
85
-
86
- <label class="section-label"><?php _e('Other Stats', 'pmpro');?>:</label>
87
- <div style="width: 33%; float: left;">
88
- <label><?php _e('Monthly Recurring Revenue (MRR)', 'pmpro');?></label>
89
- <em><?php echo $pmpro_currency_symbol . $pmpro_mrr = number_format(pmpro_getMRR( 'all time' ), 2); ?></em>
90
- </div>
91
- <div style="width: 33%; float: left;">
92
- <label><?php _e('Cancellation Rate', 'pmpro');?></label>
93
- <em><?php echo pmpro_getCancellationRate('all time' ); ?>%</em>
94
- </div>
95
- <div style="width: 33%; float: left;">
96
- <label><?php _e('Lifetime Value (LTV)', 'pmpro');?></label>
97
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getLTV('all time' ), 2); ?></em>
98
- </div>
99
- <div class="clear"></div>
100
- </span>
101
- <?php
102
- }
103
-
104
- function pmpro_report_memberships_page()
105
- {
106
- global $wpdb, $pmpro_currency_symbol;
107
-
108
- //get values from form
109
- if(isset($_REQUEST['type']))
110
- $type = sanitize_text_field($_REQUEST['type']);
111
- else
112
- $type = "signup_v_cancel";
113
-
114
- if(isset($_REQUEST['period']))
115
- $period = sanitize_text_field($_REQUEST['period']);
116
- else
117
- $period = "monthly";
118
-
119
- if(isset($_REQUEST['month']))
120
- $month = intval($_REQUEST['month']);
121
- else
122
- $month = date("n");
123
-
124
- $thisyear = date("Y");
125
- if(isset($_REQUEST['year']))
126
- $year = intval($_REQUEST['year']);
127
- else
128
- $year = date("Y");
129
-
130
- if(isset($_REQUEST['level']))
131
- $l = intval($_REQUEST['level']);
132
- else
133
- $l = "";
134
-
135
- //calculate start date and how to group dates returned from DB
136
- if($period == "daily")
137
- {
138
- $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
139
- $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-31';
140
- $date_function = 'DAY';
141
- }
142
- elseif($period == "monthly")
143
- {
144
- $startdate = $year . '-01-01';
145
- $enddate = strval(intval($year)+1) . '-01-01';
146
- $date_function = 'MONTH';
147
- }
148
- elseif($period == "annual")
149
- {
150
- $startdate = '1960-01-01'; //all time
151
- $date_function = 'YEAR';
152
- }
153
-
154
- //testing or live data
155
- $gateway_environment = pmpro_getOption("gateway_environment");
156
-
157
- //get data
158
- if ( $type === "signup_v_cancel" ) {
159
- $sqlQuery = "SELECT $date_function(startdate) as date, COUNT(DISTINCT user_id) as signups
160
- FROM $wpdb->pmpro_memberships_users WHERE startdate >= '" . $startdate . "' ";
161
-
162
- if(!empty($enddate))
163
- $sqlQuery .= "AND startdate < '" . $enddate . "' ";
164
- }
165
- if ( $type === "mrr_ltv" ) {
166
- // Get total revenue, number of months in system, and date
167
- if ( $period == 'annual' )
168
- $sqlQuery = "SELECT SUM(total) as total, COUNT(DISTINCT MONTH(timestamp)) as months, $date_function(timestamp) as date
169
- FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token')
170
- AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
171
-
172
- if ( $period == 'monthly' )
173
- $sqlQuery = "SELECT SUM(total) as total, $date_function(timestamp) as date
174
- FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token')
175
- AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
176
-
177
- if(!empty($enddate))
178
- $sqlQuery .= "AND timestamp < '" . $enddate . "' ";
179
- }
180
-
181
- if(!empty($l))
182
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
183
-
184
- $sqlQuery .= " GROUP BY date ORDER BY date ";
185
-
186
- $dates = $wpdb->get_results($sqlQuery);
187
-
188
- //fill in blanks in dates
189
- $cols = array();
190
- if($period == "daily")
191
- {
192
- $lastday = date("t", $startdate);
193
-
194
- for($i = 1; $i <= $lastday; $i++)
195
- {
196
- // Signups vs. Cancellations
197
- if ( $type === "signup_v_cancel" ) {
198
- $cols[$i] = new stdClass();
199
- $cols[$i]->signups = 0;
200
- foreach($dates as $date)
201
- {
202
- if( $date->date == $i ) {
203
- $cols[$i]->signups = $date->signups;
204
- }
205
- }
206
- }
207
- }
208
- }
209
- elseif($period == "monthly")
210
- {
211
- for($i = 1; $i < 13; $i++)
212
- {
213
- // Signups vs. Cancellations
214
- if ( $type === "signup_v_cancel" ) {
215
- $cols[$i] = new stdClass();
216
- $cols[$i]->date = $i;
217
- $cols[$i]->signups = 0;
218
- foreach($dates as $date)
219
- {
220
- if( $date->date == $i ) {
221
- $cols[$i]->date = $date->date;
222
- $cols[$i]->signups = $date->signups;
223
- }
224
- }
225
- }
226
-
227
- // MRR & LTV
228
- if ( $type === "mrr_ltv" ) {
229
- $cols[$i] = new stdClass();
230
- $cols[$i]->date = $i;
231
- $cols[$i]->months = 1;
232
- foreach($dates as $date)
233
- {
234
- if( $date->date == $i ) {
235
- $cols[$i]->total = $date->total;
236
- }
237
- }
238
- }
239
- }
240
- }
241
- elseif($period == "annual") //annual
242
- {
243
- }
244
-
245
- $dates = ( ! empty( $cols ) ) ? $cols : $dates;
246
-
247
- // Signups vs. cancellations
248
- if ( $type === "signup_v_cancel" )
249
- {
250
- $sqlQuery = "SELECT $date_function(mu1.modified) as date, COUNT(DISTINCT mu1.user_id) as cancellations
251
- FROM $wpdb->pmpro_memberships_users mu1
252
- LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND
253
- mu2.modified > mu1.enddate AND
254
- DATE_ADD(mu1.modified, INTERVAL 1 DAY) > mu2.startdate
255
- WHERE mu1.status = 'inactive'
256
- AND mu2.id IS NULL
257
- AND mu1.startdate >= '" . $startdate . "'
258
- AND mu1.startdate < '" . $enddate . "' ";
259
-
260
- //restrict by level
261
- if(!empty($l))
262
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
263
-
264
- $sqlQuery .= " GROUP BY date ORDER BY date ";
265
-
266
- $cdates = $wpdb->get_results($sqlQuery, OBJECT_K);
267
-
268
- foreach( $dates as &$date )
269
- {
270
- if(!empty($cdates[$date->date]))
271
- $date->cancellations = $cdates[$date->date]->cancellations;
272
- else
273
- $date->cancellations = 0;
274
- }
275
- }
276
-
277
- // MRR & LTV
278
- if ( $type === "mrr_ltv" && count( $dates ) === 1 ) {
279
- $dummy_date = new stdClass();
280
- $dummy_date->total = 0;
281
- $dummy_date->months = 0;
282
- $dummy_date->date = $dates[0]->date - 1;
283
- array_unshift( $dates, $dummy_date ); // Add to beginning
284
- }
285
- ?>
286
- <form id="posts-filter" method="get" action="">
287
- <h2>
288
- <?php _e('Membership Stats', 'pmpro');?>
289
- </h2>
290
- <ul class="subsubsub">
291
- <li>
292
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?>
293
- <select id="period" name="period">
294
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'pmpro');?></option>
295
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'pmpro');?></option>
296
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'pmpro');?></option>
297
- </select>
298
- <select id="type" name="type">
299
- <option value="signup_v_cancel" <?php selected($type, "signup_v_cancel");?>><?php _e('Signups vs. Cancellations', 'pmpro');?></option>
300
- <?php /*
301
- <option value="mrr_ltv" <?php selected($type, "mrr_ltv");?>><?php _e('MRR & LTV', 'pmpro');?></option>
302
- */ ?>
303
- </select>
304
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
305
- <select id="month" name="month">
306
- <?php for($i = 1; $i < 13; $i++) { ?>
307
- <option value="<?php echo $i;?>" <?php selected($month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
308
- <?php } ?>
309
- </select>
310
- <select id="year" name="year">
311
- <?php for($i = $thisyear; $i > 2007; $i--) { ?>
312
- <option value="<?php echo $i;?>" <?php selected($year, $i);?>><?php echo $i;?></option>
313
- <?php } ?>
314
- </select>
315
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
316
- <select name="level">
317
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
318
- <?php
319
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
320
- foreach($levels as $level)
321
- {
322
- ?>
323
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
324
- <?php
325
- }
326
- ?>
327
- </select>
328
-
329
- <input type="hidden" name="page" value="pmpro-reports" />
330
- <input type="hidden" name="report" value="memberships" />
331
- <input type="submit" value="<?php _ex('Generate Report', 'Submit button value.', 'pmpro');?>" />
332
- </li>
333
- </ul>
334
-
335
- <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
336
-
337
- <script>
338
- //update month/year when period dropdown is changed
339
- jQuery(document).ready(function() {
340
- jQuery('#period').change(function() {
341
- pmpro_ShowMonthOrYear();
342
- });
343
- });
344
-
345
- function pmpro_ShowMonthOrYear()
346
- {
347
- var period = jQuery('#period').val();
348
- if(period == 'daily')
349
- {
350
- jQuery('#for').show();
351
- jQuery('#month').show();
352
- jQuery('#year').show();
353
- }
354
- else if(period == 'monthly')
355
- {
356
- jQuery('#for').show();
357
- jQuery('#month').hide();
358
- jQuery('#year').show();
359
- }
360
- else
361
- {
362
- jQuery('#for').hide();
363
- jQuery('#month').hide();
364
- jQuery('#year').hide();
365
- }
366
- }
367
-
368
- pmpro_ShowMonthOrYear();
369
-
370
- //draw the chart
371
- google.load("visualization", "1", {packages:["corechart"]});
372
- google.setOnLoadCallback(drawChart);
373
- function drawChart() {
374
-
375
- var data = google.visualization.arrayToDataTable([
376
- <?php if ( $type === "signup_v_cancel" ) : // Signups vs. cancellations ?>
377
- ['<?php echo $date_function;?>', 'Signups', 'Cancellations'],
378
- <?php foreach($dates as $key => $value) { ?>
379
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$value->date)); else if($period == "daily") echo $key; else echo $value->date;?>', <?php echo $value->signups; ?>, <?php echo $value->cancellations; ?>],
380
- <?php } ?>
381
- <?php endif; ?>
382
-
383
- <?php if ( $type === "mrr_ltv" ) : // Signups vs. cancellations ?>
384
- ['<?php echo $date_function;?>', 'MRR', 'LTV'],
385
- <?php foreach($dates as $key => $value) { ?>
386
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$value->date)); else if($period == "daily") echo $key; else echo $value->date;?>', <?php echo (($mrr = $value->total / $value->months) && $mrr != 0) ? $mrr : 0; ?>, <?php echo pmpro_getLTV($period, NULL, $mrr ); ?>],
387
- <?php } ?>
388
- <?php endif; ?>
389
- ]);
390
-
391
- var options = {
392
- colors: ['#0099c6', '#dc3912'],
393
- hAxis: {title: '<?php echo $date_function;?>', titleTextStyle: {color: 'black'}, maxAlternation: 1},
394
- vAxis: {color: 'green', titleTextStyle: {color: '#51a351'}},
395
- };
396
-
397
- <?php if ( $type === "signup_v_cancel" ) : // Signups vs. cancellations ?>
398
- var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
399
- <?php elseif ( $type === "mrr_ltv" ) : // MRR & LTV ?>
400
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
401
- formatter.format(data, 2);
402
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
403
- formatter.format(data, 1);
404
-
405
- var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
406
- <?php endif; ?>
407
- chart.draw(data, options);
408
- }
409
- </script>
410
-
411
- </form>
412
- <?php
413
- }
414
-
415
-
416
-
417
- /*
418
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
419
- */
420
-
421
- //get signups
422
- function pmpro_getSignups($period = false, $levels = 'all')
423
- {
424
- //check for a transient
425
- $cache = get_transient( 'pmpro_report_memberships_signups' );
426
- if( ! empty( $cache ) && ! empty( $cache[$period] ) && ! empty( $cache[$period][$levels] ) )
427
- return $cache[$period][$levels];
428
-
429
- //a sale is an order with status = success
430
- if( $period == 'today' )
431
- $startdate = date(' Y-m-d' );
432
- elseif( $period == 'this month')
433
- $startdate = date( 'Y-m' ) . '-01';
434
- elseif( $period == 'this year')
435
- $startdate = date( 'Y' ) . '-01-01';
436
- else
437
- $startdate = '';
438
-
439
-
440
- //build query
441
- global $wpdb;
442
-
443
- $sqlQuery = "SELECT COUNT(DISTINCT user_id) FROM $wpdb->pmpro_memberships_users WHERE startdate >= '" . $startdate . "' ";
444
-
445
- //restrict by level
446
- if(!empty($levels) && $levels != 'all')
447
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
448
-
449
- $signups = $wpdb->get_var($sqlQuery);
450
-
451
- //save in cache
452
- if(!empty($cache) && !empty($cache[$period]))
453
- $cache[$period][$levels] = $signups;
454
- elseif(!empty($cache))
455
- $cache[$period] = array($levels => $signups);
456
- else
457
- $cache = array($period => array($levels => $signups));
458
-
459
- set_transient("pmpro_report_memberships_signups", $cache, 3600*24);
460
-
461
- return $signups;
462
- }
463
-
464
- //get cancellations
465
- function pmpro_getCancellations($period = false, $levels = 'all')
466
- {
467
- //check for a transient
468
- $cache = get_transient( 'pmpro_report_memberships_cancellations' );
469
- if( ! empty( $cache ) && ! empty( $cache[$period] ) && ! empty( $cache[$period][$levels] ) )
470
- return $cache[$period][$levels];
471
-
472
- //figure out start date
473
- if( $period == 'today' )
474
- $startdate = date(' Y-m-d' );
475
- elseif( $period == 'this month')
476
- $startdate = date( 'Y-m' ) . '-01';
477
- elseif( $period == 'this year')
478
- $startdate = date( 'Y' ) . '-01-01';
479
- else
480
- $startdate = '';
481
-
482
- $startdate_plus_one = strtotime( $startdate . + ' + 1 day', current_time("timestamp") );
483
-
484
- /*
485
- build query.
486
- cancellations are marked in the memberships users table with status = 'inactive'
487
- we try to ignore cancellations when the user gets a new level with 24 hours (probably an upgrade or downgrade)
488
- */
489
- global $wpdb;
490
-
491
- //$sqlQuery = "SELECT mu1.user_id, mu2.user_id FROM $wpdb->pmpro_memberships_users mu1 LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND mu2.status = 'inactive' AND mu2.startdate > mu1.startdate";
492
- $sqlQuery = "SELECT COUNT(mu1.id)
493
- FROM $wpdb->pmpro_memberships_users mu1
494
- LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND
495
- mu2.modified > mu1.enddate AND
496
- DATE_ADD(mu1.modified, INTERVAL 1 DAY) > mu2.startdate
497
- WHERE mu1.status = 'inactive'
498
- AND mu2.id IS NULL
499
- AND mu1.startdate >= '" . $startdate . "' ";
500
-
501
- //restrict by level
502
- if(!empty($levels) && $levels != 'all')
503
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
504
-
505
- $cancellations = $wpdb->get_var($sqlQuery);
506
-
507
- //save in cache
508
- if(!empty($cache) && !empty($cache[$period]) && is_array($cache[$period]))
509
- $cache[$period][$levels] = $cancellations;
510
- elseif(!empty($cache))
511
- $cache[$period] = array($levels => $cancellations);
512
- else
513
- $cache = array($period => array($levels => $cancellations));
514
-
515
- set_transient("pmpro_report_memberships_cancellations", $cache, 3600*24);
516
-
517
- return $cancellations;
518
- }
519
-
520
- //get MRR
521
- function pmpro_getMRR($period, $levels = 'all')
522
- {
523
- //check for a transient
524
- //$cache = get_transient("pmpro_report_mrr");
525
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
526
- return $cache[$period][$levels];
527
-
528
- //a sale is an order with status NOT IN refunded, review, token, error
529
- if($period == "this month")
530
- $startdate = date("Y-m") . "-01";
531
- elseif($period == "this year")
532
- $startdate = date("Y") . "-01-01";
533
- else
534
- $startdate = "";
535
-
536
- $gateway_environment = pmpro_getOption("gateway_environment");
537
-
538
- //build query
539
- global $wpdb;
540
- // Get total revenue
541
- $sqlQuery = "SELECT SUM(total) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
542
-
543
- //restrict by level
544
- if(!empty($levels) && $levels != 'all') {
545
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
546
- }
547
-
548
- $revenue = $wpdb->get_var($sqlQuery);
549
-
550
- //when was the first order
551
- $first_order_timestamp = $wpdb->get_var("SELECT UNIX_TIMESTAMP(`timestamp`) FROM $wpdb->pmpro_membership_orders WHERE `timestamp` IS NOT NULL AND `timestamp` > '0000-00-00 00:00:00' ORDER BY `timestamp` LIMIT 1");
552
-
553
- //if we don't have a timestamp, we can't do this
554
- if(empty($first_order_timestamp))
555
- return false;
556
-
557
- //how many months ago was the first order
558
- $months = $wpdb->get_var("SELECT PERIOD_DIFF('" . date("Ym") . "', '" . date("Ym", $first_order_timestamp) . "')");
559
-
560
- /* this works in PHP 5.3+ without using MySQL to get the diff
561
- $date1 = new DateTime(date("Y-m-d", $first_order_timestamp));
562
- $date2 = new DateTime(date("Y-m-d"));
563
- $interval = $date1->diff($date2);
564
- $years = intval($interval->format('%y'));
565
- $months = $years*12 + intval($interval->format('%m'));
566
- */
567
-
568
- if($months > 0)
569
- $mrr = $revenue / $months;
570
- else
571
- $mrr = 0;
572
-
573
- //save in cache
574
- if(!empty($cache) && !empty($cache[$period]))
575
- $cache[$period][$levels] = $mrr;
576
- elseif(!empty($cache))
577
- $cache[$period] = array($levels => $mrr);
578
- else
579
- $cache = array($period => array($levels => $mrr));
580
-
581
- set_transient("pmpro_report_mrr", $cache, 3600*24);
582
-
583
- return $mrr;
584
- }
585
-
586
- //get Cancellation Rate
587
- function pmpro_getCancellationRate($period, $levels = 'all')
588
- {
589
- //check for a transient
590
- $cache = get_transient("pmpro_report_cancellation_rate");
591
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
592
- return $cache[$period][$levels];
593
-
594
- $signups = pmpro_getSignups($period, $levels);
595
- $cancellations = pmpro_getCancellations($period, $levels);
596
-
597
- if(empty($signups))
598
- return false;
599
-
600
- $rate = number_format(($cancellations / $signups)*100, 2);
601
-
602
- //save in cache
603
- if(!empty($cache) && !empty($cache[$period]))
604
- $cache[$period][$levels] = $rate;
605
- elseif(!empty($cache))
606
- $cache[$period] = array($levels => $rate);
607
- else
608
- $cache = array($period => array($levels => $rate));
609
-
610
- set_transient("pmpro_report_cancellation_rate", $cache, 3600*24);
611
-
612
- return $rate;
613
- }
614
-
615
- //get LTV
616
- function pmpro_getLTV($period, $levels = 'all', $mrr = NULL, $signups = NULL, $cancellation_rate = NULL)
617
- {
618
- if(empty($mrr))
619
- $mrr = pmpro_getMRR($period, $levels);
620
- if(empty($signups))
621
- $signups = pmpro_getSignups($period, $levels);
622
- if(empty($cancellation_rate))
623
- $cancellation_rate = pmpro_getCancellationRate($period, $levels);
624
-
625
- //average monthly spend
626
- if(empty($signups))
627
- return false;
628
-
629
- if($signups > 0)
630
- $ams = $mrr / $signups;
631
- else
632
- $ams = 0;
633
-
634
- if($cancellation_rate > 0)
635
- $ltv = $ams * (1/$cancellation_rate);
636
- else
637
- $ltv = $ams;
638
-
639
- return $ltv;
640
- }
641
-
642
- //delete transients when an order goes through
643
- function pmpro_report_memberships_delete_transients()
644
- {
645
- delete_transient("pmpro_report_mrr");
646
- delete_transient("pmpro_report_cancellation_rate");
647
- delete_transient("pmpro_report_memberships_cancellations");
648
- delete_transient("pmpro_report_memberships_signups");
649
- }
650
- add_action("pmpro_after_checkout", "pmpro_report_memberships_delete_transients");
651
- add_action("pmpro_updated_order", "pmpro_report_memberships_delete_transients");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/sales.php DELETED
@@ -1,397 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Sales
5
- Slug: sales
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
- global $pmpro_reports;
16
- $gateway_environment = pmpro_getOption("gateway_environment");
17
- if($gateway_environment == "sandbox")
18
- $pmpro_reports['sales'] = __('Sales and Revenue (Testing/Sandbox)', 'pmpro');
19
- else
20
- $pmpro_reports['sales'] = __('Sales and Revenue', 'pmpro');
21
-
22
- //queue Google Visualization JS on report page
23
- function pmpro_report_sales_init()
24
- {
25
- if(is_admin() && isset($_REQUEST['report']) && $_REQUEST['report'] == "sales" && isset($_REQUEST['page']) && $_REQUEST['page'] == "pmpro-reports")
26
- {
27
- wp_enqueue_script("jsapi", "https://www.google.com/jsapi");
28
- }
29
- }
30
- add_action("init", "pmpro_report_sales_init");
31
-
32
- //widget
33
- function pmpro_report_sales_widget()
34
- {
35
- global $wpdb, $pmpro_currency_symbol;
36
- ?>
37
- <style>
38
- #pmpro_report_sales div {text-align: center;}
39
- #pmpro_report_sales em {display: block; font-style: normal; font-size: 2em; margin: 5px;}
40
- </style>
41
- <span id="#pmpro_report_sales">
42
- <div style="width: 25%; float: left;">
43
- <em><?php echo pmpro_getSales("all time");?></em>
44
- <label>All Time</label>
45
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("all time"), 2);?></em>
46
- </div>
47
- <div style="width: 25%; float: left;">
48
- <em><?php echo pmpro_getSales("this year");?></em>
49
- <label>This Year</label>
50
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("this year"), 2);?></em>
51
- </div>
52
- <div style="width: 25%; float: left;">
53
- <em><?php echo pmpro_getSales("this month");?></em>
54
- <label>This Month</label>
55
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("this month"), 2);?></em>
56
- </div>
57
- <div style="width: 25%; float: left;">
58
- <em><?php echo pmpro_getSales("today");?></em>
59
- <label>Today</label>
60
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("today"), 2);?></em>
61
- </div>
62
- <div class="clear"></div>
63
- </span>
64
- <?php
65
- }
66
-
67
- function pmpro_report_sales_page()
68
- {
69
- global $wpdb, $pmpro_currency_symbol;
70
-
71
- //get values from form
72
- if(isset($_REQUEST['type']))
73
- $type = sanitize_text_field($_REQUEST['type']);
74
- else
75
- $type = "revenue";
76
-
77
- if($type == "sales")
78
- $type_function = "COUNT";
79
- else
80
- $type_function = "SUM";
81
-
82
- if(isset($_REQUEST['period']))
83
- $period = sanitize_text_field($_REQUEST['period']);
84
- else
85
- $period = "daily";
86
-
87
- if(isset($_REQUEST['month']))
88
- $month = intval($_REQUEST['month']);
89
- else
90
- $month = date("n");
91
-
92
- $thisyear = date("Y");
93
- if(isset($_REQUEST['year']))
94
- $year = intval($_REQUEST['year']);
95
- else
96
- $year = $thisyear;
97
-
98
- if(isset($_REQUEST['level']))
99
- $l = intval($_REQUEST['level']);
100
- else
101
- $l = "";
102
-
103
- //calculate start date and how to group dates returned from DB
104
- if($period == "daily")
105
- {
106
- $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
107
- $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-31';
108
- $date_function = 'DAY';
109
- }
110
- elseif($period == "monthly")
111
- {
112
- $startdate = $year . '-01-01';
113
- $enddate = strval(intval($year)+1) . '-01-01';
114
- $date_function = 'MONTH';
115
- }
116
- else
117
- {
118
- $startdate = '1960-01-01'; //all time
119
- $date_function = 'YEAR';
120
- }
121
-
122
- //testing or live data
123
- $gateway_environment = pmpro_getOption("gateway_environment");
124
-
125
- //get data
126
- $sqlQuery = "SELECT $date_function(timestamp) as date, $type_function(total) as value FROM $wpdb->pmpro_membership_orders WHERE timestamp >= '" . $startdate . "' AND status NOT IN('refunded', 'review', 'token', 'error') AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
127
-
128
- if(!empty($enddate))
129
- $sqlQuery .= "AND timestamp < '" . $enddate . "' ";
130
-
131
- if(!empty($l))
132
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
133
-
134
- $sqlQuery .= " GROUP BY date ORDER BY date ";
135
-
136
- $dates = $wpdb->get_results($sqlQuery);
137
-
138
- //fill in blanks in dates
139
- $cols = array();
140
- if($period == "daily")
141
- {
142
- $lastday = date("t", $startdate);
143
-
144
- for($i = 1; $i <= $lastday; $i++)
145
- {
146
- $cols[$i] = 0;
147
- foreach($dates as $date)
148
- {
149
- if($date->date == $i)
150
- $cols[$i] = $date->value;
151
- }
152
- }
153
- }
154
- elseif($period == "monthly")
155
- {
156
- for($i = 1; $i < 13; $i++)
157
- {
158
- $cols[$i] = 0;
159
- foreach($dates as $date)
160
- {
161
- if($date->date == $i)
162
- $cols[$i] = $date->value;
163
- }
164
- }
165
- }
166
- else //annual
167
- {
168
- //get min and max years
169
- $min = 9999;
170
- $max = 0;
171
- foreach($dates as $date)
172
- {
173
- $min = min($min, $date->date);
174
- $max = max($max, $date->date);
175
- }
176
-
177
- for($i = $min; $i <= $max; $i++)
178
- {
179
- foreach($dates as $date)
180
- {
181
- if($date->date == $i)
182
- $cols[$i] = $date->value;
183
- }
184
- }
185
- }
186
- ?>
187
- <form id="posts-filter" method="get" action="">
188
- <h2>
189
- <?php _e('Sales and Revenue', 'pmpro');?>
190
- </h2>
191
-
192
- <div class="tablenav top">
193
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?>
194
- <select id="period" name="period">
195
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'pmpro');?></option>
196
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'pmpro');?></option>
197
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'pmpro');?></option>
198
- </select>
199
- <select name="type">
200
- <option value="revenue" <?php selected($type, "revenue");?>><?php _e('Revenue', 'pmpro');?></option>
201
- <option value="sales" <?php selected($type, "sales");?>><?php _e('Sales', 'pmpro');?></option>
202
- </select>
203
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
204
- <select id="month" name="month">
205
- <?php for($i = 1; $i < 13; $i++) { ?>
206
- <option value="<?php echo $i;?>" <?php selected($month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
207
- <?php } ?>
208
- </select>
209
- <select id="year" name="year">
210
- <?php for($i = $thisyear; $i > 2007; $i--) { ?>
211
- <option value="<?php echo $i;?>" <?php selected($year, $i);?>><?php echo $i;?></option>
212
- <?php } ?>
213
- </select>
214
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
215
- <select name="level">
216
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
217
- <?php
218
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
219
- foreach($levels as $level)
220
- {
221
- ?>
222
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
223
- <?php
224
- }
225
- ?>
226
- </select>
227
-
228
- <input type="hidden" name="page" value="pmpro-reports" />
229
- <input type="hidden" name="report" value="sales" />
230
- <input type="submit" class="button action" value="<?php _ex('Generate Report', 'Submit button value.', 'pmpro');?>" />
231
- </div>
232
-
233
- <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
234
-
235
- <script>
236
- //update month/year when period dropdown is changed
237
- jQuery(document).ready(function() {
238
- jQuery('#period').change(function() {
239
- pmpro_ShowMonthOrYear();
240
- });
241
- });
242
-
243
- function pmpro_ShowMonthOrYear()
244
- {
245
- var period = jQuery('#period').val();
246
- if(period == 'daily')
247
- {
248
- jQuery('#for').show();
249
- jQuery('#month').show();
250
- jQuery('#year').show();
251
- }
252
- else if(period == 'monthly')
253
- {
254
- jQuery('#for').show();
255
- jQuery('#month').hide();
256
- jQuery('#year').show();
257
- }
258
- else
259
- {
260
- jQuery('#for').hide();
261
- jQuery('#month').hide();
262
- jQuery('#year').hide();
263
- }
264
- }
265
-
266
- pmpro_ShowMonthOrYear();
267
-
268
- //draw the chart
269
- google.load("visualization", "1", {packages:["corechart"]});
270
- google.setOnLoadCallback(drawChart);
271
- function drawChart() {
272
-
273
- var data = google.visualization.arrayToDataTable([
274
- ['<?php echo $date_function;?>', '<?php echo ucwords($type);?>'],
275
- <?php foreach($cols as $date => $value) { ?>
276
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$date)); else echo $date;?>', <?php echo $value;?>],
277
- <?php } ?>
278
- ]);
279
-
280
- var options = {
281
- colors: ['#51a351', '#387038'],
282
- hAxis: {title: '<?php echo $date_function;?>', titleTextStyle: {color: 'black'}, maxAlternation: 1},
283
- vAxis: {color: 'green', titleTextStyle: {color: '#51a351'}},
284
- };
285
-
286
- <?php if($type != "sales") { ?>
287
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
288
- formatter.format(data, 1);
289
- <?php } ?>
290
-
291
- var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
292
- chart.draw(data, options);
293
- }
294
- </script>
295
-
296
- </form>
297
- <?php
298
- }
299
-
300
- /*
301
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
302
- */
303
-
304
- //get sales
305
- function pmpro_getSales($period, $levels = NULL)
306
- {
307
- //check for a transient
308
- $cache = get_transient("pmpro_report_sales");
309
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
310
- return $cache[$period][$levels];
311
-
312
- //a sale is an order with status NOT IN('refunded', 'review', 'token', 'error')
313
- if($period == "today")
314
- $startdate = date("Y-m-d");
315
- elseif($period == "this month")
316
- $startdate = date("Y-m") . "-01";
317
- elseif($period == "this year")
318
- $startdate = date("Y") . "-01-01";
319
- else
320
- $startdate = "";
321
-
322
- $gateway_environment = pmpro_getOption("gateway_environment");
323
-
324
- //build query
325
- global $wpdb;
326
- $sqlQuery = "SELECT COUNT(*) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
327
-
328
- //restrict by level
329
- if(!empty($levels))
330
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
331
-
332
- $sales = $wpdb->get_var($sqlQuery);
333
-
334
- //save in cache
335
- if(!empty($cache) && !empty($cache[$period]))
336
- $cache[$period][$levels] = $sales;
337
- elseif(!empty($cache))
338
- $cache[$period] = array($levels => $sales);
339
- else
340
- $cache = array($period => array($levels => $sales));
341
-
342
- set_transient("pmpro_report_sales", $cache, 3600*24);
343
-
344
- return $sales;
345
- }
346
-
347
- //get revenue
348
- function pmpro_getRevenue($period, $levels = NULL)
349
- {
350
- //check for a transient
351
- $cache = get_transient("pmpro_report_revenue");
352
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
353
- return $cache[$period][$levels];
354
-
355
- //a sale is an order with status NOT IN('refunded', 'review', 'token', 'error')
356
- if($period == "today")
357
- $startdate = date("Y-m-d");
358
- elseif($period == "this month")
359
- $startdate = date("Y-m") . "-01";
360
- elseif($period == "this year")
361
- $startdate = date("Y") . "-01-01";
362
- else
363
- $startdate = "";
364
-
365
- $gateway_environment = pmpro_getOption("gateway_environment");
366
-
367
- //build query
368
- global $wpdb;
369
- $sqlQuery = "SELECT SUM(total) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
370
-
371
- //restrict by level
372
- if(!empty($levels))
373
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
374
-
375
- $revenue = $wpdb->get_var($sqlQuery);
376
-
377
- //save in cache
378
- if(!empty($cache) && !empty($cache[$period]))
379
- $cache[$period][$levels] = $revenue;
380
- elseif(!empty($cache))
381
- $cache[$period] = array($levels => $revenue);
382
- else
383
- $cache = array($period => array($levels => $revenue));
384
-
385
- set_transient("pmpro_report_revenue", $cache, 3600*24);
386
-
387
- return $revenue;
388
- }
389
-
390
- //delete transients when an order goes through
391
- function pmpro_report_sales_delete_transients()
392
- {
393
- delete_transient("pmpro_report_sales");
394
- delete_transient("pmpro_report_revenue");
395
- }
396
- add_action("pmpro_after_checkout", "pmpro_report_sales_delete_transients");
397
- add_action("pmpro_updated_order", "pmpro_report_sales_delete_transients");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/class.memberorder.php CHANGED
@@ -29,7 +29,7 @@
29
  $dbobj = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(timestamp) + " . ($gmt_offset * 3600) . " as timestamp FROM $wpdb->pmpro_membership_orders WHERE id = '$id' LIMIT 1");
30
 
31
  if($dbobj)
32
- {
33
  $this->id = $dbobj->id;
34
  $this->code = $dbobj->code;
35
  $this->session_id = $dbobj->session_id;
@@ -42,7 +42,6 @@
42
  $this->billing->city = $dbobj->billing_city;
43
  $this->billing->state = $dbobj->billing_state;
44
  $this->billing->zip = $dbobj->billing_zip;
45
- $this->billing->country = $dbobj->billing_country;
46
  $this->billing->phone = $dbobj->billing_phone;
47
 
48
  //split up some values
@@ -87,11 +86,8 @@
87
  $this->affiliate_id = $dbobj->affiliate_id;
88
  $this->affiliate_subid = $dbobj->affiliate_subid;
89
 
90
- $this->notes = $dbobj->notes;
91
-
92
  //reset the gateway
93
- if(empty($this->nogateway))
94
- $this->setGateway();
95
 
96
  return $this->id;
97
  }
@@ -109,23 +105,20 @@
109
 
110
  //which one to load?
111
  $classname = "PMProGateway"; //default test gateway
112
- if(!empty($this->gateway) && $this->gateway != "free")
113
  $classname .= "_" . $this->gateway; //adding the gateway suffix
114
 
115
  //try to load it
116
- include_once(dirname(__FILE__) . "/gateways/class." . strtolower($classname) . ".php");
117
  if(class_exists($classname))
118
  $this->Gateway = new $classname($this->gateway);
119
  else
120
- {
121
- $error = new WP_Error("PMPro1001", "Could not locate the gateway class file with class name = " . $classname . ".");
122
- //die("Could not locate the gateway class file with class name = " . $classname . ".");
123
- }
124
 
125
  return $this->Gateway;
126
  }
127
 
128
- function getLastMemberOrder($user_id = NULL, $status = 'success', $membership_id = NULL)
129
  {
130
  global $current_user, $wpdb;
131
  if(!$user_id)
@@ -134,26 +127,11 @@
134
  if(!$user_id)
135
  return false;
136
 
137
- //build query
138
- $this->sqlQuery = "SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ";
139
- if(!empty($status) && is_array($status))
140
- $this->sqlQuery .= "AND status IN('" . implode("','", $status) . "') ";
141
- elseif(!empty($status))
142
- $this->sqlQuery .= "AND status = '" . esc_sql($status) . "' ";
143
-
144
- if(!empty($membership_id))
145
- $this->sqlQuery .= "AND membership_id = '" . $membership_id . "' ";
146
- $this->sqlQuery .= "ORDER BY timestamp DESC LIMIT 1";
147
-
148
- //get id
149
- $id = $wpdb->get_var($this->sqlQuery);
150
 
151
  return $this->getMemberOrderByID($id);
152
  }
153
 
154
- /*
155
- Returns the order using the given order code.
156
- */
157
  function getMemberOrderByCode($code)
158
  {
159
  global $wpdb;
@@ -164,35 +142,10 @@
164
  return false;
165
  }
166
 
167
- /*
168
- Returns the last order using the given payment_transaction_id.
169
- */
170
  function getMemberOrderByPaymentTransactionID($payment_transaction_id)
171
  {
172
- //did they pass a trans id?
173
- if(empty($payment_transaction_id))
174
- return false;
175
-
176
  global $wpdb;
177
- $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE payment_transaction_id = '" . esc_sql($payment_transaction_id) . "' LIMIT 1");
178
- if($id)
179
- return $this->getMemberOrderByID($id);
180
- else
181
- return false;
182
- }
183
-
184
- /*
185
- Returns the last order using the given subscription_transaction_id.
186
- */
187
- function getLastMemberOrderBySubscriptionTransactionID($subscription_transaction_id)
188
- {
189
- //did they pass a sub id?
190
- if(empty($subscription_transaction_id))
191
- return false;
192
-
193
- global $wpdb;
194
- $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE subscription_transaction_id = '" . esc_sql($subscription_transaction_id) . "' ORDER BY id DESC LIMIT 1");
195
-
196
  if($id)
197
  return $this->getMemberOrderByID($id);
198
  else
@@ -202,7 +155,7 @@
202
  function getMemberOrderByPayPalToken($token)
203
  {
204
  global $wpdb;
205
- $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE paypal_token = '" . $token . "' LIMIT 1");
206
  if($id)
207
  return $this->getMemberOrderByID($id);
208
  else
@@ -217,9 +170,6 @@
217
  global $wpdb;
218
  $this->discount_code = $wpdb->get_row("SELECT dc.* FROM $wpdb->pmpro_discount_codes dc LEFT JOIN $wpdb->pmpro_discount_codes_uses dcu ON dc.id = dcu.code_id WHERE dcu.order_id = '" . $this->id . "' LIMIT 1");
219
 
220
- //filter @since v1.7.14
221
- $this->discount_code = apply_filters("pmpro_order_discount_code", $this->discount_code, $this);
222
-
223
  return $this->discount_code;
224
  }
225
 
@@ -228,7 +178,7 @@
228
  global $wpdb;
229
 
230
  if(!empty($this->user))
231
- return $this->user;
232
 
233
  $gmt_offset = get_option('gmt_offset');
234
  $this->user = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(user_registered) + " . ($gmt_offset * 3600) . " as user_registered FROM $wpdb->users WHERE ID = '" . $this->user_id . "' LIMIT 1");
@@ -245,23 +195,13 @@
245
  //check if there is an entry in memberships_users first
246
  if(!empty($this->user_id))
247
  {
248
- $this->membership_level = $wpdb->get_row("SELECT l.id as level_id, l.name, l.description, l.allow_signups, l.expiration_number, l.expiration_period, mu.*, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_memberships_users mu ON l.id = mu.membership_id WHERE mu.status = 'active' AND l.id = '" . $this->membership_id . "' AND mu.user_id = '" . $this->user_id . "' LIMIT 1");
249
-
250
- //fix the membership level id
251
- if(!empty($this->membership_level->level_id))
252
- $this->membership_level->id = $this->membership_level->level_id;
253
  }
254
 
255
  //okay, do I have a discount code to check? (if there is no membership_level->membership_id value, that means there was no entry in memberships_users)
256
  if(!empty($this->discount_code) && empty($this->membership_level->membership_id))
257
  {
258
- if(!empty($this->discount_code->code))
259
- $discount_code = $this->discount_code->code;
260
- else
261
- $discount_code = $this->discount_code;
262
-
263
- $sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id LEFT JOIN $wpdb->pmpro_discount_codes dc ON dc.id = cl.code_id WHERE dc.code = '" . $discount_code . "' AND cl.level_id = '" . $this->membership_id . "' LIMIT 1";
264
-
265
  $this->membership_level = $wpdb->get_row($sqlQuery);
266
  }
267
 
@@ -287,7 +227,7 @@
287
  if($tax_state && $tax_rate)
288
  {
289
  //we have values, is this order in the tax state?
290
- if(!empty($this->billing) && trim(strtoupper($this->billing->state)) == trim(strtoupper($tax_state)))
291
  {
292
  //return value, pass through filter
293
  $tax = round((float)$price * (float)$tax_rate, 2);
@@ -321,122 +261,60 @@
321
  return $this->tax;
322
  }
323
 
324
- function updateTimestamp($year, $month, $day, $time = NULL)
325
- {
326
- if(empty($this->id))
327
- return false; //need a saved order
328
-
329
- if(empty($time))
330
- $time = "00:00:00";
331
-
332
- $date = $year . "-" . $month . "-" . $day . " " . $time;
333
-
334
- global $wpdb;
335
- $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders SET timestamp = '" . $date . "' WHERE id = '" . $this->id . "' LIMIT 1";
336
-
337
- if($wpdb->query($this->sqlQuery) !== "false")
338
- return $this->getMemberOrderByID($this->id);
339
- else
340
- return false;
341
- }
342
-
343
  function saveOrder()
344
- {
345
  global $current_user, $wpdb;
346
 
347
  //get a random code to use for the public ID
348
- if(empty($this->code))
349
  $this->code = $this->getRandomCode();
350
 
351
  //figure out how much we charged
352
  if(!empty($this->InitialPayment))
353
  $amount = $this->InitialPayment;
354
- elseif(!empty($this->subtotal))
355
- $amount = $this->subtotal;
356
  else
357
- $amount = 0;
358
 
359
  //Todo: Tax?!, Coupons, Certificates, affiliates
360
- if(empty($this->subtotal))
361
- $this->subtotal = $amount;
362
- if(isset($this->tax))
363
- $tax = $this->tax;
364
- else
365
- $tax = $this->getTax(true);
366
  $this->certificate_id = "";
367
  $this->certificateamount = "";
368
 
369
- //calculate total
370
- if(!empty($this->total))
371
- $total = $this->total;
372
- else
373
- $total = (float)$amount + (float)$tax;
374
-
375
  //these fix some warnings/notices
376
- if(empty($this->billing))
377
- {
378
- $this->billing = new stdClass();
379
- $this->billing->name = $this->billing->street = $this->billing->city = $this->billing->state = $this->billing->zip = $this->billing->country = $this->billing->phone = "";
380
- }
381
- if(empty($this->user_id))
382
- $this->user_id = 0;
383
  if(empty($this->paypal_token))
384
  $this->paypal_token = "";
385
  if(empty($this->couponamount))
386
  $this->couponamount = "";
387
  if(empty($this->payment_type))
388
  $this->payment_type = "";
389
- if(empty($this->payment_transaction_id))
390
- $this->payment_transaction_id = "";
391
  if(empty($this->subscription_transaction_id))
392
  $this->subscription_transaction_id = "";
393
  if(empty($this->affiliate_id))
394
  $this->affiliate_id = "";
395
  if(empty($this->affiliate_subid))
396
- $this->affiliate_subid = "";
397
- if(empty($this->session_id))
398
- $this->session_id = "";
399
- if(empty($this->accountnumber))
400
- $this->accountnumber = "";
401
- if(empty($this->cardtype))
402
- $this->cardtype = "";
403
- if(empty($this->ExpirationDate))
404
- $this->ExpirationDate = "";
405
- if (empty($this->status))
406
- $this->status = "";
407
-
408
- if(empty($this->gateway))
409
- $this->gateway = pmpro_getOption("gateway");
410
- if(empty($this->gateway_environment))
411
- $this->gateway_environment = pmpro_getOption("gateway_environment");
412
-
413
- if(empty($this->notes))
414
- $this->notes = "";
415
 
416
  //build query
417
  if(!empty($this->id))
418
  {
419
- //set up actions
420
- $before_action = "pmpro_update_order";
421
- $after_action = "pmpro_updated_order";
422
  //update
423
  $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders
424
  SET `code` = '" . $this->code . "',
425
  `session_id` = '" . $this->session_id . "',
426
- `user_id` = " . intval($this->user_id) . ",
427
- `membership_id` = " . intval($this->membership_id) . ",
428
  `paypal_token` = '" . $this->paypal_token . "',
429
- `billing_name` = '" . esc_sql($this->billing->name) . "',
430
- `billing_street` = '" . esc_sql($this->billing->street) . "',
431
- `billing_city` = '" . esc_sql($this->billing->city) . "',
432
- `billing_state` = '" . esc_sql($this->billing->state) . "',
433
- `billing_zip` = '" . esc_sql($this->billing->zip) . "',
434
- `billing_country` = '" . esc_sql($this->billing->country) . "',
435
- `billing_phone` = '" . esc_sql($this->billing->phone) . "',
436
  `subtotal` = '" . $this->subtotal . "',
437
  `tax` = '" . $this->tax . "',
438
  `couponamount` = '" . $this->couponamount . "',
439
- `certificate_id` = " . intval($this->certificate_id) . ",
440
  `certificateamount` = '" . $this->certificateamount . "',
441
  `total` = '" . $this->total . "',
442
  `payment_type` = '" . $this->payment_type . "',
@@ -444,72 +322,58 @@
444
  `accountnumber` = '" . $this->accountnumber . "',
445
  `expirationmonth` = '" . $this->expirationmonth . "',
446
  `expirationyear` = '" . $this->expirationyear . "',
447
- `status` = '" . esc_sql($this->status) . "',
448
  `gateway` = '" . $this->gateway . "',
449
  `gateway_environment` = '" . $this->gateway_environment . "',
450
- `payment_transaction_id` = '" . esc_sql($this->payment_transaction_id) . "',
451
- `subscription_transaction_id` = '" . esc_sql($this->subscription_transaction_id) . "',
452
- `affiliate_id` = '" . esc_sql($this->affiliate_id) . "',
453
- `affiliate_subid` = '" . esc_sql($this->affiliate_subid) . "',
454
- `notes` = '" . esc_sql($this->notes) . "'
455
  WHERE id = '" . $this->id . "'
456
  LIMIT 1";
457
  }
458
  else
459
  {
460
- //set up actions
461
- $before_action = "pmpro_add_order";
462
- $after_action = "pmpro_added_order";
463
  //insert
464
  $this->sqlQuery = "INSERT INTO $wpdb->pmpro_membership_orders
465
- (`code`, `session_id`, `user_id`, `membership_id`, `paypal_token`, `billing_name`, `billing_street`, `billing_city`, `billing_state`, `billing_zip`, `billing_country`, `billing_phone`, `subtotal`, `tax`, `couponamount`, `certificate_id`, `certificateamount`, `total`, `payment_type`, `cardtype`, `accountnumber`, `expirationmonth`, `expirationyear`, `status`, `gateway`, `gateway_environment`, `payment_transaction_id`, `subscription_transaction_id`, `timestamp`, `affiliate_id`, `affiliate_subid`, `notes`)
466
  VALUES('" . $this->code . "',
467
  '" . session_id() . "',
468
- " . intval($this->user_id) . ",
469
- " . intval($this->membership_id) . ",
470
  '" . $this->paypal_token . "',
471
- '" . esc_sql(trim($this->billing->name)) . "',
472
- '" . esc_sql(trim($this->billing->street)) . "',
473
- '" . esc_sql($this->billing->city) . "',
474
- '" . esc_sql($this->billing->state) . "',
475
- '" . esc_sql($this->billing->zip) . "',
476
- '" . esc_sql($this->billing->country) . "',
477
  '" . cleanPhone($this->billing->phone) . "',
478
  '" . $amount . "',
479
  '" . $tax . "',
480
  '" . $this->couponamount. "',
481
- " . intval($this->certificate_id) . ",
482
  '" . $this->certificateamount . "',
483
- '" . $total . "',
484
  '" . $this->payment_type . "',
485
  '" . $this->cardtype . "',
486
  '" . hideCardNumber($this->accountnumber, false) . "',
487
  '" . substr($this->ExpirationDate, 0, 2) . "',
488
  '" . substr($this->ExpirationDate, 2, 4) . "',
489
- '" . esc_sql($this->status) . "',
490
- '" . $this->gateway . "',
491
- '" . $this->gateway_environment . "',
492
- '" . esc_sql($this->payment_transaction_id) . "',
493
- '" . esc_sql($this->subscription_transaction_id) . "',
494
- '" . current_time('mysql') . "',
495
- '" . esc_sql($this->affiliate_id) . "',
496
- '" . esc_sql($this->affiliate_subid) . "',
497
- '" . esc_sql($this->notes) . "'
498
- )";
499
  }
500
-
501
- do_action($before_action, $this);
502
  if($wpdb->query($this->sqlQuery) !== false)
503
- {
504
- if(empty($this->id))
505
- $this->id = $wpdb->insert_id;
506
- do_action($after_action, $this);
507
- return $this->getMemberOrderByID($this->id);
508
- }
509
  else
510
- {
511
  return false;
512
- }
513
  }
514
 
515
  function getRandomCode()
@@ -518,9 +382,8 @@
518
 
519
  while(empty($code))
520
  {
521
- $scramble = md5(AUTH_KEY . current_time('timestamp') . SECURE_AUTH_KEY);
522
  $code = substr($scramble, 0, 10);
523
- $code = apply_filters("pmpro_random_code", $code, $this); //filter
524
  $check = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE code = '$code' LIMIT 1");
525
  if($check || is_numeric($code))
526
  $code = NULL;
@@ -537,7 +400,7 @@
537
  return false;
538
 
539
  $this->status = $newstatus;
540
- $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders SET status = '" . esc_sql($newstatus) . "' WHERE id = '" . $this->id . "' LIMIT 1";
541
  if($wpdb->query($this->sqlQuery) !== false)
542
  return true;
543
  else
@@ -550,7 +413,7 @@
550
  }
551
 
552
  function cancel()
553
- {
554
  //only need to cancel on the gateway if there is a subscription id
555
  if(empty($this->subscription_transaction_id))
556
  {
@@ -559,28 +422,9 @@
559
  return true;
560
  }
561
  else
562
- {
563
  //cancel the gateway subscription first
564
- $result = $this->Gateway->cancel($this);
565
- if($result == false)
566
- {
567
- //there was an error, but cancel the order no matter what
568
- $this->updateStatus("cancelled");
569
-
570
- //we should probably notify the admin
571
- $pmproemail = new PMProEmail();
572
- $pmproemail->template = "subscription_cancel_error";
573
- $pmproemail->data = array("body"=>"<p>" . sprintf(__("There was an error canceling the subscription for user with ID=%s. You will want to check your payment gateway to see if their subscription is still active.", "pmpro"), strval($this->user_id)) . "</p><p>Error: " . $this->error . "</p>");
574
- $pmproemail->data["body"] .= "<p>Associated Order:<br />" . nl2br(var_export($this, true)) . "</p>";
575
- $pmproemail->sendEmail(get_bloginfo("admin_email"));
576
-
577
- return false;
578
- }
579
- else
580
- {
581
- //would have been cancelled by the gateway class
582
- return $result;
583
- }
584
  }
585
  }
586
 
@@ -588,30 +432,5 @@
588
  {
589
  return $this->Gateway->update($this);
590
  }
591
-
592
- function getGatewaySubscriptionStatus()
593
- {
594
- return $this->Gateway->getSubscriptionStatus($this);
595
- }
596
-
597
- function getGatewayTransactionStatus()
598
- {
599
- return $this->Gateway->getTransactionStatus($this);
600
- }
601
-
602
- function deleteMe()
603
- {
604
- if(empty($this->id))
605
- return false;
606
-
607
- global $wpdb;
608
- $this->sqlQuery = "DELETE FROM $wpdb->pmpro_membership_orders WHERE id = '" . $this->id . "' LIMIT 1";
609
- if($wpdb->query($this->sqlQuery) !== false)
610
- {
611
- do_action("pmpro_delete_order", $this->id, $this);
612
- return true;
613
- }
614
- else
615
- return false;
616
- }
617
  }
 
29
  $dbobj = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(timestamp) + " . ($gmt_offset * 3600) . " as timestamp FROM $wpdb->pmpro_membership_orders WHERE id = '$id' LIMIT 1");
30
 
31
  if($dbobj)
32
+ {
33
  $this->id = $dbobj->id;
34
  $this->code = $dbobj->code;
35
  $this->session_id = $dbobj->session_id;
42
  $this->billing->city = $dbobj->billing_city;
43
  $this->billing->state = $dbobj->billing_state;
44
  $this->billing->zip = $dbobj->billing_zip;
 
45
  $this->billing->phone = $dbobj->billing_phone;
46
 
47
  //split up some values
86
  $this->affiliate_id = $dbobj->affiliate_id;
87
  $this->affiliate_subid = $dbobj->affiliate_subid;
88
 
 
 
89
  //reset the gateway
90
+ $this->setGateway();
 
91
 
92
  return $this->id;
93
  }
105
 
106
  //which one to load?
107
  $classname = "PMProGateway"; //default test gateway
108
+ if(!empty($this->gateway))
109
  $classname .= "_" . $this->gateway; //adding the gateway suffix
110
 
111
  //try to load it
112
+ require_once(dirname(__FILE__) . "/gateways/class." . strtolower($classname) . ".php");
113
  if(class_exists($classname))
114
  $this->Gateway = new $classname($this->gateway);
115
  else
116
+ die("Could not locate the gateway class file with class name = " . $classname . ".");
 
 
 
117
 
118
  return $this->Gateway;
119
  }
120
 
121
+ function getLastMemberOrder($user_id = NULL)
122
  {
123
  global $current_user, $wpdb;
124
  if(!$user_id)
127
  if(!$user_id)
128
  return false;
129
 
130
+ $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
  return $this->getMemberOrderByID($id);
133
  }
134
 
 
 
 
135
  function getMemberOrderByCode($code)
136
  {
137
  global $wpdb;
142
  return false;
143
  }
144
 
 
 
 
145
  function getMemberOrderByPaymentTransactionID($payment_transaction_id)
146
  {
 
 
 
 
147
  global $wpdb;
148
+ $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE payment_transaction_id = '" . $wpdb->escape($payment_transaction_id) . "' LIMIT 1");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  if($id)
150
  return $this->getMemberOrderByID($id);
151
  else
155
  function getMemberOrderByPayPalToken($token)
156
  {
157
  global $wpdb;
158
+ $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE paypal_token = '" . $token . "' LIMIT 1");
159
  if($id)
160
  return $this->getMemberOrderByID($id);
161
  else
170
  global $wpdb;
171
  $this->discount_code = $wpdb->get_row("SELECT dc.* FROM $wpdb->pmpro_discount_codes dc LEFT JOIN $wpdb->pmpro_discount_codes_uses dcu ON dc.id = dcu.code_id WHERE dcu.order_id = '" . $this->id . "' LIMIT 1");
172
 
 
 
 
173
  return $this->discount_code;
174
  }
175
 
178
  global $wpdb;
179
 
180
  if(!empty($this->user))
181
+ return $this->invoice->user;
182
 
183
  $gmt_offset = get_option('gmt_offset');
184
  $this->user = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(user_registered) + " . ($gmt_offset * 3600) . " as user_registered FROM $wpdb->users WHERE ID = '" . $this->user_id . "' LIMIT 1");
195
  //check if there is an entry in memberships_users first
196
  if(!empty($this->user_id))
197
  {
198
+ $this->membership_level = $wpdb->get_row("SELECT l.id, l.name, l.description, l.allow_signups, mu.*, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_memberships_users mu ON l.id = mu.membership_id WHERE l.id = '" . $this->membership_id . "' AND mu.user_id = '" . $this->user_id . "' LIMIT 1");
 
 
 
 
199
  }
200
 
201
  //okay, do I have a discount code to check? (if there is no membership_level->membership_id value, that means there was no entry in memberships_users)
202
  if(!empty($this->discount_code) && empty($this->membership_level->membership_id))
203
  {
204
+ $sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id LEFT JOIN $wpdb->pmpro_discount_codes dc ON dc.id = cl.code_id WHERE dc.code = '" . $this->discount_code . "' AND cl.level_id = '" . $this->membership_id . "' LIMIT 1";
 
 
 
 
 
 
205
  $this->membership_level = $wpdb->get_row($sqlQuery);
206
  }
207
 
227
  if($tax_state && $tax_rate)
228
  {
229
  //we have values, is this order in the tax state?
230
+ if(trim(strtoupper($this->billing->state)) == trim(strtoupper($tax_state)))
231
  {
232
  //return value, pass through filter
233
  $tax = round((float)$price * (float)$tax_rate, 2);
261
  return $this->tax;
262
  }
263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  function saveOrder()
265
+ {
266
  global $current_user, $wpdb;
267
 
268
  //get a random code to use for the public ID
269
+ if(!$this->code)
270
  $this->code = $this->getRandomCode();
271
 
272
  //figure out how much we charged
273
  if(!empty($this->InitialPayment))
274
  $amount = $this->InitialPayment;
 
 
275
  else
276
+ $amount = 0;
277
 
278
  //Todo: Tax?!, Coupons, Certificates, affiliates
279
+ $this->subtotal = $amount;
280
+ $tax = $this->getTax(true);
 
 
 
 
281
  $this->certificate_id = "";
282
  $this->certificateamount = "";
283
 
 
 
 
 
 
 
284
  //these fix some warnings/notices
 
 
 
 
 
 
 
285
  if(empty($this->paypal_token))
286
  $this->paypal_token = "";
287
  if(empty($this->couponamount))
288
  $this->couponamount = "";
289
  if(empty($this->payment_type))
290
  $this->payment_type = "";
 
 
291
  if(empty($this->subscription_transaction_id))
292
  $this->subscription_transaction_id = "";
293
  if(empty($this->affiliate_id))
294
  $this->affiliate_id = "";
295
  if(empty($this->affiliate_subid))
296
+ $this->affiliate_subid = "";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
 
298
  //build query
299
  if(!empty($this->id))
300
  {
 
 
 
301
  //update
302
  $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders
303
  SET `code` = '" . $this->code . "',
304
  `session_id` = '" . $this->session_id . "',
305
+ `user_id` = '" . $this->user_id . "',
306
+ `membership_id` = '" . $this->membership_id . "',
307
  `paypal_token` = '" . $this->paypal_token . "',
308
+ `billing_name` = '" . $this->billing->name . "',
309
+ `billing_street` = '" . $this->billing->street . "',
310
+ `billing_city` = '" . $this->billing->city . "',
311
+ `billing_state` = '" . $this->billing->state . "',
312
+ `billing_zip` = '" . $this->billing->zip . "',
313
+ `billing_phone` = '" . $this->billing->phone . "',
 
314
  `subtotal` = '" . $this->subtotal . "',
315
  `tax` = '" . $this->tax . "',
316
  `couponamount` = '" . $this->couponamount . "',
317
+ `certificate_id` = '" . $this->certificate_id . "',
318
  `certificateamount` = '" . $this->certificateamount . "',
319
  `total` = '" . $this->total . "',
320
  `payment_type` = '" . $this->payment_type . "',
322
  `accountnumber` = '" . $this->accountnumber . "',
323
  `expirationmonth` = '" . $this->expirationmonth . "',
324
  `expirationyear` = '" . $this->expirationyear . "',
325
+ `status` = '" . $this->status . "',
326
  `gateway` = '" . $this->gateway . "',
327
  `gateway_environment` = '" . $this->gateway_environment . "',
328
+ `payment_transaction_id` = '" . $this->payment_transaction_id . "',
329
+ `subscription_transaction_id` = '" . $this->subscription_transaction_id . "',
330
+ `affiliate_id` = '" . $this->affiliate_id . "',
331
+ `affiliate_subid` = '" . $this->affiliate_subid . "'
 
332
  WHERE id = '" . $this->id . "'
333
  LIMIT 1";
334
  }
335
  else
336
  {
 
 
 
337
  //insert
338
  $this->sqlQuery = "INSERT INTO $wpdb->pmpro_membership_orders
339
+ (`code`, `session_id`, `user_id`, `membership_id`, `paypal_token`, `billing_name`, `billing_street`, `billing_city`, `billing_state`, `billing_zip`, `billing_phone`, `subtotal`, `tax`, `couponamount`, `certificate_id`, `certificateamount`, `total`, `payment_type`, `cardtype`, `accountnumber`, `expirationmonth`, `expirationyear`, `status`, `gateway`, `gateway_environment`, `payment_transaction_id`, `subscription_transaction_id`, `timestamp`, `affiliate_id`, `affiliate_subid`)
340
  VALUES('" . $this->code . "',
341
  '" . session_id() . "',
342
+ '" . $this->user_id . "',
343
+ '" . $this->membership_id . "',
344
  '" . $this->paypal_token . "',
345
+ '" . $wpdb->escape(trim($this->billing->name)) . "',
346
+ '" . $wpdb->escape(trim($this->billing->street)) . "',
347
+ '" . $wpdb->escape($this->billing->city) . "',
348
+ '" . $wpdb->escape($this->billing->state) . "',
349
+ '" . $wpdb->escape($this->billing->zip) . "',
 
350
  '" . cleanPhone($this->billing->phone) . "',
351
  '" . $amount . "',
352
  '" . $tax . "',
353
  '" . $this->couponamount. "',
354
+ '" . $this->certificate_id . "',
355
  '" . $this->certificateamount . "',
356
+ '" . ((float)$amount + (float)$tax) . "',
357
  '" . $this->payment_type . "',
358
  '" . $this->cardtype . "',
359
  '" . hideCardNumber($this->accountnumber, false) . "',
360
  '" . substr($this->ExpirationDate, 0, 2) . "',
361
  '" . substr($this->ExpirationDate, 2, 4) . "',
362
+ '" . $this->status . "',
363
+ '" . pmpro_getOption("gateway") . "',
364
+ '" . pmpro_getOption("gateway_environment") . "',
365
+ '" . $this->payment_transaction_id . "',
366
+ '" . $this->subscription_transaction_id . "',
367
+ now(),
368
+ '" . $this->affiliate_id . "',
369
+ '" . $this->affiliate_subid . "'
370
+ )";
 
371
  }
372
+
 
373
  if($wpdb->query($this->sqlQuery) !== false)
374
+ return $this->getMemberOrderByID($wpdb->insert_id);
 
 
 
 
 
375
  else
 
376
  return false;
 
377
  }
378
 
379
  function getRandomCode()
382
 
383
  while(empty($code))
384
  {
385
+ $scramble = md5(AUTH_KEY . time() . SECURE_AUTH_KEY);
386
  $code = substr($scramble, 0, 10);
 
387
  $check = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE code = '$code' LIMIT 1");
388
  if($check || is_numeric($code))
389
  $code = NULL;
400
  return false;
401
 
402
  $this->status = $newstatus;
403
+ $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders SET status = '" . $wpdb->escape($newstatus) . "' WHERE id = '" . $this->id . "' LIMIT 1";
404
  if($wpdb->query($this->sqlQuery) !== false)
405
  return true;
406
  else
413
  }
414
 
415
  function cancel()
416
+ {
417
  //only need to cancel on the gateway if there is a subscription id
418
  if(empty($this->subscription_transaction_id))
419
  {
422
  return true;
423
  }
424
  else
425
+ {
426
  //cancel the gateway subscription first
427
+ return $this->Gateway->cancel($this);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
  }
429
  }
430
 
432
  {
433
  return $this->Gateway->update($this);
434
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
435
  }
436
+ ?>
classes/class.pmproemail.php CHANGED
@@ -34,35 +34,17 @@
34
  $this->fromname = pmpro_getOption("from_name");
35
 
36
  if(!$this->subject)
37
- $this->subject = sprintf(__("An Email From %s", "pmpro"), get_option("blogname"));
38
-
39
- //decode the subject line in case there are apostrophes/etc in it
40
- $this->subject = html_entity_decode($this->subject, ENT_QUOTES, 'UTF-8');
41
-
42
  if(!$this->template)
43
  $this->template = "default";
44
-
45
- $this->headers = array("Content-Type: text/html");
46
-
47
- $this->attachments = NULL;
48
-
49
- //load the template
50
- $locale = apply_filters("plugin_locale", get_locale(), "pmpro");
51
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html"))
52
- $this->body = file_get_contents(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html"); //email folder in pmpro folder in theme
53
- elseif(file_exists(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html"))
54
- $this->body = file_get_contents(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html"); //membership- file in pmpro folder in theme
55
- elseif(file_exists(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"))
56
- $this->body = file_get_contents(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"); //membership- file in theme root
57
- elseif(file_exists(WP_LANG_DIR . '/pmpro/email/' . $this->template . ".html"))
58
- $this->body = file_get_contents(WP_LANG_DIR . '/pmpro/email/' . $this->template . ".html"); //email folder in WP language folder
59
- elseif(file_exists(PMPRO_DIR . "/languages/" . $locale . "/" . $this->template . ".html"))
60
- $this->body = file_get_contents(PMPRO_DIR . "/languages/" . $locale . "/" . $this->template . ".html"); //email folder in PMPro language folder
61
- elseif(file_exists(PMPRO_DIR . "/email/" . $this->template . ".html"))
62
- $this->body = file_get_contents(PMPRO_DIR . "/email/" . $this->template . ".html"); //default template in plugin
63
- elseif(!empty($this->data) && !empty($this->data['body']))
64
- $this->body = $this->data['body'];
65
 
 
 
 
 
 
 
66
  //header and footer
67
  /* This is handled for all emails via the pmpro_send_html function in paid-memberships-pro now
68
  if(file_exists(TEMPLATEPATH . "/email_header.html"))
@@ -75,14 +57,9 @@
75
  }
76
  */
77
 
78
- //if data is a string, assume we mean to replace !!body!! with it
79
  if(is_string($this->data))
80
- $this->data = array("body"=>$data);
81
-
82
- //filter for data
83
- $this->data = apply_filters("pmpro_email_data", $this->data, $this); //filter
84
-
85
- //swap data into body
86
  if(is_array($this->data))
87
  {
88
  foreach($this->data as $key => $value)
@@ -92,17 +69,14 @@
92
  }
93
 
94
  //filters
95
- $temail = apply_filters("pmpro_email_filter", $this); //allows filtering entire email at once
96
- $this->email = apply_filters("pmpro_email_recipient", $temail->email, $this);
97
- $this->from = apply_filters("pmpro_email_sender", $temail->from, $this);
98
- $this->fromname = apply_filters("pmpro_email_sender_name", $temail->fromname, $this);
99
- $this->subject = apply_filters("pmpro_email_subject", $temail->subject, $this);
100
- $this->template = apply_filters("pmpro_email_template", $temail->template, $this);
101
- $this->body = apply_filters("pmpro_email_body", $temail->body, $this);
102
- $this->headers = apply_filters("pmpro_email_headers", $temail->headers, $this);
103
- $this->attachments = apply_filters("pmpro_email_attachments", $temail->attachments, $this);
104
-
105
- if(wp_mail($this->email,$this->subject,$this->body,$this->headers,$this->attachments))
106
  {
107
  return true;
108
  }
@@ -122,9 +96,9 @@
122
  return false;
123
 
124
  $this->email = $user->user_email;
125
- $this->subject = sprintf(__("Your membership at %s has been CANCELLED", "pmpro"), get_option("blogname"));
126
  $this->template = "cancel";
127
- $this->data = array("name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"));
128
 
129
  return $this->sendEmail();
130
  }
@@ -144,24 +118,11 @@
144
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
145
 
146
  $this->email = get_bloginfo("admin_email");
147
- $this->subject = sprintf(__("Membership for %s at %s has been CANCELLED", "pmpro"), $user->user_login, get_option("blogname"));
148
  $this->template = "cancel_admin";
149
- $this->data = array("user_login" => $user->user_login, "user_email" => $user->user_email, "display_name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url());
150
- $this->data['membership_id'] = $old_level_id;
151
  $this->data['membership_level_name'] = $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $old_level_id . "' LIMIT 1");
152
 
153
- //start and end date
154
- $startdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(startdate) as startdate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND membership_id = '" . $old_level_id . "' AND status = 'inactive' ORDER BY id DESC");
155
- if(!empty($startdate))
156
- $this->data['startdate'] = date(get_option('date_format'), $startdate);
157
- else
158
- $this->data['startdate'] = "";
159
- $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) as enddate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND membership_id = '" . $old_level_id . "' AND status = 'inactive' ORDER BY id DESC");
160
- if(!empty($enddate))
161
- $this->data['enddate'] = date(get_option('date_format'), $enddate);
162
- else
163
- $this->data['enddate'] = "";
164
-
165
  return $this->sendEmail();
166
  }
167
 
@@ -175,85 +136,61 @@
175
  return false;
176
 
177
  $this->email = $user->user_email;
178
- $this->subject = sprintf(__("Your membership confirmation for %s", "pmpro"), get_option("blogname"));
179
 
180
  $this->data = array(
181
  "subject" => $this->subject,
182
  "name" => $user->display_name,
183
- "user_login" => $user->user_login,
184
  "sitename" => get_option("blogname"),
185
  "siteemail" => pmpro_getOption("from_email"),
186
- "membership_id" => $user->membership_level->id,
187
  "membership_level_name" => $user->membership_level->name,
188
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
189
- "login_link" => wp_login_url(pmpro_url("account")),
190
  "display_name" => $user->display_name,
191
  "user_email" => $user->user_email,0
192
  );
193
-
194
- if(!empty($invoice) && !pmpro_isLevelFree($user->membership_level))
195
  {
196
  if($invoice->gateway == "paypalexpress")
197
  $this->template = "checkout_express";
198
- elseif($invoice->gateway == "check")
199
- {
200
- $this->template = "checkout_check";
201
- $this->data["instructions"] = wpautop(pmpro_getOption("instructions"));
202
- }
203
  elseif(pmpro_isLevelTrial($user->membership_level))
204
  $this->template = "checkout_trial";
205
  else
206
  $this->template = "checkout_paid";
207
  $this->data["invoice_id"] = $invoice->code;
208
  $this->data["invoice_total"] = $pmpro_currency_symbol . number_format($invoice->total, 2);
209
- $this->data["invoice_date"] = date(get_option('date_format'), $invoice->timestamp);
210
  $this->data["billing_name"] = $invoice->billing->name;
211
  $this->data["billing_street"] = $invoice->billing->street;
212
  $this->data["billing_city"] = $invoice->billing->city;
213
  $this->data["billing_state"] = $invoice->billing->state;
214
  $this->data["billing_zip"] = $invoice->billing->zip;
215
- $this->data["billing_country"] = $invoice->billing->country;
216
  $this->data["billing_phone"] = $invoice->billing->phone;
217
  $this->data["cardtype"] = $invoice->cardtype;
218
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
219
  $this->data["expirationmonth"] = $invoice->expirationmonth;
220
  $this->data["expirationyear"] = $invoice->expirationyear;
221
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
222
- $invoice->billing->street,
223
- "", //address 2
224
- $invoice->billing->city,
225
- $invoice->billing->state,
226
- $invoice->billing->zip,
227
- $invoice->billing->country,
228
- $invoice->billing->phone);
229
 
230
  if($invoice->getDiscountCode())
231
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code->code . "</p>\n";
232
  else
233
  $this->data["discount_code"] = "";
234
  }
235
  elseif(pmpro_isLevelFree($user->membership_level))
236
  {
237
  $this->template = "checkout_free";
238
- global $discount_code;
239
- if(!empty($discount_code))
240
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
241
- else
242
- $this->data["discount_code"] = "";
243
  }
244
  else
245
  {
246
  $this->template = "checkout_freetrial";
247
- global $discount_code;
248
- if(!empty($discount_code))
249
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
250
- else
251
- $this->data["discount_code"] = "";
252
  }
253
 
254
- $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
255
  if($enddate)
256
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
257
  else
258
  $this->data["membership_expiration"] = "";
259
 
@@ -275,78 +212,61 @@
275
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
276
 
277
  $this->email = get_bloginfo("admin_email");
278
- $this->subject = sprintf(__("Member Checkout for %s at %s", "pmpro"), $user->membership_level->name, get_option("blogname"));
279
 
280
  $this->data = array(
281
  "subject" => $this->subject,
282
  "name" => $user->display_name,
283
- "user_login" => $user->user_login,
284
  "sitename" => get_option("blogname"),
285
  "siteemail" => pmpro_getOption("from_email"),
286
- "membership_id" => $user->membership_level->id,
287
  "membership_level_name" => $user->membership_level->name,
288
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
289
- "login_link" => wp_login_url(pmpro_url("account")),
290
  "display_name" => $user->display_name,
291
  "user_email" => $user->user_email,0
292
  );
293
 
294
- if(!empty($invoice) && !pmpro_isLevelFree($user->membership_level))
295
  {
296
  if($invoice->gateway == "paypalexpress")
297
- $this->template = "checkout_express_admin";
298
- elseif($invoice->gateway == "check")
299
- $this->template = "checkout_check_admin";
300
  elseif(pmpro_isLevelTrial($user->membership_level))
301
  $this->template = "checkout_trial_admin";
302
  else
303
  $this->template = "checkout_paid_admin";
304
  $this->data["invoice_id"] = $invoice->code;
305
  $this->data["invoice_total"] = $pmpro_currency_symbol . number_format($invoice->total, 2);
306
- $this->data["invoice_date"] = date(get_option('date_format'), $invoice->timestamp);
307
  $this->data["billing_name"] = $invoice->billing->name;
308
  $this->data["billing_street"] = $invoice->billing->street;
309
  $this->data["billing_city"] = $invoice->billing->city;
310
  $this->data["billing_state"] = $invoice->billing->state;
311
  $this->data["billing_zip"] = $invoice->billing->zip;
312
- $this->data["billing_country"] = $invoice->billing->country;
313
  $this->data["billing_phone"] = $invoice->billing->phone;
314
  $this->data["cardtype"] = $invoice->cardtype;
315
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
316
  $this->data["expirationmonth"] = $invoice->expirationmonth;
317
  $this->data["expirationyear"] = $invoice->expirationyear;
318
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
319
- $invoice->billing->street,
320
- "", //address 2
321
- $invoice->billing->city,
322
- $invoice->billing->state,
323
- $invoice->billing->zip,
324
- $invoice->billing->country,
325
- $invoice->billing->phone);
326
 
327
  if($invoice->getDiscountCode())
328
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code->code . "</p>\n";
329
  else
330
  $this->data["discount_code"] = "";
331
  }
332
  elseif(pmpro_isLevelFree($user->membership_level))
333
  {
334
  $this->template = "checkout_free_admin";
335
- global $discount_code;
336
- if(!empty($discount_code))
337
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
338
- else
339
- $this->data["discount_code"] = "";
340
  }
341
  else
342
  {
343
  $this->template = "checkout_freetrial_admin";
344
  $this->data["discount_code"] = "";
345
- }
346
 
347
- $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
348
  if($enddate)
349
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
350
  else
351
  $this->data["membership_expiration"] = "";
352
 
@@ -363,16 +283,13 @@
363
  return false;
364
 
365
  $this->email = $user->user_email;
366
- $this->subject = sprintf(__("Your billing information has been udpated at %s", "pmpro"), get_option("blogname"));
367
  $this->template = "billing";
368
 
369
  $this->data = array(
370
  "subject" => $this->subject,
371
  "name" => $user->display_name,
372
- "user_login" => $user->user_login,
373
  "sitename" => get_option("blogname"),
374
- "siteemail" => pmpro_getOption("from_email"),
375
- "membership_id" => $user->membership_level->id,
376
  "membership_level_name" => $user->membership_level->name,
377
  "display_name" => $user->display_name,
378
  "user_email" => $user->user_email,
@@ -381,22 +298,13 @@
381
  "billing_city" => $invoice->billing->city,
382
  "billing_state" => $invoice->billing->state,
383
  "billing_zip" => $invoice->billing->zip,
384
- "billing_country" => $invoice->billing->country,
385
  "billing_phone" => $invoice->billing->phone,
386
  "cardtype" => $invoice->cardtype,
387
  "accountnumber" => hideCardNumber($invoice->accountnumber),
388
  "expirationmonth" => $invoice->expirationmonth,
389
  "expirationyear" => $invoice->expirationyear,
390
- "login_link" => wp_login_url(pmpro_url("account"))
391
  );
392
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
393
- $invoice->billing->street,
394
- "", //address 2
395
- $invoice->billing->city,
396
- $invoice->billing->state,
397
- $invoice->billing->zip,
398
- $invoice->billing->country,
399
- $invoice->billing->phone);
400
 
401
  return $this->sendEmail();
402
  }
@@ -416,16 +324,13 @@
416
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
417
 
418
  $this->email = get_bloginfo("admin_email");
419
- $this->subject = sprintf(__("Billing information has been udpated for %s at %s", "pmpro"), $user->user_login, get_option("blogname"));
420
  $this->template = "billing_admin";
421
 
422
  $this->data = array(
423
  "subject" => $this->subject,
424
  "name" => $user->display_name,
425
- "user_login" => $user->user_login,
426
  "sitename" => get_option("blogname"),
427
- "siteemail" => pmpro_getOption("from_email"),
428
- "membership_id" => $user->membership_level->id,
429
  "membership_level_name" => $user->membership_level->name,
430
  "display_name" => $user->display_name,
431
  "user_email" => $user->user_email,
@@ -434,7 +339,6 @@
434
  "billing_city" => $invoice->billing->city,
435
  "billing_state" => $invoice->billing->state,
436
  "billing_zip" => $invoice->billing->zip,
437
- "billing_country" => $invoice->billing->country,
438
  "billing_phone" => $invoice->billing->phone,
439
  "cardtype" => $invoice->cardtype,
440
  "accountnumber" => hideCardNumber($invoice->accountnumber),
@@ -442,14 +346,6 @@
442
  "expirationyear" => $invoice->expirationyear,
443
  "login_link" => wp_login_url()
444
  );
445
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
446
- $invoice->billing->street,
447
- "", //address 2
448
- $invoice->billing->city,
449
- $invoice->billing->state,
450
- $invoice->billing->zip,
451
- $invoice->billing->country,
452
- $invoice->billing->phone);
453
 
454
  return $this->sendEmail();
455
  }
@@ -464,16 +360,13 @@
464
  return false;
465
 
466
  $this->email = $user->user_email;
467
- $this->subject = sprintf(__("Membership Payment Failed at %s", "pmpro"), get_option("blogname"));
468
  $this->template = "billing_failure";
469
 
470
  $this->data = array(
471
  "subject" => $this->subject,
472
  "name" => $user->display_name,
473
- "user_login" => $user->user_login,
474
  "sitename" => get_option("blogname"),
475
- "siteemail" => pmpro_getOption("from_email"),
476
- "membership_id" => $user->membership_level->id,
477
  "membership_level_name" => $user->membership_level->name,
478
  "display_name" => $user->display_name,
479
  "user_email" => $user->user_email,
@@ -482,25 +375,16 @@
482
  "billing_city" => $invoice->billing->city,
483
  "billing_state" => $invoice->billing->state,
484
  "billing_zip" => $invoice->billing->zip,
485
- "billing_country" => $invoice->billing->country,
486
  "billing_phone" => $invoice->billing->phone,
487
  "cardtype" => $invoice->cardtype,
488
  "accountnumber" => hideCardNumber($invoice->accountnumber),
489
  "expirationmonth" => $invoice->expirationmonth,
490
  "expirationyear" => $invoice->expirationyear,
491
- "login_link" => wp_login_url(pmpro_url("billing"))
492
  );
493
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
494
- $invoice->billing->street,
495
- "", //address 2
496
- $invoice->billing->city,
497
- $invoice->billing->state,
498
- $invoice->billing->zip,
499
- $invoice->billing->country,
500
- $invoice->billing->phone);
501
 
502
  return $this->sendEmail();
503
- }
504
 
505
  function sendBillingFailureAdminEmail($email, $invoice = NULL)
506
  {
@@ -510,63 +394,13 @@
510
  $user = get_userdata($invoice->user_id);
511
 
512
  $this->email = $email;
513
- $this->subject = sprintf(__("Membership Payment Failed For %s at %s", "pmpro"), $user->display_name, get_option("blogname"));
514
  $this->template = "billing_failure_admin";
515
 
516
  $this->data = array(
517
  "subject" => $this->subject,
518
  "name" => "Admin",
519
- "user_login" => $user->user_login,
520
- "sitename" => get_option("blogname"),
521
- "siteemail" => pmpro_getOption("from_email"),
522
- "membership_id" => $user->membership_level->id,
523
- "membership_level_name" => $user->membership_level->name,
524
- "display_name" => $user->display_name,
525
- "user_email" => $user->user_email,
526
- "billing_name" => $invoice->billing->name,
527
- "billing_street" => $invoice->billing->street,
528
- "billing_city" => $invoice->billing->city,
529
- "billing_state" => $invoice->billing->state,
530
- "billing_zip" => $invoice->billing->zip,
531
- "billing_country" => $invoice->billing->country,
532
- "billing_phone" => $invoice->billing->phone,
533
- "cardtype" => $invoice->cardtype,
534
- "accountnumber" => hideCardNumber($invoice->accountnumber),
535
- "expirationmonth" => $invoice->expirationmonth,
536
- "expirationyear" => $invoice->expirationyear,
537
- "login_link" => wp_login_url(pmpro_url("billing"))
538
- );
539
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
540
- $invoice->billing->street,
541
- "", //address 2
542
- $invoice->billing->city,
543
- $invoice->billing->state,
544
- $invoice->billing->zip,
545
- $invoice->billing->country,
546
- $invoice->billing->phone);
547
- return $this->sendEmail();
548
- }
549
-
550
- function sendCreditCardExpiringEmail($user = NULL, $invoice = NULL)
551
- {
552
- global $current_user;
553
- if(!$user)
554
- $user = $current_user;
555
-
556
- if(!$user || !$invoice)
557
- return false;
558
-
559
- $this->email = $user->user_email;
560
- $this->subject = sprintf(__("Credit Card on File Expiring Soon at %s", "pmpro"), get_option("blogname"));
561
- $this->template = "credit_card_expiring";
562
-
563
- $this->data = array(
564
- "subject" => $this->subject,
565
- "name" => $user->display_name,
566
- "user_login" => $user->user_login,
567
  "sitename" => get_option("blogname"),
568
- "siteemail" => pmpro_getOption("from_email"),
569
- "membership_id" => $user->membership_level->id,
570
  "membership_level_name" => $user->membership_level->name,
571
  "display_name" => $user->display_name,
572
  "user_email" => $user->user_email,
@@ -575,29 +409,20 @@
575
  "billing_city" => $invoice->billing->city,
576
  "billing_state" => $invoice->billing->state,
577
  "billing_zip" => $invoice->billing->zip,
578
- "billing_country" => $invoice->billing->country,
579
  "billing_phone" => $invoice->billing->phone,
580
  "cardtype" => $invoice->cardtype,
581
  "accountnumber" => hideCardNumber($invoice->accountnumber),
582
  "expirationmonth" => $invoice->expirationmonth,
583
  "expirationyear" => $invoice->expirationyear,
584
- "login_link" => wp_login_url(pmpro_url("billing"))
585
  );
586
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
587
- $invoice->billing->street,
588
- "", //address 2
589
- $invoice->billing->city,
590
- $invoice->billing->state,
591
- $invoice->billing->zip,
592
- $invoice->billing->country,
593
- $invoice->billing->phone);
594
 
595
  return $this->sendEmail();
596
  }
597
 
598
  function sendInvoiceEmail($user = NULL, $invoice = NULL)
599
  {
600
- global $wpdb, $current_user, $pmpro_currency_symbol;
601
  if(!$user)
602
  $user = $current_user;
603
 
@@ -605,56 +430,44 @@
605
  return false;
606
 
607
  $this->email = $user->user_email;
608
- $this->subject = sprintf(__("INVOICE for %s membership", "pmpro"), get_option("blogname"));
609
  $this->template = "invoice";
610
 
611
  $this->data = array(
612
  "subject" => $this->subject,
613
  "name" => $user->display_name,
614
- "user_login" => $user->user_login,
615
  "sitename" => get_option("blogname"),
616
- "siteemail" => pmpro_getOption("from_email"),
617
- "membership_id" => $user->membership_level->id,
618
  "membership_level_name" => $user->membership_level->name,
619
  "display_name" => $user->display_name,
620
  "user_email" => $user->user_email,
621
- "invoice_id" => $invoice->code,
622
  "invoice_total" => $pmpro_currency_symbol . number_format($invoice->total, 2),
623
- "invoice_date" => date(get_option('date_format'), $invoice->timestamp),
624
  "billing_name" => $invoice->billing->name,
625
  "billing_street" => $invoice->billing->street,
626
  "billing_city" => $invoice->billing->city,
627
  "billing_state" => $invoice->billing->state,
628
  "billing_zip" => $invoice->billing->zip,
629
- "billing_country" => $invoice->billing->country,
630
  "billing_phone" => $invoice->billing->phone,
631
  "cardtype" => $invoice->cardtype,
632
  "accountnumber" => hideCardNumber($invoice->accountnumber),
633
  "expirationmonth" => $invoice->expirationmonth,
634
  "expirationyear" => $invoice->expirationyear,
635
- "login_link" => wp_login_url(pmpro_url("account")),
636
- "invoice_link" => wp_login_url(pmpro_url("invoice", "?invoice=" . $invoice->code)
637
- ));
638
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
639
- $invoice->billing->street,
640
- "", //address 2
641
- $invoice->billing->city,
642
- $invoice->billing->state,
643
- $invoice->billing->zip,
644
- $invoice->billing->country,
645
- $invoice->billing->phone);
646
 
647
  if($invoice->getDiscountCode())
648
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code . "</p>\n";
649
  else
650
  $this->data["discount_code"] = "";
651
 
652
- $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
653
  if($enddate)
654
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
655
  else
656
  $this->data["membership_expiration"] = "";
657
-
658
  return $this->sendEmail();
659
  }
660
 
@@ -668,24 +481,21 @@
668
  return false;
669
 
670
  //make sure we have the current membership level data
671
- /*$user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name, UNIX_TIMESTAMP(mu.startdate) as startdate, mu.billing_amount, mu.cycle_number, mu.cycle_period, mu.trial_amount, mu.trial_limit
672
  FROM {$wpdb->pmpro_membership_levels} AS l
673
  JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
674
  WHERE mu.user_id = " . $user->ID . "
675
- LIMIT 1");*/
676
- $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
677
 
678
  $this->email = $user->user_email;
679
- $this->subject = sprintf(__("Your trial at %s is ending soon", "pmpro"), get_option("blogname"));
680
  $this->template = "trial_ending";
681
  $this->data = array(
682
  "subject" => $this->subject,
683
  "name" => $user->display_name,
684
- "user_login" => $user->user_login,
685
- "sitename" => get_option("blogname"),
686
- "membership_id" => $user->membership_level->id,
687
  "membership_level_name" => $user->membership_level->name,
688
- "siteemail" => pmpro_getOption("from_email"),
689
  "login_link" => wp_login_url(),
690
  "display_name" => $user->display_name,
691
  "user_email" => $user->user_email,
@@ -694,7 +504,7 @@
694
  "cycle_period" => $user->membership_level->cycle_period,
695
  "trial_amount" => $pmpro_currency_symbol . $user->membership_level->trial_amount,
696
  "trial_limit" => $user->membership_level->trial_limit,
697
- "trial_end" => date(get_option('date_format'), strtotime(date("m/d/Y", $user->membership_level->startdate) . " + " . $user->membership_level->trial_limit . " " . $user->membership_level->cycle_period), current_time("timestamp"))
698
  );
699
 
700
  return $this->sendEmail();
@@ -710,9 +520,9 @@
710
  return false;
711
 
712
  $this->email = $user->user_email;
713
- $this->subject = sprintf(__("Your membership at %s has ended", "pmpro"), get_option("blogname"));
714
  $this->template = "membership_expired";
715
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url(), "display_name" => $user->display_name, "user_email" => $user->user_email, "levels_link" => pmpro_url("levels"));
716
 
717
  return $this->sendEmail();
718
  }
@@ -727,17 +537,16 @@
727
  return false;
728
 
729
  //make sure we have the current membership level data
730
- /*$user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name, UNIX_TIMESTAMP(mu.enddate) as enddate
731
  FROM {$wpdb->pmpro_membership_levels} AS l
732
  JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
733
  WHERE mu.user_id = " . $user->ID . "
734
- LIMIT 1");*/
735
- $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
736
 
737
  $this->email = $user->user_email;
738
- $this->subject = sprintf(__("Your membership at %s will end soon", "pmpro"), get_option("blogname"));
739
  $this->template = "membership_expiring";
740
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_id" => $user->membership_level->id, "membership_level_name" => $user->membership_level->name, "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url(), "enddate" => date(get_option('date_format'), $user->membership_level->enddate), "display_name" => $user->display_name, "user_email" => $user->user_email);
741
 
742
  return $this->sendEmail();
743
  }
@@ -755,21 +564,21 @@
755
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
756
 
757
  $this->email = $user->user_email;
758
- $this->subject = sprintf(__("Your membership at %s has been changed", "pmpro"), get_option("blogname"));
759
  $this->template = "admin_change";
760
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_id" => $user->membership_level->id, "membership_level_name" => $user->membership_level->name, "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url());
761
  if($user->membership_level->ID)
762
- $this->data["membership_change"] = sprintf(__("The new level is %s.", "pmpro"), $user->membership_level->name);
763
  else
764
- $this->data["membership_change"] = __("Your membership has been cancelled", "pmpro");
765
 
766
  if(!empty($user->membership_level->enddate))
767
  {
768
- $this->data["membership_change"] .= ". " . sprintf(__("This membership will expire on %s", "pmpro"), date(get_option('date_format'), $user->membership_level->enddate));
769
  }
770
  elseif(!empty($this->expiration_changed))
771
  {
772
- $this->data["membership_change"] .= ". " . __("This membership does not expire", "pmpro");
773
  }
774
 
775
  return $this->sendEmail();
@@ -793,23 +602,24 @@
793
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
794
 
795
  $this->email = get_bloginfo("admin_email");
796
- $this->subject = sprintf(__("Membership for %s at %s has been changed", "pmpro"), $user->user_login, get_option("blogname"));
797
  $this->template = "admin_change_admin";
798
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
799
  if($user->membership_level->ID)
800
- $this->data["membership_change"] = sprintf(__("The new level is %s. This membership is free", "pmpro"), $user->membership_level->name);
801
  else
802
- $this->data["membership_change"] = __("Membership has been cancelled", "pmpro");
803
 
804
  if(!empty($user->membership_level->enddate))
805
  {
806
- $this->data["membership_change"] .= ". " . sprintf(__("This membership will expire on %s", "pmpro"), date(get_option('date_format'), $user->membership_level->enddate));
807
  }
808
  elseif(!empty($this->expiration_changed))
809
  {
810
- $this->data["membership_change"] .= ". " . __("This membership does not expire", "pmpro");
811
  }
812
 
813
  return $this->sendEmail();
814
  }
815
  }
 
34
  $this->fromname = pmpro_getOption("from_name");
35
 
36
  if(!$this->subject)
37
+ $this->subject = "An Email From " . get_option("blogname");
38
+
 
 
 
39
  if(!$this->template)
40
  $this->template = "default";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ //load the template
43
+ if(file_exists(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"))
44
+ $this->body = file_get_contents(TEMPLATEPATH . "/membership-email-" . $this->template . ".html");
45
+ else
46
+ $this->body = file_get_contents(ABSPATH . "/wp-content/plugins/paid-memberships-pro/email/" . $this->template . ".html");
47
+
48
  //header and footer
49
  /* This is handled for all emails via the pmpro_send_html function in paid-memberships-pro now
50
  if(file_exists(TEMPLATEPATH . "/email_header.html"))
57
  }
58
  */
59
 
60
+ //swap data
61
  if(is_string($this->data))
62
+ $data = array("body"=>$data);
 
 
 
 
 
63
  if(is_array($this->data))
64
  {
65
  foreach($this->data as $key => $value)
69
  }
70
 
71
  //filters
72
+ $this->email = apply_filters("pmpro_email_recipient", $this->email, $this);
73
+ $this->from = apply_filters("pmpro_email_sender", $this->from, $this);
74
+ $this->fromname = apply_filters("pmpro_email_sender_name", $this->fromname, $this);
75
+ $this->subject = apply_filters("pmpro_email_subject", $this->subject, $this);
76
+ $this->template = apply_filters("pmpro_email_template", $this->template, $this);
77
+ $this->body = apply_filters("pmpro_email_body", $this->body, $this);
78
+
79
+ if(wp_mail($this->email,$this->subject,$this->body,array("Content-Type: text/html")))
 
 
 
80
  {
81
  return true;
82
  }
96
  return false;
97
 
98
  $this->email = $user->user_email;
99
+ $this->subject = "Your membership at " . get_option("blogname") . " has been CANCELED";
100
  $this->template = "cancel";
101
+ $this->data = array("name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"));
102
 
103
  return $this->sendEmail();
104
  }
118
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
119
 
120
  $this->email = get_bloginfo("admin_email");
121
+ $this->subject = "Membership for " . $user->user_login . " at " . get_option("blogname") . " has been CANCELED";
122
  $this->template = "cancel_admin";
123
+ $this->data = array("user_login" => $user->user_login, "user_email" => $user->user_email, "display_name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"));
 
124
  $this->data['membership_level_name'] = $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $old_level_id . "' LIMIT 1");
125
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  return $this->sendEmail();
127
  }
128
 
136
  return false;
137
 
138
  $this->email = $user->user_email;
139
+ $this->subject = "Your membership confirmation for " . get_option("blogname");
140
 
141
  $this->data = array(
142
  "subject" => $this->subject,
143
  "name" => $user->display_name,
 
144
  "sitename" => get_option("blogname"),
145
  "siteemail" => pmpro_getOption("from_email"),
 
146
  "membership_level_name" => $user->membership_level->name,
147
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
148
+ "login_link" => pmpro_url("account"),
149
  "display_name" => $user->display_name,
150
  "user_email" => $user->user_email,0
151
  );
152
+
153
+ if($invoice)
154
  {
155
  if($invoice->gateway == "paypalexpress")
156
  $this->template = "checkout_express";
 
 
 
 
 
157
  elseif(pmpro_isLevelTrial($user->membership_level))
158
  $this->template = "checkout_trial";
159
  else
160
  $this->template = "checkout_paid";
161
  $this->data["invoice_id"] = $invoice->code;
162
  $this->data["invoice_total"] = $pmpro_currency_symbol . number_format($invoice->total, 2);
163
+ $this->data["invoice_date"] = date("F j, Y", $invoice->timestamp);
164
  $this->data["billing_name"] = $invoice->billing->name;
165
  $this->data["billing_street"] = $invoice->billing->street;
166
  $this->data["billing_city"] = $invoice->billing->city;
167
  $this->data["billing_state"] = $invoice->billing->state;
168
  $this->data["billing_zip"] = $invoice->billing->zip;
 
169
  $this->data["billing_phone"] = $invoice->billing->phone;
170
  $this->data["cardtype"] = $invoice->cardtype;
171
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
172
  $this->data["expirationmonth"] = $invoice->expirationmonth;
173
  $this->data["expirationyear"] = $invoice->expirationyear;
 
 
 
 
 
 
 
 
174
 
175
  if($invoice->getDiscountCode())
176
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code->code . "</p>\n";
177
  else
178
  $this->data["discount_code"] = "";
179
  }
180
  elseif(pmpro_isLevelFree($user->membership_level))
181
  {
182
  $this->template = "checkout_free";
183
+ $this->data["discount_code"] = "";
 
 
 
 
184
  }
185
  else
186
  {
187
  $this->template = "checkout_freetrial";
188
+ $this->data["discount_code"] = "";
 
 
 
 
189
  }
190
 
191
+ $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' LIMIT 1");
192
  if($enddate)
193
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date("n/j/Y", $enddate) . ".</p>\n";
194
  else
195
  $this->data["membership_expiration"] = "";
196
 
212
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
213
 
214
  $this->email = get_bloginfo("admin_email");
215
+ $this->subject = "Member Checkout for " . $user->membership_level->name . " at " . get_option("blogname");
216
 
217
  $this->data = array(
218
  "subject" => $this->subject,
219
  "name" => $user->display_name,
 
220
  "sitename" => get_option("blogname"),
221
  "siteemail" => pmpro_getOption("from_email"),
 
222
  "membership_level_name" => $user->membership_level->name,
223
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
224
+ "login_link" => pmpro_url("account"),
225
  "display_name" => $user->display_name,
226
  "user_email" => $user->user_email,0
227
  );
228
 
229
+ if($invoice)
230
  {
231
  if($invoice->gateway == "paypalexpress")
232
+ $this->template = "checkout_express";
 
 
233
  elseif(pmpro_isLevelTrial($user->membership_level))
234
  $this->template = "checkout_trial_admin";
235
  else
236
  $this->template = "checkout_paid_admin";
237
  $this->data["invoice_id"] = $invoice->code;
238
  $this->data["invoice_total"] = $pmpro_currency_symbol . number_format($invoice->total, 2);
239
+ $this->data["invoice_date"] = date("F j, Y", $invoice->timestamp);
240
  $this->data["billing_name"] = $invoice->billing->name;
241
  $this->data["billing_street"] = $invoice->billing->street;
242
  $this->data["billing_city"] = $invoice->billing->city;
243
  $this->data["billing_state"] = $invoice->billing->state;
244
  $this->data["billing_zip"] = $invoice->billing->zip;
 
245
  $this->data["billing_phone"] = $invoice->billing->phone;
246
  $this->data["cardtype"] = $invoice->cardtype;
247
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
248
  $this->data["expirationmonth"] = $invoice->expirationmonth;
249
  $this->data["expirationyear"] = $invoice->expirationyear;
 
 
 
 
 
 
 
 
250
 
251
  if($invoice->getDiscountCode())
252
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code->code . "</p>\n";
253
  else
254
  $this->data["discount_code"] = "";
255
  }
256
  elseif(pmpro_isLevelFree($user->membership_level))
257
  {
258
  $this->template = "checkout_free_admin";
259
+ $this->data["discount_code"] = "";
 
 
 
 
260
  }
261
  else
262
  {
263
  $this->template = "checkout_freetrial_admin";
264
  $this->data["discount_code"] = "";
265
+ }
266
 
267
+ $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' LIMIT 1");
268
  if($enddate)
269
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date("n/j/Y", $enddate) . ".</p>\n";
270
  else
271
  $this->data["membership_expiration"] = "";
272
 
283
  return false;
284
 
285
  $this->email = $user->user_email;
286
+ $this->subject = "Your billing information has been udpated at " . get_option("blogname");
287
  $this->template = "billing";
288
 
289
  $this->data = array(
290
  "subject" => $this->subject,
291
  "name" => $user->display_name,
 
292
  "sitename" => get_option("blogname"),
 
 
293
  "membership_level_name" => $user->membership_level->name,
294
  "display_name" => $user->display_name,
295
  "user_email" => $user->user_email,
298
  "billing_city" => $invoice->billing->city,
299
  "billing_state" => $invoice->billing->state,
300
  "billing_zip" => $invoice->billing->zip,
 
301
  "billing_phone" => $invoice->billing->phone,
302
  "cardtype" => $invoice->cardtype,
303
  "accountnumber" => hideCardNumber($invoice->accountnumber),
304
  "expirationmonth" => $invoice->expirationmonth,
305
  "expirationyear" => $invoice->expirationyear,
306
+ "login_link" => pmpro_url("account")
307
  );
 
 
 
 
 
 
 
 
308
 
309
  return $this->sendEmail();
310
  }
324
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
325
 
326
  $this->email = get_bloginfo("admin_email");
327
+ $this->subject = "Billing information has been udpated for " . $user->user_login . " at " . get_option("blogname");
328
  $this->template = "billing_admin";
329
 
330
  $this->data = array(
331
  "subject" => $this->subject,
332
  "name" => $user->display_name,
 
333
  "sitename" => get_option("blogname"),
 
 
334
  "membership_level_name" => $user->membership_level->name,
335
  "display_name" => $user->display_name,
336
  "user_email" => $user->user_email,
339
  "billing_city" => $invoice->billing->city,
340
  "billing_state" => $invoice->billing->state,
341
  "billing_zip" => $invoice->billing->zip,
 
342
  "billing_phone" => $invoice->billing->phone,
343
  "cardtype" => $invoice->cardtype,
344
  "accountnumber" => hideCardNumber($invoice->accountnumber),
346
  "expirationyear" => $invoice->expirationyear,
347
  "login_link" => wp_login_url()
348
  );
 
 
 
 
 
 
 
 
349
 
350
  return $this->sendEmail();
351
  }
360
  return false;
361
 
362
  $this->email = $user->user_email;
363
+ $this->subject = "Membership Payment Failed at " . get_option("blogname");
364
  $this->template = "billing_failure";
365
 
366
  $this->data = array(
367
  "subject" => $this->subject,
368
  "name" => $user->display_name,
 
369
  "sitename" => get_option("blogname"),
 
 
370
  "membership_level_name" => $user->membership_level->name,
371
  "display_name" => $user->display_name,
372
  "user_email" => $user->user_email,
375
  "billing_city" => $invoice->billing->city,
376
  "billing_state" => $invoice->billing->state,
377
  "billing_zip" => $invoice->billing->zip,
 
378
  "billing_phone" => $invoice->billing->phone,
379
  "cardtype" => $invoice->cardtype,
380
  "accountnumber" => hideCardNumber($invoice->accountnumber),
381
  "expirationmonth" => $invoice->expirationmonth,
382
  "expirationyear" => $invoice->expirationyear,
383
+ "login_link" => pmpro_url("billing")
384
  );
 
 
 
 
 
 
 
 
385
 
386
  return $this->sendEmail();
387
+ }
388
 
389
  function sendBillingFailureAdminEmail($email, $invoice = NULL)
390
  {
394
  $user = get_userdata($invoice->user_id);
395
 
396
  $this->email = $email;
397
+ $this->subject = "Membership Payment Failed For " . $user->display_name . " at " . get_option("blogname");
398
  $this->template = "billing_failure_admin";
399
 
400
  $this->data = array(
401
  "subject" => $this->subject,
402
  "name" => "Admin",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  "sitename" => get_option("blogname"),
 
 
404
  "membership_level_name" => $user->membership_level->name,
405
  "display_name" => $user->display_name,
406
  "user_email" => $user->user_email,
409
  "billing_city" => $invoice->billing->city,
410
  "billing_state" => $invoice->billing->state,
411
  "billing_zip" => $invoice->billing->zip,
 
412
  "billing_phone" => $invoice->billing->phone,
413
  "cardtype" => $invoice->cardtype,
414
  "accountnumber" => hideCardNumber($invoice->accountnumber),
415
  "expirationmonth" => $invoice->expirationmonth,
416
  "expirationyear" => $invoice->expirationyear,
417
+ "login_link" => pmpro_url("billing")
418
  );
 
 
 
 
 
 
 
 
419
 
420
  return $this->sendEmail();
421
  }
422
 
423
  function sendInvoiceEmail($user = NULL, $invoice = NULL)
424
  {
425
+ global $current_user, $pmpro_currency_symbol;
426
  if(!$user)
427
  $user = $current_user;
428
 
430
  return false;
431
 
432
  $this->email = $user->user_email;
433
+ $this->subject = "INVOICE for " . get_option("blogname") . " membership";
434
  $this->template = "invoice";
435
 
436
  $this->data = array(
437
  "subject" => $this->subject,
438
  "name" => $user->display_name,
 
439
  "sitename" => get_option("blogname"),
 
 
440
  "membership_level_name" => $user->membership_level->name,
441
  "display_name" => $user->display_name,
442
  "user_email" => $user->user_email,
443
+ "invoice_id" => $invoice->payment_transaction_id,
444
  "invoice_total" => $pmpro_currency_symbol . number_format($invoice->total, 2),
445
+ "invoice_date" => date("F j, Y", $invoice->timestamp),
446
  "billing_name" => $invoice->billing->name,
447
  "billing_street" => $invoice->billing->street,
448
  "billing_city" => $invoice->billing->city,
449
  "billing_state" => $invoice->billing->state,
450
  "billing_zip" => $invoice->billing->zip,
 
451
  "billing_phone" => $invoice->billing->phone,
452
  "cardtype" => $invoice->cardtype,
453
  "accountnumber" => hideCardNumber($invoice->accountnumber),
454
  "expirationmonth" => $invoice->expirationmonth,
455
  "expirationyear" => $invoice->expirationyear,
456
+ "login_link" => pmpro_url("account"),
457
+ "invoice_link" => pmpro_url("invoice", "?invoice=" . $invoice->code)
458
+ );
 
 
 
 
 
 
 
 
459
 
460
  if($invoice->getDiscountCode())
461
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code . "</p>\n";
462
  else
463
  $this->data["discount_code"] = "";
464
 
465
+ $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' LIMIT 1");
466
  if($enddate)
467
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date("n/j/Y", $enddate) . ".</p>\n";
468
  else
469
  $this->data["membership_expiration"] = "";
470
+
471
  return $this->sendEmail();
472
  }
473
 
481
  return false;
482
 
483
  //make sure we have the current membership level data
484
+ $user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name, UNIX_TIMESTAMP(mu.startdate) as startdate, mu.billing_amount, mu.cycle_number, mu.cycle_period, mu.trial_amount, mu.trial_limit
485
  FROM {$wpdb->pmpro_membership_levels} AS l
486
  JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
487
  WHERE mu.user_id = " . $user->ID . "
488
+ LIMIT 1");
 
489
 
490
  $this->email = $user->user_email;
491
+ $this->subject = "Your trial membership at " . get_option("blogname") . " is ending soon";
492
  $this->template = "trial_ending";
493
  $this->data = array(
494
  "subject" => $this->subject,
495
  "name" => $user->display_name,
496
+ "sitename" => get_option("blogname"),
 
 
497
  "membership_level_name" => $user->membership_level->name,
498
+ "siteemail" => get_bloginfo("admin_email"),
499
  "login_link" => wp_login_url(),
500
  "display_name" => $user->display_name,
501
  "user_email" => $user->user_email,
504
  "cycle_period" => $user->membership_level->cycle_period,
505
  "trial_amount" => $pmpro_currency_symbol . $user->membership_level->trial_amount,
506
  "trial_limit" => $user->membership_level->trial_limit,
507
+ "trial_end" => date("n/j/Y", strtotime(date("m/d/Y", $user->membership_level->startdate) . " + " . $user->membership_level->trial_limit . " " . $user->membership_level->cycle_period))
508
  );
509
 
510
  return $this->sendEmail();
520
  return false;
521
 
522
  $this->email = $user->user_email;
523
+ $this->subject = "Your membership at " . get_option("blogname") . " has ended";
524
  $this->template = "membership_expired";
525
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url(), "display_name" => $user->display_name, "user_email" => $user->user_email, "levels_link" => pmpro_url("levels"));
526
 
527
  return $this->sendEmail();
528
  }
537
  return false;
538
 
539
  //make sure we have the current membership level data
540
+ $user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name, UNIX_TIMESTAMP(mu.enddate) as enddate
541
  FROM {$wpdb->pmpro_membership_levels} AS l
542
  JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
543
  WHERE mu.user_id = " . $user->ID . "
544
+ LIMIT 1");
 
545
 
546
  $this->email = $user->user_email;
547
+ $this->subject = "Your membership at " . get_option("blogname") . " will end soon";
548
  $this->template = "membership_expiring";
549
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url(), "enddate" => date("n/j/Y", $user->membership_level->enddate), "display_name" => $user->display_name, "user_email" => $user->user_email);
550
 
551
  return $this->sendEmail();
552
  }
564
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
565
 
566
  $this->email = $user->user_email;
567
+ $this->subject = "Your membership at " . get_option("blogname") . " has been changed";
568
  $this->template = "admin_change";
569
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
570
  if($user->membership_level->ID)
571
+ $this->data["membership_change"] = "new level is " . $user->membership_level->name . ". This membership is free";
572
  else
573
+ $this->data["membership_change"] = "membership has been canceled";
574
 
575
  if(!empty($user->membership_level->enddate))
576
  {
577
+ $this->data["membership_change"] .= ". Your membership will expire on " . date("m/d/Y", $user->membership_level->enddate);
578
  }
579
  elseif(!empty($this->expiration_changed))
580
  {
581
+ $this->data["membership_change"] .= ". Your membership does not expire";
582
  }
583
 
584
  return $this->sendEmail();
602
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
603
 
604
  $this->email = get_bloginfo("admin_email");
605
+ $this->subject = "Membership for " . $user->user_login . " at " . get_option("blogname") . " has been changed";
606
  $this->template = "admin_change_admin";
607
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
608
  if($user->membership_level->ID)
609
+ $this->data["membership_change"] = "The new level is " . $user->membership_level->name . ". This membership is free";
610
  else
611
+ $this->data["membership_change"] = "membership has been canceled";
612
 
613
  if(!empty($user->membership_level->enddate))
614
  {
615
+ $this->data["membership_change"] .= ". This membership will expire on " . date("m/d/Y", $user->membership_level->enddate);
616
  }
617
  elseif(!empty($this->expiration_changed))
618
  {
619
+ $this->data["membership_change"] .= ". This membership does not expire";
620
  }
621
 
622
  return $this->sendEmail();
623
  }
624
  }
625
+ ?>
classes/gateways/class.pmprogateway.php CHANGED
@@ -43,7 +43,7 @@
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -52,7 +52,7 @@
52
  else
53
  {
54
  if(empty($order->error))
55
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
56
  return false;
57
  }
58
  }
@@ -90,7 +90,7 @@
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -103,14 +103,14 @@
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
- $order->error = __("Unknown error: Payment failed.", "pmpro");
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
 
113
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
114
  }
115
 
116
  return false;
@@ -126,7 +126,7 @@
126
  else
127
  {
128
  if(empty($order->error))
129
- $order->error = __("Unknown error: Payment failed.", "pmpro");
130
 
131
  return false;
132
  }
@@ -165,7 +165,7 @@
165
 
166
  //simulate a successful charge
167
  $order->payment_transaction_id = "TEST" . $order->code;
168
- $order->updateStatus("success");
169
  return true;
170
  }
171
 
@@ -174,9 +174,6 @@
174
  //create a code for the order
175
  if(empty($order->code))
176
  $order->code = $order->getRandomCode();
177
-
178
- //filter order before subscription. use with care.
179
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
180
 
181
  //simulate a successful subscription processing
182
  $order->status = "success";
@@ -200,21 +197,5 @@
200
  $order->updateStatus("cancelled");
201
  return true;
202
  }
203
-
204
- function getSubscriptionStatus(&$order)
205
- {
206
- //require a subscription id
207
- if(empty($order->subscription_transaction_id))
208
- return false;
209
-
210
- //this looks different for each gateway, but generally an array of some sort
211
- return array();
212
- }
213
-
214
- function getTransactionStatus(&$order)
215
- {
216
- //this looks different for each gateway, but generally an array of some sort
217
- return array();
218
- }
219
  }
220
  ?>
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
  else
53
  {
54
  if(empty($order->error))
55
+ $order->error = "Unknown error: Authorization failed.";
56
  return false;
57
  }
58
  }
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod)) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
+ $order->error = "Unknown error: Payment failed.";
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
+ $order->error = "Unknown error: Payment failed.";
112
 
113
+ $order->error .= " A partial payment was made that we could not void. Please contact the site owner immediately to correct this.";
114
  }
115
 
116
  return false;
126
  else
127
  {
128
  if(empty($order->error))
129
+ $order->error = "Unknown error: Payment failed.";
130
 
131
  return false;
132
  }
165
 
166
  //simulate a successful charge
167
  $order->payment_transaction_id = "TEST" . $order->code;
168
+ $order->updateStatus("firstpayment");
169
  return true;
170
  }
171
 
174
  //create a code for the order
175
  if(empty($order->code))
176
  $order->code = $order->getRandomCode();
 
 
 
177
 
178
  //simulate a successful subscription processing
179
  $order->status = "success";
197
  $order->updateStatus("cancelled");
198
  return true;
199
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  }
201
  ?>
classes/gateways/class.pmprogateway_authorizenet.php CHANGED
@@ -27,7 +27,7 @@
27
  $order->TrialAmount = 0;
28
 
29
  //add a billing cycle to make up for the trial, if applicable
30
- if(!empty($order->TotalBillingCycles))
31
  $order->TotalBillingCycles++;
32
  }
33
  elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
@@ -37,13 +37,13 @@
37
  $order->TrialBillingCycles++;
38
 
39
  //add a billing cycle to make up for the trial, if applicable
40
- if(!empty($order->TotalBillingCycles))
41
  $order->TotalBillingCycles++;
42
  }
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -52,7 +52,7 @@
52
  else
53
  {
54
  if(empty($order->error))
55
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
56
  return false;
57
  }
58
  }
@@ -84,13 +84,13 @@
84
  $order->TrialBillingCycles++;
85
 
86
  //add a billing cycle to make up for the trial, if applicable
87
- if(!empty($order->TotalBillingCycles))
88
  $order->TotalBillingCycles++;
89
  }
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -103,13 +103,14 @@
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
- $order->error = __("Unknown error: Payment failed.", "pmpro");
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
 
113
  }
114
 
115
  return false;
@@ -125,7 +126,7 @@
125
  else
126
  {
127
  if(empty($order->error))
128
- $order->error = __("Unknown error: Payment failed.", "pmpro");
129
 
130
  return false;
131
  }
@@ -149,14 +150,12 @@
149
  $path = "/gateway/transact.dll";
150
  $post_url = "https://" . $host . $path;
151
 
152
- $post_url = apply_filters("pmpro_authorizenet_post_url", $post_url, $gateway_environment);
153
-
154
  //what amount to authorize? just $1 to test
155
  $amount = "1.00";
156
 
157
  //combine address
158
  $address = $order->Address1;
159
- if(!empty($order->Address2))
160
  $address .= "\n" . $order->Address2;
161
 
162
  //customer stuff
@@ -184,7 +183,7 @@
184
  "x_exp_date" => $order->ExpirationDate,
185
 
186
  "x_amount" => $amount,
187
- "x_description" => $order->membership_level->name . " " . __("Membership", "pmpro"),
188
 
189
  "x_first_name" => $order->FirstName,
190
  "x_last_name" => $order->LastName,
@@ -257,9 +256,7 @@
257
 
258
  $path = "/gateway/transact.dll";
259
  $post_url = "https://" . $host . $path;
260
-
261
- $post_url = apply_filters("pmpro_authorizenet_post_url", $post_url, $gateway_environment);
262
-
263
  $post_values = array(
264
 
265
  // the API Login ID and Transaction Key must be replaced with valid values
@@ -330,8 +327,6 @@
330
  $path = "/gateway/transact.dll";
331
  $post_url = "https://" . $host . $path;
332
 
333
- $post_url = apply_filters("pmpro_authorizenet_post_url", $post_url, $gateway_environment);
334
-
335
  //what amount to charge?
336
  $amount = $order->InitialPayment;
337
 
@@ -342,7 +337,7 @@
342
 
343
  //combine address
344
  $address = $order->Address1;
345
- if(!empty($order->Address2))
346
  $address .= "\n" . $order->Address2;
347
 
348
  //customer stuff
@@ -408,13 +403,13 @@
408
  // additional options may be required depending upon your server configuration
409
  // you can find documentation on curl options at http://www.php.net/curl_setopt
410
  curl_close ($request); // close curl object
411
-
412
  // This line takes the response and breaks it into an array using the specified delimiting character
413
  $response_array = explode($post_values["x_delim_char"],$post_response);
414
  if($response_array[0] == 1)
415
  {
416
  $order->payment_transaction_id = $response_array[6];
417
- $order->updateStatus("success");
418
  return true;
419
  }
420
  else
@@ -434,9 +429,6 @@
434
  if(empty($order->code))
435
  $order->code = $order->getRandomCode();
436
 
437
- //filter order before subscription. use with care.
438
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
439
-
440
  if(!empty($order->gateway_environment))
441
  $gateway_environment = $order->gateway_environment;
442
  if(empty($gateway_environment))
@@ -490,7 +482,8 @@
490
  //taxes
491
  $amount_tax = $order->getTaxForPrice($amount);
492
  $trial_tax = $order->getTaxForPrice($trialAmount);
493
-
 
494
  $amount = round((float)$amount + (float)$amount_tax, 2);
495
  $trialAmount = round((float)$trialAmount + (float)$trial_tax, 2);
496
 
@@ -511,7 +504,7 @@
511
 
512
  //do address stuff then?
513
  $address = $order->Address1;
514
- if(!empty($order->Address2))
515
  $address .= "\n" . $order->Address2;
516
  $city = $order->billing->city;
517
  $state = $order->billing->state;
@@ -548,13 +541,13 @@
548
  "</interval>".
549
  "<startDate>" . $startDate . "</startDate>".
550
  "<totalOccurrences>". $totalOccurrences . "</totalOccurrences>";
551
- if(!empty($trialOccurrences))
552
  $this->content .=
553
  "<trialOccurrences>". $trialOccurrences . "</trialOccurrences>";
554
  $this->content .=
555
  "</paymentSchedule>".
556
  "<amount>". $amount ."</amount>";
557
- if(!empty($trialOccurrences))
558
  $this->content .=
559
  "<trialAmount>" . $trialAmount . "</trialAmount>";
560
  $this->content .=
@@ -591,7 +584,7 @@
591
  $response = send_request_via_fsockopen($host,$path,$content);
592
  */
593
 
594
- if(!empty($this->response)) {
595
  list ($refId, $resultCode, $code, $text, $subscriptionId) = $this->parse_return($this->response);
596
  if($resultCode == "Ok")
597
  {
@@ -644,7 +637,7 @@
644
 
645
  //do address stuff then?
646
  $address = $order->Address1;
647
- if(!empty($order->Address2))
648
  $address .= "\n" . $order->Address2;
649
  $city = $order->billing->city;
650
  $state = $order->billing->state;
@@ -701,7 +694,7 @@
701
  */
702
 
703
 
704
- if(!empty($this->response)) {
705
  list ($resultCode, $code, $text, $subscriptionId) = $this->parse_return($this->response);
706
 
707
  if($resultCode == "Ok" || $code == "Ok")
@@ -784,8 +777,8 @@
784
  else
785
  {
786
  $order->status = "error";
787
- $order->error = __("Could not connect to Authorize.net", "pmpro");
788
- $order->shorterror = __("Could not connect to Authorize.net", "pmpro");
789
  return false;
790
  }
791
  }
@@ -827,7 +820,6 @@
827
  function send_request_via_curl($host,$path,$content)
828
  {
829
  $posturl = "https://" . $host . $path;
830
- $posturl = apply_filters("pmpro_authorizenet_post_url", $posturl, pmpro_getOption("gateway_environment"));
831
  $ch = curl_init();
832
  curl_setopt($ch, CURLOPT_URL, $posturl);
833
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
27
  $order->TrialAmount = 0;
28
 
29
  //add a billing cycle to make up for the trial, if applicable
30
+ if($order->TotalBillingCycles)
31
  $order->TotalBillingCycles++;
32
  }
33
  elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
37
  $order->TrialBillingCycles++;
38
 
39
  //add a billing cycle to make up for the trial, if applicable
40
+ if($order->TotalBillingCycles)
41
  $order->TotalBillingCycles++;
42
  }
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
  else
53
  {
54
  if(empty($order->error))
55
+ $order->error = "Unknown error: Authorization failed.";
56
  return false;
57
  }
58
  }
84
  $order->TrialBillingCycles++;
85
 
86
  //add a billing cycle to make up for the trial, if applicable
87
+ if($order->TotalBillingCycles)
88
  $order->TotalBillingCycles++;
89
  }
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
+ $order->error = "Unknown error: Payment failed.";
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
+ $order->error = "Unknown error: Payment failed.";
112
+
113
+ $order->error .= " A partial payment was made that we could not void. Please contact the site owner immediately to correct this.";
114
  }
115
 
116
  return false;
126
  else
127
  {
128
  if(empty($order->error))
129
+ $order->error = "Unknown error: Payment failed.";
130
 
131
  return false;
132
  }
150
  $path = "/gateway/transact.dll";
151
  $post_url = "https://" . $host . $path;
152
 
 
 
153
  //what amount to authorize? just $1 to test
154
  $amount = "1.00";
155
 
156
  //combine address
157
  $address = $order->Address1;
158
+ if($order->Address2)
159
  $address .= "\n" . $order->Address2;
160
 
161
  //customer stuff
183
  "x_exp_date" => $order->ExpirationDate,
184
 
185
  "x_amount" => $amount,
186
+ "x_description" => $order->membership_level->name . " Membership",
187
 
188
  "x_first_name" => $order->FirstName,
189
  "x_last_name" => $order->LastName,
256
 
257
  $path = "/gateway/transact.dll";
258
  $post_url = "https://" . $host . $path;
259
+
 
 
260
  $post_values = array(
261
 
262
  // the API Login ID and Transaction Key must be replaced with valid values
327
  $path = "/gateway/transact.dll";
328
  $post_url = "https://" . $host . $path;
329
 
 
 
330
  //what amount to charge?
331
  $amount = $order->InitialPayment;
332
 
337
 
338
  //combine address
339
  $address = $order->Address1;
340
+ if($order->Address2)
341
  $address .= "\n" . $order->Address2;
342
 
343
  //customer stuff
403
  // additional options may be required depending upon your server configuration
404
  // you can find documentation on curl options at http://www.php.net/curl_setopt
405
  curl_close ($request); // close curl object
406
+
407
  // This line takes the response and breaks it into an array using the specified delimiting character
408
  $response_array = explode($post_values["x_delim_char"],$post_response);
409
  if($response_array[0] == 1)
410
  {
411
  $order->payment_transaction_id = $response_array[6];
412
+ $order->updateStatus("firstpayment");
413
  return true;
414
  }
415
  else
429
  if(empty($order->code))
430
  $order->code = $order->getRandomCode();
431
 
 
 
 
432
  if(!empty($order->gateway_environment))
433
  $gateway_environment = $order->gateway_environment;
434
  if(empty($gateway_environment))
482
  //taxes
483
  $amount_tax = $order->getTaxForPrice($amount);
484
  $trial_tax = $order->getTaxForPrice($trialAmount);
485
+
486
+ $order->subtotal = $amount;
487
  $amount = round((float)$amount + (float)$amount_tax, 2);
488
  $trialAmount = round((float)$trialAmount + (float)$trial_tax, 2);
489
 
504
 
505
  //do address stuff then?
506
  $address = $order->Address1;
507
+ if($order->Address2)
508
  $address .= "\n" . $order->Address2;
509
  $city = $order->billing->city;
510
  $state = $order->billing->state;
541
  "</interval>".
542
  "<startDate>" . $startDate . "</startDate>".
543
  "<totalOccurrences>". $totalOccurrences . "</totalOccurrences>";
544
+ if($trialOccurrences)
545
  $this->content .=
546
  "<trialOccurrences>". $trialOccurrences . "</trialOccurrences>";
547
  $this->content .=
548
  "</paymentSchedule>".
549
  "<amount>". $amount ."</amount>";
550
+ if($trialOccurrences)
551
  $this->content .=
552
  "<trialAmount>" . $trialAmount . "</trialAmount>";
553
  $this->content .=
584
  $response = send_request_via_fsockopen($host,$path,$content);
585
  */
586
 
587
+ if($this->response) {
588
  list ($refId, $resultCode, $code, $text, $subscriptionId) = $this->parse_return($this->response);
589
  if($resultCode == "Ok")
590
  {
637
 
638
  //do address stuff then?
639
  $address = $order->Address1;
640
+ if($order->Address2)
641
  $address .= "\n" . $order->Address2;
642
  $city = $order->billing->city;
643
  $state = $order->billing->state;
694
  */
695
 
696
 
697
+ if($this->response) {
698
  list ($resultCode, $code, $text, $subscriptionId) = $this->parse_return($this->response);
699
 
700
  if($resultCode == "Ok" || $code == "Ok")
777
  else
778
  {
779
  $order->status = "error";
780
+ $order->error = "Could not connect to Authorize.net";
781
+ $order->shorterror = "Could not connect to Authorize.net";
782
  return false;
783
  }
784
  }
820
  function send_request_via_curl($host,$path,$content)
821
  {
822
  $posturl = "https://" . $host . $path;
 
823
  $ch = curl_init();
824
  curl_setopt($ch, CURLOPT_URL, $posturl);
825
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
classes/gateways/class.pmprogateway_braintree.php DELETED
@@ -1,422 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("Braintree"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/Braintree/Braintree.php");
5
- class PMProGateway_braintree
6
- {
7
- function PMProGateway_braintree($gateway = NULL)
8
- {
9
- $this->gateway = $gateway;
10
- $this->gateway_environment = pmpro_getOption("gateway_environment");
11
-
12
- //convert to braintree nomenclature
13
- $environment = $this->gateway_environment;
14
- if($environment == "live")
15
- $environment = "production";
16
-
17
- Braintree_Configuration::environment($environment);
18
- Braintree_Configuration::merchantId(pmpro_getOption("braintree_merchantid"));
19
- Braintree_Configuration::publicKey(pmpro_getOption("braintree_publickey"));
20
- Braintree_Configuration::privateKey(pmpro_getOption("braintree_privatekey"));
21
-
22
- return $this->gateway;
23
- }
24
-
25
- function process(&$order)
26
- {
27
- //check for initial payment
28
- if(floatval($order->InitialPayment) == 0)
29
- {
30
- //just subscribe
31
- return $this->subscribe($order);
32
- }
33
- else
34
- {
35
- //charge then subscribe
36
- if($this->charge($order))
37
- {
38
- if(pmpro_isLevelRecurring($order->membership_level))
39
- {
40
- if($this->subscribe($order))
41
- {
42
- //yay!
43
- return true;
44
- }
45
- else
46
- {
47
- //try to refund initial charge
48
- return false;
49
- }
50
- }
51
- else
52
- {
53
- //only a one time charge
54
- $order->status = "success"; //saved on checkout page
55
- return true;
56
- }
57
- }
58
- else
59
- {
60
- if(empty($order->error))
61
- $order->error = __("Unknown error: Initial payment failed.", "pmpro");
62
- return false;
63
- }
64
- }
65
- }
66
-
67
- function charge(&$order)
68
- {
69
- //create a code for the order
70
- if(empty($order->code))
71
- $order->code = $order->getRandomCode();
72
-
73
- //what amount to charge?
74
- $amount = $order->InitialPayment;
75
-
76
- //tax
77
- $order->subtotal = $amount;
78
- $tax = $order->getTax(true);
79
- $amount = round((float)$order->subtotal + (float)$tax, 2);
80
-
81
- //create a customer
82
- $this->getCustomer($order);
83
- if(empty($this->customer))
84
- {
85
- //failed to create customer
86
- return false;
87
- }
88
-
89
- //charge
90
- try
91
- {
92
- $response = Braintree_Transaction::sale(array(
93
- 'amount' => $amount,
94
- 'customerId' => $this->customer->id
95
- ));
96
- }
97
- catch (Exception $e)
98
- {
99
- //$order->status = "error";
100
- $order->errorcode = true;
101
- $order->error = "Error: " . $e->getMessage();
102
- $order->shorterror = $order->error;
103
- return false;
104
- }
105
-
106
- if($response->success)
107
- {
108
- //successful charge
109
- $transaction_id = $response->transaction->id;
110
- $response = Braintree_Transaction::submitForSettlement($transaction_id);
111
- if($response->success)
112
- {
113
- $order->payment_transaction_id = $transaction_id;
114
- $order->updateStatus("success");
115
- return true;
116
- }
117
- else
118
- {
119
- $order->errorcode = true;
120
- $order->error = __("Error during settlement:", "pmpro") . " " . $response->message;
121
- $order->shorterror = $response->message;
122
- return false;
123
- }
124
- }
125
- else
126
- {
127
- //$order->status = "error";
128
- $order->errorcode = true;
129
- $order->error = __("Error during charge:", "pmpro") . " " . $response->message;
130
- $order->shorterror = $response->message;
131
- return false;
132
- }
133
- }
134
-
135
- /*
136
- This function will return a Braintree customer object.
137
- If $this->customer is set, it returns it.
138
- It first checks if the order has a subscription_transaction_id. If so, that's the customer id.
139
- If not, it checks for a user_id on the order and searches for a customer id in the user meta.
140
- If a customer id is found, it checks for a customer through the Braintree API.
141
- If a customer is found and there is an AccountNumber on the order passed, it will update the customer.
142
- If no customer is found and there is an AccountNumber on the order passed, it will create a customer.
143
- */
144
- function getCustomer(&$order, $force = false)
145
- {
146
- global $current_user;
147
-
148
- //already have it?
149
- if(!empty($this->customer) && !$force)
150
- return $this->customer;
151
-
152
- //try based on user id
153
- if(!empty($order->user_id))
154
- $user_id = $order->user_id;
155
-
156
- //if no id passed, check the current user
157
- if(empty($user_id) && !empty($current_user->ID))
158
- $user_id = $current_user->ID;
159
-
160
- //check for a braintree customer id
161
- if(!empty($user_id))
162
- {
163
- $customer_id = get_user_meta($user_id, "pmpro_braintree_customerid", true);
164
- }
165
-
166
- //check for an existing stripe customer
167
- if(!empty($customer_id))
168
- {
169
- try
170
- {
171
- $this->customer = Braintree_Customer::find($customer_id);
172
-
173
- //update the customer description and card
174
- if(!empty($order->accountnumber))
175
- {
176
- $response = Braintree_Customer::update(
177
- $customer_id,
178
- array(
179
- 'firstName' => $order->FirstName,
180
- 'lastName' => $order->LastName,
181
- 'creditCard' => array(
182
- 'number' => $order->braintree->number,
183
- 'expirationDate' => $order->braintree->expiration_date,
184
- 'cardholderName' => trim($order->FirstName . " " . $order->LastName),
185
- 'options' => array(
186
- 'updateExistingToken' => $this->customer->creditCards[0]->token
187
- )
188
- )
189
- )
190
- );
191
-
192
- if($response->success)
193
- {
194
- $this->customer = $response->customer;
195
- }
196
- else
197
- {
198
- $order->error = __("Failed to update customer.", "pmpro") . " " . $response->message;
199
- $order->shorterror = $order->error;
200
- return false;
201
- }
202
- }
203
-
204
- return $this->customer;
205
- }
206
- catch (Exception $e)
207
- {
208
- //assume no customer found
209
- }
210
- }
211
-
212
- //no customer id, create one
213
- if(!empty($order->accountnumber))
214
- {
215
- try
216
- {
217
- $result = Braintree_Customer::create(array(
218
- 'firstName' => $order->FirstName,
219
- 'lastName' => $order->LastName,
220
- 'email' => $order->Email,
221
- 'phone' => $order->billing->phone,
222
- 'creditCard' => array(
223
- 'number' => $order->braintree->number,
224
- 'expirationDate' => $order->braintree->expiration_date,
225
- 'cvv' => $order->braintree->cvv,
226
- 'cardholderName' => trim($order->FirstName . " " . $order->LastName),
227
- 'billingAddress' => array(
228
- 'firstName' => $order->FirstName,
229
- 'lastName' => $order->LastName,
230
- 'streetAddress' => $order->Address1,
231
- 'extendedAddress' => $order->Address2,
232
- 'locality' => $order->billing->city,
233
- 'region' => $order->billing->state,
234
- 'postalCode' => $order->billing->zip,
235
- 'countryCodeAlpha2' => $order->billing->country
236
- )
237
- )
238
- ));
239
-
240
- if($result->success)
241
- {
242
- $this->customer = $result->customer;
243
- }
244
- else
245
- {
246
- $order->error = __("Failed to create customer.", "pmpro") . " " . $result->message;
247
- $order->shorterror = $order->error;
248
- return false;
249
- }
250
- }
251
- catch (Exception $e)
252
- {
253
- $order->error = __("Error creating customer record with Braintree:", "pmpro") . " " . $e->getMessage();
254
- $order->shorterror = $order->error;
255
- return false;
256
- }
257
-
258
- update_user_meta($user_id, "pmpro_braintree_customerid", $this->customer->id);
259
- return $this->customer;
260
- }
261
-
262
- return false;
263
- }
264
-
265
- function subscribe(&$order)
266
- {
267
- //create a code for the order
268
- if(empty($order->code))
269
- $order->code = $order->getRandomCode();
270
-
271
- //setup customer
272
- $this->getCustomer($order);
273
- if(empty($this->customer))
274
- return false; //error retrieving customer
275
-
276
- //figure out the amounts
277
- $amount = $order->PaymentAmount;
278
- $amount_tax = $order->getTaxForPrice($amount);
279
- $amount = round((float)$amount + (float)$amount_tax, 2);
280
-
281
- /*
282
- There are two parts to the trial. Part 1 is simply the delay until the first payment
283
- since we are doing the first payment as a separate transaction.
284
- The second part is the actual "trial" set by the admin.
285
-
286
- Stripe only supports Year or Month for billing periods, but we account for Days and Weeks just in case.
287
- */
288
- //figure out the trial length (first payment handled by initial charge)
289
- if($order->BillingPeriod == "Year")
290
- $trial_period_days = $order->BillingFrequency * 365; //annual
291
- elseif($order->BillingPeriod == "Day")
292
- $trial_period_days = $order->BillingFrequency * 1; //daily
293
- elseif($order->BillingPeriod == "Week")
294
- $trial_period_days = $order->BillingFrequency * 7; //weekly
295
- else
296
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
297
-
298
- //convert to a profile start date
299
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
300
-
301
- //filter the start date
302
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
303
-
304
- //convert back to days
305
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d")) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
306
-
307
- //now add the actual trial set by the site
308
- if(!empty($order->TrialBillingCycles))
309
- {
310
- $trialOccurrences = (int)$order->TrialBillingCycles;
311
- if($order->BillingPeriod == "Year")
312
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
313
- elseif($order->BillingPeriod == "Day")
314
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
315
- elseif($order->BillingPeriod == "Week")
316
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
317
- else
318
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
319
- }
320
-
321
- //subscribe to the plan
322
- try
323
- {
324
- $details = array(
325
- 'paymentMethodToken' => $this->customer->creditCards[0]->token,
326
- 'planId' => 'pmpro_' . $order->membership_id,
327
- 'price' => $amount
328
- );
329
-
330
- if(!empty($trial_period_days))
331
- {
332
- $details['trialPeriod'] = true;
333
- $details['trialDuration'] = $trial_period_days;
334
- $details['trialDurationUnit'] = "day";
335
- }
336
-
337
- if(!empty($order->TotalBillingCycles))
338
- $details['numberOfBillingCycles'] = $order->TotalBillingCycles;
339
-
340
- $result = Braintree_Subscription::create($details);
341
- }
342
- catch (Exception $e)
343
- {
344
- $order->error = __("Error subscribing customer to plan with Braintree:", "pmpro") . " " . $e->getMessage();
345
- //return error
346
- $order->shorterror = $order->error;
347
- return false;
348
- }
349
-
350
- if($result->success)
351
- {
352
- //if we got this far, we're all good
353
- $order->status = "success";
354
- $order->subscription_transaction_id = $result->subscription->id;
355
- return true;
356
- }
357
- else
358
- {
359
- $order->error = __("Failed to subscribe with Braintree:", "pmpro") . " " . $result->message;
360
- $order->shorterror = $result->message;
361
- return false;
362
- }
363
- }
364
-
365
- function update(&$order)
366
- {
367
- //we just have to run getCustomer which will look for the customer and update it with the new token
368
- $this->getCustomer($order);
369
-
370
- if(!empty($this->customer) && empty($order->error))
371
- {
372
- return true;
373
- }
374
- else
375
- {
376
- return false; //couldn't find the customer
377
- }
378
- }
379
-
380
- function cancel(&$order)
381
- {
382
- //require a subscription id
383
- if(empty($order->subscription_transaction_id))
384
- return false;
385
-
386
- //find the customer
387
- if(!empty($order->subscription_transaction_id))
388
- {
389
- //cancel
390
- try
391
- {
392
- $result = Braintree_Subscription::cancel($order->subscription_transaction_id);
393
- }
394
- catch(Exception $e)
395
- {
396
- $order->updateStatus("cancelled"); //assume it's been cancelled already
397
- $order->error = __("Could not find the subscription.", "pmpro") . " " . $e->getMessage();
398
- $order->shorterror = $order->error;
399
- return false; //no subscription found
400
- }
401
-
402
- if($result->success)
403
- {
404
- $order->updateStatus("cancelled");
405
- return true;
406
- }
407
- else
408
- {
409
- $order->updateStatus("cancelled"); //assume it's been cancelled already
410
- $order->error = __("Could not find the subscription.", "pmpro") . " " . $result->message;
411
- $order->shorterror = $order->error;
412
- return false; //no subscription found
413
- }
414
- }
415
- else
416
- {
417
- $order->error = __("Could not find the subscription.", "pmpro");
418
- $order->shorterror = $order->error;
419
- return false; //no customer found
420
- }
421
- }
422
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_check.php DELETED
@@ -1,208 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- class PMProGateway_check
4
- {
5
- function PMProGateway_check($gateway = NULL)
6
- {
7
- $this->gateway = $gateway;
8
- return $this->gateway;
9
- }
10
-
11
- function process(&$order)
12
- {
13
- //clean up a couple values
14
- $order->payment_type = "Check";
15
- $order->CardType = "";
16
- $order->cardtype = "";
17
-
18
- //check for initial payment
19
- if(floatval($order->InitialPayment) == 0)
20
- {
21
- //auth first, then process
22
- if($this->authorize($order))
23
- {
24
- $this->void($order);
25
- if(!pmpro_isLevelTrial($order->membership_level))
26
- {
27
- //subscription will start today with a 1 period trial
28
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
29
- $order->TrialBillingPeriod = $order->BillingPeriod;
30
- $order->TrialBillingFrequency = $order->BillingFrequency;
31
- $order->TrialBillingCycles = 1;
32
- $order->TrialAmount = 0;
33
-
34
- //add a billing cycle to make up for the trial, if applicable
35
- if(!empty($order->TotalBillingCycles))
36
- $order->TotalBillingCycles++;
37
- }
38
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
39
- {
40
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
41
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
42
- $order->TrialBillingCycles++;
43
-
44
- //add a billing cycle to make up for the trial, if applicable
45
- if($order->TotalBillingCycles)
46
- $order->TotalBillingCycles++;
47
- }
48
- else
49
- {
50
- //add a period to the start date to account for the initial payment
51
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
52
- }
53
-
54
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
55
- return $this->subscribe($order);
56
- }
57
- else
58
- {
59
- if(empty($order->error))
60
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
61
- return false;
62
- }
63
- }
64
- else
65
- {
66
- //charge first payment
67
- if($this->charge($order))
68
- {
69
- //setup recurring billing
70
- if(pmpro_isLevelRecurring($order->membership_level))
71
- {
72
- if(!pmpro_isLevelTrial($order->membership_level))
73
- {
74
- //subscription will start today with a 1 period trial
75
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
76
- $order->TrialBillingPeriod = $order->BillingPeriod;
77
- $order->TrialBillingFrequency = $order->BillingFrequency;
78
- $order->TrialBillingCycles = 1;
79
- $order->TrialAmount = 0;
80
-
81
- //add a billing cycle to make up for the trial, if applicable
82
- if(!empty($order->TotalBillingCycles))
83
- $order->TotalBillingCycles++;
84
- }
85
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
86
- {
87
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
88
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
89
- $order->TrialBillingCycles++;
90
-
91
- //add a billing cycle to make up for the trial, if applicable
92
- if(!empty($order->TotalBillingCycles))
93
- $order->TotalBillingCycles++;
94
- }
95
- else
96
- {
97
- //add a period to the start date to account for the initial payment
98
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
99
- }
100
-
101
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
102
- if($this->subscribe($order))
103
- {
104
- return true;
105
- }
106
- else
107
- {
108
- if($this->void($order))
109
- {
110
- if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
- }
113
- else
114
- {
115
- if(!$order->error)
116
- $order->error = __("Unknown error: Payment failed.", "pmpro");
117
-
118
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
119
- }
120
-
121
- return false;
122
- }
123
- }
124
- else
125
- {
126
- //only a one time charge
127
- $order->status = apply_filters("pmpro_check_status_after_checkout", "success"); //saved on checkout page
128
- return true;
129
- }
130
- }
131
- else
132
- {
133
- if(empty($order->error))
134
- $order->error = __("Unknown error: Payment failed.", "pmpro");
135
-
136
- return false;
137
- }
138
- }
139
- }
140
-
141
- function authorize(&$order)
142
- {
143
- //create a code for the order
144
- if(empty($order->code))
145
- $order->code = $order->getRandomCode();
146
-
147
- //simulate a successful authorization
148
- $order->payment_transaction_id = "CHECK" . $order->code;
149
- $order->updateStatus("authorized");
150
- return true;
151
- }
152
-
153
- function void(&$order)
154
- {
155
- //need a transaction id
156
- if(empty($order->payment_transaction_id))
157
- return false;
158
-
159
- //simulate a successful void
160
- $order->payment_transaction_id = "CHECK" . $order->code;
161
- $order->updateStatus("voided");
162
- return true;
163
- }
164
-
165
- function charge(&$order)
166
- {
167
- //create a code for the order
168
- if(empty($order->code))
169
- $order->code = $order->getRandomCode();
170
-
171
- //simulate a successful charge
172
- $order->payment_transaction_id = "CHECK" . $order->code;
173
- $order->updateStatus("success");
174
- return true;
175
- }
176
-
177
- function subscribe(&$order)
178
- {
179
- //create a code for the order
180
- if(empty($order->code))
181
- $order->code = $order->getRandomCode();
182
-
183
- //filter order before subscription. use with care.
184
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
185
-
186
- //simulate a successful subscription processing
187
- $order->status = "success";
188
- $order->subscription_transaction_id = "CHECK" . $order->code;
189
- return true;
190
- }
191
-
192
- function update(&$order)
193
- {
194
- //simulate a successful billing update
195
- return true;
196
- }
197
-
198
- function cancel(&$order)
199
- {
200
- //require a subscription id
201
- if(empty($order->subscription_transaction_id))
202
- return false;
203
-
204
- //simulate a successful cancel
205
- $order->updateStatus("cancelled");
206
- return true;
207
- }
208
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_cybersource.php DELETED
@@ -1,765 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("CyberSourceSoapClient"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/CyberSource/cyber_source_soap_client.php");
5
- class PMProGateway_cybersource
6
- {
7
- function PMProGateway_cybersource($gateway = NULL)
8
- {
9
- $this->gateway = $gateway;
10
- return $this->gateway;
11
- }
12
-
13
- function process(&$order)
14
- {
15
- //check for initial payment
16
- if(floatval($order->InitialPayment) == 0)
17
- {
18
- //auth first, then process
19
- if($this->authorize($order))
20
- {
21
- $this->void($order);
22
- if(!pmpro_isLevelTrial($order->membership_level))
23
- {
24
- //subscription will start today with a 1 period trial
25
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
26
- $order->TrialBillingPeriod = $order->BillingPeriod;
27
- $order->TrialBillingFrequency = $order->BillingFrequency;
28
- $order->TrialBillingCycles = 1;
29
- $order->TrialAmount = 0;
30
-
31
- //add a billing cycle to make up for the trial, if applicable
32
- if(!empty($order->TotalBillingCycles))
33
- $order->TotalBillingCycles++;
34
- }
35
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
36
- {
37
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
38
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
39
- $order->TrialBillingCycles++;
40
-
41
- //add a billing cycle to make up for the trial, if applicable
42
- if($order->TotalBillingCycles)
43
- $order->TotalBillingCycles++;
44
- }
45
- else
46
- {
47
- //add a period to the start date to account for the initial payment
48
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
49
- }
50
-
51
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
- return $this->subscribe($order);
53
- }
54
- else
55
- {
56
- if(empty($order->error))
57
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
58
- return false;
59
- }
60
- }
61
- else
62
- {
63
- //charge first payment
64
- if($this->charge($order))
65
- {
66
- //setup recurring billing
67
- if(pmpro_isLevelRecurring($order->membership_level))
68
- {
69
- if(!pmpro_isLevelTrial($order->membership_level))
70
- {
71
- //subscription will start today with a 1 period trial
72
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
73
- $order->TrialBillingPeriod = $order->BillingPeriod;
74
- $order->TrialBillingFrequency = $order->BillingFrequency;
75
- $order->TrialBillingCycles = 1;
76
- $order->TrialAmount = 0;
77
-
78
- //add a billing cycle to make up for the trial, if applicable
79
- if(!empty($order->TotalBillingCycles))
80
- $order->TotalBillingCycles++;
81
- }
82
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
83
- {
84
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
85
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
86
- $order->TrialBillingCycles++;
87
-
88
- //add a billing cycle to make up for the trial, if applicable
89
- if(!empty($order->TotalBillingCycles))
90
- $order->TotalBillingCycles++;
91
- }
92
- else
93
- {
94
- //add a period to the start date to account for the initial payment
95
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
96
- }
97
-
98
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
99
- if($this->subscribe($order))
100
- {
101
- return true;
102
- }
103
- else
104
- {
105
- if($this->void($order))
106
- {
107
- if(!$order->error)
108
- $order->error = __("Unknown error: Payment failed.", "pmpro");
109
- }
110
- else
111
- {
112
- if(!$order->error)
113
- $order->error = __("Unknown error: Payment failed.", "pmpro");
114
-
115
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
116
- }
117
-
118
- return false;
119
- }
120
- }
121
- else
122
- {
123
- //only a one time charge
124
- $order->status = "success"; //saved on checkout page
125
- return true;
126
- }
127
- }
128
- else
129
- {
130
- if(empty($order->error))
131
- $order->error = __("Unknown error: Payment failed.", "pmpro");
132
-
133
- return false;
134
- }
135
- }
136
- }
137
-
138
- function getCardType($name)
139
- {
140
- $card_types = array(
141
- 'Visa' => '001',
142
- 'MasterCard' => '002',
143
- 'Master Card' => '002',
144
- 'AMEX' => '003',
145
- 'American Express' => '003',
146
- 'Discover' => '004',
147
- 'Diners Club' => '005',
148
- 'Carte Blanche' => '006',
149
- 'JCB' => '007'
150
- );
151
-
152
- if(isset($card_types[$name]))
153
- return $card_types[$name];
154
- else
155
- return false;
156
- }
157
-
158
- function getWSDL($order)
159
- {
160
- //which gateway environment?
161
- if(empty($order->gateway_environment))
162
- $gateway_environment = pmpro_getOption("gateway_environment");
163
- else
164
- $gateway_environment = $order->gateway_environment;
165
-
166
- //which host?
167
- if($gateway_environment == "live")
168
- $host = "ics2ws.ic3.com";
169
- else
170
- $host = "ics2wstest.ic3.com";
171
-
172
- //path
173
- $path = "/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.90.wsdl";
174
-
175
- //build url
176
- $wsdl_url = "https://" . $host . $path;
177
-
178
- //filter
179
- $wsdl_url = apply_filters("pmpro_cybersource_wsdl_url", $wsdl_url, $gateway_environment);
180
-
181
- return $wsdl_url;
182
- }
183
-
184
- function authorize(&$order)
185
- {
186
- if(empty($order->code))
187
- $order->code = $order->getRandomCode();
188
-
189
- $wsdl_url = $this->getWSDL($order);
190
-
191
- //what amount to authorize? just $1 to test
192
- $amount = "1.00";
193
-
194
- //combine address
195
- $address = $order->Address1;
196
- if(!empty($order->Address2))
197
- $address .= "\n" . $order->Address2;
198
-
199
- //customer stuff
200
- $customer_email = $order->Email;
201
- $customer_phone = $order->billing->phone;
202
-
203
- if(!isset($order->membership_level->name))
204
- $order->membership_level->name = "";
205
-
206
- //to store our request
207
- $request = new stdClass();
208
-
209
- //which service?
210
- $ccAuthService = new stdClass();
211
- $ccAuthService->run = "true";
212
- $request->ccAuthService = $ccAuthService;
213
-
214
- //merchant id and order code
215
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
216
- $request->merchantReferenceCode = $order->code;
217
-
218
- //bill to
219
- $billTo = new stdClass();
220
- $billTo->firstName = $order->FirstName;
221
- $billTo->lastName = $order->LastName;
222
- $billTo->street1 = $address;
223
- $billTo->city = $order->billing->city;
224
- $billTo->state = $order->billing->state;
225
- $billTo->postalCode = $order->billing->zip;
226
- $billTo->country = $order->billing->country;
227
- $billTo->email = $order->Email;
228
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
229
- $request->billTo = $billTo;
230
-
231
- //card
232
- $card = new stdClass();
233
- $card->cardType = $this->getCardType($order->cardtype);
234
- $card->accountNumber = $order->accountnumber;
235
- $card->expirationMonth = $order->expirationmonth;
236
- $card->expirationYear = $order->expirationyear;
237
- $card->cvNumber = $order->CVV2;
238
- $request->card = $card;
239
-
240
- //currency
241
- $purchaseTotals = new stdClass();
242
- $purchaseTotals->currency = pmpro_getOption("currency");
243
- $request->purchaseTotals = $purchaseTotals;
244
-
245
- //item/price
246
- $item0 = new stdClass();
247
- $item0->unitPrice = $amount;
248
- $item0->quantity = "1";
249
- $item0->productName = $order->membership_level->name . " Membership";
250
- $item0->productSKU = $order->membership_level->id;
251
- $item0->id = $order->membership_id;
252
- $request->item = array($item0);
253
-
254
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
255
- $reply = $soapClient->runTransaction($request);
256
-
257
- if($reply->reasonCode == "100")
258
- {
259
- //success
260
- $order->payment_transaction_id = $reply->requestID;
261
- $order->updateStatus("authorized");
262
- return true;
263
- }
264
- else
265
- {
266
- //error
267
- $order->errorcode = $reply->reasonCode;
268
- $order->error = $this->getErrorFromCode($reply->reasonCode);
269
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
270
- return false;
271
- }
272
- }
273
-
274
- function void(&$order)
275
- {
276
- //need a transaction id
277
- if(empty($order->payment_transaction_id))
278
- return false;
279
-
280
- //get wsdl
281
- $wsdl_url = $this->getWSDL($order);
282
-
283
- //to store our request
284
- $request = new stdClass();
285
-
286
- //which service?
287
- $voidService = new stdClass();
288
- $voidService->run = "true";
289
- $voidService->voidRequestID = $order->payment_transaction_id;
290
- $request->voidService = $voidService;
291
-
292
- //merchant id and order code
293
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
294
- $request->merchantReferenceCode = $order->code;
295
-
296
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
297
- $reply = $soapClient->runTransaction($request);
298
-
299
- if($reply->reasonCode == "100")
300
- {
301
- //success
302
- $order->payment_transaction_id = $reply->requestID;
303
- $order->updateStatus("voided");
304
- return true;
305
- }
306
- else
307
- {
308
- //error
309
- $order->errorcode = $reply->reasonCode;
310
- $order->error = $this->getErrorFromCode($reply->reasonCode);
311
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
312
- return false;
313
- }
314
- }
315
-
316
- function charge(&$order)
317
- {
318
- //get a code
319
- if(empty($order->code))
320
- $order->code = $order->getRandomCode();
321
-
322
- //get wsdl
323
- $wsdl_url = $this->getWSDL($order);
324
-
325
- //what amount to charge?
326
- $amount = $order->InitialPayment;
327
-
328
- //tax
329
- $order->subtotal = $amount;
330
- $tax = $order->getTax(true);
331
- $amount = round((float)$order->subtotal + (float)$tax, 2);
332
-
333
- //combine address
334
- $address = $order->Address1;
335
- if(!empty($order->Address2))
336
- $address .= "\n" . $order->Address2;
337
-
338
- //customer stuff
339
- $customer_email = $order->Email;
340
- $customer_phone = $order->billing->phone;
341
-
342
- if(!isset($order->membership_level->name))
343
- $order->membership_level->name = "";
344
-
345
- //to store our request
346
- $request = new stdClass();
347
-
348
- //authorize and capture
349
- $ccAuthService = new stdClass();
350
- $ccAuthService->run = "true";
351
- $request->ccAuthService = $ccAuthService;
352
-
353
- $ccCaptureService = new stdClass();
354
- $ccCaptureService->run = "true";
355
- $request->ccCaptureService = $ccCaptureService;
356
-
357
- //merchant id and order code
358
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
359
- $request->merchantReferenceCode = $order->code;
360
-
361
- //bill to
362
- $billTo = new stdClass();
363
- $billTo->firstName = $order->FirstName;
364
- $billTo->lastName = $order->LastName;
365
- $billTo->street1 = $address;
366
- $billTo->city = $order->billing->city;
367
- $billTo->state = $order->billing->state;
368
- $billTo->postalCode = $order->billing->zip;
369
- $billTo->country = $order->billing->country;
370
- $billTo->email = $order->Email;
371
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
372
- $request->billTo = $billTo;
373
-
374
- //card
375
- $card = new stdClass();
376
- $card->cardType = $this->getCardType($order->cardtype);
377
- $card->accountNumber = $order->accountnumber;
378
- $card->expirationMonth = $order->expirationmonth;
379
- $card->expirationYear = $order->expirationyear;
380
- $card->cvNumber = $order->CVV2;
381
- $request->card = $card;
382
-
383
- //currency
384
- $purchaseTotals = new stdClass();
385
- $purchaseTotals->currency = pmpro_getOption("currency");
386
- $request->purchaseTotals = $purchaseTotals;
387
-
388
- //item/price
389
- $item0 = new stdClass();
390
- $item0->unitPrice = $amount;
391
- $item0->quantity = "1";
392
- $item0->productName = $order->membership_level->name . " Membership";
393
- $item0->productSKU = $order->membership_level->id;
394
- $item0->id = $order->membership_id;
395
- $request->item = array($item0);
396
-
397
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
398
- $reply = $soapClient->runTransaction($request);
399
-
400
- if($reply->reasonCode == "100")
401
- {
402
- //success
403
- $order->payment_transaction_id = $reply->requestID;
404
- $order->updateStatus("success");
405
- return true;
406
- }
407
- else
408
- {
409
- //error
410
- $order->errorcode = $reply->reasonCode;
411
- $order->error = $this->getErrorFromCode($reply->reasonCode);
412
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
413
- return false;
414
- }
415
- }
416
-
417
- function subscribe(&$order)
418
- {
419
- //create a code for the order
420
- if(empty($order->code))
421
- $order->code = $order->getRandomCode();
422
-
423
- //filter order before subscription. use with care.
424
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
425
-
426
- //get wsdl
427
- $wsdl_url = $this->getWSDL($order);
428
-
429
- //to store our request
430
- $request = new stdClass();
431
-
432
- //set service type
433
- $paySubscriptionCreateService = new stdClass();
434
- $paySubscriptionCreateService->run = 'true';
435
- $paySubscriptionCreateService->disableAutoAuth = 'true'; //we do our own auth check
436
- $request->paySubscriptionCreateService = $paySubscriptionCreateService;
437
-
438
- //merchant id and order code
439
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
440
- $request->merchantReferenceCode = $order->code;
441
-
442
- /*
443
- setup billing amount/etc
444
- */
445
- //figure out the amounts
446
- $amount = $order->PaymentAmount;
447
- $amount_tax = $order->getTaxForPrice($amount);
448
- $order->subtotal = $amount;
449
- $amount = round((float)$amount + (float)$amount_tax, 2);
450
-
451
- /*
452
- There are two parts to the trial. Part 1 is simply the delay until the first payment
453
- since we are doing the first payment as a separate transaction.
454
- The second part is the actual "trial" set by the admin.
455
- */
456
- //figure out the trial length (first payment handled by initial charge)
457
- if($order->BillingPeriod == "Year")
458
- $trial_period_days = $order->BillingFrequency * 365; //annual
459
- elseif($order->BillingPeriod == "Day")
460
- $trial_period_days = $order->BillingFrequency * 1; //daily
461
- elseif($order->BillingPeriod == "Week")
462
- $trial_period_days = $order->BillingFrequency * 7; //weekly
463
- else
464
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
465
-
466
- //convert to a profile start date
467
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
468
-
469
- //filter the start date
470
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
471
-
472
- //convert back to days
473
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
474
-
475
- //now add the actual trial set by the site
476
- if(!empty($order->TrialBillingCycles))
477
- {
478
- $trialOccurrences = (int)$order->TrialBillingCycles;
479
- if($order->BillingPeriod == "Year")
480
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
481
- elseif($order->BillingPeriod == "Day")
482
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
483
- elseif($order->BillingPeriod == "Week")
484
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
485
- else
486
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
487
- }
488
-
489
- //convert back into a date
490
- $profile_start_date = date("Ymd", strtotime("+ " . $trial_period_days . " Days"));
491
-
492
- //figure out the frequency
493
- if($order->BillingPeriod == "Year")
494
- {
495
- $frequency = "annually"; //ignoring BillingFrequency set on level.
496
- }
497
- elseif($order->BillingPeriod == "Month")
498
- {
499
- if($order->BillingFrequency == 6)
500
- $frequency = "semi annually";
501
- elseif($order->BillingFrequency == 3)
502
- $frequency = "quarterly";
503
- else
504
- $frequency = "monthly";
505
- }
506
- elseif($order->BillingPeriod == "Week")
507
- {
508
- if($order->BillingFrequency == 4)
509
- $frequency = "quad-weekly";
510
- elseif($order->BillingFrequency == 2)
511
- $frequency = "bi-weekly";
512
- else
513
- $frequency = "weekly";
514
- }
515
- elseif($order->BillingPeriod == "Day")
516
- {
517
- if($order->BillingFrequency == 365)
518
- $frequency = "annually";
519
- elseif($order->BillingFrequency == 182)
520
- $frequency = "semi annually";
521
- elseif($order->BillingFrequency == 183)
522
- $frequency = "semi annually";
523
- elseif($order->BillingFrequency == 90)
524
- $frequency = "quaterly";
525
- elseif($order->BillingFrequency == 30)
526
- $frequency = "monthly";
527
- elseif($order->BillingFrequency == 15)
528
- $frequency = "semi-monthly";
529
- elseif($order->BillingFrequency == 28)
530
- $frequency = "quad-weekly";
531
- elseif($order->BillingFrequency == 14)
532
- $frequency = "bi-weekly";
533
- elseif($order->BillingFrequency == 7)
534
- $frequency = "weekly";
535
- }
536
-
537
- //set subscription info for API
538
- $subscription = new stdClass();
539
- $subscription->title = $order->membership_level->name;
540
- $subscription->paymentMethod = "credit card";
541
- $request->subscription = $subscription;
542
-
543
- //recurring info
544
- $recurringSubscriptionInfo = new stdClass();
545
- $recurringSubscriptionInfo->amount = number_format($amount, 2);
546
- $recurringSubscriptionInfo->startDate = $profile_start_date;
547
- $recurringSubscriptionInfo->frequency = $frequency;
548
- if(!empty($order->TotalBillingCycles))
549
- $recurringSubscriptionInfo->numberOfPayments = $order->TotalBillingCycles;
550
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
551
-
552
- //combine address
553
- $address = $order->Address1;
554
- if(!empty($order->Address2))
555
- $address .= "\n" . $order->Address2;
556
-
557
- //bill to
558
- $billTo = new stdClass();
559
- $billTo->firstName = $order->FirstName;
560
- $billTo->lastName = $order->LastName;
561
- $billTo->street1 = $address;
562
- $billTo->city = $order->billing->city;
563
- $billTo->state = $order->billing->state;
564
- $billTo->postalCode = $order->billing->zip;
565
- $billTo->country = $order->billing->country;
566
- $billTo->email = $order->Email;
567
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
568
- $request->billTo = $billTo;
569
-
570
- //card
571
- $card = new stdClass();
572
- $card->cardType = $this->getCardType($order->cardtype);
573
- $card->accountNumber = $order->accountnumber;
574
- $card->expirationMonth = $order->expirationmonth;
575
- $card->expirationYear = $order->expirationyear;
576
- $card->cvNumber = $order->CVV2;
577
- $request->card = $card;
578
-
579
- //currency
580
- $purchaseTotals = new stdClass();
581
- $purchaseTotals->currency = pmpro_getOption("currency");
582
- $request->purchaseTotals = $purchaseTotals;
583
-
584
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
585
- $reply = $soapClient->runTransaction($request);
586
-
587
- if($reply->reasonCode == "100")
588
- {
589
- //success
590
- $order->subscription_transaction_id = $reply->requestID;
591
- $order->status = "success";
592
- return true;
593
- }
594
- else
595
- {
596
- //error
597
- $order->status = "error";
598
- $order->errorcode = $reply->reasonCode;
599
- $order->error = $this->getErrorFromCode($reply->reasonCode);
600
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
601
- return false;
602
- }
603
- }
604
-
605
- function update(&$order)
606
- {
607
- //get wsdl
608
- $wsdl_url = $this->getWSDL($order);
609
-
610
- //to store our request
611
- $request = new stdClass();
612
-
613
- //set service type
614
- $paySubscriptionUpdateService = new stdClass();
615
- $paySubscriptionUpdateService ->run = "true";
616
- $request->paySubscriptionUpdateService = $paySubscriptionUpdateService ;
617
-
618
- //merchant id and order code
619
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
620
- $request->merchantReferenceCode = $order->code;
621
-
622
- //set subscription info for API
623
- $recurringSubscriptionInfo = new stdClass();
624
- $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
625
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
626
-
627
- //combine address
628
- $address = $order->Address1;
629
- if(!empty($order->Address2))
630
- $address .= "\n" . $order->Address2;
631
-
632
- //bill to
633
- $billTo = new stdClass();
634
- $billTo->firstName = $order->FirstName;
635
- $billTo->lastName = $order->LastName;
636
- $billTo->street1 = $address;
637
- $billTo->city = $order->billing->city;
638
- $billTo->state = $order->billing->state;
639
- $billTo->postalCode = $order->billing->zip;
640
- $billTo->country = $order->billing->country;
641
- $billTo->email = $order->Email;
642
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
643
- $request->billTo = $billTo;
644
-
645
- //card
646
- $card = new stdClass();
647
- $card->cardType = $this->getCardType($order->cardtype);
648
- $card->accountNumber = $order->accountnumber;
649
- $card->expirationMonth = $order->expirationmonth;
650
- $card->expirationYear = $order->expirationyear;
651
- $card->cvNumber = $order->CVV2;
652
- $request->card = $card;
653
-
654
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
655
- $reply = $soapClient->runTransaction($request);
656
-
657
- if($reply->reasonCode == "100")
658
- {
659
- //success
660
- return true;
661
- }
662
- else
663
- {
664
- //error
665
- $order->errorcode = $reply->reasonCode;
666
- $order->error = $this->getErrorFromCode($reply->reasonCode);
667
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
668
- return false;
669
- }
670
- }
671
-
672
- function cancel(&$order)
673
- {
674
- //require a subscription id
675
- if(empty($order->subscription_transaction_id))
676
- return false;
677
-
678
- //get wsdl
679
- $wsdl_url = $this->getWSDL($order);
680
-
681
- //to store our request
682
- $request = new stdClass();
683
-
684
- //which service?
685
- $paySubscriptionDeleteService = new stdClass();
686
- $paySubscriptionDeleteService ->run = "true";
687
- $request->paySubscriptionDeleteService = $paySubscriptionDeleteService ;
688
-
689
- //which order
690
- $recurringSubscriptionInfo = new stdClass();
691
- $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
692
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
693
-
694
- //merchant id and order code
695
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
696
- $request->merchantReferenceCode = $order->code;
697
-
698
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
699
- $reply = $soapClient->runTransaction($request);
700
-
701
- if($reply->reasonCode == "100")
702
- {
703
- //success
704
- $order->updateStatus("cancelled");
705
- return true;
706
- }
707
- else
708
- {
709
- //error
710
- $order->errorcode = $reply->reasonCode;
711
- $order->error = $this->getErrorFromCode($reply->reasonCode);
712
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
713
- return false;
714
- }
715
- }
716
-
717
- function getErrorFromCode($code)
718
- {
719
- $error_messages = array(
720
- "100" => "Successful transaction.",
721
- "101" => "The request is missing one or more required fields.",
722
- "102" => "One or more fields in the request contains invalid data. Check that your billing address is valid.",
723
- "104" => "Duplicate order detected.",
724
- "110" => "Only partial amount was approved.",
725
- "150" => "Error: General system failure.",
726
- "151" => "Error: The request was received but there was a server timeout.",
727
- "152" => "Error: The request was received, but a service did not finish running in time. ",
728
- "200" => "Address Verification Service (AVS) failure.",
729
- "201" => "Authorization failed.",
730
- "202" => "Expired card or invalid expiration date.",
731
- "203" => "The card was declined.",
732
- "204" => "Insufficient funds in the account.",
733
- "205" => "Stolen or lost card.",
734
- "207" => "Issuing bank unavailable.",
735
- "208" => "Inactive card or card not authorized for card-not-present transactions.",
736
- "209" => "American Express Card Identification Digits (CID) did not match.",
737
- "210" => "The card has reached the credit limit. ",
738
- "211" => "Invalid card verification number.",
739
- "221" => "The customer matched an entry on the processors negative file. ",
740
- "230" => "Card verification (CV) check failed.",
741
- "231" => "Invalid account number.",
742
- "232" => "The card type is not accepted by the payment processor.",
743
- "233" => "General decline by the processor.",
744
- "234" => "There is a problem with your CyberSource merchant configuration.",
745
- "235" => "The requested amount exceeds the originally authorized amount.",
746
- "236" => "Processor failure.",
747
- "237" => "The authorization has already been reversed.",
748
- "238" => "The authorization has already been captured.",
749
- "239" => "The requested transaction amount must match the previous transaction amount.",
750
- "240" => "The card type sent is invalid or does not correlate with the credit card number.",
751
- "241" => "The referenced request id is invalid for all follow-on transactions.",
752
- "242" => "The request ID is invalid.",
753
- "243" => "The transaction has already been settled or reversed.",
754
- "246" => "The capture or credit is not voidable because the capture or credit information has already been submitted to your processor. Or, you requested a void for a type of transaction that cannot be voided.",
755
- "247" => "You requested a credit for a capture that was previously voided.",
756
- "250" => "Error: The request was received, but there was a timeout at the payment processor.",
757
- "520" => "Smart Authorization failed."
758
- );
759
-
760
- if(isset($error_messages[$code]))
761
- return $error_messages[$code];
762
- else
763
- return "Unknown error.";
764
- }
765
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_payflowpro.php DELETED
@@ -1,448 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- class PMProGateway_payflowpro
4
- {
5
- function PMProGateway_payflowpro($gateway = NULL)
6
- {
7
- $this->gateway = $gateway;
8
- return $this->gateway;
9
- }
10
-
11
- function process(&$order)
12
- {
13
- if(floatval($order->InitialPayment) == 0)
14
- {
15
- //auth first, then process
16
- $authorization_id = $this->authorize($order);
17
- if($authorization_id)
18
- {
19
- $this->void($order, $authorization_id);
20
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
21
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
- return $this->subscribe($order);
23
- }
24
- else
25
- {
26
- if(empty($order->error))
27
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
28
- return false;
29
- }
30
- }
31
- else
32
- {
33
- //charge first payment
34
- if($this->charge($order))
35
- {
36
- //setup recurring billing
37
- if(pmpro_isLevelRecurring($order->membership_level))
38
- {
39
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
40
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
- if($this->subscribe($order))
42
- {
43
- return true;
44
- }
45
- else
46
- {
47
- if($this->void($order, $order->payment_transaction_id))
48
- {
49
- if(empty($order->error))
50
- $order->error = __("Unknown error: Payment failed.", "pmpro");
51
- }
52
- else
53
- {
54
- if(empty($order->error))
55
- $order->error = __("Unknown error: Payment failed.", "pmpro");
56
-
57
- $order->error .= " " . __("A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.", "pmpro");
58
- }
59
-
60
- return false;
61
- }
62
- }
63
- else
64
- {
65
- //only a one time charge
66
- $order->status = "success"; //saved on checkout page
67
- $order->saveOrder();
68
- return true;
69
- }
70
- }
71
- }
72
- }
73
-
74
- function authorize(&$order)
75
- {
76
- if(empty($order->code))
77
- $order->code = $order->getRandomCode();
78
-
79
- //paypal profile stuff
80
- $nvpStr = "";
81
-
82
- $nvpStr .="&AMT=1.00";
83
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
84
- //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
85
-
86
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
87
-
88
- //credit card fields
89
- if($order->cardtype == "American Express")
90
- $cardtype = "Amex";
91
- else
92
- $cardtype = $order->cardtype;
93
-
94
- if(!empty($order->accountnumber))
95
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
96
-
97
- //billing address, etc
98
- if(!empty($order->Address1))
99
- {
100
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
101
-
102
- if($order->Address2)
103
- $nvpStr .= " " . $order->Address2;
104
-
105
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
106
- }
107
-
108
- //for debugging, let's attach this to the class object
109
- $this->nvpStr = $nvpStr;
110
-
111
- $this->httpParsedResponseAr = $this->PPHttpPost('A', $nvpStr);
112
-
113
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
114
- $order->authorization_id = $this->httpParsedResponseAr['PNREF'];
115
- $order->updateStatus("authorized");
116
- return $order->authorization_id;
117
- } else {
118
- $order->status = "error";
119
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
120
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
121
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
122
- return false;
123
- }
124
- }
125
-
126
- function void(&$order, $authorization_id)
127
- {
128
- if(empty($authorization_id))
129
- return false;
130
-
131
- //paypal profile stuff
132
- $nvpStr="&ORIGID=" . $authorization_id;
133
-
134
- $this->httpParsedResponseAr = $this->PPHttpPost('V', $nvpStr);
135
-
136
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
137
- return true;
138
- } else {
139
- $order->status = "error";
140
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
141
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
142
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
143
- return false;
144
- }
145
- }
146
-
147
- function charge(&$order)
148
- {
149
- global $pmpro_currency;
150
-
151
- if(empty($order->code))
152
- $order->code = $order->getRandomCode();
153
-
154
- //taxes on the amount
155
- $amount = $order->InitialPayment;
156
- $amount_tax = $order->getTaxForPrice($amount);
157
- $order->subtotal = $amount;
158
- $amount = round((float)$amount + (float)$amount_tax, 2);
159
-
160
- //paypal profile stuff
161
- $nvpStr = "";
162
- $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
163
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
164
- //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
165
-
166
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
167
-
168
- if(!empty($order->accountnumber))
169
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
170
-
171
- //billing address, etc
172
- if($order->Address1)
173
- {
174
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
175
-
176
- if($order->Address2)
177
- $nvpStr .= " " . $order->Address2;
178
-
179
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
180
- }
181
-
182
- $this->nvpStr = $nvpStr;
183
- $this->httpParsedResponseAr = $this->PPHttpPost('S', $nvpStr);
184
-
185
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
186
- $order->payment_transaction_id = $this->httpParsedResponseAr['PNREF'];
187
- $order->updateStatus("success");
188
- return true;
189
- } else {
190
- $order->status = "error";
191
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
192
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
193
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
194
- return false;
195
- }
196
- }
197
-
198
- function subscribe(&$order)
199
- {
200
- global $pmpro_currency;
201
-
202
- if(empty($order->code))
203
- $order->code = $order->getRandomCode();
204
-
205
- //filter order before subscription. use with care.
206
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
207
-
208
- //taxes on the amount
209
- $amount = $order->PaymentAmount;
210
- $amount_tax = $order->getTaxForPrice($amount);
211
- $amount = round((float)$amount + (float)$amount_tax, 2);
212
-
213
- if($order->BillingPeriod == "Week")
214
- $payperiod = "WEEK";
215
- elseif($order->BillingPeriod == "Month")
216
- $payperiod = "MONT";
217
- elseif($order->BillingPeriod == "Year")
218
- $payperiod = "YEAR";
219
-
220
- //paypal profile stuff
221
- $nvpStr = "&ACTION=A";
222
- $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
223
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
224
- //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
225
-
226
- $nvpStr .= "&PROFILENAME=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
227
-
228
- $nvpStr .= "&PAYPERIOD=" . $payperiod;
229
-
230
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR']; // . "&INVNUM=" . $order->code;
231
-
232
- //if billing cycles are defined
233
- if(!empty($order->TotalBillingCycles))
234
- $nvpStr .= "&TERM=" . $order->TotalBillingCycles;
235
- else
236
- $nvpStr .= "&TERM=0";
237
-
238
- if(!empty($order->accountnumber))
239
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
240
-
241
- /*
242
- Let's figure out the start date. There are two parts.
243
- 1. We need to add the billing period to the start date to account for the initial payment.
244
- 2. We can allow for free trials by further delaying the start date of the subscription.
245
- */
246
- if($order->BillingPeriod == "Year")
247
- $trial_period_days = $order->BillingFrequency * 365; //annual
248
- elseif($order->BillingPeriod == "Day")
249
- $trial_period_days = $order->BillingFrequency * 1; //daily
250
- elseif($order->BillingPeriod == "Week")
251
- $trial_period_days = $order->BillingFrequency * 7; //weekly
252
- else
253
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
254
-
255
- //convert to a profile start date
256
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
257
-
258
- //filter the start date
259
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
260
-
261
- //convert back to days
262
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
263
-
264
- //now add the actual trial set by the site
265
- if(!empty($order->TrialBillingCycles))
266
- {
267
- $trialOccurrences = (int)$order->TrialBillingCycles;
268
- if($order->BillingPeriod == "Year")
269
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
270
- elseif($order->BillingPeriod == "Day")
271
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
272
- elseif($order->BillingPeriod == "Week")
273
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
274
- else
275
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
276
- }
277
-
278
- //convert back into a date
279
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
280
-
281
- //start date
282
- $nvpStr .= "&START=" . date("mdY", strtotime($order->ProfileStartDate));
283
-
284
- if(!empty($order->accountnumber))
285
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
286
-
287
- //billing address, etc
288
- if($order->Address1)
289
- {
290
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
291
-
292
- if($order->Address2)
293
- $nvpStr .= " " . $order->Address2;
294
-
295
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
296
- }
297
-
298
- $this->nvpStr = $nvpStr;
299
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
300
-
301
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
302
- $order->subscription_transaction_id = $this->httpParsedResponseAr['PROFILEID'];
303
- $order->status = "success";
304
- return true;
305
- } else {
306
- $order->status = "error";
307
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
308
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
309
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
310
- return false;
311
- }
312
- }
313
-
314
- function update(&$order)
315
- {
316
- $order->getMembershipLevel();
317
-
318
- //paypal profile stuff
319
- $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=M";
320
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
321
-
322
- $nvpStr .= "&PROFILENAME=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
323
-
324
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR']; // . "&INVNUM=" . $order->code;
325
-
326
- if(!empty($order->accountnumber))
327
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
328
-
329
- //billing address, etc
330
- if($order->Address1)
331
- {
332
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
333
-
334
- if($order->Address2)
335
- $nvpStr .= " " . $order->Address2;
336
-
337
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
338
- }
339
-
340
- $this->nvpStr = $nvpStr;
341
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
342
-
343
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
344
- $order->subscription_transaction_id = $this->httpParsedResponseAr['PROFILEID'];
345
- $order->updateStatus("success");
346
- return true;
347
- } else {
348
- $order->status = "error";
349
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
350
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
351
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
352
- return false;
353
- }
354
- }
355
-
356
- function cancel(&$order)
357
- {
358
- //require a subscription id
359
- if(empty($order->subscription_transaction_id))
360
- return false;
361
-
362
- //paypal profile stuff
363
- $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=C";
364
-
365
- $this->nvpStr = $nvpStr;
366
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
367
-
368
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"]))
369
- {
370
- $order->updateStatus("cancelled");
371
- return true;
372
- }
373
- else
374
- {
375
- $order->status = "error";
376
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
377
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
378
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
379
- return false;
380
- }
381
- }
382
-
383
- /**
384
- * PAYPAL Function
385
- * Send HTTP POST Request
386
- *
387
- * @param string The API method name
388
- * @param string The POST Message fields in &name=value pair format
389
- * @return array Parsed HTTP Response body
390
- */
391
- function PPHttpPost($methodName_, $nvpStr_) {
392
- global $gateway_environment;
393
- $environment = $gateway_environment;
394
-
395
- $PARTNER = pmpro_getOption("payflow_partner");
396
- $VENDOR = pmpro_getOption("payflow_vendor");
397
- $USER = pmpro_getOption("payflow_user");
398
- $PWD = pmpro_getOption("payflow_pwd");
399
- $API_Endpoint = "https://payflowpro.paypal.com";
400
- if("sandbox" === $environment || "beta-sandbox" === $environment) {
401
- $API_Endpoint = "https://pilot-payflowpro.paypal.com";
402
- }
403
-
404
- $version = urlencode('4');
405
-
406
- // setting the curl parameters.
407
- $ch = curl_init();
408
- curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
409
- curl_setopt($ch, CURLOPT_VERBOSE, 1);
410
-
411
- // turning off the server and peer verification(TrustManager Concept).
412
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
413
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
414
-
415
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
416
- curl_setopt($ch, CURLOPT_POST, 1);
417
-
418
- // NVPRequest for submitting to server
419
- $nvpreq = "TRXTYPE=" . $methodName_ . "&TENDER=C&PARTNER=" . $PARTNER . "&VENDOR=" . $VENDOR . "&USER=" . $USER . "&PWD=" . $PWD . "&VERBOSITY=medium" . $nvpStr_;
420
-
421
- // setting the nvpreq as POST FIELD to curl
422
- curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
423
-
424
- // getting response from server
425
- $httpResponse = curl_exec($ch);
426
-
427
- if(empty($httpResponse)) {
428
- exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
429
- }
430
-
431
- // Extract the RefundTransaction response details
432
- $httpResponseAr = explode("&", $httpResponse);
433
-
434
- $httpParsedResponseAr = array();
435
- foreach ($httpResponseAr as $i => $value) {
436
- $tmpAr = explode("=", $value);
437
- if(sizeof($tmpAr) > 1) {
438
- $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
439
- }
440
- }
441
-
442
- if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('RESULT', $httpParsedResponseAr)) {
443
- exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
444
- }
445
-
446
- return $httpParsedResponseAr;
447
- }
448
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_paypal.php CHANGED
@@ -17,14 +17,14 @@
17
  if($authorization_id)
18
  {
19
  $this->void($order, $authorization_id);
20
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
- if(empty($order->error))
27
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
28
  return false;
29
  }
30
  }
@@ -32,29 +32,29 @@
32
  {
33
  //charge first payment
34
  if($this->charge($order))
35
- {
36
  //setup recurring billing
37
  if(pmpro_isLevelRecurring($order->membership_level))
38
  {
39
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
40
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
  if($this->subscribe($order))
42
- {
43
  return true;
44
  }
45
  else
46
- {
47
  if($this->refund($order, $order->payment_transaction_id))
48
  {
49
- if(empty($order->error))
50
- $order->error = __("Unknown error: Payment failed.", "pmpro");
51
  }
52
  else
53
  {
54
- if(empty($order->error))
55
  $order->error = "Unknown error: Payment failed.";
56
 
57
- $order->error .= " " . __("A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.", "pmpro");
58
  }
59
 
60
  return false;
@@ -73,7 +73,7 @@
73
 
74
  function authorize(&$order)
75
  {
76
- if(empty($order->code))
77
  $order->code = $order->getRandomCode();
78
 
79
  //paypal profile stuff
@@ -81,7 +81,7 @@
81
  if(!empty($order->Token))
82
  $nvpStr .= "&TOKEN=" . $order->Token;
83
  $nvpStr .="&AMT=1.00&CURRENCYCODE=" . pmpro_getOption("currency");
84
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
85
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
86
 
87
  $nvpStr .= "&PAYMENTACTION=Authorization&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -92,15 +92,15 @@
92
  else
93
  $cardtype = $order->cardtype;
94
 
95
- if(!empty($cardtype))
96
  $nvpStr .= "&CREDITCARDTYPE=" . $cardtype . "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->ExpirationDate . "&CVV2=" . $order->CVV2;
97
 
98
  //Maestro/Solo card fields. (Who uses these?) :)
99
- if(!empty($order->StartDate))
100
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
101
 
102
  //billing address, etc
103
- if(!empty($order->Address1))
104
  {
105
  $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
106
 
@@ -158,7 +158,7 @@
158
  $nvpStr="&TRANSACTIONID=" . $transaction_id . "&NOTE=Refunding a charge.";
159
 
160
  $this->httpParsedResponseAr = $this->PPHttpPost('RefundTransaction', $nvpStr);
161
-
162
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
163
  return true;
164
  } else {
@@ -188,7 +188,7 @@
188
  if(!empty($order->Token))
189
  $nvpStr .= "&TOKEN=" . $order->Token;
190
  $nvpStr .="&AMT=" . $amount . "&ITEMAMT=" . $order->InitialPayment . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency;
191
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
192
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
193
 
194
  $nvpStr .= "&PAYMENTACTION=Sale&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
@@ -218,10 +218,10 @@
218
  }
219
 
220
  $this->httpParsedResponseAr = $this->PPHttpPost('DoDirectPayment', $nvpStr);
221
-
222
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
223
  $order->payment_transaction_id = $this->httpParsedResponseAr['TRANSACTIONID'];
224
- $order->updateStatus("success");
225
  return true;
226
  } else {
227
  $order->status = "error";
@@ -235,16 +235,14 @@
235
  function subscribe(&$order)
236
  {
237
  global $pmpro_currency;
238
-
239
  if(empty($order->code))
240
  $order->code = $order->getRandomCode();
241
 
242
- //filter order before subscription. use with care.
243
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
244
-
245
  //taxes on the amount
246
  $amount = $order->PaymentAmount;
247
- $amount_tax = $order->getTaxForPrice($amount);
 
248
  $amount = round((float)$amount + (float)$amount_tax, 2);
249
 
250
  //paypal profile stuff
@@ -254,23 +252,23 @@
254
  $nvpStr .="&AMT=" . $order->PaymentAmount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
255
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
256
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
257
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
258
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
259
 
260
  //if billing cycles are defined
261
- if(!empty($order->TotalBillingCycles))
262
  $nvpStr .= "&TOTALBILLINGCYCLES=" . $order->TotalBillingCycles;
263
 
264
  //if a trial period is defined
265
- if(!empty($order->TrialBillingPeriod))
266
  {
267
- $trial_amount = $order->TrialAmount;
268
  $trial_tax = $order->getTaxForPrice($trial_amount);
269
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
270
 
271
- $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
272
  }
273
- if(!empty($order->TrialBillingCycles))
274
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
275
 
276
  //credit card fields
@@ -283,7 +281,7 @@
283
  $nvpStr .= "&CREDITCARDTYPE=" . $cardtype . "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->ExpirationDate . "&CVV2=" . $order->CVV2;
284
 
285
  //Maestro/Solo card fields. (Who uses these?) :)
286
- if(!empty($order->StartDate))
287
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
288
 
289
  //billing address, etc
@@ -299,7 +297,7 @@
299
 
300
  //for debugging let's add this to the class object
301
  $this->nvpStr = $nvpStr;
302
-
303
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
304
 
305
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
@@ -369,23 +367,21 @@
369
  {
370
  //paypal profile stuff
371
  $nvpStr = "";
372
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
373
 
374
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
375
 
376
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
377
- {
378
  $order->updateStatus("cancelled");
379
- return true;
380
- }
381
- else
382
- {
383
  $order->status = "error";
384
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
385
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
386
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
387
-
388
- return false;
389
  }
390
  }
391
 
@@ -432,7 +428,7 @@
432
  // getting response from server
433
  $httpResponse = curl_exec($ch);
434
 
435
- if(empty($httpResponse)) {
436
  exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
437
  }
438
 
@@ -453,4 +449,5 @@
453
 
454
  return $httpParsedResponseAr;
455
  }
456
- }
 
17
  if($authorization_id)
18
  {
19
  $this->void($order, $authorization_id);
20
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
+ if(!$order->error)
27
+ $order->error = "Unknown error: Authorization failed.";
28
  return false;
29
  }
30
  }
32
  {
33
  //charge first payment
34
  if($this->charge($order))
35
+ {
36
  //setup recurring billing
37
  if(pmpro_isLevelRecurring($order->membership_level))
38
  {
39
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
40
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
  if($this->subscribe($order))
42
+ {
43
  return true;
44
  }
45
  else
46
+ {
47
  if($this->refund($order, $order->payment_transaction_id))
48
  {
49
+ if(!$order->error)
50
+ $order->error = "Unknown error: Payment failed.";
51
  }
52
  else
53
  {
54
+ if(!$order->error)
55
  $order->error = "Unknown error: Payment failed.";
56
 
57
+ $order->error .= " A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.";
58
  }
59
 
60
  return false;
73
 
74
  function authorize(&$order)
75
  {
76
+ if(!$order->code)
77
  $order->code = $order->getRandomCode();
78
 
79
  //paypal profile stuff
81
  if(!empty($order->Token))
82
  $nvpStr .= "&TOKEN=" . $order->Token;
83
  $nvpStr .="&AMT=1.00&CURRENCYCODE=" . pmpro_getOption("currency");
84
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
85
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
86
 
87
  $nvpStr .= "&PAYMENTACTION=Authorization&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
92
  else
93
  $cardtype = $order->cardtype;
94
 
95
+ if($cardtype)
96
  $nvpStr .= "&CREDITCARDTYPE=" . $cardtype . "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->ExpirationDate . "&CVV2=" . $order->CVV2;
97
 
98
  //Maestro/Solo card fields. (Who uses these?) :)
99
+ if($order->StartDate)
100
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
101
 
102
  //billing address, etc
103
+ if($order->Address1)
104
  {
105
  $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
106
 
158
  $nvpStr="&TRANSACTIONID=" . $transaction_id . "&NOTE=Refunding a charge.";
159
 
160
  $this->httpParsedResponseAr = $this->PPHttpPost('RefundTransaction', $nvpStr);
161
+
162
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
163
  return true;
164
  } else {
188
  if(!empty($order->Token))
189
  $nvpStr .= "&TOKEN=" . $order->Token;
190
  $nvpStr .="&AMT=" . $amount . "&ITEMAMT=" . $order->InitialPayment . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency;
191
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
192
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
193
 
194
  $nvpStr .= "&PAYMENTACTION=Sale&IPADDRESS=" . $_SERVER['REMOTE_ADDR'] . "&INVNUM=" . $order->code;
218
  }
219
 
220
  $this->httpParsedResponseAr = $this->PPHttpPost('DoDirectPayment', $nvpStr);
221
+
222
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
223
  $order->payment_transaction_id = $this->httpParsedResponseAr['TRANSACTIONID'];
224
+ $order->updateStatus("firstpayment");
225
  return true;
226
  } else {
227
  $order->status = "error";
235
  function subscribe(&$order)
236
  {
237
  global $pmpro_currency;
238
+
239
  if(empty($order->code))
240
  $order->code = $order->getRandomCode();
241
 
 
 
 
242
  //taxes on the amount
243
  $amount = $order->PaymentAmount;
244
+ $amount_tax = $order->getTaxForPrice($amount);
245
+ $order->subtotal = $amount;
246
  $amount = round((float)$amount + (float)$amount_tax, 2);
247
 
248
  //paypal profile stuff
252
  $nvpStr .="&AMT=" . $order->PaymentAmount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
253
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
254
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
255
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
256
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
257
 
258
  //if billing cycles are defined
259
+ if($order->TotalBillingCycles)
260
  $nvpStr .= "&TOTALBILLINGCYCLES=" . $order->TotalBillingCycles;
261
 
262
  //if a trial period is defined
263
+ if($order->TrialBillingPeriod)
264
  {
265
+ $trial_amount = $order->TrialAmount;
266
  $trial_tax = $order->getTaxForPrice($trial_amount);
267
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
268
 
269
+ $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMNT=" . $trial_amount;
270
  }
271
+ if($order->TrialBillingCycles)
272
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
273
 
274
  //credit card fields
281
  $nvpStr .= "&CREDITCARDTYPE=" . $cardtype . "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->ExpirationDate . "&CVV2=" . $order->CVV2;
282
 
283
  //Maestro/Solo card fields. (Who uses these?) :)
284
+ if($order->StartDate)
285
  $nvpStr .= "&STARTDATE=" . $order->StartDate . "&ISSUENUMBER=" . $order->IssueNumber;
286
 
287
  //billing address, etc
297
 
298
  //for debugging let's add this to the class object
299
  $this->nvpStr = $nvpStr;
300
+
301
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
302
 
303
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
367
  {
368
  //paypal profile stuff
369
  $nvpStr = "";
370
+ $nvpStr .= "&PROFILEID=" . $order->subscription_transaction_id . "&ACTION=Cancel&NOTE=User requested cancel.";
371
 
372
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
373
 
374
+ if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]) || $this->httpParsedResponseAr['L_ERRORCODE0'] == "11556") {
 
375
  $order->updateStatus("cancelled");
376
+ return true;
377
+ //exit('CreateRecurringPaymentsProfile Completed Successfully: '.print_r($this->httpParsedResponseAr, true));
378
+ } else {
 
379
  $order->status = "error";
380
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
381
+ $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
382
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
383
+ return false;
384
+ //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
385
  }
386
  }
387
 
428
  // getting response from server
429
  $httpResponse = curl_exec($ch);
430
 
431
+ if(!$httpResponse) {
432
  exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
433
  }
434
 
449
 
450
  return $httpParsedResponseAr;
451
  }
452
+ }
453
+ ?>
classes/gateways/class.pmprogateway_paypalexpress.php CHANGED
@@ -9,10 +9,10 @@
9
  }
10
 
11
  function process(&$order)
12
- {
13
  if(pmpro_isLevelRecurring($order->membership_level))
14
  {
15
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
16
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
17
  return $this->subscribe($order);
18
  }
@@ -40,20 +40,17 @@
40
 
41
  //taxes on the amount
42
  $amount = $order->PaymentAmount;
43
- $amount_tax = $order->getTaxForPrice($amount);
44
  $order->subtotal = $amount;
45
  $amount = round((float)$amount + (float)$amount_tax, 2);
46
 
47
  //paypal profile stuff
48
  $nvpStr = "";
49
- $nvpStr .="&AMT=" . $initial_payment . "&CURRENCYCODE=" . $pmpro_currency;
50
- if(!empty($order->ProfileStartDate) && strtotime($order->ProfileStartDate, current_time("timestamp")) > 0)
51
- $nvpStr .= "&PROFILESTARTDATE=" . $order->ProfileStartDate;
52
- if(!empty($order->BillingFrequency))
53
- $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling&L_BILLINGTYPE0=RecurringPayments";
54
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
55
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
56
- $nvpStr .= "&NOSHIPPING=1&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
57
 
58
  //if billing cycles are defined
59
  if(!empty($order->TotalBillingCycles))
@@ -66,7 +63,7 @@
66
  $trial_tax = $order->getTaxForPrice($trial_amount);
67
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
68
 
69
- $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
70
  }
71
  if(!empty($order->TrialBillingCycles))
72
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
@@ -88,16 +85,7 @@
88
  }
89
 
90
  $nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
91
-
92
- $account_optional = apply_filters('pmpro_paypal_account_optional', true);
93
- if ($account_optional)
94
- $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
95
-
96
- $nvpStr = apply_filters("pmpro_set_express_checkout_nvpstr", $nvpStr, $order);
97
-
98
- ///echo str_replace("&", "&<br />", $nvpStr);
99
- ///exit;
100
-
101
  $this->httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $nvpStr);
102
 
103
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
@@ -178,25 +166,20 @@
178
  $nvpStr = "";
179
  if(!empty($order->Token))
180
  $nvpStr .= "&TOKEN=" . $order->Token;
181
- $nvpStr .="&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency;
182
- /*
183
- if(!empty($amount_tax))
184
- $nvpStr .= "&TAXAMT=" . $amount_tax;
185
- */
186
- if(!empty($order->BillingFrequency))
187
- $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
188
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
189
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
190
  $nvpStr .= "&NOSHIPPING=1";
191
 
192
  $nvpStr .= "&PAYERID=" . $_SESSION['payer_id'] . "&PAYMENTACTION=sale";
193
  $order->nvpStr = $nvpStr;
194
 
195
  $this->httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $nvpStr);
196
-
197
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
198
- $order->payment_transaction_id = urldecode($this->httpParsedResponseAr['TRANSACTIONID']);
199
- $order->status = "success";
200
 
201
  //update order
202
  $order->saveOrder();
@@ -213,15 +196,12 @@
213
  }
214
 
215
  function subscribe(&$order)
216
- {
217
  global $pmpro_currency;
218
 
219
  if(empty($order->code))
220
  $order->code = $order->getRandomCode();
221
-
222
- //filter order before subscription. use with care.
223
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
224
-
225
  //taxes on initial amount
226
  $initial_payment = $order->InitialPayment;
227
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
@@ -229,18 +209,17 @@
229
 
230
  //taxes on the amount
231
  $amount = $order->PaymentAmount;
232
- $amount_tax = $order->getTaxForPrice($amount);
233
- //$amount = round((float)$amount + (float)$amount_tax, 2);
 
234
 
235
  //paypal profile stuff
236
  $nvpStr = "";
237
  if(!empty($order->Token))
238
  $nvpStr .= "&TOKEN=" . $order->Token;
239
- $nvpStr .="&INITAMT=" . $initial_payment . "&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
240
- if(!empty($amount_tax))
241
- $nvpStr .= "&TAXAMT=" . $amount_tax;
242
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
243
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
244
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
245
 
246
  //if billing cycles are defined
@@ -248,22 +227,19 @@
248
  $nvpStr .= "&TOTALBILLINGCYCLES=" . $order->TotalBillingCycles;
249
 
250
  //if a trial period is defined
251
- if(!empty($order->TrialBillingPeriod))
252
  {
253
  $trial_amount = $order->TrialAmount;
254
  $trial_tax = $order->getTaxForPrice($trial_amount);
255
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
256
 
257
- $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
258
  }
259
- if(!empty($order->TrialBillingCycles))
260
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
261
 
262
  $this->nvpStr = $nvpStr;
263
-
264
- ///echo str_replace("&", "&<br />", $nvpStr);
265
- ///exit;
266
-
267
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
268
 
269
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
@@ -289,51 +265,23 @@
289
  {
290
  //paypal profile stuff
291
  $nvpStr = "";
292
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
293
 
294
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
295
-
296
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
297
- {
298
  $order->updateStatus("cancelled");
299
- return true;
300
- }
301
- else
302
- {
303
  $order->status = "error";
304
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
305
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
306
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
307
 
308
- return false;
309
- }
310
- }
311
-
312
- function getSubscriptionStatus(&$order)
313
- {
314
- if(empty($order->subscription_transaction_id))
315
  return false;
316
-
317
- //paypal profile stuff
318
- $nvpStr = "";
319
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id);
320
-
321
- $this->httpParsedResponseAr = $this->PPHttpPost('GetRecurringPaymentsProfileDetails', $nvpStr);
322
-
323
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
324
- {
325
- return $this->httpParsedResponseAr;
326
- }
327
- else
328
- {
329
- $order->status = "error";
330
- $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
331
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
332
- $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
333
-
334
- return false;
335
  }
336
- }
337
 
338
  /**
339
  * PAYPAL Function
@@ -400,3 +348,4 @@
400
  return $httpParsedResponseAr;
401
  }
402
  }
 
9
  }
10
 
11
  function process(&$order)
12
+ {
13
  if(pmpro_isLevelRecurring($order->membership_level))
14
  {
15
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
16
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
17
  return $this->subscribe($order);
18
  }
40
 
41
  //taxes on the amount
42
  $amount = $order->PaymentAmount;
43
+ $amount_tax = $order->getTaxForPrice($amount);
44
  $order->subtotal = $amount;
45
  $amount = round((float)$amount + (float)$amount_tax, 2);
46
 
47
  //paypal profile stuff
48
  $nvpStr = "";
49
+ $nvpStr .="&AMT=" . $initial_payment . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
50
+ $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
 
 
 
51
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
52
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
53
+ $nvpStr .= "&NOSHIPPING=1&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
54
 
55
  //if billing cycles are defined
56
  if(!empty($order->TotalBillingCycles))
63
  $trial_tax = $order->getTaxForPrice($trial_amount);
64
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
65
 
66
+ $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMNT=" . $trial_amount;
67
  }
68
  if(!empty($order->TrialBillingCycles))
69
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
85
  }
86
 
87
  $nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
88
+
 
 
 
 
 
 
 
 
 
89
  $this->httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $nvpStr);
90
 
91
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
166
  $nvpStr = "";
167
  if(!empty($order->Token))
168
  $nvpStr .= "&TOKEN=" . $order->Token;
169
+ $nvpStr .="&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
170
+ $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
 
 
 
 
 
171
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
172
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
173
  $nvpStr .= "&NOSHIPPING=1";
174
 
175
  $nvpStr .= "&PAYERID=" . $_SESSION['payer_id'] . "&PAYMENTACTION=sale";
176
  $order->nvpStr = $nvpStr;
177
 
178
  $this->httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $nvpStr);
179
+
180
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
181
+ $order->payment_transaction_id = urldecode($this->httpParsedResponseAr['PROFILEID']);
182
+ $order->status = "firstpayment";
183
 
184
  //update order
185
  $order->saveOrder();
196
  }
197
 
198
  function subscribe(&$order)
199
+ {
200
  global $pmpro_currency;
201
 
202
  if(empty($order->code))
203
  $order->code = $order->getRandomCode();
204
+
 
 
 
205
  //taxes on initial amount
206
  $initial_payment = $order->InitialPayment;
207
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
209
 
210
  //taxes on the amount
211
  $amount = $order->PaymentAmount;
212
+ $amount_tax = $order->getTaxForPrice($amount);
213
+ $order->subtotal = $amount;
214
+ $amount = round((float)$amount + (float)$amount_tax, 2);
215
 
216
  //paypal profile stuff
217
  $nvpStr = "";
218
  if(!empty($order->Token))
219
  $nvpStr .= "&TOKEN=" . $order->Token;
220
+ $nvpStr .="&INITAMT=" . $initial_payment . "&AMT=" . $order->PaymentAmount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
 
 
221
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
222
+ $nvpStr .= "&NOTIFYURL=" . urlencode(PMPRO_URL . "/services/ipnhandler.php");
223
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
224
 
225
  //if billing cycles are defined
227
  $nvpStr .= "&TOTALBILLINGCYCLES=" . $order->TotalBillingCycles;
228
 
229
  //if a trial period is defined
230
+ if($order->TrialBillingPeriod)
231
  {
232
  $trial_amount = $order->TrialAmount;
233
  $trial_tax = $order->getTaxForPrice($trial_amount);
234
  $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
235
 
236
+ $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMNT=" . $trial_amount;
237
  }
238
+ if($order->TrialBillingCycles)
239
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
240
 
241
  $this->nvpStr = $nvpStr;
242
+
 
 
 
243
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
244
 
245
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
265
  {
266
  //paypal profile stuff
267
  $nvpStr = "";
268
+ $nvpStr .= "&PROFILEID=" . $order->subscription_transaction_id . "&ACTION=Cancel&NOTE=User requested cancel.";
269
 
270
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
271
+ if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]) || $this->httpParsedResponseAr['L_ERRORCODE0'] == "11556") {
 
 
272
  $order->updateStatus("cancelled");
273
+ return true;
274
+ //exit('CreateRecurringPaymentsProfile Completed Successfully: '.print_r($this->httpParsedResponseAr, true));
275
+ } else {
 
276
  $order->status = "error";
277
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
278
+ $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
279
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
280
 
 
 
 
 
 
 
 
281
  return false;
282
+ //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  }
284
+ }
285
 
286
  /**
287
  * PAYPAL Function
348
  return $httpParsedResponseAr;
349
  }
350
  }
351
+ ?>
classes/gateways/class.pmprogateway_paypalstandard.php DELETED
@@ -1,302 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- class PMProGateway_paypalstandard
4
- {
5
- function PMProGateway_paypalstandard($gateway = NULL)
6
- {
7
- $this->gateway = $gateway;
8
- return $this->gateway;
9
- }
10
-
11
- function process(&$order)
12
- {
13
- if(empty($order->code))
14
- $order->code = $order->getRandomCode();
15
-
16
- //clean up a couple values
17
- $order->payment_type = "PayPal Standard";
18
- $order->CardType = "";
19
- $order->cardtype = "";
20
-
21
- //just save, the user will go to PayPal to pay
22
- $order->status = "review";
23
- $order->saveOrder();
24
-
25
- return true;
26
- }
27
-
28
- function sendToPayPal(&$order)
29
- {
30
- global $pmpro_currency;
31
-
32
- //taxes on initial amount
33
- $initial_payment = $order->InitialPayment;
34
- $initial_payment_tax = $order->getTaxForPrice($initial_payment);
35
- $initial_payment = round((float)$initial_payment + (float)$initial_payment_tax, 2);
36
-
37
- //taxes on the amount
38
- $amount = $order->PaymentAmount;
39
- $amount_tax = $order->getTaxForPrice($amount);
40
- $order->subtotal = $amount;
41
- $amount = round((float)$amount + (float)$amount_tax, 2);
42
-
43
- //build PayPal Redirect
44
- $environment = pmpro_getOption("gateway_environment");
45
- if("sandbox" === $environment || "beta-sandbox" === $environment)
46
- $paypal_url ="https://www.sandbox.paypal.com/cgi-bin/webscr?business=" . urlencode(pmpro_getOption("gateway_email"));
47
- else
48
- $paypal_url = "https://www.paypal.com/cgi-bin/webscr?business=" . urlencode(pmpro_getOption("gateway_email"));
49
-
50
- if(pmpro_isLevelRecurring($order->membership_level))
51
- {
52
- //convert billing period
53
- if($order->BillingPeriod == "Day")
54
- $period = "D";
55
- elseif($order->BillingPeriod == "Week")
56
- $period = "W";
57
- elseif($order->BillingPeriod == "Month")
58
- $period = "M";
59
- elseif($order->BillingPeriod == "Year")
60
- $period = "Y";
61
- else
62
- {
63
- $order->error = "Invalid billing period: " . $order->BillingPeriod;
64
- $order->shorterror = "Invalid billing period: " . $order->BillingPeriod;
65
- return false;
66
- }
67
-
68
- //other args
69
- $paypal_args = array(
70
- 'cmd' => '_xclick-subscriptions',
71
- 'a1' => number_format($initial_payment, 2),
72
- 'p1' => $order->BillingFrequency,
73
- 't1' => $period,
74
- 'a3' => number_format($amount, 2),
75
- 'p3' => $order->BillingFrequency,
76
- 't3' => $period,
77
- 'item_name' => substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127),
78
- 'email' => $order->Email,
79
- 'no_shipping' => '1',
80
- 'shipping' => '0',
81
- 'no_note' => '1',
82
- 'currency_code' => $pmpro_currency,
83
- 'item_number' => $order->code,
84
- 'charset' => get_bloginfo( 'charset' ),
85
- 'rm' => '2',
86
- 'return' => pmpro_url("confirmation", "?level=" . $order->membership_level->id),
87
- 'notify_url' => admin_url("admin-ajax.php") . "?action=ipnhandler",
88
- 'src' => '1',
89
- 'sra' => '1'
90
- );
91
-
92
- //trial?
93
- /*
94
- Note here that the TrialBillingCycles value is being ignored. PayPal Standard only offers 1 payment during each trial period.
95
- */
96
- if(!empty($order->TrialBillingPeriod))
97
- {
98
- //if a1 and a2 are 0, let's just combine them. PayPal doesn't like a2 = 0.
99
- if($paypal_args['a1'] == 0 && $order->TrialAmount == 0)
100
- {
101
- $paypal_args['p1'] = $paypal_args['p1'] + $order->TrialBillingFrequency;
102
- }
103
- else
104
- {
105
- $trial_amount = $order->TrialAmount;
106
- $trial_tax = $order->getTaxForPrice($trial_amount);
107
- $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
108
-
109
- $paypal_args['a2'] = $trial_amount;
110
- $paypal_args['p2'] = $order->TrialBillingFrequency;
111
- $paypal_args['t2'] = $period;
112
- }
113
- }
114
- else
115
- {
116
- //we can try to work in any change in ProfileStartDate
117
- $psd = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
118
- $adjusted_psd = apply_filters("pmpro_profile_start_date", $psd, $order);
119
- if($psd != $adjusted_psd)
120
- {
121
- //someone is trying to push the start date back
122
- $adjusted_psd_time = strtotime($adjusted_psd, current_time("timestamp"));
123
- $seconds_til_psd = $adjusted_psd_time - current_time('timestamp');
124
- $days_til_psd = floor($seconds_til_psd/(60*60*24));
125
-
126
- //push back trial one by days_til_psd
127
- if($days_til_psd > 90)
128
- {
129
- //we need to convert to weeks, because PayPal limits t1 to 90 days
130
- $weeks_til_psd = round($days_til_psd / 7);
131
- $paypal_args['p1'] = $weeks_til_psd;
132
- $paypal_args['t1'] = "W";
133
- }
134
- elseif($days_til_psd > 0)
135
- {
136
- //use days
137
- $paypal_args['p1'] = $days_til_psd;
138
- $paypal_args['t1'] = "D";
139
- }
140
- }
141
- }
142
-
143
- //billing limit?
144
- if(!empty($order->TotalBillingCycles))
145
- {
146
- if(!empty($trial_amount))
147
- {
148
-
149
- $srt = intval($order->TotalBillingCycles) - 1; //subtract one for the trial period
150
- }
151
- else
152
- {
153
- $srt = intval($order->TotalBillingCycles);
154
- }
155
-
156
- //srt must be at least 2 or the subscription is not "recurring" according to paypal
157
- if($srt > 1)
158
- $paypal_args['srt'] = $srt;
159
- else
160
- $paypal_args['src'] = '0';
161
- }
162
- else
163
- $paypal_args['srt'] = '0'; //indefinite subscription
164
- }
165
- else
166
- {
167
- //other args
168
- $paypal_args = array(
169
- 'cmd' => '_xclick',
170
- 'amount' => number_format($initial_payment, 2),
171
- 'item_name' => substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127),
172
- 'email' => $order->Email,
173
- 'no_shipping' => '1',
174
- 'shipping' => '0',
175
- 'no_note' => '1',
176
- 'currency_code' => $pmpro_currency,
177
- 'item_number' => $order->code,
178
- 'charset' => get_bloginfo( 'charset' ),
179
- 'rm' => '2',
180
- 'return' => pmpro_url("confirmation", "?level=" . $order->membership_level->id),
181
- 'notify_url' => admin_url("admin-ajax.php") . "?action=ipnhandler"
182
- );
183
- }
184
-
185
- $nvpStr = "";
186
- foreach($paypal_args as $key => $value)
187
- {
188
- $nvpStr .= "&" . $key . "=" . urlencode($value);
189
- }
190
-
191
- //anything modders might add
192
- $additional_parameters = apply_filters("pmpro_paypal_express_return_url_parameters", array());
193
- if(!empty($additional_parameters))
194
- {
195
- foreach($additional_parameters as $key => $value)
196
- $nvpStr .= urlencode("&" . $key . "=" . $value);
197
- }
198
-
199
- $account_optional = apply_filters('pmpro_paypal_account_optional', true);
200
- if ($account_optional)
201
- $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
202
-
203
- $nvpStr = apply_filters("pmpro_paypal_standard_nvpstr", $nvpStr, $order);
204
-
205
- //redirect to paypal
206
- $paypal_url .= $nvpStr;
207
-
208
- //wp_die(str_replace("&", "<br />", $paypal_url));
209
-
210
- wp_redirect($paypal_url);
211
- exit;
212
- }
213
-
214
- function cancel(&$order)
215
- {
216
- //paypal profile stuff
217
- $nvpStr = "";
218
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
219
-
220
- $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
221
-
222
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
223
- {
224
- $order->updateStatus("cancelled");
225
- return true;
226
- }
227
- else
228
- {
229
- $order->status = "error";
230
- $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
231
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
232
- $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
233
-
234
- return false;
235
- }
236
- }
237
-
238
- /**
239
- * PAYPAL Function
240
- * Send HTTP POST Request
241
- *
242
- * @param string The API method name
243
- * @param string The POST Message fields in &name=value pair format
244
- * @return array Parsed HTTP Response body
245
- */
246
- function PPHttpPost($methodName_, $nvpStr_) {
247
- global $gateway_environment;
248
- $environment = $gateway_environment;
249
-
250
- $API_UserName = pmpro_getOption("apiusername");
251
- $API_Password = pmpro_getOption("apipassword");
252
- $API_Signature = pmpro_getOption("apisignature");
253
- $API_Endpoint = "https://api-3t.paypal.com/nvp";
254
- if("sandbox" === $environment || "beta-sandbox" === $environment) {
255
- $API_Endpoint = "https://api-3t.$environment.paypal.com/nvp";
256
- }
257
-
258
- $version = urlencode('72.0');
259
-
260
- // setting the curl parameters.
261
- $ch = curl_init();
262
- curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
263
- curl_setopt($ch, CURLOPT_VERBOSE, 1);
264
-
265
- // turning off the server and peer verification(TrustManager Concept).
266
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
267
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
268
-
269
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
270
- curl_setopt($ch, CURLOPT_POST, 1);
271
-
272
- // NVPRequest for submitting to server
273
- $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";
274
-
275
- // setting the nvpreq as POST FIELD to curl
276
- curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
277
-
278
- // getting response from server
279
- $httpResponse = curl_exec($ch);
280
-
281
- if(!$httpResponse) {
282
- exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
283
- }
284
-
285
- // Extract the RefundTransaction response details
286
- $httpResponseAr = explode("&", $httpResponse);
287
-
288
- $httpParsedResponseAr = array();
289
- foreach ($httpResponseAr as $i => $value) {
290
- $tmpAr = explode("=", $value);
291
- if(sizeof($tmpAr) > 1) {
292
- $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
293
- }
294
- }
295
-
296
- if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
297
- exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
298
- }
299
-
300
- return $httpParsedResponseAr;
301
- }
302
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_stripe.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
  require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("Stripe"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/Stripe/Stripe.php");
5
  class PMProGateway_stripe
6
  {
7
  function PMProGateway_stripe($gateway = NULL)
@@ -50,7 +49,7 @@
50
  else
51
  {
52
  if(empty($order->error))
53
- $order->error = __("Unknown error: Initial payment failed.", "pmpro");
54
  return false;
55
  }
56
  }
@@ -58,8 +57,6 @@
58
 
59
  function charge(&$order)
60
  {
61
- global $pmpro_currency;
62
-
63
  //create a code for the order
64
  if(empty($order->code))
65
  $order->code = $order->getRandomCode();
@@ -85,7 +82,7 @@
85
  {
86
  $response = Stripe_Charge::create(array(
87
  "amount" => $amount * 100, # amount in cents, again
88
- "currency" => $pmpro_currency,
89
  "customer" => $this->customer->id,
90
  "description" => "Order #" . $order->code . ", " . trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")"
91
  )
@@ -164,21 +161,13 @@
164
  //update the customer description and card
165
  if(!empty($order->stripeToken))
166
  {
167
- $name = trim($order->FirstName . " " . $order->LastName);
168
-
169
- if (empty($name))
170
- {
171
- $name = trim($current_user->first_name . " " . $current_user->last_name);
172
- }
173
-
174
- $this->customer->description = $name . " (" . $order->Email . ")";
175
- $this->customer->email = $order->Email;
176
  $this->customer->card = $order->stripeToken;
177
  $this->customer->save();
178
  }
179
 
180
  return $this->customer;
181
- }
182
  catch (Exception $e)
183
  {
184
  //assume no customer found
@@ -192,36 +181,17 @@
192
  {
193
  $this->customer = Stripe_Customer::create(array(
194
  "description" => trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")",
195
- "email" => $order->Email,
196
  "card" => $order->stripeToken
197
  ));
198
  }
199
  catch (Exception $e)
200
  {
201
- $order->error = __("Error creating customer record with Stripe:", "pmpro") . " " . $e->getMessage();
202
  $order->shorterror = $order->error;
203
  return false;
204
  }
205
-
206
- if(!empty($user_id))
207
- {
208
- //user logged in/etc
209
- update_user_meta($user_id, "pmpro_stripe_customerid", $this->customer->id);
210
- }
211
- else
212
- {
213
- //user not registered yet, queue it up
214
- global $pmpro_stripe_customer_id;
215
- $pmpro_stripe_customer_id = $this->customer->id;
216
- function pmpro_user_register_stripe_customerid($user_id)
217
- {
218
- global $pmpro_stripe_customer_id;
219
- update_user_meta($user_id, "pmpro_stripe_customerid", $pmpro_stripe_customer_id);
220
- }
221
- add_action("user_register", "pmpro_user_register_stripe_customerid");
222
- }
223
-
224
- return apply_filters('pmpro_stripe_create_customer', $this->customer);
225
  }
226
 
227
  return false;
@@ -229,15 +199,10 @@
229
 
230
  function subscribe(&$order)
231
  {
232
- global $pmpro_currency;
233
-
234
  //create a code for the order
235
  if(empty($order->code))
236
  $order->code = $order->getRandomCode();
237
 
238
- //filter order before subscription. use with care.
239
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
240
-
241
  //setup customer
242
  $this->getCustomer($order);
243
  if(empty($this->customer))
@@ -245,67 +210,40 @@
245
 
246
  //figure out the amounts
247
  $amount = $order->PaymentAmount;
248
- $amount_tax = $order->getTaxForPrice($amount);
 
249
  $amount = round((float)$amount + (float)$amount_tax, 2);
250
 
251
- /*
252
- There are two parts to the trial. Part 1 is simply the delay until the first payment
253
- since we are doing the first payment as a separate transaction.
254
- The second part is the actual "trial" set by the admin.
255
-
256
- Stripe only supports Year or Month for billing periods, but we account for Days and Weeks just in case.
257
- */
258
  //figure out the trial length (first payment handled by initial charge)
259
  if($order->BillingPeriod == "Year")
260
- $trial_period_days = $order->BillingFrequency * 365; //annual
261
- elseif($order->BillingPeriod == "Day")
262
- $trial_period_days = $order->BillingFrequency * 1; //daily
263
- elseif($order->BillingPeriod == "Week")
264
- $trial_period_days = $order->BillingFrequency * 7; //weekly
265
  else
266
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
267
 
268
  //convert to a profile start date
269
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
270
 
271
  //filter the start date
272
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
273
 
274
  //convert back to days
275
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time("timestamp")) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
276
 
277
- //now add the actual trial set by the site
278
- if(!empty($order->TrialBillingCycles))
279
- {
280
- $trialOccurrences = (int)$order->TrialBillingCycles;
281
- if($order->BillingPeriod == "Year")
282
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
283
- elseif($order->BillingPeriod == "Day")
284
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
285
- elseif($order->BillingPeriod == "Week")
286
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
287
- else
288
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
289
- }
290
-
291
  //create a plan
292
  try
293
- {
294
- $plan = array(
295
- "amount" => $amount * 100,
296
- "interval_count" => $order->BillingFrequency,
297
- "interval" => strtolower($order->BillingPeriod),
298
- "trial_period_days" => $trial_period_days,
299
- "name" => $order->membership_name . " for order " . $order->code,
300
- "currency" => strtolower($pmpro_currency),
301
- "id" => $order->code
302
- );
303
-
304
- $plan = Stripe_Plan::create(apply_filters('pmpro_stripe_create_plan_array', $plan));
305
  }
306
  catch (Exception $e)
307
  {
308
- $order->error = __("Error creating plan with Stripe:", "pmpro") . $e->getMessage();
309
  $order->shorterror = $order->error;
310
  return false;
311
  }
@@ -321,7 +259,7 @@
321
  $plan->delete();
322
 
323
  //return error
324
- $order->error = __("Error subscribing customer to plan with Stripe:", "pmpro") . $e->getMessage();
325
  $order->shorterror = $order->error;
326
  return false;
327
  }
@@ -353,55 +291,26 @@
353
 
354
  function cancel(&$order)
355
  {
356
- //no matter what happens below, we're going to cancel the order in our system
357
- $order->updateStatus("cancelled");
358
-
359
  //require a subscription id
360
  if(empty($order->subscription_transaction_id))
361
  return false;
362
 
363
  //find the customer
364
- $this->getCustomer($order);
365
 
366
  if(!empty($this->customer))
367
  {
368
- //find subscription with this order code
369
- $subscriptions = $this->customer->subscriptions->all();
370
-
371
- if(!empty($subscriptions))
372
- {
373
- //in case only one is returned
374
- if(!is_array($subscriptions))
375
- $subscriptions = array($subscriptions);
376
-
377
- foreach($subscriptions as $sub)
378
- {
379
- if($sub->data[0]->plan->id == $order->code)
380
- {
381
- //found it, cancel it
382
- try
383
- {
384
- $this->customer->subscriptions->retrieve($sub->data[0]->id)->cancel();
385
- break;
386
- }
387
- catch(Exception $e)
388
- {
389
- $order->error = __("Could not cancel old subscription.", "pmpro");
390
- $order->shorterror = $order->error;
391
-
392
- return false;
393
- }
394
- }
395
- }
396
- }
397
-
398
  return true;
399
  }
400
  else
401
  {
402
- $order->error = __("Could not find the subscription.", "pmpro");
403
  $order->shorterror = $order->error;
404
  return false; //no customer found
405
  }
406
  }
407
- }
 
1
  <?php
2
  require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
+ require_once(dirname(__FILE__) . "/../../includes/lib/Stripe/Stripe.php");
 
4
  class PMProGateway_stripe
5
  {
6
  function PMProGateway_stripe($gateway = NULL)
49
  else
50
  {
51
  if(empty($order->error))
52
+ $order->error = "Unknown error: Initial payment failed.";
53
  return false;
54
  }
55
  }
57
 
58
  function charge(&$order)
59
  {
 
 
60
  //create a code for the order
61
  if(empty($order->code))
62
  $order->code = $order->getRandomCode();
82
  {
83
  $response = Stripe_Charge::create(array(
84
  "amount" => $amount * 100, # amount in cents, again
85
+ "currency" => strtolower(pmpro_getOption("currency")),
86
  "customer" => $this->customer->id,
87
  "description" => "Order #" . $order->code . ", " . trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")"
88
  )
161
  //update the customer description and card
162
  if(!empty($order->stripeToken))
163
  {
164
+ $this->customer->description = trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")";
 
 
 
 
 
 
 
 
165
  $this->customer->card = $order->stripeToken;
166
  $this->customer->save();
167
  }
168
 
169
  return $this->customer;
170
+ }
171
  catch (Exception $e)
172
  {
173
  //assume no customer found
181
  {
182
  $this->customer = Stripe_Customer::create(array(
183
  "description" => trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")",
 
184
  "card" => $order->stripeToken
185
  ));
186
  }
187
  catch (Exception $e)
188
  {
189
+ $order->error = "Error creating customer record with Stripe: " . $e->getMessage();
190
  $order->shorterror = $order->error;
191
  return false;
192
  }
193
+
194
+ return $this->customer;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  }
196
 
197
  return false;
199
 
200
  function subscribe(&$order)
201
  {
 
 
202
  //create a code for the order
203
  if(empty($order->code))
204
  $order->code = $order->getRandomCode();
205
 
 
 
 
206
  //setup customer
207
  $this->getCustomer($order);
208
  if(empty($this->customer))
210
 
211
  //figure out the amounts
212
  $amount = $order->PaymentAmount;
213
+ $amount_tax = $order->getTaxForPrice($amount);
214
+ $order->subtotal = $amount;
215
  $amount = round((float)$amount + (float)$amount_tax, 2);
216
 
 
 
 
 
 
 
 
217
  //figure out the trial length (first payment handled by initial charge)
218
  if($order->BillingPeriod == "Year")
219
+ $trial_period_days = 365; //annual
 
 
 
 
220
  else
221
+ $trial_period_days = 30; //assume monthly
222
 
223
  //convert to a profile start date
224
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day")) . "T0:0:0";
225
 
226
  //filter the start date
227
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
228
 
229
  //convert back to days
230
+ $trial_period_days = ceil(abs(strtotime(date("Y-m-d")) - strtotime($order->ProfileStartDate)) / 86400);
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  //create a plan
233
  try
234
+ {
235
+ $plan = Stripe_Plan::create(array(
236
+ "amount" => $amount * 100,
237
+ "interval" => strtolower($order->BillingPeriod),
238
+ "trial_period_days" => $trial_period_days,
239
+ "name" => $order->membership_name . " for order " . $order->code,
240
+ "currency" => strtolower(pmpro_getOption("currency")),
241
+ "id" => $order->code)
242
+ );
 
 
 
243
  }
244
  catch (Exception $e)
245
  {
246
+ $order->error = "Error creating plan with Stripe:" . $e->getMessage();
247
  $order->shorterror = $order->error;
248
  return false;
249
  }
259
  $plan->delete();
260
 
261
  //return error
262
+ $order->error = "Error subscribing customer to plan with Stripe:" . $e->getMessage();
263
  $order->shorterror = $order->error;
264
  return false;
265
  }
291
 
292
  function cancel(&$order)
293
  {
 
 
 
294
  //require a subscription id
295
  if(empty($order->subscription_transaction_id))
296
  return false;
297
 
298
  //find the customer
299
+ $this->getCustomer($order);
300
 
301
  if(!empty($this->customer))
302
  {
303
+ //cancel
304
+ $this->customer->cancelSubscription();
305
+ $order->updateStatus("cancelled");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
  return true;
307
  }
308
  else
309
  {
310
+ $order->error = "Could not find the subscription.";
311
  $order->shorterror = $order->error;
312
  return false; //no customer found
313
  }
314
  }
315
+ }
316
+ ?>
classes/gateways/class.pmprogateway_twocheckout.php DELETED
@@ -1,145 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("Twocheckout"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php");
5
- class PMProGateway_Twocheckout
6
- {
7
- function PMProGateway_Twocheckout($gateway = NULL)
8
- {
9
- $this->gateway = $gateway;
10
- return $this->gateway;
11
- }
12
-
13
- function process(&$order)
14
- {
15
- if(empty($order->code))
16
- $order->code = $order->getRandomCode();
17
-
18
- //clean up a couple values
19
- $order->payment_type = "2CheckOut";
20
- $order->CardType = "";
21
- $order->cardtype = "";
22
-
23
- //just save, the user will go to 2checkout to pay
24
- $order->status = "review";
25
- $order->saveOrder();
26
-
27
- return true;
28
- }
29
-
30
- function sendToTwocheckout(&$order)
31
- {
32
- global $pmpro_currency;
33
- // Set up credentials
34
- Twocheckout::setCredentials( pmpro_getOption("twocheckout_apiusername"), pmpro_getOption("twocheckout_apipassword") );
35
-
36
- $tco_args = array(
37
- 'sid' => pmpro_getOption("twocheckout_accountnumber"),
38
- 'mode' => '2CO', // will always be 2CO according to docs (@see https://www.2checkout.com/documentation/checkout/parameter-sets/pass-through-products/)
39
- 'li_0_type' => 'product',
40
- 'li_0_name' => substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127),
41
- 'li_0_quantity' => 1,
42
- 'li_0_tangible' => 'N',
43
- 'li_0_product_id' => $order->code,
44
- 'merchant_order_id' => $order->code,
45
- 'currency_code' => $pmpro_currency,
46
- 'pay_method' => 'CC',
47
- 'purchase_step' => 'billing-information',
48
- 'x_receipt_link_url' => admin_url("admin-ajax.php") . "?action=twocheckout-ins" //pmpro_url("confirmation", "?level=" . $order->membership_level->id)
49
- );
50
-
51
- //taxes on initial amount
52
- $initial_payment = $order->InitialPayment;
53
- $initial_payment_tax = $order->getTaxForPrice($initial_payment);
54
- $initial_payment = round((float)$initial_payment + (float)$initial_payment_tax, 2);
55
-
56
- //taxes on the amount (NOT CURRENTLY USED)
57
- $amount = $order->PaymentAmount;
58
- $amount_tax = $order->getTaxForPrice($amount);
59
- $order->subtotal = $amount;
60
- $amount = round((float)$amount + (float)$amount_tax, 2);
61
-
62
- // Recurring membership
63
- if( pmpro_isLevelRecurring( $order->membership_level ) ) {
64
- $tco_args['li_0_startup_fee'] = number_format($initial_payment - $amount, 2); //negative amount for lower initial payments
65
- $recurring_payment = $order->membership_level->billing_amount;
66
- $recurring_payment_tax = $order->getTaxForPrice($recurring_payment);
67
- $recurring_payment = round((float)$recurring_payment + (float)$recurring_payment_tax, 2);
68
- $tco_args['li_0_price'] = number_format($recurring_payment, 2);
69
-
70
- $tco_args['li_0_recurrence'] = ( $order->BillingFrequency == 1 ) ? $order->BillingFrequency . ' ' . $order->BillingPeriod : $order->BillingFrequency . ' ' . $order->BillingPeriod . 's';
71
-
72
- if( property_exists( $order, 'TotalBillingCycles' ) )
73
- $tco_args['li_0_duration'] = ($order->BillingFrequency * $order->TotalBillingCycles ) . ' ' . $order->BillingPeriod;
74
- else
75
- $tco_args['li_0_duration'] = 'Forever';
76
- }
77
- // Non-recurring membership
78
- else {
79
- $tco_args['li_0_price'] = $initial_payment;
80
- }
81
-
82
- // Demo mode?
83
- $environment = pmpro_getOption("gateway_environment");
84
- if("sandbox" === $environment || "beta-sandbox" === $environment)
85
- $tco_args['demo'] = 'Y';
86
-
87
- // Trial?
88
- //li_#_startup_fee Any start up fees for the product or service. Can be negative to provide discounted first installment pricing, but cannot equal or surpass the product price.
89
- if(!empty($order->TrialBillingPeriod)) {
90
- $trial_amount = $order->TrialAmount;
91
- $trial_tax = $order->getTaxForPrice($trial_amount);
92
- $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
93
- $tco_args['li_0_startup_fee'] = $trial_amount; // Negative trial amount
94
- }
95
-
96
- $ptpStr = '';
97
- foreach( $tco_args as $key => $value ) {
98
- reset( $tco_args ); // Used to verify whether or not we're on the first argument
99
- $ptpStr .= ( $key == key($tco_args) ) ? '?' . $key . '=' . urlencode( $value ) : '&' . $key . '=' . urlencode( $value );
100
- }
101
-
102
- //anything modders might add
103
- $additional_parameters = apply_filters( 'pmpro_twocheckout_return_url_parameters', array() );
104
- if( ! empty( $additional_parameters ) )
105
- foreach( $additional_parameters as $key => $value )
106
- $ptpStr .= "&" . urlencode($key) . "=" . urlencode($value);
107
-
108
- $ptpStr = apply_filters( 'pmpro_twocheckout_ptpstr', $ptpStr, $order );
109
-
110
- //echo str_replace("&", "&<br />", $ptpStr);
111
- //exit;
112
-
113
- //redirect to 2checkout
114
- $tco_url = 'https://www.2checkout.com/checkout/purchase' . $ptpStr;
115
-
116
- //echo $tco_url;
117
- //die();
118
- wp_redirect( $tco_url );
119
- exit;
120
- }
121
-
122
- function cancel(&$order) {
123
- // If recurring, stop the recurring payment
124
- if(pmpro_isLevelRecurring($order->membership_level)) {
125
- $params['sale_id'] = $order->payment_transaction_id;
126
- $result = Twocheckout_Sale::stop( $params ); // Stop the recurring billing
127
-
128
- // Successfully cancelled
129
- if (isset($result['response_code']) && $result['response_code'] === 'OK') {
130
- $order->updateStatus("cancelled");
131
- return true;
132
- }
133
- // Failed
134
- else {
135
- $order->status = "error";
136
- $order->errorcode = $result->getCode();
137
- $order->error = $result->getMessage();
138
-
139
- return false;
140
- }
141
- }
142
-
143
- return $order;
144
- }
145
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/admin-rtl.css DELETED
@@ -1,63 +0,0 @@
1
- .pmpro_admin {
2
- background: url(../images/Paid-Memberships-Pro_watermark.png) bottom left no-repeat !important;
3
- }
4
-
5
- .pmpro_admin .pmpro_banner h2 {
6
- float: right;
7
- }
8
-
9
- .pmpro_admin .pmpro_banner .pmpro_meta {
10
- float: right;
11
- }
12
-
13
- .pmpro_admin .pmpro_banner .pmpro_meta .pmpro_tag-blue {
14
- margin: 0 5px 0 0;
15
- }
16
-
17
- .pmpro_admin .pmpro_banner .pmpro_logo {
18
- float: right;
19
- margin: 0 0 0 1em;
20
- }
21
-
22
- .pmpro_admin .pmpro_banner ul.pmpro_menu li {
23
- border-left: 1px solid #CCC;
24
- border-right: none;
25
- }
26
-
27
- /* messages */
28
- .pmpro_message {
29
- padding: 6px 25px 6px 6px;
30
- }
31
-
32
- /* highlighted trs */
33
-
34
- /* discount levels */
35
-
36
- /* pagination */
37
- div.pmpro_pagination {
38
- float: left;
39
- }
40
-
41
- /* add ons */
42
-
43
- .pmpro_admin .widgets-holder-wrap .widget {
44
- float: right;
45
- margin: 0 0 1% 1%;
46
- }
47
-
48
- .pmpro_admin .widgets-holder-wrap .widget-title .status-label {
49
- float: right;
50
- margin: 0 0 0 5px;
51
- }
52
-
53
- .pmpro_admin .widgets-holder-wrap .widget-title .version {
54
- left: 10px;
55
- left: auto;
56
- }
57
-
58
- .pmpro_admin .widgets-holder-wrap .widget-inside .addon-thumb {
59
- float: left;
60
- margin: 10px 10px 0 0;
61
- }
62
-
63
- /* Generated by the RTLer - http://l0uy.com/rtler/ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/admin.css CHANGED
@@ -1,97 +1,61 @@
1
- .pmpro_admin {background: url(../images/Paid-Memberships-Pro_watermark.png) bottom right no-repeat !important; padding: 1em 0 70px 0; }
2
-
3
- .pmpro_admin .pmpro_banner h2 {float: left; }
4
- .pmpro_admin .pmpro_banner .pmpro_meta {float: left; margin: 26px 0 0 0; font-size: 12px; }
5
- .pmpro_admin .pmpro_banner .pmpro_meta .pmpro_tag-blue {margin: 0 0 0 5px; }
6
- .pmpro_admin .pmpro_banner .pmpro_logo {float: left; margin: 0 1em 0 0; width: 350px; height: 75px; }
7
- .pmpro_admin .pmpro_banner ul.pmpro_menu {clear: both; border: 1px solid #CCC; border-radius: 5px; -moz-border-radius: 5px; background: #FFF; }
8
- .pmpro_admin .pmpro_banner ul.pmpro_menu li {display: inline-block; margin: 10px 0; padding: 0px 10px; border-right: 1px solid #CCC; }
9
- .pmpro_admin .pmpro_banner ul.pmpro_menu li a, .pmpro_admin .pmpro_banner ul.pmpro_menu li a:link {color: #1e0741; text-decoration: none; }
10
- .pmpro_admin .pmpro_banner ul.pmpro_menu li a:hover {text-decoration: underline; color: #412f5b; }
11
-
12
- .pmpro_admin .pmpro_tag-grey {display: inline-block; font-size: 11px; font-weight: bold; position: relative; padding: 2px 5px; border: 1px solid #CCC; background: whiteSmoke; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; }
13
- .pmpro_admin .pmpro_tag-blue {display: inline-block; font-size: 11px; font-weight: bold; position: relative; padding: 2px 5px; border: 1px solid #2997c8; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; background: #2997c8; color: #FFF; text-decoration: none; }
14
- .pmpro_admin a.pmpro_tag-blue:hover {background: #77a02e; border: 1px solid #77a02e; }
15
-
16
- .pmpro_admin .topborder {border-top: 1px solid #CCC; margin-top: 1em; padding-top: 1em; }
17
- .pmpro_admin #editorcontainer #description {width: 100%; height: 180px; }
18
- .pmpro_admin .widefat {margin-top: 1em; }
19
-
20
- .ssp_description #description {width: 100%;}
21
- .checkbox_box {width: 300px; background: #FFFFFF; border: 1px solid #CCC;}
22
- .checkbox_box div {border-bottom: 1px solid #CCC; padding: 3px;}
23
- .checkbox_box .clickable {cursor: pointer;}
24
- .checkbox_box .clickable:hover {background: #FFC;}
25
- .top0em {margin-top: 0;}
26
-
27
- tr.pmpro_gray td {color: #AAA;}
28
-
29
- /* messages */
30
- .pmpro_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
31
-
32
- .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
33
- .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
34
- .pmpro_alert {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
35
-
36
- .pmpro_message a {color: #345395; }
37
- .pmpro_success a {color: #208A1B; }
38
- .pmpro_error a {color: #E36154; }
39
- .pmpro_alert a {color: #CF8516; }
40
-
41
- /* highlighted trs */
42
- tr.pmpro_message {background-image: none;}
43
- tr.pmpro_success {background-image: none;}
44
- tr.pmpro_error {background-image: none;}
45
- tr.pmpro_alert {background-image: none;}
46
-
47
- /* discount levels */
48
- .pmpro_discount_levels {border: 1px solid #CCC;}
49
- .pmpro_discount_levels div {padding: 5px; border: 1px solid #CCC;}
50
- .pmpro_discount_levels div div {margin-top: 5px; background: #F5F5F5;}
51
-
52
- /* pagination */
53
- div.pmpro_pagination {padding: 3px; margin: 5px 0px 5px 0px; font-size: 10px; float: right; }
54
- div.pmpro_pagination a {padding: 2px 5px 2px 5px; margin: 1px; border: 1px solid #666; text-decoration: none; /* no underline */ color: #666; background: #EEE; }
55
- div.pmpro_pagination a:hover, div.pmpro_pagination a:active {background: #FFF; }
56
- div.pmpro_pagination span.current {border: 1px solid #FFF; color: #FFF; background: #666; padding: 2px 5px 2px 5px; margin: 1px; font-weight: bold; }
57
- div.pmpro_pagination span.disabled {padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #BBB; color: #BBB; background: #EFEFEF;}
58
-
59
- p.pmpro_meta_notice {font-size: .8em; padding-top: 5px; border-top: 1px solid #CCC;}
60
-
61
- /* add ons */
62
- .pmpro_admin .widgets-holder-wrap {clear: both; margin-top: 20px; padding: 0 8px; }
63
- .pmpro_admin .widgets-holder-wrap .widget {float: left; width: 32%; margin: 0 1% 1% 0; position: relative; }
64
- .pmpro_admin .widgets-holder-wrap p.description {padding: 0; }
65
- .pmpro_admin .widgets-holder-wrap .widget-top {height: auto; cursor: default; }
66
- .pmpro_admin .widgets-holder-wrap .widget-inside {display: block; height: 130px; overflow: hidden; }
67
- .pmpro_admin .widgets-holder-wrap .widget-inside p {height: 80px; overflow: hidden; }
68
- .pmpro_admin #pmpro-gists.widgets-holder-wrap .widget-inside, .pmpro_admin #pmpro-gists.widgets-holder-wrap .widget-inside p {height: auto; }
69
- .pmpro_admin .widgets-holder-wrap .widget-title { }
70
- .pmpro_admin .widgets-holder-wrap .widget-title h4 { }
71
- .pmpro_admin .widgets-holder-wrap .widget-title .status-label {display: block; float: left; margin: 0 5px 0 0; width: 10px;
72
- height: 10px; overflow: hidden; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border: 1px solid #DFDFDF; text-indent: -9999em; }
73
- .pmpro_admin .widgets-holder-wrap .disabled .widget-title .status-label {background: #F00; }
74
- .pmpro_admin .widgets-holder-wrap .enabled .widget-title .status-label {background: #0C0; }
75
-
76
- .pmpro_admin .widgets-holder-wrap .widget-title .version {position: absolute; top: 13px; right: 10px; }
77
- .pmpro_admin .widgets-holder-wrap .widget-inside .addon-thumb {width: 100px; height: 100px; float: right; margin: 10px 0 0 10px; border: 1px solid #DFDFDF; background: #FFF; padding: 2px;}
78
-
79
- /*@media (min-width: 1200px) {
80
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside, .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside p {height: auto; }
81
- }
82
- */
83
- @media (max-width:900px) {
84
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget {float: none; width: 100%; }
85
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside, .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside p {height: auto; }
86
- }
87
-
88
- /* misc */
89
- .pmpro_lite {color: #AAA;}
90
- .pmpro_pad20 {padding: 20px !important;}
91
- .pmpro_red {color: #CC0000;}
92
- .pmpro_green {color: #00AA00;}
93
-
94
- /* reports */
95
- .pmpro_reports-holder { }
96
- .pmpro_clickable {cursor: pointer;}
97
- .js .postbox.pmpro_clickable h3 {cursor: pointer;}
1
+ .pmpro_admin {background: url(../images/PaidMembershipsPro-grey.gif) bottom right no-repeat !important; padding-bottom: 70px; }
2
+
3
+ .pmpro_admin .pmpro_banner {margin: 2em 0; font-family: Georgia, "Times New Roman", Times, serif; }
4
+ .pmpro_admin .pmpro_banner .pmpro_meta {float: right; margin: 2em 0 1em 1em; font-size: 12px; font-style: italic; }
5
+ .pmpro_admin .pmpro_banner .pmpro_logo {float: left; margin: 0 1em 1em 0; width: 350px; }
6
+ .pmpro_admin .pmpro_banner .pmpro_tagline {float: left; width: 350px; font-family: "Arial Black", Gadget, sans-serif; color: #412f5b; text-transform: uppercase; font-size: 13px; padding: 15px 0; }
7
+ .pmpro_admin .pmpro_banner ul.pmpro_menu {clear: both; border: 1px solid #CCC; border-radius: 5px; -moz-border-radius: 5px; background: #FFF; }
8
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li {display: inline-block; margin: 10px 0; padding: 0px 10px; border-right: 1px solid #CCC; }
9
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li a, .pmpro_admin .pmpro_banner ul.pmpro_menu li a:link {color: #1e0741; text-decoration: none; }
10
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li a:hover {text-decoration: underline; color: #412f5b; }
11
+
12
+ .pmpro_admin .topborder {border-top: 1px solid #CCC; margin-top: 1em; padding-top: 1em; }
13
+ .pmpro_admin #editorcontainer #description {width: 100%; height: 180px; }
14
+ .pmpro_admin .widefat {margin-top: 1em; }
15
+
16
+ .ssp_description #description {width: 100%;}
17
+ .checkbox_box {width: 300px; background: #FFFFFF; border: 1px solid #CCC;}
18
+ .checkbox_box div {border-bottom: 1px solid #CCC; padding: 3px;}
19
+ .checkbox_box .clickable {cursor: pointer;}
20
+ .checkbox_box .clickable:hover {background: #FFC;}
21
+ .top0em {margin-top: 0;}
22
+
23
+ tr.pmpro_gray td {color: #AAA;}
24
+
25
+ /* messages */
26
+ .pmpro_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
27
+
28
+ .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
29
+ .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
30
+ .pmpro_alert {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
31
+
32
+ .pmpro_message a {color: #345395; }
33
+ .pmpro_success a {color: #208A1B; }
34
+ .pmpro_error a {color: #E36154; }
35
+ .pmpro_alert a {color: #CF8516; }
36
+
37
+ /* highlighted trs */
38
+ tr.pmpro_message {background-image: none;}
39
+ tr.pmpro_success {background-image: none;}
40
+ tr.pmpro_error {background-image: none;}
41
+ tr.pmpro_alert {background-image: none;}
42
+
43
+ /* discount levels */
44
+ .pmpro_discount_levels {border: 1px solid #CCC;}
45
+ .pmpro_discount_levels div {padding: 5px; border: 1px solid #CCC;}
46
+ .pmpro_discount_levels div div {margin-top: 5px; background: #F5F5F5;}
47
+
48
+ /* pagination */
49
+ div.pmpro_pagination {padding: 3px; margin: 5px 0px 5px 0px; font-size: 10px; float: right; }
50
+ div.pmpro_pagination a {padding: 2px 5px 2px 5px; margin: 1px; border: 1px solid #666; text-decoration: none; /* no underline */ color: #666; background: #EEE; }
51
+ div.pmpro_pagination a:hover, div.pmpro_pagination a:active {background: #FFF; }
52
+ div.pmpro_pagination span.current {border: 1px solid #FFF; color: #FFF; background: #666; padding: 2px 5px 2px 5px; margin: 1px; font-weight: bold; }
53
+ div.pmpro_pagination span.disabled {padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #BBB; color: #BBB; background: #EFEFEF;}
54
+
55
+ p.pmpro_meta_notice {font-size: .6em; padding-top: 5px; border-top: 1px solid #CCC;}
56
+
57
+ /* misc */
58
+ .pmpro_lite {color: #AAA;}
59
+ .pmpro_pad20 {padding: 20px !important;}
60
+ .pmpro_red {color: #CC0000;}
61
+ .pmpro_green {color: #00AA00;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/frontend-rtl.css DELETED
@@ -1,111 +0,0 @@
1
- /*---------------------------------------
2
- Buttons
3
- ---------------------------------------*/
4
-
5
- /*---------------------------------------
6
- Forms
7
- ---------------------------------------*/
8
- form.pmpro_form div {
9
- clear: right;
10
- }
11
-
12
- form.pmpro_form label {
13
- float: right;
14
- margin: 3px 0 0 10px;
15
- text-align: left;
16
- }
17
-
18
- form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {
19
- margin: 0 0 0 3px;
20
- }
21
-
22
- form.pmpro_form .leftmar {
23
- margin: 8px 130px 0 0;
24
- }
25
-
26
- form.pmpro_form .pmpro_captcha {
27
- margin: 0 130px 0 0 !important;
28
- }
29
-
30
- form.pmpro_form .pmpro_submit {
31
- margin-right: 130px;
32
- margin-left: auto;
33
- }
34
-
35
- form.pmpro_form .pmpro_submit span {
36
- float: right;
37
- }
38
-
39
- form.pmpro_form #pmpro_processing_message {
40
- margin: 5px 10px 0 0;
41
- }
42
-
43
- /*--------------------------------------------------
44
- Messages - Success, Error, Alert
45
- ----------------------------------------------------*/
46
-
47
- .pmpro_content_message a {
48
- margin: 5px 0 0 5px;
49
- }
50
-
51
- /*---------------------------------------
52
- Membership Checkout
53
- ---------------------------------------*/
54
-
55
- .pmpro_checkout ul {
56
- margin: 5px 20px 0 0;
57
- }
58
-
59
- .pmpro_checkout td.rtbdr {
60
- border-left: 1px solid #CCC;
61
- border-right: none;
62
- }
63
-
64
- .pmpro_thead-msg {
65
- float: left;
66
- text-align: left;
67
- }
68
-
69
- .pmpro_ordersummary {
70
- float: left;
71
- }
72
-
73
- .pmpro_sslseal {
74
- float: left;
75
- }
76
-
77
- /*---------------------------------------
78
- Membership Invoice
79
- ---------------------------------------*/
80
-
81
- /*---------------------------------------
82
- Membership Account
83
- ---------------------------------------*/
84
-
85
- li.pmpro_more {
86
- margin-right: -20px;
87
- padding-right: 0;
88
- padding-left: 0;
89
- margin-left: auto;
90
- }
91
-
92
- /*---------------------------------------
93
- Membership Levels
94
- ---------------------------------------*/
95
-
96
- /*---------------------------------------
97
- Misc
98
- ---------------------------------------*/
99
- .pmpro_a-right {
100
- float: left;
101
- text-align: left;
102
- }
103
-
104
- .pmpro_a-print {
105
- float: left;
106
- background: url(../images/printer.gif) top right no-repeat;
107
- padding: 0px 20px 2px 0px;
108
- }
109
-
110
-
111
- /* Generated by the RTLer - http://l0uy.com/rtler/ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/frontend.css CHANGED
@@ -1,174 +1,100 @@
1
- /*---------------------------------------
2
- Buttons
3
- ---------------------------------------*/
4
- .pmpro_btn, .pmpro_btn:link, .pmpro_content_message a, .pmpro_content_message a:link {
5
- display: inline-block;
6
- background-color: #EFEFEF;
7
- background-image: none;
8
- border: 1px solid #D6D6D6;
9
- -webkit-border-radius: 4px;
10
- -moz-border-radius: 4px;
11
- border-radius: 4px;
12
- padding: 6px 12px;
13
- margin: 0;
14
- color: #444;
15
- font-size: 12px;
16
- font-weight: 700;
17
- text-transform: none;
18
- text-decoration: none;
19
- text-align: center;
20
- white-space: nowrap;
21
- vertical-align: middle;
22
- cursor: pointer;
23
- -webkit-user-select: none;
24
- -moz-user-select: none;
25
- -ms-user-select: none;
26
- -o-user-select: none;
27
- user-select: none;
28
- }
29
-
30
- .pmpro_btn:focus, .pmpro_content_message a:focus {
31
- outline: thin dotted;
32
- outline: 5px auto -webkit-focus-ring-color;
33
- outline-offset: -2px;
34
- }
35
-
36
- .pmpro_btn:hover, .pmpro_btn:focus, .pmpro_content_message a:focus, .pmpro_content_message a:hover {
37
- color: #000;
38
- background-color: #FAFAFA;
39
- text-decoration: none;
40
- }
41
-
42
- .pmpro_btn:active,
43
- .pmpro_btn.active {
44
- background-image: none;
45
- outline: 0;
46
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
47
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
48
- }
49
-
50
- .pmpro_btn.disabled,
51
- .pmpro_btn[disabled],
52
- fieldset[disabled] .pmpro_btn {
53
- pointer-events: none;
54
- cursor: not-allowed;
55
- opacity: 0.65;
56
- filter: alpha(opacity=65);
57
- -webkit-box-shadow: none;
58
- box-shadow: none;
59
- }
60
-
61
- /*---------------------------------------
62
- Forms
63
- ---------------------------------------*/
64
- form.pmpro_form div {clear: left; margin: .5em 0 1em 0; }
65
- form.pmpro_form label {float: left; margin: 3px 10px 0 0; width: 120px; font-weight: bold; text-align: right; }
66
- form.pmpro_form label.pmpro_normal {float: none; margin: 0 0 0 0; width: auto; font-weight: normal; text-align: auto;}
67
- .pmpro_clickable {cursor: pointer;}
68
- form.pmpro_form .likelabel {font-weight: bold; }
69
- form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {padding: 3px; border: 1px solid #AAA; margin: 0 3px 0 0; }
70
- form.pmpro_form textarea {font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
71
- form.pmpro_form select {margin: 2px 0 0 0 ; font-size: 12px;}
72
- form.pmpro_form .lite {color: #666; }
73
- form.pmpro_form .leftmar {margin: 8px 0 0 130px; }
74
-
75
- form.pmpro_form .pmpro_captcha {margin: 0 0 0 130px !important; }
76
- form.pmpro_form .pmpro_captcha div {clear: none; margin: 0; }
77
- form.pmpro_form .pmpro_submit {margin-left: 130px; }
78
- form.pmpro_form .pmpro_submit span {float: left; }
79
- form.pmpro_form #pmpro_processing_message {margin: 5px 0 0 10px; font-style: italic; color: #999; }
80
-
81
- /*--------------------------------------------------
82
- Messages - Success, Error, Alert
83
- ----------------------------------------------------*/
84
- .pmpro_message {background-color: #d9edf7; margin: .5em 0; padding: 10px 15px; color: #31708f; font-size: 14px; font-weight: 400; line-height: 1.5em; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: 1px solid #bce8f1; }
85
-
86
- .pmpro_success {background-color: #dff0d8; color: #3c763d; border-color: #bce8f1; }
87
- .pmpro_error {background-color: #f2dede; color: #a94442; border-color: #ebccd1; }
88
- .pmpro_alert {background-color: #fcf8e3; color: #8a6d3b; border-color: #faebcc;}
89
-
90
- .pmpro_content_message a {margin: 5px 5px 0 0; }
91
-
92
- .pmpro_message a {color: #245269; text-decoration: underline; }
93
- .pmpro_success a {color: #2b542c; }
94
- .pmpro_error a {color: #843534; }
95
- .pmpro_alert a {color: #66512c; }
96
-
97
- input.pmpro_error {background-image: none;}
98
- select.pmpro_error {background-image: none;}
99
-
100
- /*---------------------------------------
101
- Membership Checkout
102
- ---------------------------------------*/
103
- .pmpro_checkout thead th {font-weight: bold; color: #444; padding: 10px; }
104
- .pmpro_checkout tbody td {padding: 10px; }
105
- .pmpro_checkout tr.odd td {background: rgba(125,125,125,.1); }
106
- .pmpro_checkout tr.selected td {background: #FFC; }
107
- .pmpro_checkout tr.active td {background: #FFC; }
108
- .pmpro_checkout .name {font-weight: bold; }
109
- .pmpro_checkout ul {margin: 5px 0 0 20px; padding: 0; font-size: .8em; color: #444; }
110
-
111
- .pmpro_checkout tfoot td {padding: 10px; color: #444; }
112
- .pmpro_checkout .topfoot td {border-top: 2px solid #CCC;}
113
- .pmpro_checkout .total td {border-top: 1px solid #CCC; font-size: 1.2em; font-weight: bold; padding-bottom: 30px;}
114
- .pmpro_checkout tfoot .entercode td {background: #EEE; }
115
-
116
- .pmpro_checkout td.rtbdr {border-right: 1px solid #CCC; }
117
-
118
- .pmpro_checkout select {font-size: 11px; }
119
-
120
- .pmpro_thead-msg {display: block; float: right; width: auto; font-style: italic; font-weight: normal; text-align: right; white-space: nowrap; }
121
-
122
- .pmpro_ordersummary {float: right; }
123
-
124
- #pmpro_license { background: #FFF; padding: 5px; border: 1px solid #CCC; height: 200px; margin: 3px; color: #666; overflow: auto; }
125
-
126
- .pmpro_sslseal {float: right; clear: none !important; margin: 0 !important; }
127
-
128
- a.pmpro_radio {text-decoration: none; color: #000;}
129
-
130
- /*---------------------------------------
131
- Membership Invoice
132
- ---------------------------------------*/
133
- .pmpro_invoice { }
134
-
135
-
136
- /*---------------------------------------
137
- Membership Account
138
- ---------------------------------------*/
139
- #pmpro_account .pmpro_box {border-top: 1px solid #CCC; padding: 1em 0; margin: 1em 0; }
140
- #pmpro_account .pmpro_box h3 {margin: 0; padding: 0; border: none; background: none; }
141
- #pmpro_account .pmpro_box p {margin: .5em 0 0 0; padding: 0; }
142
- #pmpro_account .pmpro_box ul {margin-bottom: 0; }
143
-
144
- #pmpro_account #pmpro_account-membership { }
145
- #pmpro_account #pmpro_account-profile { }
146
- #pmpro_account #pmpro_account-billing { }
147
- #pmpro_account #pmpro_account-invoices { }
148
- #pmpro_account #pmpro_account-links { }
149
-
150
-
151
- .pmpro_hidden {display: none;}
152
- li.pmpro_more {list-style-type: none; text-align: center; margin-left: -20px; padding-left: 0;}
153
-
154
- /*---------------------------------------
155
- Membership Levels
156
- ---------------------------------------*/
157
- #pmpro_levels_table {background: #FFF; }
158
- #pmpro_levels_table .pmpro_btn {display: block; }
159
-
160
- /*---------------------------------------
161
- Misc
162
- ---------------------------------------*/
163
- .pmpro_a-right {float: right; width: auto; text-align: right; text-decoration: underline; font-size: 11px; }
164
- .pmpro_a-print {float: right; width: auto; text-decoration: none; color: #345395; background: url(../images/printer.gif) top left no-repeat; padding: 0px 0px 2px 20px; font-size: 11px; line-height: 16px; cursor: pointer; }
165
-
166
- .pmpro_red {color: #CC0000; }
167
- .pmpro_grey {color: #999; }
168
-
169
- .top1em {margin-top: 1em;}
170
- .bot1em {margin-bottom: 1em;}
171
- .bot0em {margin-bottom: 0em;}
172
- .clear {clear: both; }
173
-
174
  .pmpro_small {font-size: .8em;}
1
+ /*---------------------------------------
2
+ Buttons
3
+ ---------------------------------------*/
4
+ .pmpro_btn {display: inline-block; margin: 0; cursor: pointer; }
5
+ .pmpro_btn:hover { }
6
+
7
+ /*---------------------------------------
8
+ Forms
9
+ ---------------------------------------*/
10
+ form.pmpro_form div {clear: left; margin: .5em 0 1em 0; }
11
+ form.pmpro_form label {float: left; margin: 3px 10px 0 0; width: 120px; font-weight: bold; text-align: right; }
12
+ /*form.pmpro_form div div {width: 380px; margin-left: 130px; clear: none;}*/
13
+ form.pmpro_form .likelabel {font-weight: bold; }
14
+ form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {padding: 3px; border: 1px solid #AAA; margin: 0 3px 0 0; }
15
+ form.pmpro_form textarea {font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
16
+ form.pmpro_form select {margin: 2px 0 0 0 ; font-size: 12px;}
17
+ form.pmpro_form .lite {color: #666; }
18
+ form.pmpro_form .leftmar {margin: 8px 0 0 130px; }
19
+
20
+ form.pmpro_form .pmpro_captcha {margin: 0 0 0 130px !important; }
21
+ form.pmpro_form .pmpro_captcha div {clear: none; margin: 0; }
22
+
23
+ /*--------------------------------------------------
24
+ Messages - Success, Error, Alert
25
+ ----------------------------------------------------*/
26
+ .pmpro_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
27
+
28
+ .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
29
+ .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
30
+ .pmpro_alert {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
31
+
32
+ .pmpro_message a {color: #345395; }
33
+ .pmpro_success a {color: #208A1B; }
34
+ .pmpro_error a {color: #E36154; }
35
+ .pmpro_alert a {color: #CF8516; }
36
+
37
+ /*---------------------------------------
38
+ Membership Checkout
39
+ ---------------------------------------*/
40
+ .pmpro_checkout thead th {font-weight: bold; color: #444; padding: 10px; }
41
+ .pmpro_checkout tbody td {padding: 10px; }
42
+ .pmpro_checkout tr.odd td {background: #FAFAFA; }
43
+ .pmpro_checkout tr.selected td {background: #FFC; }
44
+ .pmpro_checkout tr.active td {background: #FFC; }
45
+ .pmpro_checkout .name {font-weight: bold; }
46
+ .pmpro_checkout ul {margin: 5px 0 0 20px; padding: 0; font-size: .8em; color: #444; }
47
+
48
+ .pmpro_checkout tfoot td {padding: 10px; color: #444; }
49
+ .pmpro_checkout .topfoot td {border-top: 2px solid #CCC;}
50
+ .pmpro_checkout .total td {border-top: 1px solid #CCC; font-size: 1.2em; font-weight: bold; padding-bottom: 30px;}
51
+ .pmpro_checkout tfoot .entercode td {background: #EEE; }
52
+
53
+ .pmpro_checkout td.rtbdr {border-right: 1px solid #CCC; }
54
+
55
+ .pmpro_checkout select {font-size: 11px; }
56
+
57
+ .pmpro_thead-msg {display: block; float: right; width: auto; font-style: italic; font-weight: normal; text-align: right; }
58
+
59
+ .pmpro_ordersummary {float: right; }
60
+
61
+ #pmpro_license { background: #FFF; padding: 5px; border: 1px solid #CCC; height: 200px; margin: 3px; color: #666; overflow: auto; }
62
+
63
+ .pmpro_sslseal {float: right; clear: none !important; margin: 0 !important; }
64
+
65
+ a.pmpro_radio {text-decoration: none; color: #000;}
66
+
67
+ /*---------------------------------------
68
+ Membership Invoice
69
+ ---------------------------------------*/
70
+ .pmpro_invoice { }
71
+
72
+
73
+ /*---------------------------------------
74
+ Membership Account
75
+ ---------------------------------------*/
76
+ .pmpro_left {float: left; width: 49%; }
77
+ .pmpro_right {float: right; width: 49%; }
78
+
79
+ .pmpro_box {border: 1px solid #CCC; padding: 1em; margin: 0 0 1em 0; }
80
+ .pmpro_box h3 {border:none; background: none; border-bottom: 1px solid #CCC; padding: 0 0 .5em 0; margin: 0 0 .5em 0; }
81
+
82
+ .pmpro_hidden {display: none;}
83
+ li.pmpro_more {list-style-type: none; text-align: center; margin-left: -20px; padding-left: 0;}
84
+
85
+
86
+ /*---------------------------------------
87
+ Misc
88
+ ---------------------------------------*/
89
+ .pmpro_a-right {float: right; width: auto; text-align: right; text-decoration: underline; font-size: 11px; }
90
+ .pmpro_a-print {float: right; width: auto; text-decoration: none; color: #345395; background: url(../images/printer.gif) top left no-repeat; padding: 0px 0px 2px 20px; font-size: 11px; line-height: 16px; cursor: pointer; }
91
+
92
+ .pmpro_red {color: #CC0000; }
93
+ .pmpro_grey {color: #999; }
94
+
95
+ .top1em {margin-top: 1em;}
96
+ .bot1em {margin-bottom: 1em;}
97
+ .bot0em {margin-bottom: 0em;}
98
+ .clear {clear: both; }
99
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  .pmpro_small {font-size: .8em;}
email/admin_change.html CHANGED
@@ -1,6 +1,6 @@
1
  <p>An administrator at !!sitename!! has changed your membership level.</p>
2
 
3
- <p>!!membership_change!!.</p>
4
 
5
  <p>If you did not request this membership change and would like more information please contact us at !!siteemail!!</p>
6
 
1
  <p>An administrator at !!sitename!! has changed your membership level.</p>
2
 
3
+ <p>Your !!membership_change!!.</p>
4
 
5
  <p>If you did not request this membership change and would like more information please contact us at !!siteemail!!</p>
6
 
email/billing.html CHANGED
@@ -3,7 +3,10 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Billing Information:<br />
6
- !!billing_address!!
 
 
 
7
  </p>
8
 
9
  <p>
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Billing Information:<br />
6
+ !!billing_name!!<br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
9
+ !!billing_phone!!
10
  </p>
11
 
12
  <p>
email/billing_admin.html CHANGED
@@ -5,7 +5,7 @@
5
  Billing Information:<br />
6
  !!billing_name!!<br />
7
  !!billing_street!!<br />
8
- !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
9
  !!billing_phone!!
10
  </p>
11
 
5
  Billing Information:<br />
6
  !!billing_name!!<br />
7
  !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
9
  !!billing_phone!!
10
  </p>
11
 
email/billing_failure.html CHANGED
@@ -3,7 +3,11 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
- <p>!!billing_address!!</p>
 
 
 
 
7
 
8
  <p>
9
  !!cardtype!!: !!accountnumber!!<br />
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
+ <p>!!billing_name!!</br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
9
+ !!billing_phone!!
10
+ </p>
11
 
12
  <p>
13
  !!cardtype!!: !!accountnumber!!<br />
email/billing_failure_admin.html CHANGED
@@ -3,7 +3,11 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
- <p>!!billing_address!!</p>
 
 
 
 
7
 
8
  <p>
9
  !!cardtype!!: !!accountnumber!!<br />
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
+ <p>!!billing_name!!</br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
9
+ !!billing_phone!!
10
+ </p>
11
 
12
  <p>
13
  !!cardtype!!: !!accountnumber!!<br />
email/cancel.html CHANGED
@@ -1,3 +1,3 @@
1
- <p>Your membership at !!sitename!! has been cancelled.</p>
2
 
3
  <p>If you did not request this cancellation and would like more information please contact us at !!siteemail!!</p>
1
+ <p>Your membership at !!sitename!! has been canceled.</p>
2
 
3
  <p>If you did not request this cancellation and would like more information please contact us at !!siteemail!!</p>
email/cancel_admin.html CHANGED
@@ -1,8 +1,6 @@
1
- <p>The membership for !!user_login!! at !!sitename!! has been cancelled.</p>
2
 
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>Membership Level: !!membership_level_name!!</p>
5
- <p>Start Date: !!startdate!!</p>
6
- <p>Cancellation Date: !!enddate!!</p>
7
 
8
  <p>Log in to your WordPress admin here: !!login_link!!</p>
1
+ <p>The membership for !!user_login!! at !!sitename!! has been canceled.</p>
2
 
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>Membership Level: !!membership_level_name!!</p>
 
 
5
 
6
  <p>Log in to your WordPress admin here: !!login_link!!</p>
email/checkout_check.html DELETED
@@ -1,17 +0,0 @@
1
- <p>Thank you for your membership to !!sitename!!. Your membership account is now active.</p>
2
-
3
- !!instructions!!
4
-
5
- <p>Below are details about your membership account and a receipt for your initial membership invoice.</p>
6
-
7
- <p>Account: !!display_name!! (!!user_email!!)</p>
8
- <p>Membership Level: !!membership_level_name!!</p>
9
- <p>Membership Fee: !!membership_cost!!</p>
10
- !!membership_expiration!! !!discount_code!!
11
-
12
- <p>
13
- Invoice #!!invoice_id!! on !!invoice_date!!<br />
14
- Total Billed: !!invoice_total!!
15
- </p>
16
-
17
- <p>Log in to your membership account here: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
email/checkout_check_admin.html DELETED
@@ -1,17 +0,0 @@
1
- <p>There was a new member checkout at !!sitename!!.</p>
2
-
3
- <p><strong>They have chosen to pay by check.</strong></p>
4
-
5
- <p>Below are details about the new membership account and a receipt for the initial membership invoice.</p>
6
-
7
- <p>Account: !!display_name!! (!!user_email!!)</p>
8
- <p>Membership Level: !!membership_level_name!!</p>
9
- <p>Membership Fee: !!membership_cost!!</p>
10
- !!membership_expiration!! !!discount_code!!
11
-
12
- <p>
13
- Invoice #!!invoice_id!! on !!invoice_date!!<br />
14
- Total Billed: $!!invoice_total!!
15
- </p>
16
-
17
- <p>Log in to your membership account here: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
email/checkout_express.html CHANGED
@@ -8,7 +8,7 @@
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
- Total Billed: !!invoice_total!!
12
  </p>
13
 
14
- <p>Log in to your membership account here: !!login_link!!</p>
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
+ Total Billed: $!!invoice_total!!
12
  </p>
13
 
14
+ <p>Log in to your membership account here: !!login_link!!</p>
email/checkout_express_admin.html CHANGED
@@ -8,7 +8,7 @@
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
- Total Billed: !!invoice_total!!
12
  </p>
13
 
14
- <p>Log in to your membership account here: !!login_link!!</p>
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
+ Total Billed: $!!invoice_total!!
12
  </p>
13
 
14
+ <p>Log in to your membership account here: !!login_link!!</p>
email/checkout_freetrial.html CHANGED
@@ -8,7 +8,10 @@
8
 
9
  <p>
10
  Billing Information on File:<br />
11
- !!billing_address!!
 
 
 
12
  </p>
13
 
14
  <p>
8
 
9
  <p>
10
  Billing Information on File:<br />
11
+ !!billing_name!!<br />
12
+ !!billing_street!!<br />
13
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
14
+ !!billing_phone!!
15
  </p>
16
 
17
  <p>
email/checkout_freetrial_admin.html CHANGED
@@ -8,7 +8,10 @@
8
 
9
  <p>
10
  Billing Information on File:<br />
11
- !!billing_address!!
 
 
 
12
  </p>
13
 
14
  <p>
8
 
9
  <p>
10
  Billing Information on File:<br />
11
+ !!billing_name!!<br />
12
+ !!billing_street!!<br />
13
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
14
+ !!billing_phone!!
15
  </p>
16
 
17
  <p>
email/checkout_paid.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_paid_admin.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_trial.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_trial_admin.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/credit_card_expiring.html DELETED
@@ -1,13 +0,0 @@
1
- <p>The payment method used for your membership at !!sitename!! will expire soon. <strong>Please click the following link to log in and update your billing information to avoid account suspension. !!login_link!!</strong></p>
2
-
3
- <p>Account: !!display_name!! (!!user_email!!)</p>
4
- <p>The most recent account information we have on file is:</p>
5
-
6
- <p>!!billing_name!!</br />
7
- !!billing_address!!
8
- </p>
9
-
10
- <p>
11
- !!cardtype!!: !!accountnumber!!<br />
12
- Expires: !!expirationmonth!!/!!expirationyear!!
13
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
email/invoice.html CHANGED
@@ -3,11 +3,14 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
6
- Total Billed: !!invoice_total!!
7
  </p>
8
  <p>
9
  Billing Information:<br />
10
- !!billing_address!!
 
 
 
11
  </p>
12
 
13
  <p>
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
6
+ Total Billed: $!!invoice_total!!
7
  </p>
8
  <p>
9
  Billing Information:<br />
10
+ !!billing_name!!<br />
11
+ !!billing_street!!<br />
12
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
13
+ !!billing_phone!!
14
  </p>
15
 
16
  <p>
images/Paid-Memberships-Pro.png DELETED
Binary file
images/Paid-Memberships-Pro_watermark.png DELETED
Binary file
images/bg_grad-chrome.gif DELETED
Binary file
images/bg_grad-grey.gif DELETED
Binary file
images/icon-pmproadmin16-sprite.png DELETED
Binary file
images/icon-pmproadmin16-sprite_2x.png DELETED
Binary file
images/icon-pmproadmin32.png DELETED
Binary file
images/icon-pmproadmin32_2x.png DELETED
Binary file
includes/adminpages.php DELETED
@@ -1,226 +0,0 @@
1
- <?php
2
- /*
3
- Get array of PMPro Capabilities
4
- */
5
- function pmpro_getPMProCaps()
6
- {
7
- $pmpro_caps = array(
8
- //pmpro_memberships_menu //this controls viewing the menu itself
9
- 'pmpro_membershiplevels',
10
- 'pmpro_pagesettings',
11
- 'pmpro_paymentsettings',
12
- 'pmpro_emailsettings',
13
- 'pmpro_advancedsettings',
14
- 'pmpro_addons',
15
- 'pmpro_memberslist',
16
- 'pmpro_reports',
17
- 'pmpro_orders',
18
- 'pmpro_discountcodes'
19
- );
20
-
21
- return $pmpro_caps;
22
- }
23
-
24
- /*
25
- Dashboard Menu
26
- */
27
- function pmpro_add_pages()
28
- {
29
- global $wpdb;
30
-
31
- //array of all caps in the menu
32
- $pmpro_caps = pmpro_getPMProCaps();
33
-
34
- //the top level menu links to the first page they have access to
35
- foreach($pmpro_caps as $cap)
36
- {
37
- if(current_user_can($cap))
38
- {
39
- $top_menu_cap = $cap;
40
- break;
41
- }
42
- }
43
-
44
- if(empty($top_menu_cap))
45
- return;
46
-
47
- add_menu_page(__('Memberships', 'pmpro'), __('Memberships', 'pmpro'), 'pmpro_memberships_menu', 'pmpro-membershiplevels', $top_menu_cap, PMPRO_URL . '/images/menu_users.png');
48
- add_submenu_page('pmpro-membershiplevels', __('Page Settings', 'pmpro'), __('Page Settings', 'pmpro'), 'pmpro_pagesettings', 'pmpro-pagesettings', 'pmpro_pagesettings');
49
- add_submenu_page('pmpro-membershiplevels', __('Payment Settings', 'pmpro'), __('Payment Settings', 'pmpro'), 'pmpro_paymentsettings', 'pmpro-paymentsettings', 'pmpro_paymentsettings');
50
- add_submenu_page('pmpro-membershiplevels', __('Email Settings', 'pmpro'), __('Email Settings', 'pmpro'), 'pmpro_emailsettings', 'pmpro-emailsettings', 'pmpro_emailsettings');
51
- add_submenu_page('pmpro-membershiplevels', __('Advanced Settings', 'pmpro'), __('Advanced Settings', 'pmpro'), 'pmpro_advancedsettings', 'pmpro-advancedsettings', 'pmpro_advancedsettings');
52
- add_submenu_page('pmpro-membershiplevels', __('Add Ons', 'pmpro'), __('Add Ons', 'pmpro'), 'pmpro_addons', 'pmpro-addons', 'pmpro_addons');
53
- add_submenu_page('pmpro-membershiplevels', __('Members List', 'pmpro'), __('Members List', 'pmpro'), 'pmpro_memberslist', 'pmpro-memberslist', 'pmpro_memberslist');
54
- add_submenu_page('pmpro-membershiplevels', __('Reports', 'pmpro'), __('Reports', 'pmpro'), 'pmpro_reports', 'pmpro-reports', 'pmpro_reports');
55
- add_submenu_page('pmpro-membershiplevels', __('Orders', 'pmpro'), __('Orders', 'pmpro'), 'pmpro_orders', 'pmpro-orders', 'pmpro_orders');
56
- add_submenu_page('pmpro-membershiplevels', __('Discount Codes', 'pmpro'), __('Discount Codes', 'pmpro'), 'pmpro_discountcodes', 'pmpro-discountcodes', 'pmpro_discountcodes');
57
-
58
- //rename the automatically added Memberships submenu item
59
- global $submenu;
60
- if(!empty($submenu['pmpro-membershiplevels']))
61
- {
62
- if(current_user_can("pmpro_membershiplevels"))
63
- {
64
- $submenu['pmpro-membershiplevels'][0][0] = __( 'Membership Levels', 'pmpro' );
65
- $submenu['pmpro-membershiplevels'][0][3] = __( 'Membership Levels', 'pmpro' );
66
- }
67
- else
68
- {
69
- unset($submenu['pmpro-membershiplevels']);
70
- }
71
- }
72
- }
73
- add_action('admin_menu', 'pmpro_add_pages');
74
-
75
- /*
76
- Admin Bar
77
- */
78
- function pmpro_admin_bar_menu() {
79
- global $wp_admin_bar;
80
-
81
- //view menu at all?
82
- if ( !current_user_can('pmpro_memberships_menu') || !is_admin_bar_showing() )
83
- return;
84
-
85
- //array of all caps in the menu
86
- $pmpro_caps = pmpro_getPMProCaps();
87
-
88
- //the top level menu links to the first page they have access to
89
- foreach($pmpro_caps as $cap)
90
- {
91
- if(current_user_can($cap))
92
- {
93
- $top_menu_page = str_replace("_", "-", $cap);
94
- break;
95
- }
96
- }
97
-
98
- $wp_admin_bar->add_menu( array(
99
- 'id' => 'paid-memberships-pro',
100
- 'title' => __( 'Memberships', 'pmpro'),
101
- 'href' => get_admin_url(NULL, '/admin.php?page=' . $top_menu_page) ) );
102
-
103
- if(current_user_can('pmpro_membershiplevels'))
104
- $wp_admin_bar->add_menu( array(
105
- 'id' => 'pmpro-membership-levels',
106
- 'parent' => 'paid-memberships-pro',
107
- 'title' => __( 'Membership Levels', 'pmpro'),
108
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels') ) );
109
-
110
- if(current_user_can('pmpro_pagesettings'))
111
- $wp_admin_bar->add_menu( array(
112
- 'id' => 'pmpro-page-settings',
113
- 'parent' => 'paid-memberships-pro',
114
- 'title' => __( 'Page Settings', 'pmpro'),
115
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-pagesettings') ) );
116
-
117
- if(current_user_can('pmpro_paymentsettings'))
118
- $wp_admin_bar->add_menu( array(
119
- 'id' => 'pmpro-payment-settings',
120
- 'parent' => 'paid-memberships-pro',
121
- 'title' => __( 'Payment Settings', 'pmpro'),
122
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-paymentsettings') ) );
123
-
124
- if(current_user_can('pmpro_emailsettings'))
125
- $wp_admin_bar->add_menu( array(
126
- 'id' => 'pmpro-email-settings',
127
- 'parent' => 'paid-memberships-pro',
128
- 'title' => __( 'Email Settings', 'pmpro'),
129
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-emailsettings') ) );
130
-
131
- if(current_user_can('pmpro_advancedsettings'))
132
- $wp_admin_bar->add_menu( array(
133
- 'id' => 'pmpro-advanced-settings',
134
- 'parent' => 'paid-memberships-pro',
135
- 'title' => __( 'Advanced Settings', 'pmpro'),
136
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-advancedsettings') ) );
137
-
138
- if(current_user_can('pmpro_addons'))
139
- $wp_admin_bar->add_menu( array(
140
- 'id' => 'pmpro-addons',
141
- 'parent' => 'paid-memberships-pro',
142
- 'title' => __( 'Add Ons', 'pmpro'),
143
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-addons') ) );
144
-
145
- if(current_user_can('pmpro_memberslist'))
146
- $wp_admin_bar->add_menu( array(
147
- 'id' => 'pmpro-members-list',
148
- 'parent' => 'paid-memberships-pro',
149
- 'title' => __( 'Members List', 'pmpro'),
150
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-memberslist') ) );
151
-
152
- if(current_user_can('pmpro_reports'))
153
- $wp_admin_bar->add_menu( array(
154
- 'id' => 'pmpro-reports',
155
- 'parent' => 'paid-memberships-pro',
156
- 'title' => __( 'Reports', 'pmpro'),
157
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-reports') ) );
158
-
159
- if(current_user_can('pmpro_orders'))
160
- $wp_admin_bar->add_menu( array(
161
- 'id' => 'pmpro-orders',
162
- 'parent' => 'paid-memberships-pro',
163
- 'title' => __( 'Orders', 'pmpro'),
164
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-orders') ) );
165
-
166
- if(current_user_can('pmpro_discountcodes'))
167
- $wp_admin_bar->add_menu( array(
168
- 'id' => 'pmpro-discount-codes',
169
- 'parent' => 'paid-memberships-pro',
170
- 'title' => __( 'Discount Codes', 'pmpro'),
171
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes') ) );
172
- }
173
- add_action('admin_bar_menu', 'pmpro_admin_bar_menu', 1000);
174
-
175
- /*
176
- Functions to load pages from adminpages directory
177
- */
178
- function pmpro_reports()
179
- {
180
- require_once(PMPRO_DIR . "/adminpages/reports.php");
181
- }
182
-
183
- function pmpro_memberslist()
184
- {
185
- require_once(PMPRO_DIR . "/adminpages/memberslist.php");
186
- }
187
-
188
- function pmpro_discountcodes()
189
- {
190
- require_once(PMPRO_DIR . "/adminpages/discountcodes.php");
191
- }
192
-
193
- function pmpro_membershiplevels()
194
- {
195
- require_once(PMPRO_DIR . "/adminpages/membershiplevels.php");
196
- }
197
-
198
- function pmpro_pagesettings()
199
- {
200
- require_once(PMPRO_DIR . "/adminpages/pagesettings.php");
201
- }
202
-
203
- function pmpro_paymentsettings()
204
- {
205
- require_once(PMPRO_DIR . "/adminpages/paymentsettings.php");
206
- }
207
-
208
- function pmpro_emailsettings()
209
- {
210
- require_once(PMPRO_DIR . "/adminpages/emailsettings.php");
211
- }
212
-
213
- function pmpro_advancedsettings()
214
- {
215
- require_once(PMPRO_DIR . "/adminpages/advancedsettings.php");
216
- }
217
-
218
- function pmpro_addons()
219
- {
220
- require_once(PMPRO_DIR . "/adminpages/addons.php");
221
- }
222
-
223
- function pmpro_orders()
224
- {
225
- require_once(PMPRO_DIR . "/adminpages/orders.php");
226
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/cleanup.php DELETED
@@ -1,40 +0,0 @@
1
- <?php
2
- /*
3
- Clean things up when deletes happen, etc. (This stuff needs a better home.)
4
- */
5
- //deleting a user? remove their account info.
6
- function pmpro_delete_user($user_id = NULL)
7
- {
8
- global $wpdb;
9
-
10
- //changing their membership level to 0 will cancel any subscription and remove their membership level entry
11
- //we don't remove the orders because it would affect reporting
12
- if(pmpro_changeMembershipLevel(0, $user_id))
13
- {
14
- //okay
15
- }
16
- else
17
- {
18
- //okay, guessing they didn't have a level
19
- }
20
- }
21
- add_action('delete_user', 'pmpro_delete_user');
22
- add_action('wpmu_delete_user', 'pmpro_delete_user');
23
-
24
- //deleting a category? remove any level associations
25
- function pmpro_delete_category($cat_id = NULL)
26
- {
27
- global $wpdb;
28
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE category_id = '" . $cat_id . "'";
29
- $wpdb->query($sqlQuery);
30
- }
31
- add_action('delete_category', 'pmpro_delete_category');
32
-
33
- //deleting a post? remove any level associations
34
- function pmpro_delete_post($post_id = NULL)
35
- {
36
- global $wpdb;
37
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_pages WHERE page_id = '" . $post_id . "'";
38
- $wpdb->query($sqlQuery);
39
- }
40
- add_action('delete_post', 'pmpro_delete_post');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/content.php DELETED
@@ -1,405 +0,0 @@
1
- <?php
2
- /*
3
- Functions to detect member content and protect it.
4
- */
5
- function pmpro_has_membership_access($post_id = NULL, $user_id = NULL, $return_membership_levels = false)
6
- {
7
- global $post, $wpdb, $current_user;
8
- //use globals if no values supplied
9
- if(!$post_id)
10
- $post_id = $post->ID;
11
- if(!$user_id)
12
- $user_id = $current_user->ID;
13
-
14
- //no post, return true (changed from false in version 1.7.2)
15
- if(!$post_id)
16
- return true;
17
-
18
- //if no post or current_user object, set them up
19
- if(!empty($post->ID) && $post_id == $post->ID)
20
- $mypost = $post;
21
- else
22
- $mypost = get_post($post_id);
23
-
24
- if($user_id == $current_user->ID)
25
- $myuser = $current_user;
26
- else
27
- $myuser = get_userdata($user_id);
28
-
29
- //for these post types, we want to check the parent
30
- if($mypost->post_type == "attachment" || $mypost->post_type == "revision")
31
- {
32
- $mypost = get_post($mypost->post_parent);
33
- }
34
-
35
- if($mypost->post_type == "post")
36
- {
37
- $post_categories = wp_get_post_categories($mypost->ID);
38
-
39
- if(!$post_categories)
40
- {
41
- //just check for entries in the memberships_pages table
42
- $sqlQuery = "SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
43
- }
44
- else
45
- {
46
- //are any of the post categories associated with membership levels? also check the memberships_pages table
47
- $sqlQuery = "(SELECT m.id, m.name FROM $wpdb->pmpro_memberships_categories mc LEFT JOIN $wpdb->pmpro_membership_levels m ON mc.membership_id = m.id WHERE mc.category_id IN(" . implode(",", $post_categories) . ") AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "')";
48
- }
49
- }
50
- else
51
- {
52
- //are any membership levels associated with this page?
53
- $sqlQuery = "SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
54
- }
55
-
56
-
57
- $post_membership_levels = $wpdb->get_results($sqlQuery);
58
-
59
- $post_membership_levels_ids = array();
60
- $post_membership_levels_names = array();
61
-
62
- if(!$post_membership_levels)
63
- {
64
- $hasaccess = true;
65
- }
66
- else
67
- {
68
- //we need to see if the user has access
69
- foreach($post_membership_levels as $level)
70
- {
71
- $post_membership_levels_ids[] = $level->id;
72
- $post_membership_levels_names[] = $level->name;
73
- }
74
-
75
- //levels found. check if this is in a feed or if the current user is in at least one of those membership levels
76
- if(is_feed())
77
- {
78
- //always block restricted feeds
79
- $hasaccess = false;
80
- }
81
- elseif(!empty($myuser->ID))
82
- {
83
- $myuser->membership_level = pmpro_getMembershipLevelForUser($myuser->ID);
84
- if(!empty($myuser->membership_level->ID) && in_array($myuser->membership_level->ID, $post_membership_levels_ids))
85
- {
86
- //the users membership id is one that will grant access
87
- $hasaccess = true;
88
- }
89
- else
90
- {
91
- //user isn't a member of a level with access
92
- $hasaccess = false;
93
- }
94
- }
95
- else
96
- {
97
- //user is not logged in and this content requires membership
98
- $hasaccess = false;
99
- }
100
- }
101
-
102
- /*
103
- Filters
104
- The generic filter is run first. Then if there is a filter for this post type, that is run.
105
- */
106
- //general filter for all posts
107
- $hasaccess = apply_filters("pmpro_has_membership_access_filter", $hasaccess, $mypost, $myuser, $post_membership_levels);
108
- //filter for this post type
109
- if(has_filter("pmpro_has_membership_access_filter_" . $mypost->post_type))
110
- $hasaccess = apply_filters("pmpro_has_membership_access_filter_" . $mypost->post_type, $hasaccess, $mypost, $myuser, $post_membership_levels);
111
-
112
- //return
113
- if($return_membership_levels)
114
- return array($hasaccess, $post_membership_levels_ids, $post_membership_levels_names);
115
- else
116
- return $hasaccess;
117
- }
118
-
119
- function pmpro_search_filter($query)
120
- {
121
- global $current_user, $wpdb, $pmpro_pages;
122
-
123
- //hide pmpro pages from search results
124
- if(!$query->is_admin && $query->is_search && empty($query->query['post_parent']))
125
- {
126
- $query->set('post__not_in', $pmpro_pages ); // id of page or post
127
- }
128
-
129
- //hide member pages from non-members (make sure they aren't hidden from members)
130
- if(!$query->is_admin &&
131
- !$query->is_singular &&
132
- empty($query->query['post_parent']) &&
133
- (
134
- empty($query->query_vars['post_type']) ||
135
- in_array($query->query_vars['post_type'], apply_filters('pmpro_search_filter_post_types', array("page", "post")))
136
- )
137
- )
138
- {
139
- //get page ids that are in my levels
140
- $levels = pmpro_getMembershipLevelsForUser($current_user->ID);
141
- $my_pages = array();
142
-
143
- if($levels) {
144
- foreach($levels as $key => $level) {
145
- //get restricted posts for level
146
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE membership_id=" . $current_user->membership_level->ID;
147
- $member_pages = $wpdb->get_col($sql);
148
- $my_pages = array_unique(array_merge($my_pages, $member_pages));
149
- }
150
- }
151
-
152
- //get hidden page ids
153
- if(!empty($my_pages))
154
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE page_id NOT IN(" . implode(',', $my_pages) . ")";
155
- else
156
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages";
157
- $hidden_page_ids = array_values(array_unique($wpdb->get_col($sql)));
158
-
159
- if($hidden_page_ids)
160
- $query->set('post__not_in', $hidden_page_ids);
161
-
162
- //get categories that are filtered by level, but not my level
163
- $my_cats = array();
164
-
165
- if($levels) {
166
- foreach($levels as $key => $level) {
167
- $member_cats = pmpro_getMembershipCategories($level->id);
168
- $my_cats = array_unique(array_merge($my_cats, $member_cats));
169
- }
170
- }
171
-
172
- //get hidden cats
173
- if(!empty($my_cats))
174
- $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories WHERE category_id NOT IN(" . implode(',', $my_cats) . ")";
175
- else
176
- $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories";
177
-
178
- $hidden_cat_ids = array_values(array_unique($wpdb->get_col($sql)));
179
-
180
- //make this work
181
- if($hidden_cat_ids)
182
- $query->set('category__not_in', $hidden_cat_ids);
183
- }
184
-
185
- return $query;
186
- }
187
- $filterqueries = pmpro_getOption("filterqueries");
188
- if(!empty($filterqueries))
189
- add_filter( 'pre_get_posts', 'pmpro_search_filter' );
190
-
191
- function pmpro_membership_content_filter($content, $skipcheck = false)
192
- {
193
- global $post, $current_user;
194
-
195
- if(!$skipcheck)
196
- {
197
- $hasaccess = pmpro_has_membership_access(NULL, NULL, true);
198
- if(is_array($hasaccess))
199
- {
200
- //returned an array to give us the membership level values
201
- $post_membership_levels_ids = $hasaccess[1];
202
- $post_membership_levels_names = $hasaccess[2];
203
- $hasaccess = $hasaccess[0];
204
- }
205
- }
206
-
207
- if($hasaccess)
208
- {
209
- //all good, return content
210
- return $content;
211
- }
212
- else
213
- {
214
- //if show excerpts is set, return just the excerpt
215
- if(pmpro_getOption("showexcerpts"))
216
- {
217
- //show excerpt
218
- global $post;
219
- if($post->post_excerpt)
220
- {
221
- //defined exerpt
222
- $content = wpautop($post->post_excerpt);
223
- }
224
- elseif(strpos($content, "<span id=\"more-" . $post->ID . "\"></span>") !== false)
225
- {
226
- //more tag
227
- $pos = strpos($content, "<span id=\"more-" . $post->ID . "\"></span>");
228
- $content = wpautop(substr($content, 0, $pos));
229
- }
230
- elseif(strpos($content, 'class="more-link">') !== false)
231
- {
232
- //more link
233
- $content = preg_replace("/\<a.*class\=\"more\-link\".*\>.*\<\/a\>/", "", $content);
234
- }
235
- else
236
- {
237
- //auto generated excerpt. pulled from wp_trim_excerpt
238
- $content = strip_shortcodes( $content );
239
- $content = str_replace(']]>', ']]&gt;', $content);
240
- $content = strip_tags($content);
241
- $excerpt_length = apply_filters('excerpt_length', 55);
242
- $words = preg_split("/[\n\r\t ]+/", $content, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
243
- if ( count($words) > $excerpt_length ) {
244
- array_pop($words);
245
- $content = implode(' ', $words);
246
- $content = $content . "... ";
247
- } else {
248
- $content = implode(' ', $words) . "... ";
249
- }
250
-
251
- $content = wpautop($content);
252
- }
253
- }
254
- else
255
- {
256
- //else hide everything
257
- $content = "";
258
- }
259
-
260
- if(empty($post_membership_levels_ids))
261
- $post_membership_levels_ids = array();
262
-
263
- if(empty($post_membership_levels_names))
264
- $post_membership_levels_names = array();
265
-
266
- $pmpro_content_message_pre = '<div class="pmpro_content_message">';
267
- $pmpro_content_message_post = '</div>';
268
-
269
- $sr_search = array("!!levels!!", "!!referrer!!");
270
- $sr_replace = array(pmpro_implodeToEnglish($post_membership_levels_names), $_SERVER['REQUEST_URI']);
271
-
272
- //get the correct message to show at the bottom
273
- if(is_feed())
274
- {
275
- $newcontent = apply_filters("pmpro_rss_text_filter", stripslashes(pmpro_getOption("rsstext")));
276
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
277
- }
278
- elseif($current_user->ID)
279
- {
280
- //not a member
281
- $newcontent = apply_filters("pmpro_non_member_text_filter", stripslashes(pmpro_getOption("nonmembertext")));
282
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
283
- }
284
- else
285
- {
286
- //not logged in!
287
- $newcontent = apply_filters("pmpro_not_logged_in_text_filter", stripslashes(pmpro_getOption("notloggedintext")));
288
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
289
- }
290
- }
291
-
292
- return $content;
293
- }
294
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
295
- add_filter('the_content_rss', 'pmpro_membership_content_filter', 5);
296
- add_filter('comment_text_rss', 'pmpro_membership_content_filter', 5);
297
-
298
- /*
299
- If the_excerpt is called, we want to disable the_content filters so the PMPro messages aren't added to the content before AND after the ecerpt.
300
- */
301
- function pmpro_membership_excerpt_filter($content, $skipcheck = false)
302
- {
303
- remove_filter('the_content', 'pmpro_membership_content_filter', 5);
304
- $content = pmpro_membership_content_filter($content, $skipcheck);
305
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
306
-
307
- return $content;
308
- }
309
- function pmpro_membership_get_excerpt_filter_start($content, $skipcheck = false)
310
- {
311
- remove_filter('the_content', 'pmpro_membership_content_filter', 5);
312
- return $content;
313
- }
314
- function pmpro_membership_get_excerpt_filter_end($content, $skipcheck = false)
315
- {
316
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
317
- return $content;
318
- }
319
- add_filter('the_excerpt', 'pmpro_membership_excerpt_filter', 15);
320
- add_filter('get_the_excerpt', 'pmpro_membership_get_excerpt_filter_start', 1);
321
- add_filter('get_the_excerpt', 'pmpro_membership_get_excerpt_filter_end', 100);
322
-
323
- function pmpro_comments_filter($comments, $post_id = NULL)
324
- {
325
- global $post, $wpdb, $current_user;
326
- if(!$post_id)
327
- $post_id = $post->ID;
328
-
329
- if(!$comments)
330
- return $comments; //if they are closed anyway, we don't need to check
331
-
332
- global $post, $current_user;
333
-
334
- $hasaccess = pmpro_has_membership_access(NULL, NULL, true);
335
- if(is_array($hasaccess))
336
- {
337
- //returned an array to give us the membership level values
338
- $post_membership_levels_ids = $hasaccess[1];
339
- $post_membership_levels_names = $hasaccess[2];
340
- $hasaccess = $hasaccess[0];
341
- }
342
-
343
- if($hasaccess)
344
- {
345
- //all good, return content
346
- return $comments;
347
- }
348
- else
349
- {
350
- if(!$post_membership_levels_ids)
351
- $post_membership_levels_ids = array();
352
-
353
- if(!$post_membership_levels_names)
354
- $post_membership_levels_names = array();
355
-
356
- //get the correct message
357
- if(is_feed())
358
- {
359
- if(is_array($comments))
360
- return array();
361
- else
362
- return false;
363
- }
364
- elseif($current_user->ID)
365
- {
366
- //not a member
367
- if(is_array($comments))
368
- return array();
369
- else
370
- return false;
371
- }
372
- else
373
- {
374
- //not logged in!
375
- if(is_array($comments))
376
- return array();
377
- else
378
- return false;
379
- }
380
- }
381
-
382
- return $comments;
383
- }
384
- add_filter("comments_array", "pmpro_comments_filter");
385
- add_filter("comments_open", "pmpro_comments_filter");
386
-
387
- //keep non-members from getting to certain pages (attachments, etc)
388
- function pmpro_hide_pages_redirect()
389
- {
390
- global $post;
391
-
392
- if(!is_admin() && !empty($post->ID))
393
- {
394
- if($post->post_type == "attachment")
395
- {
396
- //check if the user has access to the parent
397
- if(!pmpro_has_membership_access($post->ID))
398
- {
399
- wp_redirect(pmpro_url("levels"));
400
- exit;
401
- }
402
- }
403
- }
404
- }
405
- add_action('wp', 'pmpro_hide_pages_redirect');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/countries.php CHANGED
@@ -256,4 +256,5 @@
256
 
257
  asort($pmpro_countries);
258
 
259
- $pmpro_countries = apply_filters("pmpro_countries", $pmpro_countries);
 
256
 
257
  asort($pmpro_countries);
258
 
259
+ $pmpro_countries = apply_filters("pmpro_countries", $pmpro_countries);
260
+ ?>
includes/currencies.php CHANGED
@@ -10,13 +10,10 @@
10
  'AUD' => __('Australian Dollars (&#36;)', 'pmpro'),
11
  'BRL' => __('Brazilian Real (&#36;)', 'pmpro'),
12
  'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
13
- 'CNY' => __('Chinese Yuan', 'pmpro'),
14
  'CZK' => __('Czech Koruna', 'pmpro'),
15
  'DKK' => __('Danish Krone', 'pmpro'),
16
  'HKD' => __('Hong Kong Dollar (&#36;)', 'pmpro'),
17
  'HUF' => __('Hungarian Forint', 'pmpro'),
18
- 'INR' => __('Indian Rupee', 'pmpro'),
19
- 'IDR' => __('Indonesia Rupiah', 'pmpro'),
20
  'ILS' => __('Israeli Shekel', 'pmpro'),
21
  'JPY' => __('Japanese Yen (&yen;)', 'pmpro'),
22
  'MYR' => __('Malaysian Ringgits', 'pmpro'),
@@ -26,24 +23,11 @@
26
  'PHP' => __('Philippine Pesos', 'pmpro'),
27
  'PLN' => __('Polish Zloty', 'pmpro'),
28
  'SGD' => __('Singapore Dollar (&#36;)', 'pmpro'),
29
- 'ZAR' => __('South African Rand', 'pmpro'),
30
- 'KRW' => __('South Korean Won', 'pmpro'),
31
  'SEK' => __('Swedish Krona', 'pmpro'),
32
  'CHF' => __('Swiss Franc', 'pmpro'),
33
  'TWD' => __('Taiwan New Dollars', 'pmpro'),
34
- 'THB' => __('Thai Baht', 'pmpro'),
35
- 'TRY' => __('Turkish Lira', 'pmpro'),
36
- 'VND' => __('Vietnamese Dong', 'pmpro')
37
  );
38
 
39
  $pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
40
-
41
- //stripe only supports a few (not using this anymore since 1.7.4)
42
- global $pmpro_stripe_currencies;
43
- $pmpro_stripe_currencies = array(
44
- 'USD' => __('US Dollars (&#36;)', 'pmpro'),
45
- 'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
46
- 'GBP' => __('Pounds Sterling (&pound;)', 'pmpro'),
47
- 'EUR' => __('Euros (&euro;)', 'pmpro')
48
- );
49
  ?>
10
  'AUD' => __('Australian Dollars (&#36;)', 'pmpro'),
11
  'BRL' => __('Brazilian Real (&#36;)', 'pmpro'),
12
  'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
 
13
  'CZK' => __('Czech Koruna', 'pmpro'),
14
  'DKK' => __('Danish Krone', 'pmpro'),
15
  'HKD' => __('Hong Kong Dollar (&#36;)', 'pmpro'),
16
  'HUF' => __('Hungarian Forint', 'pmpro'),
 
 
17
  'ILS' => __('Israeli Shekel', 'pmpro'),
18
  'JPY' => __('Japanese Yen (&yen;)', 'pmpro'),
19
  'MYR' => __('Malaysian Ringgits', 'pmpro'),
23
  'PHP' => __('Philippine Pesos', 'pmpro'),
24
  'PLN' => __('Polish Zloty', 'pmpro'),
25
  'SGD' => __('Singapore Dollar (&#36;)', 'pmpro'),
 
 
26
  'SEK' => __('Swedish Krona', 'pmpro'),
27
  'CHF' => __('Swiss Franc', 'pmpro'),
28
  'TWD' => __('Taiwan New Dollars', 'pmpro'),
29
+ 'THB' => __('Thai Baht', 'pmpro')
 
 
30
  );
31
 
32
  $pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
 
 
 
 
 
 
 
 
 
33
  ?>
includes/email.php DELETED
@@ -1,111 +0,0 @@
1
- <?php
2
- /*
3
- Nicer default emails
4
- */
5
- function pmpro_wp_mail_from_name($from_name)
6
- {
7
- $default_from_name = 'WordPress';
8
-
9
- //make sure it's the default from name
10
- if($from_name == $default_from_name)
11
- {
12
- $pmpro_from_name = pmpro_getOption("from_name");
13
- if ($pmpro_from_name)
14
- $from_name = $pmpro_from_name;
15
- }
16
-
17
- return $from_name;
18
- }
19
- function pmpro_wp_mail_from($from_email)
20
- {
21
- // default from email wordpress@sitename
22
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
23
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
24
- $sitename = substr( $sitename, 4 );
25
- }
26
- $default_from_email = 'wordpress@' . $sitename;
27
-
28
- //make sure it's the default email address
29
- if($from_email == $default_from_email)
30
- {
31
- $pmpro_from_email = pmpro_getOption("from_email");
32
- if ($pmpro_from_email && is_email( $pmpro_from_email ) )
33
- $from_email = $pmpro_from_email;
34
- }
35
-
36
- return $from_email;
37
- }
38
-
39
- $only_filter_pmpro_emails = pmpro_getOption("only_filter_pmpro_emails");
40
- if($only_filter_pmpro_emails)
41
- {
42
- add_filter('pmpro_email_sender_name', 'pmpro_wp_mail_from_name');
43
- add_filter('pmpro_email_sender', 'pmpro_wp_mail_from');
44
- }
45
- else
46
- {
47
- add_filter('wp_mail_from_name', 'pmpro_wp_mail_from_name');
48
- add_filter('wp_mail_from', 'pmpro_wp_mail_from');
49
- }
50
-
51
- /*
52
- If the $email_member_notification option is empty, disable the wp_new_user_notification email at checkout.
53
- */
54
- $email_member_notification = pmpro_getOption("email_member_notification");
55
- if(empty($email_member_notification))
56
- add_filter("pmpro_wp_new_user_notification", "__return_false", 0);
57
-
58
- /*
59
- Adds template files and changes content type to html if using PHPMailer directly.
60
- */
61
- function pmpro_send_html( $phpmailer ) {
62
-
63
- // Set the original plain text message
64
- $phpmailer->AltBody = wp_specialchars_decode($phpmailer->Body, ENT_QUOTES);
65
- // Clean < and > around text links in WP 3.1
66
- $phpmailer->Body = preg_replace('#<(http://[^*]+)>#', '$1', $phpmailer->Body);
67
- // Convert line breaks & make links clickable
68
- $phpmailer->Body = make_clickable ($phpmailer->Body);
69
-
70
- // Add header to message if found
71
- if(file_exists(get_stylesheet_directory() . "/email_header.html"))
72
- $phpmailer->Body = file_get_contents(get_stylesheet_directory() . "/email_header.html") . "\n" . $phpmailer->Body;
73
- elseif(file_exists(get_template_directory() . "/email_header.html"))
74
- $phpmailer->Body = file_get_contents(get_template_directory() . "/email_header.html") . "\n" . $phpmailer->Body;
75
-
76
- // Add footer to message if found
77
- if(file_exists(get_stylesheet_directory() . "/email_footer.html"))
78
- $phpmailer->Body = $phpmailer->Body . "\n" . file_get_contents(get_stylesheet_directory() . "/email_footer.html");
79
- elseif(file_exists(get_template_directory() . "/email_footer.html"))
80
- $phpmailer->Body = $phpmailer->Body . "\n" . file_get_contents(get_template_directory() . "/email_footer.html");
81
-
82
- // Replace variables in email
83
- global $current_user;
84
- $data = array(
85
- "name" => $current_user->display_name,
86
- "sitename" => get_option("blogname"),
87
- "login_link" => pmpro_url("account"),
88
- "display_name" => $current_user->display_name,
89
- "user_email" => $current_user->user_email,
90
- "subject" => $phpmailer->Subject
91
- );
92
- foreach($data as $key => $value)
93
- {
94
- $phpmailer->Body = str_replace("!!" . $key . "!!", $value, $phpmailer->Body);
95
- }
96
-
97
- do_action("pmpro_after_phpmailer_init", $phpmailer);
98
- do_action("pmpro_after_pmpmailer_init", $phpmailer); //typo left in for backwards compatibility
99
- }
100
-
101
- function pmpro_wp_mail_content_type( $content_type ) {
102
- add_action('phpmailer_init', 'pmpro_send_html');
103
-
104
- //change to html if not already
105
- if( $content_type == 'text/plain')
106
- {
107
- $content_type = 'text/html';
108
- }
109
- return $content_type;
110
- }
111
- add_filter('wp_mail_content_type', 'pmpro_wp_mail_content_type');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/filters.php DELETED
@@ -1,150 +0,0 @@
1
- <?php
2
- /*
3
- This file was added in version 1.5.5 of the plugin. This file is meant to store various hacks, filters, and actions that were originally developed outside of the PMPro core and brought in later... or just things that are cleaner/easier to impement via hooks and filters.
4
- */
5
-
6
- /*
7
- If checking out for the same level, add remaining days to the enddate.
8
- Pulled in from: https://gist.github.com/3678054
9
- */
10
- function pmpro_checkout_level_extend_memberships($level)
11
- {
12
- global $pmpro_msg, $pmpro_msgt;
13
-
14
- //does this level expire? are they an existing user of this level?
15
- if(!empty($level) && !empty($level->expiration_number) && pmpro_hasMembershipLevel($level->id))
16
- {
17
- //get the current enddate of their membership
18
- global $current_user;
19
- $expiration_date = $current_user->membership_level->enddate;
20
-
21
- //calculate days left
22
- $todays_date = current_time('timestamp');
23
- $time_left = $expiration_date - $todays_date;
24
-
25
- //time left?
26
- if($time_left > 0)
27
- {
28
- //convert to days and add to the expiration date (assumes expiration was 1 year)
29
- $days_left = floor($time_left/(60*60*24));
30
-
31
- //figure out days based on period
32
- if($level->expiration_period == "Day")
33
- $total_days = $days_left + $level->expiration_number;
34
- elseif($level->expiration_period == "Week")
35
- $total_days = $days_left + $level->expiration_number * 7;
36
- elseif($level->expiration_period == "Month")
37
- $total_days = $days_left + $level->expiration_number * 30;
38
- elseif($level->expiration_period == "Year")
39
- $total_days = $days_left + $level->expiration_number * 365;
40
-
41
- //update number and period
42
- $level->expiration_number = $total_days;
43
- $level->expiration_period = "Day";
44
- }
45
- }
46
-
47
- return $level;
48
- }
49
- add_filter("pmpro_checkout_level", "pmpro_checkout_level_extend_memberships");
50
- /*
51
- Same thing as above but when processed by the ipnhandler for PayPal standard.
52
- */
53
- function pmpro_ipnhandler_level_extend_memberships($level, $user_id)
54
- {
55
- global $pmpro_msg, $pmpro_msgt;
56
-
57
- //does this level expire? are they an existing user of this level?
58
- if(!empty($level) && !empty($level->expiration_number) && pmpro_hasMembershipLevel($level->id, $user_id))
59
- {
60
- //get the current enddate of their membership
61
- $user_level = pmpro_getMembershipLevelForUser($user_id);
62
- $expiration_date = $user_level->enddate;
63
-
64
- //calculate days left
65
- $todays_date = current_time('timestamp');
66
- $time_left = $expiration_date - $todays_date;
67
-
68
- //time left?
69
- if($time_left > 0)
70
- {
71
- //convert to days and add to the expiration date (assumes expiration was 1 year)
72
- $days_left = floor($time_left/(60*60*24));
73
-
74
- //figure out days based on period
75
- if($level->expiration_period == "Day")
76
- $total_days = $days_left + $level->expiration_number;
77
- elseif($level->expiration_period == "Week")
78
- $total_days = $days_left + $level->expiration_number * 7;
79
- elseif($level->expiration_period == "Month")
80
- $total_days = $days_left + $level->expiration_number * 30;
81
- elseif($level->expiration_period == "Year")
82
- $total_days = $days_left + $level->expiration_number * 365;
83
-
84
- //update number and period
85
- $level->expiration_number = $total_days;
86
- $level->expiration_period = "Day";
87
- }
88
- }
89
-
90
- return $level;
91
- }
92
- add_filter("pmpro_ipnhandler_level", "pmpro_ipnhandler_level_extend_memberships", 10, 2);
93
-
94
- /*
95
- If checking out for the same level, keep your old startdate.
96
- Added with 1.5.5
97
- */
98
- function pmpro_checkout_start_date_keep_startdate($startdate, $user_id, $level)
99
- {
100
- if(pmpro_hasMembershipLevel($level->id, $user_id))
101
- {
102
- global $wpdb;
103
- $sqlQuery = "SELECT startdate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . esc_sql($user_id) . "' AND membership_id = '" . esc_sql($level->id) . "' AND status = 'active' ORDER BY id DESC LIMIT 1";
104
- $old_startdate = $wpdb->get_var($sqlQuery);
105
-
106
- if(!empty($old_startdate))
107
- $startdate = "'" . $old_startdate . "'";
108
- }
109
-
110
- return $startdate;
111
- }
112
- add_filter("pmpro_checkout_start_date", "pmpro_checkout_start_date_keep_startdate", 10, 3);
113
-
114
- /*
115
- Stripe Lite Pulled into Core Plugin
116
- */
117
- //Stripe Lite, Set the Globals/etc
118
- $stripe_billingaddress = pmpro_getOption("stripe_billingaddress");
119
- if(empty($stripe_billingaddress))
120
- {
121
- global $pmpro_stripe_lite;
122
- $pmpro_stripe_lite = true;
123
- add_filter("pmpro_stripe_lite", "__return_true");
124
- add_filter("pmpro_required_billing_fields", "pmpro_required_billing_fields_stripe_lite");
125
- }
126
-
127
- //Stripe Lite, Don't Require Billing Fields
128
- function pmpro_required_billing_fields_stripe_lite($fields)
129
- {
130
- global $gateway;
131
-
132
- //ignore if not using stripe
133
- if($gateway != "stripe")
134
- return $fields;
135
-
136
- //some fields to remove
137
- $remove = array('bfirstname', 'blastname', 'baddress1', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType');
138
-
139
- //if a user is logged in, don't require bemail either
140
- global $current_user;
141
- if(!empty($current_user->user_email))
142
- $remove[] = 'bemail';
143
-
144
- //remove the fields
145
- foreach($remove as $field)
146
- unset($fields[$field]);
147
-
148
- //ship it!
149
- return $fields;
150
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/functions.php CHANGED
@@ -1,1742 +1,1122 @@
1
- <?php
2
- /****************************************************************
3
-
4
- IMPORTANT. PLEASE READ.
5
-
6
- DO NOT EDIT THIS FILE or any other file in the /wp-content/plugins/paid-memberships-pro/ directory.
7
- Doing so could break the PMPro plugin and/or keep you from upgrading this plugin in the future.
8
- We regularly release updates to the plugin, including important security fixes and new features.
9
- You want to be able to upgrade.
10
-
11
- If you were asked to insert code into "your functions.php file", it was meant that you edit the functions.php
12
- in the root folder of your active theme. e.g. /wp-content/themes/twentytwelve/functions.php
13
- You can also create a custom plugin to place customization code into. Instructions are here:
14
- http://www.paidmembershipspro.com/2012/08/create-a-plugin-for-pmpro-customizations/
15
-
16
- Further documentation for customizing Paid Memberships Pro can be found here:
17
- http://www.paidmembershipspro.com/documentation/
18
-
19
- ****************************************************************/
20
- if(!function_exists("sornot"))
21
- {
22
- function sornot($t, $n)
23
- {
24
- if($n == 1)
25
- return $t;
26
- else
27
- return $t . "s";
28
- }
29
- }
30
-
31
- //setup wpdb for the tables we need
32
- function pmpro_setDBTables()
33
- {
34
- global $table_prefix, $wpdb;
35
- $wpdb->hide_errors();
36
- $wpdb->pmpro_membership_levels = $table_prefix . 'pmpro_membership_levels';
37
- $wpdb->pmpro_memberships_users = $table_prefix . 'pmpro_memberships_users';
38
- $wpdb->pmpro_memberships_categories = $table_prefix . 'pmpro_memberships_categories';
39
- $wpdb->pmpro_memberships_pages = $table_prefix . 'pmpro_memberships_pages';
40
- $wpdb->pmpro_membership_orders = $table_prefix . 'pmpro_membership_orders';
41
- $wpdb->pmpro_discount_codes = $wpdb->prefix . 'pmpro_discount_codes';
42
- $wpdb->pmpro_discount_codes_levels = $wpdb->prefix . 'pmpro_discount_codes_levels';
43
- $wpdb->pmpro_discount_codes_uses = $wpdb->prefix . 'pmpro_discount_codes_uses';
44
- }
45
- pmpro_setDBTables();
46
-
47
- //from: http://stackoverflow.com/questions/5266945/wordpress-how-detect-if-current-page-is-the-login-page/5892694#5892694
48
- function pmpro_is_login_page() {
49
- return (in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')) || is_page("login"));
50
- }
51
-
52
- //thanks: http://wordpress.org/support/topic/is_plugin_active
53
- function pmpro_is_plugin_active( $plugin ) {
54
- return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
55
- }
56
-
57
- //scraping - override n if you have more than 1 group of matches and don't want the first group
58
- function pmpro_getMatches($p, $s, $firstvalue = FALSE, $n = 1)
59
- {
60
- $ok = preg_match_all($p, $s, $matches);
61
-
62
- if(!$ok)
63
- return false;
64
- else
65
- {
66
- if($firstvalue)
67
- return $matches[$n][0];
68
- else
69
- return $matches[$n];
70
- }
71
- }
72
-
73
- function pmpro_br2nl($text, $tags = "br")
74
- {
75
- if(!is_array($tags))
76
- $tags = explode(" ", $tags);
77
-
78
- foreach($tags as $tag)
79
- {
80
- $text = eregi_replace("<" . $tag . "[^>]*>", "\n", $text);
81
- $text = eregi_replace("</" . $tag . "[^>]*>", "\n", $text);
82
- }
83
-
84
- return($text);
85
- }
86
-
87
- function pmpro_getOption($s, $force = false)
88
- {
89
- if(isset($_REQUEST[$s]) && !$force)
90
- {
91
- if(!is_array($_REQUEST[$s]))
92
- return trim($_REQUEST[$s]);
93
- else
94
- return $_REQUEST[$s];
95
- }
96
- elseif(get_option("pmpro_" . $s))
97
- return get_option("pmpro_" . $s);
98
- else
99
- return "";
100
- }
101
-
102
- function pmpro_setOption($s, $v = NULL)
103
- {
104
- //no value is given, set v to the request var
105
- if($v === NULL && isset($_REQUEST[$s]))
106
- $v = $_REQUEST[$s];
107
-
108
- if(is_array($v))
109
- $v = implode(",", $v);
110
- else
111
- $v = trim($v);
112
-
113
- return update_option("pmpro_" . $s, $v);
114
- }
115
-
116
- function pmpro_get_slug($post_id)
117
- {
118
- global $pmpro_slugs, $wpdb;
119
- if(!$pmpro_slugs[$post_id])
120
- $pmpro_slugs[$post_id] = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE ID = '" . $post_id . "' LIMIT 1");
121
-
122
- return $pmpro_slugs[$post_id];
123
- }
124
-
125
- function pmpro_url($page = NULL, $querystring = "", $scheme = NULL)
126
- {
127
- global $besecure;
128
- $besecure = apply_filters("besecure", $besecure);
129
-
130
- if(!$scheme && $besecure)
131
- $scheme = "https";
132
- elseif(!$scheme)
133
- $scheme = "http";
134
-
135
- if(!$page)
136
- $page = "levels";
137
-
138
- global $pmpro_pages;
139
-
140
- //start with the permalink
141
- $url = get_permalink($pmpro_pages[$page]);
142
-
143
- //WPML/etc support
144
- if(function_exists("icl_object_id") && defined("ICL_LANGUAGE_CODE"))
145
- {
146
- $trans_id = icl_object_id($pmpro_pages[$page], "page", false, ICL_LANGUAGE_CODE);
147
- if(!empty($trans_id))
148
- {
149
- $url = get_permalink($trans_id);
150
- }
151
- }
152
-
153
- //figure out querystring
154
- if(strpos($url, "?"))
155
- $querystring = str_replace("?", "&", $querystring);
156
- $url .= $querystring;
157
-
158
- //figure out scheme
159
- if(is_ssl())
160
- $url = str_replace("http:", "https:", $url);
161
-
162
- return $url;
163
- }
164
-
165
- function pmpro_isLevelFree(&$level)
166
- {
167
- if(!empty($level) && $level->initial_payment <= 0 && $level->billing_amount <= 0 && $level->trial_amount <= 0)
168
- return true;
169
- else
170
- return false;
171
- }
172
-
173
- function pmpro_isLevelRecurring(&$level)
174
- {
175
- if(!empty($level) && ($level->billing_amount > 0 || $level->trial_amount > 0))
176
- return true;
177
- else
178
- return false;
179
- }
180
-
181
- function pmpro_isLevelTrial(&$level)
182
- {
183
- if($level->trial_limit > 0)
184
- {
185
- return true;
186
- }
187
- else
188
- return false;
189
- }
190
-
191
- function pmpro_isLevelExpiring(&$level)
192
- {
193
- if($level->expiration_number > 0)
194
- return true;
195
- else
196
- return false;
197
- }
198
-
199
- function pmpro_getLevelCost(&$level, $tags = true, $short = false)
200
- {
201
- global $pmpro_currency_symbol;
202
- //initial payment
203
- if(!$short)
204
- $r = sprintf(__('The price for membership is <strong>%s</strong> now', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2));
205
- else
206
- $r = sprintf(__('<strong>%s</strong> now', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2));
207
-
208
- //recurring part
209
- if($level->billing_amount != '0.00')
210
- {
211
- if($level->billing_limit > 1)
212
- {
213
- if($level->cycle_number == '1')
214
- {
215
- $r .= sprintf(__(' and then <strong>%s per %s for %d more %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, pmpro_translate_billing_period($level->cycle_period), $level->billing_limit, pmpro_translate_billing_period($level->cycle_period, $level->billing_limit));
216
- }
217
- else
218
- {
219
- $r .= sprintf(__(' and then <strong>%s every %d %s for %d more %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number), $level->billing_limit, pmpro_translate_billing_period($level->cycle_period, $level->billing_limit));
220
- }
221
- }
222
- elseif($level->billing_limit == 1)
223
- {
224
- $r .= sprintf(__(' and then <strong>%s after %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number));
225
- }
226
- else
227
- {
228
- if( $level->billing_amount === $level->initial_payment ) {
229
- if($level->cycle_number == '1')
230
- {
231
- $r = sprintf(__('The price for membership is <strong>%s per %s</strong>.', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2), pmpro_translate_billing_period($level->cycle_period) );
232
- }
233
- else
234
- {
235
- $r = sprintf(__('The price for membership is <strong>%s every %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2), $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number) );
236
- }
237
- } else {
238
- if($level->cycle_number == '1')
239
- {
240
- $r .= sprintf(__(' and then <strong>%s per %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, pmpro_translate_billing_period($level->cycle_period));
241
- }
242
- else
243
- {
244
- $r .= sprintf(__(' and then <strong>%s every %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number));
245
- }
246
- }
247
- }
248
- }
249
- else
250
- $r .= '.';
251
-
252
- //add a space
253
- $r .= ' ';
254
-
255
- //trial part
256
- if($level->trial_limit)
257
- {
258
- if($level->trial_amount == '0.00')
259
- {
260
- if($level->trial_limit == '1')
261
- {
262
- $r .= ' ' . __('After your initial payment, your first payment is Free.', 'pmpro');
263
- }
264
- else
265
- {
266
- $r .= ' ' . sprintf(__('After your initial payment, your first %d payments are Free.', 'pmpro'), $level->trial_limit);
267
- }
268
- }
269
- else
270
- {
271
- if($level->trial_limit == '1')
272
- {
273
- $r .= ' ' . sprintf(__('After your initial payment, your first payment will cost %s.', 'pmpro'), $pmpro_currency_symbol . $level->trial_amount);
274
- }
275
- else
276
- {
277
- $r .= ' ' . sprintf(__('After your initial payment, your first %d payments will cost %s.', 'pmpro'), $level->trial_limit, $pmpro_currency_symbol . $level->trial_amount);
278
- }
279
- }
280
- }
281
-
282
- //taxes part
283
- $tax_state = pmpro_getOption("tax_state");
284
- $tax_rate = pmpro_getOption("tax_rate");
285
-
286
- if($tax_state && $tax_rate && !pmpro_isLevelFree($level))
287
- {
288
- $r .= sprintf(__('Customers in %s will be charged %s%% tax.', 'pmpro'), $tax_state, round($tax_rate * 100, 2));
289
- }
290
-
291
- if(!$tags)
292
- $r = strip_tags($r);
293
-
294
- $r = apply_filters("pmpro_level_cost_text", $r, $level);
295
- return $r;
296
- }
297
-
298
- function pmpro_getLevelExpiration(&$level)
299
- {
300
- if($level->expiration_number)
301
- {
302
- $expiration_text = sprintf(__("Membership expires after %d %s.", "pmpro"), $level->expiration_number, pmpro_translate_billing_period($level->expiration_period, $level->expiration_number));
303
- }
304
- else
305
- $expiration_text = "";
306
-
307
- $expiration_text = apply_filters("pmpro_level_expiration_text", $expiration_text, $level);
308
- return $expiration_text;
309
- }
310
-
311
- function pmpro_hideAds()
312
- {
313
- global $pmpro_display_ads;
314
- return !$pmpro_display_ads;
315
- }
316
-
317
- function pmpro_displayAds()
318
- {
319
- global $pmpro_display_ads;
320
- return $pmpro_display_ads;
321
- }
322
-
323
- function pmpro_next_payment($user_id = NULL, $order_status = "success")
324
- {
325
- global $wpdb, $current_user;
326
- if(!$user_id)
327
- $user_id = $current_user->ID;
328
-
329
- if(!$user_id)
330
- return false;
331
-
332
- //get last order
333
- $order = new MemberOrder();
334
- $order->getLastMemberOrder($user_id, $order_status);
335
-
336
- //get current membership level
337
- $level = pmpro_getMembershipLevelForUser($user_id);
338
-
339
- if(!empty($order) && !empty($level) && !empty($level->cycle_number))
340
- {
341
- //last payment date
342
- $lastdate = date("Y-m-d", $order->timestamp);
343
-
344
- //next payment date
345
- $nextdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP('" . $lastdate . "' + INTERVAL " . $level->cycle_number . " " . $level->cycle_period . ")");
346
-
347
- return $nextdate;
348
- }
349
- else
350
- {
351
- //no order or level found, or level was not recurring
352
- return false;
353
- }
354
- }
355
-
356
- if(!function_exists("last4"))
357
- {
358
- function last4($t)
359
- {
360
- return substr($t, strlen($t) - 4, 4);
361
- }
362
- }
363
-
364
- if(!function_exists("hideCardNumber"))
365
- {
366
- function hideCardNumber($c, $dashes = true)
367
- {
368
- if($c)
369
- {
370
- if($dashes)
371
- return "XXXX-XXXX-XXXX-" . substr($c, strlen($c) - 4, 4);
372
- else
373
- return "XXXXXXXXXXXX" . substr($c, strlen($c) - 4, 4);
374
- }
375
- else
376
- {
377
- return "";
378
- }
379
- }
380
- }
381
-
382
- if(!function_exists("cleanPhone"))
383
- {
384
- function cleanPhone($phone)
385
- {
386
- //if a + is passed, just pass it along
387
- if(strpos($phone, "+") !== false)
388
- return $phone;
389
-
390
- //clean the phone
391
- $phone = str_replace("-", "", $phone);
392
- $phone = str_replace(".", "", $phone);
393
- $phone = str_replace("(", "", $phone);
394
- $phone = str_replace(")", "", $phone);
395
- $phone = str_replace(" ", "", $phone);
396
-
397
- return $phone;
398
- }
399
- }
400
-
401
- if(!function_exists("formatPhone"))
402
- {
403
- function formatPhone($phone)
404
- {
405
- $phone = cleanPhone($phone);
406
-
407
- if(strlen($phone) == 11)
408
- return substr($phone, 0, 1) . " (" . substr($phone, 1, 3) . ") " . substr($phone, 4, 3) . "-" . substr($phone, 7, 4);
409
- elseif(strlen($phone) == 10)
410
- return "(" . substr($phone, 0, 3) . ") " . substr($phone, 3, 3) . "-" . substr($phone, 6, 4);
411
- elseif(strlen($phone) == 7)
412
- return substr($phone, 0, 3) . "-" . substr($phone, 3, 4);
413
- else
414
- return $phone;
415
- }
416
- }
417
-
418
- function pmpro_showRequiresMembershipMessage()
419
- {
420
- //get the correct message
421
- if(is_feed())
422
- {
423
- $content = pmpro_getOption("rsstext");
424
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
425
- }
426
- elseif($current_user->ID)
427
- {
428
- //not a member
429
- $content = pmpro_getOption("nonmembertext");
430
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
431
- }
432
- else
433
- {
434
- //not logged in!
435
- $content = pmpro_getOption("notloggedintext");
436
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
437
- }
438
- }
439
-
440
- /* pmpro_hasMembershipLevel() checks if the passed user is a member of the passed level
441
- *
442
- * $level may either be the ID or name of the desired membership_level. (or an array of such)
443
- * If $user_id is omitted, the value will be retrieved from $current_user.
444
- *
445
- * Return values:
446
- * Success returns boolean true.
447
- * Failure returns a string containing the error message.
448
- */
449
- function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
450
- {
451
- global $current_user, $all_membership_levels, $wpdb;
452
-
453
- $return = false;
454
-
455
- if(empty($user_id)) //no user_id passed, check the current user
456
- {
457
- $user_id = $current_user->ID;
458
- $membership_levels = $current_user->membership_levels;
459
- }
460
- else //get membership levels for given user
461
- {
462
- $membership_levels = pmpro_getMembershipLevelsForUser($user_id);
463
- }
464
-
465
- if($levels === "0" || $levels === 0) //if 0 was passed, return true if they have no level and false if they have any
466
- {
467
- $return = empty($membership_levels);
468
- }
469
- elseif(empty($levels)) //if no level var was passed, we're just checking if they have any level
470
- {
471
- $return = !empty($membership_levels);
472
- }
473
- else
474
- {
475
- if(!is_array($levels)) //make an array out of a single element so we can use the same code
476
- {
477
- $levels = array($levels);
478
- }
479
-
480
- if(empty($membership_levels))
481
- {
482
- //user has no levels just check if 0 was sent in one of the levels
483
- if(in_array(0, $levels) || in_array("0", $levels))
484
- $return = true;
485
- }
486
- else
487
- {
488
- foreach($levels as $level)
489
- {
490
- $level_obj = pmpro_getLevel(is_numeric($level) ? abs(intval($level)) : $level); //make sure our level is in a proper format
491
- if(empty($level_obj)){continue;} //invalid level
492
- $found_level = false;
493
- foreach($membership_levels as $membership_level)
494
- {
495
- if($membership_level->id == $level_obj->id) //found a match
496
- {
497
- $found_level = true;
498
- }
499
- }
500
-
501
- if(is_numeric($level) and intval($level) < 0 and !$found_level) //checking for the absence of this level
502
- {
503
- $return = true;
504
- }
505
- else if($found_level) //checking for the presence of this level
506
- {
507
- $return = true;
508
- }
509
- }
510
- }
511
- }
512
-
513
- $return = apply_filters("pmpro_has_membership_level", $return, $user_id, $levels);
514
- return $return;
515
- }
516
-
517
- /* pmpro_changeMembershipLevel() creates or updates the membership level of the given user to the given level.
518
- *
519
- * $level may either be the ID or name of the desired membership_level.
520
- * If $user_id is omitted, the value will be retrieved from $current_user.
521
- *
522
- * Return values:
523
- * Success returns boolean true.
524
- * Failure returns boolean false.
525
- */
526
- function pmpro_changeMembershipLevel($level, $user_id = NULL)
527
- {
528
- global $wpdb;
529
- global $current_user, $pmpro_error;
530
-
531
- if(empty($user_id))
532
- {
533
- $user_id = $current_user->ID;
534
- }
535
-
536
- if(empty($user_id))
537
- {
538
- $pmpro_error = __("User ID not found.", "pmpro");
539
- return false;
540
- }
541
-
542
- if(empty($level)) //cancelling membership
543
- {
544
- $level = 0;
545
- }
546
- else if(is_array($level))
547
- {
548
- //custom level
549
- }
550
- else
551
- {
552
- $level_obj = pmpro_getLevel($level);
553
- if(empty($level_obj))
554
- {
555
- $pmpro_error = __("Invalid level.", "pmpro");
556
- return false;
557
- }
558
- $level = $level_obj->id;
559
- }
560
-
561
- //if it's a custom level, they're changing
562
- if(!is_array($level))
563
- {
564
- //are they even changing?
565
- if(pmpro_hasMembershipLevel($level, $user_id)) {
566
- $pmpro_error = __("not changing?", "pmpro");
567
- return false; //not changing
568
- }
569
- }
570
-
571
- $old_levels = pmpro_getMembershipLevelsForUser($user_id);
572
-
573
- $pmpro_cancel_previous_subscriptions = apply_filters("pmpro_cancel_previous_subscriptions", true);
574
- if($pmpro_cancel_previous_subscriptions)
575
- {
576
- //deactivate old memberships (updates pmpro_memberships_users table)
577
- if(!empty($old_levels))
578
- {
579
- foreach($old_levels as $old_level) {
580
- $sql = "UPDATE $wpdb->pmpro_memberships_users SET `status`='inactive', `enddate`='" . current_time('mysql') . "' WHERE `id`=".$old_level->subscription_id;
581
- if(!$wpdb->query($sql))
582
- {
583
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
584
- return false;
585
- }
586
- }
587
- }
588
-
589
- //cancel any other subscriptions they have (updates pmpro_membership_orders table)
590
- $other_order_ids = $wpdb->get_col("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' AND status = 'success' ORDER BY id DESC");
591
-
592
- foreach($other_order_ids as $order_id)
593
- {
594
- $c_order = new MemberOrder($order_id);
595
- $c_order->cancel();
596
-
597
- if(!empty($c_order->error))
598
- $pmpro_error = $c_order->error;
599
- }
600
- }
601
-
602
- //insert current membership
603
- if(!empty($level)) //are we getting a new one or just cancelling the old ones
604
- {
605
- if(is_array($level))
606
- {
607
- //make sure the dates are in good formats
608
- if($level['startdate'] != current_time('mysql') && $level['startdate'] != "NULL" && substr($level['startdate'], 0, 1) != "'")
609
- $level['startdate'] = "'" . $level['startdate'] . "'";
610
-
611
- if($level['enddate'] != current_time('mysql') && $level['enddate'] != "NULL" && substr($level['enddate'], 0, 1) != "'")
612
- $level['enddate'] = "'" . $level['enddate'] . "'";
613
-
614
- //Better support mySQL Strict Mode by passing a proper enum value for cycle_period
615
- if ($level['cycle_period'] == '') $level['cycle_period'] = 0;
616
-
617
- $sql = "INSERT INTO $wpdb->pmpro_memberships_users (user_id, membership_id, code_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, startdate, enddate)
618
- VALUES('" . $level['user_id'] . "',
619
- '" . $level['membership_id'] . "',
620
- '" . intval($level['code_id']) . "',
621
- '" . $level['initial_payment'] . "',
622
- '" . $level['billing_amount'] . "',
623
- '" . $level['cycle_number'] . "',
624
- '" . $level['cycle_period'] . "',
625
- '" . $level['billing_limit'] . "',
626
- '" . $level['trial_amount'] . "',
627
- '" . $level['trial_limit'] . "',
628
- " . $level['startdate'] . ",
629
- " . $level['enddate'] . ")";
630
-
631
- if(!$wpdb->query($sql))
632
- {
633
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
634
- return false;
635
- }
636
- }
637
- else
638
- {
639
- $sql = "INSERT INTO $wpdb->pmpro_memberships_users (user_id, membership_id, code_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, startdate, enddate)
640
- VALUES (
641
- '" . $user_id . "',
642
- '" . $level . "',
643
- '0',
644
- '0',
645
- '0',
646
- '0',
647
- '0',
648
- '0',
649
- '0',
650
- '0',
651
- '" . current_time('mysql') . "',
652
- '0000-00-00 00:00:00'
653
- )";
654
-
655
- if(!$wpdb->query($sql))
656
- {
657
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
658
- return false;
659
- }
660
- }
661
- }
662
-
663
- //get level id
664
- if(is_array($level))
665
- $level_id = $level['membership_id']; //custom level
666
- else
667
- $level_id = $level; //just id
668
-
669
- //remove cached level
670
- global $all_membership_levels;
671
- unset($all_membership_levels[$user_id]);
672
-
673
- //update user data and call action
674
- pmpro_set_current_user();
675
- do_action("pmpro_after_change_membership_level", $level_id, $user_id); //$level is the $level_id here
676
- return true;
677
- }
678
-
679
- /* pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
680
- *
681
- * $level may either be the ID or name of the desired membership_level.
682
- * $category must be a valid post category ID.
683
- *
684
- * Return values:
685
- * Success returns boolean true.
686
- * Failure returns a string containing the error message.
687
- */
688
- function pmpro_toggleMembershipCategory( $level, $category, $value )
689
- {
690
- global $wpdb;
691
- $category = intval($category);
692
-
693
- if ( ($level = intval($level)) <= 0 )
694
- {
695
- $safe = addslashes($level);
696
- if ( ($level = intval($wpdb->get_var("SELECT id FROM {$wpdb->pmpro_membership_levels} WHERE name = '$safe' LIMIT 1"))) <= 0 )
697
- {
698
- return __("Membership level not found.", "pmpro");
699
- }
700
- }
701
-
702
- if ( $value )
703
- {
704
- $sql = "REPLACE INTO {$wpdb->pmpro_memberships_categories} (`membership_id`,`category_id`) VALUES ('$level','$category')";
705
- $wpdb->query($sql);
706
- if(mysql_errno()) return mysql_error();
707
- }
708
- else
709
- {
710
- $sql = "DELETE FROM {$wpdb->pmpro_memberships_categories} WHERE `membership_id` = '$level' AND `category_id` = '$category' LIMIT 1";
711
- $wpdb->query($sql);
712
- if(mysql_errno()) return mysql_error();
713
- }
714
-
715
- return true;
716
- }
717
-
718
- /* pmpro_updateMembershipCategories() ensures that all those and only those categories given
719
- * are associated with the given membership level.
720
- *
721
- * $level is a valid membership level ID or name
722
- * $categories is an array of post category IDs
723
- *
724
- * Return values:
725
- * Success returns boolean true.
726
- * Failure returns a string containing the error message.
727
- */
728
- function pmpro_updateMembershipCategories($level, $categories)
729
- {
730
- global $wpdb;
731
-
732
- if(!is_numeric($level))
733
- {
734
- $level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE name = '" . esc_sql($level) . "' LIMIT 1");
735
- if(empty($level))
736
- {
737
- return __("Membership level not found.", "pmpro");
738
- }
739
- }
740
-
741
- // remove all existing links...
742
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE `membership_id` = '" . esc_sql($level) . "'";
743
- $wpdb->query($sqlQuery);
744
- if(mysql_errno()) return mysql_error();
745
-
746
- // add the given links [back?] in...
747
- foreach($categories as $cat)
748
- {
749
- if(is_string($r = pmpro_toggleMembershipCategory( $level, $cat, true)))
750
- {
751
- //uh oh, error
752
- return $r;
753
- }
754
- }
755
-
756
- //all good
757
- return true;
758
- }
759
-
760
- /* pmpro_getMembershipCategories() returns the categories for a given level
761
- *
762
- * $level_id is a valid membership level ID
763
- *
764
- * Return values:
765
- * Success returns boolean true.
766
- * Failure returns boolean false.
767
- */
768
- function pmpro_getMembershipCategories($level_id)
769
- {
770
- global $wpdb;
771
- $categories = $wpdb->get_col("SELECT c.category_id
772
- FROM {$wpdb->pmpro_memberships_categories} AS c
773
- WHERE c.membership_id = '" . $level_id . "'");
774
-
775
- return $categories;
776
- }
777
-
778
-
779
- function pmpro_isAdmin($user_id = NULL)
780
- {
781
- global $current_user, $wpdb;
782
- if(!$user_id)
783
- $user_id = $current_user->ID;
784
-
785
- if(!$user_id)
786
- return false;
787
-
788
- $admincap = user_can($user_id, "manage_options");
789
- if($admincap)
790
- return true;
791
- else
792
- return false;
793
- }
794
-
795
- function pmpro_replaceUserMeta($user_id, $meta_keys, $meta_values, $prev_values = NULL)
796
- {
797
- //expects all arrays for last 3 params or all strings
798
- if(!is_array($meta_keys))
799
- {
800
- $meta_keys = array($meta_keys);
801
- $meta_values = array($meta_values);
802
- $prev_values = array($prev_values);
803
- }
804
-
805
- for($i = 0; $i < count($meta_values); $i++)
806
- {
807
- if($prev_values[$i])
808
- {
809
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $prev_values[$i]);
810
- }
811
- else
812
- {
813
- $old_value = get_user_meta($user_id, $meta_keys[$i], true);
814
- if($old_value)
815
- {
816
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $old_value);
817
- }
818
- else
819
- {
820
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i]);
821
- }
822
- }
823
- }
824
-
825
- return $i;
826
- }
827
-
828
- function pmpro_getMetavalues($query)
829
- {
830
- global $wpdb;
831
-
832
- $results = $wpdb->get_results($query);
833
- $r = new stdClass();
834
- foreach($results as $result)
835
- {
836
- $r->{$result->key} = $result->value;
837
- }
838
-
839
- return $r;
840
- }
841
-
842
- //function to return the pagination string
843
- function pmpro_getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 1, $targetpage = "/", $pagestring = "&pn=")
844
- {
845
- //defaults
846
- if(!$adjacents) $adjacents = 1;
847
- if(!$limit) $limit = 15;
848
- if(!$page) $page = 1;
849
- if(!$targetpage) $targetpage = "/";
850
-
851
- //other vars
852
- $prev = $page - 1; //previous page is page - 1
853
- $next = $page + 1; //next page is page + 1
854
- $lastpage = ceil($totalitems / $limit); //lastpage is = total items / items per page, rounded up.
855
- $lpm1 = $lastpage - 1; //last page minus 1
856
-
857
- /*
858
- Now we apply our rules and draw the pagination object.
859
- We're actually saving the code to a variable in case we want to draw it more than once.
860
- */
861
- $pagination = "";
862
- if($lastpage > 1)
863
- {
864
- $pagination .= "<div class=\"pmpro_pagination\"";
865
- if(!empty($margin) || !empty($padding))
866
- {
867
- $pagination .= " style=\"";
868
- if($margin)
869
- $pagination .= "margin: $margin;";
870
- if($padding)
871
- $pagination .= "padding: $padding;";
872
- $pagination .= "\"";
873
- }
874
- $pagination .= ">";
875
-
876
- //previous button
877
- if ($page > 1)
878
- $pagination .= "<a href=\"$targetpage$pagestring$prev\">&laquo; prev</a>";
879
- else
880
- $pagination .= "<span class=\"disabled\">&laquo; prev</span>";
881
-
882
- //pages
883
- if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
884
- {
885
- for ($counter = 1; $counter <= $lastpage; $counter++)
886
- {
887
- if ($counter == $page)
888
- $pagination .= "<span class=\"current\">$counter</span>";
889
- else
890
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
891
- }
892
- }
893
- elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
894
- {
895
- //close to beginning; only hide later pages
896
- if($page < 1 + ($adjacents * 3))
897
- {
898
- for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
899
- {
900
- if ($counter == $page)
901
- $pagination .= "<span class=\"current\">$counter</span>";
902
- else
903
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
904
- }
905
- $pagination .= "...";
906
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
907
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
908
- }
909
- //in middle; hide some front and some back
910
- elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
911
- {
912
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
913
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
914
- $pagination .= "...";
915
- for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
916
- {
917
- if ($counter == $page)
918
- $pagination .= "<span class=\"current\">$counter</span>";
919
- else
920
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
921
- }
922
- $pagination .= "...";
923
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
924
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
925
- }
926
- //close to end; only hide early pages
927
- else
928
- {
929
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
930
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
931
- $pagination .= "...";
932
- for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
933
- {
934
- if ($counter == $page)
935
- $pagination .= "<span class=\"current\">$counter</span>";
936
- else
937
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
938
- }
939
- }
940
- }
941
-
942
- //next button
943
- if ($page < $counter - 1)
944
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $next . "\">next &raquo;</a>";
945
- else
946
- $pagination .= "<span class=\"disabled\">next &raquo;</span>";
947
- $pagination .= "</div>\n";
948
- }
949
-
950
- return $pagination;
951
-
952
- }
953
-
954
- function pmpro_calculateInitialPaymentRevenue($s = NULL, $l = NULL)
955
- {
956
- global $wpdb;
957
-
958
- //if we're limiting users by search
959
- if($s || $l)
960
- {
961
- $user_ids_query = "SELECT u.ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE mu.status = 'active' ";
962
- if($s)
963
- $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
964
- if($l)
965
- $user_ids_query .= "AND mu.membership_id = '$l' ";
966
- }
967
-
968
- //query to sum initial payments
969
- $sqlQuery = "SELECT SUM(initial_payment) FROM $wpdb->pmpro_memberships_users WHERE `status` = 'active' ";
970
- if(!empty($user_ids_query))
971
- $sqlQuery .= "AND user_id IN(" . $user_ids_query . ") ";
972
-
973
- $total = $wpdb->get_var($sqlQuery);
974
-
975
- return (double)$total;
976
- }
977
-
978
- function pmpro_calculateRecurringRevenue($s, $l)
979
- {
980
- global $wpdb;
981
-
982
- //if we're limiting users by search
983
- if($s || $l)
984
- {
985
- $user_ids_query = "AND user_id IN(SELECT u.ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE mu.status = 'active' ";
986
- if($s)
987
- $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
988
- if($l)
989
- $user_ids_query .= "AND mu.membership_id = '$l' ";
990
- $user_ids_query .= ")";
991
- }
992
- else
993
- $user_ids_query = "";
994
-
995
- //4 queries to get annual earnings for each cycle period. currently ignoring trial periods and billing limits.
996
- $sqlQuery = "
997
- SELECT SUM((12/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Month' AND cycle_number <> 12 $user_ids_query
998
- UNION
999
- SELECT SUM((365/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Day' AND cycle_number <> 365 $user_ids_query
1000
- UNION
1001
- SELECT SUM((52/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Week' AND cycle_number <> 52 $user_ids_query
1002
- UNION
1003
- SELECT SUM(billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Year' $user_ids_query
1004
- ";
1005
-
1006
- $annual_revenues = $wpdb->get_col($sqlQuery);
1007
-
1008
- $total = 0;
1009
- foreach($annual_revenues as $r)
1010
- {
1011
- $total += $r;
1012
- }
1013
-
1014
- return $total;
1015
- }
1016
-
1017
- function pmpro_generateUsername($firstname = "", $lastname = "", $email = "")
1018
- {
1019
- global $wpdb;
1020
-
1021
- //try first initial + last name, firstname, lastname
1022
- $firstname = preg_replace("/[^A-Za-z]/", "", $firstname);
1023
- $lastname = preg_replace("/[^A-Za-z]/", "", $lastname);
1024
- if($firstname && $lastname)
1025
- {
1026
- $username = substr($firstname, 0, 1) . $lastname;
1027
- }
1028
- elseif($firstname)
1029
- {
1030
- $username = $firstname;
1031
- }
1032
- elseif($lastname)
1033
- {
1034
- $username = $lastname;
1035
- }
1036
-
1037
- //is it taken?
1038
- $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
1039
-
1040
- if(!$taken)
1041
- return $username;
1042
-
1043
- //try the beginning of the email address
1044
- $emailparts = explode("@", "email");
1045
- if(is_array($emailparts))
1046
- $email = preg_replace("/[^A-Za-z]/", "", $emailparts[0]);
1047
-
1048
- if($email)
1049
- {
1050
- $username = $email;
1051
- }
1052
-
1053
- //is this taken? if not, add numbers until it works
1054
- $taken = true;
1055
- $count = 0;
1056
- while($taken)
1057
- {
1058
- //add a # to the end
1059
- if($count)
1060
- {
1061
- $username = preg_replace("/[0-9]/", "", $username) . $count;
1062
- }
1063
-
1064
- //taken?
1065
- $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
1066
-
1067
- //increment the number
1068
- $count++;
1069
- }
1070
-
1071
- //must have a good username now
1072
- return $username;
1073
- }
1074
-
1075
- //get a new random code for discount codes
1076
- function pmpro_getDiscountCode($seed = NULL)
1077
- {
1078
- global $wpdb;
1079
-
1080
- while(empty($code))
1081
- {
1082
- $scramble = md5(AUTH_KEY . current_time('timestamp') . $seed . SECURE_AUTH_KEY);
1083
- $code = substr($scramble, 0, 10);
1084
- $check = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE code = '$code' LIMIT 1");
1085
- if($check || is_numeric($code))
1086
- $code = NULL;
1087
- }
1088
-
1089
- return strtoupper($code);
1090
- }
1091
-
1092
- //is a discount code valid
1093
- function pmpro_checkDiscountCode($code, $level_id = NULL, $return_errors = false)
1094
- {
1095
- global $wpdb;
1096
-
1097
- $error = false;
1098
-
1099
- //no code, no code
1100
- if(empty($code))
1101
- $error = __("No code was given to check.", "pmpro");
1102
-
1103
- //get code from db
1104
- if(!$error)
1105
- {
1106
- $dbcode = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE code ='" . $code . "' LIMIT 1");
1107
-
1108
- //did we find it?
1109
- if(empty($dbcode->id))
1110
- $error = __("The discount code could not be found.", "pmpro");
1111
- }
1112
-
1113
- //check if the code has started
1114
- if(!$error)
1115
- {
1116
- //fix the date timestamps
1117
- $dbcode->starts = strtotime(date("m/d/Y", $dbcode->starts));
1118
- $dbcode->expires = strtotime(date("m/d/Y", $dbcode->expires));
1119
-
1120
- //today
1121
- $today = strtotime(date("m/d/Y 00:00:00", current_time("timestamp")));
1122
-
1123
- //has this code started yet?
1124
- if(!empty($dbcode->starts) && $dbcode->starts > $today)
1125
- $error = sprintf(__("This discount code goes into effect on %s.", "pmpro"), date(get_option('date_format'), $dbcode->starts));
1126
- }
1127
-
1128
- //check if the code is expired
1129
- if(!$error)
1130
- {
1131
- if(!empty($dbcode->expires) && $dbcode->expires < $today)
1132
- $error = sprintf(__("This discount code expired on %s.", "pmpro"), date(get_option('date_format'), $dbcode->expires));
1133
- }
1134
-
1135
- //have we run out of uses?
1136
- if(!$error)
1137
- {
1138
- if($dbcode->uses > 0)
1139
- {
1140
- $used = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $dbcode->id . "'");
1141
- if($used >= $dbcode->uses)
1142
- $error = __("This discount code is no longer valid.", "pmpro");
1143
- }
1144
- }
1145
-
1146
- //if a level was passed check if this code applies
1147
- if(!$error)
1148
- {
1149
- $pmpro_check_discount_code_levels = apply_filters("pmpro_check_discount_code_levels", true, $dbcode->id);
1150
- if(!empty($level_id) && $pmpro_check_discount_code_levels)
1151
- {
1152
- $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $dbcode->id . "' AND cl.level_id = '" . $level_id . "' LIMIT 1");
1153
-
1154
- if(empty($code_level))
1155
- $error = __("This discount code does not apply to this membership level.", "pmpro");
1156
- }
1157
- }
1158
-
1159
- //allow filter
1160
- $pmpro_check_discount_code = apply_filters("pmpro_check_discount_code", !$error, $dbcode, $level_id, $code);
1161
- if(is_string($pmpro_check_discount_code))
1162
- $error = $pmpro_check_discount_code; //string returned, this is an error
1163
- elseif(!$pmpro_check_discount_code && !$error)
1164
- $error = true; //no error before, but filter returned error
1165
- elseif($pmpro_check_discount_code)
1166
- $error = false; //filter is true, so error false
1167
-
1168
- //return
1169
- if($error)
1170
- {
1171
- //there was an error
1172
- if(!empty($return_errors))
1173
- return array(false, $error);
1174
- else
1175
- return false;
1176
- }
1177
- else
1178
- {
1179
- //guess we're all good
1180
- if(!empty($return_errors))
1181
- return array(true, __("This discount code is okay.", "pmpro"));
1182
- else
1183
- return true;
1184
- }
1185
- }
1186
-
1187
- function pmpro_no_quotes($s, $quotes = array("'", '"'))
1188
- {
1189
- return str_replace($quotes, "", $s);
1190
- }
1191
-
1192
- //from: http://www.php.net/manual/en/function.implode.php#86845
1193
- function pmpro_implodeToEnglish($array)
1194
- {
1195
- // sanity check
1196
- if (!$array || !count ($array))
1197
- return '';
1198
-
1199
- // get last element
1200
- $last = array_pop ($array);
1201
-
1202
- // if it was the only element - return it
1203
- if (!count ($array))
1204
- return $last;
1205
-
1206
- return implode (', ', $array).' ' . __('and', 'pmpro') . ' '.$last;
1207
- }
1208
-
1209
- //from yoast wordpress seo
1210
- function pmpro_text_limit( $text, $limit, $finish = '&hellip;')
1211
- {
1212
- if( strlen( $text ) > $limit ) {
1213
- $text = substr( $text, 0, $limit );
1214
- $text = substr( $text, 0, - ( strlen( strrchr( $text,' ') ) ) );
1215
- $text .= $finish;
1216
- }
1217
- return $text;
1218
- }
1219
-
1220
- /* pmpro_getMembershipLevelForUser() returns the first active membership level for a user
1221
- *
1222
- * If $user_id is omitted, the value will be retrieved from $current_user.
1223
- *
1224
- * Return values:
1225
- * Success returns the level object.
1226
- * Failure returns false.
1227
- */
1228
- function pmpro_getMembershipLevelForUser($user_id = NULL, $force = false)
1229
- {
1230
- if(empty($user_id))
1231
- {
1232
- global $current_user;
1233
- $user_id = $current_user->ID;
1234
- }
1235
-
1236
- if(empty($user_id))
1237
- {
1238
- return false;
1239
- }
1240
-
1241
- global $all_membership_levels;
1242
-
1243
- if(isset($all_membership_levels[$user_id]) && !$force)
1244
- {
1245
- return $all_membership_levels[$user_id];
1246
- }
1247
- else
1248
- {
1249
- global $wpdb;
1250
- $all_membership_levels[$user_id] = $wpdb->get_row("SELECT
1251
- l.id AS ID,
1252
- l.id as id,
1253
- mu.id as subscription_id,
1254
- l.name AS name,
1255
- l.description,
1256
- l.expiration_number,
1257
- l.expiration_period,
1258
- mu.initial_payment,
1259
- mu.billing_amount,
1260
- mu.cycle_number,
1261
- mu.cycle_period,
1262
- mu.billing_limit,
1263
- mu.trial_amount,
1264
- mu.trial_limit,
1265
- mu.code_id as code_id,
1266
- UNIX_TIMESTAMP(startdate) as startdate,
1267
- UNIX_TIMESTAMP(enddate) as enddate
1268
- FROM {$wpdb->pmpro_membership_levels} AS l
1269
- JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1270
- WHERE mu.user_id = $user_id AND mu.status = 'active'
1271
- LIMIT 1");
1272
- return $all_membership_levels[$user_id];
1273
- }
1274
- }
1275
-
1276
- /* pmpro_getMembershipLevelsForUser() returns the membership levels for a user
1277
- *
1278
- * If $user_id is omitted, the value will be retrieved from $current_user.
1279
- * By default it only includes actvie memberships.
1280
- *
1281
- * Return values:
1282
- * Success returns an array of level objects.
1283
- * Failure returns false.
1284
- */
1285
- function pmpro_getMembershipLevelsForUser($user_id = NULL, $include_inactive = false)
1286
- {
1287
- if(empty($user_id))
1288
- {
1289
- global $current_user;
1290
- $user_id = $current_user->ID;
1291
- }
1292
-
1293
- if(empty($user_id))
1294
- {
1295
- return false;
1296
- }
1297
-
1298
- global $wpdb;
1299
- return $wpdb->get_results("SELECT
1300
- l.id AS ID,
1301
- l.id as id,
1302
- mu.id as subscription_id,
1303
- l.name,
1304
- l.description,
1305
- l.expiration_number,
1306
- l.expiration_period,
1307
- mu.initial_payment,
1308
- mu.billing_amount,
1309
- mu.cycle_number,
1310
- mu.cycle_period,
1311
- mu.billing_limit,
1312
- mu.trial_amount,
1313
- mu.trial_limit,
1314
- mu.code_id as code_id,
1315
- UNIX_TIMESTAMP(startdate) as startdate,
1316
- UNIX_TIMESTAMP(enddate) as enddate
1317
- FROM {$wpdb->pmpro_membership_levels} AS l
1318
- JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1319
- WHERE mu.user_id = $user_id".($include_inactive?"":" AND mu.status = 'active'"));
1320
- }
1321
-
1322
- /* pmpro_getLevel() returns the level object for a level
1323
- *
1324
- * $level may be the level id or name
1325
- *
1326
- * Return values:
1327
- * Success returns the level object.
1328
- * Failure returns false.
1329
- */
1330
- function pmpro_getLevel($level)
1331
- {
1332
- global $pmpro_levels;
1333
-
1334
- if(is_object($level) && !empty($level->id))
1335
- $level = $level->id;
1336
-
1337
- //was a name passed? (Todo: make sure level names have at least one non-numeric character.
1338
- if(is_numeric($level))
1339
- {
1340
- $level_id = intval($level);
1341
- if(isset($pmpro_levels[$level_id]))
1342
- {
1343
- return $pmpro_levels[$level_id];
1344
- }
1345
- else
1346
- {
1347
- global $wpdb;
1348
- $pmpro_levels[$level_id] = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1");
1349
- return $pmpro_levels[$level_id];
1350
- }
1351
- }
1352
- else
1353
- {
1354
- global $wpdb;
1355
- $level_obj = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE name = '" . $level . "' LIMIT 1");
1356
- $level_id = $level_obj->id;
1357
- $pmpro_levels[$level_id] = $level_obj;
1358
- return $pmpro_levels[$level_id];
1359
- }
1360
- }
1361
-
1362
- /*
1363
- Function to populate pmpro_levels with all levels. We query the DB every time just to be sure we have the latest.
1364
- This should be called if you want to be sure you get all levels as $pmpro_levels may only have a subset of levels.
1365
- */
1366
- function pmpro_getAllLevels($include_hidden = false, $force = false)
1367
- {
1368
- global $pmpro_levels, $wpdb;
1369
-
1370
- //just use what's cached (doesn't take into account include_hidden setting)
1371
- if(!empty($pmpro_levels) && !$force)
1372
- return $pmpro_levels;
1373
-
1374
- //build query
1375
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
1376
- if(!$include_hidden)
1377
- $sqlQuery .= " WHERE allow_signups = 1 ORDER BY id";
1378
-
1379
- //get levels from the DB
1380
- $raw_levels = $wpdb->get_results($sqlQuery);
1381
-
1382
- //lets put them into an array where the key is the id of the level
1383
- $pmpro_levels = array();
1384
- foreach($raw_levels as $raw_level)
1385
- {
1386
- $pmpro_levels[$raw_level->id] = $raw_level;
1387
- }
1388
-
1389
- return $pmpro_levels;
1390
- }
1391
-
1392
- function pmpro_getCheckoutButton($level_id, $button_text = NULL, $classes = NULL)
1393
- {
1394
- if(empty($button_text))
1395
- $button_text = __("Sign Up for !!name!! Now", "pmpro");
1396
-
1397
- if(empty($classes))
1398
- $classes = "btn btn-primary";
1399
-
1400
- if(empty($level_id))
1401
- $r = __("Please specify a level id.", "pmpro");
1402
- else
1403
- {
1404
- //get level
1405
- $level = pmpro_getLevel($level_id);
1406
-
1407
- //replace vars
1408
- $replacements = array(
1409
- "!!id!!" => $level->id,
1410
- "!!name!!" => $level->name,
1411
- "!!description!!" => $level->description,
1412
- "!!confirmation!!" => $level->confirmation,
1413
- "!!initial_payment!!" => $level->initial_payment,
1414
- "!!billing_amount!!" => $level->billing_amount,
1415
- "!!cycle_number!!" => $level->cycle_number,
1416
- "!!cycle_period!!" => $level->cycle_period,
1417
- "!!billing_limit!!" => $level->billing_limit,
1418
- "!!trial_amount!!" => $level->trial_amount,
1419
- "!!trial_limit!!" => $level->trial_limit,
1420
- "!!expiration_number!!" => $level->expiration_number,
1421
- "!!expiration_period!!" => $level->expiration_period
1422
- );
1423
- $button_text = str_replace(array_keys($replacements), $replacements, $button_text);
1424
-
1425
- //button text
1426
- $r = "<a href=\"" . pmpro_url("checkout", "?level=" . $level_id) . "\" class=\"" . $classes . "\">" . $button_text . "</a>";
1427
- }
1428
- return $r;
1429
- }
1430
-
1431
- /**
1432
- * Get the "domain" from a URL. By domain, we mean the host name, minus any subdomains. So just the domain and TLD.
1433
- *
1434
- * @param string $url The URL to parse. (generally pass site_url() in WP)
1435
- * @return string The domain.
1436
- */
1437
- function pmpro_getDomainFromURL($url = NULL)
1438
- {
1439
- $domainparts = parse_url($url);
1440
- $domainparts = explode(".", $domainparts['host']);
1441
- if(count($domainparts) > 1)
1442
- {
1443
- //check for ips
1444
- $isip = true;
1445
- foreach($domainparts as $part)
1446
- {
1447
- if(!is_numeric($part))
1448
- {
1449
- $isip = false;
1450
- break;
1451
- }
1452
- }
1453
-
1454
- if($isip)
1455
- {
1456
- //ip, e.g. 127.1.1.1
1457
- $domain = implode(".", $domainparts);
1458
- }
1459
- else
1460
- {
1461
- //www.something.com, etc.
1462
- $domain = $domainparts[count($domainparts)-2] . "." . $domainparts[count($domainparts)-1];
1463
- }
1464
- }
1465
- else
1466
- {
1467
- //localhost or another single word domain
1468
- $domain = $domainparts[0];
1469
- }
1470
-
1471
- return $domain;
1472
- }
1473
-
1474
- /*
1475
- Get a member's start date... either in general or for a specific level_id.
1476
- */
1477
- if(!function_exists("pmpro_getMemberStartdate"))
1478
- {
1479
- function pmpro_getMemberStartdate($user_id = NULL, $level_id = 0)
1480
- {
1481
- if(empty($user_id))
1482
- {
1483
- global $current_user;
1484
- $user_id = $current_user->ID;
1485
- }
1486
-
1487
- global $pmpro_startdates; //for cache
1488
- if(empty($pmpro_startdates[$user_id][$level_id]))
1489
- {
1490
- global $wpdb;
1491
-
1492
- if(!empty($level_id))
1493
- $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND membership_id IN(" . esc_sql($level_id) . ") AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1494
- else
1495
- $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1496
-
1497
- $startdate = apply_filters("pmpro_member_startdate", $wpdb->get_var($sqlQuery), $user_id, $level_id);
1498
-
1499
- $pmpro_startdates[$user_id][$level_id] = $startdate;
1500
- }
1501
-
1502
- return $pmpro_startdates[$user_id][$level_id];
1503
- }
1504
- }
1505
-
1506
- /*
1507
- How long has this member been a member
1508
- */
1509
- if(!function_exists("pmpro_getMemberDays"))
1510
- {
1511
- function pmpro_getMemberDays($user_id = NULL, $level_id = 0)
1512
- {
1513
- if(empty($user_id))
1514
- {
1515
- global $current_user;
1516
- $user_id = $current_user->ID;
1517
- }
1518
-
1519
- global $pmpro_member_days;
1520
- if(empty($pmpro_member_days[$user_id][$level_id]))
1521
- {
1522
- $startdate = pmpro_getMemberStartdate($user_id, $level_id);
1523
-
1524
- //check that there was a startdate at all
1525
- if(empty($startdate))
1526
- $pmpro_member_days[$user_id][$level_id] = 0;
1527
- else
1528
- {
1529
- $now = current_time('timestamp');
1530
- $days = ($now - $startdate)/3600/24;
1531
-
1532
- $pmpro_member_days[$user_id][$level_id] = $days;
1533
- }
1534
- }
1535
-
1536
- return $pmpro_member_days[$user_id][$level_id];
1537
- }
1538
- }
1539
-
1540
- //the start of a message handling script
1541
- function pmpro_setMessage($message, $type, $force = false)
1542
- {
1543
- global $pmpro_msg, $pmpro_msgt;
1544
-
1545
- //for now, we only show the first message generated
1546
- if($force || empty($pmpro_msg))
1547
- {
1548
- $pmpro_msg = $message;
1549
- $pmpro_msgt = $type;
1550
- }
1551
- }
1552
-
1553
- //used in class definitions for input fields to see if there was an error
1554
- function pmpro_getClassForField($field)
1555
- {
1556
- global $pmpro_error_fields, $pmpro_required_billing_fields, $pmpro_required_user_fields;
1557
- $classes = array();
1558
-
1559
- //error on this field?
1560
- if(in_array($field, $pmpro_error_fields))
1561
- {
1562
- $classes[] = "pmpro_error";
1563
- }
1564
-
1565
- $required_fields = array_merge(array_keys($pmpro_required_billing_fields), array_keys($pmpro_required_user_fields));
1566
-
1567
- //required?
1568
- if(in_array($field, $required_fields))
1569
- {
1570
- $classes[] = "pmpro_required";
1571
- }
1572
-
1573
- $classes = apply_filters("pmpro_field_classes", $classes, $field);
1574
-
1575
- if(!empty($classes))
1576
- return implode(" ", $classes);
1577
- else
1578
- return "";
1579
- }
1580
-
1581
- //get a var from $_GET or $_POST
1582
- function pmpro_getParam($index, $method = "REQUEST", $default = "")
1583
- {
1584
- if($method == "REQUEST")
1585
- {
1586
- if(!empty($_REQUEST[$index]))
1587
- return $_REQUEST[$index];
1588
- }
1589
- elseif($method == "POST")
1590
- {
1591
- if(!empty($_POST[$index]))
1592
- return $_POST[$index];
1593
- }
1594
- elseif($method == "GET")
1595
- {
1596
- if(!empty($_GET[$index]))
1597
- return $_GET[$index];
1598
- }
1599
-
1600
- return $default;
1601
- }
1602
-
1603
- /*
1604
- Format an address from address, city, state, zip, country, and phone
1605
- */
1606
- function pmpro_formatAddress($name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br = true)
1607
- {
1608
- $address = "";
1609
-
1610
- if(!empty($name))
1611
- $address .= $name . "\n";
1612
-
1613
- if(!empty($address1))
1614
- $address .= $address1 . "\n";
1615
-
1616
- if(!empty($address2))
1617
- $address .= $address2 . "\n";
1618
-
1619
- if(!empty($city) && !empty($state))
1620
- {
1621
- $address .= $city . ", " . $state;
1622
-
1623
- if(!empty($zip))
1624
- $address .= " " . $zip;
1625
-
1626
- $address .= "\n";
1627
- }
1628
-
1629
- if(!empty($country))
1630
- $address .= $country . "\n";
1631
-
1632
- if(!empty($phone))
1633
- $address .= formatPhone($phone);
1634
-
1635
- if($nl2br)
1636
- $address = nl2br($address);
1637
-
1638
- return $address;
1639
- }
1640
-
1641
- /*
1642
- Checks if all required settings are set.
1643
- */
1644
- function pmpro_is_ready()
1645
- {
1646
- global $wpdb, $pmpro_pages, $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready;
1647
-
1648
- //check if there is at least one level
1649
- $pmpro_level_ready = (bool)$wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels LIMIT 1");
1650
-
1651
- //check if the gateway settings are good. first check if it's needed (is there paid membership level)
1652
- $paid_membership_level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE allow_signups = 1 AND (initial_payment > 0 OR billing_amount > 0 OR trial_amount > 0) LIMIT 1");
1653
- $paid_user_subscription = $wpdb->get_var("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE initial_payment > 0 OR billing_amount > 0 OR trial_amount > 0 LIMIT 1");
1654
-
1655
- if(empty($paid_membership_level) && empty($paid_user_subscription))
1656
- {
1657
- //no paid membership level now or attached to a user. we don't need the gateway setup
1658
- $pmpro_gateway_ready = true;
1659
- }
1660
- else
1661
- {
1662
- $gateway = pmpro_getOption("gateway");
1663
- if($gateway == "authorizenet")
1664
- {
1665
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("loginname") && pmpro_getOption("transactionkey"))
1666
- $pmpro_gateway_ready = true;
1667
- else
1668
- $pmpro_gateway_ready = false;
1669
- }
1670
- elseif($gateway == "paypal" || $gateway == "paypalexpress")
1671
- {
1672
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("gateway_email") && pmpro_getOption("apiusername") && pmpro_getOption("apipassword") && pmpro_getOption("apisignature"))
1673
- $pmpro_gateway_ready = true;
1674
- else
1675
- $pmpro_gateway_ready = false;
1676
- }
1677
- elseif($gateway == "paypalstandard")
1678
- {
1679
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("gateway_email"))
1680
- $pmpro_gateway_ready = true;
1681
- else
1682
- $pmpro_gateway_ready = false;
1683
- }
1684
- elseif($gateway == "payflowpro")
1685
- {
1686
- if(pmpro_getOption("payflow_partner") && pmpro_getOption("payflow_vendor") && pmpro_getOption("payflow_user") && pmpro_getOption("payflow_pwd"))
1687
- $pmpro_gateway_ready = true;
1688
- else
1689
- $pmpro_gateway_ready = false;
1690
- }
1691
- elseif($gateway == "stripe")
1692
- {
1693
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("stripe_secretkey") && pmpro_getOption("stripe_publishablekey"))
1694
- $pmpro_gateway_ready = true;
1695
- else
1696
- $pmpro_gateway_ready = false;
1697
- }
1698
- elseif($gateway == "braintree")
1699
- {
1700
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("braintree_merchantid") && pmpro_getOption("braintree_publickey") && pmpro_getOption("braintree_privatekey"))
1701
- $pmpro_gateway_ready = true;
1702
- else
1703
- $pmpro_gateway_ready = false;
1704
- }
1705
- elseif($gateway == "twocheckout")
1706
- {
1707
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("twocheckout_apiusername") && pmpro_getOption("twocheckout_apipassword"))
1708
- $pmpro_gateway_ready = true;
1709
- else
1710
- $pmpro_gateway_ready = false;
1711
- }
1712
- elseif($gateway == "cybersource")
1713
- {
1714
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("cybersource_merchantid") && pmpro_getOption("cybersource_securitykey"))
1715
- $pmpro_gateway_ready = true;
1716
- else
1717
- $pmpro_gateway_ready = false;
1718
- }
1719
- else
1720
- {
1721
- $pmpro_gateway_ready = false;
1722
- }
1723
- }
1724
-
1725
- //check if we have all pages
1726
- if($pmpro_pages["account"] &&
1727
- $pmpro_pages["billing"] &&
1728
- $pmpro_pages["cancel"] &&
1729
- $pmpro_pages["checkout"] &&
1730
- $pmpro_pages["confirmation"] &&
1731
- $pmpro_pages["invoice"] &&
1732
- $pmpro_pages["levels"])
1733
- $pmpro_pages_ready = true;
1734
- else
1735
- $pmpro_pages_ready = false;
1736
-
1737
- //now check both
1738
- if($pmpro_gateway_ready && $pmpro_pages_ready)
1739
- return true;
1740
- else
1741
- return false;
1742
- }
1
+ <?php
2
+ if(!function_exists("sornot"))
3
+ {
4
+ function sornot($t, $n)
5
+ {
6
+ if($n == 1)
7
+ return $t;
8
+ else
9
+ return $t . "s";
10
+ }
11
+ }
12
+
13
+ //setup wpdb for the tables we need
14
+ function pmpro_setDBTables()
15
+ {
16
+ global $table_prefix, $wpdb;
17
+ $wpdb->hide_errors();
18
+ $wpdb->pmpro_membership_levels = $table_prefix . 'pmpro_membership_levels';
19
+ $wpdb->pmpro_memberships_users = $table_prefix . 'pmpro_memberships_users';
20
+ $wpdb->pmpro_memberships_categories = $table_prefix . 'pmpro_memberships_categories';
21
+ $wpdb->pmpro_memberships_pages = $table_prefix . 'pmpro_memberships_pages';
22
+ $wpdb->pmpro_membership_orders = $table_prefix . 'pmpro_membership_orders';
23
+ $wpdb->pmpro_discount_codes = $wpdb->prefix . 'pmpro_discount_codes';
24
+ $wpdb->pmpro_discount_codes_levels = $wpdb->prefix . 'pmpro_discount_codes_levels';
25
+ $wpdb->pmpro_discount_codes_uses = $wpdb->prefix . 'pmpro_discount_codes_uses';
26
+ }
27
+ pmpro_setDBTables();
28
+
29
+ //from: http://stackoverflow.com/questions/5266945/wordpress-how-detect-if-current-page-is-the-login-page/5892694#5892694
30
+ function pmpro_is_login_page() {
31
+ return in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php'));
32
+ }
33
+
34
+ //thanks: http://wordpress.org/support/topic/is_plugin_active
35
+ function pmpro_is_plugin_active( $plugin ) {
36
+ return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
37
+ }
38
+
39
+ //scraping - override n if you have more than 1 group of matches and don't want the first group
40
+ function pmpro_getMatches($p, $s, $firstvalue = FALSE, $n = 1)
41
+ {
42
+ $ok = preg_match_all($p, $s, $matches);
43
+
44
+ if(!$ok)
45
+ return false;
46
+ else
47
+ {
48
+ if($firstvalue)
49
+ return $matches[$n][0];
50
+ else
51
+ return $matches[$n];
52
+ }
53
+ }
54
+
55
+ function pmpro_br2nl($text, $tags = "br")
56
+ {
57
+ if(!is_array($tags))
58
+ $tags = explode(" ", $tags);
59
+
60
+ foreach($tags as $tag)
61
+ {
62
+ $text = eregi_replace("<" . $tag . "[^>]*>", "\n", $text);
63
+ $text = eregi_replace("</" . $tag . "[^>]*>", "\n", $text);
64
+ }
65
+
66
+ return($text);
67
+ }
68
+
69
+ function pmpro_getOption($s, $force = false)
70
+ {
71
+ if(isset($_REQUEST[$s]) && !$force)
72
+ return $_REQUEST[$s];
73
+ elseif(get_option("pmpro_" . $s))
74
+ return get_option("pmpro_" . $s);
75
+ else
76
+ return "";
77
+ }
78
+
79
+ function pmpro_setOption($s, $v = NULL)
80
+ {
81
+ //no value is given, set v to the request var
82
+ if($v === NULL && isset($_REQUEST[$s]))
83
+ $v = $_REQUEST[$s];
84
+
85
+ if(is_array($v))
86
+ $v = implode(",", $v);
87
+
88
+ return update_option("pmpro_" . $s, $v);
89
+ }
90
+
91
+ function pmpro_get_slug($post_id)
92
+ {
93
+ global $pmpro_slugs, $wpdb;
94
+ if(!$pmpro_slugs[$post_id])
95
+ $pmpro_slugs[$post_id] = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE ID = '" . $post_id . "' LIMIT 1");
96
+
97
+ return $pmpro_slugs[$post_id];
98
+ }
99
+
100
+ function pmpro_url($page = NULL, $querystring = "", $scheme = NULL)
101
+ {
102
+ global $besecure;
103
+ $besecure = apply_filters("besecure", $besecure);
104
+
105
+ if(!$scheme && $besecure)
106
+ $scheme = "https";
107
+ elseif(!$scheme)
108
+ $scheme = "http";
109
+
110
+ if(!$page)
111
+ $page = "levels";
112
+
113
+ global $pmpro_pages;
114
+
115
+ //? vs &
116
+ if(strpos(get_permalink($pmpro_pages[$page]), "?"))
117
+ return home_url(str_replace(home_url(), "", get_permalink($pmpro_pages[$page])) . str_replace("?", "&", $querystring), $scheme);
118
+ else
119
+ return home_url(str_replace(home_url(), "", get_permalink($pmpro_pages[$page])) . $querystring, $scheme);
120
+ }
121
+
122
+ function pmpro_isLevelFree(&$level)
123
+ {
124
+ if($level->initial_payment <= 0 && $level->billing_amount <= 0 && $level->trial_amount <= 0)
125
+ return true;
126
+ else
127
+ return false;
128
+ }
129
+
130
+ function pmpro_isLevelRecurring(&$level)
131
+ {
132
+ if($level->billing_amount > 0 || $level->trial_amount > 0)
133
+ return true;
134
+ else
135
+ return false;
136
+ }
137
+
138
+ function pmpro_isLevelTrial(&$level)
139
+ {
140
+ if($level->trial_limit > 0)
141
+ {
142
+ return true;
143
+ }
144
+ else
145
+ return false;
146
+ }
147
+
148
+ function pmpro_isLevelExpiring(&$level)
149
+ {
150
+ if($level->expiration_number > 0)
151
+ return true;
152
+ else
153
+ return false;
154
+ }
155
+
156
+ function pmpro_getLevelCost(&$level, $tags = true)
157
+ {
158
+ global $pmpro_currency_symbol;
159
+ $r = '
160
+ The price for membership is <strong>' . $pmpro_currency_symbol . number_format($level->initial_payment, 2) . '</strong> now';
161
+ if($level->billing_amount != '0.00')
162
+ {
163
+ $r .= ' and then <strong>' . $pmpro_currency_symbol . $level->billing_amount;
164
+ if($level->cycle_number == '1')
165
+ {
166
+ $r .= ' per ';
167
+ }
168
+ elseif($level->billing_limit == 1)
169
+ {
170
+ $r .= ' after ' . $level->cycle_number . ' ';
171
+ }
172
+ else
173
+ {
174
+ $r .= ' every ' . $level->cycle_number . ' ';
175
+ }
176
+
177
+ $r .= sornot($level->cycle_period,$level->cycle_number);
178
+
179
+ if($level->billing_limit > 1)
180
+ {
181
+ $r .= ' for ' . $level->billing_limit . ' more ' . sornot("payment",$level->billing_limit) . '.';
182
+ }
183
+ else
184
+ $r .= '.';
185
+
186
+ $r .= '</strong>';
187
+ }
188
+ else
189
+ $r .= '.';
190
+
191
+ if($level->trial_limit)
192
+ {
193
+ $r .= ' After your initial payment, your first ';
194
+ if($level->trial_amount == '0.00')
195
+ {
196
+ if($level->trial_limit == '1')
197
+ {
198
+ $r .= 'payment is Free.';
199
+ }
200
+ else
201
+ {
202
+ $r .= $level->trial_limit . ' payments are Free.';
203
+ }
204
+ }
205
+ else
206
+ {
207
+ $r .= $level->trial_limit.' ' .sornot("payment", $level->trial_limit) . ' will cost ' . $pmpro_currency_symbol . $level->trial_amount . '.';
208
+ }
209
+ }
210
+
211
+ //taxes?
212
+ $tax_state = pmpro_getOption("tax_state");
213
+ $tax_rate = pmpro_getOption("tax_rate");
214
+
215
+ if($tax_state && $tax_rate && !pmpro_isLevelFree($level))
216
+ {
217
+ $r .= " Customers in " . $tax_state . " will be charged " . round($tax_rate * 100, 2) . "% tax.";
218
+ }
219
+
220
+ if(!$tags)
221
+ $r = strip_tags($r);
222
+
223
+ $r = apply_filters("pmpro_level_cost_text", $r, $level);
224
+ return $r;
225
+ }
226
+
227
+ function pmpro_getLevelExpiration(&$level)
228
+ {
229
+ if($level->expiration_number)
230
+ {
231
+ $expiration_text = "Membership expires after " . $level->expiration_number . " " . sornot(strtolower($level->expiration_period), $level->expiration_number) . ".";
232
+ }
233
+ else
234
+ $expiration_text = "";
235
+
236
+ $expiration_text = apply_filters("pmpro_level_expiration_text", $expiration_text, $level);
237
+ return $expiration_text;
238
+ }
239
+
240
+ function pmpro_hideAds()
241
+ {
242
+ global $pmpro_display_ads;
243
+ return !$pmpro_display_ads;
244
+ }
245
+
246
+ function pmpro_displayAds()
247
+ {
248
+ global $pmpro_display_ads;
249
+ return $pmpro_display_ads;
250
+ }
251
+
252
+ function pmpro_next_payment($user_id = NULL)
253
+ {
254
+ global $wpdb, $current_user;
255
+ if(!$user_id)
256
+ $user_id = $current_user->ID;
257
+
258
+ if(!$user_id)
259
+ return false;
260
+
261
+ //when were they last billed
262
+ $lastdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(timestamp) as timestamp FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
263
+
264
+ if($lastdate)
265
+ {
266
+ //next payment will be same day, following month
267
+ $lastmonth = date("n", $lastdate);
268
+ $lastday = date("j", $lastdate);
269
+ $lastyear = date("Y", $lastdate);
270
+
271
+ $nextmonth = ((int)$lastmonth) + 1;
272
+ if($nextmonth == 13)
273
+ {
274
+ $nextmonth = 1;
275
+ $nextyear = ((int)$lastyear) + 1;
276
+ }
277
+ else
278
+ $nextyear = $lastyear;
279
+
280
+ $daysinnextmonth = date("t", strtotime($nextyear . "-" . $nextmonth . "-1"));
281
+
282
+ if($daysinnextmonth < $lastday)
283
+ {
284
+ $nextday = $daysinnextmonth;
285
+ }
286
+ else
287
+ $nextday = $lastday;
288
+
289
+ return strtotime($nextyear . "-" . $nextmonth . "-" . $nextday);
290
+ }
291
+ else
292
+ {
293
+ return false;
294
+ }
295
+
296
+ }
297
+
298
+ if(!function_exists("last4"))
299
+ {
300
+ function last4($t)
301
+ {
302
+ return substr($t, strlen($t) - 4, 4);
303
+ }
304
+ }
305
+
306
+ if(!function_exists("hideCardNumber"))
307
+ {
308
+ function hideCardNumber($c, $dashes = true)
309
+ {
310
+ if($c)
311
+ {
312
+ if($dashes)
313
+ return "XXXX-XXXX-XXXX-" . substr($c, strlen($c) - 4, 4);
314
+ else
315
+ return "XXXXXXXXXXXX" . substr($c, strlen($c) - 4, 4);
316
+ }
317
+ else
318
+ {
319
+ return "";
320
+ }
321
+ }
322
+ }
323
+
324
+ if(!function_exists("cleanPhone"))
325
+ {
326
+ function cleanPhone($phone)
327
+ {
328
+ //if a + is passed, just pass it along
329
+ if(strpos($phone, "+") !== false)
330
+ return $phone;
331
+
332
+ //clean the phone
333
+ $phone = str_replace("-", "", $phone);
334
+ $phone = str_replace(".", "", $phone);
335
+ $phone = str_replace("(", "", $phone);
336
+ $phone = str_replace(")", "", $phone);
337
+ $phone = str_replace(" ", "", $phone);
338
+
339
+ return $phone;
340
+ }
341
+ }
342
+
343
+ if(!function_exists("formatPhone"))
344
+ {
345
+ function formatPhone($phone)
346
+ {
347
+ $phone = cleanPhone($phone);
348
+
349
+ if(strlen($phone) == 11)
350
+ return substr($phone, 0, 1) . " (" . substr($phone, 1, 3) . ") " . substr($phone, 4, 3) . "-" . substr($phone, 7, 4);
351
+ elseif(strlen($phone) == 10)
352
+ return "(" . substr($phone, 0, 3) . ") " . substr($phone, 3, 3) . "-" . substr($phone, 6, 4);
353
+ elseif(strlen($phone) == 7)
354
+ return substr($phone, 0, 3) . "-" . substr($phone, 3, 4);
355
+ else
356
+ return $phone;
357
+ }
358
+ }
359
+
360
+ function pmpro_showRequiresMembershipMessage()
361
+ {
362
+ //get the correct message
363
+ if(is_feed())
364
+ {
365
+ $content = pmpro_getOption("rsstext");
366
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
367
+ }
368
+ elseif($current_user->ID)
369
+ {
370
+ //not a member
371
+ $content = pmpro_getOption("nonmembertext");
372
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
373
+ }
374
+ else
375
+ {
376
+ //not logged in!
377
+ $content = pmpro_getOption("notloggedintext");
378
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
379
+ }
380
+ }
381
+
382
+ /* pmpro_hasMembershipLevel() checks if the passed user is a member of the passed level
383
+ *
384
+ * $level may either be the ID or name of the desired membership_level. (or an array of such)
385
+ * If $user_id is omitted, the value will be retrieved from $current_user.
386
+ *
387
+ * Return values:
388
+ * Success returns boolean true.
389
+ * Failure returns a string containing the error message.
390
+ */
391
+ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
392
+ {
393
+ global $current_user, $all_membership_levels, $wpdb;
394
+
395
+ $r = false;
396
+ $non_member_check = false;
397
+
398
+ if($user_id)
399
+ {
400
+ //get the membership level from the global array
401
+ $membership_level = $all_membership_levels[$user_id];
402
+ if(!$membership_level)
403
+ {
404
+ //no level, check the db and add to array
405
+ $membership_level = $wpdb->get_row("SELECT l.id AS ID, l.*
406
+ FROM {$wpdb->pmpro_membership_levels} AS l
407
+ JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
408
+ WHERE mu.user_id = $user_id
409
+ LIMIT 1");
410
+ if($membership_level)
411
+ $all_membership_levels[$user_id] = $membership_level;
412
+ else
413
+ $all_memberships_levels[$user_id] = -1; //not a member of anything
414
+ }
415
+ }
416
+ else
417
+ {
418
+ //no user_id passed, check the current user
419
+ $user_id = $current_user->ID;
420
+ $membership_level = $current_user->membership_level;
421
+ }
422
+
423
+ //if 0 was passed, return true if they have no level and false if they have any
424
+ if(is_array($levels))
425
+ {
426
+ if($levels[0] === "0" || $levels[0] === 0)
427
+ {
428
+ $non_member_check = true;
429
+ if(!empty($membership_level->ID))
430
+ $r = false;
431
+ else
432
+ $r = true;
433
+ }
434
+ }
435
+ else
436
+ {
437
+ if($levels === "0" || $levels === 0)
438
+ {
439
+ $non_member_check = true;
440
+ if(!empty($membership_level->ID))
441
+ $r = false;
442
+ else
443
+ $r = true;
444
+ }
445
+ }
446
+
447
+ if(!$non_member_check)
448
+ {
449
+ //no levels?
450
+ if($membership_level == "-1" || empty($membership_level))
451
+ $r = false;
452
+
453
+ //if no level var was passed, we're just checking if they have any level
454
+ if(!$levels)
455
+ {
456
+ if(!empty($membership_level->ID))
457
+ $r = true;
458
+ else
459
+ $r = false;
460
+ }
461
+
462
+ if(!is_array($levels))
463
+ $levels = array($levels);
464
+
465
+ //okay, so something to check let's set the levels
466
+ if(empty($membership_level))
467
+ {
468
+ //non member check
469
+ foreach($levels as $level)
470
+ {
471
+ if(is_numeric($level) && (int)$level < 0)
472
+ $r = true; //they don't have a membership level so they don't have this one
473
+ }
474
+ }
475
+ else
476
+ {
477
+ //check levels against the user's level
478
+ foreach($levels as $level)
479
+ {
480
+ if(is_numeric($level) && (int)$level < 0)
481
+ {
482
+ //passing -1 will return true if the user does not have membership level #1
483
+ $abs_level = abs($level);
484
+ if($abs_level != $membership_level->ID)
485
+ $r = true;
486
+ }
487
+ elseif($level == $membership_level->ID || $level == $membership_level->name)
488
+ {
489
+ //the user has this level
490
+ $r = true;
491
+ }
492
+ }
493
+ }
494
+ }
495
+
496
+ $r = apply_filters("pmpro_has_membership_level", $r, $user_id, $levels);
497
+
498
+ return $r;
499
+ }
500
+
501
+ /* pmpro_changeMembershipLevel() creatues or updates the membership level of the given user to the given level.
502
+ *
503
+ * $level may either be the ID or name of the desired membership_level.
504
+ * If $user_id is omitted, the value will be retrieved from $current_user.
505
+ *
506
+ * Return values:
507
+ * Success returns boolean true.
508
+ * Failure returns boolean false.
509
+ */
510
+ function pmpro_changeMembershipLevel($level, $user_id = NULL)
511
+ {
512
+ global $wpdb;
513
+ global $current_user, $pmpro_error;
514
+
515
+ if(!$user_id)
516
+ $user_id = $current_user->ID;
517
+
518
+ if(!$user_id)
519
+ {
520
+ $pmpro_error = "User ID not found.";
521
+ return false;
522
+ }
523
+
524
+ //was a name passed? (Todo: make sure level names have at least one non-numeric character.
525
+ if($level !== "" && $level !== false && $level !== NULL && !is_numeric($level))
526
+ {
527
+ $level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE name = '" . $wpdb->escape($level) . "' LIMIT 1");
528
+ if(!$level)
529
+ {
530
+ $pmpro_error = "Membership level not found.";
531
+ return false;
532
+ }
533
+ }
534
+
535
+ //are they even changing?
536
+ $old_level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user_id . "'");
537
+ if(empty($old_level->membership_id) && empty($level))
538
+ return false; //not changing
539
+ elseif(!empty($old_level->membership_id) && $old_level->membership_id == $level)
540
+ return false; //not changing
541
+
542
+ //are they paying? may need to cancel their old membership
543
+ if(!pmpro_isLevelFree($old_level))
544
+ $paying = true;
545
+ else
546
+ $paying = false;
547
+
548
+ if($paying)
549
+ {
550
+ //get last order
551
+ $order = new MemberOrder();
552
+ $order->getLastMemberOrder($user_id);
553
+
554
+ if($order->cancel())
555
+ {
556
+ //we're good
557
+ }
558
+ else
559
+ {
560
+ //uh oh
561
+ $pmpro_error = "There was an error canceling your membership: " . $order->error;
562
+ return false;
563
+ }
564
+ }
565
+
566
+ //adding, changing, or deleting
567
+ if($level)
568
+ {
569
+ //adding, changing
570
+ $sql = "REPLACE INTO $wpdb->pmpro_memberships_users (`membership_id`,`user_id`) VALUES ('" . $level . "','" . $user_id . "')";
571
+ }
572
+ else
573
+ {
574
+ //false or null or 0 was passed, so we're deleting removing
575
+ $sql = "DELETE FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $wpdb->escape($user_id) . "' LIMIT 1";
576
+ }
577
+
578
+ //run the query, return
579
+ if(!$wpdb->query($sql))
580
+ {
581
+ if(mysql_errno())
582
+ $pmpro_error = "Error: " . mysql_error();
583
+ return false;
584
+ }
585
+ else
586
+ {
587
+ pmpro_set_current_user();
588
+ do_action("pmpro_after_change_membership_level", $level, $user_id); //$level is the $level_id here
589
+ return true;
590
+ }
591
+ }
592
+
593
+ /* pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
594
+ *
595
+ * $level may either be the ID or name of the desired membership_level.
596
+ * $category must be a valid post category ID.
597
+ *
598
+ * Return values:
599
+ * Success returns boolean true.
600
+ * Failure returns a string containing the error message.
601
+ */
602
+ function pmpro_toggleMembershipCategory( $level, $category, $value )
603
+ {
604
+ global $wpdb;
605
+ $category = intval($category);
606
+
607
+ if ( ($level = intval($level)) <= 0 )
608
+ {
609
+ $safe = addslashes($level);
610
+ if ( ($level = intval($wpdb->get_var("SELECT id FROM {$wpdb->pmpro_membership_levels} WHERE name = '$safe' LIMIT 1"))) <= 0 )
611
+ {
612
+ return "Membership level not found.";
613
+ }
614
+ }
615
+
616
+ if ( $value )
617
+ {
618
+ $sql = "REPLACE INTO {$wpdb->pmpro_memberships_categories} (`membership_id`,`category_id`) VALUES ('$level','$category')";
619
+ $wpdb->query($sql);
620
+ if(mysql_errno()) return mysql_error();
621
+ }
622
+ else
623
+ {
624
+ $sql = "DELETE FROM {$wpdb->pmpro_memberships_categories} WHERE `membership_id` = '$level' AND `category_id` = '$category' LIMIT 1";
625
+ $wpdb->query($sql);
626
+ if(mysql_errno()) return mysql_error();
627
+ }
628
+
629
+ return true;
630
+ }
631
+
632
+ /* pmpro_updateMembershipCategories() ensures that all those and only those categories given
633
+ * are associated with the given membership level.
634
+ *
635
+ * $level is a valid membership level ID or name
636
+ * $categories is an array of post category IDs
637
+ *
638
+ * Return values:
639
+ * Success returns boolean true.
640
+ * Failure returns a string containing the error message.
641
+ */
642
+ function pmpro_updateMembershipCategories($level, $categories)
643
+ {
644
+ global $wpdb;
645
+
646
+ if(!is_numeric($level))
647
+ {
648
+ $level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE name = '" . $wpdb->escape($level) . "' LIMIT 1");
649
+ if(empty($level))
650
+ {
651
+ return "Membership level not found.";
652
+ }
653
+ }
654
+
655
+ // remove all existing links...
656
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE `membership_id` = '" . $wpdb->escape($level) . "'";
657
+ $wpdb->query($sqlQuery);
658
+ if(mysql_errno()) return mysql_error();
659
+
660
+ // add the given links [back?] in...
661
+ foreach($categories as $cat)
662
+ {
663
+ if(is_string($r = pmpro_toggleMembershipCategory( $level, $cat, true)))
664
+ {
665
+ //uh oh, error
666
+ return $r;
667
+ }
668
+ }
669
+
670
+ //all good
671
+ return true;
672
+ }
673
+
674
+ function pmpro_isAdmin($user_id = NULL)
675
+ {
676
+ global $current_user, $wpdb;
677
+ if(!$user_id)
678
+ $user_id = $current_user->ID;
679
+
680
+ if(!$user_id)
681
+ return false;
682
+
683
+ $admincap = user_can($user_id, "manage_options");
684
+ if($admincap)
685
+ return true;
686
+ else
687
+ return false;
688
+ }
689
+
690
+ function pmpro_replaceUserMeta($user_id, $meta_keys, $meta_values, $prev_values = NULL)
691
+ {
692
+ //expects all arrays for last 3 params or all strings
693
+ if(!is_array($meta_keys))
694
+ {
695
+ $meta_keys = array($meta_keys);
696
+ $meta_values = array($meta_values);
697
+ $prev_values = array($prev_values);
698
+ }
699
+
700
+ for($i = 0; $i < count($meta_values); $i++)
701
+ {
702
+ if($prev_values[$i])
703
+ {
704
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $prev_values[$i]);
705
+ }
706
+ else
707
+ {
708
+ $old_value = get_user_meta($user_id, $meta_keys[$i], true);
709
+ if($old_value)
710
+ {
711
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $old_value);
712
+ }
713
+ else
714
+ {
715
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i]);
716
+ }
717
+ }
718
+ }
719
+
720
+ return $i;
721
+ }
722
+
723
+ function pmpro_getMetavalues($query)
724
+ {
725
+ global $wpdb;
726
+
727
+ $results = $wpdb->get_results($query);
728
+ foreach($results as $result)
729
+ {
730
+ $r->{$result->key} = $result->value;
731
+ }
732
+
733
+ return $r;
734
+ }
735
+
736
+ //function to return the pagination string
737
+ function pmpro_getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 1, $targetpage = "/", $pagestring = "&pn=")
738
+ {
739
+ //defaults
740
+ if(!$adjacents) $adjacents = 1;
741
+ if(!$limit) $limit = 15;
742
+ if(!$page) $page = 1;
743
+ if(!$targetpage) $targetpage = "/";
744
+
745
+ //other vars
746
+ $prev = $page - 1; //previous page is page - 1
747
+ $next = $page + 1; //next page is page + 1
748
+ $lastpage = ceil($totalitems / $limit); //lastpage is = total items / items per page, rounded up.
749
+ $lpm1 = $lastpage - 1; //last page minus 1
750
+
751
+ /*
752
+ Now we apply our rules and draw the pagination object.
753
+ We're actually saving the code to a variable in case we want to draw it more than once.
754
+ */
755
+ $pagination = "";
756
+ if($lastpage > 1)
757
+ {
758
+ $pagination .= "<div class=\"pmpro_pagination\"";
759
+ if(!empty($margin) || !empty($padding))
760
+ {
761
+ $pagination .= " style=\"";
762
+ if($margin)
763
+ $pagination .= "margin: $margin;";
764
+ if($padding)
765
+ $pagination .= "padding: $padding;";
766
+ $pagination .= "\"";
767
+ }
768
+ $pagination .= ">";
769
+
770
+ //previous button
771
+ if ($page > 1)
772
+ $pagination .= "<a href=\"$targetpage$pagestring$prev\">&laquo; prev</a>";
773
+ else
774
+ $pagination .= "<span class=\"disabled\">&laquo; prev</span>";
775
+
776
+ //pages
777
+ if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
778
+ {
779
+ for ($counter = 1; $counter <= $lastpage; $counter++)
780
+ {
781
+ if ($counter == $page)
782
+ $pagination .= "<span class=\"current\">$counter</span>";
783
+ else
784
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
785
+ }
786
+ }
787
+ elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
788
+ {
789
+ //close to beginning; only hide later pages
790
+ if($page < 1 + ($adjacents * 3))
791
+ {
792
+ for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
793
+ {
794
+ if ($counter == $page)
795
+ $pagination .= "<span class=\"current\">$counter</span>";
796
+ else
797
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
798
+ }
799
+ $pagination .= "...";
800
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
801
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
802
+ }
803
+ //in middle; hide some front and some back
804
+ elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
805
+ {
806
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
807
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
808
+ $pagination .= "...";
809
+ for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
810
+ {
811
+ if ($counter == $page)
812
+ $pagination .= "<span class=\"current\">$counter</span>";
813
+ else
814
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
815
+ }
816
+ $pagination .= "...";
817
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
818
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
819
+ }
820
+ //close to end; only hide early pages
821
+ else
822
+ {
823
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
824
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
825
+ $pagination .= "...";
826
+ for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
827
+ {
828
+ if ($counter == $page)
829
+ $pagination .= "<span class=\"current\">$counter</span>";
830
+ else
831
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
832
+ }
833
+ }
834
+ }
835
+
836
+ //next button
837
+ if ($page < $counter - 1)
838
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $next . "\">next &raquo;</a>";
839
+ else
840
+ $pagination .= "<span class=\"disabled\">next &raquo;</span>";
841
+ $pagination .= "</div>\n";
842
+ }
843
+
844
+ return $pagination;
845
+
846
+ }
847
+
848
+ function pmpro_calculateInitialPaymentRevenue($s = NULL, $l = NULL)
849
+ {
850
+ global $wpdb;
851
+
852
+ //if we're limiting users by search
853
+ if($s || $l)
854
+ {
855
+ $user_ids_query = "SELECT ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE 1 ";
856
+ if($s)
857
+ $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
858
+ if($l)
859
+ $user_ids_query .= "AND mu.membership_id = '$l' ";
860
+ }
861
+
862
+ //query to sum initial payments
863
+ $sqlQuery = "SELECT SUM(initial_payment) FROM $wpdb->pmpro_memberships_users WHERE 1 ";
864
+ if(!empty($user_ids_query))
865
+ $sqlQuery .= "AND user_id IN(" . $user_ids_query . ") ";
866
+
867
+ $total = $wpdb->get_var($sqlQuery);
868
+
869
+ return (double)$total;
870
+ }
871
+
872
+ function pmpro_calculateRecurringRevenue($s, $l)
873
+ {
874
+ global $wpdb;
875
+
876
+ //if we're limiting users by search
877
+ if($s || $l)
878
+ {
879
+ $user_ids_query = "AND user_id IN(SELECT ID FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id WHERE 1 ";
880
+ if($s)
881
+ $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
882
+ if($l)
883
+ $user_ids_query .= "AND mu.membership_id = '$l' ";
884
+ $user_ids_query .= ")";
885
+ }
886
+ else
887
+ $user_ids_query = "";
888
+
889
+ //4 queries to get annual earnings for each cycle period. currently ignoring trial periods and billing limits.
890
+ $sqlQuery = "
891
+ SELECT SUM((12/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE cycle_period = 'Month' AND cycle_number <> 12 $user_ids_query
892
+ UNION
893
+ SELECT SUM((365/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE cycle_period = 'Day' AND cycle_number <> 365 $user_ids_query
894
+ UNION
895
+ SELECT SUM((52/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE cycle_period = 'Week' AND cycle_number <> 52 $user_ids_query
896
+ UNION
897
+ SELECT SUM(billing_amount) FROM $wpdb->pmpro_memberships_users WHERE cycle_period = 'Year' $user_ids_query
898
+ ";
899
+ $annual_revenues = $wpdb->get_col($sqlQuery);
900
+
901
+ $total = 0;
902
+ foreach($annual_revenues as $r)
903
+ {
904
+ $total += $r;
905
+ }
906
+
907
+ return $total;
908
+ }
909
+
910
+ function pmpro_generateUsername($firstname = "", $lastname = "", $email = "")
911
+ {
912
+ global $wpdb;
913
+
914
+ //try first initial + last name, firstname, lastname
915
+ $firstname = preg_replace("/[^A-Za-z]/", "", $firstname);
916
+ $lastname = preg_replace("/[^A-Za-z]/", "", $lastname);
917
+ if($firstname && $lastname)
918
+ {
919
+ $username = substr($firstname, 0, 1) . $lastname;
920
+ }
921
+ elseif($firstname)
922
+ {
923
+ $username = $firstname;
924
+ }
925
+ elseif($lastname)
926
+ {
927
+ $username = $lastname;
928
+ }
929
+
930
+ //is it taken?
931
+ $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
932
+
933
+ if(!$taken)
934
+ return $username;
935
+
936
+ //try the beginning of the email address
937
+ $emailparts = explode("@", "email");
938
+ if(is_array($emailparts))
939
+ $email = preg_replace("/[^A-Za-z]/", "", $emailparts[0]);
940
+
941
+ if($email)
942
+ {
943
+ $username = $email;
944
+ }
945
+
946
+ //is this taken? if not, add numbers until it works
947
+ $taken = true;
948
+ $count = 0;
949
+ while($taken)
950
+ {
951
+ //add a # to the end
952
+ if($count)
953
+ {
954
+ $username = preg_replace("/[0-9]/", "", $username) . $count;
955
+ }
956
+
957
+ //taken?
958
+ $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
959
+
960
+ //increment the number
961
+ $count++;
962
+ }
963
+
964
+ //must have a good username now
965
+ return $username;
966
+ }
967
+
968
+ //get a new random code for discount codes
969
+ function pmpro_getDiscountCode()
970
+ {
971
+ global $wpdb;
972
+
973
+ while(empty($code))
974
+ {
975
+ $scramble = md5(AUTH_KEY . time() . SECURE_AUTH_KEY);
976
+ $code = substr($scramble, 0, 10);
977
+ $check = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE code = '$code' LIMIT 1");
978
+ if($check || is_numeric($code))
979
+ $code = NULL;
980
+ }
981
+
982
+ return strtoupper($code);
983
+ }
984
+
985
+ //is a discount code valid
986
+ function pmpro_checkDiscountCode($code, $level_id = NULL, $return_errors = false)
987
+ {
988
+ global $wpdb;
989
+
990
+ //no code, no code
991
+ if(empty($code))
992
+ {
993
+ if($return_errors)
994
+ return array(false, "No code was given to check.");
995
+ else
996
+ return false;
997
+ }
998
+
999
+ //get code from db
1000
+ $dbcode = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE code ='" . $code . "' LIMIT 1");
1001
+
1002
+ //did we find it?
1003
+ if(empty($dbcode->id))
1004
+ {
1005
+ if($return_errors)
1006
+ return array(false, "The code could not be found.");
1007
+ else
1008
+ return false;
1009
+ }
1010
+
1011
+ //fix the date timestamps
1012
+ $dbcode->starts = strtotime(date("m/d/Y", $dbcode->starts));
1013
+ $dbcode->expires = strtotime(date("m/d/Y", $dbcode->expires));
1014
+
1015
+ //today
1016
+ $today = strtotime(date("m/d/Y 00:00:00"));
1017
+
1018
+ //has this code started yet?
1019
+ if(!empty($dbcode->starts) && $dbcode->starts > $today)
1020
+ {
1021
+ if($return_errors)
1022
+ return array(false, "This discount code goes into effect on " . date("m/d/Y", $dbcode->starts) . ".");
1023
+ else
1024
+ return false;
1025
+ }
1026
+
1027
+ //has this code expired?
1028
+ if(!empty($dbcode->expires) && $dbcode->expires < $today)
1029
+ {
1030
+ if($return_errors)
1031
+ return array(false, "This discount code expired on " . date("m/d/Y", $dbcode->expires) . ".");
1032
+ else
1033
+ return false;
1034
+ }
1035
+
1036
+ //have we run out of uses?
1037
+ if($dbcode->uses > 0)
1038
+ {
1039
+ $used = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $dbcode->id . "'");
1040
+ if($used >= $dbcode->uses)
1041
+ {
1042
+ if($return_errors)
1043
+ return array(false, "This discount code is no longer valid.");
1044
+ else
1045
+ return false;
1046
+ }
1047
+ }
1048
+
1049
+ //if a level was passed check if this code applies
1050
+ $pmpro_check_discount_code_levels = apply_filters("pmpro_check_discount_code_levels", true, $dbcode->id);
1051
+ if(!empty($level_id) && $pmpro_check_discount_code_levels)
1052
+ {
1053
+ $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $dbcode->id . "' AND cl.level_id = '" . $level_id . "' LIMIT 1");
1054
+
1055
+ if(empty($code_level))
1056
+ {
1057
+ if(!empty($return_errors))
1058
+ return array(false, "This code does not apply to this membership level.");
1059
+ else
1060
+ return false;
1061
+ }
1062
+ }
1063
+
1064
+ //guess we're all good
1065
+ if(!empty($return_errors))
1066
+ return array(true, "This discount code is okay.");
1067
+ else
1068
+ return true;
1069
+ }
1070
+
1071
+ function pmpro_no_quotes($s, $quotes = array("'", '"'))
1072
+ {
1073
+ return str_replace($quotes, "", $s);
1074
+ }
1075
+
1076
+ //from: http://www.php.net/manual/en/function.implode.php#86845
1077
+ function pmpro_implodeToEnglish($array)
1078
+ {
1079
+ // sanity check
1080
+ if (!$array || !count ($array))
1081
+ return '';
1082
+
1083
+ // get last element
1084
+ $last = array_pop ($array);
1085
+
1086
+ // if it was the only element - return it
1087
+ if (!count ($array))
1088
+ return $last;
1089
+
1090
+ return implode (', ', $array).' and '.$last;
1091
+ }
1092
+
1093
+ //from yoast wordpress seo
1094
+ function pmpro_text_limit( $text, $limit, $finish = '&hellip;')
1095
+ {
1096
+ if( strlen( $text ) > $limit ) {
1097
+ $text = substr( $text, 0, $limit );
1098
+ $text = substr( $text, 0, - ( strlen( strrchr( $text,' ') ) ) );
1099
+ $text .= $finish;
1100
+ }
1101
+ return $text;
1102
+ }
1103
+
1104
+ function pmpro_getMembershipLevelForUser($user_id = NULL)
1105
+ {
1106
+ if(empty($user_id))
1107
+ {
1108
+ global $current_user;
1109
+ $user_id = $current_user->ID;
1110
+ }
1111
+
1112
+ if(empty($user_id))
1113
+ return false;
1114
+
1115
+ global $wpdb;
1116
+ return $wpdb->get_row("SELECT l.id AS ID, l.id as id, l.name, l.description, mu.initial_payment, mu.billing_amount, mu.cycle_number, mu.cycle_period, mu.billing_limit, mu.trial_amount, mu.trial_limit, mu.code_id as code_id, UNIX_TIMESTAMP(startdate) as startdate, UNIX_TIMESTAMP(enddate) as enddate
1117
+ FROM {$wpdb->pmpro_membership_levels} AS l
1118
+ JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1119
+ WHERE mu.user_id = $user_id
1120
+ LIMIT 1");
1121
+ }
1122
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/https.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
- /*
3
- Code related to HTTPS/SSL
4
- */
5
-
6
- //this function checks if we have set the $isapage variable, and if so prevents WP from sending a 404
7
- function pmpro_status_filter($s)
8
- {
9
- global $isapage;
10
- if($isapage && strpos($s, "404"))
11
- return false; //don't send the 404
12
- else
13
- return $s;
14
- }
15
-
16
- //filters links/etc to add HTTPS to URL if needed
17
- function pmpro_https_filter($s)
18
- {
19
- global $besecure;
20
- $besecure = apply_filters('pmpro_besecure', $besecure);
21
-
22
- if($besecure || is_ssl())
23
- return str_replace("http:", "https:", $s);
24
- else
25
- return str_replace("https:", "http:", $s);
26
- }
27
- add_filter('status_header', 'pmpro_status_filter');
28
- add_filter('bloginfo_url', 'pmpro_https_filter');
29
- add_filter('wp_list_pages', 'pmpro_https_filter');
30
- add_filter('option_home', 'pmpro_https_filter');
31
- add_filter('option_siteurl', 'pmpro_https_filter');
32
- add_filter('logout_url', 'pmpro_https_filter');
33
- add_filter('login_url', 'pmpro_https_filter');
34
- add_filter('home_url', 'pmpro_https_filter');
35
-
36
- //this function sets the besecure global which may be used in early code
37
- /*
38
- function pmpro_besecure_set()
39
- {
40
- global $besecure;
41
- if(force_ssl_admin() || force_ssl_login() || is_ssl())
42
- $besecure = true;
43
-
44
- $besecure = apply_filters("pmpro_besecure", $besecure);
45
- }
46
- add_action('init', 'pmpro_besecure_set', 2);
47
- */
48
-
49
- //this function updates the besecure global with post data and redirects if needed
50
- function pmpro_besecure()
51
- {
52
- global $besecure, $post;
53
-
54
- //check the post option
55
- if(!is_admin() && !empty($post->ID) && !$besecure)
56
- $besecure = get_post_meta($post->ID, "besecure", true);
57
-
58
- //if forcing ssl on admin, be secure in admin and login page
59
- if(!$besecure && force_ssl_admin() && (is_admin() || pmpro_is_login_page()))
60
- $besecure = true;
61
-
62
- //if forcing ssl on login, be secure on the login page
63
- if(!$besecure && force_ssl_login() && pmpro_is_login_page())
64
- $besecure = true;
65
-
66
- $besecure = apply_filters("pmpro_besecure", $besecure);
67
-
68
- $use_ssl = pmpro_getOption("use_ssl");
69
- if($use_ssl == 1)
70
- {
71
- if($besecure && (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off" || $_SERVER['HTTPS'] == "false"))
72
- {
73
- //need to be secure
74
- wp_redirect("https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
75
- exit;
76
- }
77
- elseif(!$besecure && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "off" && $_SERVER['HTTPS'] != "false")
78
- {
79
- //don't need to be secure
80
- wp_redirect("http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
81
- exit;
82
- }
83
- }
84
- }
85
- add_action('wp', 'pmpro_besecure', 2);
86
- add_action('login_init', 'pmpro_besecure', 2);
87
-
88
- //JavaScript SSL redirect
89
- function pmpro_ssl_javascript_redirect()
90
- {
91
- global $besecure;
92
- $use_ssl = pmpro_getOption("use_ssl");
93
- if(!is_admin() && $use_ssl == 2)
94
- {
95
- if($besecure)
96
- {
97
- ?>
98
- <script lang="JavaScript">
99
- //needs to be secure
100
- if (window.location.protocol != "https:")
101
- window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
102
- </script>
103
- <?php
104
- }
105
- else
106
- {
107
- ?>
108
- <script lang="JavaScript">
109
- //should be over http
110
- if (window.location.protocol != "http:")
111
- window.location.href = "http:" + window.location.href.substring(window.location.protocol.length);
112
- </script>
113
- <?php
114
- }
115
- }
116
- }
117
- add_action('wp_print_scripts', 'pmpro_ssl_javascript_redirect');
118
-
119
- //If the site URL starts with https:, then force SSL/besecure to true. (Added 1.5.2)
120
- function pmpro_check_site_url_for_https($besecure)
121
- {
122
- global $wpdb, $pmpro_siteurl;
123
-
124
- //need to get this from the database because we filter get_option
125
- if(empty($pmpro_siteurl))
126
- $pmpro_siteurl = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl' LIMIT 1");
127
-
128
- //entire site is over https?
129
- if(strpos($pmpro_siteurl, "https:") !== false)
130
- $besecure = true;
131
-
132
- return $besecure;
133
- }
134
- add_filter("pmpro_besecure", "pmpro_check_site_url_for_https");
135
-
136
- //capturing case where a user links to https admin without admin over https
137
- function pmpro_admin_https_handler()
138
- {
139
- if(!empty($_SERVER['HTTPS']))
140
- {
141
- if($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off" && $_SERVER['HTTPS'] != "false" && is_admin())
142
- {
143
- if(substr(get_option("siteurl"), 0, 5) == "http:" && !force_ssl_admin())
144
- {
145
- //need to redirect to non https
146
- wp_redirect("http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
147
- exit;
148
- }
149
- }
150
- }
151
- }
152
- add_action('init', 'pmpro_admin_https_handler');
153
-
154
- /*
155
- This code is for the "nuke" option to make URLs secure on secure pages.
156
- */
157
- function pmpro_NuclearHTTPS()
158
- {
159
- //did they choose the option?
160
- $nuking = pmpro_getOption("nuclear_HTTPS");
161
- if(!empty($nuking))
162
- {
163
- ob_start("pmpro_replaceURLsInBuffer");
164
- }
165
- }
166
- add_action("init", "pmpro_NuclearHTTPS");
167
-
168
- function pmpro_replaceURLsInBuffer($buffer)
169
- {
170
- global $besecure;
171
-
172
- //only swap URLs if this page is secure
173
- if($besecure)
174
- {
175
- /*
176
- okay swap out all links like these:
177
- * http://domain.com
178
- * http://anysubdomain.domain.com
179
- * http://any.number.of.sub.domains.domain.com
180
- */
181
- $buffer = preg_replace("/http\:\/\/([a-zA-Z0-9\.\-]*" . str_replace(".", "\.", PMPRO_DOMAIN) . ")/i", "https://$1", $buffer);
182
- }
183
-
184
- return $buffer;
185
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/init.php DELETED
@@ -1,240 +0,0 @@
1
- <?php
2
- /*
3
- Code that runs on the init, set_current_user, or wp hooks to setup PMPro
4
- */
5
- //init code
6
- function pmpro_init()
7
- {
8
- require_once(PMPRO_DIR . "/includes/countries.php");
9
- require_once(PMPRO_DIR . "/includes/states.php");
10
- require_once(PMPRO_DIR . "/includes/currencies.php");
11
-
12
- wp_enqueue_script('ssmemberships_js', plugins_url('js/paid-memberships-pro.js',dirname(__FILE__) ), array('jquery'));
13
-
14
- if(is_admin())
15
- {
16
- $admin_css_rtl = false;
17
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin.css")) {
18
- $admin_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin.css";
19
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
20
- $admin_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
21
- }
22
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/admin.css")) {
23
- $admin_css = get_template_directory_uri() . "/paid-memberships-pro/admin.css";
24
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
25
- $admin_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
26
- }
27
- } else {
28
- $admin_css = plugins_url('css/admin.css',dirname(__FILE__) );
29
- if( is_rtl() ) {
30
- $admin_css_rtl = plugins_url('css/admin-rtl.css',dirname(__FILE__) );
31
- }
32
- }
33
- wp_enqueue_style('pmpro_admin', $admin_css, array(), PMPRO_VERSION, "screen");
34
- if( $admin_css_rtl ) {
35
- wp_enqueue_style('pmpro_admin_rtl', $admin_css_rtl, array(), PMPRO_VERSION, "screen");
36
- }
37
- }
38
- else
39
- {
40
- $frontend_css_rtl = false;
41
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend.css")) {
42
- $frontend_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend.css";
43
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
44
- $frontend_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
45
- }
46
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/frontend.css")) {
47
- $frontend_css = get_template_directory_uri() . "/paid-memberships-pro/frontend.css";
48
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
49
- $frontend_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
50
- }
51
- } else {
52
- $frontend_css = plugins_url('css/frontend.css',dirname(__FILE__) );
53
- if( is_rtl() ) {
54
- $frontend_css_rtl = plugins_url('css/frontend-rtl.css',dirname(__FILE__) );
55
- }
56
- }
57
- wp_enqueue_style('pmpro_frontend', $frontend_css, array(), PMPRO_VERSION, "screen");
58
- if( $frontend_css_rtl ) {
59
- wp_enqueue_style('pmpro_frontend_rtl', $frontend_css_rtl, array(), PMPRO_VERSION, "screen");
60
- }
61
-
62
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/print.css"))
63
- $print_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/print.css";
64
- elseif(file_exists(get_template_directory() . "/paid-memberships-pro/print.css"))
65
- $print_css = get_template_directory_uri() . "/paid-memberships-pro/print.css";
66
- else
67
- $print_css = plugins_url('css/print.css',dirname(__FILE__) );
68
- wp_enqueue_style('pmpro_print', $print_css, array(), PMPRO_VERSION, "print");
69
- }
70
-
71
- global $pmpro_pages, $pmpro_ready, $pmpro_currency, $pmpro_currency_symbol;
72
- $pmpro_pages = array();
73
- $pmpro_pages["account"] = pmpro_getOption("account_page_id");
74
- $pmpro_pages["billing"] = pmpro_getOption("billing_page_id");
75
- $pmpro_pages["cancel"] = pmpro_getOption("cancel_page_id");
76
- $pmpro_pages["checkout"] = pmpro_getOption("checkout_page_id");
77
- $pmpro_pages["confirmation"] = pmpro_getOption("confirmation_page_id");
78
- $pmpro_pages["invoice"] = pmpro_getOption("invoice_page_id");
79
- $pmpro_pages["levels"] = pmpro_getOption("levels_page_id");
80
-
81
- $pmpro_ready = pmpro_is_ready();
82
-
83
- //set currency
84
- $pmpro_currency = pmpro_getOption("currency");
85
- if(!$pmpro_currency)
86
- {
87
- global $pmpro_default_currency;
88
- $pmpro_currency = $pmpro_default_currency;
89
- }
90
-
91
- //figure out what symbol to show for currency
92
- if(in_array($pmpro_currency, array("USD", "AUD", "BRL", "CAD", "HKD", "MXN", "NZD", "SGD")))
93
- $pmpro_currency_symbol = "&#36;";
94
- elseif($pmpro_currency == "EUR")
95
- $pmpro_currency_symbol = "&euro;";
96
- elseif($pmpro_currency == "GBP")
97
- $pmpro_currency_symbol = "&pound;";
98
- elseif($pmpro_currency == "JPY")
99
- $pmpro_currency_symbol = "&yen;";
100
- else
101
- $pmpro_currency_symbol = $pmpro_currency . " "; //just use the code
102
- }
103
- add_action("init", "pmpro_init");
104
-
105
- //this code runs after $post is set, but before template output
106
- function pmpro_wp()
107
- {
108
- if(!is_admin())
109
- {
110
- global $post, $pmpro_pages, $pmpro_page_name, $pmpro_page_id, $pmpro_body_classes;
111
-
112
- //run the appropriate preheader function
113
- foreach($pmpro_pages as $pmpro_page_name => $pmpro_page_id)
114
- {
115
- if(!empty($post->post_content) && strpos($post->post_content, "[pmpro_" . $pmpro_page_name . "]") !== false)
116
- {
117
- //preheader
118
- require_once(PMPRO_DIR . "/preheaders/" . $pmpro_page_name . ".php");
119
-
120
- //add class to body
121
- $pmpro_body_classes[] = "pmpro-" . str_replace("_", "-", $pmpro_page_name);
122
-
123
- //shortcode
124
- function pmpro_pages_shortcode($atts, $content=null, $code="")
125
- {
126
- global $pmpro_page_name;
127
- ob_start();
128
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/pages/" . $pmpro_page_name . ".php"))
129
- include(get_stylesheet_directory() . "/paid-memberships-pro/pages/" . $pmpro_page_name . ".php");
130
- else
131
- include(PMPRO_DIR . "/pages/" . $pmpro_page_name . ".php");
132
-
133
- $temp_content = ob_get_contents();
134
- ob_end_clean();
135
- return apply_filters("pmpro_pages_shortcode_" . $pmpro_page_name, $temp_content);
136
- }
137
- add_shortcode("pmpro_" . $pmpro_page_name, "pmpro_pages_shortcode");
138
- break; //only the first page found gets a shortcode replacement
139
- }
140
- }
141
- }
142
- }
143
- add_action("wp", "pmpro_wp", 1);
144
-
145
- /*
146
- Add PMPro page names to the BODY class.
147
- */
148
- function pmpro_body_class($classes)
149
- {
150
- global $pmpro_body_classes;
151
-
152
- if(is_array($pmpro_body_classes))
153
- $classes = array_merge($pmpro_body_classes, $classes);
154
-
155
- return $classes;
156
- }
157
- add_filter("body_class", "pmpro_body_class");
158
-
159
- //add membership level to current user object
160
- function pmpro_set_current_user()
161
- {
162
- //this code runs at the beginning of the plugin
163
- global $current_user, $wpdb;
164
- get_currentuserinfo();
165
- $id = intval($current_user->ID);
166
- if($id)
167
- {
168
- $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
169
- if(!empty($current_user->membership_level))
170
- {
171
- $current_user->membership_level->categories = pmpro_getMembershipCategories($current_user->membership_level->ID);
172
- }
173
- $current_user->membership_levels = pmpro_getMembershipLevelsForUser($current_user->ID);
174
- }
175
-
176
- //hiding ads?
177
- $hideads = pmpro_getOption("hideads");
178
- $hideadslevels = pmpro_getOption("hideadslevels");
179
- if(!is_array($hideadslevels))
180
- $hideadslevels = explode(",", $hideadslevels);
181
- if($hideads == 1 && pmpro_hasMembershipLevel() || $hideads == 2 && pmpro_hasMembershipLevel($hideadslevels))
182
- {
183
- //disable ads in ezAdsense
184
- if(class_exists("ezAdSense"))
185
- {
186
- global $ezCount, $urCount;
187
- $ezCount = 100;
188
- $urCount = 100;
189
- }
190
-
191
- //disable ads in Easy Adsense (newer versions)
192
- if(class_exists("EzAdSense"))
193
- {
194
- global $ezAdSense;
195
- $ezAdSense->ezCount = 100;
196
- $ezAdSense->urCount = 100;
197
- }
198
-
199
- //set a global variable to hide ads
200
- global $pmpro_display_ads;
201
- $pmpro_display_ads = false;
202
- }
203
- else
204
- {
205
- global $pmpro_display_ads;
206
- $pmpro_display_ads = true;
207
- }
208
-
209
- do_action("pmpro_after_set_current_user");
210
- }
211
- add_action('set_current_user', 'pmpro_set_current_user');
212
- add_action('init', 'pmpro_set_current_user');
213
-
214
- /*
215
- * Add Membership Level to Users page in WordPress dashboard.
216
- */
217
- function pmpro_manage_users_columns($columns) {
218
- $columns['pmpro_membership_level'] = __('Membership Level', 'pmpro');
219
- return $columns;
220
- }
221
-
222
- function pmpro_manage_users_custom_column($column_data, $column_name, $user_id) {
223
-
224
- if($column_name == 'pmpro_membership_level') {
225
- $levels = pmpro_getMembershipLevelsForUser($user_id);
226
- $level_names = array();
227
- if(!empty($levels)) {
228
- foreach($levels as $key => $level)
229
- $level_names[] = $level->name;
230
- $column_data = implode(',', $level_names);
231
- }
232
- else
233
- $column_data = __('None', 'pmpro');
234
- }
235
- return $column_data;
236
- }
237
-
238
- add_filter('manage_users_columns', 'pmpro_manage_users_columns');
239
- add_filter('manage_users_custom_column', 'pmpro_manage_users_custom_column', 10, 3);
240
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree.php DELETED
@@ -1,172 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree base class and initialization
4
- *
5
- * PHP version 5
6
- *
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
-
11
- set_include_path(get_include_path() . PATH_SEPARATOR . realpath(dirname(__FILE__)));
12
-
13
- /**
14
- * Braintree PHP Library
15
- *
16
- * Provides methods to child classes. This class cannot be instantiated.
17
- *
18
- * @copyright 2010 Braintree Payment Solutions
19
- */
20
- abstract class Braintree
21
- {
22
- /**
23
- * @ignore
24
- * don't permit an explicit call of the constructor!
25
- * (like $t = new Braintree_Transaction())
26
- */
27
- protected function __construct()
28
- {
29
- }
30
- /**
31
- * @ignore
32
- * don't permit cloning the instances (like $x = clone $v)
33
- */
34
- protected function __clone()
35
- {
36
- }
37
-
38
- /**
39
- * returns private/nonexistent instance properties
40
- * @ignore
41
- * @access public
42
- * @param string $name property name
43
- * @return mixed contents of instance properties
44
- */
45
- public function __get($name)
46
- {
47
- if (array_key_exists($name, $this->_attributes)) {
48
- return $this->_attributes[$name];
49
- }
50
- else {
51
- trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE);
52
- return null;
53
- }
54
- }
55
-
56
- /**
57
- * used by isset() and empty()
58
- * @access public
59
- * @param string $name property name
60
- * @return boolean
61
- */
62
- public function __isset($name)
63
- {
64
- return array_key_exists($name, $this->_attributes);
65
- }
66
-
67
- public function _set($key, $value)
68
- {
69
- $this->_attributes[$key] = $value;
70
- }
71
-
72
- /**
73
- *
74
- * @param string $className
75
- * @param object $resultObj
76
- * @return object returns the passed object if successful
77
- * @throws Braintree_Exception_ValidationsFailed
78
- */
79
- public static function returnObjectOrThrowException($className, $resultObj)
80
- {
81
- $resultObjName = Braintree_Util::cleanClassName($className);
82
- if ($resultObj->success) {
83
- return $resultObj->$resultObjName;
84
- } else {
85
- throw new Braintree_Exception_ValidationsFailed();
86
- }
87
- }
88
- }
89
- require_once('Braintree/Modification.php');
90
- require_once('Braintree/Instance.php');
91
-
92
- require_once('Braintree/Address.php');
93
- require_once('Braintree/AddOn.php');
94
- require_once('Braintree/Collection.php');
95
- require_once('Braintree/Configuration.php');
96
- require_once('Braintree/CreditCard.php');
97
- require_once('Braintree/Customer.php');
98
- require_once('Braintree/CustomerSearch.php');
99
- require_once('Braintree/Descriptor.php');
100
- require_once('Braintree/Digest.php');
101
- require_once('Braintree/Discount.php');
102
- require_once('Braintree/IsNode.php');
103
- require_once('Braintree/EqualityNode.php');
104
- require_once('Braintree/Exception.php');
105
- require_once('Braintree/Http.php');
106
- require_once('Braintree/KeyValueNode.php');
107
- require_once('Braintree/MultipleValueNode.php');
108
- require_once('Braintree/MultipleValueOrTextNode.php');
109
- require_once('Braintree/PartialMatchNode.php');
110
- require_once('Braintree/Plan.php');
111
- require_once('Braintree/RangeNode.php');
112
- require_once('Braintree/ResourceCollection.php');
113
- require_once('Braintree/SettlementBatchSummary.php');
114
- require_once('Braintree/Subscription.php');
115
- require_once('Braintree/SubscriptionSearch.php');
116
- require_once('Braintree/SubscriptionStatus.php');
117
- require_once('Braintree/TextNode.php');
118
- require_once('Braintree/Transaction.php');
119
- require_once('Braintree/TransactionSearch.php');
120
- require_once('Braintree/TransparentRedirect.php');
121
- require_once('Braintree/Util.php');
122
- require_once('Braintree/Version.php');
123
- require_once('Braintree/Xml.php');
124
- require_once('Braintree/Error/Codes.php');
125
- require_once('Braintree/Error/ErrorCollection.php');
126
- require_once('Braintree/Error/Validation.php');
127
- require_once('Braintree/Error/ValidationErrorCollection.php');
128
- require_once('Braintree/Exception/Authentication.php');
129
- require_once('Braintree/Exception/Authorization.php');
130
- require_once('Braintree/Exception/Configuration.php');
131
- require_once('Braintree/Exception/DownForMaintenance.php');
132
- require_once('Braintree/Exception/ForgedQueryString.php');
133
- require_once('Braintree/Exception/InvalidSignature.php');
134
- require_once('Braintree/Exception/NotFound.php');
135
- require_once('Braintree/Exception/ServerError.php');
136
- require_once('Braintree/Exception/SSLCertificate.php');
137
- require_once('Braintree/Exception/SSLCaFileNotFound.php');
138
- require_once('Braintree/Exception/Unexpected.php');
139
- require_once('Braintree/Exception/UpgradeRequired.php');
140
- require_once('Braintree/Exception/ValidationsFailed.php');
141
- require_once('Braintree/Result/CreditCardVerification.php');
142
- require_once('Braintree/Result/Error.php');
143
- require_once('Braintree/Result/Successful.php');
144
- require_once('Braintree/Test/CreditCardNumbers.php');
145
- require_once('Braintree/Test/TransactionAmounts.php');
146
- require_once('Braintree/Transaction/AddressDetails.php');
147
- require_once('Braintree/Transaction/CreditCardDetails.php');
148
- require_once('Braintree/Transaction/CustomerDetails.php');
149
- require_once('Braintree/Transaction/StatusDetails.php');
150
- require_once('Braintree/Transaction/SubscriptionDetails.php');
151
- require_once('Braintree/WebhookNotification.php');
152
- require_once('Braintree/WebhookTesting.php');
153
- require_once('Braintree/Xml/Generator.php');
154
- require_once('Braintree/Xml/Parser.php');
155
- require_once('Braintree/CreditCardVerification.php');
156
- require_once('Braintree/CreditCardVerificationSearch.php');
157
-
158
- if (version_compare(PHP_VERSION, '5.2.1', '<')) {
159
- throw new Braintree_Exception('PHP version >= 5.2.1 required');
160
- }
161
-
162
-
163
- function requireDependencies() {
164
- $requiredExtensions = array('xmlwriter', 'SimpleXML', 'openssl', 'dom', 'hash', 'curl');
165
- foreach ($requiredExtensions AS $ext) {
166
- if (!extension_loaded($ext)) {
167
- throw new Braintree_Exception('The Braintree library requires the ' . $ext . ' extension.');
168
- }
169
- }
170
- }
171
-
172
- requireDependencies();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/AddOn.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
- class Braintree_AddOn extends Braintree_Modification
3
- {
4
- public static function all()
5
- {
6
- $response = Braintree_Http::get('/add_ons');
7
-
8
- $addOns = array("addOn" => $response['addOns']);
9
-
10
- return Braintree_Util::extractAttributeAsArray(
11
- $addOns,
12
- 'addOn'
13
- );
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Address.php DELETED
@@ -1,352 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Address module
4
- *
5
- * PHP Version 5
6
- *
7
- * @package Braintree
8
- * @copyright 2010 Braintree Payment Solutions
9
- */
10
- /**
11
- * Creates and manages Braintree Addresses
12
- *
13
- * An Address belongs to a Customer. It can be associated to a
14
- * CreditCard as the billing address. It can also be used
15
- * as the shipping address when creating a Transaction.
16
- *
17
- * @package Braintree
18
- * @copyright 2010 Braintree Payment Solutions
19
- *
20
- * @property-read string $company
21
- * @property-read string $countryName
22
- * @property-read string $createdAt
23
- * @property-read string $customerId
24
- * @property-read string $extendedAddress
25
- * @property-read string $firstName
26
- * @property-read string $id
27
- * @property-read string $lastName
28
- * @property-read string $locality
29
- * @property-read string $postalCode
30
- * @property-read string $region
31
- * @property-read string $streetAddress
32
- * @property-read string $updatedAt
33
- */
34
- class Braintree_Address extends Braintree
35
- {
36
-
37
- /* public class methods */
38
- /**
39
- *
40
- * @access public
41
- * @param array $attribs
42
- * @return object Result, either Successful or Error
43
- */
44
- public static function create($attribs)
45
- {
46
- Braintree_Util::verifyKeys(self::createSignature(), $attribs);
47
- $customerId = isset($attribs['customerId']) ?
48
- $attribs['customerId'] :
49
- null;
50
-
51
- self::_validateCustomerId($customerId);
52
- unset($attribs['customerId']);
53
- return self::_doCreate(
54
- '/customers/' . $customerId . '/addresses',
55
- array('address' => $attribs)
56
- );
57
- }
58
-
59
- /**
60
- * attempts the create operation assuming all data will validate
61
- * returns a Braintree_Address object instead of a Result
62
- *
63
- * @access public
64
- * @param array $attribs
65
- * @return object
66
- * @throws Braintree_Exception_ValidationError
67
- */
68
- public static function createNoValidate($attribs)
69
- {
70
- $result = self::create($attribs);
71
- return self::returnObjectOrThrowException(__CLASS__, $result);
72
-
73
- }
74
-
75
- /**
76
- * delete an address by id
77
- *
78
- * @param mixed $customerOrId
79
- * @param string $addressId
80
- */
81
- public static function delete($customerOrId = null, $addressId = null)
82
- {
83
- self::_validateId($addressId);
84
- $customerId = self::_determineCustomerId($customerOrId);
85
- Braintree_Http::delete(
86
- '/customers/' . $customerId . '/addresses/' . $addressId
87
- );
88
- return new Braintree_Result_Successful();
89
- }
90
-
91
- /**
92
- * find an address by id
93
- *
94
- * Finds the address with the given <b>addressId</b> that is associated
95
- * to the given <b>customerOrId</b>.
96
- * If the address cannot be found, a NotFound exception will be thrown.
97
- *
98
- *
99
- * @access public
100
- * @param mixed $customerOrId
101
- * @param string $addressId
102
- * @return object Braintree_Address
103
- * @throws Braintree_Exception_NotFound
104
- */
105
- public static function find($customerOrId, $addressId)
106
- {
107
-
108
- $customerId = self::_determineCustomerId($customerOrId);
109
- self::_validateId($addressId);
110
-
111
- try {
112
- $response = Braintree_Http::get(
113
- '/customers/' . $customerId . '/addresses/' . $addressId
114
- );
115
- return self::factory($response['address']);
116
- } catch (Braintree_Exception_NotFound $e) {
117
- throw new Braintree_Exception_NotFound(
118
- 'address for customer ' . $customerId .
119
- ' with id ' . $addressId . ' not found.'
120
- );
121
- }
122
-
123
- }
124
-
125
- /**
126
- * returns false if comparing object is not a Braintree_Address,
127
- * or is a Braintree_Address with a different id
128
- *
129
- * @param object $other address to compare against
130
- * @return boolean
131
- */
132
- public function isEqual($other)
133
- {
134
- return !($other instanceof Braintree_Address) ?
135
- false :
136
- ($this->id === $other->id && $this->customerId === $other->customerId);
137
- }
138
-
139
- /**
140
- * updates the address record
141
- *
142
- * if calling this method in static context,
143
- * customerOrId is the 2nd attribute, addressId 3rd.
144
- * customerOrId & addressId are not sent in object context.
145
- *
146
- *
147
- * @access public
148
- * @param array $attributes
149
- * @param mixed $customerOrId (only used in static call)
150
- * @param string $addressId (only used in static call)
151
- * @return object Braintree_Result_Successful or Braintree_Result_Error
152
- */
153
- public static function update($customerOrId, $addressId, $attributes)
154
- {
155
- self::_validateId($addressId);
156
- $customerId = self::_determineCustomerId($customerOrId);
157
- Braintree_Util::verifyKeys(self::updateSignature(), $attributes);
158
-
159
- $response = Braintree_Http::put(
160
- '/customers/' . $customerId . '/addresses/' . $addressId,
161
- array('address' => $attributes)
162
- );
163
-
164
- return self::_verifyGatewayResponse($response);
165
-
166
- }
167
-
168
- /**
169
- * update an address record, assuming validations will pass
170
- *
171
- * if calling this method in static context,
172
- * customerOrId is the 2nd attribute, addressId 3rd.
173
- * customerOrId & addressId are not sent in object context.
174
- *
175
- * @access public
176
- * @param array $transactionAttribs
177
- * @param string $customerId
178
- * @return object Braintree_Transaction
179
- * @throws Braintree_Exception_ValidationsFailed
180
- * @see Braintree_Address::update()
181
- */
182
- public static function updateNoValidate($customerOrId, $addressId, $attributes)
183
- {
184
- $result = self::update($customerOrId, $addressId, $attributes);
185
- return self::returnObjectOrThrowException(__CLASS__, $result);
186
- }
187
-
188
- /**
189
- * creates a full array signature of a valid create request
190
- * @return array gateway create request format
191
- */
192
- public static function createSignature()
193
- {
194
- return array(
195
- 'company', 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric',
196
- 'countryName', 'customerId', 'extendedAddress', 'firstName',
197
- 'lastName', 'locality', 'postalCode', 'region', 'streetAddress'
198
- );
199
- }
200
-
201
- /**
202
- * creates a full array signature of a valid update request
203
- * @return array gateway update request format
204
- */
205
- public static function updateSignature()
206
- {
207
- // TODO: remove customerId from update signature
208
- return self::createSignature();
209
-
210
- }
211
-
212
- /**
213
- * create a printable representation of the object as:
214
- * ClassName[property=value, property=value]
215
- * @ignore
216
- * @return var
217
- */
218
- public function __toString()
219
- {
220
- return __CLASS__ . '[' .
221
- Braintree_Util::attributesToString($this->_attributes) .']';
222
- }
223
-
224
- /**
225
- * sets instance properties from an array of values
226
- *
227
- * @ignore
228
- * @access protected
229
- * @param array $addressAttribs array of address data
230
- * @return none
231
- */
232
- protected function _initialize($addressAttribs)
233
- {
234
- // set the attributes
235
- $this->_attributes = $addressAttribs;
236
- }
237
-
238
- /**
239
- * verifies that a valid address id is being used
240
- * @ignore
241
- * @param string $id address id
242
- * @throws InvalidArgumentException
243
- */
244
- private static function _validateId($id = null)
245
- {
246
- if (empty($id) || trim($id) == "") {
247
- throw new InvalidArgumentException(
248
- 'expected address id to be set'
249
- );
250
- }
251
- if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) {
252
- throw new InvalidArgumentException(
253
- $id . ' is an invalid address id.'
254
- );
255
- }
256
- }
257
-
258
- /**
259
- * verifies that a valid customer id is being used
260
- * @ignore
261
- * @param string $id customer id
262
- * @throws InvalidArgumentException
263
- */
264
- private static function _validateCustomerId($id = null)
265
- {
266
- if (empty($id) || trim($id) == "") {
267
- throw new InvalidArgumentException(
268
- 'expected customer id to be set'
269
- );
270
- }
271
- if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) {
272
- throw new InvalidArgumentException(
273
- $id . ' is an invalid customer id.'
274
- );
275
- }
276
-
277
- }
278
-
279
- /**
280
- * determines if a string id or Customer object was passed
281
- * @ignore
282
- * @param mixed $customerOrId
283
- * @return string customerId
284
- */
285
- private static function _determineCustomerId($customerOrId)
286
- {
287
- $customerId = ($customerOrId instanceof Braintree_Customer) ? $customerOrId->id : $customerOrId;
288
- self::_validateCustomerId($customerId);
289
- return $customerId;
290
-
291
- }
292
-
293
- /* private class methods */
294
- /**
295
- * sends the create request to the gateway
296
- * @ignore
297
- * @param string $url
298
- * @param array $params
299
- * @return mixed
300
- */
301
- private static function _doCreate($url, $params)
302
- {
303
- $response = Braintree_Http::post($url, $params);
304
-
305
- return self::_verifyGatewayResponse($response);
306
-
307
- }
308
-
309
- /**
310
- * generic method for validating incoming gateway responses
311
- *
312
- * creates a new Braintree_Address object and encapsulates
313
- * it inside a Braintree_Result_Successful object, or
314
- * encapsulates a Braintree_Errors object inside a Result_Error
315
- * alternatively, throws an Unexpected exception if the response is invalid.
316
- *
317
- * @ignore
318
- * @param array $response gateway response values
319
- * @return object Result_Successful or Result_Error
320
- * @throws Braintree_Exception_Unexpected
321
- */
322
- private static function _verifyGatewayResponse($response)
323
- {
324
- if (isset($response['address'])) {
325
- // return a populated instance of Braintree_Address
326
- return new Braintree_Result_Successful(
327
- self::factory($response['address'])
328
- );
329
- } else if (isset($response['apiErrorResponse'])) {
330
- return new Braintree_Result_Error($response['apiErrorResponse']);
331
- } else {
332
- throw new Braintree_Exception_Unexpected(
333
- "Expected address or apiErrorResponse"
334
- );
335
- }
336
-
337
- }
338
-
339
- /**
340
- * factory method: returns an instance of Braintree_Address
341
- * to the requesting method, with populated properties
342
- * @ignore
343
- * @return object instance of Braintree_Address
344
- */
345
- public static function factory($attributes)
346
- {
347
- $instance = new self();
348
- $instance->_initialize($attributes);
349
- return $instance;
350
-
351
- }
352
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Collection.php DELETED
@@ -1,159 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Generic collection
4
- *
5
- * PHP Version 5
6
- *
7
- * @package Braintree
8
- * @subpackage Utility
9
- * @copyright 2010 Braintree Payment Solutions
10
- */
11
-
12
- /**
13
- * Generic Collection class
14
- *
15
- * Based on Generic Collection class from:
16
- * {@link http://codeutopia.net/code/library/CU/Collection.php}
17
- *
18
- * @package Braintree
19
- * @subpackage Utility
20
- */
21
- class Braintree_Collection implements Countable, IteratorAggregate, ArrayAccess
22
- {
23
- /**
24
- *
25
- * @var array $_collection collection storage
26
- */
27
- protected $_collection = array();
28
-
29
- /**
30
- * Add a value into the collection
31
- * @param string $value
32
- */
33
- public function add($value)
34
- {
35
- $this->_collection[] = $value;
36
- }
37
-
38
- /**
39
- * Set index's value
40
- * @param integer $index
41
- * @param mixed $value
42
- * @throws OutOfRangeException
43
- */
44
- public function set($index, $value)
45
- {
46
- if($index >= $this->count())
47
- throw new OutOfRangeException('Index out of range');
48
-
49
- $this->_collection[$index] = $value;
50
- }
51
-
52
- /**
53
- * Remove a value from the collection
54
- * @param integer $index index to remove
55
- * @throws OutOfRangeException if index is out of range
56
- */
57
- public function remove($index)
58
- {
59
- if($index >= $this->count())
60
- throw new OutOfRangeException('Index out of range');
61
-
62
- array_splice($this->_collection, $index, 1);
63
- }
64
-
65
- /**
66
- * Return value at index
67
- * @param integer $index
68
- * @return mixed
69
- * @throws OutOfRangeException
70
- */
71
- public function get($index)
72
- {
73
- if($index >= $this->count())
74
- throw new OutOfRangeException('Index out of range');
75
-
76
- return $this->_collection[$index];
77
- }
78
-
79
- /**
80
- * Determine if index exists
81
- * @param integer $index
82
- * @return boolean
83
- */
84
- public function exists($index)
85
- {
86
- if($index >= $this->count())
87
- return false;
88
-
89
- return true;
90
- }
91
- /**
92
- * Return count of items in collection
93
- * Implements countable
94
- * @return integer
95
- */
96
- public function count()
97
- {
98
- return count($this->_collection);
99
- }
100
-
101
-
102
- /**
103
- * Return an iterator
104
- * Implements IteratorAggregate
105
- * @return ArrayIterator
106
- */
107
- public function getIterator()
108
- {
109
- return new ArrayIterator($this->_collection);
110
- }
111
-
112
- /**
113
- * Set offset to value
114
- * Implements ArrayAccess
115
- * @see set
116
- * @param integer $offset
117
- * @param mixed $value
118
- */
119
- public function offsetSet($offset, $value)
120
- {
121
- $this->set($offset, $value);
122
- }
123
-
124
- /**
125
- * Unset offset
126
- * Implements ArrayAccess
127
- * @see remove
128
- * @param integer $offset
129
- */
130
- public function offsetUnset($offset)
131
- {
132
- $this->remove($offset);
133
- }
134
-
135
- /**
136
- * get an offset's value
137
- * Implements ArrayAccess
138
- * @see get
139
- * @param integer $offset
140
- * @return mixed
141
- */
142
- public function offsetGet($offset)
143
- {
144
- return $this->get($offset);
145
- }
146
-
147
- /**
148
- * Determine if offset exists
149
- * Implements ArrayAccess
150
- * @see exists
151
- * @param integer $offset
152
- * @return boolean
153
- */
154
- public function offsetExists($offset)
155
- {
156
- return $this->exists($offset);
157
- }
158
-
159
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Configuration.php DELETED
@@ -1,346 +0,0 @@
1
- <?php
2
- /**
3
- *
4
- * Configuration registry
5
- *
6
- * @package Braintree
7
- * @subpackage Utility
8
- * @copyright 2010 Braintree Payment Solutions
9
- */
10
-
11
- /**
12
- * acts as a registry for config data.
13
- *
14
- *
15
- * @package Braintree
16
- * @subpackage Utility
17
- *
18
- * */
19
-
20
- class Braintree_Configuration extends Braintree
21
- {
22
- /**
23
- * Braintree API version to use
24
- * @access public
25
- */
26
- const API_VERSION = 3;
27
-
28
- /**
29
- * @var array array of config properties
30
- * @access protected
31
- * @static
32
- */
33
- private static $_cache = array(
34
- 'environment' => '',
35
- 'merchantId' => '',
36
- 'publicKey' => '',
37
- 'privateKey' => '',
38
- );
39
- /**
40
- *
41
- * @access protected
42
- * @static
43
- * @var array valid environments, used for validation
44
- */
45
- private static $_validEnvironments = array(
46
- 'development',
47
- 'sandbox',
48
- 'production',
49
- 'qa',
50
- );
51
-
52
- /**
53
- * resets configuration to default
54
- * @access public
55
- * @static
56
- */
57
- public static function reset()
58
- {
59
- self::$_cache = array (
60
- 'environment' => '',
61
- 'merchantId' => '',
62
- 'publicKey' => '',
63
- 'privateKey' => '',
64
- );
65
- }
66
-
67
- /**
68
- * performs sanity checks when config settings are being set
69
- *
70
- * @ignore
71
- * @access protected
72
- * @param string $key name of config setting
73
- * @param string $value value to set
74
- * @throws InvalidArgumentException
75
- * @throws Braintree_Exception_Configuration
76
- * @static
77
- * @return boolean
78
- */
79
- private static function validate($key=null, $value=null)
80
- {
81
- if (empty($key) && empty($value)) {
82
- throw new InvalidArgumentException('nothing to validate');
83
- }
84
-
85
- if ($key === 'environment' &&
86
- !in_array($value, self::$_validEnvironments) ) {
87
- throw new Braintree_Exception_Configuration('"' .
88
- $value . '" is not a valid environment.');
89
- }
90
-
91
- if (!isset(self::$_cache[$key])) {
92
- throw new Braintree_Exception_Configuration($key .
93
- ' is not a valid configuration setting.');
94
- }
95
-
96
- if (empty($value)) {
97
- throw new InvalidArgumentException($key . ' cannot be empty.');
98
- }
99
-
100
- return true;
101
- }
102
-
103
- private static function set($key, $value)
104
- {
105
- // this method will raise an exception on invalid data
106
- self::validate($key, $value);
107
- // set the value in the cache
108
- self::$_cache[$key] = $value;
109
-
110
- }
111
-
112
- private static function get($key)
113
- {
114
- // throw an exception if the value hasn't been set
115
- if (isset(self::$_cache[$key]) &&
116
- (empty(self::$_cache[$key]))) {
117
- throw new Braintree_Exception_Configuration(
118
- $key.' needs to be set'
119
- );
120
- }
121
-
122
- if (array_key_exists($key, self::$_cache)) {
123
- return self::$_cache[$key];
124
- }
125
-
126
- // return null by default to prevent __set from overloading
127
- return null;
128
- }
129
-
130
-
131
- private static function setOrGet($name, $value = null)
132
- {
133
- if (!empty($value) && is_array($value)) {
134
- $value = $value[0];
135
- }
136
- if (!empty($value)) {
137
- self::set($name, $value);
138
- } else {
139
- return self::get($name);
140
- }
141
- return true;
142
- }
143
- /**#@+
144
- * sets or returns the property after validation
145
- * @access public
146
- * @static
147
- * @param string $value pass a string to set, empty to get
148
- * @return mixed returns true on set
149
- */
150
- public static function environment($value = null)
151
- {
152
- return self::setOrGet(__FUNCTION__, $value);
153
- }
154
-
155
- public static function merchantId($value = null)
156
- {
157
- return self::setOrGet(__FUNCTION__, $value);
158
- }
159
-
160
- public static function publicKey($value = null)
161
- {
162
- return self::setOrGet(__FUNCTION__, $value);
163
- }
164
-
165
- public static function privateKey($value = null)
166
- {
167
- return self::setOrGet(__FUNCTION__, $value);
168
- }
169
- /**#@-*/
170
-
171
- /**
172
- * returns the full merchant URL based on config values
173
- *
174
- * @access public
175
- * @static
176
- * @param none
177
- * @return string merchant URL
178
- */
179
- public static function merchantUrl()
180
- {
181
- return self::baseUrl() .
182
- self::merchantPath();
183
- }
184
-
185
- /**
186
- * returns the base braintree gateway URL based on config values
187
- *
188
- * @access public
189
- * @static
190
- * @param none
191
- * @return string braintree gateway URL
192
- */
193
- public static function baseUrl()
194
- {
195
- return self::protocol() . '://' .
196
- self::serverName() . ':' .
197
- self::portNumber();
198
- }
199
-
200
- /**
201
- * sets the merchant path based on merchant ID
202
- *
203
- * @access protected
204
- * @static
205
- * @param none
206
- * @return string merchant path uri
207
- */
208
- public static function merchantPath()
209
- {
210
- return '/merchants/'.self::merchantId();
211
- }
212
-
213
- /**
214
- * sets the physical path for the location of the CA certs
215
- *
216
- * @access public
217
- * @static
218
- * @param none
219
- * @return string filepath
220
- */
221
- public static function caFile($sslPath = NULL)
222
- {
223
- $sslPath = $sslPath ? $sslPath : DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
224
- 'ssl' . DIRECTORY_SEPARATOR;
225
-
226
- switch(self::environment()) {
227
- case 'production':
228
- $caPath = realpath(
229
- dirname(__FILE__) .
230
- $sslPath . 'www_braintreegateway_com.ca.crt'
231
- );
232
- break;
233
- case 'qa':
234
- case 'sandbox':
235
- default:
236
- $caPath = realpath(
237
- dirname(__FILE__) .
238
- $sslPath . 'sandbox_braintreegateway_com.ca.crt'
239
- );
240
- break;
241
- }
242
-
243
- if (!file_exists($caPath))
244
- {
245
- throw new Braintree_Exception_SSLCaFileNotFound();
246
- }
247
-
248
- return $caPath;
249
- }
250
-
251
- /**
252
- * returns the port number depending on environment
253
- *
254
- * @access public
255
- * @static
256
- * @param none
257
- * @return int portnumber
258
- */
259
- public static function portNumber()
260
- {
261
- if (self::sslOn()) {
262
- return 443;
263
- }
264
- return getenv("GATEWAY_PORT") ? getenv("GATEWAY_PORT") : 3000;
265
- }
266
-
267
- /**
268
- * returns http protocol depending on environment
269
- *
270
- * @access public
271
- * @static
272
- * @param none
273
- * @return string http || https
274
- */
275
- public static function protocol()
276
- {
277
- return self::sslOn() ? 'https' : 'http';
278
- }
279
-
280
- /**
281
- * returns gateway server name depending on environment
282
- *
283
- * @access public
284
- * @static
285
- * @param none
286
- * @return string server domain name
287
- */
288
- public static function serverName()
289
- {
290
- switch(self::environment()) {
291
- case 'production':
292
- $serverName = 'www.braintreegateway.com';
293
- break;
294
- case 'qa':
295
- $serverName = 'qa.braintreegateway.com';
296
- break;
297
- case 'sandbox':
298
- $serverName = 'sandbox.braintreegateway.com';
299
- break;
300
- case 'development':
301
- default:
302
- $serverName = 'localhost';
303
- break;
304
- }
305
-
306
- return $serverName;
307
- }
308
-
309
- /**
310
- * returns boolean indicating SSL is on or off for this session,
311
- * depending on environment
312
- *
313
- * @access public
314
- * @static
315
- * @param none
316
- * @return boolean
317
- */
318
- public static function sslOn()
319
- {
320
- switch(self::environment()) {
321
- case 'development':
322
- $ssl = false;
323
- break;
324
- case 'production':
325
- case 'qa':
326
- case 'sandbox':
327
- default:
328
- $ssl = true;
329
- break;
330
- }
331
-
332
- return $ssl;
333
- }
334
-
335
- /**
336
- * log message to default logger
337
- *
338
- * @param string $message
339
- *
340
- */
341
- public static function logMessage($message)
342
- {
343
- error_log('[Braintree] ' . $message);
344
- }
345
-
346
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/CreditCard.php DELETED
@@ -1,591 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree CreditCard module
4
- *
5
- * @package Braintree
6
- * @category Resources
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates and manages Braintree CreditCards
12
- *
13
- * <b>== More information ==</b>
14
- *
15
- * For more detailed information on CreditCards, see {@link http://www.braintreepayments.com/gateway/credit-card-api http://www.braintreepaymentsolutions.com/gateway/credit-card-api}<br />
16
- * For more detailed information on CreditCard verifications, see {@link http://www.braintreepayments.com/gateway/credit-card-verification-api http://www.braintreepaymentsolutions.com/gateway/credit-card-verification-api}
17
- *
18
- * @package Braintree
19
- * @category Resources
20
- * @copyright 2010 Braintree Payment Solutions
21
- *
22
- * @property-read string $billingAddress
23
- * @property-read string $bin
24
- * @property-read string $cardType
25
- * @property-read string $cardholderName
26
- * @property-read string $createdAt
27
- * @property-read string $customerId
28
- * @property-read string $expirationDate
29
- * @property-read string $expirationMonth
30
- * @property-read string $expirationYear
31
- * @property-read string $last4
32
- * @property-read string $maskedNumber
33
- * @property-read string $token
34
- * @property-read string $updatedAt
35
- */
36
- class Braintree_CreditCard extends Braintree
37
- {
38
- // Card Type
39
- const AMEX = 'American Express';
40
- const CARTE_BLANCHE = 'Carte Blanche';
41
- const CHINA_UNION_PAY = 'China UnionPay';
42
- const DINERS_CLUB_INTERNATIONAL = 'Diners Club';
43
- const DISCOVER = 'Discover';
44
- const JCB = 'JCB';
45
- const LASER = 'Laser';
46
- const MAESTRO = 'Maestro';
47
- const MASTER_CARD = 'MasterCard';
48
- const SOLO = 'Solo';
49
- const SWITCH_TYPE = 'Switch';
50
- const VISA = 'Visa';
51
- const UNKNOWN = 'Unknown';
52
-
53
- // Credit card origination location
54
- const INTERNATIONAL = "international";
55
- const US = "us";
56
-
57
- const PREPAID_YES = 'Yes';
58
- const PREPAID_NO = 'No';
59
- const PREPAID_UNKNOWN = 'Unknown';
60
-
61
- const PAYROLL_YES = 'Yes';
62
- const PAYROLL_NO = 'No';
63
- const PAYROLL_UNKNOWN = 'Unknown';
64
-
65
- const HEALTHCARE_YES = 'Yes';
66
- const HEALTHCARE_NO = 'No';
67
- const HEALTHCARE_UNKNOWN = 'Unknown';
68
-
69
- const DURBIN_REGULATED_YES = 'Yes';
70
- const DURBIN_REGULATED_NO = 'No';
71
- const DURBIN_REGULATED_UNKNOWN = 'Unknown';
72
-
73
- const DEBIT_YES = 'Yes';
74
- const DEBIT_NO = 'No';
75
- const DEBIT_UNKNOWN = 'Unknown';
76
-
77
- const COMMERCIAL_YES = 'Yes';
78
- const COMMERCIAL_NO = 'No';
79
- const COMMERCIAL_UNKNOWN = 'Unknown';
80
-
81
- const COUNTRY_OF_ISSUANCE_UNKNOWN = "Unknown";
82
- const ISSUING_BANK_UNKNOWN = "Unknown";
83
-
84
- public static function create($attribs)
85
- {
86
- Braintree_Util::verifyKeys(self::createSignature(), $attribs);
87
- return self::_doCreate('/payment_methods', array('credit_card' => $attribs));
88
- }
89
-
90
- /**
91
- * attempts the create operation assuming all data will validate
92
- * returns a Braintree_CreditCard object instead of a Result
93
- *
94
- * @access public
95
- * @param array $attribs
96
- * @return object
97
- * @throws Braintree_Exception_ValidationError
98
- */
99
- public static function createNoValidate($attribs)
100
- {
101
- $result = self::create($attribs);
102
- return self::returnObjectOrThrowException(__CLASS__, $result);
103
- }
104
- /**
105
- * create a customer from a TransparentRedirect operation
106
- *
107
- * @access public
108
- * @param array $attribs
109
- * @return object
110
- */
111
- public static function createFromTransparentRedirect($queryString)
112
- {
113
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
114
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
115
- $queryString
116
- );
117
- return self::_doCreate(
118
- '/payment_methods/all/confirm_transparent_redirect_request',
119
- array('id' => $params['id'])
120
- );
121
- }
122
-
123
- /**
124
- *
125
- * @access public
126
- * @param none
127
- * @return string
128
- */
129
- public static function createCreditCardUrl()
130
- {
131
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
132
- return Braintree_Configuration::merchantUrl() .
133
- '/payment_methods/all/create_via_transparent_redirect_request';
134
- }
135
-
136
- /**
137
- * returns a ResourceCollection of expired credit cards
138
- * @return object ResourceCollection
139
- */
140
- public static function expired()
141
- {
142
- $response = Braintree_Http::post("/payment_methods/all/expired_ids");
143
- $pager = array(
144
- 'className' => __CLASS__,
145
- 'classMethod' => 'fetchExpired',
146
- 'methodArgs' => array()
147
- );
148
-
149
- return new Braintree_ResourceCollection($response, $pager);
150
- }
151
-
152
- public static function fetchExpired($ids)
153
- {
154
- $response = Braintree_Http::post("/payment_methods/all/expired", array('search' => array('ids' => $ids)));
155
-
156
- return braintree_util::extractattributeasarray(
157
- $response['paymentMethods'],
158
- 'creditCard'
159
- );
160
- }
161
- /**
162
- * returns a ResourceCollection of credit cards expiring between start/end
163
- *
164
- * @return object ResourceCollection
165
- */
166
- public static function expiringBetween($startDate, $endDate)
167
- {
168
- $queryPath = '/payment_methods/all/expiring_ids?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate);
169
- $response = Braintree_Http::post($queryPath);
170
- $pager = array(
171
- 'className' => __CLASS__,
172
- 'classMethod' => 'fetchExpiring',
173
- 'methodArgs' => array($startDate, $endDate)
174
- );
175
-
176
- return new Braintree_ResourceCollection($response, $pager);
177
- }
178
-
179
- public static function fetchExpiring($startDate, $endDate, $ids)
180
- {
181
- $queryPath = '/payment_methods/all/expiring?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate);
182
- $response = Braintree_Http::post($queryPath, array('search' => array('ids' => $ids)));
183
-
184
- return Braintree_Util::extractAttributeAsArray(
185
- $response['paymentMethods'],
186
- 'creditCard'
187
- );
188
- }
189
-
190
- /**
191
- * find a creditcard by token
192
- *
193
- * @access public
194
- * @param string $token credit card unique id
195
- * @return object Braintree_CreditCard
196
- * @throws Braintree_Exception_NotFound
197
- */
198
- public static function find($token)
199
- {
200
- self::_validateId($token);
201
- try {
202
- $response = Braintree_Http::get('/payment_methods/'.$token);
203
- return self::factory($response['creditCard']);
204
- } catch (Braintree_Exception_NotFound $e) {
205
- throw new Braintree_Exception_NotFound(
206
- 'credit card with token ' . $token . ' not found'
207
- );
208
- }
209
-
210
- }
211
-
212
- /**
213
- * create a credit on the card for the passed transaction
214
- *
215
- * @access public
216
- * @param array $attribs
217
- * @return object Braintree_Result_Successful or Braintree_Result_Error
218
- */
219
- public static function credit($token, $transactionAttribs)
220
- {
221
- self::_validateId($token);
222
- return Braintree_Transaction::credit(
223
- array_merge(
224
- $transactionAttribs,
225
- array('paymentMethodToken' => $token)
226
- )
227
- );
228
- }
229
-
230
- /**
231
- * create a credit on this card, assuming validations will pass
232
- *
233
- * returns a Braintree_Transaction object on success
234
- *
235
- * @access public
236
- * @param array $attribs
237
- * @return object Braintree_Transaction
238
- * @throws Braintree_Exception_ValidationError
239
- */
240
- public static function creditNoValidate($token, $transactionAttribs)
241
- {
242
- $result = self::credit($token, $transactionAttribs);
243
- return self::returnObjectOrThrowException('Transaction', $result);
244
- }
245
-
246
- /**
247
- * create a new sale for the current card
248
- *
249
- * @param string $token
250
- * @param array $transactionAttribs
251
- * @return object Braintree_Result_Successful or Braintree_Result_Error
252
- * @see Braintree_Transaction::sale()
253
- */
254
- public static function sale($token, $transactionAttribs)
255
- {
256
- self::_validateId($token);
257
- return Braintree_Transaction::sale(
258
- array_merge(
259
- $transactionAttribs,
260
- array('paymentMethodToken' => $token)
261
- )
262
- );
263
- }
264
-
265
- /**
266
- * create a new sale using this card, assuming validations will pass
267
- *
268
- * returns a Braintree_Transaction object on success
269
- *
270
- * @access public
271
- * @param array $transactionAttribs
272
- * @param string $token
273
- * @return object Braintree_Transaction
274
- * @throws Braintree_Exception_ValidationsFailed
275
- * @see Braintree_Transaction::sale()
276
- */
277
- public static function saleNoValidate($token, $transactionAttribs)
278
- {
279
- $result = self::sale($token, $transactionAttribs);
280
- return self::returnObjectOrThrowException('Transaction', $result);
281
- }
282
-
283
- /**
284
- * updates the creditcard record
285
- *
286
- * if calling this method in static context, $token
287
- * is the 2nd attribute. $token is not sent in object context.
288
- *
289
- * @access public
290
- * @param array $attributes
291
- * @param string $token (optional)
292
- * @return object Braintree_Result_Successful or Braintree_Result_Error
293
- */
294
- public static function update($token, $attributes)
295
- {
296
- Braintree_Util::verifyKeys(self::updateSignature(), $attributes);
297
- self::_validateId($token);
298
- return self::_doUpdate('put', '/payment_methods/' . $token, array('creditCard' => $attributes));
299
- }
300
-
301
- /**
302
- * update a creditcard record, assuming validations will pass
303
- *
304
- * if calling this method in static context, $token
305
- * is the 2nd attribute. $token is not sent in object context.
306
- * returns a Braintree_CreditCard object on success
307
- *
308
- * @access public
309
- * @param array $attributes
310
- * @param string $token
311
- * @return object Braintree_CreditCard
312
- * @throws Braintree_Exception_ValidationsFailed
313
- */
314
- public static function updateNoValidate($token, $attributes)
315
- {
316
- $result = self::update($token, $attributes);
317
- return self::returnObjectOrThrowException(__CLASS__, $result);
318
- }
319
- /**
320
- *
321
- * @access public
322
- * @param none
323
- * @return string
324
- */
325
- public static function updateCreditCardUrl()
326
- {
327
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
328
- return Braintree_Configuration::merchantUrl() .
329
- '/payment_methods/all/update_via_transparent_redirect_request';
330
- }
331
-
332
- /**
333
- * update a customer from a TransparentRedirect operation
334
- *
335
- * @access public
336
- * @param array $attribs
337
- * @return object
338
- */
339
- public static function updateFromTransparentRedirect($queryString)
340
- {
341
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
342
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
343
- $queryString
344
- );
345
- return self::_doUpdate(
346
- 'post',
347
- '/payment_methods/all/confirm_transparent_redirect_request',
348
- array('id' => $params['id'])
349
- );
350
- }
351
-
352
- /* instance methods */
353
- /**
354
- * returns false if default is null or false
355
- *
356
- * @return boolean
357
- */
358
- public function isDefault()
359
- {
360
- return $this->default;
361
- }
362
-
363
- /**
364
- * checks whether the card is expired based on the current date
365
- *
366
- * @return boolean
367
- */
368
- public function isExpired()
369
- {
370
- return $this->expired;
371
- }
372
-
373
- public static function delete($token)
374
- {
375
- self::_validateId($token);
376
- Braintree_Http::delete('/payment_methods/' . $token);
377
- return new Braintree_Result_Successful();
378
- }
379
-
380
- /**
381
- * sets instance properties from an array of values
382
- *
383
- * @access protected
384
- * @param array $creditCardAttribs array of creditcard data
385
- * @return none
386
- */
387
- protected function _initialize($creditCardAttribs)
388
- {
389
- // set the attributes
390
- $this->_attributes = $creditCardAttribs;
391
-
392
- // map each address into its own object
393
- $billingAddress = isset($creditCardAttribs['billingAddress']) ?
394
- Braintree_Address::factory($creditCardAttribs['billingAddress']) :
395
- null;
396
-
397
- $subscriptionArray = array();
398
- if (isset($creditCardAttribs['subscriptions'])) {
399
- foreach ($creditCardAttribs['subscriptions'] AS $subscription) {
400
- $subscriptionArray[] = Braintree_Subscription::factory($subscription);
401
- }
402
- }
403
-
404
- $this->_set('subscriptions', $subscriptionArray);
405
- $this->_set('billingAddress', $billingAddress);
406
- $this->_set('expirationDate', $this->expirationMonth . '/' . $this->expirationYear);
407
- $this->_set('maskedNumber', $this->bin . '******' . $this->last4);
408
- }
409
-
410
- /**
411
- * returns false if comparing object is not a Braintree_CreditCard,
412
- * or is a Braintree_CreditCard with a different id
413
- *
414
- * @param object $otherCreditCard customer to compare against
415
- * @return boolean
416
- */
417
- public function isEqual($otherCreditCard)
418
- {
419
- return !($otherCreditCard instanceof Braintree_CreditCard) ? false : $this->token === $otherCreditCard->token;
420
- }
421
-
422
- private static function baseOptions()
423
- {
424
- return array('makeDefault', 'verificationMerchantAccountId', 'verifyCard', 'venmoSdkSession');
425
- }
426
-
427
- private static function baseSignature($options)
428
- {
429
- return array(
430
- 'billingAddressId', 'cardholderName', 'cvv', 'number',
431
- 'expirationDate', 'expirationMonth', 'expirationYear', 'token', 'venmoSdkPaymentMethodCode',
432
- array('options' => $options),
433
- array(
434
- 'billingAddress' => array(
435
- 'firstName',
436
- 'lastName',
437
- 'company',
438
- 'countryCodeAlpha2',
439
- 'countryCodeAlpha3',
440
- 'countryCodeNumeric',
441
- 'countryName',
442
- 'extendedAddress',
443
- 'locality',
444
- 'region',
445
- 'postalCode',
446
- 'streetAddress'
447
- ),
448
- ),
449
- );
450
- }
451
-
452
- public static function createSignature()
453
- {
454
- $options = self::baseOptions();
455
- $options[] = "failOnDuplicatePaymentMethod";
456
- $signature = self::baseSignature($options);
457
- $signature[] = 'customerId';
458
- return $signature;
459
- }
460
-
461
- public static function updateSignature()
462
- {
463
- $signature = self::baseSignature(self::baseOptions());
464
-
465
- $updateExistingBillingSignature = array(
466
- array(
467
- 'options' => array(
468
- 'updateExisting'
469
- )
470
- )
471
- );
472
-
473
- foreach($signature AS $key => $value) {
474
- if(is_array($value) and array_key_exists('billingAddress', $value)) {
475
- $signature[$key]['billingAddress'] = array_merge_recursive($value['billingAddress'], $updateExistingBillingSignature);
476
- }
477
- }
478
-
479
- return $signature;
480
- }
481
-
482
- /**
483
- * sends the create request to the gateway
484
- *
485
- * @ignore
486
- * @param string $url
487
- * @param array $params
488
- * @return mixed
489
- */
490
- public static function _doCreate($url, $params)
491
- {
492
- $response = Braintree_Http::post($url, $params);
493
-
494
- return self::_verifyGatewayResponse($response);
495
- }
496
-
497
- /**
498
- * create a printable representation of the object as:
499
- * ClassName[property=value, property=value]
500
- * @return string
501
- */
502
- public function __toString()
503
- {
504
- return __CLASS__ . '[' .
505
- Braintree_Util::attributesToString($this->_attributes) .']';
506
- }
507
-
508
- /**
509
- * verifies that a valid credit card token is being used
510
- * @ignore
511
- * @param string $token
512
- * @throws InvalidArgumentException
513
- */
514
- private static function _validateId($token = null)
515
- {
516
- if (empty($token)) {
517
- throw new InvalidArgumentException(
518
- 'expected credit card id to be set'
519
- );
520
- }
521
- if (!preg_match('/^[0-9A-Za-z_-]+$/', $token)) {
522
- throw new InvalidArgumentException(
523
- $token . ' is an invalid credit card id.'
524
- );
525
- }
526
- }
527
-
528
- /**
529
- * sends the update request to the gateway
530
- *
531
- * @ignore
532
- * @param string $url
533
- * @param array $params
534
- * @return mixed
535
- */
536
- private static function _doUpdate($httpVerb, $url, $params)
537
- {
538
- $response = Braintree_Http::$httpVerb($url, $params);
539
- return self::_verifyGatewayResponse($response);
540
- }
541
-
542
- /**
543
- * generic method for validating incoming gateway responses
544
- *
545
- * creates a new Braintree_CreditCard object and encapsulates
546
- * it inside a Braintree_Result_Successful object, or
547
- * encapsulates a Braintree_Errors object inside a Result_Error
548
- * alternatively, throws an Unexpected exception if the response is invalid.
549
- *
550
- * @ignore
551
- * @param array $response gateway response values
552
- * @return object Result_Successful or Result_Error
553
- * @throws Braintree_Exception_Unexpected
554
- */
555
- private static function _verifyGatewayResponse($response)
556
- {
557
- if (isset($response['creditCard'])) {
558
- // return a populated instance of Braintree_Address
559
- return new Braintree_Result_Successful(
560
- self::factory($response['creditCard'])
561
- );
562
- } else if (isset($response['apiErrorResponse'])) {
563
- return new Braintree_Result_Error($response['apiErrorResponse']);
564
- } else {
565
- throw new Braintree_Exception_Unexpected(
566
- "Expected address or apiErrorResponse"
567
- );
568
- }
569
- }
570
-
571
- /**
572
- * factory method: returns an instance of Braintree_CreditCard
573
- * to the requesting method, with populated properties
574
- *
575
- * @ignore
576
- * @return object instance of Braintree_CreditCard
577
- */
578
- public static function factory($attributes)
579
- {
580
- $defaultAttributes = array(
581
- 'bin' => '',
582
- 'expirationMonth' => '',
583
- 'expirationYear' => '',
584
- 'last4' => '',
585
- );
586
-
587
- $instance = new self();
588
- $instance->_initialize(array_merge($defaultAttributes, $attributes));
589
- return $instance;
590
- }
591
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/CreditCardVerification.php DELETED
@@ -1,41 +0,0 @@
1
- <?php
2
- class Braintree_CreditCardVerification extends Braintree_Result_CreditCardVerification
3
- {
4
- public static function factory($attributes)
5
- {
6
- $instance = new self($attributes);
7
- return $instance;
8
- }
9
-
10
- public static function fetch($query, $ids)
11
- {
12
- $criteria = array();
13
- foreach ($query as $term) {
14
- $criteria[$term->name] = $term->toparam();
15
- }
16
- $criteria["ids"] = Braintree_CreditCardVerificationSearch::ids()->in($ids)->toparam();
17
- $response = braintree_http::post('/verifications/advanced_search', array('search' => $criteria));
18
-
19
- return braintree_util::extractattributeasarray(
20
- $response['creditCardVerifications'],
21
- 'verification'
22
- );
23
- }
24
-
25
- public static function search($query)
26
- {
27
- $criteria = array();
28
- foreach ($query as $term) {
29
- $criteria[$term->name] = $term->toparam();
30
- }
31
-
32
- $response = braintree_http::post('/verifications/advanced_search_ids', array('search' => $criteria));
33
- $pager = array(
34
- 'className' => __CLASS__,
35
- 'classMethod' => 'fetch',
36
- 'methodArgs' => array($query)
37
- );
38
-
39
- return new Braintree_ResourceCollection($response, $pager);
40
- }
41
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/CreditCardVerificationSearch.php DELETED
@@ -1,34 +0,0 @@
1
- <?php
2
- class Braintree_CreditCardVerificationSearch
3
- {
4
- static function id() { return new Braintree_TextNode('id'); }
5
- static function creditCardCardholderName() { return new Braintree_TextNode('credit_card_cardholder_name'); }
6
-
7
- static function creditCardExpirationDate() { return new Braintree_EqualityNode('credit_card_expiration_date'); }
8
- static function creditCardNumber() { return new Braintree_PartialMatchNode('credit_card_number'); }
9
-
10
- static function ids() { return new Braintree_MultipleValueNode('ids'); }
11
-
12
- static function creditCardCardType()
13
- {
14
- return new Braintree_MultipleValueNode("credit_card_card_type", array(
15
- Braintree_CreditCard::AMEX,
16
- Braintree_CreditCard::CARTE_BLANCHE,
17
- Braintree_CreditCard::CHINA_UNION_PAY,
18
- Braintree_CreditCard::DINERS_CLUB_INTERNATIONAL,
19
- Braintree_CreditCard::DISCOVER,
20
- Braintree_CreditCard::JCB,
21
- Braintree_CreditCard::LASER,
22
- Braintree_CreditCard::MAESTRO,
23
- Braintree_CreditCard::MASTER_CARD,
24
- Braintree_CreditCard::SOLO,
25
- Braintree_CreditCard::SWITCH_TYPE,
26
- Braintree_CreditCard::VISA,
27
- Braintree_CreditCard::UNKNOWN
28
- ));
29
- }
30
-
31
-
32
- static function createdAt() { return new Braintree_RangeNode("created_at"); }
33
- }
34
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Customer.php DELETED
@@ -1,562 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Customer module
4
- *
5
- * @package Braintree
6
- * @category Resources
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates and manages Customers
12
- *
13
- * <b>== More information ==</b>
14
- *
15
- * For more detailed information on Customers, see {@link http://www.braintreepayments.com/gateway/customer-api http://www.braintreepaymentsolutions.com/gateway/customer-api}
16
- *
17
- * @package Braintree
18
- * @category Resources
19
- * @copyright 2010 Braintree Payment Solutions
20
- *
21
- * @property-read array $addresses
22
- * @property-read string $company
23
- * @property-read string $createdAt
24
- * @property-read array $creditCards
25
- * @property-read array $customFields custom fields passed with the request
26
- * @property-read string $email
27
- * @property-read string $fax
28
- * @property-read string $firstName
29
- * @property-read string $id
30
- * @property-read string $lastName
31
- * @property-read string $phone
32
- * @property-read string $updatedAt
33
- * @property-read string $website
34
- */
35
- class Braintree_Customer extends Braintree
36
- {
37
- public static function all()
38
- {
39
- $response = braintree_http::post('/customers/advanced_search_ids');
40
- $pager = array(
41
- 'className' => __CLASS__,
42
- 'classMethod' => 'fetch',
43
- 'methodArgs' => array(array())
44
- );
45
-
46
- return new Braintree_ResourceCollection($response, $pager);
47
- }
48
-
49
- public static function fetch($query, $ids)
50
- {
51
- $criteria = array();
52
- foreach ($query as $term) {
53
- $criteria[$term->name] = $term->toparam();
54
- }
55
- $criteria["ids"] = Braintree_CustomerSearch::ids()->in($ids)->toparam();
56
- $response = braintree_http::post('/customers/advanced_search', array('search' => $criteria));
57
-
58
- return braintree_util::extractattributeasarray(
59
- $response['customers'],
60
- 'customer'
61
- );
62
- }
63
-
64
- /**
65
- * Creates a customer using the given +attributes+. If <tt>:id</tt> is not passed,
66
- * the gateway will generate it.
67
- *
68
- * <code>
69
- * $result = Braintree_Customer::create(array(
70
- * 'first_name' => 'John',
71
- * 'last_name' => 'Smith',
72
- * 'company' => 'Smith Co.',
73
- * 'email' => 'john@smith.com',
74
- * 'website' => 'www.smithco.com',
75
- * 'fax' => '419-555-1234',
76
- * 'phone' => '614-555-1234'
77
- * ));
78
- * if($result->success) {
79
- * echo 'Created customer ' . $result->customer->id;
80
- * } else {
81
- * echo 'Could not create customer, see result->errors';
82
- * }
83
- * </code>
84
- *
85
- * @access public
86
- * @param array $attribs
87
- * @return object Result, either Successful or Error
88
- */
89
- public static function create($attribs = array())
90
- {
91
- Braintree_Util::verifyKeys(self::createSignature(), $attribs);
92
- return self::_doCreate('/customers', array('customer' => $attribs));
93
- }
94
-
95
- /**
96
- * attempts the create operation assuming all data will validate
97
- * returns a Braintree_Customer object instead of a Result
98
- *
99
- * @access public
100
- * @param array $attribs
101
- * @return object
102
- * @throws Braintree_Exception_ValidationError
103
- */
104
- public static function createNoValidate($attribs = array())
105
- {
106
- $result = self::create($attribs);
107
- return self::returnObjectOrThrowException(__CLASS__, $result);
108
- }
109
- /**
110
- * create a customer from a TransparentRedirect operation
111
- *
112
- * @access public
113
- * @param array $attribs
114
- * @return object
115
- */
116
- public static function createFromTransparentRedirect($queryString)
117
- {
118
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
119
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
120
- $queryString
121
- );
122
- return self::_doCreate(
123
- '/customers/all/confirm_transparent_redirect_request',
124
- array('id' => $params['id'])
125
- );
126
- }
127
-
128
- /**
129
- *
130
- * @access public
131
- * @param none
132
- * @return string
133
- */
134
- public static function createCustomerUrl()
135
- {
136
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
137
- return Braintree_Configuration::merchantUrl() .
138
- '/customers/all/create_via_transparent_redirect_request';
139
- }
140
-
141
-
142
- /**
143
- * creates a full array signature of a valid create request
144
- * @return array gateway create request format
145
- */
146
- public static function createSignature()
147
- {
148
-
149
- $creditCardSignature = Braintree_CreditCard::createSignature();
150
- unset($creditCardSignature['customerId']);
151
- $signature = array(
152
- 'id', 'company', 'email', 'fax', 'firstName',
153
- 'lastName', 'phone', 'website',
154
- array('creditCard' => $creditCardSignature),
155
- array('customFields' => array('_anyKey_')),
156
- );
157
- return $signature;
158
- }
159
-
160
- /**
161
- * creates a full array signature of a valid update request
162
- * @return array update request format
163
- */
164
- public static function updateSignature()
165
- {
166
- $creditCardSignature = Braintree_CreditCard::updateSignature();
167
-
168
- foreach($creditCardSignature AS $key => $value) {
169
- if(is_array($value) and array_key_exists('options', $value)) {
170
- array_push($creditCardSignature[$key]['options'], 'updateExistingToken');
171
- }
172
- }
173
-
174
- $signature = array(
175
- 'id', 'company', 'email', 'fax', 'firstName',
176
- 'lastName', 'phone', 'website',
177
- array('creditCard' => $creditCardSignature),
178
- array('customFields' => array('_anyKey_')),
179
- );
180
- return $signature;
181
- }
182
-
183
-
184
- /**
185
- * find a customer by id
186
- *
187
- * @access public
188
- * @param string id customer Id
189
- * @return object Braintree_Customer
190
- * @throws Braintree_Exception_NotFound
191
- */
192
- public static function find($id)
193
- {
194
- self::_validateId($id);
195
- try {
196
- $response = Braintree_Http::get('/customers/'.$id);
197
- return self::factory($response['customer']);
198
- } catch (Braintree_Exception_NotFound $e) {
199
- throw new Braintree_Exception_NotFound(
200
- 'customer with id ' . $id . ' not found'
201
- );
202
- }
203
-
204
- }
205
-
206
- /**
207
- * credit a customer for the passed transaction
208
- *
209
- * @access public
210
- * @param array $attribs
211
- * @return object Braintree_Result_Successful or Braintree_Result_Error
212
- */
213
- public static function credit($customerId, $transactionAttribs)
214
- {
215
- self::_validateId($customerId);
216
- return Braintree_Transaction::credit(
217
- array_merge($transactionAttribs,
218
- array('customerId' => $customerId)
219
- )
220
- );
221
- }
222
-
223
- /**
224
- * credit a customer, assuming validations will pass
225
- *
226
- * returns a Braintree_Transaction object on success
227
- *
228
- * @access public
229
- * @param array $attribs
230
- * @return object Braintree_Transaction
231
- * @throws Braintree_Exception_ValidationError
232
- */
233
- public static function creditNoValidate($customerId, $transactionAttribs)
234
- {
235
- $result = self::credit($customerId, $transactionAttribs);
236
- return self::returnObjectOrThrowException('Braintree_Transaction', $result);
237
- }
238
-
239
- /**
240
- * delete a customer by id
241
- *
242
- * @param string $customerId
243
- */
244
- public static function delete($customerId)
245
- {
246
- self::_validateId($customerId);
247
- Braintree_Http::delete('/customers/' . $customerId);
248
- return new Braintree_Result_Successful();
249
- }
250
-
251
- /**
252
- * create a new sale for a customer
253
- *
254
- * @param string $customerId
255
- * @param array $transactionAttribs
256
- * @return object Braintree_Result_Successful or Braintree_Result_Error
257
- * @see Braintree_Transaction::sale()
258
- */
259
- public static function sale($customerId, $transactionAttribs)
260
- {
261
- self::_validateId($customerId);
262
- return Braintree_Transaction::sale(
263
- array_merge($transactionAttribs,
264
- array('customerId' => $customerId)
265
- )
266
- );
267
- }
268
-
269
- /**
270
- * create a new sale for a customer, assuming validations will pass
271
- *
272
- * returns a Braintree_Transaction object on success
273
- * @access public
274
- * @param string $customerId
275
- * @param array $transactionAttribs
276
- * @return object Braintree_Transaction
277
- * @throws Braintree_Exception_ValidationsFailed
278
- * @see Braintree_Transaction::sale()
279
- */
280
- public static function saleNoValidate($customerId, $transactionAttribs)
281
- {
282
- $result = self::sale($customerId, $transactionAttribs);
283
- return self::returnObjectOrThrowException('Braintree_Transaction', $result);
284
- }
285
-
286
- /**
287
- * Returns a ResourceCollection of customers matching the search query.
288
- *
289
- * If <b>query</b> is a string, the search will be a basic search.
290
- * If <b>query</b> is a hash, the search will be an advanced search.
291
- * For more detailed information and examples, see {@link http://www.braintreepayments.com/gateway/customer-api#searching http://www.braintreepaymentsolutions.com/gateway/customer-api}
292
- *
293
- * @param mixed $query search query
294
- * @param array $options options such as page number
295
- * @return object Braintree_ResourceCollection
296
- * @throws InvalidArgumentException
297
- */
298
- public static function search($query)
299
- {
300
- $criteria = array();
301
- foreach ($query as $term) {
302
- $criteria[$term->name] = $term->toparam();
303
- }
304
-
305
- $response = braintree_http::post('/customers/advanced_search_ids', array('search' => $criteria));
306
- $pager = array(
307
- 'className' => __CLASS__,
308
- 'classMethod' => 'fetch',
309
- 'methodArgs' => array($query)
310
- );
311
-
312
- return new Braintree_ResourceCollection($response, $pager);
313
- }
314
-
315
- /**
316
- * updates the customer record
317
- *
318
- * if calling this method in static context, customerId
319
- * is the 2nd attribute. customerId is not sent in object context.
320
- *
321
- * @access public
322
- * @param array $attributes
323
- * @param string $customerId (optional)
324
- * @return object Braintree_Result_Successful or Braintree_Result_Error
325
- */
326
- public static function update($customerId, $attributes)
327
- {
328
- Braintree_Util::verifyKeys(self::updateSignature(), $attributes);
329
- self::_validateId($customerId);
330
- return self::_doUpdate(
331
- 'put',
332
- '/customers/' . $customerId,
333
- array('customer' => $attributes)
334
- );
335
- }
336
-
337
- /**
338
- * update a customer record, assuming validations will pass
339
- *
340
- * if calling this method in static context, customerId
341
- * is the 2nd attribute. customerId is not sent in object context.
342
- * returns a Braintree_Customer object on success
343
- *
344
- * @access public
345
- * @param array $attributes
346
- * @param string $customerId
347
- * @return object Braintree_Customer
348
- * @throws Braintree_Exception_ValidationsFailed
349
- */
350
- public static function updateNoValidate($customerId, $attributes)
351
- {
352
- $result = self::update($customerId, $attributes);
353
- return self::returnObjectOrThrowException(__CLASS__, $result);
354
- }
355
- /**
356
- *
357
- * @access public
358
- * @param none
359
- * @return string
360
- */
361
- public static function updateCustomerUrl()
362
- {
363
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
364
- return Braintree_Configuration::merchantUrl() .
365
- '/customers/all/update_via_transparent_redirect_request';
366
- }
367
-
368
- /**
369
- * update a customer from a TransparentRedirect operation
370
- *
371
- * @access public
372
- * @param array $attribs
373
- * @return object
374
- */
375
- public static function updateFromTransparentRedirect($queryString)
376
- {
377
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
378
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
379
- $queryString
380
- );
381
- return self::_doUpdate(
382
- 'post',
383
- '/customers/all/confirm_transparent_redirect_request',
384
- array('id' => $params['id'])
385
- );
386
- }
387
-
388
- /* instance methods */
389
-
390
- /**
391
- * sets instance properties from an array of values
392
- *
393
- * @ignore
394
- * @access protected
395
- * @param array $customerAttribs array of customer data
396
- * @return none
397
- */
398
- protected function _initialize($customerAttribs)
399
- {
400
- // set the attributes
401
- $this->_attributes = $customerAttribs;
402
-
403
- // map each address into its own object
404
- $addressArray = array();
405
- if (isset($customerAttribs['addresses'])) {
406
-
407
- foreach ($customerAttribs['addresses'] AS $address) {
408
- $addressArray[] = Braintree_Address::factory($address);
409
- }
410
- }
411
- $this->_set('addresses', $addressArray);
412
-
413
- // map each creditcard into its own object
414
- $ccArray = array();
415
- if (isset($customerAttribs['creditCards'])) {
416
- foreach ($customerAttribs['creditCards'] AS $creditCard) {
417
- $ccArray[] = Braintree_CreditCard::factory($creditCard);
418
- }
419
- }
420
- $this->_set('creditCards', $ccArray);
421
-
422
- }
423
-
424
- /**
425
- * returns a string representation of the customer
426
- * @return string
427
- */
428
- public function __toString()
429
- {
430
- return __CLASS__ . '[' .
431
- Braintree_Util::attributesToString($this->_attributes) .']';
432
- }
433
-
434
- /**
435
- * returns false if comparing object is not a Braintree_Customer,
436
- * or is a Braintree_Customer with a different id
437
- *
438
- * @param object $otherCust customer to compare against
439
- * @return boolean
440
- */
441
- public function isEqual($otherCust)
442
- {
443
- return !($otherCust instanceof Braintree_Customer) ? false : $this->id === $otherCust->id;
444
- }
445
-
446
- /* private class properties */
447
-
448
- /**
449
- * @access protected
450
- * @var array registry of customer data
451
- */
452
- protected $_attributes = array(
453
- 'addresses' => '',
454
- 'company' => '',
455
- 'creditCards' => '',
456
- 'email' => '',
457
- 'fax' => '',
458
- 'firstName' => '',
459
- 'id' => '',
460
- 'lastName' => '',
461
- 'phone' => '',
462
- 'createdAt' => '',
463
- 'updatedAt' => '',
464
- 'website' => '',
465
- );
466
-
467
- /**
468
- * sends the create request to the gateway
469
- *
470
- * @ignore
471
- * @param string $url
472
- * @param array $params
473
- * @return mixed
474
- */
475
- public static function _doCreate($url, $params)
476
- {
477
- $response = Braintree_Http::post($url, $params);
478
-
479
- return self::_verifyGatewayResponse($response);
480
- }
481
-
482
- /**
483
- * verifies that a valid customer id is being used
484
- * @ignore
485
- * @param string customer id
486
- * @throws InvalidArgumentException
487
- */
488
- private static function _validateId($id = null) {
489
- if (empty($id)) {
490
- throw new InvalidArgumentException(
491
- 'expected customer id to be set'
492
- );
493
- }
494
- if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) {
495
- throw new InvalidArgumentException(
496
- $id . ' is an invalid customer id.'
497
- );
498
- }
499
- }
500
-
501
-
502
- /* private class methods */
503
-
504
- /**
505
- * sends the update request to the gateway
506
- *
507
- * @ignore
508
- * @param string $url
509
- * @param array $params
510
- * @return mixed
511
- */
512
- private static function _doUpdate($httpVerb, $url, $params)
513
- {
514
- $response = Braintree_Http::$httpVerb($url, $params);
515
-
516
- return self::_verifyGatewayResponse($response);
517
- }
518
-
519
- /**
520
- * generic method for validating incoming gateway responses
521
- *
522
- * creates a new Braintree_Customer object and encapsulates
523
- * it inside a Braintree_Result_Successful object, or
524
- * encapsulates a Braintree_Errors object inside a Result_Error
525
- * alternatively, throws an Unexpected exception if the response is invalid.
526
- *
527
- * @ignore
528
- * @param array $response gateway response values
529
- * @return object Result_Successful or Result_Error
530
- * @throws Braintree_Exception_Unexpected
531
- */
532
- private static function _verifyGatewayResponse($response)
533
- {
534
- if (isset($response['customer'])) {
535
- // return a populated instance of Braintree_Customer
536
- return new Braintree_Result_Successful(
537
- self::factory($response['customer'])
538
- );
539
- } else if (isset($response['apiErrorResponse'])) {
540
- return new Braintree_Result_Error($response['apiErrorResponse']);
541
- } else {
542
- throw new Braintree_Exception_Unexpected(
543
- "Expected customer or apiErrorResponse"
544
- );
545
- }
546
- }
547
-
548
- /**
549
- * factory method: returns an instance of Braintree_Customer
550
- * to the requesting method, with populated properties
551
- *
552
- * @ignore
553
- * @return object instance of Braintree_Customer
554
- */
555
- public static function factory($attributes)
556
- {
557
- $instance = new self();
558
- $instance->_initialize($attributes);
559
- return $instance;
560
- }
561
-
562
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/CustomerSearch.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- class Braintree_CustomerSearch
3
- {
4
- static function addressCountryName() { return new Braintree_TextNode('address_country_name'); }
5
- static function addressExtendedAddress() { return new Braintree_TextNode('address_extended_address'); }
6
- static function addressFirstName() { return new Braintree_TextNode('address_first_name'); }
7
- static function addressLastName() { return new Braintree_TextNode('address_last_name'); }
8
- static function addressLocality() { return new Braintree_TextNode('address_locality'); }
9
- static function addressPostalCode() { return new Braintree_TextNode('address_postal_code'); }
10
- static function addressRegion() { return new Braintree_TextNode('address_region'); }
11
- static function addressStreetAddress() { return new Braintree_TextNode('address_street_address'); }
12
- static function cardholderName() { return new Braintree_TextNode('cardholder_name'); }
13
- static function company() { return new Braintree_TextNode('company'); }
14
- static function email() { return new Braintree_TextNode('email'); }
15
- static function fax() { return new Braintree_TextNode('fax'); }
16
- static function firstName() { return new Braintree_TextNode('first_name'); }
17
- static function id() { return new Braintree_TextNode('id'); }
18
- static function lastName() { return new Braintree_TextNode('last_name'); }
19
- static function paymentMethodToken() { return new Braintree_TextNode('payment_method_token'); }
20
- static function paymentMethodTokenWithDuplicates() { return new Braintree_IsNode('payment_method_token_with_duplicates'); }
21
- static function phone() { return new Braintree_TextNode('phone'); }
22
- static function website() { return new Braintree_TextNode('website'); }
23
-
24
- static function creditCardExpirationDate() { return new Braintree_EqualityNode('credit_card_expiration_date'); }
25
- static function creditCardNumber() { return new Braintree_PartialMatchNode('credit_card_number'); }
26
-
27
- static function ids() { return new Braintree_MultipleValueNode('ids'); }
28
-
29
- static function createdAt() { return new Braintree_RangeNode("created_at"); }
30
- }
31
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Descriptor.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- class Braintree_Descriptor extends Braintree_Instance
3
- {
4
- }
 
 
 
 
includes/lib/Braintree/Braintree/Digest.php DELETED
@@ -1,59 +0,0 @@
1
- <?php
2
- /**
3
- * Digest encryption module
4
- *
5
- * @copyright 2010 Braintree Payment Solutions
6
- */
7
-
8
- /**
9
- * Digest creates an HMAC-SHA1 hash for encrypting messages
10
- *
11
- * @copyright 2010 Braintree Payment Solutions
12
- */
13
- class Braintree_Digest
14
- {
15
- public static function hexDigest($string)
16
- {
17
- if(function_exists('hash_hmac')) {
18
- return self::_builtInHmacSha1($string, Braintree_Configuration::privateKey());
19
- } else {
20
- return self::_hmacSha1($string, Braintree_Configuration::privateKey());
21
- }
22
- }
23
-
24
- public static function secureCompare($left, $right)
25
- {
26
- if (strlen($left) != strlen($right)) {
27
- return false;
28
- }
29
-
30
- $leftBytes = unpack("C*", $left);
31
- $rightBytes = unpack("C*", $right);
32
-
33
- $result = 0;
34
- for ($i = 0; $i < strlen($left); $i++) {
35
- $result = $result | ($left[$i] ^ $right[$i]);
36
- }
37
- return $result == 0;
38
- }
39
-
40
- public static function _builtInHmacSha1($message, $key)
41
- {
42
- return hash_hmac('sha1', $message, sha1(Braintree_Configuration::privateKey(), true));
43
- }
44
-
45
- public static function _hmacSha1($message, $key)
46
- {
47
- $pack = 'H40';
48
- $keyDigest = sha1($key,true);
49
- $innerPad = str_repeat(chr(0x36), 64);
50
- $outerPad = str_repeat(chr(0x5C), 64);
51
-
52
- for ($i = 0; $i < 20; $i++) {
53
- $innerPad{$i} = $keyDigest{$i} ^ $innerPad{$i};
54
- $outerPad{$i} = $keyDigest{$i} ^ $outerPad{$i};
55
- }
56
-
57
- return sha1($outerPad.pack($pack, sha1($innerPad.$message)));
58
- }
59
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Discount.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
- class Braintree_Discount extends Braintree_Modification
3
- {
4
- public static function all()
5
- {
6
- $response = Braintree_Http::get('/discounts');
7
-
8
- $discounts = array("discount" => $response['discounts']);
9
-
10
- return Braintree_Util::extractAttributeAsArray(
11
- $discounts,
12
- 'discount'
13
- );
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/EqualityNode.php DELETED
@@ -1,10 +0,0 @@
1
- <?php
2
-
3
- class Braintree_EqualityNode extends Braintree_IsNode
4
- {
5
- function isNot($value)
6
- {
7
- $this->searchTerms['is_not'] = strval($value);
8
- return $this;
9
- }
10
- }
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Error/Codes.php DELETED
@@ -1,206 +0,0 @@
1
- <?php
2
- /**
3
- * validation Error codes and messages
4
- *
5
- * @package Braintree
6
- * @subpackage Errors
7
- * @category Validation
8
- * @copyright 2010 Braintree Payment Solutions
9
- */
10
-
11
- /**
12
- *
13
- * Validation Error codes and messages
14
- *
15
- * ErrorCodes class provides constants for validation errors.
16
- * The constants should be used to check for a specific validation
17
- * error in a ValidationErrorCollection.
18
- * The error messages returned from the server may change,
19
- * but the codes will remain the same.
20
- *
21
- * @package Braintree
22
- * @subpackage Errors
23
- * @category Validation
24
- * @copyright 2010 Braintree Payment Solutions
25
- */
26
- class Braintree_Error_Codes
27
- {
28
- const ADDRESS_CANNOT_BE_BLANK = '81801';
29
- const ADDRESS_COMPANY_IS_TOO_LONG = '81802';
30
- const ADDRESS_COUNTRY_CODE_ALPHA2_IS_NOT_ACCEPTED = '91814';
31
- const ADDRESS_COUNTRY_CODE_ALPHA3_IS_NOT_ACCEPTED = '91816';
32
- const ADDRESS_COUNTRY_CODE_NUMERIC_IS_NOT_ACCEPTED = '91817';
33
- const ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED = '91803';
34
- const ADDRESS_EXTENDED_ADDRESS_IS_TOO_LONG = '81804';
35
- const ADDRESS_FIRST_NAME_IS_TOO_LONG = '81805';
36
- const ADDRESS_INCONSISTENT_COUNTRY = '91815';
37
- const ADDRESS_LAST_NAME_IS_TOO_LONG = '81806';
38
- const ADDRESS_LOCALITY_IS_TOO_LONG = '81807';
39
- const ADDRESS_POSTAL_CODE_INVALID_CHARACTERS = '81813';
40
- const ADDRESS_POSTAL_CODE_IS_REQUIRED = '81808';
41
- const ADDRESS_POSTAL_CODE_IS_TOO_LONG = '81809';
42
- const ADDRESS_REGION_IS_TOO_LONG = '81810';
43
- const ADDRESS_STREET_ADDRESS_IS_REQUIRED = '81811';
44
- const ADDRESS_STREET_ADDRESS_IS_TOO_LONG = '81812';
45
- const ADDRESS_TOO_MANY_ADDRESSES_PER_CUSTOMER = '91818';
46
-
47
- const CREDIT_CARD_BILLING_ADDRESS_CONFLICT = '91701';
48
- const CREDIT_CARD_BILLING_ADDRESS_ID_IS_INVALID = '91702';
49
- const CREDIT_CARD_CARDHOLDER_NAME_IS_TOO_LONG = '81723';
50
- const CREDIT_CARD_CREDIT_CARD_TYPE_IS_NOT_ACCEPTED = '81703';
51
- const CREDIT_CARD_CREDIT_CARD_TYPE_IS_NOT_ACCEPTED_BY_SUBSCRIPTION_MERCHANT_ACCOUNT = '81718';
52
- const CREDIT_CARD_CUSTOMER_ID_IS_INVALID = '91705';
53
- const CREDIT_CARD_CUSTOMER_ID_IS_REQUIRED = '91704';
54
- const CREDIT_CARD_CVV_IS_INVALID = '81707';
55
- const CREDIT_CARD_CVV_IS_REQUIRED = '81706';
56
- const CREDIT_CARD_DUPLICATE_CARD_EXISTS = '81724';
57
- const CREDIT_CARD_EXPIRATION_DATE_CONFLICT = '91708';
58
- const CREDIT_CARD_EXPIRATION_DATE_IS_INVALID = '81710';
59
- const CREDIT_CARD_EXPIRATION_DATE_IS_REQUIRED = '81709';
60
- const CREDIT_CARD_EXPIRATION_DATE_YEAR_IS_INVALID = '81711';
61
- const CREDIT_CARD_EXPIRATION_MONTH_IS_INVALID = '81712';
62
- const CREDIT_CARD_EXPIRATION_YEAR_IS_INVALID = '81713';
63
- const CREDIT_CARD_NUMBER_INVALID_LENGTH = '81716';
64
- const CREDIT_CARD_NUMBER_IS_INVALID = '81715';
65
- const CREDIT_CARD_NUMBER_IS_REQUIRED = '81714';
66
- const CREDIT_CARD_NUMBER_MUST_BE_TEST_NUMBER = '81717';
67
- const CREDIT_CARD_OPTIONS_UPDATE_EXISTING_TOKEN_IS_INVALID = '91723';
68
- const CREDIT_CARD_TOKEN_INVALID = '91718';
69
- const CREDIT_CARD_TOKEN_IS_IN_USE = '91719';
70
- const CREDIT_CARD_TOKEN_IS_NOT_ALLOWED = '91721';
71
- const CREDIT_CARD_TOKEN_IS_REQUIRED = '91722';
72
- const CREDIT_CARD_TOKEN_IS_TOO_LONG = '91720';
73
-
74
- const CUSTOMER_COMPANY_IS_TOO_LONG = '81601';
75
- const CUSTOMER_CUSTOM_FIELD_IS_INVALID = '91602';
76
- const CUSTOMER_CUSTOM_FIELD_IS_TOO_LONG = '81603';
77
- const CUSTOMER_EMAIL_IS_INVALID = '81604';
78
- const CUSTOMER_EMAIL_IS_REQUIRED = '81606';
79
- const CUSTOMER_EMAIL_IS_TOO_LONG = '81605';
80
- const CUSTOMER_FAX_IS_TOO_LONG = '81607';
81
- const CUSTOMER_FIRST_NAME_IS_TOO_LONG = '81608';
82
- const CUSTOMER_ID_IS_INVAILD = '91610'; //Deprecated
83
- const CUSTOMER_ID_IS_INVALID = '91610';
84
- const CUSTOMER_ID_IS_IN_USE = '91609';
85
- const CUSTOMER_ID_IS_NOT_ALLOWED = '91611';
86
- const CUSTOMER_ID_IS_REQUIRED = '91613';
87
- const CUSTOMER_ID_IS_TOO_LONG = '91612';
88
- const CUSTOMER_LAST_NAME_IS_TOO_LONG = '81613';
89
- const CUSTOMER_PHONE_IS_TOO_LONG = '81614';
90
- const CUSTOMER_WEBSITE_IS_INVALID = '81616';
91
- const CUSTOMER_WEBSITE_IS_TOO_LONG = '81615';
92
-
93
- const DESCRIPTOR_NAME_FORMAT_IS_INVALID = '92201';
94
- const DESCRIPTOR_PHONE_FORMAT_IS_INVALID = '92202';
95
-
96
- const SETTLEMENT_BATCH_SUMMARY_SETTLEMENT_DATE_IS_INVALID = '82302';
97
- const SETTLEMENT_BATCH_SUMMARY_SETTLEMENT_DATE_IS_REQUIRED = '82301';
98
- const SETTLEMENT_BATCH_SUMMARY_CUSTOM_FIELD_IS_INVALID = '82303';
99
-
100
- const SUBSCRIPTION_BILLING_DAY_OF_MONTH_CANNOT_BE_UPDATED = '91918';
101
- const SUBSCRIPTION_BILLING_DAY_OF_MONTH_IS_INVALID = '91914';
102
- const SUBSCRIPTION_BILLING_DAY_OF_MONTH_MUST_BE_NUMERIC = '91913';
103
- const SUBSCRIPTION_CANNOT_ADD_DUPLICATE_ADDON_OR_DISCOUNT = '91911';
104
- const SUBSCRIPTION_CANNOT_EDIT_CANCELED_SUBSCRIPTION = '81901';
105
- const SUBSCRIPTION_CANNOT_EDIT_EXPIRED_SUBSCRIPTION = '81910';
106
- const SUBSCRIPTION_CANNOT_EDIT_PRICE_CHANGING_FIELDS_ON_PAST_DUE_SUBSCRIPTION = '91920';
107
- const SUBSCRIPTION_FIRST_BILLING_DATE_CANNOT_BE_IN_THE_PAST = '91916';
108
- const SUBSCRIPTION_FIRST_BILLING_DATE_CANNOT_BE_UPDATED = '91919';
109
- const SUBSCRIPTION_FIRST_BILLING_DATE_IS_INVALID = '91915';
110
- const SUBSCRIPTION_ID_IS_IN_USE = '81902';
111
- const SUBSCRIPTION_INCONSISTENT_NUMBER_OF_BILLING_CYCLES = '91908';
112
- const SUBSCRIPTION_INCONSISTENT_START_DATE = '91917';
113
- const SUBSCRIPTION_INVALID_REQUEST_FORMAT = '91921';
114
- const SUBSCRIPTION_MERCHANT_ACCOUNT_ID_IS_INVALID = '91901';
115
- const SUBSCRIPTION_MISMATCH_CURRENCY_ISO_CODE = '91923';
116
- const SUBSCRIPTION_NUMBER_OF_BILLING_CYCLES_CANNOT_BE_BLANK = '91912';
117
- const SUBSCRIPTION_NUMBER_OF_BILLING_CYCLES_IS_TOO_SMALL = '91909';
118
- const SUBSCRIPTION_NUMBER_OF_BILLING_CYCLES_MUST_BE_GREATER_THAN_ZERO = '91907';
119
- const SUBSCRIPTION_NUMBER_OF_BILLING_CYCLES_MUST_BE_NUMERIC = '91906';
120
- const SUBSCRIPTION_PAYMENT_METHOD_TOKEN_CARD_TYPE_IS_NOT_ACCEPTED = '91902';
121
- const SUBSCRIPTION_PAYMENT_METHOD_TOKEN_IS_INVALID = '91903';
122
- const SUBSCRIPTION_PAYMENT_METHOD_TOKEN_NOT_ASSOCIATED_WITH_CUSTOMER = '91905';
123
- const SUBSCRIPTION_PLAN_BILLING_FREQUENCY_CANNOT_BE_UPDATED = '91922';
124
- const SUBSCRIPTION_PLAN_ID_IS_INVALID = '91904';
125
- const SUBSCRIPTION_PRICE_CANNOT_BE_BLANK = '81903';
126
- const SUBSCRIPTION_PRICE_FORMAT_IS_INVALID = '81904';
127
- const SUBSCRIPTION_PRICE_IS_TOO_LARGE = '81923';
128
- const SUBSCRIPTION_STATUS_IS_CANCELED = '81905';
129
- const SUBSCRIPTION_TOKEN_FORMAT_IS_INVALID = '81906';
130
- const SUBSCRIPTION_TRIAL_DURATION_FORMAT_IS_INVALID = '81907';
131
- const SUBSCRIPTION_TRIAL_DURATION_IS_REQUIRED = '81908';
132
- const SUBSCRIPTION_TRIAL_DURATION_UNIT_IS_INVALID = '81909';
133
-
134
- const SUBSCRIPTION_MODIFICATION_AMOUNT_CANNOT_BE_BLANK = '92003';
135
- const SUBSCRIPTION_MODIFICATION_AMOUNT_IS_INVALID = '92002';
136
- const SUBSCRIPTION_MODIFICATION_AMOUNT_IS_TOO_LARGE = '92023';
137
- const SUBSCRIPTION_MODIFICATION_CANNOT_EDIT_MODIFICATIONS_ON_PAST_DUE_SUBSCRIPTION = '92022';
138
- const SUBSCRIPTION_MODIFICATION_CANNOT_UPDATE_AND_REMOVE = '92015';
139
- const SUBSCRIPTION_MODIFICATION_EXISTING_ID_IS_INCORRECT_KIND = '92020';
140
- const SUBSCRIPTION_MODIFICATION_EXISTING_ID_IS_INVALID = '92011';
141
- const SUBSCRIPTION_MODIFICATION_EXISTING_ID_IS_REQUIRED = '92012';
142
- const SUBSCRIPTION_MODIFICATION_ID_TO_REMOVE_IS_INCORRECT_KIND = '92021';
143
- const SUBSCRIPTION_MODIFICATION_ID_TO_REMOVE_IS_NOT_PRESENT = '92016';
144
- const SUBSCRIPTION_MODIFICATION_INCONSISTENT_NUMBER_OF_BILLING_CYCLES = '92018';
145
- const SUBSCRIPTION_MODIFICATION_INHERITED_FROM_ID_IS_INVALID = '92013';
146
- const SUBSCRIPTION_MODIFICATION_INHERITED_FROM_ID_IS_REQUIRED = '92014';
147
- const SUBSCRIPTION_MODIFICATION_NUMBER_OF_BILLING_CYCLES_CANNOT_BE_BLANK = '92017';
148
- const SUBSCRIPTION_MODIFICATION_NUMBER_OF_BILLING_CYCLES_IS_INVALID = '92005';
149
- const SUBSCRIPTION_MODIFICATION_NUMBER_OF_BILLING_CYCLES_MUST_BE_GREATER_THAN_ZERO = '92019';
150
- const SUBSCRIPTION_MODIFICATION_QUANTITY_CANNOT_BE_BLANK = '92004';
151
- const SUBSCRIPTION_MODIFICATION_QUANTITY_IS_INVALID = '92001';
152
- const SUBSCRIPTION_MODIFICATION_QUANTITY_MUST_BE_GREATER_THAN_ZERO = '92010';
153
-
154
- const TRANSACTION_AMOUNT_CANNOT_BE_NEGATIVE = '81501';
155
- const TRANSACTION_AMOUNT_IS_INVALID = '81503';
156
- const TRANSACTION_AMOUNT_IS_REQUIRED = '81502';
157
- const TRANSACTION_AMOUNT_IS_TOO_LARGE = '81528';
158
- const TRANSACTION_AMOUNT_MUST_BE_GREATER_THAN_ZERO = '81531';
159
- const TRANSACTION_BILLING_ADDRESS_CONFLICT = '91530';
160
- const TRANSACTION_CANNOT_BE_VOIDED = '91504';
161
- const TRANSACTION_CANNOT_CLONE_CREDIT = '91543';
162
- const TRANSACTION_CANNOT_CLONE_TRANSACTION_WITH_VAULT_CREDIT_CARD = '91540';
163
- const TRANSACTION_CANNOT_CLONE_UNSUCCESSFUL_TRANSACTION = '91542';
164
- const TRANSACTION_CANNOT_CLONE_VOICE_AUTHORIZATIONS = '91541';
165
- const TRANSACTION_CANNOT_REFUND_CREDIT = '91505';
166
- const TRANSACTION_CANNOT_REFUND_UNLESS_SETTLED = '91506';
167
- const TRANSACTION_CANNOT_REFUND_WITH_SUSPENDED_MERCHANT_ACCOUNT = '91538';
168
- const TRANSACTION_CANNOT_SUBMIT_FOR_SETTLEMENT = '91507';
169
- const TRANSACTION_CHANNEL_IS_TOO_LONG = '91550';
170
- const TRANSACTION_CREDIT_CARD_IS_REQUIRED = '91508';
171
- const TRANSACTION_CUSTOMER_DEFAULT_PAYMENT_METHOD_CARD_TYPE_IS_NOT_ACCEPTED = '81509';
172
- const TRANSACTION_CUSTOMER_DOES_NOT_HAVE_CREDIT_CARD = '91511';
173
- const TRANSACTION_CUSTOMER_ID_IS_INVALID = '91510';
174
- const TRANSACTION_CUSTOM_FIELD_IS_INVALID = '91526';
175
- const TRANSACTION_CUSTOM_FIELD_IS_TOO_LONG = '81527';
176
- const TRANSACTION_HAS_ALREADY_BEEN_REFUNDED = '91512';
177
- const TRANSACTION_MERCHANT_ACCOUNT_DOES_NOT_SUPPORT_REFUNDS = '91547';
178
- const TRANSACTION_MERCHANT_ACCOUNT_ID_IS_INVALID = '91513';
179
- const TRANSACTION_MERCHANT_ACCOUNT_IS_SUSPENDED = '91514';
180
- const TRANSACTION_MERCHANT_ACCOUNT_NAME_IS_INVALID = '91513'; //Deprecated
181
- const TRANSACTION_OPTIONS_SUBMIT_FOR_SETTLEMENT_IS_REQUIRED_FOR_CLONING = '91544';
182
- const TRANSACTION_OPTIONS_VAULT_IS_DISABLED = '91525';
183
- const TRANSACTION_ORDER_ID_IS_TOO_LONG = '91501';
184
- const TRANSACTION_PAYMENT_METHOD_CONFLICT = '91515';
185
- const TRANSACTION_PAYMENT_METHOD_DOES_NOT_BELONG_TO_CUSTOMER = '91516';
186
- const TRANSACTION_PAYMENT_METHOD_DOES_NOT_BELONG_TO_SUBSCRIPTION = '91527';
187
- const TRANSACTION_PAYMENT_METHOD_TOKEN_CARD_TYPE_IS_NOT_ACCEPTED = '91517';
188
- const TRANSACTION_PAYMENT_METHOD_TOKEN_IS_INVALID = '91518';
189
- const TRANSACTION_PROCESSOR_AUTHORIZATION_CODE_CANNOT_BE_SET = '91519';
190
- const TRANSACTION_PROCESSOR_AUTHORIZATION_CODE_IS_INVALID = '81520';
191
- const TRANSACTION_PROCESSOR_DOES_NOT_SUPPORT_CREDITS = '91546';
192
- const TRANSACTION_PROCESSOR_DOES_NOT_SUPPORT_VOICE_AUTHORIZATIONS = '91545';
193
- const TRANSACTION_PURCHASE_ORDER_NUMBER_IS_TOO_LONG = '91537';
194
- const TRANSACTION_PURCHASE_ORDER_NUMBER_IS_INVALID = '91548';
195
- const TRANSACTION_REFUND_AMOUNT_IS_TOO_LARGE = '91521';
196
- const TRANSACTION_SETTLEMENT_AMOUNT_IS_TOO_LARGE = '91522';
197
- const TRANSACTION_SUBSCRIPTION_DOES_NOT_BELONG_TO_CUSTOMER = '91529';
198
- const TRANSACTION_SUBSCRIPTION_ID_IS_INVALID = '91528';
199
- const TRANSACTION_SUBSCRIPTION_STATUS_MUST_BE_PAST_DUE = '91531';
200
- const TRANSACTION_TAX_AMOUNT_CANNOT_BE_NEGATIVE = '81534';
201
- const TRANSACTION_TAX_AMOUNT_FORMAT_IS_INVALID = '81535';
202
- const TRANSACTION_TAX_AMOUNT_IS_TOO_LARGE = '81536';
203
- const TRANSACTION_TYPE_IS_INVALID = '91523';
204
- const TRANSACTION_TYPE_IS_REQUIRED = '91524';
205
- const TRANSACTION_UNSUPPORTED_VOICE_AUTHORIZATION = '91539';
206
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Error/ErrorCollection.php DELETED
@@ -1,118 +0,0 @@
1
- <?php
2
- /**
3
- *
4
- * Error handler
5
- *
6
- * @package Braintree
7
- * @subpackage Errors
8
- * @category Errors
9
- * @copyright 2010 Braintree Payment Solutions
10
- */
11
-
12
-
13
- /**
14
- * Handles validation errors
15
- *
16
- * Contains a read-only property $error which is a ValidationErrorCollection
17
- *
18
- * @package Braintree
19
- * @subpackage Errors
20
- * @category Errors
21
- * @copyright 2010 Braintree Payment Solutions
22
- *
23
- * @property-read object $errors
24
- */
25
- class Braintree_Error_ErrorCollection
26
- {
27
- private $_errors;
28
-
29
- public function __construct($errorData)
30
- {
31
- $this->_errors =
32
- new Braintree_Error_ValidationErrorCollection($errorData);
33
- }
34
-
35
-
36
- /**
37
- * Returns all of the validation errors at all levels of nesting in a single, flat array.
38
- */
39
- public function deepAll()
40
- {
41
- return $this->_errors->deepAll();
42
- }
43
-
44
- /**
45
- * Returns the total number of validation errors at all levels of nesting. For example,
46
- *if creating a customer with a credit card and a billing address, and each of the customer,
47
- * credit card, and billing address has 1 error, this method will return 3.
48
- *
49
- * @return int size
50
- */
51
- public function deepSize()
52
- {
53
- $size = $this->_errors->deepSize();
54
- return $size;
55
- }
56
-
57
- /**
58
- * return errors for the passed key name
59
- *
60
- * @param string $key
61
- * @return mixed
62
- */
63
- public function forKey($key)
64
- {
65
- return $this->_errors->forKey($key);
66
- }
67
-
68
- /**
69
- * return errors for the passed html field.
70
- * For example, $result->errors->onHtmlField("transaction[customer][last_name]")
71
- *
72
- * @param string $field
73
- * @return array
74
- */
75
- public function onHtmlField($field)
76
- {
77
- $pieces = preg_split("/[\[\]]+/", $field, 0, PREG_SPLIT_NO_EMPTY);
78
- $errors = $this;
79
- foreach(array_slice($pieces, 0, -1) as $key) {
80
- $errors = $errors->forKey(Braintree_Util::delimiterToCamelCase($key));
81
- if (!isset($errors)) { return array(); }
82
- }
83
- $finalKey = Braintree_Util::delimiterToCamelCase(end($pieces));
84
- return $errors->onAttribute($finalKey);
85
- }
86
-
87
- /**
88
- * Returns the errors at the given nesting level (see forKey) in a single, flat array:
89
- *
90
- * <code>
91
- * $result = Braintree_Customer::create(...);
92
- * $customerErrors = $result->errors->forKey('customer')->shallowAll();
93
- * </code>
94
- */
95
- public function shallowAll()
96
- {
97
- return $this->_errors->shallowAll();
98
- }
99
-
100
- /**
101
- *
102
- * @ignore
103
- */
104
- public function __get($name)
105
- {
106
- $varName = "_$name";
107
- return isset($this->$varName) ? $this->$varName : null;
108
- }
109
-
110
- /**
111
- *
112
- * @ignore
113
- */
114
- public function __toString()
115
- {
116
- return sprintf('%s', $this->_errors);
117
- }
118
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Error/Validation.php DELETED
@@ -1,64 +0,0 @@
1
- <?php
2
- /**
3
- * error object returned as part of a validation error collection
4
- *
5
- * @package Braintree
6
- * @subpackage Error
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * error object returned as part of a validation error collection
12
- * provides read-only access to $attribute, $code, and $message
13
- *
14
- * <b>== More information ==</b>
15
- *
16
- * For more detailed information on Validation errors, see {@link http://www.braintreepayments.com/gateway/validation-errors http://www.braintreepaymentsolutions.com/gateway/validation-errors}
17
- *
18
- * @package Braintree
19
- * @subpackage Error
20
- * @copyright 2010 Braintree Payment Solutions
21
- *
22
- * @property-read string $attribute
23
- * @property-read string $code
24
- * @property-read string $message
25
- */
26
- class Braintree_Error_Validation
27
- {
28
- private $_attribute;
29
- private $_code;
30
- private $_message;
31
-
32
- /**
33
- * @ignore
34
- * @param array $attributes
35
- */
36
- public function __construct($attributes)
37
- {
38
- $this->_initializeFromArray($attributes);
39
- }
40
- /**
41
- * initializes instance properties from the keys/values of an array
42
- * @ignore
43
- * @access protected
44
- * @param array $attributes array of properties to set - single level
45
- * @return none
46
- */
47
- private function _initializeFromArray($attributes)
48
- {
49
- foreach($attributes AS $name => $value) {
50
- $varName = "_$name";
51
- $this->$varName = Braintree_Util::delimiterToCamelCase($value, '_');
52
- }
53
- }
54
-
55
- /**
56
- *
57
- * @ignore
58
- */
59
- public function __get($name)
60
- {
61
- $varName = "_$name";
62
- return isset($this->$varName) ? $this->$varName : null;
63
- }
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Error/ValidationErrorCollection.php DELETED
@@ -1,135 +0,0 @@
1
- <?php
2
- /**
3
- * collection of errors enumerating all validation errors for a given request
4
- *
5
- * @package Braintree
6
- * @subpackage Error
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * collection of errors enumerating all validation errors for a given request
12
- *
13
- * <b>== More information ==</b>
14
- *
15
- * For more detailed information on Validation errors, see {@link http://www.braintreepayments.com/gateway/validation-errors http://www.braintreepaymentsolutions.com/gateway/validation-errors}
16
- *
17
- * @package Braintree
18
- * @subpackage Error
19
- * @copyright 2010 Braintree Payment Solutions
20
- *
21
- * @property-read array $errors
22
- * @property-read array $nested
23
- */
24
- class Braintree_Error_ValidationErrorCollection extends Braintree_Collection
25
- {
26
- private $_errors = array();
27
- private $_nested = array();
28
-
29
- /**
30
- * @ignore
31
- */
32
- public function __construct($data)
33
- {
34
- foreach($data AS $key => $errorData)
35
- // map errors to new collections recursively
36
- if ($key == 'errors') {
37
- foreach ($errorData AS $error) {
38
- $this->_errors[] = new Braintree_Error_Validation($error);
39
- }
40
- } else {
41
- $this->_nested[$key] = new Braintree_Error_ValidationErrorCollection($errorData);
42
- }
43
-
44
- }
45
-
46
- public function deepAll()
47
- {
48
- $validationErrors = array_merge(array(), $this->_errors);
49
- foreach($this->_nested as $nestedErrors)
50
- {
51
- $validationErrors = array_merge($validationErrors, $nestedErrors->deepAll());
52
- }
53
- return $validationErrors;
54
- }
55
-
56
- public function deepSize()
57
- {
58
- $total = sizeof($this->_errors);
59
- foreach($this->_nested as $_nestedErrors)
60
- {
61
- $total = $total + $_nestedErrors->deepSize();
62
- }
63
- return $total;
64
- }
65
-
66
- public function forIndex($index)
67
- {
68
- return $this->forKey("index" . $index);
69
- }
70
-
71
- public function forKey($key)
72
- {
73
- return isset($this->_nested[$key]) ? $this->_nested[$key] : null;
74
- }
75
-
76
- public function onAttribute($attribute)
77
- {
78
- $matches = array();
79
- foreach ($this->_errors AS $key => $error) {
80
- if($error->attribute == $attribute) {
81
- $matches[] = $error;
82
- }
83
- }
84
- return $matches;
85
- }
86
-
87
-
88
- public function shallowAll()
89
- {
90
- return $this->_errors;
91
- }
92
-
93
- /**
94
- *
95
- * @ignore
96
- */
97
- public function __get($name)
98
- {
99
- $varName = "_$name";
100
- return isset($this->$varName) ? $this->$varName : null;
101
- }
102
-
103
- /**
104
- * @ignore
105
- */
106
- public function __toString()
107
- {
108
- $output = array();
109
-
110
- // TODO: implement scope
111
- if (!empty($this->_errors)) {
112
- $output[] = $this->_inspect($this->_errors);
113
- }
114
- if (!empty($this->_nested)) {
115
- foreach ($this->_nested AS $key => $values) {
116
- $output[] = $this->_inspect($this->_nested);
117
- }
118
- }
119
- return join(', ', $output);
120
- }
121
-
122
- /**
123
- * @ignore
124
- */
125
- private function _inspect($errors, $scope = null)
126
- {
127
- $eOutput = '[' . __CLASS__ . '/errors:[';
128
- foreach($errors AS $error => $errorObj) {
129
- $outputErrs[] = "({$errorObj->error['code']} {$errorObj->error['message']})";
130
- }
131
- $eOutput .= join(', ', $outputErrs) . ']]';
132
-
133
- return $eOutput;
134
- }
135
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * super class for all Braintree exceptions
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
-
11
- /**
12
- * super class for all Braintree exceptions
13
- *
14
- * @package Braintree
15
- * @subpackage Exception
16
- * @copyright 2010 Braintree Payment Solutions
17
- */
18
- class Braintree_Exception extends Exception
19
- {
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/Authentication.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when authentication fails
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when authentication fails.
12
- * This may be caused by an incorrect Braintree_Configuration
13
- *
14
- * @package Braintree
15
- * @subpackage Exception
16
- * @copyright 2010 Braintree Payment Solutions
17
- */
18
- class Braintree_Exception_Authentication extends Braintree_Exception
19
- {
20
-
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/Authorization.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when authorization fails
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
-
11
- /**
12
- * Raised when the API key being used is not authorized to perform
13
- * the attempted action according to the roles assigned to the user
14
- * who owns the API key.
15
- *
16
- * @package Braintree
17
- * @subpackage Exception
18
- * @copyright 2010 Braintree Payment Solutions
19
- */
20
- class Braintree_Exception_Authorization extends Braintree_Exception
21
- {
22
-
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/Configuration.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * raised when the Braintree library is not completely configured
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when the Braintree library is not completely configured.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @see Braintree_Configuration
16
- */
17
- class Braintree_Exception_Configuration extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/DownForMaintenance.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when the gateway is down for maintenance
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when the gateway is down for maintenance.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2010 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_DownForMaintenance extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/ForgedQueryString.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when a suspected forged query string is present
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised from methods that confirm transparent request requests
12
- * when the given query string cannot be verified. This may indicate
13
- * an attempted hack on the merchant's transparent redirect
14
- * confirmation URL.
15
- *
16
- * @package Braintree
17
- * @subpackage Exception
18
- * @copyright 2010 Braintree Payment Solutions
19
- */
20
- class Braintree_Exception_ForgedQueryString extends Braintree_Exception
21
- {
22
-
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/InvalidSignature.php DELETED
@@ -1,5 +0,0 @@
1
- <?php
2
- class Braintree_Exception_InvalidSignature extends Braintree_Exception
3
- {
4
-
5
- }
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/NotFound.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when a record coult not be found
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when a record could not be found.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2010 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_NotFound extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/SSLCaFileNotFound.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when the SSL CaFile is not found.
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2011 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when the SSL CaFile is not found.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2011 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_SSLCaFileNotFound extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/SSLCertificate.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when the SSL certificate fails verification.
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when the SSL certificate fails verification.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2010 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_SSLCertificate extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/ServerError.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when an unexpected server error occurs.
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when an unexpected server error occurs.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2010 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_ServerError extends Braintree_Exception
18
- {
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/Unexpected.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when an unexpected error occurs
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised when an error occurs that the client library is not built to handle.
12
- * This shouldn't happen.
13
- *
14
- * @package Braintree
15
- * @subpackage Exception
16
- * @copyright 2010 Braintree Payment Solutions
17
- */
18
- class Braintree_Exception_Unexpected extends Braintree_Exception
19
- {
20
-
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/UpgradeRequired.php DELETED
@@ -1,12 +0,0 @@
1
- <?php
2
- /**
3
- * Raised when a client library must be upgraded.
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
- class Braintree_Exception_UpgradeRequired extends Braintree_Exception
10
- {
11
-
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Exception/ValidationsFailed.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
- /**
3
- * Raised from non-validating exceptions when validations fail
4
- *
5
- * @package Braintree
6
- * @subpackage Exception
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Raised from non-validating methods when gateway validations fail.
12
- *
13
- * @package Braintree
14
- * @subpackage Exception
15
- * @copyright 2010 Braintree Payment Solutions
16
- */
17
- class Braintree_Exception_ValidationsFailed extends Braintree_Exception
18
- {
19
-
20
- }
21
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Http.php DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree HTTP Client
4
- *
5
- * @copyright 2010 Braintree Payment Solutions
6
- */
7
-
8
- /**
9
- * processes Http requests using curl
10
- *
11
- * @copyright 2010 Braintree Payment Solutions
12
- */
13
- class Braintree_Http
14
- {
15
- public static function delete($path)
16
- {
17
- $response = self::_doRequest('DELETE', $path);
18
- if($response['status'] === 200) {
19
- return true;
20
- } else {
21
- Braintree_Util::throwStatusCodeException($response['status']);
22
- }
23
- }
24
-
25
- public static function get($path)
26
- {
27
- $response = self::_doRequest('GET', $path);
28
- if($response['status'] === 200) {
29
- return Braintree_Xml::buildArrayFromXml($response['body']);
30
- } else {
31
- Braintree_Util::throwStatusCodeException($response['status']);
32
- }
33
- }
34
-
35
- public static function post($path, $params = null)
36
- {
37
- $response = self::_doRequest('POST', $path, self::_buildXml($params));
38
- $responseCode = $response['status'];
39
- if($responseCode === 200 || $responseCode === 201 || $responseCode === 422) {
40
- return Braintree_Xml::buildArrayFromXml($response['body']);
41
- } else {
42
- Braintree_Util::throwStatusCodeException($responseCode);
43
- }
44
- }
45
-
46
- public static function put($path, $params = null)
47
- {
48
- $response = self::_doRequest('PUT', $path, self::_buildXml($params));
49
- $responseCode = $response['status'];
50
- if($responseCode === 200 || $responseCode === 201 || $responseCode === 422) {
51
- return Braintree_Xml::buildArrayFromXml($response['body']);
52
- } else {
53
- Braintree_Util::throwStatusCodeException($responseCode);
54
- }
55
- }
56
-
57
- private static function _buildXml($params)
58
- {
59
- return empty($params) ? null : Braintree_Xml::buildXmlFromArray($params);
60
- }
61
-
62
- private static function _doRequest($httpVerb, $path, $requestBody = null)
63
- {
64
- $curl = curl_init();
65
- curl_setopt($curl, CURLOPT_TIMEOUT, 60);
66
- curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $httpVerb);
67
- curl_setopt($curl, CURLOPT_URL, Braintree_Configuration::merchantUrl() . $path);
68
- curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
69
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
70
- 'Accept: application/xml',
71
- 'Content-Type: application/xml',
72
- 'User-Agent: Braintree PHP Library ' . Braintree_Version::get(),
73
- 'X-ApiVersion: ' . Braintree_Configuration::API_VERSION
74
- ));
75
- curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
76
- curl_setopt($curl, CURLOPT_USERPWD, Braintree_Configuration::publicKey() . ':' . Braintree_Configuration::privateKey());
77
- // curl_setopt($curl, CURLOPT_VERBOSE, true);
78
- if (Braintree_Configuration::sslOn()) {
79
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
80
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
81
- curl_setopt($curl, CURLOPT_CAINFO, Braintree_Configuration::caFile());
82
- }
83
-
84
- if(!empty($requestBody)) {
85
- curl_setopt($curl, CURLOPT_POSTFIELDS, $requestBody);
86
- }
87
-
88
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
89
- $response = curl_exec($curl);
90
- $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
91
- curl_close($curl);
92
- if (Braintree_Configuration::sslOn()) {
93
- if ($httpStatus == 0) {
94
- throw new Braintree_Exception_SSLCertificate();
95
- }
96
- }
97
- return array('status' => $httpStatus, 'body' => $response);
98
- }
99
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Instance.php DELETED
@@ -1,70 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Class Instance template
4
- *
5
- * @package Braintree
6
- * @subpackage Utility
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * abstract instance template for various objects
12
- *
13
- * @package Braintree
14
- * @subpackage Utility
15
- * @copyright 2010 Braintree Payment Solutions
16
- * @abstract
17
- */
18
- abstract class Braintree_Instance
19
- {
20
- /**
21
- *
22
- * @param array $aAttribs
23
- */
24
- public function __construct($attributes)
25
- {
26
- if (!empty($attributes)) {
27
- $this->_initializeFromArray($attributes);
28
- }
29
- }
30
-
31
-
32
- /**
33
- * returns private/nonexistent instance properties
34
- * @access public
35
- * @param var $name property name
36
- * @return mixed contents of instance properties
37
- */
38
- public function __get($name)
39
- {
40
- if (array_key_exists($name, $this->_attributes)) {
41
- return $this->_attributes[$name];
42
- } else {
43
- trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE);
44
- return null;
45
- }
46
- }
47
-
48
- /**
49
- * create a printable representation of the object as:
50
- * ClassName[property=value, property=value]
51
- * @return var
52
- */
53
- public function __toString()
54
- {
55
- $objOutput = Braintree_Util::implodeAssociativeArray($this->_attributes);
56
- return get_class($this) .'['.$objOutput.']';
57
- }
58
- /**
59
- * initializes instance properties from the keys/values of an array
60
- * @ignore
61
- * @access protected
62
- * @param <type> $aAttribs array of properties to set - single level
63
- * @return none
64
- */
65
- private function _initializeFromArray($attributes)
66
- {
67
- $this->_attributes = $attributes;
68
- }
69
-
70
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/IsNode.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
- class Braintree_IsNode
4
- {
5
- function __construct($name)
6
- {
7
- $this->name = $name;
8
- $this->searchTerms = array();
9
- }
10
-
11
- function is($value)
12
- {
13
- $this->searchTerms['is'] = strval($value);
14
- return $this;
15
- }
16
-
17
- function toParam()
18
- {
19
- return $this->searchTerms;
20
- }
21
- }
22
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/KeyValueNode.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
- class Braintree_KeyValueNode
4
- {
5
- function __construct($name)
6
- {
7
- $this->name = $name;
8
- $this->searchTerm = True;
9
-
10
- }
11
-
12
- function is($value)
13
- {
14
- $this->searchTerm = $value;
15
- return $this;
16
- }
17
-
18
- function toParam()
19
- {
20
- return $this->searchTerm;
21
- }
22
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Modification.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
- class Braintree_Modification extends Braintree
3
- {
4
- protected function _initialize($attributes)
5
- {
6
- $this->_attributes = $attributes;
7
-
8
- $addOnArray = array();
9
- if (isset($attributes['addOns'])) {
10
- foreach ($attributes['addOns'] AS $addOn) {
11
- $addOnArray[] = Braintree_addOn::factory($addOn);
12
- }
13
- }
14
- $this->_attributes['addOns'] = $addOnArray;
15
- }
16
-
17
- public static function factory($attributes)
18
- {
19
- $instance = new self();
20
- $instance->_initialize($attributes);
21
- return $instance;
22
- }
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/MultipleValueNode.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
-
3
- class Braintree_MultipleValueNode
4
- {
5
- function __construct($name, $allowedValues = array())
6
- {
7
- $this->name = $name;
8
- $this->items = array();
9
- $this->allowedValues = $allowedValues;
10
- }
11
-
12
- function in($values)
13
- {
14
- $bad_values = array_diff($values, $this->allowedValues);
15
- if (count($this->allowedValues) > 0 && count($bad_values) > 0) {
16
- $message = 'Invalid argument(s) for ' . $this->name . ':';
17
- foreach ($bad_values AS $bad_value) {
18
- $message .= ' ' . $bad_value;
19
- }
20
-
21
- throw new InvalidArgumentException($message);
22
- }
23
-
24
- $this->items = $values;
25
- return $this;
26
- }
27
-
28
- function is($value)
29
- {
30
- return $this->in(array($value));
31
- }
32
-
33
- function toParam()
34
- {
35
- return $this->items;
36
- }
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/MultipleValueOrTextNode.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
-
3
- class Braintree_MultipleValueOrTextNode extends Braintree_MultipleValueNode
4
- {
5
- function __construct($name)
6
- {
7
- parent::__construct($name);
8
- $this->textNode = new Braintree_TextNode($name);
9
- }
10
-
11
- function contains($value)
12
- {
13
- $this->textNode->contains($value);
14
- return $this;
15
- }
16
-
17
- function endsWith($value)
18
- {
19
- $this->textNode->endsWith($value);
20
- return $this;
21
- }
22
-
23
- function is($value)
24
- {
25
- $this->textNode->is($value);
26
- return $this;
27
- }
28
-
29
- function isNot($value)
30
- {
31
- $this->textNode->isNot($value);
32
- return $this;
33
- }
34
-
35
- function startsWith($value)
36
- {
37
- $this->textNode->startsWith($value);
38
- return $this;
39
- }
40
-
41
- function toParam()
42
- {
43
- return array_merge(parent::toParam(), $this->textNode->toParam());
44
- }
45
- }
46
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/PartialMatchNode.php DELETED
@@ -1,16 +0,0 @@
1
- <?php
2
-
3
- class Braintree_PartialMatchNode extends Braintree_EqualityNode
4
- {
5
- function startsWith($value)
6
- {
7
- $this->searchTerms["starts_with"] = strval($value);
8
- return $this;
9
- }
10
-
11
- function endsWith($value)
12
- {
13
- $this->searchTerms["ends_with"] = strval($value);
14
- return $this;
15
- }
16
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Plan.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
- class Braintree_Plan extends Braintree
3
- {
4
- public static function all()
5
- {
6
- $response = Braintree_Http::get('/plans');
7
- if (key_exists('plans', $response)){
8
- $plans = array("plan" => $response['plans']);
9
- } else {
10
- $plans = array("plan" => array());
11
- }
12
-
13
- return Braintree_Util::extractAttributeAsArray(
14
- $plans,
15
- 'plan'
16
- );
17
- }
18
-
19
- public static function factory($attributes)
20
- {
21
- $instance = new self();
22
- $instance->_initialize($attributes);
23
-
24
- return $instance;
25
- }
26
-
27
- protected function _initialize($attributes)
28
- {
29
- $this->_attributes = $attributes;
30
-
31
- $addOnArray = array();
32
- if (isset($attributes['addOns'])) {
33
- foreach ($attributes['addOns'] AS $addOn) {
34
- $addOnArray[] = Braintree_AddOn::factory($addOn);
35
- }
36
- }
37
- $this->_attributes['addOns'] = $addOnArray;
38
-
39
- $discountArray = array();
40
- if (isset($attributes['discounts'])) {
41
- foreach ($attributes['discounts'] AS $discount) {
42
- $discountArray[] = Braintree_Discount::factory($discount);
43
- }
44
- }
45
- $this->_attributes['discounts'] = $discountArray;
46
-
47
- $planArray = array();
48
- if (isset($attributes['plans'])) {
49
- foreach ($attributes['plans'] AS $plan) {
50
- $planArray[] = Braintree_Plan::factory($plan);
51
- }
52
- }
53
- $this->_attributes['plans'] = $planArray;
54
- }
55
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/RangeNode.php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
-
3
- class Braintree_RangeNode
4
- {
5
- function __construct($name)
6
- {
7
- $this->name = $name;
8
- $this->searchTerms = array();
9
- }
10
-
11
- function greaterThanOrEqualTo($value)
12
- {
13
- $this->searchTerms['min'] = $value;
14
- return $this;
15
- }
16
-
17
- function lessThanOrEqualTo($value)
18
- {
19
- $this->searchTerms['max'] = $value;
20
- return $this;
21
- }
22
-
23
- function is($value)
24
- {
25
- $this->searchTerms['is'] = $value;
26
- return $this;
27
- }
28
-
29
- function between($min, $max)
30
- {
31
- return $this->greaterThanOrEqualTo($min)->lessThanOrEqualTo($max);
32
- }
33
-
34
- function toParam()
35
- {
36
- return $this->searchTerms;
37
- }
38
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/ResourceCollection.php DELETED
@@ -1,148 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree ResourceCollection
4
- *
5
- * @package Braintree
6
- * @subpackage Utility
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * ResourceCollection is a container object for result data
12
- *
13
- * stores and retrieves search results and aggregate data
14
- *
15
- * example:
16
- * <code>
17
- * $result = Braintree_Customer::all();
18
- *
19
- * foreach($result as $transaction) {
20
- * print_r($transaction->id);
21
- * }
22
- * </code>
23
- *
24
- * @package Braintree
25
- * @subpackage Utility
26
- * @copyright 2010 Braintree Payment Solutions
27
- */
28
- class Braintree_ResourceCollection implements Iterator
29
- {
30
- private $_index;
31
- private $_batchIndex;
32
- private $_items;
33
- private $_pageSize;
34
- private $_pager;
35
-
36
- /**
37
- * set up the resource collection
38
- *
39
- * expects an array of attributes with literal keys
40
- *
41
- * @param array $attributes
42
- * @param array $pagerAttribs
43
- */
44
- public function __construct($response, $pager)
45
- {
46
- $this->_pageSize = $response["searchResults"]["pageSize"];
47
- $this->_ids = $response["searchResults"]["ids"];
48
- $this->_pager = $pager;
49
- }
50
-
51
- /**
52
- * returns the current item when iterating with foreach
53
- */
54
- public function current()
55
- {
56
- return $this->_items[$this->_index];
57
- }
58
-
59
- /**
60
- * returns the first item in the collection
61
- *
62
- * @return mixed
63
- */
64
- public function firstItem()
65
- {
66
- $ids = $this->_ids;
67
- $page = $this->_getPage(array($ids[0]));
68
- return $page[0];
69
- }
70
-
71
- public function key()
72
- {
73
- return null;
74
- }
75
-
76
- /**
77
- * advances to the next item in the collection when iterating with foreach
78
- */
79
- public function next()
80
- {
81
- ++$this->_index;
82
- }
83
-
84
- /**
85
- * rewinds thtestIterateOverResultse collection to the first item when iterating with foreach
86
- */
87
- public function rewind()
88
- {
89
- $this->_batchIndex = 0;
90
- $this->_getNextPage();
91
- }
92
-
93
- /**
94
- * returns whether the current item is valid when iterating with foreach
95
- */
96
- public function valid()
97
- {
98
- if ($this->_index == count($this->_items) && $this->_batchIndex < count($this->_ids)) {
99
- $this->_getNextPage();
100
- }
101
-
102
- if ($this->_index < count($this->_items)) {
103
- return true;
104
- } else {
105
- return false;
106
- }
107
- }
108
-
109
- public function maximumCount()
110
- {
111
- return count($this->_ids);
112
- }
113
-
114
- private function _getNextPage()
115
- {
116
- if (empty($this->_ids))
117
- {
118
- $this->_items = array();
119
- }
120
- else
121
- {
122
- $this->_items = $this->_getPage(array_slice($this->_ids, $this->_batchIndex, $this->_pageSize));
123
- $this->_batchIndex += $this->_pageSize;
124
- $this->_index = 0;
125
- }
126
- }
127
-
128
- /**
129
- * requests the next page of results for the collection
130
- *
131
- * @return none
132
- */
133
- private function _getPage($ids)
134
- {
135
- $className = $this->_pager['className'];
136
- $classMethod = $this->_pager['classMethod'];
137
- $methodArgs = array();
138
- foreach ($this->_pager['methodArgs'] as $arg) {
139
- array_push($methodArgs, $arg);
140
- }
141
- array_push($methodArgs, $ids);
142
-
143
- return call_user_func_array(
144
- array($className, $classMethod),
145
- $methodArgs
146
- );
147
- }
148
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Result/CreditCardVerification.php DELETED
@@ -1,86 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Credit Card Verification Result
4
- *
5
- * @package Braintree
6
- * @subpackage Result
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Braintree Credit Card Verification Result
12
- *
13
- * This object is returned as part of an Error Result; it provides
14
- * access to the credit card verification data from the gateway
15
- *
16
- *
17
- * @package Braintree
18
- * @subpackage Result
19
- * @copyright 2010 Braintree Payment Solutions
20
- *
21
- * @property-read string $avsErrorResponseCode
22
- * @property-read string $avsPostalCodeResponseCode
23
- * @property-read string $avsStreetAddressResponseCode
24
- * @property-read string $cvvResponseCode
25
- * @property-read string $status
26
- *
27
- */
28
- class Braintree_Result_CreditCardVerification
29
- {
30
- // Status
31
- const FAILED = 'failed';
32
- const GATEWAY_REJECTED = 'gateway_rejected';
33
- const PROCESSOR_DECLINED = 'processor_declined';
34
- const VERIFIED = 'verified';
35
-
36
- private $_attributes;
37
- private $_avsErrorResponseCode;
38
- private $_avsPostalCodeResponseCode;
39
- private $_avsStreetAddressResponseCode;
40
- private $_cvvResponseCode;
41
- private $_gatewayRejectionReason;
42
- private $_status;
43
-
44
- /**
45
- * @ignore
46
- */
47
- public function __construct($attributes)
48
- {
49
- $this->_initializeFromArray($attributes);
50
- }
51
- /**
52
- * initializes instance properties from the keys/values of an array
53
- * @ignore
54
- * @access protected
55
- * @param <type> $aAttribs array of properties to set - single level
56
- * @return none
57
- */
58
- private function _initializeFromArray($attributes)
59
- {
60
- $this->_attributes = $attributes;
61
- foreach($attributes AS $name => $value) {
62
- $varName = "_$name";
63
- $this->$varName = $value;
64
- // $this->$varName = Braintree_Util::delimiterToCamelCase($value, '_');
65
- }
66
- }
67
- /**
68
- *
69
- * @ignore
70
- */
71
- public function __get($name)
72
- {
73
- $varName = "_$name";
74
- return isset($this->$varName) ? $this->$varName : null;
75
- }
76
-
77
- /**
78
- * returns a string representation of the customer
79
- * @return string
80
- */
81
- public function __toString()
82
- {
83
- return __CLASS__ . '[' .
84
- Braintree_Util::attributesToString($this->_attributes) .']';
85
- }
86
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Result/Error.php DELETED
@@ -1,107 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Error Result
4
- *
5
- * @package Braintree
6
- * @subpackage Result
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Braintree Error Result
12
- *
13
- * An Error Result will be returned from gateway methods when
14
- * the gateway responds with an error. It will provide access
15
- * to the original request.
16
- * For example, when voiding a transaction, Error Result will
17
- * respond to the void request if it failed:
18
- *
19
- * <code>
20
- * $result = Braintree_Transaction::void('abc123');
21
- * if ($result->success) {
22
- * // Successful Result
23
- * } else {
24
- * // Braintree_Result_Error
25
- * }
26
- * </code>
27
- *
28
- * @package Braintree
29
- * @subpackage Result
30
- * @copyright 2010 Braintree Payment Solutions
31
- *
32
- * @property-read array $params original passed params
33
- * @property-read object $errors Braintree_Error_ErrorCollection
34
- * @property-read object $creditCardVerification credit card verification data
35
- */
36
- class Braintree_Result_Error extends Braintree
37
- {
38
- /**
39
- *
40
- * @var boolean always false
41
- */
42
- public $success = false;
43
-
44
- /**
45
- * return original value for a field
46
- * For example, if a user tried to submit 'invalid-email' in the html field transaction[customer][email],
47
- * $result->valueForHtmlField("transaction[customer][email]") would yield "invalid-email"
48
- *
49
- * @param string $field
50
- * @return string
51
- */
52
- public function valueForHtmlField($field)
53
- {
54
- $pieces = preg_split("/[\[\]]+/", $field, 0, PREG_SPLIT_NO_EMPTY);
55
- $params = $this->params;
56
- foreach(array_slice($pieces, 0, -1) as $key) {
57
- $params = $params[Braintree_Util::delimiterToCamelCase($key)];
58
- }
59
- $finalKey = Braintree_Util::delimiterToCamelCase(end($pieces));
60
- $fieldValue = isset($params[$finalKey]) ? $params[$finalKey] : null;
61
- return $fieldValue;
62
- }
63
-
64
- /**
65
- * overrides default constructor
66
- * @ignore
67
- * @param array $response gateway response array
68
- */
69
- public function __construct($response)
70
- {
71
- $this->_attributes = $response;
72
- $this->_set('errors', new Braintree_Error_ErrorCollection($response['errors']));
73
-
74
- if(isset($response['verification'])) {
75
- $this->_set('creditCardVerification', new Braintree_Result_CreditCardVerification($response['verification']));
76
- } else {
77
- $this->_set('creditCardVerification', null);
78
- }
79
-
80
- if(isset($response['transaction'])) {
81
- $this->_set('transaction', Braintree_Transaction::factory($response['transaction']));
82
- } else {
83
- $this->_set('transaction', null);
84
- }
85
-
86
- if(isset($response['subscription'])) {
87
- $this->_set('subscription', Braintree_Subscription::factory($response['subscription']));
88
- } else {
89
- $this->_set('subscription', null);
90
- }
91
- }
92
-
93
- /**
94
- * create a printable representation of the object as:
95
- * ClassName[property=value, property=value]
96
- * @ignore
97
- * @return var
98
- */
99
- public function __toString()
100
- {
101
- $output = Braintree_Util::attributesToString($this->_attributes);
102
- if (isset($this->_creditCardVerification)) {
103
- $output .= sprintf('%s', $this->_creditCardVerification);
104
- }
105
- return __CLASS__ .'['.$output.']';
106
- }
107
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Result/Successful.php DELETED
@@ -1,78 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Successful Result
4
- *
5
- * @package Braintree
6
- * @subpackage Result
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Braintree Successful Result
12
- *
13
- * A Successful Result will be returned from gateway methods when
14
- * validations pass. It will provide access to the created resource.
15
- *
16
- * For example, when creating a customer, Braintree_Result_Successful will
17
- * respond to <b>customer</b> like so:
18
- *
19
- * <code>
20
- * $result = Braintree_Customer::create(array('first_name' => "John"));
21
- * if ($result->success) {
22
- * // Braintree_Result_Successful
23
- * echo "Created customer {$result->customer->id}";
24
- * } else {
25
- * // Braintree_Result_Error
26
- * }
27
- * </code>
28
- *
29
- *
30
- * @package Braintree
31
- * @subpackage Result
32
- * @copyright 2010 Braintree Payment Solutions
33
- */
34
- class Braintree_Result_Successful extends Braintree_Instance
35
- {
36
- /**
37
- *
38
- * @var boolean always true
39
- */
40
- public $success = true;
41
- /**
42
- *
43
- * @var string stores the internal name of the object providing access to
44
- */
45
- private $_returnObjectName;
46
-
47
- /**
48
- * @ignore
49
- * @param string $classToReturn name of class to instantiate
50
- */
51
- public function __construct($objToReturn = null)
52
- {
53
- if(!empty($objToReturn)) {
54
- // get a lowercase direct name for the property
55
- $property = Braintree_Util::cleanClassName(
56
- get_class($objToReturn)
57
- );
58
- // save the name for indirect access
59
- $this->_returnObjectName = $property;
60
-
61
- // create the property!
62
- $this->$property = $objToReturn;
63
- }
64
- }
65
-
66
-
67
- /**
68
- *
69
- * @ignore
70
- * @return string string representation of the object's structure
71
- */
72
- public function __toString()
73
- {
74
- $returnObject = $this->_returnObjectName;
75
- return __CLASS__ . '['.$this->$returnObject->__toString().']';
76
- }
77
-
78
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/SettlementBatchSummary.php DELETED
@@ -1,74 +0,0 @@
1
- <?php
2
- class Braintree_SettlementBatchSummary extends Braintree
3
- {
4
- public static function generate($settlement_date, $groupByCustomField = NULL)
5
- {
6
- $criteria = array('settlement_date' => $settlement_date);
7
- if (isset($groupByCustomField))
8
- {
9
- $criteria['group_by_custom_field'] = $groupByCustomField;
10
- }
11
- $params = array('settlement_batch_summary' => $criteria);
12
- $response = Braintree_Http::post('/settlement_batch_summary', $params);
13
-
14
- if (isset($groupByCustomField))
15
- {
16
- $response['settlementBatchSummary']['records'] = self::_underscoreCustomField(
17
- $groupByCustomField,
18
- $response['settlementBatchSummary']['records']
19
- );
20
- }
21
-
22
- return self::_verifyGatewayResponse($response);
23
- }
24
-
25
- private static function _underscoreCustomField($groupByCustomField, $records)
26
- {
27
- $updatedRecords = array();
28
-
29
- foreach ($records as $record)
30
- {
31
- $camelized = Braintree_Util::delimiterToCamelCase($groupByCustomField);
32
- $record[$groupByCustomField] = $record[$camelized];
33
- unset($record[$camelized]);
34
- $updatedRecords[] = $record;
35
- }
36
-
37
- return $updatedRecords;
38
- }
39
-
40
- private static function _verifyGatewayResponse($response)
41
- {
42
- if (isset($response['settlementBatchSummary'])) {
43
- return new Braintree_Result_Successful(
44
- self::factory($response['settlementBatchSummary'])
45
- );
46
- } else if (isset($response['apiErrorResponse'])) {
47
- return new Braintree_Result_Error($response['apiErrorResponse']);
48
- } else {
49
- throw new Braintree_Exception_Unexpected(
50
- "Expected settlementBatchSummary or apiErrorResponse"
51
- );
52
- }
53
- }
54
-
55
- public static function factory($attributes)
56
- {
57
- $instance = new self();
58
- $instance->_initialize($attributes);
59
- return $instance;
60
- }
61
-
62
- /**
63
- * @ignore
64
- */
65
- protected function _initialize($attributes)
66
- {
67
- $this->_attributes = $attributes;
68
- }
69
-
70
- public function records()
71
- {
72
- return $this->_attributes['records'];
73
- }
74
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Subscription.php DELETED
@@ -1,256 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Subscription module
4
- *
5
- * <b>== More information ==</b>
6
- *
7
- * For more detailed information on Subscriptions, see {@link http://www.braintreepayments.com/gateway/subscription-api http://www.braintreepaymentsolutions.com/gateway/subscription-api}
8
- *
9
- * PHP Version 5
10
- *
11
- * @package Braintree
12
- * @copyright 2010 Braintree Payment Solutions
13
- */
14
- class Braintree_Subscription extends Braintree
15
- {
16
- const ACTIVE = 'Active';
17
- const CANCELED = 'Canceled';
18
- const EXPIRED = 'Expired';
19
- const PAST_DUE = 'Past Due';
20
- const PENDING = 'Pending';
21
-
22
- public static function create($attributes)
23
- {
24
- Braintree_Util::verifyKeys(self::_createSignature(), $attributes);
25
- $response = Braintree_Http::post('/subscriptions', array('subscription' => $attributes));
26
- return self::_verifyGatewayResponse($response);
27
- }
28
-
29
- /**
30
- * @ignore
31
- */
32
- public static function factory($attributes)
33
- {
34
- $instance = new self();
35
- $instance->_initialize($attributes);
36
-
37
- return $instance;
38
- }
39
-
40
- public static function find($id)
41
- {
42
- self::_validateId($id);
43
-
44
- try {
45
- $response = Braintree_Http::get('/subscriptions/' . $id);
46
- return self::factory($response['subscription']);
47
- } catch (Braintree_Exception_NotFound $e) {
48
- throw new Braintree_Exception_NotFound('subscription with id ' . $id . ' not found');
49
- }
50
-
51
- }
52
-
53
- public static function search($query)
54
- {
55
- $criteria = array();
56
- foreach ($query as $term) {
57
- $criteria[$term->name] = $term->toparam();
58
- }
59
-
60
-
61
- $response = braintree_http::post('/subscriptions/advanced_search_ids', array('search' => $criteria));
62
- $pager = array(
63
- 'className' => __CLASS__,
64
- 'classMethod' => 'fetch',
65
- 'methodArgs' => array($query)
66
- );
67
-
68
- return new Braintree_ResourceCollection($response, $pager);
69
- }
70
-
71
- public static function fetch($query, $ids)
72
- {
73
- $criteria = array();
74
- foreach ($query as $term) {
75
- $criteria[$term->name] = $term->toparam();
76
- }
77
- $criteria["ids"] = Braintree_SubscriptionSearch::ids()->in($ids)->toparam();
78
- $response = Braintree_Http::post('/subscriptions/advanced_search', array('search' => $criteria));
79
-
80
- return Braintree_Util::extractAttributeAsArray(
81
- $response['subscriptions'],
82
- 'subscription'
83
- );
84
- }
85
-
86
- public static function update($subscriptionId, $attributes)
87
- {
88
- Braintree_Util::verifyKeys(self::_updateSignature(), $attributes);
89
- $response = Braintree_Http::put(
90
- '/subscriptions/' . $subscriptionId,
91
- array('subscription' => $attributes)
92
- );
93
- return self::_verifyGatewayResponse($response);
94
- }
95
-
96
- public static function retryCharge($subscriptionId, $amount = null)
97
- {
98
- $transaction_params = array('type' => Braintree_Transaction::SALE,
99
- 'subscriptionId' => $subscriptionId);
100
- if (isset($amount)) {
101
- $transaction_params['amount'] = $amount;
102
- }
103
-
104
- $response = Braintree_Http::post(
105
- '/transactions',
106
- array('transaction' => $transaction_params));
107
- return self::_verifyGatewayResponse($response);
108
- }
109
-
110
- public static function cancel($subscriptionId)
111
- {
112
- $response = Braintree_Http::put('/subscriptions/' . $subscriptionId . '/cancel');
113
- return self::_verifyGatewayResponse($response);
114
- }
115
-
116
- private static function _createSignature()
117
- {
118
- return array_merge(
119
- array(
120
- 'billingDayOfMonth',
121
- 'firstBillingDate',
122
- 'id',
123
- 'merchantAccountId',
124
- 'neverExpires',
125
- 'numberOfBillingCycles',
126
- 'paymentMethodToken',
127
- 'planId',
128
- 'price',
129
- 'trialDuration',
130
- 'trialDurationUnit',
131
- 'trialPeriod',
132
- array('descriptor' => array('name', 'phone')),
133
- array('options' => array('doNotInheritAddOnsOrDiscounts', 'startImmediately')),
134
- ),
135
- self::_addOnDiscountSignature()
136
- );
137
- }
138
-
139
- private static function _updateSignature()
140
- {
141
- return array_merge(
142
- array(
143
- 'merchantAccountId', 'numberOfBillingCycles', 'paymentMethodToken', 'planId',
144
- 'id', 'neverExpires', 'price',
145
- array('descriptor' => array('name', 'phone')),
146
- array('options' => array('prorateCharges', 'replaceAllAddOnsAndDiscounts', 'revertSubscriptionOnProrationFailure')),
147
- ),
148
- self::_addOnDiscountSignature()
149
- );
150
- }
151
-
152
- private static function _addOnDiscountSignature()
153
- {
154
- return array(
155
- array(
156
- 'addOns' => array(
157
- array('add' => array('amount', 'inheritedFromId', 'neverExpires', 'numberOfBillingCycles', 'quantity')),
158
- array('update' => array('amount', 'existingId', 'neverExpires', 'numberOfBillingCycles', 'quantity')),
159
- array('remove' => array('_anyKey_')),
160
- )
161
- ),
162
- array(
163
- 'discounts' => array(
164
- array('add' => array('amount', 'inheritedFromId', 'neverExpires', 'numberOfBillingCycles', 'quantity')),
165
- array('update' => array('amount', 'existingId', 'neverExpires', 'numberOfBillingCycles', 'quantity')),
166
- array('remove' => array('_anyKey_')),
167
- )
168
- )
169
- );
170
- }
171
-
172
- /**
173
- * @ignore
174
- */
175
- protected function _initialize($attributes)
176
- {
177
- $this->_attributes = $attributes;
178
-
179
- $addOnArray = array();
180
- if (isset($attributes['addOns'])) {
181
- foreach ($attributes['addOns'] AS $addOn) {
182
- $addOnArray[] = Braintree_AddOn::factory($addOn);
183
- }
184
- }
185
- $this->_attributes['addOns'] = $addOnArray;
186
-
187
- $discountArray = array();
188
- if (isset($attributes['discounts'])) {
189
- foreach ($attributes['discounts'] AS $discount) {
190
- $discountArray[] = Braintree_Discount::factory($discount);
191
- }
192
- }
193
- $this->_attributes['discounts'] = $discountArray;
194
-
195
- if (isset($attributes['descriptor'])) {
196
- $this->_set('descriptor', new Braintree_Descriptor($attributes['descriptor']));
197
- }
198
-
199
- $transactionArray = array();
200
- if (isset($attributes['transactions'])) {
201
- foreach ($attributes['transactions'] AS $transaction) {
202
- $transactionArray[] = Braintree_Transaction::factory($transaction);
203
- }
204
- }
205
- $this->_attributes['transactions'] = $transactionArray;
206
- }
207
-
208
- /**
209
- * @ignore
210
- */
211
- private static function _validateId($id = null) {
212
- if (empty($id)) {
213
- throw new InvalidArgumentException(
214
- 'expected subscription id to be set'
215
- );
216
- }
217
- if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) {
218
- throw new InvalidArgumentException(
219
- $id . ' is an invalid subscription id.'
220
- );
221
- }
222
- }
223
- /**
224
- * @ignore
225
- */
226
- private static function _verifyGatewayResponse($response)
227
- {
228
- if (isset($response['subscription'])) {
229
- return new Braintree_Result_Successful(
230
- self::factory($response['subscription'])
231
- );
232
- } else if (isset($response['transaction'])) {
233
- // return a populated instance of Braintree_Transaction, for subscription retryCharge
234
- return new Braintree_Result_Successful(
235
- Braintree_Transaction::factory($response['transaction'])
236
- );
237
- } else if (isset($response['apiErrorResponse'])) {
238
- return new Braintree_Result_Error($response['apiErrorResponse']);
239
- } else {
240
- throw new Braintree_Exception_Unexpected(
241
- "Expected subscription, transaction, or apiErrorResponse"
242
- );
243
- }
244
- }
245
-
246
- /**
247
- * returns a string representation of the customer
248
- * @return string
249
- */
250
- public function __toString()
251
- {
252
- return __CLASS__ . '[' .
253
- Braintree_Util::attributesToString($this->_attributes) .']';
254
- }
255
-
256
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/SubscriptionSearch.php DELETED
@@ -1,64 +0,0 @@
1
- <?php
2
- class Braintree_SubscriptionSearch
3
- {
4
- static function billingCyclesRemaining()
5
- {
6
- return new Braintree_RangeNode('billing_cycles_remaining');
7
- }
8
-
9
- static function daysPastDue()
10
- {
11
- return new Braintree_RangeNode('days_past_due');
12
- }
13
-
14
- static function id()
15
- {
16
- return new Braintree_TextNode('id');
17
- }
18
-
19
- static function inTrialPeriod()
20
- {
21
- return new Braintree_MultipleValueNode('in_trial_period', array(true, false));
22
- }
23
-
24
- static function merchantAccountId()
25
- {
26
- return new Braintree_MultipleValueNode('merchant_account_id');
27
- }
28
-
29
- static function nextBillingDate()
30
- {
31
- return new Braintree_RangeNode('next_billing_date');
32
- }
33
-
34
- static function planId()
35
- {
36
- return new Braintree_MultipleValueOrTextNode('plan_id');
37
- }
38
-
39
- static function price()
40
- {
41
- return new Braintree_RangeNode('price');
42
- }
43
-
44
- static function status()
45
- {
46
- return new Braintree_MultipleValueNode("status", array(
47
- Braintree_Subscription::ACTIVE,
48
- Braintree_Subscription::CANCELED,
49
- Braintree_Subscription::EXPIRED,
50
- Braintree_Subscription::PAST_DUE,
51
- Braintree_Subscription::PENDING
52
- ));
53
- }
54
-
55
- static function transactionId()
56
- {
57
- return new Braintree_TextNode('transaction_id');
58
- }
59
-
60
- static function ids()
61
- {
62
- return new Braintree_MultipleValueNode('ids');
63
- }
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/SubscriptionStatus.php DELETED
File without changes
includes/lib/Braintree/Braintree/Test/CreditCardNumbers.php DELETED
@@ -1,76 +0,0 @@
1
- <?php
2
- /**
3
- * Credit card information used for testing purposes
4
- *
5
- * @package Braintree
6
- * @subpackage Test
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Credit card information used for testing purposes
12
- *
13
- * The constants contained in the Braintree_Test_CreditCardNumbers class provide
14
- * credit card numbers that should be used when working in the sandbox environment.
15
- * The sandbox will not accept any credit card numbers other than the ones listed below.
16
- *
17
- * @package Braintree
18
- * @subpackage Test
19
- * @copyright 2010 Braintree Payment Solutions
20
- */
21
- class Braintree_Test_CreditCardNumbers
22
- {
23
- public static $amExes = array(
24
- '378282246310005',
25
- '371449635398431',
26
- '378734493671000',
27
- );
28
- public static $carteBlanches = array('30569309025904',);
29
- public static $dinersClubs = array('38520000023237',);
30
- public static $discoverCards = array(
31
- '6011111111111117',
32
- '6011000990139424',
33
- );
34
- public static $JCBs = array(
35
- '3530111333300000',
36
- '3566002020360505',
37
- );
38
-
39
- public static $masterCard = '5555555555554444';
40
- public static $masterCardInternational = '5105105105105100';
41
- public static $masterCards = array(
42
- '5105105105105100',
43
- '5555555555554444',
44
- );
45
-
46
- public static $visa = '4012888888881881';
47
- public static $visaInternational = '4009348888881881';
48
- public static $visas = array(
49
- '4009348888881881',
50
- '4012888888881881',
51
- '4111111111111111',
52
- '4000111111111115',
53
- );
54
-
55
- public static $unknowns = array(
56
- '1000000000000008',
57
- );
58
-
59
- public static $failsSandboxVerification = array(
60
- 'AmEx' => '378734493671000',
61
- 'Discover' => '6011000990139424',
62
- 'MasterCard' => '5105105105105100',
63
- 'Visa' => '4000111111111115',
64
- );
65
-
66
-
67
- public static function getAll()
68
- {
69
- return array_merge(
70
- self::$amExes,
71
- self::$discoverCards,
72
- self::$masterCards,
73
- self::$visas
74
- );
75
- }
76
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Test/TransactionAmounts.php DELETED
@@ -1,24 +0,0 @@
1
- <?php
2
- /**
3
- * Transaction amounts used for testing purposes
4
- *
5
- * @package Braintree
6
- * @subpackage Test
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Transaction amounts used for testing purposes
12
- *
13
- * The constants in this class can be used to create transactions with
14
- * the desired status in the sandbox environment.
15
- *
16
- * @package Braintree
17
- * @subpackage Test
18
- * @copyright 2010 Braintree Payment Solutions
19
- */
20
- class Braintree_Test_TransactionAmounts
21
- {
22
- public static $authorize = '1000.00';
23
- public static $decline = '2000.00';
24
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/TextNode.php DELETED
@@ -1,10 +0,0 @@
1
- <?php
2
-
3
- class Braintree_TextNode extends Braintree_PartialMatchNode
4
- {
5
- function contains($value)
6
- {
7
- $this->searchTerms["contains"] = strval($value);
8
- return $this;
9
- }
10
- }
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction.php DELETED
@@ -1,664 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Transaction processor
4
- *
5
- * @package Braintree
6
- * @category Resources
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates and manages transactions
12
- *
13
- * At minimum, an amount, credit card number, and
14
- * credit card expiration date are required.
15
- *
16
- * <b>Minimalistic example:</b>
17
- * <code>
18
- * Braintree_Transaction::saleNoValidate(array(
19
- * 'amount' => '100.00',
20
- * 'creditCard' => array(
21
- * 'number' => '5105105105105100',
22
- * 'expirationDate' => '05/12',
23
- * ),
24
- * ));
25
- * </code>
26
- *
27
- * <b>Full example:</b>
28
- * <code>
29
- * Braintree_Transaction::saleNoValidate(array(
30
- * 'amount' => '100.00',
31
- * 'orderId' => '123',
32
- * 'channel' => 'MyShoppingCardProvider',
33
- * 'creditCard' => array(
34
- * // if token is omitted, the gateway will generate a token
35
- * 'token' => 'credit_card_123',
36
- * 'number' => '5105105105105100',
37
- * 'expirationDate' => '05/2011',
38
- * 'cvv' => '123',
39
- * ),
40
- * 'customer' => array(
41
- * // if id is omitted, the gateway will generate an id
42
- * 'id' => 'customer_123',
43
- * 'firstName' => 'Dan',
44
- * 'lastName' => 'Smith',
45
- * 'company' => 'Braintree Payment Solutions',
46
- * 'email' => 'dan@example.com',
47
- * 'phone' => '419-555-1234',
48
- * 'fax' => '419-555-1235',
49
- * 'website' => 'http://braintreepayments.com'
50
- * ),
51
- * 'billing' => array(
52
- * 'firstName' => 'Carl',
53
- * 'lastName' => 'Jones',
54
- * 'company' => 'Braintree',
55
- * 'streetAddress' => '123 E Main St',
56
- * 'extendedAddress' => 'Suite 403',
57
- * 'locality' => 'Chicago',
58
- * 'region' => 'IL',
59
- * 'postalCode' => '60622',
60
- * 'countryName' => 'United States of America'
61
- * ),
62
- * 'shipping' => array(
63
- * 'firstName' => 'Andrew',
64
- * 'lastName' => 'Mason',
65
- * 'company' => 'Braintree',
66
- * 'streetAddress' => '456 W Main St',
67
- * 'extendedAddress' => 'Apt 2F',
68
- * 'locality' => 'Bartlett',
69
- * 'region' => 'IL',
70
- * 'postalCode' => '60103',
71
- * 'countryName' => 'United States of America'
72
- * ),
73
- * 'customFields' => array(
74
- * 'birthdate' => '11/13/1954'
75
- * )
76
- * )
77
- * </code>
78
- *
79
- * <b>== Storing in the Vault ==</b>
80
- *
81
- * The customer and credit card information used for
82
- * a transaction can be stored in the vault by setting
83
- * <i>transaction[options][storeInVault]</i> to true.
84
- * <code>
85
- * $transaction = Braintree_Transaction::saleNoValidate(array(
86
- * 'customer' => array(
87
- * 'firstName' => 'Adam',
88
- * 'lastName' => 'Williams'
89
- * ),
90
- * 'creditCard' => array(
91
- * 'number' => '5105105105105100',
92
- * 'expirationDate' => '05/2012'
93
- * ),
94
- * 'options' => array(
95
- * 'storeInVault' => true
96
- * )
97
- * ));
98
- *
99
- * echo $transaction->customerDetails->id
100
- * // '865534'
101
- * echo $transaction->creditCardDetails->token
102
- * // '6b6m'
103
- * </code>
104
- *
105
- * To also store the billing address in the vault, pass the
106
- * <b>addBillingAddressToPaymentMethod</b> option.
107
- * <code>
108
- * Braintree_Transaction.saleNoValidate(array(
109
- * ...
110
- * 'options' => array(
111
- * 'storeInVault' => true
112
- * 'addBillingAddressToPaymentMethod' => true
113
- * )
114
- * ));
115
- * </code>
116
- *
117
- * <b>== Submitting for Settlement==</b>
118
- *
119
- * This can only be done when the transction's
120
- * status is <b>authorized</b>. If <b>amount</b> is not specified,
121
- * the full authorized amount will be settled. If you would like to settle
122
- * less than the full authorized amount, pass the desired amount.
123
- * You cannot settle more than the authorized amount.
124
- *
125
- * A transaction can be submitted for settlement when created by setting
126
- * $transaction[options][submitForSettlement] to true.
127
- *
128
- * <code>
129
- * $transaction = Braintree_Transaction::saleNoValidate(array(
130
- * 'amount' => '100.00',
131
- * 'creditCard' => array(
132
- * 'number' => '5105105105105100',
133
- * 'expirationDate' => '05/2012'
134
- * ),
135
- * 'options' => array(
136
- * 'submitForSettlement' => true
137
- * )
138
- * ));
139
- * </code>
140
- *
141
- * <b>== More information ==</b>
142
- *
143
- * For more detailed information on Transactions, see {@link http://www.braintreepayments.com/gateway/transaction-api http://www.braintreepaymentsolutions.com/gateway/transaction-api}
144
- *
145
- * @package Braintree
146
- * @category Resources
147
- * @copyright 2010 Braintree Payment Solutions
148
- *
149
- *
150
- * @property-read string $avsErrorResponseCode
151
- * @property-read string $avsPostalCodeResponseCode
152
- * @property-read string $avsStreetAddressResponseCode
153
- * @property-read string $cvvResponseCode
154
- * @property-read string $id transaction id
155
- * @property-read string $amount transaction amount
156
- * @property-read object $billingDetails transaction billing address
157
- * @property-read string $createdAt transaction created timestamp
158
- * @property-read object $creditCardDetails transaction credit card info
159
- * @property-read object $customerDetails transaction customer info
160
- * @property-read array $customFields custom fields passed with the request
161
- * @property-read string $processorResponseCode gateway response code
162
- * @property-read object $shippingDetails transaction shipping address
163
- * @property-read string $status transaction status
164
- * @property-read array $statusHistory array of StatusDetails objects
165
- * @property-read string $type transaction type
166
- * @property-read string $updatedAt transaction updated timestamp
167
- *
168
- */
169
-
170
- final class Braintree_Transaction extends Braintree
171
- {
172
- // Transaction Status
173
- const AUTHORIZATION_EXPIRED = 'authorization_expired';
174
- const AUTHORIZING = 'authorizing';
175
- const AUTHORIZED = 'authorized';
176
- const GATEWAY_REJECTED = 'gateway_rejected';
177
- const FAILED = 'failed';
178
- const PROCESSOR_DECLINED = 'processor_declined';
179
- const SETTLED = 'settled';
180
- const SETTLING = 'settling';
181
- const SUBMITTED_FOR_SETTLEMENT = 'submitted_for_settlement';
182
- const VOIDED = 'voided';
183
-
184
- // Transaction Types
185
- const SALE = 'sale';
186
- const CREDIT = 'credit';
187
-
188
- // Transaction Created Using
189
- const FULL_INFORMATION = 'full_information';
190
- const TOKEN = 'token';
191
-
192
- // Transaction Sources
193
- const API = 'api';
194
- const CONTROL_PANEL = 'control_panel';
195
- const RECURRING = 'recurring';
196
-
197
- // Gateway Rejection Reason
198
- const AVS = 'avs';
199
- const AVS_AND_CVV = 'avs_and_cvv';
200
- const CVV = 'cvv';
201
- const DUPLICATE = 'duplicate';
202
-
203
- public static function cloneTransaction($transactionId, $attribs)
204
- {
205
- Braintree_Util::verifyKeys(self::cloneSignature(), $attribs);
206
- return self::_doCreate('/transactions/' . $transactionId . '/clone', array('transactionClone' => $attribs));
207
- }
208
-
209
- /**
210
- * @ignore
211
- * @access public
212
- * @param array $attribs
213
- * @return object
214
- */
215
- private static function create($attribs)
216
- {
217
- Braintree_Util::verifyKeys(self::createSignature(), $attribs);
218
- return self::_doCreate('/transactions', array('transaction' => $attribs));
219
- }
220
-
221
- /**
222
- *
223
- * @ignore
224
- * @access public
225
- * @param array $attribs
226
- * @return object
227
- * @throws Braintree_Exception_ValidationError
228
- */
229
- private static function createNoValidate($attribs)
230
- {
231
- $result = self::create($attribs);
232
- return self::returnObjectOrThrowException(__CLASS__, $result);
233
- }
234
- /**
235
- *
236
- * @access public
237
- * @param array $attribs
238
- * @return object
239
- */
240
- public static function createFromTransparentRedirect($queryString)
241
- {
242
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
243
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
244
- $queryString
245
- );
246
- return self::_doCreate(
247
- '/transactions/all/confirm_transparent_redirect_request',
248
- array('id' => $params['id'])
249
- );
250
- }
251
- /**
252
- *
253
- * @access public
254
- * @param none
255
- * @return string
256
- */
257
- public static function createTransactionUrl()
258
- {
259
- trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
260
- return Braintree_Configuration::merchantUrl() .
261
- '/transactions/all/create_via_transparent_redirect_request';
262
- }
263
-
264
- public static function cloneSignature()
265
- {
266
- return array('amount', 'channel', array('options' => array('submitForSettlement')));
267
- }
268
-
269
- /**
270
- * creates a full array signature of a valid gateway request
271
- * @return array gateway request signature format
272
- */
273
- public static function createSignature()
274
- {
275
- return array(
276
- 'amount', 'customerId', 'merchantAccountId', 'orderId', 'channel', 'paymentMethodToken',
277
- 'purchaseOrderNumber', 'recurring', 'shippingAddressId', 'taxAmount', 'taxExempt', 'type', 'venmoSdkPaymentMethodCode',
278
- array('creditCard' =>
279
- array('token', 'cardholderName', 'cvv', 'expirationDate', 'expirationMonth', 'expirationYear', 'number'),
280
- ),
281
- array('customer' =>
282
- array(
283
- 'id', 'company', 'email', 'fax', 'firstName',
284
- 'lastName', 'phone', 'website'),
285
- ),
286
- array('billing' =>
287
- array(
288
- 'firstName', 'lastName', 'company', 'countryName',
289
- 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric',
290
- 'extendedAddress', 'locality', 'postalCode', 'region',
291
- 'streetAddress'),
292
- ),
293
- array('shipping' =>
294
- array(
295
- 'firstName', 'lastName', 'company', 'countryName',
296
- 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric',
297
- 'extendedAddress', 'locality', 'postalCode', 'region',
298
- 'streetAddress'),
299
- ),
300
- array('options' =>
301
- array(
302
- 'storeInVault',
303
- 'storeInVaultOnSuccess',
304
- 'submitForSettlement',
305
- 'addBillingAddressToPaymentMethod',
306
- 'venmoSdkSession',
307
- 'storeShippingAddressInVault'),
308
- ),
309
- array('customFields' => array('_anyKey_')
310
- ),
311
- array('descriptor' => array('name', 'phone')),
312
- );
313
- }
314
-
315
- /**
316
- *
317
- * @access public
318
- * @param array $attribs
319
- * @return object
320
- */
321
- public static function credit($attribs)
322
- {
323
- return self::create(array_merge($attribs, array('type' => Braintree_Transaction::CREDIT)));
324
- }
325
-
326
- /**
327
- *
328
- * @access public
329
- * @param array $attribs
330
- * @return object
331
- * @throws Braintree_Exception_ValidationError
332
- */
333
- public static function creditNoValidate($attribs)
334
- {
335
- $result = self::credit($attribs);
336
- return self::returnObjectOrThrowException(__CLASS__, $result);
337
- }
338
-
339
-
340
- /**
341
- * @access public
342
- *
343
- */
344
- public static function find($id)
345
- {
346
- self::_validateId($id);
347
- try {
348
- $response = Braintree_Http::get('/transactions/'.$id);
349
- return self::factory($response['transaction']);
350
- } catch (Braintree_Exception_NotFound $e) {
351
- throw new Braintree_Exception_NotFound(
352
- 'transaction with id ' . $id . ' not found'
353
- );
354
- }
355
-
356
- }
357
- /**
358
- * new sale
359
- * @param array $attribs
360
- * @return array
361
- */
362
- public static function sale($attribs)
363
- {
364
- return self::create(array_merge(array('type' => Braintree_Transaction::SALE), $attribs));
365
- }
366
-
367
- /**
368
- * roughly equivalent to the ruby bang method
369
- * @access public
370
- * @param array $attribs
371
- * @return array
372
- * @throws Braintree_Exception_ValidationsFailed
373
- */
374
- public static function saleNoValidate($attribs)
375
- {
376
- $result = self::sale($attribs);
377
- return self::returnObjectOrThrowException(__CLASS__, $result);
378
- }
379
-
380
- /**
381
- * Returns a ResourceCollection of transactions matching the search query.
382
- *
383
- * If <b>query</b> is a string, the search will be a basic search.
384
- * If <b>query</b> is a hash, the search will be an advanced search.
385
- * For more detailed information and examples, see {@link http://www.braintreepayments.com/gateway/transaction-api#searching http://www.braintreepaymentsolutions.com/gateway/transaction-api}
386
- *
387
- * @param mixed $query search query
388
- * @param array $options options such as page number
389
- * @return object Braintree_ResourceCollection
390
- * @throws InvalidArgumentException
391
- */
392
- public static function search($query)
393
- {
394
- $criteria = array();
395
- foreach ($query as $term) {
396
- $criteria[$term->name] = $term->toparam();
397
- }
398
-
399
- $response = braintree_http::post('/transactions/advanced_search_ids', array('search' => $criteria));
400
- $pager = array(
401
- 'className' => __CLASS__,
402
- 'classMethod' => 'fetch',
403
- 'methodArgs' => array($query)
404
- );
405
-
406
- return new Braintree_ResourceCollection($response, $pager);
407
- }
408
-
409
- public static function fetch($query, $ids)
410
- {
411
- $criteria = array();
412
- foreach ($query as $term) {
413
- $criteria[$term->name] = $term->toparam();
414
- }
415
- $criteria["ids"] = Braintree_TransactionSearch::ids()->in($ids)->toparam();
416
- $response = braintree_http::post('/transactions/advanced_search', array('search' => $criteria));
417
-
418
- return braintree_util::extractattributeasarray(
419
- $response['creditCardTransactions'],
420
- 'transaction'
421
- );
422
- }
423
-
424
- /**
425
- * void a transaction by id
426
- *
427
- * @param string $id transaction id
428
- * @return object Braintree_Result_Successful|Braintree_Result_Error
429
- */
430
- public static function void($transactionId)
431
- {
432
- self::_validateId($transactionId);
433
-
434
- $response = Braintree_Http::put('/transactions/'. $transactionId . '/void');
435
- return self::_verifyGatewayResponse($response);
436
- }
437
- /**
438
- *
439
- */
440
- public static function voidNoValidate($transactionId)
441
- {
442
- $result = self::void($transactionId);
443
- return self::returnObjectOrThrowException(__CLASS__, $result);
444
- }
445
-
446
- public static function submitForSettlement($transactionId, $amount = null)
447
- {
448
- self::_validateId($transactionId);
449
-
450
- $response = Braintree_Http::put(
451
- '/transactions/'. $transactionId . '/submit_for_settlement',
452
- array( 'transaction' => array( 'amount' => $amount))
453
- );
454
- return self::_verifyGatewayResponse($response);
455
- }
456
-
457
- public static function submitForSettlementNoValidate($transactionId, $amount = null)
458
- {
459
- $result = self::submitForSettlement($transactionId, $amount);
460
- return self::returnObjectOrThrowException(__CLASS__, $result);
461
- }
462
-
463
-
464
- /**
465
- * sets instance properties from an array of values
466
- *
467
- * @ignore
468
- * @access protected
469
- * @param array $transactionAttribs array of transaction data
470
- * @return none
471
- */
472
- protected function _initialize($transactionAttribs)
473
- {
474
- $this->_attributes = $transactionAttribs;
475
-
476
- $this->_set('creditCardDetails',
477
- new Braintree_Transaction_CreditCardDetails(
478
- $transactionAttribs['creditCard']
479
- )
480
- );
481
- $this->_set('customerDetails',
482
- new Braintree_Transaction_CustomerDetails(
483
- $transactionAttribs['customer']
484
- )
485
- );
486
- $this->_set('billingDetails',
487
- new Braintree_Transaction_AddressDetails(
488
- $transactionAttribs['billing']
489
- )
490
- );
491
- $this->_set('shippingDetails',
492
- new Braintree_Transaction_AddressDetails(
493
- $transactionAttribs['shipping']
494
- )
495
- );
496
- $this->_set('subscriptionDetails',
497
- new Braintree_Transaction_SubscriptionDetails(
498
- $transactionAttribs['subscription']
499
- )
500
- );
501
- $this->_set('descriptor',
502
- new Braintree_Descriptor(
503
- $transactionAttribs['descriptor']
504
- )
505
- );
506
-
507
- $statusHistory = array();
508
- foreach ($transactionAttribs['statusHistory'] AS $history) {
509
- $statusHistory[] = new Braintree_Transaction_StatusDetails($history);
510
- }
511
- $this->_set('statusHistory', $statusHistory);
512
-
513
-
514
- $addOnArray = array();
515
- if (isset($transactionAttribs['addOns'])) {
516
- foreach ($transactionAttribs['addOns'] AS $addOn) {
517
- $addOnArray[] = Braintree_AddOn::factory($addOn);
518
- }
519
- }
520
- $this->_set('addOns', $addOnArray);
521
-
522
- $discountArray = array();
523
- if (isset($transactionAttribs['discounts'])) {
524
- foreach ($transactionAttribs['discounts'] AS $discount) {
525
- $discountArray[] = Braintree_Discount::factory($discount);
526
- }
527
- }
528
- $this->_set('discounts', $discountArray);
529
- }
530
-
531
- /**
532
- * returns a string representation of the transaction
533
- * @return string
534
- */
535
- public function __toString()
536
- {
537
- // array of attributes to print
538
- $display = array(
539
- 'id', 'type', 'amount', 'status',
540
- 'createdAt', 'creditCardDetails', 'customerDetails'
541
- );
542
-
543
- $displayAttributes = array();
544
- foreach ($display AS $attrib) {
545
- $displayAttributes[$attrib] = $this->$attrib;
546
- }
547
- return __CLASS__ . '[' .
548
- Braintree_Util::attributesToString($displayAttributes) .']';
549
- }
550
-
551
- public static function refund($transactionId, $amount = null)
552
- {
553
- $params = array('transaction' => array('amount' => $amount));
554
- $response = Braintree_Http::post('/transactions/' . $transactionId . '/refund', $params);
555
- return self::_verifyGatewayResponse($response);
556
- }
557
-
558
- public function isEqual($otherTx)
559
- {
560
- return $this->id === $otherTx->id;
561
- }
562
-
563
- public function vaultCreditCard()
564
- {
565
- $token = $this->creditCardDetails->token;
566
- if (empty($token)) {
567
- return null;
568
- }
569
- else {
570
- return Braintree_CreditCard::find($token);
571
- }
572
- }
573
-
574
- public function vaultCustomer()
575
- {
576
- $customerId = $this->customerDetails->id;
577
- if (empty($customerId)) {
578
- return null;
579
- }
580
- else {
581
- return Braintree_Customer::find($customerId);
582
- }
583
- }
584
-
585
- /**
586
- * sends the create request to the gateway
587
- *
588
- * @ignore
589
- * @param var $url
590
- * @param array $params
591
- * @return mixed
592
- */
593
- public static function _doCreate($url, $params)
594
- {
595
- $response = Braintree_Http::post($url, $params);
596
-
597
- return self::_verifyGatewayResponse($response);
598
- }
599
-
600
- /**
601
- * verifies that a valid transaction id is being used
602
- * @ignore
603
- * @param string transaction id
604
- * @throws InvalidArgumentException
605
- */
606
- private static function _validateId($id = null) {
607
- if (empty($id)) {
608
- throw new InvalidArgumentException(
609
- 'expected transaction id to be set'
610
- );
611
- }
612
- if (!preg_match('/^[0-9a-z]+$/', $id)) {
613
- throw new InvalidArgumentException(
614
- $id . ' is an invalid transaction id.'
615
- );
616
- }
617
- }
618
-
619
-
620
- /* private class methods */
621
-
622
- /**
623
- * generic method for validating incoming gateway responses
624
- *
625
- * creates a new Braintree_Transaction object and encapsulates
626
- * it inside a Braintree_Result_Successful object, or
627
- * encapsulates a Braintree_Errors object inside a Result_Error
628
- * alternatively, throws an Unexpected exception if the response is invalid.
629
- *
630
- * @ignore
631
- * @param array $response gateway response values
632
- * @return object Result_Successful or Result_Error
633
- * @throws Braintree_Exception_Unexpected
634
- */
635
- private static function _verifyGatewayResponse($response)
636
- {
637
- if (isset($response['transaction'])) {
638
- // return a populated instance of Braintree_Transaction
639
- return new Braintree_Result_Successful(
640
- self::factory($response['transaction'])
641
- );
642
- } else if (isset($response['apiErrorResponse'])) {
643
- return new Braintree_Result_Error($response['apiErrorResponse']);
644
- } else {
645
- throw new Braintree_Exception_Unexpected(
646
- "Expected transaction or apiErrorResponse"
647
- );
648
- }
649
- }
650
-
651
- /**
652
- * factory method: returns an instance of Braintree_Transaction
653
- * to the requesting method, with populated properties
654
- *
655
- * @ignore
656
- * @return object instance of Braintree_Transaction
657
- */
658
- public static function factory($attributes)
659
- {
660
- $instance = new self();
661
- $instance->_initialize($attributes);
662
- return $instance;
663
- }
664
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction/AddressDetails.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- /**
3
- * Address details from a transaction
4
- *
5
- * @package Braintree
6
- * @subpackage Transaction
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates an instance of AddressDetails as returned from a transaction
12
- *
13
- *
14
- * @package Braintree
15
- * @subpackage Transaction
16
- * @copyright 2010 Braintree Payment Solutions
17
- *
18
- * @property-read string $firstName
19
- * @property-read string $lastName
20
- * @property-read string $company
21
- * @property-read string $streetAddress
22
- * @property-read string $extendedAddress
23
- * @property-read string $locality
24
- * @property-read string $region
25
- * @property-read string $postalCode
26
- * @property-read string $countryName
27
- * @uses Braintree_Instance inherits methods
28
- */
29
- class Braintree_Transaction_AddressDetails extends Braintree_Instance
30
- {
31
- protected $_attributes = array();
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction/CreditCardDetails.php DELETED
@@ -1,43 +0,0 @@
1
- <?php
2
- /**
3
- * CreditCard details from a transaction
4
- *
5
- * @package Braintree
6
- * @subpackage Transaction
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * creates an instance of CreditCardDetails
12
- *
13
- *
14
- * @package Braintree
15
- * @subpackage Transaction
16
- * @copyright 2010 Braintree Payment Solutions
17
- *
18
- * @property-read string $bin
19
- * @property-read string $cardType
20
- * @property-read string $expirationDate
21
- * @property-read string $expirationMonth
22
- * @property-read string $expirationYear
23
- * @property-read string $issuerLocation
24
- * @property-read string $last4
25
- * @property-read string $maskedNumber
26
- * @property-read string $token
27
- * @uses Braintree_Instance inherits methods
28
- */
29
- class Braintree_Transaction_CreditCardDetails extends Braintree_Instance
30
- {
31
- protected $_attributes = array();
32
-
33
- /**
34
- * @ignore
35
- */
36
- public function __construct($attributes)
37
- {
38
- parent::__construct($attributes);
39
- $this->_attributes['expirationDate'] = $this->expirationMonth . '/' . $this->expirationYear;
40
- $this->_attributes['maskedNumber'] = $this->bin . '******' . $this->last4;
41
-
42
- }
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction/CustomerDetails.php DELETED
@@ -1,29 +0,0 @@
1
- <?php
2
- /**
3
- * Customer details from a transaction
4
- *
5
- * @package Braintree
6
- * @subpackage Transaction
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates an instance of customer details as returned from a transaction
12
- *
13
- * @package Braintree
14
- * @subpackage Transaction
15
- * @copyright 2010 Braintree Payment Solutions
16
- *
17
- * @property-read string $company
18
- * @property-read string $email
19
- * @property-read string $fax
20
- * @property-read string $firstName
21
- * @property-read string $id
22
- * @property-read string $lastName
23
- * @property-read string $phone
24
- * @property-read string $website
25
- * @uses Braintree_Instance inherits methods
26
- */
27
- class Braintree_Transaction_CustomerDetails extends Braintree_Instance
28
- {
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction/StatusDetails.php DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
- /**
3
- * Status details from a transaction
4
- *
5
- * @package Braintree
6
- * @subpackage Transaction
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates an instance of StatusDetails, as part of a transaction response
12
- *
13
- * @package Braintree
14
- * @copyright 2010 Braintree Payment Solutions
15
- *
16
- * @property-read string $amount
17
- * @property-read string $status
18
- * @property-read string $timestamp
19
- * @property-read string $transactionSource
20
- * @property-read string $user
21
- * @uses Braintree_Instance inherits methods
22
- */
23
- class Braintree_Transaction_StatusDetails extends Braintree_Instance
24
- {
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Transaction/SubscriptionDetails.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
- /**
3
- * Customer details from a transaction
4
- *
5
- * @package Braintree
6
- * @subpackage Transaction
7
- * @copyright 2010 Braintree Payment Solutions
8
- */
9
-
10
- /**
11
- * Creates an instance of customer details as returned from a transaction
12
- *
13
- * @package Braintree
14
- * @subpackage Transaction
15
- * @copyright 2010 Braintree Payment Solutions
16
- *
17
- * @property-read string $billing_period_start_date
18
- * @property-read string $billing_period_end_date
19
- */
20
- class Braintree_Transaction_SubscriptionDetails extends Braintree_Instance
21
- {
22
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/TransactionSearch.php DELETED
@@ -1,124 +0,0 @@
1
- <?php
2
- class Braintree_TransactionSearch
3
- {
4
- static function billingCompany() { return new Braintree_TextNode('billing_company'); }
5
- static function billingCountryName() { return new Braintree_TextNode('billing_country_name'); }
6
- static function billingExtendedAddress() { return new Braintree_TextNode('billing_extended_address'); }
7
- static function billingFirstName() { return new Braintree_TextNode('billing_first_name'); }
8
- static function billingLastName() { return new Braintree_TextNode('billing_last_name'); }
9
- static function billingLocality() { return new Braintree_TextNode('billing_locality'); }
10
- static function billingPostalCode() { return new Braintree_TextNode('billing_postal_code'); }
11
- static function billingRegion() { return new Braintree_TextNode('billing_region'); }
12
- static function billingStreetAddress() { return new Braintree_TextNode('billing_street_address'); }
13
- static function creditCardCardholderName() { return new Braintree_TextNode('credit_card_cardholderName'); }
14
- static function customerCompany() { return new Braintree_TextNode('customer_company'); }
15
- static function customerEmail() { return new Braintree_TextNode('customer_email'); }
16
- static function customerFax() { return new Braintree_TextNode('customer_fax'); }
17
- static function customerFirstName() { return new Braintree_TextNode('customer_first_name'); }
18
- static function customerId() { return new Braintree_TextNode('customer_id'); }
19
- static function customerLastName() { return new Braintree_TextNode('customer_last_name'); }
20
- static function customerPhone() { return new Braintree_TextNode('customer_phone'); }
21
- static function customerWebsite() { return new Braintree_TextNode('customer_website'); }
22
- static function id() { return new Braintree_TextNode('id'); }
23
- static function ids() { return new Braintree_MultipleValueNode('ids'); }
24
- static function orderId() { return new Braintree_TextNode('order_id'); }
25
- static function paymentMethodToken() { return new Braintree_TextNode('payment_method_token'); }
26
- static function processorAuthorizationCode() { return new Braintree_TextNode('processor_authorization_code'); }
27
- static function settlementBatchId() { return new Braintree_TextNode('settlement_batch_id'); }
28
- static function shippingCompany() { return new Braintree_TextNode('shipping_company'); }
29
- static function shippingCountryName() { return new Braintree_TextNode('shipping_country_name'); }
30
- static function shippingExtendedAddress() { return new Braintree_TextNode('shipping_extended_address'); }
31
- static function shippingFirstName() { return new Braintree_TextNode('shipping_first_name'); }
32
- static function shippingLastName() { return new Braintree_TextNode('shipping_last_name'); }
33
- static function shippingLocality() { return new Braintree_TextNode('shipping_locality'); }
34
- static function shippingPostalCode() { return new Braintree_TextNode('shipping_postal_code'); }
35
- static function shippingRegion() { return new Braintree_TextNode('shipping_region'); }
36
- static function shippingStreetAddress() { return new Braintree_TextNode('shipping_street_address'); }
37
-
38
- static function creditCardExpirationDate() { return new Braintree_EqualityNode('credit_card_expiration_date'); }
39
-
40
- static function creditCardNumber() { return new Braintree_PartialMatchNode('credit_card_number'); }
41
-
42
- static function refund() { return new Braintree_KeyValueNode("refund"); }
43
-
44
- static function amount() { return new Braintree_RangeNode("amount"); }
45
- static function authorizedAt() { return new Braintree_RangeNode("authorizedAt"); }
46
- static function authorizationExpiredAt() { return new Braintree_RangeNode("authorizationExpiredAt"); }
47
- static function createdAt() { return new Braintree_RangeNode("createdAt"); }
48
- static function failedAt() { return new Braintree_RangeNode("failedAt"); }
49
- static function gatewayRejectedAt() { return new Braintree_RangeNode("gatewayRejectedAt"); }
50
- static function processorDeclinedAt() { return new Braintree_RangeNode("processorDeclinedAt"); }
51
- static function settledAt() { return new Braintree_RangeNode("settledAt"); }
52
- static function submittedForSettlementAt() { return new Braintree_RangeNode("submittedForSettlementAt"); }
53
- static function voidedAt() { return new Braintree_RangeNode("voidedAt"); }
54
-
55
- static function merchantAccountId() { return new Braintree_MultipleValueNode("merchant_account_id"); }
56
-
57
- static function createdUsing()
58
- {
59
- return new Braintree_MultipleValueNode("created_using", array(
60
- Braintree_Transaction::FULL_INFORMATION,
61
- Braintree_Transaction::TOKEN
62
- ));
63
- }
64
-
65
- static function creditCardCardType()
66
- {
67
- return new Braintree_MultipleValueNode("credit_card_card_type", array(
68
- Braintree_CreditCard::AMEX,
69
- Braintree_CreditCard::CARTE_BLANCHE,
70
- Braintree_CreditCard::CHINA_UNION_PAY,
71
- Braintree_CreditCard::DINERS_CLUB_INTERNATIONAL,
72
- Braintree_CreditCard::DISCOVER,
73
- Braintree_CreditCard::JCB,
74
- Braintree_CreditCard::LASER,
75
- Braintree_CreditCard::MAESTRO,
76
- Braintree_CreditCard::MASTER_CARD,
77
- Braintree_CreditCard::SOLO,
78
- Braintree_CreditCard::SWITCH_TYPE,
79
- Braintree_CreditCard::VISA,
80
- Braintree_CreditCard::UNKNOWN
81
- ));
82
- }
83
-
84
- static function creditCardCustomerLocation()
85
- {
86
- return new Braintree_MultipleValueNode("credit_card_customer_location", array(
87
- Braintree_CreditCard::INTERNATIONAL,
88
- Braintree_CreditCard::US
89
- ));
90
- }
91
-
92
- static function source()
93
- {
94
- return new Braintree_MultipleValueNode("source", array(
95
- Braintree_Transaction::API,
96
- Braintree_Transaction::CONTROL_PANEL,
97
- Braintree_Transaction::RECURRING,
98
- ));
99
- }
100
-
101
- static function status()
102
- {
103
- return new Braintree_MultipleValueNode("status", array(
104
- Braintree_Transaction::AUTHORIZATION_EXPIRED,
105
- Braintree_Transaction::AUTHORIZING,
106
- Braintree_Transaction::AUTHORIZED,
107
- Braintree_Transaction::GATEWAY_REJECTED,
108
- Braintree_Transaction::FAILED,
109
- Braintree_Transaction::PROCESSOR_DECLINED,
110
- Braintree_Transaction::SETTLED,
111
- Braintree_Transaction::SETTLING,
112
- Braintree_Transaction::SUBMITTED_FOR_SETTLEMENT,
113
- Braintree_Transaction::VOIDED
114
- ));
115
- }
116
-
117
- static function type()
118
- {
119
- return new Braintree_MultipleValueNode("type", array(
120
- Braintree_Transaction::SALE,
121
- Braintree_Transaction::CREDIT
122
- ));
123
- }
124
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/TransparentRedirect.php DELETED
@@ -1,327 +0,0 @@
1
- <?php
2
-
3
-
4
- /**
5
- * Braintree Transparent Redirect module
6
- *
7
- * @package Braintree
8
- * @category Resources
9
- * @copyright 2010 Braintree Payment Solutions
10
- */
11
-
12
- /**
13
- * Static class providing methods to build Transparent Redirect urls
14
- *
15
- * The TransparentRedirect module provides methods to build the tr_data param
16
- * that must be submitted when using the transparent redirect API.
17
- * For more information
18
- * about transparent redirect, see (TODO).
19
- *
20
- * You must provide a redirectUrl to which the gateway will redirect the
21
- * user the action is complete.
22
- *
23
- * <code>
24
- * $trData = Braintree_TransparentRedirect::createCustomerData(array(
25
- * 'redirectUrl => 'http://example.com/redirect_back_to_merchant_site',
26
- * ));
27
- * </code>
28
- *
29
- * In addition to the redirectUrl, any data that needs to be protected
30
- * from user tampering should be included in the trData.
31
- * For example, to prevent the user from tampering with the transaction
32
- * amount, include the amount in the trData.
33
- *
34
- * <code>
35
- * $trData = Braintree_TransparentRedirect::transactionData(array(
36
- * 'redirectUrl' => 'http://example.com/complete_transaction',
37
- * 'transaction' => array('amount' => '100.00'),
38
- * ));
39
- *
40
- * </code>
41
- *
42
- * @package Braintree
43
- * @category Resources
44
- * @copyright 2010 Braintree Payment Solutions
45
- */
46
- class Braintree_TransparentRedirect
47
- {
48
- // Request Kinds
49
- const CREATE_TRANSACTION = 'create_transaction';
50
- const CREATE_PAYMENT_METHOD = 'create_payment_method';
51
- const UPDATE_PAYMENT_METHOD = 'update_payment_method';
52
- const CREATE_CUSTOMER = 'create_customer';
53
- const UPDATE_CUSTOMER = 'update_customer';
54
-
55
- /**
56
- *
57
- * @ignore
58
- */
59
- private static $_transparentRedirectKeys = 'redirectUrl';
60
- private static $_createCustomerSignature;
61
- private static $_updateCustomerSignature;
62
- private static $_transactionSignature;
63
- private static $_createCreditCardSignature;
64
- private static $_updateCreditCardSignature;
65
-
66
-
67
- /**
68
- * @ignore
69
- * don't permit an explicit call of the constructor!
70
- * (like $t = new Braintree_TransparentRedirect())
71
- */
72
- protected function __construct()
73
- {
74
-
75
- }
76
-
77
- /**
78
- * create signatures for different call types
79
- * @ignore
80
- */
81
- public static function init()
82
- {
83
-
84
- self::$_createCustomerSignature = array(
85
- self::$_transparentRedirectKeys,
86
- array('customer' => Braintree_Customer::createSignature()),
87
- );
88
- self::$_updateCustomerSignature = array(
89
- self::$_transparentRedirectKeys,
90
- 'customerId',
91
- array('customer' => Braintree_Customer::updateSignature()),
92
- );
93
- self::$_transactionSignature = array(
94
- self::$_transparentRedirectKeys,
95
- array('transaction' => Braintree_Transaction::createSignature()),
96
- );
97
- self::$_createCreditCardSignature = array(
98
- self::$_transparentRedirectKeys,
99
- array('creditCard' => Braintree_CreditCard::createSignature()),
100
- );
101
- self::$_updateCreditCardSignature = array(
102
- self::$_transparentRedirectKeys,
103
- 'paymentMethodToken',
104
- array('creditCard' => Braintree_CreditCard::updateSignature()),
105
- );
106
- }
107
-
108
- public static function confirm($queryString)
109
- {
110
- $params = Braintree_TransparentRedirect::parseAndValidateQueryString(
111
- $queryString
112
- );
113
- $confirmationKlasses = array(
114
- Braintree_TransparentRedirect::CREATE_TRANSACTION => 'Braintree_Transaction',
115
- Braintree_TransparentRedirect::CREATE_CUSTOMER => 'Braintree_Customer',
116
- Braintree_TransparentRedirect::UPDATE_CUSTOMER => 'Braintree_Customer',
117
- Braintree_TransparentRedirect::CREATE_PAYMENT_METHOD => 'Braintree_CreditCard',
118
- Braintree_TransparentRedirect::UPDATE_PAYMENT_METHOD => 'Braintree_CreditCard'
119
- );
120
- return call_user_func(array($confirmationKlasses[$params["kind"]], '_doCreate'),
121
- '/transparent_redirect_requests/' . $params['id'] . '/confirm',
122
- array()
123
- );
124
- }
125
-
126
- /**
127
- * returns the trData string for creating a credit card,
128
- * @param array $params
129
- * @return string
130
- */
131
- public static function createCreditCardData($params)
132
- {
133
- Braintree_Util::verifyKeys(
134
- self::$_createCreditCardSignature,
135
- $params
136
- );
137
- $params["kind"] = Braintree_TransparentRedirect::CREATE_PAYMENT_METHOD;
138
- return self::_data($params);
139
- }
140
-
141
- /**
142
- * returns the trData string for creating a customer.
143
- * @param array $params
144
- * @return string
145
- */
146
- public static function createCustomerData($params)
147
- {
148
- Braintree_Util::verifyKeys(
149
- self::$_createCustomerSignature,
150
- $params
151
- );
152
- $params["kind"] = Braintree_TransparentRedirect::CREATE_CUSTOMER;
153
- return self::_data($params);
154
-
155
- }
156
-
157
- public static function url()
158
- {
159
- return Braintree_Configuration::merchantUrl() . "/transparent_redirect_requests";
160
- }
161
-
162
- /**
163
- * returns the trData string for creating a transaction
164
- * @param array $params
165
- * @return string
166
- */
167
- public static function transactionData($params)
168
- {
169
- Braintree_Util::verifyKeys(
170
- self::$_transactionSignature,
171
- $params
172
- );
173
- $params["kind"] = Braintree_TransparentRedirect::CREATE_TRANSACTION;
174
- $transactionType = isset($params['transaction']['type']) ?
175
- $params['transaction']['type'] :
176
- null;
177
- if ($transactionType != Braintree_Transaction::SALE && $transactionType != Braintree_Transaction::CREDIT) {
178
- throw new InvalidArgumentException(
179
- 'expected transaction[type] of sale or credit, was: ' .
180
- $transactionType
181
- );
182
- }
183
-
184
- return self::_data($params);
185
- }
186
-
187
- /**
188
- * Returns the trData string for updating a credit card.
189
- *
190
- * The paymentMethodToken of the credit card to update is required.
191
- *
192
- * <code>
193
- * $trData = Braintree_TransparentRedirect::updateCreditCardData(array(
194
- * 'redirectUrl' => 'http://example.com/redirect_here',
195
- * 'paymentMethodToken' => 'token123',
196
- * ));
197
- * </code>
198
- *
199
- * @param array $params
200
- * @return string
201
- */
202
- public static function updateCreditCardData($params)
203
- {
204
- Braintree_Util::verifyKeys(
205
- self::$_updateCreditCardSignature,
206
- $params
207
- );
208
- if (!isset($params['paymentMethodToken'])) {
209
- throw new InvalidArgumentException(
210
- 'expected params to contain paymentMethodToken.'
211
- );
212
- }
213
- $params["kind"] = Braintree_TransparentRedirect::UPDATE_PAYMENT_METHOD;
214
- return self::_data($params);
215
- }
216
-
217
- /**
218
- * Returns the trData string for updating a customer.
219
- *
220
- * The customerId of the customer to update is required.
221
- *
222
- * <code>
223
- * $trData = Braintree_TransparentRedirect::updateCustomerData(array(
224
- * 'redirectUrl' => 'http://example.com/redirect_here',
225
- * 'customerId' => 'customer123',
226
- * ));
227
- * </code>
228
- *
229
- * @param array $params
230
- * @return string
231
- */
232
- public static function updateCustomerData($params)
233
- {
234
- Braintree_Util::verifyKeys(
235
- self::$_updateCustomerSignature,
236
- $params
237
- );
238
- if (!isset($params['customerId'])) {
239
- throw new InvalidArgumentException(
240
- 'expected params to contain customerId of customer to update'
241
- );
242
- }
243
- $params["kind"] = Braintree_TransparentRedirect::UPDATE_CUSTOMER;
244
- return self::_data($params);
245
- }
246
-
247
- public static function parseAndValidateQueryString($queryString)
248
- {
249
- // parse the params into an array
250
- parse_str($queryString, $params);
251
- // remove the hash
252
- $queryStringWithoutHash = null;
253
- if(preg_match('/^(.*)&hash=[a-f0-9]+$/', $queryString, $match)) {
254
- $queryStringWithoutHash = $match[1];
255
- }
256
-
257
- if($params['http_status'] != '200') {
258
- $message = null;
259
- if(array_key_exists('bt_message', $params)) {
260
- $message = $params['bt_message'];
261
- }
262
- Braintree_Util::throwStatusCodeException($params['http_status'], $message);
263
- }
264
-
265
- // recreate the hash and compare it
266
- if(self::_hash($queryStringWithoutHash) == $params['hash']) {
267
- return $params;
268
- } else {
269
- throw new Braintree_Exception_ForgedQueryString();
270
- }
271
- }
272
-
273
-
274
- /**
275
- *
276
- * @ignore
277
- */
278
- private static function _data($params)
279
- {
280
- if (!isset($params['redirectUrl'])) {
281
- throw new InvalidArgumentException(
282
- 'expected params to contain redirectUrl'
283
- );
284
- }
285
- $params = self::_underscoreKeys($params);
286
- $now = new DateTime('now', new DateTimeZone('UTC'));
287
- $trDataParams = array_merge($params,
288
- array(
289
- 'api_version' => Braintree_Configuration::API_VERSION,
290
- 'public_key' => Braintree_Configuration::publicKey(),
291
- 'time' => $now->format('YmdHis'),
292
- )
293
- );
294
- ksort($trDataParams);
295
- $trDataSegment = http_build_query($trDataParams, null, '&');
296
- $trDataHash = self::_hash($trDataSegment);
297
- return "$trDataHash|$trDataSegment";
298
- }
299
-
300
- private static function _underscoreKeys($array)
301
- {
302
- foreach($array as $key=>$value)
303
- {
304
- $newKey = Braintree_Util::camelCaseToDelimiter($key, '_');
305
- unset($array[$key]);
306
- if (is_array($value))
307
- {
308
- $array[$newKey] = self::_underscoreKeys($value);
309
- }
310
- else
311
- {
312
- $array[$newKey] = $value;
313
- }
314
- }
315
- return $array;
316
- }
317
-
318
- /**
319
- * @ignore
320
- */
321
- private static function _hash($string)
322
- {
323
- return Braintree_Digest::hexDigest($string);
324
- }
325
-
326
- }
327
- Braintree_TransparentRedirect::init();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Util.php DELETED
@@ -1,290 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Utility methods
4
- * PHP version 5
5
- *
6
- * @copyright 2010 Braintree Payment Solutions
7
- */
8
-
9
- /**
10
- * Braintree Utility methods
11
- *
12
- *
13
- * @copyright 2010 Braintree Payment Solutions
14
- */
15
- class Braintree_Util
16
- {
17
- /**
18
- * extracts an attribute and returns an array of objects
19
- *
20
- * extracts the requested element from an array, and converts the contents
21
- * of its child arrays to objects of type Braintree_$attributeName, or returns
22
- * an array with a single element containing the value of that array element
23
- *
24
- * @param array $attribArray attributes from a search response
25
- * @param string $attributeName indicates which element of the passed array to extract
26
- *
27
- * @return array array of Braintree_$attributeName objects, or a single element array
28
- */
29
- public static function extractAttributeAsArray(& $attribArray, $attributeName)
30
- {
31
- if(!isset($attribArray[$attributeName])):
32
- return array();
33
- endif;
34
-
35
- // get what should be an array from the passed array
36
- $data = $attribArray[$attributeName];
37
- // set up the class that will be used to convert each array element
38
- $classFactory = self::buildClassName($attributeName) . '::factory';
39
- if(is_array($data)):
40
- // create an object from the data in each element
41
- $objectArray = array_map($classFactory, $data);
42
- else:
43
- return array($data);
44
- endif;
45
-
46
- unset($attribArray[$attributeName]);
47
- return $objectArray;
48
- }
49
- /**
50
- * throws an exception based on the type of error
51
- * @param string $statusCode HTTP status code to throw exception from
52
- * @throws Braintree_Exception multiple types depending on the error
53
- *
54
- */
55
- public static function throwStatusCodeException($statusCode, $message=null)
56
- {
57
- switch($statusCode) {
58
- case 401:
59
- throw new Braintree_Exception_Authentication();
60
- break;
61
- case 403:
62
- throw new Braintree_Exception_Authorization($message);
63
- break;
64
- case 404:
65
- throw new Braintree_Exception_NotFound();
66
- break;
67
- case 426:
68
- throw new Braintree_Exception_UpgradeRequired();
69
- break;
70
- case 500:
71
- throw new Braintree_Exception_ServerError();
72
- break;
73
- case 503:
74
- throw new Braintree_Exception_DownForMaintenance();
75
- break;
76
- default:
77
- throw new Braintree_Exception_Unexpected('Unexpected HTTP_RESPONSE #'.$statusCode);
78
- break;
79
- }
80
- }
81
-
82
- /**
83
- * removes the Braintree_ header from a classname
84
- *
85
- * @param string $name Braintree_ClassName
86
- * @return camelCased classname minus Braintree_ header
87
- */
88
- public static function cleanClassName($name)
89
- {
90
- $classNamesToResponseKeys = array(
91
- 'CreditCard' => 'creditCard',
92
- 'Customer' => 'customer',
93
- 'Subscription' => 'subscription',
94
- 'Transaction' => 'transaction',
95
- 'CreditCardVerification' => 'verification',
96
- 'AddOn' => 'addOn',
97
- 'Discount' => 'discount',
98
- 'Plan' => 'plan',
99
- 'Address' => 'address',
100
- 'SettlementBatchSummary' => 'settlementBatchSummary'
101
- );
102
-
103
- $name = str_replace('Braintree_', '', $name);
104
- return $classNamesToResponseKeys[$name];
105
- }
106
-
107
- /**
108
- *
109
- * @param string $name className
110
- * @return string Braintree_ClassName
111
- */
112
- public static function buildClassName($name)
113
- {
114
- $responseKeysToClassNames = array(
115
- 'creditCard' => 'CreditCard',
116
- 'customer' => 'Customer',
117
- 'subscription' => 'Subscription',
118
- 'transaction' => 'Transaction',
119
- 'verification' => 'CreditCardVerification',
120
- 'addOn' => 'AddOn',
121
- 'discount' => 'Discount',
122
- 'plan' => 'Plan',
123
- 'address' => 'Address',
124
- 'settlementBatchSummary' => 'SettlementBatchSummary'
125
- );
126
-
127
- return 'Braintree_' . $responseKeysToClassNames[$name];
128
- }
129
-
130
- /**
131
- * convert alpha-beta-gamma to alphaBetaGamma
132
- *
133
- * @access public
134
- * @param string $string
135
- * @return string modified string
136
- */
137
- public static function delimiterToCamelCase($string, $delimiter = '[\-\_]')
138
- {
139
- return preg_replace('/' . $delimiter . '(\w)/e', 'strtoupper("$1")',$string);
140
- }
141
-
142
- /**
143
- * convert alpha-beta-gamma to alpha_beta_gamma
144
- *
145
- * @access public
146
- * @param string $string
147
- * @return string modified string
148
- */
149
- public static function delimiterToUnderscore($string)
150
- {
151
- return preg_replace('/-/', '_', $string);
152
- }
153
-
154
-
155
- /**
156
- * find capitals and convert to delimiter + lowercase
157
- *
158
- * @access public
159
- * @param var $string
160
- * @return var modified string
161
- */
162
- public static function camelCaseToDelimiter($string, $delimiter = '-')
163
- {
164
- return preg_replace('/([A-Z])/e', '"' . $delimiter . '" . strtolower("$1")', $string);
165
- }
166
-
167
- /**
168
- *
169
- * @param array $array associative array to implode
170
- * @param string $separator (optional, defaults to =)
171
- * @param string $glue (optional, defaults to ', ')
172
- */
173
- public static function implodeAssociativeArray($array, $separator = '=', $glue = ', ')
174
- {
175
- // build a new array with joined keys and values
176
- $tmpArray = null;
177
- foreach ($array AS $key => $value) {
178
- $tmpArray[] = $key . $separator . $value;
179
-
180
- }
181
- // implode and return the new array
182
- return (is_array($tmpArray)) ? implode($glue, $tmpArray) : false;
183
- }
184
-
185
- public static function attributesToString($attributes) {
186
- $printableAttribs = array();
187
- foreach ($attributes AS $key => $value) {
188
- if (is_array($value)) {
189
- $pAttrib = Braintree_Util::attributesToString($value);
190
- } else if ($value instanceof DateTime) {
191
- $pAttrib = $value->format(DateTime::RFC850);
192
- } else {
193
- $pAttrib = $value;
194
- }
195
- $printableAttribs[$key] = sprintf('%s', $pAttrib);
196
- }
197
- return Braintree_Util::implodeAssociativeArray($printableAttribs);
198
- }
199
-
200
- /**
201
- * verify user request structure
202
- *
203
- * compares the expected signature of a gateway request
204
- * against the actual structure sent by the user
205
- *
206
- * @param array $signature
207
- * @param array $attributes
208
- */
209
- public static function verifyKeys($signature, $attributes)
210
- {
211
- $validKeys = self::_flattenArray($signature);
212
- $userKeys = self::_flattenUserKeys($attributes);
213
- $invalidKeys = array_diff($userKeys, $validKeys);
214
- $invalidKeys = self::_removeWildcardKeys($validKeys, $invalidKeys);
215
-
216
- if(!empty($invalidKeys)) {
217
- asort($invalidKeys);
218
- $sortedList = join(', ', $invalidKeys);
219
- throw new InvalidArgumentException('invalid keys: '. $sortedList);
220
- }
221
- }
222
- /**
223
- * flattens a numerically indexed nested array to a single level
224
- * @param array $keys
225
- * @param string $namespace
226
- * @return array
227
- */
228
- private static function _flattenArray($keys, $namespace = null)
229
- {
230
- $flattenedArray = array();
231
- foreach($keys AS $key) {
232
- if(is_array($key)) {
233
- $theKeys = array_keys($key);
234
- $theValues = array_values($key);
235
- $scope = $theKeys[0];
236
- $fullKey = empty($namespace) ? $scope : $namespace . '[' . $scope . ']';
237
- $flattenedArray = array_merge($flattenedArray, self::_flattenArray($theValues[0], $fullKey));
238
- } else {
239
- $fullKey = empty($namespace) ? $key : $namespace . '[' . $key . ']';
240
- $flattenedArray[] = $fullKey;
241
- }
242
- }
243
- sort($flattenedArray);
244
- return $flattenedArray;
245
- }
246
-
247
- private static function _flattenUserKeys($keys, $namespace = null)
248
- {
249
- $flattenedArray = array();
250
-
251
- foreach($keys AS $key => $value) {
252
- $fullKey = empty($namespace) ? $key : $namespace;
253
- if (!is_numeric($key) && $namespace != null) {
254
- $fullKey .= '[' . $key . ']';
255
- }
256
- if (is_numeric($key) && is_string($value)) {
257
- $fullKey .= '[' . $value . ']';
258
- }
259
- if(is_array($value)) {
260
- $more = self::_flattenUserKeys($value, $fullKey);
261
- $flattenedArray = array_merge($flattenedArray, $more);
262
- } else {
263
- $flattenedArray[] = $fullKey;
264
- }
265
- }
266
- sort($flattenedArray);
267
- return $flattenedArray;
268
- }
269
-
270
- /**
271
- * removes wildcard entries from the invalid keys array
272
- * @param array $validKeys
273
- * @param <array $invalidKeys
274
- * @return array
275
- */
276
- private static function _removeWildcardKeys($validKeys, $invalidKeys)
277
- {
278
- foreach($validKeys AS $key) {
279
- if (stristr($key, '[_anyKey_]')) {
280
- $wildcardKey = str_replace('[_anyKey_]', '', $key);
281
- foreach ($invalidKeys AS $index => $invalidKey) {
282
- if (stristr($invalidKey, $wildcardKey)) {
283
- unset($invalidKeys[$index]);
284
- }
285
- }
286
- }
287
- }
288
- return $invalidKeys;
289
- }
290
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Version.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Library Version
4
- *
5
- * @copyright 2010 Braintree Payment Solutions
6
- */
7
-
8
- /**
9
- * stores version information about the Braintree library
10
- *
11
- *
12
- * @copyright 2010 Braintree Payment Solutions
13
- */
14
- final class Braintree_Version
15
- {
16
- /**
17
- * class constants
18
- */
19
- const MAJOR = 2;
20
- const MINOR = 19;
21
- const TINY = 0;
22
-
23
- /**
24
- * @ignore
25
- * @access protected
26
- */
27
- protected function __construct()
28
- {
29
- }
30
-
31
- /**
32
- *
33
- * @return string the current library version
34
- */
35
- public static function get()
36
- {
37
- return self::MAJOR.'.'.self::MINOR.'.'.self::TINY;
38
- }
39
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/WebhookNotification.php DELETED
@@ -1,66 +0,0 @@
1
- <?php
2
- class Braintree_WebhookNotification extends Braintree
3
- {
4
- const SUBSCRIPTION_CANCELED = 'subscription_canceled';
5
- const SUBSCRIPTION_CHARGED_SUCCESSFULLY = 'subscription_charged_successfully';
6
- const SUBSCRIPTION_CHARGED_UNSUCCESSFULLY = 'subscription_charged_unsuccessfully';
7
- const SUBSCRIPTION_EXPIRED = 'subscription_expired';
8
- const SUBSCRIPTION_TRIAL_ENDED = 'subscription_trial_ended';
9
- const SUBSCRIPTION_WENT_ACTIVE = 'subscription_went_active';
10
- const SUBSCRIPTION_WENT_PAST_DUE = 'subscription_went_past_due';
11
-
12
- public static function parse($signature, $payload)
13
- {
14
- self::_validateSignature($signature, $payload);
15
-
16
- $xml = base64_decode($payload);
17
- $attributes = Braintree_Xml::buildArrayFromXml($xml);
18
- return self::factory($attributes['notification']);
19
- }
20
-
21
- public static function verify($challenge)
22
- {
23
- $publicKey = Braintree_Configuration::publicKey();
24
- $digest = Braintree_Digest::hexDigest($challenge);
25
- return "{$publicKey}|{$digest}";
26
- }
27
-
28
- public static function factory($attributes)
29
- {
30
- $instance = new self();
31
- $instance->_initialize($attributes);
32
- return $instance;
33
- }
34
-
35
- private static function _matchingSignature($signaturePairs)
36
- {
37
- foreach ($signaturePairs as $pair)
38
- {
39
- $components = preg_split("/\|/", $pair);
40
- if ($components[0] == Braintree_Configuration::publicKey()) {
41
- return $components[1];
42
- }
43
- }
44
-
45
- return null;
46
- }
47
-
48
- private static function _validateSignature($signature, $payload)
49
- {
50
- $signaturePairs = preg_split("/&/", $signature);
51
- $matchingSignature = self::_matchingSignature($signaturePairs);
52
-
53
- $payloadSignature = Braintree_Digest::hexDigest($payload);
54
- if (!Braintree_Digest::secureCompare($matchingSignature, $payloadSignature)) {
55
- throw new Braintree_Exception_InvalidSignature("webhook notification signature invalid");
56
- }
57
- }
58
-
59
- protected function _initialize($attributes)
60
- {
61
- $this->_attributes = $attributes;
62
- if (isset($attributes['subject']) && isset($attributes['subject']['subscription'])) {
63
- $this->_set('subscription', Braintree_Subscription::factory($attributes['subject']['subscription']));
64
- }
65
- }
66
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/WebhookTesting.php DELETED
@@ -1,52 +0,0 @@
1
- <?php
2
- class Braintree_WebhookTesting
3
- {
4
- public static function sampleNotification($kind, $id)
5
- {
6
- $payload = base64_encode(self::_sampleXml($kind, $id));
7
- $signature = Braintree_Configuration::publicKey() . "|" . Braintree_Digest::hexDigest($payload);
8
-
9
- return array(
10
- 'signature' => $signature,
11
- 'payload' => $payload
12
- );
13
- }
14
-
15
- private static function _sampleXml($kind, $id)
16
- {
17
- $subjectXml = self::_subscriptionSampleXml($id);
18
- $timestamp = self::_timestamp();
19
- return "
20
- <notification>
21
- <timestamp type=\"datetime\">{$timestamp}</timestamp>
22
- <kind>{$kind}</kind>
23
- <subject>{$subjectXml}</subject>
24
- </notification>
25
- ";
26
- }
27
-
28
- private static function _subscriptionSampleXml($id)
29
- {
30
- return "
31
- <subscription>
32
- <id>{$id}</id>
33
- <transactions type=\"array\">
34
- </transactions>
35
- <add_ons type=\"array\">
36
- </add_ons>
37
- <discounts type=\"array\">
38
- </discounts>
39
- </subscription>
40
- ";
41
- }
42
-
43
- private static function _timestamp()
44
- {
45
- $originalZone = date_default_timezone_get();
46
- date_default_timezone_set('UTC');
47
- $timestamp = strftime('%Y-%m-%dT%TZ');
48
- date_default_timezone_set($originalZone);
49
-
50
- return $timestamp;
51
- }
52
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Xml.php DELETED
@@ -1,43 +0,0 @@
1
- <?php
2
- /**
3
- * Braintree Xml parser and generator
4
- * PHP version 5
5
- *
6
- * @copyright 2010 Braintree Payment Solutions
7
- */
8
-
9
- /**
10
- * superclass for Braintree XML parsing and generation
11
- *
12
- * @copyright 2010 Braintree Payment Solutions
13
- */
14
- final class Braintree_Xml
15
- {
16
- /**
17
- * @ignore
18
- */
19
- protected function __construct()
20
- {
21
-
22
- }
23
-
24
- /**
25
- *
26
- * @param string $xml
27
- * @return array
28
- */
29
- public static function buildArrayFromXml($xml)
30
- {
31
- return Braintree_Xml_Parser::arrayFromXml($xml);
32
- }
33
-
34
- /**
35
- *
36
- * @param array $array
37
- * @return string
38
- */
39
- public static function buildXmlFromArray($array)
40
- {
41
- return Braintree_Xml_Generator::arrayToXml($array);
42
- }
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Xml/Generator.php DELETED
@@ -1,144 +0,0 @@
1
- <?php
2
- /**
3
- * PHP version 5
4
- *
5
- * @copyright 2010 Braintree Payment Solutions
6
- */
7
-
8
- /**
9
- * Generates XML output from arrays using PHP's
10
- * built-in XMLWriter
11
- *
12
- * @copyright 2010 Braintree Payment Solutions
13
- */
14
- class Braintree_Xml_Generator
15
- {
16
- /**
17
- * arrays passed to this method should have a single root element
18
- * with an array as its value
19
- * @param array $aData the array of data
20
- * @return var XML string
21
- */
22
- public static function arrayToXml($aData)
23
- {
24
- // set up the XMLWriter
25
- $writer = new XMLWriter();
26
- $writer->openMemory();
27
-
28
- $writer->setIndent(true);
29
- $writer->setIndentString(' ');
30
- $writer->startDocument('1.0', 'UTF-8');
31
-
32
- // get the root element name
33
- $aKeys = array_keys($aData);
34
- $rootElementName = $aKeys[0];
35
- // open the root element
36
- $writer->startElement(Braintree_Util::camelCaseToDelimiter($rootElementName));
37
- // create the body
38
- self::_createElementsFromArray($writer, $aData[$rootElementName], $rootElementName);
39
-
40
- // close the root element and document
41
- $writer->endElement();
42
- $writer->endDocument();
43
-
44
- // send the output as string
45
- return $writer->outputMemory();
46
- }
47
-
48
- /**
49
- * Construct XML elements with attributes from an associative array.
50
- *
51
- * @access protected
52
- * @static
53
- * @param object $writer XMLWriter object
54
- * @param array $aData contains attributes and values
55
- * @return none
56
- */
57
- private static function _createElementsFromArray(&$writer, $aData)
58
- {
59
- if (!is_array($aData)) {
60
- if (is_bool($aData)) {
61
- $writer->text($aData ? 'true' : 'false');
62
- } else {
63
- $writer->text($aData);
64
- }
65
- return;
66
- }
67
- foreach ($aData AS $index => $element) {
68
- // convert the style back to gateway format
69
- $elementName = Braintree_Util::camelCaseToDelimiter($index, '-');
70
- // handle child elements
71
- $writer->startElement($elementName);
72
- if (is_array($element)) {
73
- if (array_key_exists(0, $element) || empty($element)) {
74
- $writer->writeAttribute('type', 'array');
75
- foreach ($element AS $ignored => $itemInArray) {
76
- $writer->startElement('item');
77
- self::_createElementsFromArray($writer, $itemInArray);
78
- $writer->endElement();
79
- }
80
- }
81
- else {
82
- self::_createElementsFromArray($writer, $element);
83
- }
84
- } else {
85
- // generate attributes as needed
86
- $attribute = self::_generateXmlAttribute($element);
87
- if (is_array($attribute)) {
88
- $writer->writeAttribute($attribute[0], $attribute[1]);
89
- $element = $attribute[2];
90
- }
91
- $writer->text($element);
92
- }
93
- $writer->endElement();
94
- }
95
- }
96
-
97
- /**
98
- * convert passed data into an array of attributeType, attributeName, and value
99
- * dates sent as DateTime objects will be converted to strings
100
- * @access protected
101
- * @param mixed $value
102
- * @return array attributes and element value
103
- */
104
- private static function _generateXmlAttribute($value)
105
- {
106
- if ($value instanceof DateTime) {
107
- return array('type', 'datetime', self::_dateTimeToXmlTimestamp($value));
108
- }
109
- if (is_int($value)) {
110
- return array('type', 'integer', $value);
111
- }
112
- if (is_bool($value)) {
113
- return array('type', 'boolean', ($value ? 'true' : 'false'));
114
- }
115
- if ($value === NULL) {
116
- return array('nil', 'true', $value);
117
- }
118
- }
119
- /**
120
- * converts datetime back to xml schema format
121
- * @access protected
122
- * @param object $dateTime
123
- * @return var XML schema formatted timestamp
124
- */
125
- private static function _dateTimeToXmlTimestamp($dateTime)
126
- {
127
- $dateTime->setTimeZone(new DateTimeZone('UTC'));
128
- return ($dateTime->format('Y-m-d\TH:i:s') . 'Z');
129
- }
130
-
131
- private static function _castDateTime($string)
132
- {
133
- try {
134
- if (empty($string)) {
135
- return false;
136
- }
137
- $dateTime = new DateTime($string);
138
- return self::_dateTimeToXmlTimestamp($dateTime);
139
- } catch (Exception $e) {
140
- // not a datetime
141
- return false;
142
- }
143
- }
144
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/Braintree/Xml/Parser.php DELETED
@@ -1,179 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Braintree XML Parser
5
- *
6
- * @copyright 2010 Braintree Payment Solutions
7
- */
8
- /**
9
- * Parses incoming Xml into arrays using PHP's
10
- * built-in SimpleXML, and its extension via
11
- * Iterator, SimpleXMLIterator
12
- *
13
- * @copyright 2010 Braintree Payment Solutions
14
- */
15
- class Braintree_Xml_Parser
16
- {
17
-
18
- private static $_xmlRoot;
19
- private static $_responseType;
20
-
21
- /**
22
- * sets up the SimpleXMLIterator and starts the parsing
23
- * @access public
24
- * @param string $xml
25
- * @return array array mapped to the passed xml
26
- */
27
- public static function arrayFromXml($xml)
28
- {
29
- // SimpleXML provides the root information on construct
30
- $iterator = new SimpleXMLIterator($xml);
31
- $xmlRoot = Braintree_Util::delimiterToCamelCase($iterator->getName());
32
- $type = $iterator->attributes()->type;
33
-
34
- self::$_xmlRoot = $iterator->getName();
35
- self::$_responseType = $type;
36
-
37
- // return the mapped array with the root element as the header
38
- return array($xmlRoot => self::_iteratorToArray($iterator));
39
-
40
- }
41
-
42
- /**
43
- * processes SimpleXMLIterator objects recursively
44
- *
45
- * @access protected
46
- * @param object $iterator
47
- * @return array xml converted to array
48
- */
49
- private static function _iteratorToArray($iterator)
50
- {
51
- $xmlArray = array();
52
- $value = null;
53
-
54
- // rewind the iterator and check if the position is valid
55
- // if not, return the string it contains
56
- $iterator->rewind();
57
- if (!$iterator->valid()) {
58
- return self::_typecastXmlValue($iterator);
59
- }
60
- for ($iterator->rewind(); $iterator->valid(); $iterator->next()) {
61
-
62
- $tmpArray = null;
63
- $value = null;
64
-
65
- // get the attribute type string for use in conditions below
66
- $attributeType = $iterator->attributes()->type;
67
-
68
- // extract the parent element via xpath query
69
- $parentElement = $iterator->xpath($iterator->key() . '/..');
70
- if ($parentElement[0] instanceof SimpleXMLIterator) {
71
- $parentElement = $parentElement[0];
72
- $parentKey = Braintree_Util::delimiterToCamelCase($parentElement->getName());
73
- } else {
74
- $parentElement = null;
75
- }
76
-
77
-
78
- if ($parentKey == "customFields") {
79
- $key = Braintree_Util::delimiterToUnderscore($iterator->key());
80
- } else {
81
- $key = Braintree_Util::delimiterToCamelCase($iterator->key());
82
- }
83
-
84
- // process children recursively
85
- if ($iterator->hasChildren()) {
86
- // return the child elements
87
- $value = self::_iteratorToArray($iterator->current());
88
-
89
- // if the element is an array type,
90
- // use numeric keys to allow multiple values
91
- if ($attributeType != 'array') {
92
- $tmpArray[$key] = $value;
93
- }
94
- } else {
95
- // cast values according to attributes
96
- $tmpArray[$key] = self::_typecastXmlValue($iterator->current());
97
- }
98
-
99
- // set the output string
100
- $output = isset($value) ? $value : $tmpArray[$key];
101
-
102
- // determine if there are multiple tags of this name at the same level
103
- if (isset($parentElement) &&
104
- ($parentElement->attributes()->type == 'collection') &&
105
- $iterator->hasChildren()) {
106
- $xmlArray[$key][] = $output;
107
- continue;
108
- }
109
-
110
- // if the element was an array type, output to a numbered key
111
- // otherwise, use the element name
112
- if ($attributeType == 'array') {
113
- $xmlArray[] = $output;
114
- } else {
115
- $xmlArray[$key] = $output;
116
- }
117
- }
118
-
119
- return $xmlArray;
120
- }
121
-
122
- /**
123
- * typecast xml value based on attributes
124
- * @param object $valueObj SimpleXMLElement
125
- * @return mixed value for placing into array
126
- */
127
- private static function _typecastXmlValue($valueObj)
128
- {
129
- // get the element attributes
130
- $attribs = $valueObj->attributes();
131
- // the element is null, so jump out here
132
- if (isset($attribs->nil) && $attribs->nil) {
133
- return null;
134
- }
135
- // switch on the type attribute
136
- // switch works even if $attribs->type isn't set
137
- switch ($attribs->type) {
138
- case 'datetime':
139
- return self::_timestampToUTC((string) $valueObj);
140
- break;
141
- case 'date':
142
- return new DateTime((string)$valueObj);
143
- break;
144
- case 'integer':
145
- return (int) $valueObj;
146
- break;
147
- case 'boolean':
148
- $value = (string) $valueObj;
149
- // look for a number inside the string
150
- if(is_numeric($value)) {
151
- return (bool) $value;
152
- } else {
153
- // look for the string "true", return false in all other cases
154
- return ($value != "true") ? FALSE : TRUE;
155
- }
156
- break;
157
- case 'array':
158
- return array();
159
- default:
160
- return (string) $valueObj;
161
- }
162
-
163
- }
164
-
165
- /**
166
- * convert xml timestamps into DateTime
167
- * @param string $timestamp
168
- * @return string UTC formatted datetime string
169
- */
170
- private static function _timestampToUTC($timestamp)
171
- {
172
- $tz = new DateTimeZone('UTC');
173
- // strangely DateTime requires an explicit set below
174
- // to show the proper time zone
175
- $dateTime = new DateTime($timestamp, $tz);
176
- $dateTime->setTimezone($tz);
177
- return $dateTime;
178
- }
179
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/ssl/sandbox_braintreegateway_com.ca.crt DELETED
@@ -1,19 +0,0 @@
1
- Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//emailAddress=info@valicert.com
2
- -----BEGIN CERTIFICATE-----
3
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
4
- IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
5
- BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
6
- aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
7
- 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
8
- NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
9
- azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
10
- YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
11
- Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
12
- cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
13
- dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
14
- WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
15
- v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
16
- UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
17
- IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
18
- W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
19
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Braintree/ssl/www_braintreegateway_com.ca.crt DELETED
@@ -1,202 +0,0 @@
1
- Subject: O=Entrust.net, OU=www.entrust.net/GCCA_CPS incorp. by ref. (limits liab.), OU=(c) 2000 Entrust.net Limited, CN=Entrust.net Client Certification Authority
2
- -----BEGIN CERTIFICATE-----
3
- MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE
4
- ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB
5
- X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
6
- HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
7
- c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy
8
- MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0
9
- Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y
10
- cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
11
- RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp
12
- ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
13
- A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU
14
- rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB
15
- 3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y
16
- NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E
17
- gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw
18
- PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
19
- ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0
20
- Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy
21
- dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
22
- IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD
23
- AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW
24
- BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
25
- fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA
26
- O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L
27
- a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l
28
- TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg==
29
- -----END CERTIFICATE-----
30
-
31
- Subject: O=Entrust.net, OU=www.entrust.net/SSL_CPS incorp. by ref. (limits liab.), OU=(c) 2000 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
32
- -----BEGIN CERTIFICATE-----
33
- MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE
34
- ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf
35
- Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
36
- KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz
37
- dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
38
- Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF
39
- bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg
40
- aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg
41
- MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l
42
- dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G
43
- CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw
44
- tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK
45
- wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI
46
- XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD
47
- AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu
48
- dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
49
- bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy
50
- MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0
51
- IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
52
- BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw
53
- NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc
54
- /vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV
55
- HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq
56
- hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv
57
- yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp
58
- bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/
59
- bIkz8OwVDw==
60
- -----END CERTIFICATE-----
61
-
62
- Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
63
- -----BEGIN CERTIFICATE-----
64
- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE
65
- ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf
66
- MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
67
- HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
68
- c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy
69
- MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0
70
- Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y
71
- cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg
72
- RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy
73
- dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF
74
- AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4
75
- QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC
76
- DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj
77
- /L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP
78
- KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd
79
- enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
80
- 4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB
81
- 0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ
82
- FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
83
- AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh
84
- fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU
85
- KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho
86
- wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2
87
- +z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888
88
- 6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
89
- -----END CERTIFICATE-----
90
-
91
- Subject: C=US, O=Entrust.net, OU=www.entrust.net/Client_CA_Info/CPS incorp. by ref. limits liab., OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Client Certification Authority
92
- -----BEGIN CERTIFICATE-----
93
- MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE
94
- BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50
95
- cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs
96
- aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp
97
- bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0
98
- aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa
99
- MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV
100
- BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw
101
- LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50
102
- cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50
103
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL
104
- ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv
105
- x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV
106
- iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173
107
- iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw
108
- ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
109
- cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff
110
- SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE
111
- CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
112
- cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD
113
- VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D
114
- bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx
115
- MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW
116
- /O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG
117
- A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
118
- hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ
119
- OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU
120
- ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE
121
- PHayXOw=
122
- -----END CERTIFICATE-----
123
-
124
- Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
125
- -----BEGIN CERTIFICATE-----
126
- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE
127
- BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50
128
- cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
129
- MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
130
- AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1
131
- dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw
132
- CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3
133
- dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
134
- Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow
135
- OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
136
- b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0
137
- VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN
138
- iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk
139
- mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT
140
- MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY
141
- pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
142
- BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs
143
- aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM
144
- aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
145
- cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo
146
- dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi
147
- gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC
148
- AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE
149
- FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9
150
- B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn
151
- CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx
152
- xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6
153
- rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
154
- -----END CERTIFICATE-----
155
-
156
- Subject: C=US, O=SecureTrust Corporation, CN=SecureTrust CA
157
- -----BEGIN CERTIFICATE-----
158
- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
159
- MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
160
- FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
161
- MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
162
- cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
163
- AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
164
- Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
165
- 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
166
- wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
167
- 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
168
- 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
169
- BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
170
- /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
171
- JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
172
- NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
173
- 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
174
- 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
175
- D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
176
- CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
177
- 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
178
- -----END CERTIFICATE-----
179
-
180
- Subject: C=US, O=SecureTrust Corporation, CN=Secure Global CA
181
- -----BEGIN CERTIFICATE-----
182
- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
183
- MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
184
- GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
185
- MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
186
- Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
187
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
188
- iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
189
- /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
190
- jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
191
- HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
192
- sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
193
- gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
194
- MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
195
- KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
196
- AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
197
- URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
198
- H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
199
- I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
200
- iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
201
- f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
202
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/CyberSource/cyber_source_soap_client.php DELETED
@@ -1,87 +0,0 @@
1
- <?php
2
- /**
3
- * CyberSource version of SoapClient.
4
- *
5
- * An extension of PHP's own SoapClient library that includes the security
6
- * header required by CyberSource. To enable SOAP support, PHP must be
7
- * configured with --enable-soap.
8
- *
9
- * @author joe bartlett (xo@jdbartlett.com)
10
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
11
- * @package CyberSource
12
- * @subpackage CyberSource.libs
13
- * @github https://github.com/jdbartlett/CyberSource/blob/master/libs/cyber_source_soap_client.php
14
- */
15
- class CyberSourceSoapClient extends SoapClient {
16
-
17
- /**
18
- * Instance-specific array to contain CyberSource-specific configuration
19
- * settings.
20
- *
21
- * @var array
22
- * @access protected
23
- */
24
- protected $_cyberSourceOptions = null;
25
-
26
- /**
27
- * Constructor.
28
- *
29
- * The WSDL is generated by CyberSourceSource::_buildWsdl, in accordance with
30
- * the DataSource settings.
31
- *
32
- * The CyberSource Options array should contain a 'merchantID' key and a
33
- * 'transactionKey' key, with appropriate string values.
34
- *
35
- * The SOAP options array (the standard options array for PHP's SoapClient
36
- * class) can be empty for CyberSource transactions.
37
- *
38
- * @param mixed $wsdl
39
- * @param array $cyberSourceOptions
40
- * @param array $soapOptions
41
- * @access private
42
- */
43
- public function __construct($wsdl, $cyberSourceOptions = null, $soapOptions = array()) {
44
- parent::__construct($wsdl, $soapOptions);
45
-
46
- $this->_cyberSourceOptions = array_merge(array(
47
- 'merchantID' => '',
48
- 'transactionKey' => '',
49
- ), is_array($cyberSourceOptions) ? $cyberSourceOptions : array());
50
- }
51
-
52
- /**
53
- * Transport layer for SOAP request.
54
- *
55
- * This is a straightforward wrapper for the standard SoapClient::__doRequest
56
- * method; its parameters are identical.
57
- *
58
- * @param string $request
59
- * @param string $location
60
- * @param string $action
61
- * @param string $version
62
- * @param integer $one_way
63
- * @return string XML SOAP response
64
- * @access private
65
- */
66
- public function __doRequest($request, $location, $action, $version, $one_way = 0) {
67
- $soapHeader = sprintf("<SOAP-ENV:Header xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><wsse:Security SOAP-ENV:mustUnderstand=\"1\"><wsse:UsernameToken><wsse:Username>%s</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">%s</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header>", $this->_cyberSourceOptions['merchantID'], $this->_cyberSourceOptions['transactionKey']);
68
-
69
- $requestDOM = new DOMDocument('1.0');
70
- $soapHeaderDOM = new DOMDocument('1.0');
71
-
72
- try {
73
- $requestDOM->loadXML($request);
74
- $soapHeaderDOM->loadXML($soapHeader);
75
- $node = $requestDOM->importNode($soapHeaderDOM->firstChild, true);
76
- $requestDOM->firstChild->insertBefore(
77
- $node, $requestDOM->firstChild->firstChild);
78
-
79
- $request = $requestDOM->saveXML();
80
- } catch (DOMException $e) {
81
- trigger_error("CybserSource Error: Couldn't add token: " . $e->code, E_USER_WARNING);
82
- }
83
-
84
- return parent::__doRequest($request, $location, $action, $version);
85
- }
86
-
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe.php CHANGED
@@ -9,12 +9,34 @@ if (!function_exists('curl_init')) {
9
  if (!function_exists('json_decode')) {
10
  throw new Exception('Stripe needs the JSON PHP extension.');
11
  }
12
- if (!function_exists('mb_detect_encoding')) {
13
- throw new Exception('Stripe needs the Multibyte String PHP extension.');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
 
16
- // Stripe singleton
17
- require(dirname(__FILE__) . '/Stripe/Stripe.php');
18
 
19
  // Utilities
20
  require(dirname(__FILE__) . '/Stripe/Util.php');
@@ -32,24 +54,13 @@ require(dirname(__FILE__) . '/Stripe/InvalidRequestError.php');
32
  require(dirname(__FILE__) . '/Stripe/Object.php');
33
  require(dirname(__FILE__) . '/Stripe/ApiRequestor.php');
34
  require(dirname(__FILE__) . '/Stripe/ApiResource.php');
35
- require(dirname(__FILE__) . '/Stripe/SingletonApiResource.php');
36
- require(dirname(__FILE__) . '/Stripe/AttachedObject.php');
37
- require(dirname(__FILE__) . '/Stripe/List.php');
38
 
39
  // Stripe API Resources
40
- require(dirname(__FILE__) . '/Stripe/Account.php');
41
- require(dirname(__FILE__) . '/Stripe/Card.php');
42
- require(dirname(__FILE__) . '/Stripe/Balance.php');
43
- require(dirname(__FILE__) . '/Stripe/BalanceTransaction.php');
44
  require(dirname(__FILE__) . '/Stripe/Charge.php');
45
  require(dirname(__FILE__) . '/Stripe/Customer.php');
46
  require(dirname(__FILE__) . '/Stripe/Invoice.php');
47
  require(dirname(__FILE__) . '/Stripe/InvoiceItem.php');
48
  require(dirname(__FILE__) . '/Stripe/Plan.php');
49
- require(dirname(__FILE__) . '/Stripe/Subscription.php');
50
  require(dirname(__FILE__) . '/Stripe/Token.php');
51
  require(dirname(__FILE__) . '/Stripe/Coupon.php');
52
  require(dirname(__FILE__) . '/Stripe/Event.php');
53
- require(dirname(__FILE__) . '/Stripe/Transfer.php');
54
- require(dirname(__FILE__) . '/Stripe/Recipient.php');
55
- require(dirname(__FILE__) . '/Stripe/ApplicationFee.php');
9
  if (!function_exists('json_decode')) {
10
  throw new Exception('Stripe needs the JSON PHP extension.');
11
  }
12
+
13
+
14
+ abstract class Stripe
15
+ {
16
+ public static $apiKey;
17
+ public static $apiBase = 'https://api.stripe.com/v1';
18
+ public static $verifySslCerts = true;
19
+ const VERSION = '1.6.4';
20
+
21
+ public static function getApiKey()
22
+ {
23
+ return self::$apiKey;
24
+ }
25
+
26
+ public static function setApiKey($apiKey)
27
+ {
28
+ self::$apiKey = $apiKey;
29
+ }
30
+
31
+ public static function getVerifySslCerts() {
32
+ return self::$verifySslCerts;
33
+ }
34
+
35
+ public static function setVerifySslCerts($verify) {
36
+ self::$verifySslCerts = $verify;
37
+ }
38
  }
39
 
 
 
40
 
41
  // Utilities
42
  require(dirname(__FILE__) . '/Stripe/Util.php');
54
  require(dirname(__FILE__) . '/Stripe/Object.php');
55
  require(dirname(__FILE__) . '/Stripe/ApiRequestor.php');
56
  require(dirname(__FILE__) . '/Stripe/ApiResource.php');
 
 
 
57
 
58
  // Stripe API Resources
 
 
 
 
59
  require(dirname(__FILE__) . '/Stripe/Charge.php');
60
  require(dirname(__FILE__) . '/Stripe/Customer.php');
61
  require(dirname(__FILE__) . '/Stripe/Invoice.php');
62
  require(dirname(__FILE__) . '/Stripe/InvoiceItem.php');
63
  require(dirname(__FILE__) . '/Stripe/Plan.php');
 
64
  require(dirname(__FILE__) . '/Stripe/Token.php');
65
  require(dirname(__FILE__) . '/Stripe/Coupon.php');
66
  require(dirname(__FILE__) . '/Stripe/Event.php');
 
 
 
includes/lib/Stripe/Stripe/Account.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Account extends Stripe_SingletonApiResource
4
- {
5
- /**
6
- * @param string|null $apiKey
7
- *
8
- * @return Stripe_Account
9
- */
10
- public static function retrieve($apiKey=null)
11
- {
12
- $class = get_class();
13
- return self::_scopedSingletonRetrieve($class, $apiKey);
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/ApiRequestor.php CHANGED
@@ -2,9 +2,6 @@
2
 
3
  class Stripe_ApiRequestor
4
  {
5
- /**
6
- * @var string $apiKey The API key that's to be used to make requests.
7
- */
8
  public $apiKey;
9
 
10
  public function __construct($apiKey=null)
@@ -12,37 +9,24 @@ class Stripe_ApiRequestor
12
  $this->_apiKey = $apiKey;
13
  }
14
 
15
- /**
16
- * @param string $url The path to the API endpoint.
17
- *
18
- * @returns string The full path.
19
- */
20
  public static function apiUrl($url='')
21
  {
22
  $apiBase = Stripe::$apiBase;
23
  return "$apiBase$url";
24
  }
25
 
26
- /**
27
- * @param string|mixed $value A string to UTF8-encode.
28
- *
29
- * @returns string|mixed The UTF8-encoded string, or the object passed in if
30
- * it wasn't a string.
31
- */
32
  public static function utf8($value)
33
  {
34
- if (is_string($value)
35
- && mb_detect_encoding($value, "UTF-8", TRUE) != "UTF-8") {
36
  return utf8_encode($value);
37
- } else {
38
  return $value;
39
- }
40
  }
41
 
42
  private static function _encodeObjects($d)
43
  {
44
- if ($d instanceof Stripe_ApiResource) {
45
- return self::utf8($d->id);
46
  } else if ($d === true) {
47
  return 'true';
48
  } else if ($d === false) {
@@ -50,136 +34,70 @@ class Stripe_ApiRequestor
50
  } else if (is_array($d)) {
51
  $res = array();
52
  foreach ($d as $k => $v)
53
- $res[$k] = self::_encodeObjects($v);
54
  return $res;
55
  } else {
56
- return self::utf8($d);
57
  }
58
  }
59
 
60
- /**
61
- * @param array $arr An map of param keys to values.
62
- * @param string|null $prefix (It doesn't look like we ever use $prefix...)
63
- *
64
- * @returns string A querystring, essentially.
65
- */
66
- public static function encode($arr, $prefix=null)
67
  {
68
- if (!is_array($arr))
69
- return $arr;
70
-
71
- $r = array();
72
- foreach ($arr as $k => $v) {
73
- if (is_null($v))
74
- continue;
75
-
76
- if ($prefix && $k && !is_int($k))
77
- $k = $prefix."[".$k."]";
78
- else if ($prefix)
79
- $k = $prefix."[]";
80
-
81
- if (is_array($v)) {
82
- $r[] = self::encode($v, $k, true);
83
- } else {
84
- $r[] = urlencode($k)."=".urlencode($v);
85
- }
86
- }
87
-
88
- return implode("&", $r);
89
  }
90
 
91
- /**
92
- * @param string $method
93
- * @param string $url
94
- * @param array|null $params
95
- *
96
- * @return array An array whose first element is the response and second
97
- * element is the API key used to make the request.
98
- */
99
- public function request($method, $url, $params=null)
100
  {
101
  if (!$params)
102
  $params = array();
103
- list($rbody, $rcode, $myApiKey) = $this->_requestRaw($method, $url, $params);
104
  $resp = $this->_interpretResponse($rbody, $rcode);
105
  return array($resp, $myApiKey);
106
  }
107
 
108
-
109
- /**
110
- * @param string $rbody A JSON string.
111
- * @param int $rcode
112
- * @param array $resp
113
- *
114
- * @throws Stripe_InvalidRequestError if the error is caused by the user.
115
- * @throws Stripe_AuthenticationError if the error is caused by a lack of
116
- * permissions.
117
- * @throws Stripe_CardError if the error is the error code is 402 (payment
118
- * required)
119
- * @throws Stripe_ApiError otherwise.
120
- */
121
  public function handleApiError($rbody, $rcode, $resp)
122
  {
123
- if (!is_array($resp) || !isset($resp['error'])) {
124
- $msg = "Invalid response object from API: $rbody "
125
- ."(HTTP response code was $rcode)";
126
- throw new Stripe_ApiError($msg, $rcode, $rbody, $resp);
127
- }
128
-
129
  $error = $resp['error'];
130
- $msg = isset($error['message']) ? $error['message'] : null;
131
- $param = isset($error['param']) ? $error['param'] : null;
132
- $code = isset($error['code']) ? $error['code'] : null;
133
-
134
  switch ($rcode) {
135
  case 400:
136
  case 404:
137
- throw new Stripe_InvalidRequestError(
138
- $msg, $param, $rcode, $rbody, $resp
139
- );
140
  case 401:
141
- throw new Stripe_AuthenticationError($msg, $rcode, $rbody, $resp);
142
  case 402:
143
- throw new Stripe_CardError($msg, $param, $code, $rcode, $rbody, $resp);
 
 
 
144
  default:
145
- throw new Stripe_ApiError($msg, $rcode, $rbody, $resp);
146
  }
147
  }
148
 
149
- private function _requestRaw($method, $url, $params)
150
  {
151
  $myApiKey = $this->_apiKey;
152
  if (!$myApiKey)
153
  $myApiKey = Stripe::$apiKey;
154
-
155
- if (!$myApiKey) {
156
- $msg = 'No API key provided. (HINT: set your API key using '
157
- . '"Stripe::setApiKey(<API-KEY>)". You can generate API keys from '
158
- . 'the Stripe web interface. See https://stripe.com/api for '
159
- . 'details, or email support@stripe.com if you have any questions.';
160
- throw new Stripe_AuthenticationError($msg);
161
- }
162
 
163
  $absUrl = $this->apiUrl($url);
164
  $params = self::_encodeObjects($params);
165
  $langVersion = phpversion();
166
  $uname = php_uname();
167
  $ua = array('bindings_version' => Stripe::VERSION,
168
- 'lang' => 'php',
169
- 'lang_version' => $langVersion,
170
- 'publisher' => 'stripe',
171
- 'uname' => $uname);
172
  $headers = array('X-Stripe-Client-User-Agent: ' . json_encode($ua),
173
- 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION,
174
- 'Authorization: Bearer ' . $myApiKey);
175
- if (Stripe::$apiVersion)
176
- $headers[] = 'Stripe-Version: ' . Stripe::$apiVersion;
177
- list($rbody, $rcode) = $this->_curlRequest(
178
- $method,
179
- $absUrl,
180
- $headers,
181
- $params
182
- );
183
  return array($rbody, $rcode, $myApiKey);
184
  }
185
 
@@ -188,9 +106,7 @@ class Stripe_ApiRequestor
188
  try {
189
  $resp = json_decode($rbody, true);
190
  } catch (Exception $e) {
191
- $msg = "Invalid response body from API: $rbody "
192
- . "(HTTP response code was $rcode)";
193
- throw new Stripe_ApiError($msg, $rcode, $rbody);
194
  }
195
 
196
  if ($rcode < 200 || $rcode >= 300) {
@@ -199,28 +115,28 @@ class Stripe_ApiRequestor
199
  return $resp;
200
  }
201
 
202
- private function _curlRequest($method, $absUrl, $headers, $params)
203
  {
204
  $curl = curl_init();
205
- $method = strtolower($method);
206
  $opts = array();
207
- if ($method == 'get') {
208
  $opts[CURLOPT_HTTPGET] = 1;
209
  if (count($params) > 0) {
210
- $encoded = self::encode($params);
211
- $absUrl = "$absUrl?$encoded";
212
  }
213
- } else if ($method == 'post') {
214
  $opts[CURLOPT_POST] = 1;
215
  $opts[CURLOPT_POSTFIELDS] = self::encode($params);
216
- } else if ($method == 'delete') {
217
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
218
  if (count($params) > 0) {
219
- $encoded = self::encode($params);
220
- $absUrl = "$absUrl?$encoded";
221
  }
222
  } else {
223
- throw new Stripe_ApiError("Unrecognized method $method");
224
  }
225
 
226
  $absUrl = self::utf8($absUrl);
@@ -230,27 +146,19 @@ class Stripe_ApiRequestor
230
  $opts[CURLOPT_TIMEOUT] = 80;
231
  $opts[CURLOPT_RETURNTRANSFER] = true;
232
  $opts[CURLOPT_HTTPHEADER] = $headers;
 
233
  if (!Stripe::$verifySslCerts)
234
  $opts[CURLOPT_SSL_VERIFYPEER] = false;
235
 
236
  curl_setopt_array($curl, $opts);
237
  $rbody = curl_exec($curl);
238
 
239
- if (!defined('CURLE_SSL_CACERT_BADFILE')) {
240
- define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP
241
- }
242
-
243
  $errno = curl_errno($curl);
244
- if ($errno == CURLE_SSL_CACERT ||
245
- $errno == CURLE_SSL_PEER_CERTIFICATE ||
246
- $errno == CURLE_SSL_CACERT_BADFILE) {
247
- array_push(
248
- $headers,
249
- 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}'
250
- );
251
- $cert = dirname(__FILE__) . '/../data/ca-certificates.crt';
252
  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
253
- curl_setopt($curl, CURLOPT_CAINFO, $cert);
 
254
  $rbody = curl_exec($curl);
255
  }
256
 
@@ -266,11 +174,6 @@ class Stripe_ApiRequestor
266
  return array($rbody, $rcode);
267
  }
268
 
269
- /**
270
- * @param number $errno
271
- * @param string $message
272
- * @throws Stripe_ApiConnectionError
273
- */
274
  public function handleCurlError($errno, $message)
275
  {
276
  $apiBase = Stripe::$apiBase;
@@ -278,25 +181,17 @@ class Stripe_ApiRequestor
278
  case CURLE_COULDNT_CONNECT:
279
  case CURLE_COULDNT_RESOLVE_HOST:
280
  case CURLE_OPERATION_TIMEOUTED:
281
- $msg = "Could not connect to Stripe ($apiBase). Please check your "
282
- . "internet connection and try again. If this problem persists, "
283
- . "you should check Stripe's service status at "
284
- . "https://twitter.com/stripestatus, or";
285
- break;
286
  case CURLE_SSL_CACERT:
287
  case CURLE_SSL_PEER_CERTIFICATE:
288
- $msg = "Could not verify Stripe's SSL certificate. Please make sure "
289
- . "that your network is not intercepting certificates. "
290
- . "(Try going to $apiBase in your browser.) "
291
- . "If this problem persists,";
292
- break;
293
  default:
294
- $msg = "Unexpected error communicating with Stripe. "
295
- . "If this problem persists,";
296
  }
297
- $msg .= " let us know at support@stripe.com.";
298
 
299
- $msg .= "\n\n(Network error [errno $errno]: $message)";
300
  throw new Stripe_ApiConnectionError($msg);
301
  }
302
  }
2
 
3
  class Stripe_ApiRequestor
4
  {
 
 
 
5
  public $apiKey;
6
 
7
  public function __construct($apiKey=null)
9
  $this->_apiKey = $apiKey;
10
  }
11
 
 
 
 
 
 
12
  public static function apiUrl($url='')
13
  {
14
  $apiBase = Stripe::$apiBase;
15
  return "$apiBase$url";
16
  }
17
 
 
 
 
 
 
 
18
  public static function utf8($value)
19
  {
20
+ if (is_string($value))
 
21
  return utf8_encode($value);
22
+ else
23
  return $value;
 
24
  }
25
 
26
  private static function _encodeObjects($d)
27
  {
28
+ if ($d instanceof Stripe_ApiRequestor) {
29
+ return $d->id;
30
  } else if ($d === true) {
31
  return 'true';
32
  } else if ($d === false) {
34
  } else if (is_array($d)) {
35
  $res = array();
36
  foreach ($d as $k => $v)
37
+ $res[$k] = self::_encodeObjects($v);
38
  return $res;
39
  } else {
40
+ return $d;
41
  }
42
  }
43
 
44
+ public static function encode($d)
 
 
 
 
 
 
45
  {
46
+ return http_build_query($d, null, '&');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
 
49
+ public function request($meth, $url, $params=null)
 
 
 
 
 
 
 
 
50
  {
51
  if (!$params)
52
  $params = array();
53
+ list($rbody, $rcode, $myApiKey) = $this->_requestRaw($meth, $url, $params);
54
  $resp = $this->_interpretResponse($rbody, $rcode);
55
  return array($resp, $myApiKey);
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  public function handleApiError($rbody, $rcode, $resp)
59
  {
60
+ if (!is_array($resp) || !isset($resp['error']))
61
+ throw new Stripe_ApiError("Invalid response object from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody, $resp);
 
 
 
 
62
  $error = $resp['error'];
 
 
 
 
63
  switch ($rcode) {
64
  case 400:
65
  case 404:
66
+ throw new Stripe_InvalidRequestError(isset($error['message']) ? $error['message'] : null,
67
+ isset($error['param']) ? $error['param'] : null,
68
+ $rcode, $rbody, $resp);
69
  case 401:
70
+ throw new Stripe_AuthenticationError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp);
71
  case 402:
72
+ throw new Stripe_CardError(isset($error['message']) ? $error['message'] : null,
73
+ isset($error['param']) ? $error['param'] : null,
74
+ isset($error['code']) ? $error['code'] : null,
75
+ $rcode, $rbody, $resp);
76
  default:
77
+ throw new Stripe_ApiError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp);
78
  }
79
  }
80
 
81
+ private function _requestRaw($meth, $url, $params)
82
  {
83
  $myApiKey = $this->_apiKey;
84
  if (!$myApiKey)
85
  $myApiKey = Stripe::$apiKey;
86
+ if (!$myApiKey)
87
+ throw new Stripe_AuthenticationError('No API key provided. (HINT: set your API key using "Stripe::setApiKey(<API-KEY>)". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions.');
 
 
 
 
 
 
88
 
89
  $absUrl = $this->apiUrl($url);
90
  $params = self::_encodeObjects($params);
91
  $langVersion = phpversion();
92
  $uname = php_uname();
93
  $ua = array('bindings_version' => Stripe::VERSION,
94
+ 'lang' => 'php',
95
+ 'lang_version' => $langVersion,
96
+ 'publisher' => 'stripe',
97
+ 'uname' => $uname);
98
  $headers = array('X-Stripe-Client-User-Agent: ' . json_encode($ua),
99
+ 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION);
100
+ list($rbody, $rcode) = $this->_curlRequest($meth, $absUrl, $headers, $params, $myApiKey);
 
 
 
 
 
 
 
 
101
  return array($rbody, $rcode, $myApiKey);
102
  }
103
 
106
  try {
107
  $resp = json_decode($rbody, true);
108
  } catch (Exception $e) {
109
+ throw new Stripe_ApiError("Invalid response body from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody);
 
 
110
  }
111
 
112
  if ($rcode < 200 || $rcode >= 300) {
115
  return $resp;
116
  }
117
 
118
+ private function _curlRequest($meth, $absUrl, $headers, $params, $myApiKey)
119
  {
120
  $curl = curl_init();
121
+ $meth = strtolower($meth);
122
  $opts = array();
123
+ if ($meth == 'get') {
124
  $opts[CURLOPT_HTTPGET] = 1;
125
  if (count($params) > 0) {
126
+ $encoded = self::encode($params);
127
+ $absUrl = "$absUrl?$encoded";
128
  }
129
+ } else if ($meth == 'post') {
130
  $opts[CURLOPT_POST] = 1;
131
  $opts[CURLOPT_POSTFIELDS] = self::encode($params);
132
+ } else if ($meth == 'delete') {
133
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
134
  if (count($params) > 0) {
135
+ $encoded = self::encode($params);
136
+ $absUrl = "$absUrl?$encoded";
137
  }
138
  } else {
139
+ throw new Stripe_ApiError("Unrecognized method $meth");
140
  }
141
 
142
  $absUrl = self::utf8($absUrl);
146
  $opts[CURLOPT_TIMEOUT] = 80;
147
  $opts[CURLOPT_RETURNTRANSFER] = true;
148
  $opts[CURLOPT_HTTPHEADER] = $headers;
149
+ $opts[CURLOPT_USERPWD] = $myApiKey . ':';
150
  if (!Stripe::$verifySslCerts)
151
  $opts[CURLOPT_SSL_VERIFYPEER] = false;
152
 
153
  curl_setopt_array($curl, $opts);
154
  $rbody = curl_exec($curl);
155
 
 
 
 
 
156
  $errno = curl_errno($curl);
157
+ if ($errno == CURLE_SSL_CACERT || $errno == CURLE_SSL_PEER_CERTIFICATE) {
158
+ array_push($headers, 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}');
 
 
 
 
 
 
159
  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
160
+ curl_setopt($curl, CURLOPT_CAINFO,
161
+ dirname(__FILE__) . '/../data/ca-certificates.crt');
162
  $rbody = curl_exec($curl);
163
  }
164
 
174
  return array($rbody, $rcode);
175
  }
176
 
 
 
 
 
 
177
  public function handleCurlError($errno, $message)
178
  {
179
  $apiBase = Stripe::$apiBase;
181
  case CURLE_COULDNT_CONNECT:
182
  case CURLE_COULDNT_RESOLVE_HOST:
183
  case CURLE_OPERATION_TIMEOUTED:
184
+ $msg = "Could not connect to Stripe ($apiBase). Please check your internet connection and try again. If this problem persists, you should check Stripe's service status at https://twitter.com/stripestatus, or let us know at support@stripe.com.";
185
+ break;
 
 
 
186
  case CURLE_SSL_CACERT:
187
  case CURLE_SSL_PEER_CERTIFICATE:
188
+ $msg = "Could not verify Stripe's SSL certificate. Please make sure that your network is not intercepting certificates. (Try going to $apiBase in your browser.) If this problem persists, let us know at support@stripe.com.";
189
+ break;
 
 
 
190
  default:
191
+ $msg = "Unexpected error communicating with Stripe. If this problem persists, let us know at support@stripe.com.";
 
192
  }
 
193
 
194
+ $msg .= "\n\n(Network error: $message)";
195
  throw new Stripe_ApiConnectionError($msg);
196
  }
197
  }
includes/lib/Stripe/Stripe/ApiResource.php CHANGED
@@ -9,30 +9,16 @@ abstract class Stripe_ApiResource extends Stripe_Object
9
  return $instance;
10
  }
11
 
12
- /**
13
- * @returns Stripe_ApiResource The refreshed resource.
14
- */
15
  public function refresh()
16
  {
17
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
18
  $url = $this->instanceUrl();
19
-
20
- list($response, $apiKey) = $requestor->request(
21
- 'get',
22
- $url,
23
- $this->_retrieveOptions
24
- );
25
  $this->refreshFrom($response, $apiKey);
26
  return $this;
27
- }
28
 
29
- /**
30
- * @param string $class
31
- *
32
- * @returns string The name of the class, with namespacing and underscores
33
- * stripped.
34
- */
35
- public static function className($class)
36
  {
37
  // Useful for namespaces: Foo\Stripe_Charge
38
  if ($postfix = strrchr($class, '\\'))
@@ -42,63 +28,35 @@ abstract class Stripe_ApiResource extends Stripe_Object
42
  $class = str_replace('_', '', $class);
43
  $name = urlencode($class);
44
  $name = strtolower($name);
45
- return $name;
46
- }
47
-
48
- /**
49
- * @param string $class
50
- *
51
- * @returns string The endpoint URL for the given class.
52
- */
53
- public static function classUrl($class)
54
- {
55
- $base = self::_scopedLsb($class, 'className', $class);
56
- return "/v1/${base}s";
57
  }
58
 
59
- /**
60
- * @returns string The full API URL for this API resource.
61
- */
62
  public function instanceUrl()
63
  {
64
  $id = $this['id'];
65
  $class = get_class($this);
66
  if (!$id) {
67
- $message = "Could not determine which URL to request: "
68
- . "$class instance has invalid ID: $id";
69
- throw new Stripe_InvalidRequestError($message, null);
70
  }
71
  $id = Stripe_ApiRequestor::utf8($id);
72
- $base = $this->_lsb('classUrl', $class);
73
  $extn = urlencode($id);
74
  return "$base/$extn";
75
  }
76
 
77
  private static function _validateCall($method, $params=null, $apiKey=null)
78
  {
79
- if ($params && !is_array($params)) {
80
- $message = "You must pass an array as the first argument to Stripe API "
81
- . "method calls. (HINT: an example call to create a charge "
82
- . "would be: \"StripeCharge::create(array('amount' => 100, "
83
- . "'currency' => 'usd', 'card' => array('number' => "
84
- . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")";
85
- throw new Stripe_Error($message);
86
- }
87
-
88
- if ($apiKey && !is_string($apiKey)) {
89
- $message = 'The second argument to Stripe API method calls is an '
90
- . 'optional per-request apiKey, which must be a string. '
91
- . '(HINT: you can set a global apiKey by '
92
- . '"Stripe::setApiKey(<apiKey>)")';
93
- throw new Stripe_Error($message);
94
- }
95
  }
96
 
97
  protected static function _scopedAll($class, $params=null, $apiKey=null)
98
  {
99
  self::_validateCall('all', $params, $apiKey);
100
  $requestor = new Stripe_ApiRequestor($apiKey);
101
- $url = self::_scopedLsb($class, 'classUrl', $class);
102
  list($response, $apiKey) = $requestor->request('get', $url, $params);
103
  return Stripe_Util::convertToStripeObject($response, $apiKey);
104
  }
@@ -107,18 +65,19 @@ abstract class Stripe_ApiResource extends Stripe_Object
107
  {
108
  self::_validateCall('create', $params, $apiKey);
109
  $requestor = new Stripe_ApiRequestor($apiKey);
110
- $url = self::_scopedLsb($class, 'classUrl', $class);
111
  list($response, $apiKey) = $requestor->request('post', $url, $params);
112
  return Stripe_Util::convertToStripeObject($response, $apiKey);
113
  }
114
 
115
- protected function _scopedSave($class, $apiKey=null)
116
  {
117
  self::_validateCall('save');
118
- $requestor = new Stripe_ApiRequestor($apiKey);
119
- $params = $this->serializeParameters();
120
-
121
- if (count($params) > 0) {
 
122
  $url = $this->instanceUrl();
123
  list($response, $apiKey) = $requestor->request('post', $url, $params);
124
  $this->refreshFrom($response, $apiKey);
9
  return $instance;
10
  }
11
 
 
 
 
12
  public function refresh()
13
  {
14
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
15
  $url = $this->instanceUrl();
16
+ list($response, $apiKey) = $requestor->request('get', $url);
 
 
 
 
 
17
  $this->refreshFrom($response, $apiKey);
18
  return $this;
19
+ }
20
 
21
+ public static function classUrl($class)
 
 
 
 
 
 
22
  {
23
  // Useful for namespaces: Foo\Stripe_Charge
24
  if ($postfix = strrchr($class, '\\'))
28
  $class = str_replace('_', '', $class);
29
  $name = urlencode($class);
30
  $name = strtolower($name);
31
+ return "/${name}s";
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
 
 
 
 
34
  public function instanceUrl()
35
  {
36
  $id = $this['id'];
37
  $class = get_class($this);
38
  if (!$id) {
39
+ throw new Stripe_InvalidRequestError("Could not determine which URL to request: $class instance has invalid ID: $id");
 
 
40
  }
41
  $id = Stripe_ApiRequestor::utf8($id);
42
+ $base = self::classUrl($class);
43
  $extn = urlencode($id);
44
  return "$base/$extn";
45
  }
46
 
47
  private static function _validateCall($method, $params=null, $apiKey=null)
48
  {
49
+ if ($params && !is_array($params))
50
+ throw new Stripe_Error("You must pass an array as the first argument to Stripe API method calls. (HINT: an example call to create a charge would be: \"StripeCharge::create(array('amount' => 100, 'currency' => 'usd', 'card' => array('number' => 4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")");
51
+ if ($apiKey && !is_string($apiKey))
52
+ throw new Stripe_Error('The second argument to Stripe API method calls is an optional per-request apiKey, which must be a string. (HINT: you can set a global apiKey by "Stripe::setApiKey(<apiKey>)")');
 
 
 
 
 
 
 
 
 
 
 
 
53
  }
54
 
55
  protected static function _scopedAll($class, $params=null, $apiKey=null)
56
  {
57
  self::_validateCall('all', $params, $apiKey);
58
  $requestor = new Stripe_ApiRequestor($apiKey);
59
+ $url = self::classUrl($class);
60
  list($response, $apiKey) = $requestor->request('get', $url, $params);
61
  return Stripe_Util::convertToStripeObject($response, $apiKey);
62
  }
65
  {
66
  self::_validateCall('create', $params, $apiKey);
67
  $requestor = new Stripe_ApiRequestor($apiKey);
68
+ $url = self::classUrl($class);
69
  list($response, $apiKey) = $requestor->request('post', $url, $params);
70
  return Stripe_Util::convertToStripeObject($response, $apiKey);
71
  }
72
 
73
+ protected function _scopedSave($class)
74
  {
75
  self::_validateCall('save');
76
+ if ($this->_unsavedValues) {
77
+ $requestor = new Stripe_ApiRequestor($this->_apiKey);
78
+ $params = array();
79
+ foreach ($this->_unsavedValues->toArray() as $k)
80
+ $params[$k] = $this->$k;
81
  $url = $this->instanceUrl();
82
  list($response, $apiKey) = $requestor->request('post', $url, $params);
83
  $this->refreshFrom($response, $apiKey);
includes/lib/Stripe/Stripe/ApplicationFee.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
-
3
- class Stripe_ApplicationFee extends Stripe_ApiResource
4
- {
5
- /**
6
- * This is a special case because the application fee endpoint has an
7
- * underscore in it. The parent `className` function strips underscores.
8
- *
9
- * @return string The name of the class.
10
- */
11
- public static function className($class)
12
- {
13
- return 'application_fee';
14
- }
15
-
16
- /**
17
- * @param string $id The ID of the application fee to retrieve.
18
- * @param string|null $apiKey
19
- *
20
- * @return Stripe_ApplicationFee
21
- */
22
- public static function retrieve($id, $apiKey=null)
23
- {
24
- $class = get_class();
25
- return self::_scopedRetrieve($class, $id, $apiKey);
26
- }
27
-
28
- /**
29
- * @param string|null $params
30
- * @param string|null $apiKey
31
- *
32
- * @return array An array of application fees.
33
- */
34
- public static function all($params=null, $apiKey=null)
35
- {
36
- $class = get_class();
37
- return self::_scopedAll($class, $params, $apiKey);
38
- }
39
-
40
- /**
41
- * @param string|null $params
42
- *
43
- * @return Stripe_ApplicationFee The refunded application fee.
44
- */
45
- public function refund($params=null)
46
- {
47
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
48
- $url = $this->instanceUrl() . '/refund';
49
- list($response, $apiKey) = $requestor->request('post', $url, $params);
50
- $this->refreshFrom($response, $apiKey);
51
- return $this;
52
- }
53
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/AttachedObject.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
-
3
- // e.g. metadata on Stripe objects.
4
- class Stripe_AttachedObject extends Stripe_Object
5
- {
6
- /**
7
- * Updates this object.
8
- *
9
- * @param array $properties A mapping of properties to update on this object.
10
- */
11
- public function replaceWith($properties)
12
- {
13
- $removed = array_diff(array_keys($this->_values), array_keys($properties));
14
- // Don't unset, but rather set to null so we send up '' for deletion.
15
- foreach ($removed as $k) {
16
- $this->$k = null;
17
- }
18
-
19
- foreach ($properties as $k => $v) {
20
- $this->$k = $v;
21
- }
22
- }
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Balance.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Balance extends Stripe_SingletonApiResource
4
- {
5
- /**
6
- * @param string|null $apiKey
7
- *
8
- * @return Stripe_Balance
9
- */
10
- public static function retrieve($apiKey=null)
11
- {
12
- $class = get_class();
13
- return self::_scopedSingletonRetrieve($class, $apiKey);
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/BalanceTransaction.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
-
3
- class Stripe_BalanceTransaction extends Stripe_ApiResource
4
- {
5
- /**
6
- * @param string $class Ignored.
7
- *
8
- * @return string The class URL for this resource. It needs to be special
9
- * cased because it doesn't fit into the standard resource pattern.
10
- */
11
- public static function classUrl($class)
12
- {
13
- return "/v1/balance/history";
14
- }
15
-
16
- /**
17
- * @param string $id The ID of the balance transaction to retrieve.
18
- * @param string|null $apiKey
19
- *
20
- * @return Stripe_BalanceTransaction
21
- */
22
- public static function retrieve($id, $apiKey=null)
23
- {
24
- $class = get_class();
25
- return self::_scopedRetrieve($class, $id, $apiKey);
26
- }
27
-
28
- /**
29
- * @param array|null $params
30
- * @param string|null $apiKey
31
- *
32
- * @return array An array of Stripe_BalanceTransactions.
33
- */
34
- public static function all($params=null, $apiKey=null)
35
- {
36
- $class = get_class();
37
- return self::_scopedAll($class, $params, $apiKey);
38
- }
39
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Card.php DELETED
@@ -1,54 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Card extends Stripe_ApiResource
4
- {
5
- public static function constructFrom($values, $apiKey=null)
6
- {
7
- $class = get_class();
8
- return self::scopedConstructFrom($class, $values, $apiKey);
9
- }
10
-
11
- /**
12
- * @return string The instance URL for this resource. It needs to be special
13
- * cased because it doesn't fit into the standard resource pattern.
14
- */
15
- public function instanceUrl()
16
- {
17
- $id = $this['id'];
18
- $customer = $this['customer'];
19
- $class = get_class($this);
20
- if (!$id) {
21
- $msg = "Could not determine which URL to request: $class instance "
22
- . "has invalid ID: $id";
23
- throw new Stripe_InvalidRequestError($msg, null);
24
- }
25
- $id = Stripe_ApiRequestor::utf8($id);
26
- $customer = Stripe_ApiRequestor::utf8($customer);
27
-
28
- $base = self::classUrl('Stripe_Customer');
29
- $customerExtn = urlencode($customer);
30
- $extn = urlencode($id);
31
- return "$base/$customerExtn/cards/$extn";
32
- }
33
-
34
- /**
35
- * @param array|null $params
36
- *
37
- * @return Stripe_Card The deleted card.
38
- */
39
- public function delete($params=null)
40
- {
41
- $class = get_class();
42
- return self::_scopedDelete($class, $params);
43
- }
44
-
45
- /**
46
- * @return Stripe_Card The saved card.
47
- */
48
- public function save()
49
- {
50
- $class = get_class();
51
- return self::_scopedSave($class);
52
- }
53
- }
54
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/CardError.php CHANGED
@@ -2,11 +2,9 @@
2
 
3
  class Stripe_CardError extends Stripe_Error
4
  {
5
- public function __construct($message, $param, $code, $httpStatus,
6
- $httpBody, $jsonBody
7
- )
8
  {
9
- parent::__construct($message, $httpStatus, $httpBody, $jsonBody);
10
  $this->param = $param;
11
  $this->code = $code;
12
  }
2
 
3
  class Stripe_CardError extends Stripe_Error
4
  {
5
+ public function __construct($message, $param, $code, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
+ parent::__construct($message, $http_status, $http_body, $json_body);
8
  $this->param = $param;
9
  $this->code = $code;
10
  }
includes/lib/Stripe/Stripe/Charge.php CHANGED
@@ -2,56 +2,30 @@
2
 
3
  class Stripe_Charge extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the charge to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Charge
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Charges.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Charge The created charge.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @return Stripe_Charge The saved charge.
43
- */
44
- public function save()
45
- {
46
- $class = get_class();
47
- return self::_scopedSave($class);
48
- }
49
-
50
- /**
51
- * @param array|null $params
52
- *
53
- * @return Stripe_Charge The refunded charge.
54
- */
55
  public function refund($params=null)
56
  {
57
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -61,11 +35,6 @@ class Stripe_Charge extends Stripe_ApiResource
61
  return $this;
62
  }
63
 
64
- /**
65
- * @param array|null $params
66
- *
67
- * @return Stripe_Charge The captured charge.
68
- */
69
  public function capture($params=null)
70
  {
71
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -74,30 +43,4 @@ class Stripe_Charge extends Stripe_ApiResource
74
  $this->refreshFrom($response, $apiKey);
75
  return $this;
76
  }
77
-
78
- /**
79
- * @param array|null $params
80
- *
81
- * @return array The updated dispute.
82
- */
83
- public function updateDispute($params=null)
84
- {
85
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
86
- $url = $this->instanceUrl() . '/dispute';
87
- list($response, $apiKey) = $requestor->request('post', $url, $params);
88
- $this->refreshFrom(array('dispute' => $response), $apiKey, true);
89
- return $this->dispute;
90
- }
91
-
92
- /**
93
- * @return Stripe_Charge The updated charge.
94
- */
95
- public function closeDispute()
96
- {
97
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
98
- $url = $this->instanceUrl() . '/dispute/close';
99
- list($response, $apiKey) = $requestor->request('post', $url);
100
- $this->refreshFrom($response, $apiKey);
101
- return $this;
102
- }
103
  }
2
 
3
  class Stripe_Charge extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  public function refund($params=null)
30
  {
31
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
35
  return $this;
36
  }
37
 
 
 
 
 
 
38
  public function capture($params=null)
39
  {
40
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
43
  $this->refreshFrom($response, $apiKey);
44
  return $this;
45
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  }
includes/lib/Stripe/Stripe/Coupon.php CHANGED
@@ -2,47 +2,30 @@
2
 
3
  class Stripe_Coupon extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the coupon to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Coupon
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Coupon The created coupon.
22
- */
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- *
32
- * @return Stripe_Coupon The deleted coupon.
33
- */
34
  public function delete($params=null)
35
  {
36
  $class = get_class();
37
  return self::_scopedDelete($class, $params);
38
  }
39
-
40
- /**
41
- * @param array|null $params
42
- * @param string|null $apiKey
43
- *
44
- * @return array An array of Stripe_Coupons.
45
- */
46
  public static function all($params=null, $apiKey=null)
47
  {
48
  $class = get_class();
2
 
3
  class Stripe_Coupon extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function create($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedCreate($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
23
  public function delete($params=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedDelete($class, $params);
27
  }
28
+
 
 
 
 
 
 
29
  public static function all($params=null, $apiKey=null)
30
  {
31
  $class = get_class();
includes/lib/Stripe/Stripe/Customer.php CHANGED
@@ -2,67 +2,42 @@
2
 
3
  class Stripe_Customer extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the customer to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Customer
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Customers.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Customer The created customer.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @returns Stripe_Customer The saved customer.
43
- */
44
  public function save()
45
  {
46
  $class = get_class();
47
  return self::_scopedSave($class);
48
  }
49
 
50
- /**
51
- * @param array|null $params
52
- *
53
- * @returns Stripe_Customer The deleted customer.
54
- */
55
  public function delete($params=null)
56
  {
57
  $class = get_class();
58
  return self::_scopedDelete($class, $params);
59
  }
60
 
61
- /**
62
- * @param array|null $params
63
- *
64
- * @returns Stripe_InvoiceItem The resulting invoice item.
65
- */
66
  public function addInvoiceItem($params=null)
67
  {
68
  if (!$params)
@@ -72,11 +47,6 @@ class Stripe_Customer extends Stripe_ApiResource
72
  return $ii;
73
  }
74
 
75
- /**
76
- * @param array|null $params
77
- *
78
- * @returns array An array of the customer's Stripe_Invoices.
79
- */
80
  public function invoices($params=null)
81
  {
82
  if (!$params)
@@ -86,11 +56,6 @@ class Stripe_Customer extends Stripe_ApiResource
86
  return $invoices;
87
  }
88
 
89
- /**
90
- * @param array|null $params
91
- *
92
- * @returns array An array of the customer's Stripe_InvoiceItems.
93
- */
94
  public function invoiceItems($params=null)
95
  {
96
  if (!$params)
@@ -100,11 +65,6 @@ class Stripe_Customer extends Stripe_ApiResource
100
  return $iis;
101
  }
102
 
103
- /**
104
- * @param array|null $params
105
- *
106
- * @returns array An array of the customer's Stripe_Charges.
107
- */
108
  public function charges($params=null)
109
  {
110
  if (!$params)
@@ -114,11 +74,6 @@ class Stripe_Customer extends Stripe_ApiResource
114
  return $charges;
115
  }
116
 
117
- /**
118
- * @param array|null $params
119
- *
120
- * @returns Stripe_Subscription The updated subscription.
121
- */
122
  public function updateSubscription($params=null)
123
  {
124
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -128,11 +83,6 @@ class Stripe_Customer extends Stripe_ApiResource
128
  return $this->subscription;
129
  }
130
 
131
- /**
132
- * @param array|null $params
133
- *
134
- * @returns Stripe_Subscription The cancelled subscription.
135
- */
136
  public function cancelSubscription($params=null)
137
  {
138
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -141,17 +91,4 @@ class Stripe_Customer extends Stripe_ApiResource
141
  $this->refreshFrom(array('subscription' => $response), $apiKey, true);
142
  return $this->subscription;
143
  }
144
-
145
- /**
146
- * @param array|null $params
147
- *
148
- * @returns Stripe_Customer The updated customer.
149
- */
150
- public function deleteDiscount()
151
- {
152
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
153
- $url = $this->instanceUrl() . '/discount';
154
- list($response, $apiKey) = $requestor->request('delete', $url);
155
- $this->refreshFrom(array('discount' => null), $apiKey, true);
156
- }
157
  }
2
 
3
  class Stripe_Customer extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
 
 
35
  public function delete($params=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedDelete($class, $params);
39
  }
40
 
 
 
 
 
 
41
  public function addInvoiceItem($params=null)
42
  {
43
  if (!$params)
47
  return $ii;
48
  }
49
 
 
 
 
 
 
50
  public function invoices($params=null)
51
  {
52
  if (!$params)
56
  return $invoices;
57
  }
58
 
 
 
 
 
 
59
  public function invoiceItems($params=null)
60
  {
61
  if (!$params)
65
  return $iis;
66
  }
67
 
 
 
 
 
 
68
  public function charges($params=null)
69
  {
70
  if (!$params)
74
  return $charges;
75
  }
76
 
 
 
 
 
 
77
  public function updateSubscription($params=null)
78
  {
79
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
83
  return $this->subscription;
84
  }
85
 
 
 
 
 
 
86
  public function cancelSubscription($params=null)
87
  {
88
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
91
  $this->refreshFrom(array('subscription' => $response), $apiKey, true);
92
  return $this->subscription;
93
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
includes/lib/Stripe/Stripe/Error.php CHANGED
@@ -2,28 +2,26 @@
2
 
3
  class Stripe_Error extends Exception
4
  {
5
- public function __construct($message, $httpStatus=null,
6
- $httpBody=null, $jsonBody=null
7
- )
8
  {
9
  parent::__construct($message);
10
- $this->httpStatus = $httpStatus;
11
- $this->httpBody = $httpBody;
12
- $this->jsonBody = $jsonBody;
13
  }
14
 
15
  public function getHttpStatus()
16
  {
17
- return $this->httpStatus;
18
  }
19
 
20
  public function getHttpBody()
21
  {
22
- return $this->httpBody;
23
  }
24
 
25
  public function getJsonBody()
26
  {
27
- return $this->jsonBody;
28
  }
29
  }
2
 
3
  class Stripe_Error extends Exception
4
  {
5
+ public function __construct($message=null, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
  parent::__construct($message);
8
+ $this->http_status = $http_status;
9
+ $this->http_body = $http_body;
10
+ $this->json_body = $json_body;
11
  }
12
 
13
  public function getHttpStatus()
14
  {
15
+ return $this->http_status;
16
  }
17
 
18
  public function getHttpBody()
19
  {
20
+ return $this->http_body;
21
  }
22
 
23
  public function getJsonBody()
24
  {
25
+ return $this->json_body;
26
  }
27
  }
includes/lib/Stripe/Stripe/Event.php CHANGED
@@ -2,24 +2,18 @@
2
 
3
  class Stripe_Event extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the event to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Event
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Events.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
2
 
3
  class Stripe_Event extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
includes/lib/Stripe/Stripe/InvalidRequestError.php CHANGED
@@ -2,11 +2,9 @@
2
 
3
  class Stripe_InvalidRequestError extends Stripe_Error
4
  {
5
- public function __construct($message, $param, $httpStatus=null,
6
- $httpBody=null, $jsonBody=null
7
- )
8
  {
9
- parent::__construct($message, $httpStatus, $httpBody, $jsonBody);
10
  $this->param = $param;
11
  }
12
  }
2
 
3
  class Stripe_InvalidRequestError extends Stripe_Error
4
  {
5
+ public function __construct($message, $param, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
+ parent::__construct($message, $http_status, $http_body, $json_body);
8
  $this->param = $param;
9
  }
10
  }
includes/lib/Stripe/Stripe/Invoice.php CHANGED
@@ -2,48 +2,24 @@
2
 
3
  class Stripe_Invoice extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param array|null $params
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Invoice The created invoice.
10
- */
11
- public static function create($params=null, $apiKey=null)
12
  {
13
  $class = get_class();
14
- return self::_scopedCreate($class, $params, $apiKey);
15
  }
16
 
17
- /**
18
- * @param string $id The ID of the invoice to retrieve.
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Invoice
22
- */
23
  public static function retrieve($id, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedRetrieve($class, $id, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return array An array of Stripe_Invoices.
34
- */
35
  public static function all($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedAll($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @param array|null $params
43
- * @param string|null $apiKey
44
- *
45
- * @return Stripe_Invoice The upcoming invoice.
46
- */
47
  public static function upcoming($params=null, $apiKey=null)
48
  {
49
  $requestor = new Stripe_ApiRequestor($apiKey);
@@ -51,25 +27,4 @@ class Stripe_Invoice extends Stripe_ApiResource
51
  list($response, $apiKey) = $requestor->request('get', $url, $params);
52
  return Stripe_Util::convertToStripeObject($response, $apiKey);
53
  }
54
-
55
- /**
56
- * @return Stripe_Invoice The saved invoice.
57
- */
58
- public function save()
59
- {
60
- $class = get_class();
61
- return self::_scopedSave($class);
62
- }
63
-
64
- /**
65
- * @return Stripe_Invoice The paid invoice.
66
- */
67
- public function pay()
68
- {
69
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
70
- $url = $this->instanceUrl() . '/pay';
71
- list($response, $apiKey) = $requestor->request('post', $url);
72
- $this->refreshFrom($response, $apiKey);
73
- return $this;
74
- }
75
  }
2
 
3
  class Stripe_Invoice extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
 
 
 
 
 
 
6
  {
7
  $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
  }
10
 
 
 
 
 
 
 
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function upcoming($params=null, $apiKey=null)
24
  {
25
  $requestor = new Stripe_ApiRequestor($apiKey);
27
  list($response, $apiKey) = $requestor->request('get', $url, $params);
28
  return Stripe_Util::convertToStripeObject($response, $apiKey);
29
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
includes/lib/Stripe/Stripe/InvoiceItem.php CHANGED
@@ -2,54 +2,36 @@
2
 
3
  class Stripe_InvoiceItem extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the invoice item to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_InvoiceItem
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_InvoiceItems.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_InvoiceItem The created invoice item.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @return Stripe_InvoiceItem The saved invoice item.
43
- */
44
  public function save()
45
  {
46
  $class = get_class();
47
  return self::_scopedSave($class);
48
  }
49
 
50
- /**
51
- * @return Stripe_InvoiceItem The deleted invoice item.
52
- */
53
  public function delete($params=null)
54
  {
55
  $class = get_class();
2
 
3
  class Stripe_InvoiceItem extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
35
  public function delete($params=null)
36
  {
37
  $class = get_class();
includes/lib/Stripe/Stripe/List.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
-
3
- class Stripe_List extends Stripe_Object
4
- {
5
- public function all($params=null)
6
- {
7
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
8
- list($response, $apiKey) = $requestor->request(
9
- 'get',
10
- $this['url'],
11
- $params
12
- );
13
- return Stripe_Util::convertToStripeObject($response, $apiKey);
14
- }
15
-
16
- public function create($params=null)
17
- {
18
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
19
- list($response, $apiKey) = $requestor->request(
20
- 'post', $this['url'], $params
21
- );
22
- return Stripe_Util::convertToStripeObject($response, $apiKey);
23
- }
24
-
25
- public function retrieve($id, $params=null)
26
- {
27
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
28
- $base = $this['url'];
29
- $id = Stripe_ApiRequestor::utf8($id);
30
- $extn = urlencode($id);
31
- list($response, $apiKey) = $requestor->request(
32
- 'get', "$base/$extn", $params
33
- );
34
- return Stripe_Util::convertToStripeObject($response, $apiKey);
35
- }
36
-
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Object.php CHANGED
@@ -2,28 +2,17 @@
2
 
3
  class Stripe_Object implements ArrayAccess
4
  {
5
- /**
6
- * @var array Attributes that should not be sent to the API because they're
7
- * not updatable (e.g. API key, ID).
8
- */
9
- public static $permanentAttributes;
10
- /**
11
- * @var array Attributes that are nested but still updatable from the parent
12
- * class's URL (e.g. metadata).
13
- */
14
- public static $nestedUpdatableAttributes;
15
 
16
  public static function init()
17
  {
18
- self::$permanentAttributes = new Stripe_Util_Set(array('_apiKey', 'id'));
19
- self::$nestedUpdatableAttributes = new Stripe_Util_Set(array('metadata'));
20
  }
21
 
22
  protected $_apiKey;
23
  protected $_values;
24
  protected $_unsavedValues;
25
  protected $_transientValues;
26
- protected $_retrieveOptions;
27
 
28
  public function __construct($id=null, $apiKey=null)
29
  {
@@ -31,16 +20,6 @@ class Stripe_Object implements ArrayAccess
31
  $this->_values = array();
32
  $this->_unsavedValues = new Stripe_Util_Set();
33
  $this->_transientValues = new Stripe_Util_Set();
34
-
35
- $this->_retrieveOptions = array();
36
- if (is_array($id)) {
37
- foreach ($id as $key => $value) {
38
- if ($key != 'id')
39
- $this->_retrieveOptions[$key] = $value;
40
- }
41
- $id = $id['id'];
42
- }
43
-
44
  if ($id)
45
  $this->id = $id;
46
  }
@@ -48,21 +27,9 @@ class Stripe_Object implements ArrayAccess
48
  // Standard accessor magic methods
49
  public function __set($k, $v)
50
  {
51
- if ($v === "") {
52
- throw new InvalidArgumentException(
53
- 'You cannot set \''.$k.'\'to an empty string. '
54
- .'We interpret empty strings as NULL in requests. '
55
- .'You may set obj->'.$k.' = NULL to delete the property'
56
- );
57
- }
58
-
59
- if (self::$nestedUpdatableAttributes->includes($k) && isset($this->$k) && is_array($v)) {
60
- $this->$k->replaceWith($v);
61
- } else {
62
- // TODO: may want to clear from $_transientValues. (Won't be user-visible.)
63
- $this->_values[$k] = $v;
64
- }
65
- if (!self::$permanentAttributes->includes($k))
66
  $this->_unsavedValues->add($k);
67
  }
68
  public function __isset($k)
@@ -77,18 +44,12 @@ class Stripe_Object implements ArrayAccess
77
  }
78
  public function __get($k)
79
  {
80
- if (array_key_exists($k, $this->_values)) {
81
  return $this->_values[$k];
82
  } else if ($this->_transientValues->includes($k)) {
83
  $class = get_class($this);
84
  $attrs = join(', ', array_keys($this->_values));
85
- $message = "Stripe Notice: Undefined property of $class instance: $k. "
86
- . "HINT: The $k attribute was set in the past, however. "
87
- . "It was then wiped when refreshing the object "
88
- . "with the result returned by Stripe's API, "
89
- . "probably as a result of a save(). The attributes currently "
90
- . "available on this object are: $attrs";
91
- error_log($message);
92
  return null;
93
  } else {
94
  $class = get_class($this);
@@ -102,35 +63,20 @@ class Stripe_Object implements ArrayAccess
102
  {
103
  $this->$k = $v;
104
  }
105
-
106
  public function offsetExists($k)
107
  {
108
- return array_key_exists($k, $this->_values);
109
  }
110
-
111
  public function offsetUnset($k)
112
  {
113
  unset($this->$k);
114
  }
115
  public function offsetGet($k)
116
  {
117
- return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
118
- }
119
-
120
- public function keys()
121
- {
122
- return array_keys($this->_values);
123
  }
124
 
125
- /**
126
- * This unfortunately needs to be public to be used in Util.php
127
- *
128
- * @param Stripe_Object $class
129
- * @param array $values
130
- * @param string|null $apiKey
131
- *
132
- * @return Stripe_Object The object constructed from the given values.
133
- */
134
  public static function scopedConstructFrom($class, $values, $apiKey=null)
135
  {
136
  $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey);
@@ -138,30 +84,15 @@ class Stripe_Object implements ArrayAccess
138
  return $obj;
139
  }
140
 
141
- /**
142
- * @param array $values
143
- * @param string|null $apiKey
144
- *
145
- * @return Stripe_Object The object of the same class as $this constructed
146
- * from the given values.
147
- */
148
  public static function constructFrom($values, $apiKey=null)
149
  {
150
- $class = get_class($this);
151
  return self::scopedConstructFrom($class, $values, $apiKey);
152
  }
153
 
154
- /**
155
- * Refreshes this object using the provided values.
156
- *
157
- * @param array $values
158
- * @param string $apiKey
159
- * @param boolean $partial Defaults to false.
160
- */
161
  public function refreshFrom($values, $apiKey, $partial=false)
162
  {
163
  $this->_apiKey = $apiKey;
164
-
165
  // Wipe old state before setting new. This is useful for e.g. updating a
166
  // customer, where there is no persistent card parameter. Mark those values
167
  // which don't persist as transient
@@ -171,64 +102,20 @@ class Stripe_Object implements ArrayAccess
171
  $removed = array_diff(array_keys($this->_values), array_keys($values));
172
 
173
  foreach ($removed as $k) {
174
- if (self::$permanentAttributes->includes($k))
175
  continue;
176
  unset($this->$k);
177
  }
178
 
179
  foreach ($values as $k => $v) {
180
- if (self::$permanentAttributes->includes($k))
181
  continue;
182
-
183
- if (self::$nestedUpdatableAttributes->includes($k) && is_array($v))
184
- $this->_values[$k] = Stripe_Object::scopedConstructFrom('Stripe_AttachedObject', $v, $apiKey);
185
- else
186
- $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey);
187
-
188
  $this->_transientValues->discard($k);
189
  $this->_unsavedValues->discard($k);
190
  }
191
  }
192
 
193
- /**
194
- * @return array A recursive mapping of attributes to values for this object,
195
- * including the proper value for deleted attributes.
196
- */
197
- public function serializeParameters()
198
- {
199
- $params = array();
200
- if ($this->_unsavedValues) {
201
- foreach ($this->_unsavedValues->toArray() as $k) {
202
- $v = $this->$k;
203
- if ($v === NULL) {
204
- $v = '';
205
- }
206
- $params[$k] = $v;
207
- }
208
- }
209
-
210
- // Get nested updates.
211
- foreach (self::$nestedUpdatableAttributes->toArray() as $property) {
212
- if (isset($this->$property) && $this->$property instanceOf Stripe_Object) {
213
- $params[$property] = $this->$property->serializeParameters();
214
- }
215
- }
216
- return $params;
217
- }
218
-
219
- // Pretend to have late static bindings, even in PHP 5.2
220
- protected function _lsb($method)
221
- {
222
- $class = get_class($this);
223
- $args = array_slice(func_get_args(), 1);
224
- return call_user_func_array(array($class, $method), $args);
225
- }
226
- protected static function _scopedLsb($class, $method)
227
- {
228
- $args = array_slice(func_get_args(), 2);
229
- return call_user_func_array(array($class, $method), $args);
230
- }
231
-
232
  public function __toJSON()
233
  {
234
  if (defined('JSON_PRETTY_PRINT'))
2
 
3
  class Stripe_Object implements ArrayAccess
4
  {
5
+ public static $_permanentAttributes;
 
 
 
 
 
 
 
 
 
6
 
7
  public static function init()
8
  {
9
+ self::$_permanentAttributes = new Stripe_Util_Set(array('_apiKey'));
 
10
  }
11
 
12
  protected $_apiKey;
13
  protected $_values;
14
  protected $_unsavedValues;
15
  protected $_transientValues;
 
16
 
17
  public function __construct($id=null, $apiKey=null)
18
  {
20
  $this->_values = array();
21
  $this->_unsavedValues = new Stripe_Util_Set();
22
  $this->_transientValues = new Stripe_Util_Set();
 
 
 
 
 
 
 
 
 
 
23
  if ($id)
24
  $this->id = $id;
25
  }
27
  // Standard accessor magic methods
28
  public function __set($k, $v)
29
  {
30
+ // TODO: may want to clear from $_transientValues. (Won't be user-visible.)
31
+ $this->_values[$k] = $v;
32
+ if (!self::$_permanentAttributes->includes($k))
 
 
 
 
 
 
 
 
 
 
 
 
33
  $this->_unsavedValues->add($k);
34
  }
35
  public function __isset($k)
44
  }
45
  public function __get($k)
46
  {
47
+ if (isset($this->_values[$k])) {
48
  return $this->_values[$k];
49
  } else if ($this->_transientValues->includes($k)) {
50
  $class = get_class($this);
51
  $attrs = join(', ', array_keys($this->_values));
52
+ error_log("Stripe Notice: Undefined property of $class instance: $k. HINT: The $k attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by Stripe's API, probably as a result of a save(). The attributes currently available on this object are: $attrs");
 
 
 
 
 
 
53
  return null;
54
  } else {
55
  $class = get_class($this);
63
  {
64
  $this->$k = $v;
65
  }
 
66
  public function offsetExists($k)
67
  {
68
+ return isset($this->$k);
69
  }
 
70
  public function offsetUnset($k)
71
  {
72
  unset($this->$k);
73
  }
74
  public function offsetGet($k)
75
  {
76
+ return isset($this->_values[$k]) ? $this->_values[$k] : null;
 
 
 
 
 
77
  }
78
 
79
+ // This unfortunately needs to be public to be used in Util.php
 
 
 
 
 
 
 
 
80
  public static function scopedConstructFrom($class, $values, $apiKey=null)
81
  {
82
  $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey);
84
  return $obj;
85
  }
86
 
 
 
 
 
 
 
 
87
  public static function constructFrom($values, $apiKey=null)
88
  {
89
+ $class = get_class();
90
  return self::scopedConstructFrom($class, $values, $apiKey);
91
  }
92
 
 
 
 
 
 
 
 
93
  public function refreshFrom($values, $apiKey, $partial=false)
94
  {
95
  $this->_apiKey = $apiKey;
 
96
  // Wipe old state before setting new. This is useful for e.g. updating a
97
  // customer, where there is no persistent card parameter. Mark those values
98
  // which don't persist as transient
102
  $removed = array_diff(array_keys($this->_values), array_keys($values));
103
 
104
  foreach ($removed as $k) {
105
+ if (self::$_permanentAttributes->includes($k))
106
  continue;
107
  unset($this->$k);
108
  }
109
 
110
  foreach ($values as $k => $v) {
111
+ if (self::$_permanentAttributes->includes($k))
112
  continue;
113
+ $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey);
 
 
 
 
 
114
  $this->_transientValues->discard($k);
115
  $this->_unsavedValues->discard($k);
116
  }
117
  }
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  public function __toJSON()
120
  {
121
  if (defined('JSON_PRETTY_PRINT'))
includes/lib/Stripe/Stripe/Plan.php CHANGED
@@ -2,56 +2,36 @@
2
 
3
  class Stripe_Plan extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the plan to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Plan
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Plan The created plan.
22
- */
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- *
32
- * @return Stripe_Plan The deleted plan.
33
- */
34
  public function delete($params=null)
35
  {
36
  $class = get_class();
37
  return self::_scopedDelete($class, $params);
38
  }
39
 
40
- /**
41
- * @return Stripe_Plan The saved plan.
42
- */
43
  public function save()
44
  {
45
  $class = get_class();
46
  return self::_scopedSave($class);
47
  }
48
 
49
- /**
50
- * @param array|null $params
51
- * @param string|null $apiKey
52
- *
53
- * @return array An array of Stripe_Plans.
54
- */
55
  public static function all($params=null, $apiKey=null)
56
  {
57
  $class = get_class();
2
 
3
  class Stripe_Plan extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function create($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedCreate($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
23
  public function delete($params=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedDelete($class, $params);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
 
 
 
35
  public static function all($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
includes/lib/Stripe/Stripe/Recipient.php DELETED
@@ -1,75 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Recipient extends Stripe_ApiResource
4
- {
5
- /**
6
- * @param string $id The ID of the recipient to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Recipie