File indexing completed on 2024-12-22 05:33:27

0001 <?php
0002 
0003 /**
0004  *  ocs-webserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-webserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  * */
0023 class Backend_MemberPayoutCliController extends Local_Controller_Action_CliAbstract
0024 {
0025 
0026     public static $ACTION_PAYOUT = "payout";
0027     public static $CONTEXT_ALL = "all";
0028     public static $CONTEXT_PREPARE = "prepare";
0029     public static $NVP_MODULE_ADAPTIVE_PAYMENT = "/AdaptivePayments";
0030     public static $NVP_ACTION_PAY = "/Pay";
0031 
0032     public static $PAYOUT_STATUS_NEW = 0;
0033     public static $PAYOUT_STATUS_REQUESTED = 1;
0034     public static $PAYOUT_STATUS_PROCESSED = 10;
0035     public static $PAYOUT_STATUS_COMPLETED = 100;
0036     public static $PAYOUT_STATUS_DENIED = 30;
0037     public static $PAYOUT_STATUS_ERROR = 99;
0038     public static $PAYOUT_STATUS_PAYPAL_API_ERROR = 999;
0039     public $headers;
0040     /** @var Zend_Config */
0041     protected $_config;
0042     /** @var \Zend_Log */
0043     protected $_logger;
0044 
0045     /**
0046      * Run php code as cronjob.
0047      * I.e.:
0048      * /usr/bin/php /var/www/pling.it/pling/scripts/cron.php -a /backend/member-payout-cli/run/action/payout/context/all >> /var/www/ocs-www/logs/masspay.log $
0049      *
0050      * @see Local_Controller_Action_CliInterface::runAction()
0051      */
0052     public function runAction()
0053     {
0054         $this->initVars();
0055 
0056         $this->initHeaders();
0057 
0058         echo "Start runAction\n";
0059         echo "AppEnv: " . APPLICATION_ENV . "\n";
0060         echo "SandboxActive: " . $this->_config->third_party->paypal->sandbox->active . "\n";
0061         echo "Endpoint: " . $this->_config->third_party->paypal->masspay->endpoint . "\n";
0062         echo "Test: " . $this->_config->third_party->paypal->test . "\n";
0063 
0064         $action = $this->getParam('action');
0065         $context = $this->getParam('context');
0066 
0067         echo "action: " . $action . "\n";
0068         echo "context: " . $context . "\n";
0069         if (isset($action) && $action == $this::$ACTION_PAYOUT && isset($context) && $context == $this::$CONTEXT_ALL) {
0070             $this->payoutMembers();
0071         } else if (isset($action) && $action == $this::$ACTION_PAYOUT && isset($context) && $context == $this::$CONTEXT_PREPARE) {
0072             $this->prepareMasspaymentTable();
0073         }
0074     }
0075 
0076     public function initVars()
0077     {
0078         //init
0079         $this->_config = Zend_Registry::get('config');
0080         $this->_logger = Zend_Registry::get('logger');
0081     }
0082 
0083     public function initHeaders()
0084     {
0085         echo "Start initHeaders";
0086 
0087         $this->headers = array(
0088             "X-PAYPAL-SECURITY-USERID: " . $this->_config->third_party->paypal->security->userid,
0089             "X-PAYPAL-SECURITY-PASSWORD: " . $this->_config->third_party->paypal->security->password,
0090             "X-PAYPAL-SECURITY-SIGNATURE: " . $this->_config->third_party->paypal->security->signature,
0091             "X-PAYPAL-REQUEST-DATA-FORMAT: NV",
0092             "X-PAYPAL-RESPONSE-DATA-FORMAT: NV",
0093             "X-PAYPAL-APPLICATION-ID: " . $this->_config->third_party->paypal->application->id,
0094         );
0095     }
0096 
0097     private function payoutMembers()
0098     {
0099         echo "payoutMembers()\n";
0100 
0101         //Select all members for payout and write them in the payout table, ignore allways inserted members
0102         //$this->prepareMasspaymentTable();
0103 
0104         //get payouts
0105         $allPayouts = $this->getPayouts();
0106 
0107         //send request for < 250 payouts
0108         $this->startMassPay($allPayouts);
0109     }
0110 
0111     private function prepareMasspaymentTable()
0112     {
0113         echo "prepareMasspaymentTable()\n";
0114         $db = Zend_Db_Table::getDefaultAdapter();
0115 
0116         $sql = "SELECT * FROM stat_dl_payment_last_month s WHERE s.amount >= 1";
0117 
0118         $stmt = $db->query($sql);
0119         $payouts = $stmt->fetchAll();
0120 
0121         echo "Select " . count($payouts) . " payouts. Sql: " . $sql . "\n";
0122 
0123         //Insert/Update users in table project_rating
0124         foreach ($payouts as $payout) {
0125             //Insert item in payment table
0126             //INSERT IGNORE INTO `pling`.`payout` (`yearmonth`, `member_id`, `amount`) VALUES ('201612', '223978', '181.0500');
0127             $sql =
0128                 "INSERT IGNORE INTO `member_payout` (`yearmonth`, `member_id`, `mail`, `paypal_mail`, `amount`, `num_downloads`, `created_at`) VALUES ('"
0129                 . $payout['yearmonth'] . "','" . $payout['member_id'] . "','" . $payout['mail'] . "','" . $payout['paypal_mail'] . "',"
0130                 . $payout['amount'] . "," . $payout['num_downloads'] . ", NOW()" . ")";
0131             $stmt = $db->query($sql);
0132             $stmt->execute();
0133         }
0134     }
0135 
0136     private function getPayouts()
0137     {
0138         echo "getPayouts";
0139         $db = Zend_Db_Table::getDefaultAdapter();
0140         $sql = "SELECT * FROM member_payout p WHERE p.status = " . $this::$PAYOUT_STATUS_NEW . " OR p.status = "
0141             . $this::$PAYOUT_STATUS_PAYPAL_API_ERROR;
0142         $stmt = $db->query($sql);
0143         $payouts = $stmt->fetchAll();
0144 
0145         $payoutsArray = array();
0146 
0147         foreach ($payouts as $payout) {
0148             $payoutsArray[] = $payout;
0149         }
0150 
0151         return $payoutsArray;
0152     }
0153 
0154     private function startMassPay($payoutsArray)
0155     {
0156         echo "startMassPay\n\n";
0157         if (!$payoutsArray || count($payoutsArray) == 0) {
0158             echo "Nothing to do...\n\n";
0159             die;
0160             //throw new Exception("Method startMassPay needs array of payouts.");
0161         }
0162         $payoutTable = new Default_Model_DbTable_MemberPayout();
0163         $log = $this->_logger;
0164 
0165         $log->info('********** Start PayPal Masspay **********\n');
0166         $log->info(__FUNCTION__);
0167         $log->debug(APPLICATION_ENV);
0168 
0169         echo('********** Start PayPal Masspay **********');
0170         echo(__FUNCTION__);
0171         echo(APPLICATION_ENV);
0172 
0173         foreach ($payoutsArray as $payout) {
0174             $amount = $payout['amount'];
0175             $mail = $payout['paypal_mail'];
0176             $id = $payout['id'];
0177             $yearmonth = $payout['yearmonth'];
0178             /*if($this->_config->third_party->paypal->sandbox->active) {
0179                 $mail = "paypal-buyer@pling.com";
0180             }*/
0181 
0182             $result = $this->sendPayout($mail, $amount, $id, $yearmonth);
0183 
0184             if ($result) {
0185 
0186                 echo "Result: " . print_r($result->getRawMessage());
0187                 $payKey = $result->getPaymentId();
0188 
0189                 if (is_array($result)) {
0190                     $successful = ($result->getStatus() != 'ERROR');
0191                 }
0192 
0193                 if ($successful) {
0194                     //mark payout as requested
0195                     $payoutTable->update(array("payment_reference_key"   => $payKey,
0196                                                "status"                  => $this::$PAYOUT_STATUS_REQUESTED,
0197                                                "timestamp_masspay_start" => new Zend_Db_Expr('Now()')
0198                     ), "id = " . $payout['id']);
0199                 } else {
0200                     //mark payout as failed
0201                     $payoutTable->update(array("payment_reference_key"   => $payKey,
0202                                                "status"                  => $this::$PAYOUT_STATUS_PAYPAL_API_ERROR,
0203                                                "timestamp_masspay_start" => new Zend_Db_Expr('Now()'),
0204                                                "payment_raw_error"       => print_r($result->getRawMessage(), true),
0205                                                "payment_status"          => 'ERROR'
0206                     ), "id = " . $payout['id']);
0207                 }
0208             } else {
0209 
0210                 echo "Result: PayPal-API-Error";
0211                 //mark payout as 999 = API-Error
0212                 $payoutTable->update(array("status"                  => $this::$PAYOUT_STATUS_PAYPAL_API_ERROR,
0213                                            "timestamp_masspay_start" => new Zend_Db_Expr('Now()')
0214                 ), "id = " . $payout['id']);
0215             }
0216         }
0217 
0218         return true;
0219     }
0220 
0221     private function sendPayout($receiverMail, $amount, $trackingId, $yearmonth)
0222     {
0223         $paymentGateway = $this->createPaymentGateway("paypal");
0224         $response = null;
0225         try {
0226             $response =
0227                 $paymentGateway->requestPaymentForPayout($this->_config->third_party->paypal->facilitator_fee_receiver, $receiverMail,
0228                     $amount, $trackingId, $yearmonth);
0229         } catch (Exception $e) {
0230             $log = $this->_logger;
0231             $log->info('Exception: payment error. Message: ' . print_r($e));
0232             echo('Exception: payment error. Message: ' . print_r($e));
0233 
0234             //throw new Zend_Controller_Action_Exception('payment error', 500, $e);
0235 
0236             //Set status to 999 (or we set the original paypal error code)
0237             //mark payout as requested
0238             return null;
0239         }
0240 
0241         return $response;
0242     }
0243 
0244     /**
0245      * @param string $paymentProvider
0246      *
0247      * @throws Zend_Controller_Exception
0248      * @return Local_Payment_GatewayInterface
0249      */
0250     protected function createPaymentGateway($paymentProvider)
0251     {
0252         $httpHost = "www.opendesktop.org";
0253         if ($this->_config->third_party->paypal->sandbox->active) {
0254             $httpHost = "www.pling.cc";
0255         }
0256         /** @var Zend_Config $config */
0257         $config = Zend_Registry::get('config');
0258         $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl();
0259         switch ($paymentProvider) {
0260             case 'paypal':
0261                 $paymentGateway = new Default_Model_PayPal_Gateway($config->third_party->paypal);
0262                 $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/paypalpayout');
0263                 //                $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/paypal?XDEBUG_SESSION_START=1');
0264                 $paymentGateway->setCancelUrl('http://' . $httpHost);
0265                 $paymentGateway->setReturnUrl('http://' . $httpHost);
0266                 break;
0267 
0268             case 'dwolla':
0269                 $paymentGateway = new Default_Model_Dwolla_Gateway($config->third_party->dwolla);
0270                 $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/dwolla');
0271                 //                $paymentGateway->setIpnNotificationUrl('http://' . $_SERVER ['HTTP_HOST'] . '/gateway/dwolla?XDEBUG_SESSION_START=1');
0272                 $paymentGateway->setReturnUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'dwolla', null, true));
0273                 break;
0274 
0275             case 'amazon':
0276                 $paymentGateway = new Default_Model_Amazon_Gateway($config->third_party->amazon);
0277                 $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/amazon');
0278                 //                $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/amazon?XDEBUG_SESSION_START=1');
0279                 $paymentGateway->setCancelUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentcancel', null, true));
0280                 $paymentGateway->setReturnUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentok', null, true));
0281                 break;
0282 
0283             default:
0284                 throw new Zend_Controller_Exception('No known payment provider found in parameters.');
0285                 break;
0286         }
0287 
0288         return $paymentGateway;
0289     }
0290 
0291     public function isSuccessful($response)
0292     {
0293         //return $response['responseEnvelope']['ack'] == 'Success';
0294         return (strpos($response, 'ACK=Success') != false);
0295     }
0296 
0297 
0298 }