Completed
Push — master ( bb4762...ee0943 )
by Roman
15:21
created

GridFieldVoidAction   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 9

Importance

Changes 0
Metric Value
wmc 9
lcom 0
cbo 9
dl 0
loc 94
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getActions() 0 4 1
A getColumnContent() 0 35 3
A handleAction() 0 26 5
1
<?php
2
namespace Bummzack\SsOmnipayUI\GridField;
3
4
use SilverStripe\Forms\GridField\GridField;
5
use SilverStripe\Forms\GridField\GridField_ActionProvider;
6
use SilverStripe\Forms\GridField\GridField_FormAction;
7
use SilverStripe\Omnipay\Model\Payment;
8
use SilverStripe\Omnipay\Service\ServiceFactory;
9
use SilverStripe\Omnipay\Exception\Exception;
10
use SilverStripe\ORM\DataObject;
11
use SilverStripe\ORM\ValidationException;
12
use SilverStripe\View\Requirements;
13
14
/**
15
 * A GridField button that can be used to void a payment
16
 *
17
 * @package SilverStripe\Omnipay\Admin\GridField
18
 */
19
class GridFieldVoidAction extends GridFieldPaymentAction implements GridField_ActionProvider
20
{
21
    /**
22
     * Which GridField actions are this component handling
23
     *
24
     * @param GridField $gridField
25
     * @return array
26
     */
27
    public function getActions($gridField)
28
    {
29
        return array('voidpayment');
30
    }
31
32
    /**
33
     *
34
     * @param GridField $gridField
35
     * @param DataObject $record
36
     * @param string $columnName
37
     * @return string|null - the HTML for the column
38
     */
39
    public function getColumnContent($gridField, $record, $columnName)
40
    {
41
        if (!($record instanceof Payment)) {
42
            return null;
43
        }
44
45
        if (!$record->canVoid()) {
46
            return null;
47
        }
48
49
        Requirements::css('bummzack/silverstripe-omnipay-ui: client/dist/css/omnipay-ui-cms.css');
50
        Requirements::javascript('bummzack/silverstripe-omnipay-ui: client/dist/javascript/omnipay-ui-cms.js');
51
        Requirements::add_i18n_javascript('bummzack/silverstripe-omnipay-ui: client/dist/javascript/lang');
52
53
        /** @var GridField_FormAction $field */
54
        $field = GridField_FormAction::create(
55
            $gridField,
56
            'VoidPayment' . $record->ID,
57
            false,
58
            'voidpayment',
59
            array('RecordID' => $record->ID)
60
        )
61
            ->addExtraClass('gridfield-button-void payment-dialog-button')
62
            ->setAttribute('title', _t('GridFieldVoidAction.Title', 'Void Payment'))
63
            ->setAttribute('data-icon', 'button-void')
64
            ->setAttribute('data-dialog', json_encode(array(
65
                'maxAmount' => $record->dbObject('Money')->Nice(),
66
                'hasAmountField' => false,
67
                'infoTextKey' => 'VoidInfo',
68
                'buttonTextKey' => 'VoidPayment'
69
            )))
70
            ->setDescription(_t('GridFieldVoidAction.Description', 'Void an authorized payment'));
71
72
        return $field->Field();
73
    }
74
75
    /**
76
     * Handle the actions and apply any changes to the GridField
77
     *
78
     * @param GridField $gridField
79
     * @param string $actionName
80
     * @param mixed $arguments
81
     * @param array $data - form data
82
     * @return void
83
     * @throws ValidationException when there was an error
84
     * @throws \SilverStripe\Omnipay\Exception\InvalidConfigurationException
85
     */
86
    public function handleAction(GridField $gridField, $actionName, $arguments, $data)
87
    {
88
        if ($actionName == 'voidpayment') {
89
            $item = $gridField->getList()->byID($arguments['RecordID']);
90
            if (!($item instanceof Payment)) {
91
                return;
92
            }
93
94
            /** @var ServiceFactory $factory */
95
            $factory = ServiceFactory::create();
96
            $voidService = $factory->getService($item, ServiceFactory::INTENT_VOID);
97
98
            try {
99
                $serviceResponse = $voidService->initiate();
100
            } catch (Exception $ex) {
101
                throw new ValidationException($ex->getMessage(), 0);
102
            }
103
104
            if ($serviceResponse->isError()) {
105
                throw new ValidationException(
106
                    _t('GridFieldVoidAction.VoidError', 'Unable to void payment. An error occurred.'),
107
                    0
108
                );
109
            }
110
        }
111
    }
112
}
113