public function transactionCommand()
{
$this->load->language('extension/payment/klarna_checkout');
$this->load->model('extension/payment/klarna_checkout');
$this->load->model('sale/order');
$json = array();
$success = $error = '';
$order_info = $this->model_sale_order->getOrder($this->request->get['order_id']);
list($klarna_account, $connector) = $this->model_extension_payment_klarna_checkout->getConnector($this->config->get('klarna_checkout_account'), $order_info['currency_code']);
if (!$klarna_account || !$connector) {
return;
}
$klarna_order = $this->model_extension_payment_klarna_checkout->omRetrieve($connector, $this->request->post['order_ref']);
if (!$klarna_order) {
return;
}
$old_klarna_status = $klarna_order['status'];
if ($this->request->post['type'] == 'cancel') {
$action = $this->model_extension_payment_klarna_checkout->omCancel($connector, $this->request->post['order_ref']);
} elseif ($this->request->post['type'] == 'capture' && $this->request->post['data']) {
$action = $this->model_extension_payment_klarna_checkout->omCapture($connector, $this->request->post['order_ref'], array('captured_amount' => $this->request->post['data'] * 100));
} elseif ($this->request->post['type'] == 'refund' && $this->request->post['data']) {
$action = $this->model_extension_payment_klarna_checkout->omRefund($connector, $this->request->post['order_ref'], array('refunded_amount' => $this->request->post['data'] * 100));
} elseif ($this->request->post['type'] == 'extend_authorization') {
$action = $this->model_extension_payment_klarna_checkout->omExtendAuthorizationTime($connector, $this->request->post['order_ref']);
} elseif ($this->request->post['type'] == 'merchant_reference' && $this->request->post['data']) {
$data = array();
parse_str(html_entity_decode($this->request->post['data']), $data);
$action = $this->model_extension_payment_klarna_checkout->omUpdateMerchantReference($connector, $this->request->post['order_ref'], array('merchant_reference1' => (string) $data['merchant_reference_1']));
} elseif (($this->request->post['type'] == 'billing_address' || $this->request->post['type'] == 'shipping_address') && $this->request->post['data']) {
if ($this->request->post['type'] == 'billing_address') {
$data['billing_address'] = array();
parse_str(html_entity_decode($this->request->post['data']), $data['billing_address']);
} else {
if ($this->request->post['type'] == 'shipping_address') {
$data['shipping_address'] = array();
parse_str(html_entity_decode($this->request->post['data']), $data['shipping_address']);
}
}
$action = $this->model_extension_payment_klarna_checkout->omUpdateAddress($connector, $this->request->post['order_ref'], $data);
} elseif ($this->request->post['type'] == 'release_authorization') {
$action = $this->model_extension_payment_klarna_checkout->omReleaseAuthorization($connector, $this->request->post['order_ref']);
} elseif ($this->request->post['type'] == 'capture_shipping_info' && isset($this->request->post['id'])) {
$data = array();
parse_str(html_entity_decode($this->request->post['data']), $data);
$action = $this->model_extension_payment_klarna_checkout->omShippingInfo($connector, $this->request->post['order_ref'], $this->request->post['id'], $data);
} elseif ($this->request->post['type'] == 'capture_billing_address' && isset($this->request->post['id'])) {
$data['billing_address'] = array();
parse_str(html_entity_decode($this->request->post['data']), $data['billing_address']);
$action = $this->model_extension_payment_klarna_checkout->omCustomerDetails($connector, $this->request->post['order_ref'], $this->request->post['id'], $data);
} elseif ($this->request->post['type'] == 'trigger_send_out' && isset($this->request->post['id'])) {
$action = $this->model_extension_payment_klarna_checkout->omTriggerSendOut($connector, $this->request->post['order_ref'], $this->request->post['id']);
} else {
$error = true;
}
$klarna_order = $this->model_extension_payment_klarna_checkout->omRetrieve($connector, $this->request->post['order_ref']);
if (!$klarna_order) {
return;
}
$new_klarna_status = $klarna_order['status'];
$order_status_id = '';
if ($old_klarna_status != $new_klarna_status) {
switch ($klarna_order['status']) {
case 'AUTHORIZED':
$order_status_id = $this->config->get('klarna_checkout_order_status_authorised_id');
if ($klarna_order['fraud_status'] == 'PENDING') {
$order_status_id = $this->config->get('klarna_checkout_order_status_fraud_pending_id');
} elseif ($klarna_order['fraud_status'] == 'REJECTED') {
$order_status_id = $this->config->get('klarna_checkout_order_status_fraud_rejected_id');
}
break;
case 'PART_CAPTURED':
$order_status_id = $this->config->get('klarna_checkout_order_status_part_captured_id');
break;
case 'CAPTURED':
$order_status_id = $this->config->get('klarna_checkout_order_status_captured_id');
break;
case 'CANCELLED':
$order_status_id = $this->config->get('klarna_checkout_order_status_cancelled_id');
break;
}
} elseif ($this->request->post['type'] == 'refund' && $klarna_order['captured_amount'] - $klarna_order['refunded_amount'] == 0) {
$order_status_id = $this->config->get('klarna_checkout_order_status_refund_id');
}
if (!$error && $action) {
$success = $this->language->get('text_success_action');
} elseif (!$error && $action && isset($action->message)) {
$error = sprintf($this->language->get('text_error_settle'), $action->message);
} else {
$error = $this->language->get('text_error_generic');
}
$json['success'] = $success;
$json['error'] = $error;
$json['order_status_id'] = $order_status_id;
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}