Skip to content

Commit

Permalink
feat: adiciona suporte ao reembolso
Browse files Browse the repository at this point in the history
  • Loading branch information
valdeir2000 committed Sep 11, 2020
1 parent 79bade6 commit 40c65a6
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 6 deletions.
47 changes: 46 additions & 1 deletion upload/admin/controller/event/extension/payment/pagseguro.php
Expand Up @@ -30,6 +30,7 @@ public function manager_order(&$route, &$data)

$new_data['details'] = $this->details($order_id, $order_info);
$new_data['cancel'] = $this->cancel($order_id, $order_info, $data);
$new_data['refund'] = $this->refund($order_id, $order_info, $data);
$new_data['pagseguro_success'] = $this->session->data['pagseguro_success'] ?? false;
$new_data['pagseguro_failed'] = $this->session->data['pagseguro_failed'] ?? false;

Expand Down Expand Up @@ -110,7 +111,7 @@ private function details($order_id, $order_info)
}

/**
* Captura os detalhes da transação
* Captura os dados para cancelamento
*
* @param int $order_id
* @param array $order_info
Expand Down Expand Up @@ -142,6 +143,50 @@ private function cancel($order_id, $order_info, $data)
];
}

/**
* Captura os dados para reembolso
*
* @param int $order_id
* @param array $order_info
* @param array $data
*
* @return array
*/
private function refund($order_id, $order_info, $data)
{
$status_paid = array_filter($data['order_statuses'], function ($item) {
return $item['order_status_id'] == $this->config->get(self::EXTENSION_PREFIX . 'order_status_paid');
});
$status_paid = reset($status_paid);

$status_available = array_filter($data['order_statuses'], function ($item) {
return $item['order_status_id'] == $this->config->get(self::EXTENSION_PREFIX . 'order_status_available');
});
$status_available = reset($status_available);

$status_disputed = array_filter($data['order_statuses'], function ($item) {
return $item['order_status_id'] == $this->config->get(self::EXTENSION_PREFIX . 'order_status_disputed');
});
$status_disputed = reset($status_disputed);

$refund_availabled = in_array($order_info['order_status_id'], [
$status_paid['order_status_id'],
$status_available['order_status_id'],
$status_disputed['order_status_id']
]);

return [
'text_alert_refund' => sprintf(
$this->language->get('text_alert_refund'),
$status_paid['name'],
$status_available['name'],
$status_disputed['name']
),
'availabled' => $refund_availabled,
'url' => $this->url->link('sale/pagseguro_manager_order/refund', 'order_id=' . $order_id)
];
}

/**
* Cria um ambiente de desenvolvimento
*
Expand Down
53 changes: 52 additions & 1 deletion upload/admin/controller/sale/pagseguro_manager_order.php
Expand Up @@ -9,6 +9,9 @@ class ControllerSalePagSeguroManagerOrder extends Controller
{
const EXTENSION_PREFIX = 'payment_pagseguro_';

/**
* Cancela uma transação no PagSeguro
*/
public function cancel()
{
$this->load->language('extension/payment/pagseguro');
Expand All @@ -35,7 +38,8 @@ public function cancel()
if ($result) {
$this->session->data['pagseguro_success'] = $this->language->get('text_void_success');
$order_status_id = $this->config->get(self::EXTENSION_PREFIX . 'order_status_cancelled');
$this->db->escape('UPDATE ' . DB_PREFIX . 'order SET order_status_id = "' . $order_status_id . '" WHERE order_id = "' . intval($order_id) . '"');
$this->db->query('UPDATE ' . DB_PREFIX . 'order SET order_status_id = "' . $order_status_id . '" WHERE order_id = "' . intval($order_id) . '"');
$this->db->query("INSERT INTO " . DB_PREFIX . "order_history SET order_id = '" . intval($order_id) . "', order_status_id = '" . $order_status_id . "', notify = '0', comment = '', date_added = NOW()");
} else {
$this->session->data['pagseguro_failed'] = $this->language->get('text_void_failed');
}
Expand All @@ -52,6 +56,53 @@ public function cancel()
);
}

/**
* Realiza reembolso total no PagSeguro
*/
public function refund()
{
$this->load->language('extension/payment/pagseguro');

$order_id = $this->request->get['order_id'] ?? 0;

$this->load->model('extension/payment/pagseguro');
$this->load->model('sale/order');

$transaction_info = $this->model_extension_payment_pagseguro->getTransactionInfo(
$order_id,
['code']
);

if (!isset($transaction_info['code'])) {
header('HTTP/1.0 404 Not Found');
return;
}

try {
$request = new Sale($this->buildEnv());
$result = $request->refund($transaction_info['code']);

if ($result) {
$this->session->data['pagseguro_success'] = $this->language->get('text_refund_success');
$order_status_id = $this->config->get(self::EXTENSION_PREFIX . 'order_status_returned');
$this->db->query('UPDATE ' . DB_PREFIX . 'order SET order_status_id = "' . $order_status_id . '" WHERE order_id = "' . intval($order_id) . '"');
$this->db->query("INSERT INTO " . DB_PREFIX . "order_history SET order_id = '" . intval($order_id) . "', order_status_id = '" . $order_status_id . "', notify = '0', comment = '', date_added = NOW()");
} else {
$this->session->data['pagseguro_failed'] = $this->language->get('text_refund_failed');
}
} catch (Exception $e) {
$this->session->data['pagseguro_failed'] = $this->language->get('text_refund_failed');
}

$this->response->redirect(
$this->url->link(
'sale/order/info',
'order_id=' . $order_id .
'&user_token=' . $this->session->data['user_token']
)
);
}

/**
* Cria um ambiente de desenvolvimento
*
Expand Down
7 changes: 6 additions & 1 deletion upload/admin/language/en-gb/extension/payment/pagseguro.php
Expand Up @@ -64,11 +64,16 @@
$_['text_pagseguro_details'] = 'Detalhes';
$_['text_view'] = 'Visualizar';
$_['text_alert_cancel'] = 'Transação deverá estar com os status %s ou %s';
$_['text_alert_refund'] = 'Transação deverá estar com os status %s, %s ou %s';
$_['text_modal_cancel'] = 'Atenção! Essa ação <b>não</b> poderá ser desfeita.<br>Tem certeza que deseja continuar?';
$_['text_pagseguro_text'] = 'Cancelar';
$_['text_modal_refund'] = 'Atenção! Essa ação <b>não</b> poderá ser desfeita.<br>Tem certeza que deseja continuar?';
$_['text_cancel_text'] = 'Cancelar';
$_['text_refund_text'] = 'Reembolsar';
$_['text_attention'] = 'Atenção!';
$_['text_void_success'] = 'Pedido cancelado com sucesso!';
$_['text_void_failed'] = 'Não foi possível cancelar o pedido. Caso a opção <i>debug</i> esteja ativada, consulte o <i>log</i>!';
$_['text_refund_success'] = 'Pedido reembolsado com sucesso';
$_['text_refund_failed'] = 'Não foi possível reembolsar o cliente. Caso a opção <i>debug</i> esteja ativada, consulte o <i>log</i>!';

// Error
$_['error_permission'] = 'Atenção! vocẽ não tem permissão para modificar o módulo';
Expand Down
45 changes: 42 additions & 3 deletions upload/admin/view/template/sale/order_pagseguro.twig
Expand Up @@ -14,7 +14,8 @@
<div class="panel-body">
<ul class="nav nav-tabs">
<li><a href="#tab-pagseguro-detail" data-toggle="tab">{{ text_pagseguro_details }}</a></li>
<li class="active"><a href="#tab-pagseguro-cancel" data-toggle="tab">{{ text_pagseguro_text }}</a></li>
<li><a href="#tab-pagseguro-cancel" data-toggle="tab">{{ text_cancel_text }}</a></li>
<li class="active"><a href="#tab-pagseguro-refund" data-toggle="tab">{{ text_refund_text }}</a></li>
</ul>

<div class="tab-content">
Expand Down Expand Up @@ -78,7 +79,7 @@
</table>
</div>

<div class="tab tab-pane active" id="tab-pagseguro-cancel">
<div class="tab tab-pane" id="tab-pagseguro-cancel">
{% if cancel.availabled %}
<button
type="button"
Expand All @@ -87,12 +88,28 @@
data-toggle="modal"
data-target="#modal-pagseguro-cancel"
>
{{ text_pagseguro_text }}
{{ text_cancel_text }}
</button>
{% else %}
<p class="bg-info" style="padding: 15px">{{ cancel.text_alert_cancel }}</p>
{% endif %}
</div>

<div class="tab tab-pane active" id="tab-pagseguro-refund">
{% if refund.availabled %}
<button
type="button"
data-href="{{ refund.url }}"
class="btn btn-warning"
data-toggle="modal"
data-target="#modal-pagseguro-refund"
>
{{ text_refund_text }}
</button>
{% else %}
<p class="bg-info" style="padding: 15px">{{ refund.text_alert_refund }}</p>
{% endif %}
</div>
</div>
</div>
</div>
Expand All @@ -115,8 +132,30 @@
</div>
</div>

<div class="modal fade" tabindex="-1" role="dialog" id="modal-pagseguro-refund">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">{{ text_attention }}</h4>
</div>
<div class="modal-body">
{{ text_modal_refund }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal">{{ text_no }}</button>
<button type="button" class="btn btn-primary" onclick="pagseguroRefund()">{{ text_yes }}</button>
</div>
</div>
</div>
</div>

<script>
function pagseguroCancel() {
location.href = `{{ cancel.url }}`.replace(/&amp;/g, '&').concat(`&user_token=${getURLVar('user_token')}`)
}
function pagseguroRefund() {
location.href = `{{ refund.url }}`.replace(/&amp;/g, '&').concat(`&user_token=${getURLVar('user_token')}`)
}
</script>

0 comments on commit 40c65a6

Please sign in to comment.