Source: PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD.js

'use strict';

/**
 * Controller for PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD
 *
 * @module controllers/PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD
 */

var app = require('sitegenesis_controllers/cartridge/scripts/app');
var guard = require('sitegenesis_controllers/cartridge/scripts/guard');

/* API Includes */
var PaymentMgr = require('dw/order/PaymentMgr');
var OrderMgr = require('dw/order/OrderMgr');
var Transaction = require('dw/system/Transaction');
var URLUtils = require('dw/web/URLUtils');

var libPayment = require('int_payment_core/cartridge/scripts/lib/libPayment.ds');
var parameterMap = request.httpParameterMap;
var SubmitImpl = app.getModel('Order').submit;

/**
 * Handle Asynchronous Credit Card Payment
 */
function CheckDirectLinkPayment(args) {
	
	var ret = {};
	
	if(!empty(parameterMap.orderNo.stringValue)){
		var OrderNo = parameterMap.orderNo.stringValue;
		var PM = parameterMap.pmID.value;
	} else {
		var OrderNo = parameterMap.orderID.stringValue;
		var PM = parameterMap.PM.value;
	}
	
	ret.Order = OrderMgr.getOrder(OrderNo);
	var ShaCode = libPayment.createShaForUrls(order);

	if(ShaCode == parameterMap.tn.toString()){
		Transaction.wrap(function () {
			ret.Order.custom.ecommerceResponseCount = 1;
			session.forms.billing.fulfilled.value = true;
		});
		if(ret.Order.status == dw.order.Order.ORDER_STATUS_CREATED) {
			var result = libPayment.GetPaymentDirectLinkOrderData(ret.Order, request.locale, PM);
			ret.Status = result.Status;
			ret.PaymentMethodID = result.PaymentMethodID;
			ret.ErrorStatus = result.ErrorStatus;
			ret.PaymentStatus = result.PaymentStatus;
			ret.ResultStatusCheck = result.ResultStatusCheck;
			
			if(result.success) {
				ret.EndNode = 'success';
			} else {
				if(result.ResultStatusCheck == "RETRY") {
					ret.EndNode = 'success';
				} else if(result.ErrorStatus == "2") {
					ret.EndNode = 'declined';
				} else if(result.ErrorStatus == "1") {
					ret.EndNode = 'declined';
				} else {
					ret.EndNode = 'canceled';
				}
			}
		} else {
			if(ret.Order.status != dw.order.Order.ORDER_STATUS_FAILED) {
				response.redirect(URLUtils.https('Ingenico-AcceptEcommerce'));
			} else {
				ret.EndNode = 'declined';
			}
		}
	} else {
		ret.Order = null;
		ret.EndNode = 'error';
	}
	
	return ret;
}

/**
 * This methode renderes the appropriate 3d secure redirect template for the order status
 */
function renderTemplate(){
	var res = CheckDirectLinkPayment();
	
	if(res.EndNode == 'success') {
		SubmitImpl(res.Order, true);
	} else if(res.EndNode == 'decline') {
		app.getView({
			Order : res.Order
		}).render('ecommerceRedirectDecline');
	} else if(res.EndNode == 'error') {
		app.getView({
			Order : res.Order
		}).render('ecommerceRedirectDecline');
	} else if(res.EndNode == 'canceled') {
		app.getView({
			Order : res.Order
		}).render('ecommerceRedirectCanceled');
	}
}

/**
 * Accept 3DS Return Urls
 */
function 3DSAccept() {
	Transaction.wrap(function () {
		libPayment.SetAuthorizedPayment(parameterMap);
	});
	renderTemplate();
}

/**
 * Decline 3DS Return Urls
 */
function 3DSDecline() {
	session.custom.PaymentProcessStarted = null;
	renderTemplate();
}

/**
 * Canceled 3DS Return Urls
 */
function 3DSCancel() {
	session.custom.PaymentProcessStarted = null;
	renderTemplate();
}

/**
 * Excepted 3DS Return Urls
 */
function 3DSExcept() {
	session.custom.PaymentProcessStarted = null;
	renderTemplate();
}

/*
 * Export the private controller methods
 */

exports.CheckDirectLinkPayment = CheckDirectLinkPayment;

/*
 * Export the publicly available controller methods
 */

/** Accept 3DS Return Urls
 * @see module:controllers/PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD~3DSAccept */
exports.3DSAccept = guard.ensure(['https'], 3DSAccept);
/** Decline 3DS Return Urls
 * @see module:controllers/PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD~3DSDecline */
exports.3DSDecline = guard.ensure(['https'], 3DSDecline);
/** Canceled 3DS Return Urls
 * @see module:controllers/PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD~3DSCancel */
exports.3DSCancel = guard.ensure(['https'], 3DSCancel);
/** Excepted 3DS Return Urls
 * @see module:controllers/PAYMENT_HOSTED_TOKENIZATION_PAGE_CREDIT_CARD~3DSExcept */
exports.3DSExcept = guard.ensure(['https'], 3DSExcept);