protected function getDetailForm($affiliateFields, $model, $request = null, $validationResult = null)
 {
     //add widget_form_error js to affiliate_detail page
     add_action('admin_footer', array($this, 'onFooter'));
     $db = new WPAM_Data_DataAccess();
     $response = new WPAM_Pages_TemplateResponse('admin/affiliate_detail');
     $response->viewData['affiliateFields'] = $affiliateFields;
     $response->viewData['affiliate'] = $model;
     $where = array('affiliateId' => $model->affiliateId);
     $affiliateHelper = new WPAM_Util_AffiliateFormHelper();
     $affiliateHelper->addTransactionDateRange($where, $request, $response);
     $response->viewData['transactions'] = $db->getTransactionRepository()->loadMultipleBy($where, array('dateCreated' => 'desc'));
     $response->viewData['showBalance'] = true;
     $response->viewData['paymentMethods'] = $affiliateHelper->getPaymentMethods();
     $response->viewData['paymentMethod'] = isset($request['ddPaymentMethod']) ? $request['ddPaymentMethod'] : $model->paymentMethod;
     $response->viewData['paypalEmail'] = isset($request['txtPaypalEmail']) ? $request['txtPaypalEmail'] : $model->paypalEmail;
     $response->viewData['bountyType'] = isset($request['ddBountyType']) ? $request['ddBountyType'] : $model->bountyType;
     $response->viewData['bountyAmount'] = isset($request['txtBountyAmount']) ? $request['txtBountyAmount'] : $model->bountyAmount;
     $this->addBalance($response->viewData['transactions'], $db->getTransactionRepository()->getBalance($model->affiliateId, empty($request['from']) ? NULL : $request['from']), 'desc');
     $accountStanding = $db->getTransactionRepository()->getAccountSummary($model->affiliateId);
     $response->viewData['accountStanding'] = $accountStanding->standing;
     $response->viewData['accountCredits'] = $accountStanding->credits;
     $response->viewData['accountDebits'] = $accountStanding->debits;
     $response->viewData['accountAdjustments'] = $accountStanding->adjustments;
     $response->viewData['user'] = new WP_User($model->userId);
     if ($request !== null) {
         $response->viewData['request'] = $request;
     }
     if ($validationResult !== null) {
         //die(print_r($validationResult, true));
         $response->viewData['validationResult'] = $validationResult;
     }
     $response->viewData['affiliateFields'] = $affiliateFields;
     $response->viewData['creatives'] = $db->getCreativesRepository()->loadAllActiveNoDeletes();
     if (get_option(WPAM_PluginConfig::$AffEnableImpressions)) {
         $where = array('sourceAffiliateId' => $model->affiliateId);
         $response->viewData['impressions'] = $db->getImpressionRepository()->loadMultipleByLimit($where, array('dateCreated' => 'desc'), 100);
         $creativeNames = array();
         foreach ($response->viewData['impressions'] as $impression) {
             if (!array_key_exists($impression->sourceCreativeId, $creativeNames)) {
                 $creativeNames[$impression->sourceCreativeId] = $db->getCreativesRepository()->load($impression->sourceCreativeId)->name;
             }
         }
         $response->viewData['creativeNames'] = $creativeNames;
         $where = array('sourceAffiliateId' => $model->affiliateId);
         $response->viewData['impressionCount'] = $db->getImpressionRepository()->count($where);
     }
     //$summary = $db->getEventRepository()->getSummary ( $model->affiliateId );
     $args = array();
     $args['aff_id'] = $model->affiliateId;
     $total_clicks = WPAM_Click_Tracking::get_all_time_total_clicks($args);
     $total_transaction_count = WPAM_Commission_Tracking::get_all_time_transaction_count($args);
     $response->viewData['visitCount'] = $total_clicks;
     //$summary->visits;
     $response->viewData['purchaseCount'] = $total_transaction_count;
     //$summary->purchases;
     //save for form validation in the footer
     $this->response = $response;
     return $response;
 }
 protected function doPayments($request, $affiliate)
 {
     $response = new WPAM_Pages_TemplateResponse('affiliate_cp_transactions');
     $where = array('affiliateId' => $affiliate->affiliateId, 'type' => array('!=', 'credit'));
     $affiliateHelper = new WPAM_Util_AffiliateFormHelper();
     $affiliateHelper->addTransactionDateRange($where, $request, $response);
     $db = new WPAM_Data_DataAccess();
     $response->viewData['transactions'] = $db->getTransactionRepository()->loadMultipleBy($where, array('dateCreated' => 'desc'));
     return $response;
 }
 public function addTransaction($affiliateId, $type, $amount, $description = NULL)
 {
     if (!wp_get_current_user()->has_cap(WPAM_PluginConfig::$AdminCap)) {
         throw new Exception(__('Access denied.', 'affiliates-manager'));
     }
     if (!in_array($type, array('credit', 'payout', 'adjustment'))) {
         throw new Exception(__('Invalid transaction type.', 'affiliates-manager'));
     }
     if (!is_numeric($amount)) {
         throw new Exception(__('Invalid value for amount.', 'affiliates-manager'));
     }
     $db = new WPAM_Data_DataAccess();
     if (!$db->getAffiliateRepository()->exists($affiliateId)) {
         throw new Exception(__('Invalid affiliate', 'affiliates-manager'));
     }
     $transaction = new WPAM_Data_Models_TransactionModel();
     $transaction->type = $type;
     $transaction->affiliateId = $affiliateId;
     $transaction->amount = $amount;
     $transaction->dateCreated = time();
     $transaction->description = $description;
     $db->getTransactionRepository()->insert($transaction);
     return new JsonResponse(JsonResponse::STATUS_OK);
 }
 private function processSubmitToPaypalRequest($request)
 {
     $options = new WPAM_Options();
     $db = new WPAM_Data_DataAccess();
     $aff_db = $db->getAffiliateRepository();
     $tr_db = $db->getTransactionRepository();
     $paypalService = new WPAM_PayPal_Service($options->getPaypalAPIEndPointURL(), $options->getPaypalAPIUser(), $options->getPaypalAPIPassword(), $options->getPaypalAPISignature());
     $massPayRequest = new WPAM_PayPal_MassPayRequest(WPAM_PayPal_MassPayRequest::RECEIVERTYPE_EMAIL_ADDRESS, __('Affiliate Payment', 'affiliates-manager'));
     $transactions = array();
     $amount = '0.00';
     $fee = '0.00';
     $totalAmount = '0.00';
     foreach ($request['affiliates'] as $affiliateArray) {
         $affiliateModel = $aff_db->load($affiliateArray['id']);
         if ($affiliateModel === NULL) {
             throw new Exception(__('Affiliate not found', 'affiliates-manager'));
         }
         if ($affiliateModel->paymentMethod !== 'paypal') {
             throw new Exception(__('Payment method for affiliate is not PayPal', 'affiliates-manager'));
         }
         $paymentTransaction = new WPAM_Data_Models_TransactionModel();
         $paymentTransaction->affiliateId = $affiliateModel->affiliateId;
         $paymentTransaction->amount = bcmul($affiliateArray['amount'], -1, 2);
         $paymentTransaction->dateCreated = time();
         $paymentTransaction->dateModified = time();
         $paymentTransaction->description = __('Payout via PayPal Mass Pay', 'affiliates-manager');
         $paymentTransaction->status = WPAM_Data_Models_TransactionModel::STATUS_PENDING;
         $paymentTransaction->type = WPAM_Data_Models_TransactionModel::TYPE_PAYOUT;
         $transactionId = $tr_db->insert($paymentTransaction);
         $transactions[] = array('transactionId' => $transactionId);
         $massPayRequest->addRecipient($affiliateModel->paypalEmail, $affiliateArray['amount'], $transactionId);
         $amount = bcadd($amount, $affiliateArray['amount'], 2);
         if ($amount * 0.02 > 1.0) {
             $fee += 1.0;
         } else {
             $fee = bcadd($fee, bcmul($affiliateArray['amount'], '0.02', 2), 2);
         }
     }
     $totalAmount = $amount + $fee;
     $ppResponse = $paypalService->doMassPay($massPayRequest);
     $ppLogModel = new WPAM_Data_Models_PaypalLogModel();
     $ppLogModel->ack = $ppResponse->getAck();
     $ppLogModel->build = $ppResponse->getBuild();
     $ppLogModel->correlationId = $ppResponse->getCorrelationId();
     $ppLogModel->dateOccurred = time();
     $ppLogModel->errors = $ppResponse->getErrors();
     $ppLogModel->responseTimestamp = $ppResponse->getTimestamp();
     $ppLogModel->version = $ppResponse->getVersion();
     $ppLogModel->rawResponse = $ppResponse->getRawResponse();
     $ppLogModel->status = $ppResponse->IsFailure() ? 'failed' : 'pending';
     $ppLogModel->amount = $amount;
     $ppLogModel->totalAmount = $totalAmount;
     $ppLogModel->fee = $fee;
     $ppLogId = $db->getPaypalLogRepository()->insert($ppLogModel);
     if ($ppResponse->IsFailure()) {
         foreach ($transactions as $transaction) {
             $tr_db->delete(array('transactionId' => $transaction['transactionId']));
         }
         return new WPAM_Pages_TemplateResponse('admin/paypalpayments/masspay_failed', array('response' => $ppResponse));
     }
     foreach ($transactions as $transaction) {
         $dbtr = $tr_db->load($transaction['transactionId']);
         $dbtr->referenceId = $ppResponse->getCorrelationId();
         $tr_db->update($dbtr);
     }
     $response = new WPAM_Pages_TemplateResponse('admin/paypalpayments/masspay_submitted', array('response' => $ppResponse, 'ppLogId' => $ppLogId));
     return $response;
 }
 public function handleCheckoutWithRefKey($purchaseLogId, $purchaseAmount, $strRefKey)
 {
     $db = new WPAM_Data_DataAccess();
     $binConverter = new WPAM_Util_BinConverter();
     $affiliate = NULL;
     // keeping this block and "($affiliate !== NULL)" seperate to
     // help indicate any problems
     // (purchase log recorded w/o a purchase event)
     if (!empty($strRefKey)) {
         $trackingToken = $db->getTrackingTokenRepository()->loadBy(array('trackingKey' => $strRefKey));
         if ($trackingToken !== NULL) {
             $ttpl = $db->getTrackingTokenPurchaseLogRepository()->loadBy(array('trackingTokenId' => $trackingToken->trackingTokenId, 'purchaseLogId' => $purchaseLogId));
             if ($ttpl === NULL) {
                 $trackingTokenPurchaseLog = new WPAM_Data_Models_TrackingTokenPurchaseLogModel();
                 $trackingTokenPurchaseLog->trackingTokenId = $trackingToken->trackingTokenId;
                 $trackingTokenPurchaseLog->purchaseLogId = $purchaseLogId;
                 $db->getTrackingTokenPurchaseLogRepository()->insert($trackingTokenPurchaseLog);
                 //this will be handled further down if the affiliate is set and the purchase was successful
                 //$db->getEventRepository()->quickInsert(time(), $strRefKey, 'purchase');
             }
         }
     }
     $affiliate = $db->getAffiliateRepository()->loadByPurchaseLogId($purchaseLogId);
     if ($affiliate !== NULL && $affiliate->isActive()) {
         if ($strRefKey) {
             $db->getEventRepository()->quickInsert(time(), $binConverter->stringToBin($strRefKey), 'purchase');
         }
         $creditAmount = $this->calculateCreditAmount($affiliate, $purchaseAmount);
         $creditAmount = apply_filters('wpam_credit_amount', $creditAmount, $purchaseAmount, $purchaseLogId);
         $currency = WPAM_MoneyHelper::getCurrencyCode();
         $description = "Credit for sale of {$purchaseAmount} {$currency} (PURCHASE LOG ID = {$purchaseLogId})";
         $existingCredit = $db->getTransactionRepository()->loadBy(array('referenceId' => $purchaseLogId));
         if ($existingCredit === NULL) {
             $credit = new WPAM_Data_Models_TransactionModel();
             $credit->dateCreated = time();
             $credit->referenceId = $purchaseLogId;
             $credit->affiliateId = $affiliate->affiliateId;
             $credit->type = 'credit';
             $credit->description = $description;
             $credit->amount = $creditAmount;
             $db->getTransactionRepository()->insert($credit);
         } else {
             $existingCredit->dateModified = time();
             $existingCredit->description = $description;
             $existingCredit->amount = $creditAmount;
             $db->getTransactionRepository()->update($existingCredit);
         }
     }
 }