| <?php | |
| /******************************************************************************* | |
| * Copyright (c) 2015 Eclipse Foundation and others. | |
| * All rights reserved. This program and the accompanying materials | |
| * are made available under the terms of the Eclipse Public License v1.0 | |
| * which accompanies this distribution, and is available at | |
| * http://www.eclipse.org/legal/epl-v10.html | |
| * | |
| * Contributors: | |
| * Christopher Guindon (Eclipse Foundation)- initial API and implementation | |
| *******************************************************************************/ | |
| require_once(realpath(dirname(__FILE__) . "/../../system/session.class.php")); | |
| require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php")); | |
| require_once("donor.class.php"); | |
| require_once("donationEmails.class.php"); | |
| /** | |
| * Store information regarding a donation | |
| * | |
| * @author chrisguindon | |
| */ | |
| class Donation { | |
| /** | |
| * Eclipse $App() | |
| */ | |
| private $App = NULL; | |
| /** | |
| * Donation amount. | |
| */ | |
| public $donation_amount = 0; | |
| /** | |
| * Donation worthy of Eclipse benefit. | |
| * | |
| * @var unknown | |
| */ | |
| public $donation_benefit = 0; | |
| /** | |
| * Donation level / Benefit group | |
| */ | |
| public $donation_benefit_group = ''; | |
| /** | |
| * Currency used in donation. | |
| */ | |
| public $donation_currency = ""; | |
| /** | |
| * Visibility setting of donation | |
| */ | |
| public $donation_is_anonymous = 1; | |
| /** | |
| * Comment left by the donor for this donation | |
| */ | |
| public $donation_message = ""; | |
| /** | |
| * Get random internal invoice id | |
| * | |
| * We use this value to fetch the value submitted by the | |
| * user before they made the donation. | |
| * | |
| * @var unknown | |
| */ | |
| public $donation_random_invoice_id = ''; | |
| /** | |
| * Payment status of a donation | |
| * | |
| * @var unknown | |
| */ | |
| public $donation_status = ""; | |
| /** | |
| * Donation landing page | |
| * | |
| * @var string | |
| */ | |
| public $donation_landing_page = NULL; | |
| /** | |
| * Donation file_id | |
| * | |
| * @var integer | |
| */ | |
| public $donation_file_id = NULL; | |
| /** | |
| * Donation scope | |
| * | |
| * @var string | |
| */ | |
| public $donation_scope = NULL; | |
| /** | |
| * Donation campaign | |
| * | |
| * @var string | |
| */ | |
| public $donation_campaign = NULL; | |
| /** | |
| * If this is a subscription donation or not. | |
| * | |
| * @var unknown | |
| */ | |
| public $donation_subscription = 0; | |
| /** | |
| * Gateway Transaction id | |
| */ | |
| public $donation_txn_id = ''; | |
| /** | |
| * Donor object | |
| */ | |
| public $Donor = NULL; | |
| public function __construct() { | |
| $this->Donor = new Donor(); | |
| $this->App = new App(); | |
| } | |
| /** | |
| * Validate if the user is passing the right info | |
| * for linking a donation with an eclipse account | |
| * | |
| * @return boolean | |
| */ | |
| public function link_donation() { | |
| $txn_id = $this->App->getHTTPParameter('tid', 'get'); | |
| $invoice_id = $this->App->getHTTPParameter('iid', 'get'); | |
| if (!empty($txn_id) && !empty($invoice_id)){ | |
| $this->set_donation_txn_id($txn_id); | |
| $this->set_donation_random_invoice_id($invoice_id); | |
| $this->Donor->set_donor_contribution_with_txn_id($this->get_donation_txn_id()); | |
| $cid = $this->Donor->Contribution->getContributionID(); | |
| if (empty($cid)){ | |
| return FALSE; | |
| } | |
| if ($this->update_donor_from_process_table()) { | |
| $this->Donor->Friend->selectFriend($this->Donor->Contribution->getFriendID()); | |
| $this->set_donation_amount($this->Donor->Contribution->getAmount()); | |
| return TRUE; | |
| } | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| * Try to update a donation with an eclipse account | |
| * | |
| * @return boolean/string | |
| */ | |
| public function update_donation() { | |
| $uid = $this->Donor->get_donor_uid(); | |
| $cfid = $this->Donor->Contribution->getFriendID(); | |
| $fid = $this->Donor->Friend->getFriendID(); | |
| if (!empty($uid) && $cfid == $fid) { | |
| return 'link_already_done'; | |
| } | |
| $stage = $this->App->getHTTPParameter('form-stage', 'post'); | |
| // Let's try to link automaticaly, if the user is logged in | |
| if (empty($stage)){ | |
| $Session = new Session(); | |
| $Friend = $Session->getFriend(); | |
| $email = $Friend->getEmail(); | |
| $this->Donor->set_donor_email($email); | |
| $uid = $this->Donor->get_donor_uid(); | |
| if (!empty($uid)) { | |
| $this->get_or_create_friend(); | |
| $this->Donor->Contribution->setFriendID($this->Donor->Friend->getFriendID()); | |
| $this->Donor->Contribution->updateContribution(); | |
| $DonationEmails = new DonationEmails($this); | |
| $DonationEmails->send_email(); | |
| return 'updated'; | |
| } | |
| } | |
| if ($stage == 'update') { | |
| $this->Donor->set_donor_email($this->App->getHTTPParameter('email', 'post')); | |
| $this->set_donation_message($this->App->getHTTPParameter('message', 'post')); | |
| $this->set_donation_is_anonymous($this->App->getHTTPParameter('is_anonymous', 'post')); | |
| $uid = $this->Donor->get_donor_uid(); | |
| if (!empty($uid)) { | |
| $this->get_or_create_friend(); | |
| $this->Donor->Contribution->setMessage($this->get_donation_message()); | |
| $this->Donor->Contribution->setFriendID($this->Donor->Friend->getFriendID()); | |
| $this->Donor->Contribution->updateContribution(); | |
| $DonationEmails = new DonationEmails($this); | |
| $DonationEmails->send_email(); | |
| return 'updated'; | |
| } | |
| return 'invalid_eclipse_id'; | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| * Get human friendly string of $is_anonymous | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_is_anonymous_string() { | |
| if (!$this->donation_is_anonymous) { | |
| return 'Public'; | |
| } | |
| return 'Private'; | |
| } | |
| /** | |
| * Get donation amount | |
| * | |
| * @return number | |
| */ | |
| public function get_donation_amount() { | |
| $this->_set_donation_benefit_level(); | |
| return $this->donation_amount; | |
| } | |
| /** | |
| * Get donation_benefit value | |
| */ | |
| public function get_donation_benefit(){ | |
| return (int)$this->donation_benefit; | |
| } | |
| /** | |
| * Get donation_benefit group/level | |
| */ | |
| public function get_donation_benefit_level() { | |
| $this->_set_donation_benefit_level(); | |
| return $this->donation_benefit_group; | |
| } | |
| /** | |
| * Set donation benefit level | |
| * | |
| * This should only be called when we sent the donation | |
| * amount. | |
| */ | |
| private function _set_donation_benefit_level() { | |
| $amount = $this->donation_amount; | |
| $currency = $this->get_donation_currency(); | |
| // Access to the Friends of Eclipse mirrors. | |
| if ($amount >= 35) { | |
| $this->set_donation_benefit(1); | |
| } | |
| // Minimum donation of 250USD or 0.70 BTC | |
| if ($amount >= 250) { | |
| $this->donation_benefit_group = 'webmaster_idol'; | |
| } | |
| // Minumum donation of 100USD or 0.25 BTC | |
| elseif ($amount >= 50) { | |
| $this->donation_benefit_group = 'best_friend'; | |
| } | |
| // Minimum donation of 35USD or 0.15 BTC | |
| elseif ($amount >= 35) { | |
| $this->donation_benefit_group = 'friend'; | |
| } | |
| else{ | |
| $this->donation_benefit_group = 'donor'; | |
| } | |
| } | |
| /** | |
| * Get donation currency type | |
| */ | |
| public function get_donation_currency() { | |
| if (empty($this->donation_currency)) { | |
| $this->donation_currency = 'USD'; | |
| } | |
| return $this->donation_currency; | |
| } | |
| /** | |
| * Get $is_anonymous value | |
| * | |
| * @return number | |
| */ | |
| public function get_donation_is_anonymous(){ | |
| return (int)$this->donation_is_anonymous; | |
| } | |
| /** | |
| * Get donation message | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_message() { | |
| return $this->donation_message; | |
| } | |
| /** | |
| * Get donation random invoice id | |
| * | |
| * @param number $length | |
| * @return Ambigous <string, unknown> | |
| */ | |
| public function get_donation_random_invoice_id() { | |
| if (empty($this->donation_random_invoice_id)) { | |
| $this->set_donation_random_invoice_id(); | |
| } | |
| return $this->donation_random_invoice_id; | |
| } | |
| /** | |
| * Get donation status | |
| * | |
| * @return unknown | |
| */ | |
| public function get_donation_status() { | |
| if (empty($this->donation_status)){ | |
| $this->set_donation_status('initial'); | |
| } | |
| return strtoupper($this->donation_status); | |
| } | |
| /** | |
| * Get $donation_landing_page | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_landing_page() { | |
| if (empty($this->donation_landing_page)){ | |
| $this->set_donation_landing_page('sponsor'); | |
| } | |
| return strtoupper($this->donation_landing_page); | |
| } | |
| /** | |
| * Get $donation_file_id | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_file_id() { | |
| if (!is_numeric($this->donation_file_id)) { | |
| $this->donation_file_id = NULL; | |
| } | |
| return $this->donation_file_id; | |
| } | |
| /** | |
| * Get $donation_scope | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_scope() { | |
| if (!is_string($this->donation_scope)) { | |
| $this->donation_scope = NULL; | |
| } | |
| return $this->donation_scope; | |
| } | |
| /** | |
| * Get $donation_campaign | |
| * | |
| * @return string | |
| */ | |
| public function get_donation_campaign() { | |
| if (!is_string($this->donation_campaign)) { | |
| $this->donation_campaign = NULL; | |
| } | |
| return $this->donation_campaign; | |
| } | |
| /** | |
| * Get donation_subscription value | |
| * | |
| * @return unknown | |
| */ | |
| public function get_donation_subscription(){ | |
| return (int)$this->donation_subscription; | |
| } | |
| /** | |
| * Get id for transaction | |
| * @param string $txn_id | |
| */ | |
| public function get_donation_txn_id() { | |
| return $this->donation_txn_id; | |
| } | |
| public function get_or_create_friend() { | |
| $update = FALSE; | |
| $active_email = $this->Donor->get_active_email(); | |
| $this->Donor->Friend->setEmail($active_email); | |
| $this->Donor->get_friend_id_from_uid(); | |
| $this->Donor->Friend->setIsAnonymous($this->get_donation_is_anonymous()); | |
| $this->Donor->Friend->setIsBenefit($this->get_donation_benefit()); | |
| $new_friend_id = $this->Donor->Friend->insertUpdateFriend(); | |
| $this->Donor->Friend->setFriendID($new_friend_id); | |
| $this->Donor->Contribution->setFriendID($new_friend_id); | |
| } | |
| /** | |
| * Set donation amount | |
| * | |
| * @param string $donation_amount | |
| */ | |
| public function set_donation_amount($donation_amount = 0) { | |
| //Make sure the amount is a number and it's not 0 | |
| if ($donation_amount == "0" or $donation_amount == "" or is_nan($donation_amount)) { | |
| $donation_amount = 35.00; | |
| } | |
| // Format the amount | |
| $donation_amount = number_format($donation_amount, 2, '.', ''); | |
| $this->donation_amount = $donation_amount; | |
| $this->_set_donation_benefit_level(); | |
| } | |
| /** | |
| * Set donation_benefit value | |
| */ | |
| public function set_donation_benefit($value) { | |
| if ($value === 1 || $value === '1' || $value === TRUE) { | |
| return $this->donation_benefit = 1; | |
| } | |
| } | |
| /** | |
| * Set donation currency type | |
| */ | |
| public function set_donation_currency($currency = '') { | |
| $valid_currency = array('USD', 'CAD', 'EUR'); | |
| $currency = strtoupper($currency); | |
| if (in_array($currency, $valid_currency)) { | |
| $this->donation_currency = $currency; | |
| } | |
| } | |
| /** | |
| * Set $is_anonymous value | |
| * | |
| * @param unknown $value | |
| */ | |
| public function set_donation_is_anonymous($value) { | |
| $this->donation_is_anonymous = 1; | |
| if ($value == 'recognition' || ($value === 0 || $value === '0')) { | |
| $this->donation_is_anonymous = 0; | |
| } | |
| } | |
| /** | |
| * Set donation message | |
| * | |
| * @param unknown $message | |
| */ | |
| public function set_donation_message($message) { | |
| $message = filter_var($message, FILTER_SANITIZE_STRING); | |
| $this->donation_message = strip_tags($message); | |
| } | |
| /** | |
| * Set donation random invoice id | |
| */ | |
| public function set_donation_random_invoice_id($key = '') { | |
| $key = filter_var($key, FILTER_SANITIZE_STRING); | |
| if (empty($key)) { | |
| $length = 30; | |
| $keys = array_merge(range(0, 9), range('a', 'z')); | |
| for ($i = 0; $i < $length; $i++) { | |
| $key .= $keys[array_rand($keys)]; | |
| } | |
| } | |
| $this->donation_random_invoice_id = $key; | |
| } | |
| /** | |
| * Set donation status | |
| * | |
| * @param unknown $status | |
| */ | |
| public function set_donation_status($status) { | |
| $status = strtolower($status); | |
| $available_status = array( | |
| 'completed', // paypal payment_status | |
| 'no_eclipse_id', // Completed but addionnal steps are required to link donation with eclipse_id. | |
| 'new_donation_form', // This was created by the process.php script. | |
| ); | |
| if (in_array($status, $available_status)) { | |
| $this->donation_status = strtoupper($status); | |
| } | |
| } | |
| /** | |
| * Set donation $landing_page | |
| * | |
| * @param string $page | |
| */ | |
| public function set_donation_landing_page($page) { | |
| $page = strtolower($page); | |
| if (!empty($page) && is_string($page)){ | |
| $this->donation_landing_page = substr($page, 0, 45); | |
| } | |
| return $this->donation_landing_page; | |
| } | |
| /** | |
| * Get $donation_file_id | |
| * | |
| * @return string | |
| */ | |
| public function set_donation_file_id($file_id) { | |
| if (!empty($file_id) && is_numeric($file_id) && $file_id <= 2147483647){ | |
| $this->donation_file_id = $file_id; | |
| } | |
| return $this->donation_file_id; | |
| } | |
| /** | |
| * Get $donation_scope | |
| * | |
| * @return string | |
| */ | |
| public function set_donation_scope($scope = "") { | |
| if (!empty($scope) && is_string($scope)){ | |
| $this->donation_scope = substr($scope, 0, 128); | |
| } | |
| return $this->donation_scope; | |
| } | |
| /** | |
| * Get $donation_campaign | |
| * | |
| * @return string | |
| */ | |
| public function set_donation_campaign($campaign = "") { | |
| if (!empty($campaign) && is_string($campaign)){ | |
| $this->donation_campaign = substr($campaign, 0, 128); | |
| } | |
| return $this->donation_campaign; | |
| } | |
| /** | |
| * Set donation subscription value | |
| * @param string $donation_subscription | |
| */ | |
| public function set_donation_subscription($donation_subscription = NULL) { | |
| $this->donation_subscription = 0; | |
| if ($donation_subscription) { | |
| $this->donation_subscription = 1; | |
| } | |
| } | |
| /** | |
| * Set id for transaction | |
| * @param string $txn_id | |
| */ | |
| public function set_donation_txn_id($txn_id = "") { | |
| $txn_id = filter_var($txn_id, FILTER_SANITIZE_STRING); | |
| $this->donation_txn_id = $txn_id; | |
| } | |
| /** | |
| * Update donor() & donation() based off the info from the | |
| * friends_process table. | |
| * | |
| * @return bool | |
| */ | |
| public function update_donor_from_process_table() { | |
| $unique_id = $this->get_donation_random_invoice_id(); | |
| $sql = 'SELECT /* USE MASTER */ * FROM friends_process WHERE id_unique = '; | |
| $sql .= $this->App->returnQuotedString($this->App->sqlSanitize($unique_id)); | |
| $sql .= ' LIMIT 1'; | |
| $rs = $this->App->eclipse_sql($sql); | |
| $process = mysqli_fetch_assoc($rs); | |
| // We found a match in the friends_process table :) | |
| if (!empty($process)) { | |
| $this->Donor->set_donor_first_name($process['first_name']); | |
| $this->Donor->set_donor_last_name($process['last_name']); | |
| $this->set_donation_message($process['message']); | |
| $this->set_donation_subscription($process['subscription']); | |
| $this->set_donation_is_anonymous($process['is_anonymous']); | |
| $this->set_donation_landing_page($process['landing_page']); | |
| $this->set_donation_file_id($process['file_id']); | |
| $this->set_donation_scope($process['scope']); | |
| $this->set_donation_campaign($process['campaign']); | |
| $this->Donor->set_donor_email($process['email']); | |
| $this->Donor->set_donor_paypal_email($process['email_paypal']); | |
| $this->Donor->set_donor_uid($process['uid']); | |
| return TRUE; | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| * Update/create Contribution from the IPN script | |
| * | |
| * @param string $update | |
| */ | |
| public function update_donation_from_ipn($update = TRUE) { | |
| $this->get_or_create_friend(); | |
| if ($this->Donor->Contribution->getContributionID() == "") { | |
| // Contribution Doesn't Already Exist | |
| $this->Donor->Contribution->setAmount($this->get_donation_amount()); | |
| $this->Donor->Contribution->setMessage($this->get_donation_message()); | |
| $this->Donor->Contribution->setTransactionID($this->get_donation_txn_id()); | |
| $this->Donor->Contribution->setProcessId($this->get_donation_random_invoice_id()); | |
| $this->Donor->Contribution->setCurrency($this->get_donation_currency()); | |
| $this->Donor->Contribution->setFriendID($this->Donor->Friend->getFriendID()); | |
| $this->Donor->Contribution->insertContribution(); | |
| } | |
| else{ | |
| // Update transaction. This should not append... | |
| //$this->Donor->Contribution->setProcessId($this->get_donation_random_invoice_id()); | |
| $this->Donor->Contribution->setFriendID($this->Donor->Friend->getFriendID()); | |
| $this->Donor->Contribution->updateContribution(); | |
| } | |
| // Send out Emails | |
| $DonationEmails = new DonationEmails($this); | |
| $content = $DonationEmails->send_email(); | |
| } | |
| } |