_loggable = TRUE; $this->tableFields = array_keys ($this->getTableSQLFields ()); $this->_tablepkey = 'id'; $this->_tableId = 'id'; $varsToPush = $this->getVarsToPush (); $this->setConfigParameterable ($this->_configTableFieldName, $varsToPush); $this->setConvertable(array('min_amount','max_amount','cost_per_transaction','cost_min_transaction')); $this->setConvertDecimal(array('min_amount','max_amount','cost_per_transaction','cost_min_transaction','cost_percent_total')); } /** * Create the table for this plugin if it does not yet exist. * * @author Valérie Isaksen */ public function getVmPluginCreateTableSQL () { return $this->createTableSQL ('Payment Standard Table'); } /** * Fields to create the payment table * * @return string SQL Fileds */ function getTableSQLFields () { $SQLfields = array( 'id' => 'int(1) UNSIGNED NOT NULL AUTO_INCREMENT', 'virtuemart_order_id' => 'int(1) UNSIGNED', 'order_number' => 'char(64)', 'virtuemart_paymentmethod_id' => 'mediumint(1) UNSIGNED', 'payment_name' => 'varchar(5000)', 'payment_order_total' => 'decimal(15,5) NOT NULL DEFAULT \'0.00000\'', 'payment_currency' => 'char(3)', 'email_currency' => 'char(3)', 'cost_per_transaction' => 'decimal(10,2)', 'cost_min_transaction' => 'decimal(10,2)', 'cost_percent_total' => 'decimal(10,2)', 'tax_id' => 'smallint(1)' ); return $SQLfields; } static function getPaymentCurrency (&$method, $selectedUserCurrency = false) { if (empty($method->payment_currency)) { $vendor_model = VmModel::getModel('vendor'); $vendor = $vendor_model->getVendor($method->virtuemart_vendor_id); $method->payment_currency = $vendor->vendor_currency; return $method->payment_currency; } else { $vendor_model = VmModel::getModel( 'vendor' ); $vendor_currencies = $vendor_model->getVendorAndAcceptedCurrencies( $method->virtuemart_vendor_id ); if(!$selectedUserCurrency) { if($method->payment_currency == -1) { $mainframe = JFactory::getApplication(); $selectedUserCurrency = $mainframe->getUserStateFromRequest( "virtuemart_currency_id", 'virtuemart_currency_id', vRequest::getInt( 'virtuemart_currency_id', $vendor_currencies['vendor_currency'] ) ); } else { $selectedUserCurrency = $method->payment_currency; } } $vendor_currencies['all_currencies'] = explode(',', $vendor_currencies['all_currencies']); if(in_array($selectedUserCurrency,$vendor_currencies['all_currencies'])){ $method->payment_currency = $selectedUserCurrency; } else { $method->payment_currency = $vendor_currencies['vendor_currency']; } return $method->payment_currency; } } /** * * * @author Valérie Isaksen */ function plgVmConfirmedOrder ($cart, $order) { if (!($method = $this->getVmPluginMethod ($order['details']['BT']->virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement ($method->payment_element)) { return FALSE; } vmLanguage::loadJLang('com_virtuemart',true); vmLanguage::loadJLang('com_virtuemart_orders', TRUE); if (!class_exists ('VirtueMartModelOrders')) { require(VMPATH_ADMIN . DS . 'models' . DS . 'orders.php'); } $this->getPaymentCurrency($method, $order['details']['BT']->payment_currency_id); $currency_code_3 = shopFunctions::getCurrencyByID($method->payment_currency, 'currency_code_3'); $email_currency = $this->getEmailCurrency($method); $totalInPaymentCurrency = vmPSPlugin::getAmountInCurrency($order['details']['BT']->order_total,$method->payment_currency); if (!empty($method->payment_info)) { $lang = JFactory::getLanguage (); if ($lang->hasKey ($method->payment_info)) { $method->payment_info = vmText::_ ($method->payment_info); } } $dbValues['payment_name'] = $this->renderPluginName ($method) . '
' . $method->payment_info; $dbValues['order_number'] = $order['details']['BT']->order_number; $dbValues['virtuemart_paymentmethod_id'] = $order['details']['BT']->virtuemart_paymentmethod_id; $dbValues['cost_per_transaction'] = $method->cost_per_transaction; $dbValues['cost_min_transaction'] = $method->cost_min_transaction; $dbValues['cost_percent_total'] = $method->cost_percent_total; $dbValues['payment_currency'] = $currency_code_3; $dbValues['email_currency'] = $email_currency; $dbValues['payment_order_total'] = $totalInPaymentCurrency['value']; $dbValues['tax_id'] = $method->tax_id; $this->storePSPluginInternalData ($dbValues); if (!class_exists ('VirtueMartModelCurrency')) { require(VMPATH_ADMIN . DS . 'models' . DS . 'currency.php'); } $currency = CurrencyDisplay::getInstance ('', $order['details']['BT']->virtuemart_vendor_id); $html = $this->renderByLayout('post_payment', array( 'order_number' =>$order['details']['BT']->order_number, 'order_pass' =>$order['details']['BT']->order_pass, 'payment_name' => $dbValues['payment_name'], 'displayTotalInPaymentCurrency' => $totalInPaymentCurrency['display'], 'order_user_id' => $order['details']['BT']->virtuemart_user_id )); $modelOrder = VmModel::getModel ('orders'); $order['order_status'] = $this->getNewStatus ($method); $order['customer_notified'] = 1; $order['comments'] = ''; $modelOrder->updateStatusForOneOrder ($order['details']['BT']->virtuemart_order_id, $order, TRUE); //We delete the old stuff $cart->emptyCart (); vRequest::setVar ('html', $html); return TRUE; } /* * Keep backwards compatibility * a new parameter has been added in the xml file */ function getNewStatus ($method) { if (isset($method->status_pending) and $method->status_pending!="") { return $method->status_pending; } else { return 'P'; } } /** * Display stored payment data for an order * */ function plgVmOnShowOrderBEPayment ($virtuemart_order_id, $virtuemart_payment_id) { if (!$this->selectedThisByMethodId ($virtuemart_payment_id)) { return NULL; // Another method was selected, do nothing } if (!($paymentTable = $this->getDataByOrderId ($virtuemart_order_id))) { return NULL; } vmLanguage::loadJLang('com_virtuemart'); $html = '' . "\n"; $html .= $this->getHtmlHeaderBE (); $html .= $this->getHtmlRowBE ('COM_VIRTUEMART_PAYMENT_NAME', $paymentTable->payment_name); $html .= $this->getHtmlRowBE ('STANDARD_PAYMENT_TOTAL_CURRENCY', $paymentTable->payment_order_total . ' ' . $paymentTable->payment_currency); if ($paymentTable->email_currency) { $html .= $this->getHtmlRowBE ('STANDARD_EMAIL_CURRENCY', $paymentTable->email_currency ); } $html .= '
' . "\n"; return $html; } /* function getCosts (VirtueMartCart $cart, $method, $cart_prices) { if (preg_match ('/%$/', $method->cost_percent_total)) { $cost_percent_total = substr ($method->cost_percent_total, 0, -1); } else { $cost_percent_total = $method->cost_percent_total; } return ($method->cost_per_transaction + ($cart_prices['salesPrice'] * $cost_percent_total * 0.01)); } */ /** * Check if the payment conditions are fulfilled for this payment method * * @author: Valerie Isaksen * * @param $cart_prices: cart prices * @param $payment * @return true: if the conditions are fulfilled, false otherwise * */ protected function checkConditions ($cart, $method, $cart_prices) { $this->convert_condition_amount($method); $amount = $this->getCartAmount($cart_prices); $address = $cart -> getST(); if($this->_toConvert){ $this->convertToVendorCurrency($method); } //vmdebug('standard checkConditions', $amount, $cart_prices['salesPrice'], $cart_prices['salesPriceCoupon']); $amount_cond = ($amount >= $method->min_amount AND $amount <= $method->max_amount OR ($method->min_amount <= $amount AND ($method->max_amount == 0))); if (!$amount_cond) { return FALSE; } $countries = array(); if (!empty($method->countries)) { if (!is_array ($method->countries)) { $countries[0] = $method->countries; } else { $countries = $method->countries; } } // probably did not gave his BT:ST address if (!is_array ($address)) { $address = array(); $address['virtuemart_country_id'] = 0; } if (!isset($address['virtuemart_country_id'])) { $address['virtuemart_country_id'] = 0; } if (count ($countries) == 0 || in_array ($address['virtuemart_country_id'], $countries) ) { return TRUE; } return FALSE; } /* * We must reimplement this triggers for joomla 1.7 */ /** * Create the table for this plugin if it does not yet exist. * This functions checks if the called plugin is active one. * When yes it is calling the standard method to create the tables * * @author Valérie Isaksen * */ function plgVmOnStoreInstallPaymentPluginTable ($jplugin_id) { return $this->onStoreInstallPluginTable ($jplugin_id); } /** * This event is fired after the payment method has been selected. It can be used to store * additional payment info in the cart. * * @author Max Milbers * @author Valérie isaksen * * @param VirtueMartCart $cart: the actual cart * @return null if the payment was not selected, true if the data is valid, error message if the data is not vlaid * */ public function plgVmOnSelectCheckPayment (VirtueMartCart $cart, &$msg) { return $this->OnSelectCheck ($cart); } /** * plgVmDisplayListFEPayment * This event is fired to display the pluginmethods in the cart (edit shipment/payment) for exampel * * @param object $cart Cart object * @param integer $selected ID of the method selected * @return boolean True on succes, false on failures, null when this plugin was not selected. * On errors, JError::raiseWarning (or JError::raiseError) must be used to set a message. * * @author Valerie Isaksen * @author Max Milbers */ public function plgVmDisplayListFEPayment (VirtueMartCart $cart, $selected = 0, &$htmlIn) { return $this->displayListFE ($cart, $selected, $htmlIn); } /* * plgVmonSelectedCalculatePricePayment * Calculate the price (value, tax_id) of the selected method * It is called by the calculator * This function does NOT to be reimplemented. If not reimplemented, then the default values from this function are taken. * @author Valerie Isaksen * @cart: VirtueMartCart the current cart * @cart_prices: array the new cart prices * @return null if the method was not selected, false if the shiiping rate is not valid any more, true otherwise * * */ public function plgVmonSelectedCalculatePricePayment (VirtueMartCart $cart, array &$cart_prices, &$cart_prices_name) { return $this->onSelectedCalculatePrice ($cart, $cart_prices, $cart_prices_name); } function plgVmgetPaymentCurrency ($virtuemart_paymentmethod_id, &$paymentCurrencyId) { if (!($method = $this->getVmPluginMethod ($virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement ($method->payment_element)) { return FALSE; } $this->getPaymentCurrency ($method); $paymentCurrencyId = $method->payment_currency; return; } /** * plgVmOnCheckAutomaticSelectedPayment * Checks how many plugins are available. If only one, the user will not have the choice. Enter edit_xxx page * The plugin must check first if it is the correct type * * @author Valerie Isaksen * @param VirtueMartCart cart: the cart object * @return null if no plugin was found, 0 if more then one plugin was found, virtuemart_xxx_id if only one plugin is found * */ function plgVmOnCheckAutomaticSelectedPayment (VirtueMartCart $cart, array $cart_prices = array(), &$paymentCounter) { return $this->onCheckAutomaticSelected ($cart, $cart_prices, $paymentCounter); } /** * This method is fired when showing the order details in the frontend. * It displays the method-specific data. * * @param integer $order_id The order ID * @return mixed Null for methods that aren't active, text (HTML) otherwise * @author Max Milbers * @author Valerie Isaksen */ public function plgVmOnShowOrderFEPayment ($virtuemart_order_id, $virtuemart_paymentmethod_id, &$payment_name) { $this->onShowOrderFE ($virtuemart_order_id, $virtuemart_paymentmethod_id, $payment_name); } /** * @param $orderDetails * @param $data * @return null */ function plgVmOnUserInvoice ($orderDetails, &$data) { if (!($method = $this->getVmPluginMethod ($orderDetails['virtuemart_paymentmethod_id']))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement ($method->payment_element)) { return NULL; } //vmdebug('plgVmOnUserInvoice',$orderDetails, $method); if (!isset($method->send_invoice_on_order_null) or $method->send_invoice_on_order_null==1 or $orderDetails['order_total'] > 0.00){ return NULL; } if ($orderDetails['order_salesPrice']==0.00) { $data['invoice_number'] = 'reservedByPayment_' . $orderDetails['order_number']; // Nerver send the invoice via email } } /** * @param $virtuemart_paymentmethod_id * @param $paymentCurrencyId * @return bool|null */ function plgVmgetEmailCurrency($virtuemart_paymentmethod_id, $virtuemart_order_id, &$emailCurrencyId) { if (!($method = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement($method->payment_element)) { return FALSE; } if(empty($method->email_currency)){ } else if($method->email_currency == 'vendor'){ $vendor_model = VmModel::getModel('vendor'); $vendor = $vendor_model->getVendor($method->virtuemart_vendor_id); $emailCurrencyId = $vendor->vendor_currency; } else if($method->email_currency == 'payment'){ $emailCurrencyId = $this->getPaymentCurrency($method); } } /** * This event is fired during the checkout process. It can be used to validate the * method data as entered by the user. * * @return boolean True when the data was valid, false otherwise. If the plugin is not activated, it should return null. * @author Max Milbers public function plgVmOnCheckoutCheckDataPayment( VirtueMartCart $cart) { return null; } */ /** * This method is fired when showing when priting an Order * It displays the the payment method-specific data. * * @param integer $_virtuemart_order_id The order ID * @param integer $method_id method used for this order * @return mixed Null when for payment methods that were not selected, text (HTML) otherwise * @author Valerie Isaksen */ function plgVmonShowOrderPrintPayment ($order_number, $method_id) { return $this->onShowOrderPrint ($order_number, $method_id); } function plgVmDeclarePluginParamsPaymentVM3( &$data) { return $this->declarePluginParams('payment', $data); } function plgVmSetOnTablePluginParamsPayment ($name, $id, &$table) { return $this->setOnTablePluginParams ($name, $id, $table); } //Notice: We only need to add the events, which should work for the specific plugin, when an event is doing nothing, it should not be added /** * Save updated order data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * public function plgVmOnUpdateOrderPayment( $_formData) { return null; } /** * Save updated orderline data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * public function plgVmOnUpdateOrderLine( $_formData) { return null; } /** * plgVmOnEditOrderLineBE * This method is fired when editing the order line details in the backend. * It can be used to add line specific package codes * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * public function plgVmOnEditOrderLineBEPayment( $_orderId, $_lineId) { return null; } /** * This method is fired when showing the order details in the frontend, for every orderline. * It can be used to display line specific package codes, e.g. with a link to external tracking and * tracing systems * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * public function plgVmOnShowOrderLineFE( $_orderId, $_lineId) { return null; } /** * This event is fired when the method notifies you when an event occurs that affects the order. * Typically, the events represents for payment authorizations, Fraud Management Filter actions and other actions, * such as refunds, disputes, and chargebacks. * * NOTE for Plugin developers: * If the plugin is NOT actually executed (not the selected payment method), this method must return NULL * * @param $return_context: it was given and sent in the payment form. The notification should return it back. * Used to know which cart should be emptied, in case it is still in the session. * @param int $virtuemart_order_id : payment order id * @param char $new_status : new_status for this order id. * @return mixed Null when this method was not selected, otherwise the true or false * * @author Valerie Isaksen * * public function plgVmOnPaymentNotification() { return null; } /** * plgVmOnPaymentResponseReceived * This event is fired when the method returns to the shop after the transaction * * the method itself should send in the URL the parameters needed * NOTE for Plugin developers: * If the plugin is NOT actually executed (not the selected payment method), this method must return NULL * * @param int $virtuemart_order_id : should return the virtuemart_order_id * @param text $html: the html to display * @return mixed Null when this method was not selected, otherwise the true or false * * @author Valerie Isaksen * * function plgVmOnPaymentResponseReceived(, &$virtuemart_order_id, &$html) { return null; } */ } // No closing tag