/** * {@inheritDoc} */ public function calculate($request, ShoppingCart $shoppingCart) { $paymentType = $shoppingCart->getSelectedPaymentType(); // iterate over all conditions $output = array(); foreach ($this->container->get('settingsService')->get('plugins.paymentSurcharge.conditions', array()) as $condition) { if ($paymentType->getId() == $condition['code'] || null === $condition['code']) { // payment module match if (null != $condition['cvalue']) { $cvalueToken = explode(':', $condition['cvalue']); if (2 == count($cvalueToken)) { $cvalueType = $cvalueToken[0]; $cvalueName = $cvalueToken[1]; } else { $cvalueType = 'field'; $cvalueName = $cvalueToken[0]; } // evaluate the value to use with the regexp $cvalueNames = explode(';', $cvalueName); switch ($cvalueType) { case 'field': $cvalue = null; foreach ($cvalueNames as $name) { if (isset($payment->{$name})) { $cvalue = $payment->{$name}; } else { $cvalue = $request->getParameter($name, null); } if (null !== $cvalue) { break; } } break; default: $this->container->get('logger')->err('invalid condition value type: ' . $cvalueType); return null; } } // check eregexp if (null == $condition['cvalue'] && null == $condition['regexp'] || ereg($condition['regexp'], $cvalue)) { // match, so apply condition // evaluate the condition's value $amount = 0; if (is_numeric($condition['value'])) { $amount = (double) $condition['value']; } if (0 === strpos($condition['value'], '%:')) { $amount = trim(str_replace('%:', '', $condition['value'])); $amount = $shoppingCart->getSubtotal() * ($amount / 100); } $details = Beans::getBean('ZMOrderTotalLineDetails'); $details->setTitle($condition['title']); $details->setAmount($amount); $details->setDisplayValue($amount); $output[] = $details; } } } return $output; }