Skip to content

Commit 82e6f44

Browse files
Merge pull request #129 from michielgerritsen/feature/payment-fee
Implemented the payment fee
2 parents 6e38c26 + c54f5c4 commit 82e6f44

File tree

38 files changed

+1423
-41
lines changed

38 files changed

+1423
-41
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
class Mollie_Mpm_Block_Adminhtml_Sales_Creditmemo_PaymentFee extends Mage_Adminhtml_Block_Sales_Order_Creditmemo_Totals
4+
{
5+
public function initTotals()
6+
{
7+
$order = $this->getOrder();
8+
$parent = $this->getParentBlock();
9+
10+
$fee = $order->getMollieMpmPaymentFee();
11+
$baseFee = $order->getBaseMollieMpmPaymentFee();
12+
13+
$tax = $order->getMollieMpmPaymentFeeTax();
14+
$baseTax = $order->getBaseMollieMpmPaymentFeeTax();
15+
16+
if (!Mage::helper('mpm/paymentFee')->isFullOrLastPartialCreditmemo($this->getCreditmemo())) {
17+
return $this;
18+
}
19+
20+
$total = new Varien_Object();
21+
$total->setLabel(__('Mollie Payment Fee'))
22+
->setValue($fee + $tax)
23+
->setBaseValue($baseFee + $baseTax)
24+
->setCode('mollie_mpm_payment_fee');
25+
26+
$parent->addTotalBefore($total, 'shipping');
27+
28+
return $this;
29+
}
30+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
class Mollie_Mpm_Block_Adminhtml_Sales_Invoice_PaymentFee extends Mage_Sales_Block_Order_Invoice_Totals
4+
{
5+
public function initTotals()
6+
{
7+
$order = $this->getOrder();
8+
$parent = $this->getParentBlock();
9+
10+
$fee = $order->getMollieMpmPaymentFee();
11+
$baseFee = $order->getBaseMollieMpmPaymentFee();
12+
13+
$tax = $order->getMollieMpmPaymentFeeTax();
14+
$baseTax = $order->getBaseMollieMpmPaymentFeeTax();
15+
16+
$total = new Varien_Object();
17+
$total->setLabel(__('Mollie Payment Fee'));
18+
$total->setValue($fee + $tax);
19+
$total->setBaseValue($baseFee + $baseTax);
20+
$total->setCode('mollie_mpm_payment_fee');
21+
22+
$parent->addTotalBefore($total, 'shipping');
23+
24+
return $this;
25+
}
26+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
class Mollie_Mpm_Block_Adminhtml_Sales_Order_Create_PaymentFee extends Mage_Adminhtml_Block_Sales_Order_Create_Totals
4+
{
5+
protected $_template = 'mollie/mpm/order/create/totals/paymentfee.phtml';
6+
7+
public function getValue()
8+
{
9+
$address = $this->getTotal()->getAddress();
10+
11+
return $address->getMollieMpmPaymentFee() + $address->getMollieMpmPaymentFeeTax();
12+
}
13+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
class Mollie_Mpm_Block_Adminhtml_Sales_Order_PaymentFee extends Mage_Adminhtml_Block_Sales_Order_Totals
4+
{
5+
public function initTotals()
6+
{
7+
$order = $this->getOrder();
8+
$parent = $this->getParentBlock();
9+
10+
$fee = $order->getMollieMpmPaymentFee();
11+
$baseFee = $order->getBaseMollieMpmPaymentFee();
12+
13+
$tax = $order->getMollieMpmPaymentFeeTax();
14+
$baseTax = $order->getBaseMollieMpmPaymentFeeTax();
15+
16+
if (!$fee || !$baseFee) {
17+
return $this;
18+
}
19+
20+
$total = new Varien_Object();
21+
$total->setLabel(__('Mollie Payment Fee'))
22+
->setValue($fee + $tax)
23+
->setBaseValue($baseFee + $baseTax)
24+
->setCode('mollie_mpm_payment_fee');
25+
26+
$parent->addTotalBefore($total, 'shipping');
27+
28+
return $this;
29+
}
30+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
4+
class Mollie_Mpm_Block_Checkout_PaymentFee extends Mage_Checkout_Block_Total_Default
5+
{
6+
protected $_template = 'mollie/mpm/payment/totals/paymentFee/quote.phtml';
7+
8+
public function getPaymentFeeIncludingTax()
9+
{
10+
$helper = Mage::helper('mpm/paymentFee');
11+
12+
/** @var Mage_Sales_Model_Quote $quote */
13+
$quote = Mage::getSingleton('checkout/session')->getQuote();
14+
15+
return $helper->getPaymentFeeInludingTax($quote->getBillingAddress());
16+
}
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
4+
class Mollie_Mpm_Exceptions_OrderMissingPaymentFee extends Exception
5+
{
6+
7+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
4+
class Mollie_Mpm_Helper_OrderLines_PaymentFee
5+
{
6+
/**
7+
* @param Mage_Sales_Model_Order $order
8+
* @return bool
9+
*/
10+
public function orderHasPaymentFee(Mage_Sales_Model_Order $order)
11+
{
12+
if ($order->getMollieMpmPaymentFee() && $order->getMollieMpmPaymentFee() != 0) {
13+
return true;
14+
}
15+
16+
return false;
17+
}
18+
19+
/**
20+
* @param Mage_Sales_Model_Order_Creditmemo $creditmemo
21+
* @return bool
22+
*/
23+
public function creditmemoHasPaymentFee(Mage_Sales_Model_Order_Creditmemo $creditmemo)
24+
{
25+
if ($creditmemo->getMollieMpmPaymentFee() && $creditmemo->getMollieMpmPaymentFee() != 0) {
26+
return true;
27+
}
28+
29+
return false;
30+
}
31+
32+
public function getOrderLine(Mage_Sales_Model_Order $order)
33+
{
34+
$this->validateOrder($order);
35+
36+
/** @var Mollie_Mpm_Helper_Data $mollieHelper */
37+
$mollieHelper = Mage::helper('mpm');
38+
39+
$paymentFee = $order->getMollieMpmPaymentFee();
40+
$paymentFeeTax = $order->getMollieMpmPaymentFeeTax();
41+
$totalPaymentFee = $paymentFee + $paymentFeeTax;
42+
$vatRate = ($paymentFeeTax / $paymentFee) * 100;
43+
44+
return [
45+
'type' => 'surcharge',
46+
'name' => Mage::helper('mpm')->__('Mollie Payment Fee'),
47+
'quantity' => 1,
48+
'unitPrice' => $mollieHelper->getAmountArray($order->getOrderCurrencyCode(), $totalPaymentFee),
49+
'totalAmount' => $mollieHelper->getAmountArray($order->getOrderCurrencyCode(), $totalPaymentFee),
50+
'vatRate' => round($vatRate, 2),
51+
'vatAmount' => $mollieHelper->getAmountArray($order->getOrderCurrencyCode(), $paymentFeeTax),
52+
'sku' => 'surcharge',
53+
];
54+
}
55+
56+
public function getCreditmemoOrderLine(Mage_Sales_Model_Order_Creditmemo $creditmemo)
57+
{
58+
/** @var Mollie_Mpm_Model_OrderLines $helper */
59+
$helper = Mage::getModel('mpm/orderLines');
60+
$orderLine = $helper->getSurchargeItemLineOrder($creditmemo->getOrderId());
61+
62+
return [
63+
'id' => $orderLine->getLineId(),
64+
];
65+
}
66+
67+
private function validateOrder(Mage_Sales_Model_Order $order)
68+
{
69+
if (
70+
!$order->getMollieMpmPaymentFee() ||
71+
!$order->getMollieMpmPaymentFeeTax() ||
72+
!$order->getBaseMollieMpmPaymentFee() ||
73+
!$order->getBaseMollieMpmPaymentFeeTax()
74+
) {
75+
throw new Mollie_Mpm_Exceptions_OrderMissingPaymentFee('The order is missing the paymentFee fields');
76+
}
77+
}
78+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
<?php
2+
3+
class Mollie_Mpm_Helper_PaymentFee extends Mage_Core_Helper_Abstract
4+
{
5+
const PAYMENT_FEE_SURCHARGE_PATH = 'payment/%s/payment_surcharge';
6+
const PAYMENT_FEE_TAX_CLASS_PATH = 'payment/%s/payment_surcharge_tax_class';
7+
8+
/**
9+
* @var array
10+
*/
11+
private $taxCalculation = [];
12+
13+
public function getPaymentFeeInludingTax(Mage_Sales_Model_Quote_Address $address)
14+
{
15+
$quote = $address->getQuote();
16+
$store = $quote->getStore();
17+
$methodCode = $quote->getPayment()->getMethod();
18+
19+
$value = Mage::getStoreConfig(
20+
sprintf(static::PAYMENT_FEE_SURCHARGE_PATH, $methodCode),
21+
$store
22+
);
23+
24+
return (double)str_replace(',', '.', $value);
25+
}
26+
27+
public function getPaymentFeeWithoutTax(Mage_Sales_Model_Quote_Address $address)
28+
{
29+
$fee = $this->getPaymentFeeInludingTax($address);
30+
$tax = $this->getPaymentFeeTax($address);
31+
32+
return $fee - $tax;
33+
}
34+
35+
public function getPaymentFeeTax(Mage_Sales_Model_Quote_Address $address)
36+
{
37+
$quote = $address->getQuote();
38+
$method = $quote->getPayment()->getMethod();
39+
40+
if (isset($this->taxCalculation[$method])) {
41+
return $this->taxCalculation[$method];
42+
}
43+
44+
/** @var Mage_Tax_Model_Calculation $taxCalculationModel */
45+
$taxCalculationModel = Mage::getSingleton('tax/calculation');
46+
$customerTaxClassId = $quote->getCustomerTaxClassId();
47+
$store = $quote->getStore();
48+
$request = $taxCalculationModel->getRateRequest(
49+
$address,
50+
$quote->getBillingAddress(),
51+
$customerTaxClassId,
52+
$store
53+
);
54+
55+
$taxClassId = $this->getTaxClass($method);
56+
$request->setProductClassId($taxClassId, $store);
57+
58+
$rate = $taxCalculationModel->getRate($request);
59+
60+
$fee = $this->getPaymentFeeInludingTax($address);
61+
$result = $taxCalculationModel->calcTaxAmount(
62+
$fee,
63+
$rate,
64+
true,
65+
false
66+
);
67+
68+
$this->taxCalculation[$method] = $result;
69+
70+
return $result;
71+
}
72+
73+
public function getVatRate($methodCode, $storeCode = null)
74+
{
75+
$store = Mage::app()->getStore($storeCode);
76+
$taxClassId = $this->getTaxClass($methodCode, $storeCode);
77+
78+
/** @var Mage_Tax_Model_Calculation $taxCalculation */
79+
$taxCalculation = Mage::getSingleton('tax/calculation');
80+
81+
$request = $taxCalculation->getRateRequest(null, null, null, $store);
82+
$percent = $taxCalculation->getRate($request->setProductClassId($taxClassId));
83+
84+
return $percent;
85+
}
86+
87+
public function getTaxClass($methodCode, $storeCode = null)
88+
{
89+
return Mage::getStoreConfig(
90+
sprintf(static::PAYMENT_FEE_TAX_CLASS_PATH, $methodCode),
91+
Mage::app()->getStore($storeCode)
92+
);
93+
}
94+
95+
public function isFullOrLastPartialCreditmemo(Mage_Sales_Model_Order_Creditmemo $creditmemo)
96+
{
97+
/** @var Mage_Sales_Model_Order_Creditmemo_Item $item */
98+
foreach ($creditmemo->getAllItems() as $item) {
99+
$orderItem = $item->getOrderItem();
100+
$refundable = $orderItem->getQtyOrdered() - $orderItem->getQtyRefunded();
101+
102+
if ($refundable != $item->getQty()) {
103+
return false;
104+
}
105+
}
106+
107+
return true;
108+
}
109+
110+
public function hasItemsLeftToRefund(Mage_Sales_Model_Order_Creditmemo $creditmemo)
111+
{
112+
/** @var Mage_Sales_Model_Order_Item $item */
113+
foreach ($creditmemo->getOrder()->getAllItems() as $item) {
114+
$refundable = $item->getQtyOrdered() - $item->getQtyRefunded();
115+
116+
if ($refundable) {
117+
return true;
118+
}
119+
}
120+
121+
return false;
122+
}
123+
124+
public function methodSupportsPaymentFee($methodCode)
125+
{
126+
$supportedMethods = array(
127+
'mollie_klarnapaylater',
128+
'mollie_klarnasliceit',
129+
);
130+
131+
return in_array($methodCode, $supportedMethods);
132+
}
133+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
class Mollie_Mpm_Model_Adminhtml_System_Config_Backend_SurchargeValidation extends Mage_Core_Model_Config_Data
4+
{
5+
const MAX_SURCHARGE = 1.95;
6+
7+
public function save()
8+
{
9+
if ($this->getValue() > 1.95) {
10+
Mage::throwException(
11+
Mage::helper('mpm')->__(
12+
'The payment surcharge cannot exceed &euro; %s',
13+
static::MAX_SURCHARGE
14+
)
15+
);
16+
}
17+
18+
return parent::save();
19+
}
20+
}

0 commit comments

Comments
 (0)