vds/impl/IPPAdaptor.js

/**
 * @fileoverview This file contains the IPad Protocol Adaptor and its related
 *               utility function. There is quite a lot of code dedicated to
 *               data structure conversion, this is intentional and provides a
 *               layer of abstraction between the exported web service code and
 *               GUI code. It is unclear at the time of writing if the VIViD 
 *               protocol will be implemented in this client or if the ipad 
 *               protocol will be implemented in the stand alone server. This
 *               abstraction of the protocol implementation will allow for both 
 *               options.
 * 
 * TODO: add more assertions of protocol data conversions later.
 *
 * @author anders.rejdebrant@spark-vision.com (Anders Rejdebrant)
 */

goog.provide('spv.vds.impl.IPPAdaptor');
goog.require('spv.vds.impl.IVdsProtocol');
goog.require('spv.vds.impl.IPPCommon');
goog.require('spv.ds.impl.IPPCommon');

goog.require('spv.vds.Campaign');
goog.require('spv.vds.CampaignCollection');
goog.require('spv.vds.ConfigQuickInfoResult');
goog.require('spv.ds.Loan');
goog.require('spv.vds.CCInputParam');
goog.require('spv.vds.VolvoCarSpec');
goog.require('spv.vds.VolvoCarSpecItem');
goog.require('spv.vds.VolvoCarSpecTechData');

goog.require('spv.vds.ipprot.IpadClient');
goog.require('spv.vds.ipprot_nova.IpadClient');
goog.require('spv.vds.ipprot.vds.ConfigQuickInfo');
goog.require('spv.vds.ipprot.vds.ConfigQuickInfoResult');
goog.require('spv.vds.ipprot.specification.Item');
goog.require('spv.vds.ipprot.specification.TechnicalDataAttribute');
goog.require('spv.vds.ipprot.specification.VolvoCarSpecification');
goog.require('spv.vds.ipprot.volvoboosterweb.VolvoRetailer');
goog.require('spv.vds.ipprot.volvocampaigns.Campaign');
goog.require('spv.vds.ipprot.volvocampaigns.CampaignCollection');
goog.require('spv.vds.ipprot.volvocampaigns.DigitalShowroomValues');


/**
 * Protocol adaptor for spv.vds.ipprot.IpadClient
 *
 * Resposible for hiding protocol data types and interpreting reponse data to
 * failures in cases where errors are reported inside the normal result data.
 * eg. Result codes from load config operations.
 *
 * @constructor
 * @implements {spv.vds.impl.IVdsProtocol}
 * @param {string} service_url
 */
spv.vds.impl.IPPAdaptor = function(service_url)
{
	var use_jsonp = true;

	/** @type {spv.vds.ipprot.IpadClient|spv.vds.ipprot_nova.IpadClient} */
	this._impl = new spv.vds.ipprot.IpadClient(service_url, use_jsonp);
};


/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {function(spv.vds.ConfigQuickInfoResult)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.getConfigQuickInfo = function(
	session_id,
	config_name,
	on_success,
	on_failure)
{
	/** @param {spv.vds.impl.RawConfigQuickInfoResult} qi_result */
	var on_success_wrapper = function( qi_result )
	{
		on_success( spv.vds.impl.IPPCommon.convertToConfigQuickInfoResult( qi_result ) );
	};
	this._impl.get_config_quick_info(
		session_id,
		config_name,
		on_success_wrapper,
		on_failure);
}


/**
 * @param {string} session_id
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionEnablePrivateLeasing = function(
	session_id,
	on_success,
	on_failure)
{
	this._impl.enable_private_leasing(
		session_id,
		on_success,
		on_failure);
}

/**
 * @param {string} session_id
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionDisablePrivateLeasing = function(
	session_id,
	on_success,
	on_failure)
{
	this._impl.disable_private_leasing(
		session_id,
		on_success,
		on_failure);
}


/**
 * @param {function(Array.<spv.vds.VolvoRetailer>)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.getRetailers = function(
		on_success,
		on_failure)
{
	/** @param {Array.<spv.vds.impl.RawVolvoRetailer>} rets */
	var on_protocol_success = function(rets)
	{
		var volvo_retailers = spv.vds.impl.IPPCommon.convertToVolvoRetailers(rets);
		on_success(volvo_retailers);
	};
	this._impl.vret_get_retailers(on_protocol_success, on_failure);
};




/**
 * @param {spv.ds.Config} config
 * @param {string} localization_id
 * @param {function(spv.vds.VolvoCarSpec)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.getSpecification = function(
		config,
		localization_id,
		on_success,
		on_failure)
{
	/** @param {spv.vds.impl.RawCarSpecification} spec */
	var proto_success = function(spec)
	{
		var volvo_car_spec = spv.vds.impl.IPPCommon.convertToVolvoCarSpec(spec);
		on_success(volvo_car_spec);
	};
	this._impl.vspec_get_specification(
			config.data,
			config.encoding,
			localization_id,
			proto_success,
			on_failure);
};




/**
 * Disables company car pricing.
 *
 * @param {string} session_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionDisableCCPrices = function(
		session_id,
		on_success,
		on_failure )
{
	this._impl.vcomp_disable_company_car_prices(
		session_id,
		on_success,
		on_failure );
};




/**
 * Enables company car pricing.
 *
 * @param {string} session_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionEnableCCPrices = function(
		session_id,
		on_success,
		on_failure )
{
	this._impl.vcomp_enable_company_car_prices(
		session_id,
		on_success,
		on_failure );
};



/**
 * Updates the parameters for Company Cars pricing.
 * @param {string} session_id
 * @param {Object.<string,Object>} input_params
 * @param {function(Object.<string,spv.vds.CCInputParam>)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionUpdateCCInputParams = function(
		session_id,
		input_params,
		on_success,
		on_failure )
{
	/** @param {Object} reply */
	var on_success_wrapper = function( reply )
	{
		/** @type {Array.<Object>} */
		var raw_params = reply['cc_input_param_list'];
		on_success( spv.vds.impl.IPPCommon.convertObjectsToCCParams( raw_params ) );
	};

	var raw_params = input_params; // convertCCParamsToObjects( input_params );
	//console.log( raw_params );
	this._impl.vcomp_update_input_params_2(
		session_id,
		raw_params,
		on_success_wrapper,
		on_failure );
};




/**
 * @param {string} session_id
 * @param {string} feed_id
 * @param {function(spv.vds.CampaignCollection)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionGetCampaigns = function(
		session_id,
		feed_id,
		on_success,
		on_failure)
{
	/** @param {spv.vds.impl.RawCampaignCollection} proto_cc */
	var on_protocol_success = function(proto_cc)
	{
		var cc = spv.vds.impl.IPPCommon.convertToCampaignCollection(proto_cc);
		on_success(cc);
	};
	this._impl.vcamp_get_campaigns(
			session_id,
			feed_id,
			on_protocol_success,
			on_failure);
};



/**
 * @param {string} feed_id
 * @param {function(spv.vds.CampaignCollection)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.getCampaigns = function(
	feed_id,
	on_success,
	on_failure )
{
	throw new Error( "Not supported in legacy backend." );
};




/**
 * @param {string} session_id
 * @param {number} down_payment
 * @param {number} interest_rate
 * @param {number} number_of_months
 * @param {function(spv.ds.Loan)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionSetLoan = function(
		session_id,
		down_payment,
		interest_rate,
		number_of_months,
		on_success,
		on_failure)
{
	/** @param {Object} loan_obj */
	var on_protocol_success = function(loan_obj)
	{
		var loan = spv.ds.impl.IPPCommon.convertToLoan(loan_obj);
		on_success(loan);
	};
	this._impl.loan_set_loan_paramters(
			session_id,
			down_payment,
			interest_rate,
			number_of_months,
			on_protocol_success,
			on_failure);
};


/**
 * @param {string} session_id
 * @param {function(spv.ds.Loan)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionGetLoan = function(
			session_id,
			on_success,
			on_failure)
{
	/** @param {Object} loan_obj */
	var on_protocol_success = function(loan_obj)
	{
		var loan = spv.ds.impl.IPPCommon.convertToLoan(loan_obj);
		on_success(loan);
	};
	this._impl.loan_get_current_loan(
			session_id,
			on_protocol_success,
			on_failure);
};



/**
 * @param {string} session_id
 * @param {function(spv.ds.Loan)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionResetLoan = function(
		session_id,
		on_success,
		on_failure)
{
	/** @param {Object} loan_obj */
	var on_protocol_success = function(loan_obj)
	{
		var loan = spv.ds.impl.IPPCommon.convertToLoan(loan_obj);
		on_success(loan);
	};
	this._impl.loan_reset(
		session_id,
		on_protocol_success,
		on_failure);
};




/**
 * @param {string} session_id
 * @param {string} customer_first_name
 * @param {string} customer_surname
 * @param {string} customer_email
 * @param {string} customer_phone
 * @param {string} preferred_contact_time
 * @param {string} preferred_contact_media
 * @param {boolean} want_newsletter
 * @param {boolean} want_summary_pdf
 * @param {string} retailer_id
 * @param {string} mail_link_url
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionSendMailToCustomerAndRetailer = function(
		session_id,
		customer_first_name,
		customer_surname,
		customer_email,
		customer_phone,
		preferred_contact_time,
		preferred_contact_media,
		want_newsletter,
		want_summary_pdf,
		retailer_id,
		mail_link_url,
		on_success,
		on_failure )
{
	/** @type {function(spv.vds.impl.RawMailRequestResult)} */
	var on_backend_response = function( mail_request_result )
	{
		var code = spv.vds.ipprot.boosterconfig.RESULT_CODE;
		var mail_code = spv.vds.ipprot.volvoboosterweb.MAIL_REQUEST_CODE;
		if( mail_request_result.result_code != code.SUCCESS )
		{
			on_failure( new Error( mail_request_result.result_code ) );
			return;
		}
		if( mail_request_result.retailer_mail_status_code == mail_code.FAILURE )
		{
			on_failure( new Error( "RETAILER " +
				mail_request_result.retailer_mail_status_code ) );
			return
		}
		if( mail_request_result.customer_mail_status_code == mail_code.FAILURE )
		{
			on_failure( new Error( "CUSTOMER " + 
				mail_request_result.customer_mail_status_code ) );
			return;
		}
		on_success()
	}
	this._impl.vret_send_customer_and_retailer_mail(
		session_id,
		customer_first_name,
		customer_surname,
		customer_email,
		customer_phone,
		preferred_contact_time,
		preferred_contact_media,
		want_newsletter,
		want_summary_pdf,
		retailer_id,
		mail_link_url,
		on_backend_response,
		on_failure );
};

/**
 * @param {string} session_id
 * @param {string} customer_first_name
 * @param {string} customer_surname
 * @param {string} customer_email
 * @param {string} customer_phone
 * @param {string} retailer_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionSendToTacdis = function(
	session_id,
	customer_first_name,
	customer_surname,
	customer_email,
	customer_phone,
	retailer_id,
	on_success,
	on_failure)
{
	var on_backend_response = function( tacdis_result )
	{
		if( !tacdis_result.success )
		{
			on_failure( new Error( "send_to_tacdis failed." ) );
			return;
		}
		on_success()
	}
	this._impl.send_to_tacdis(
		session_id,
		customer_first_name,
		customer_surname,
		customer_email,
		customer_phone,
		retailer_id,
		on_backend_response,
		on_failure);
};


/**
 * @param {string} session_id
 * @param {string} customer_email
 * @param {boolean} want_newsletter
 * @param {boolean} want_summary_pdf
 * @param {string} mail_link_url
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionSendMailToCustomer = function(
		session_id,
		customer_email,
		want_newsletter,
		want_summary_pdf,
		mail_link_url,
		on_success,
		on_failure )
{
		/** @type {function(spv.vds.impl.RawMailRequestResult)} */
		var on_backend_response = function( mail_request_result )
		{
			var code = spv.vds.ipprot.boosterconfig.RESULT_CODE;
			var mail_code = spv.vds.ipprot.volvoboosterweb.MAIL_REQUEST_CODE;
			if( mail_request_result.result_code != code.SUCCESS )
			{
				on_failure( new Error( mail_request_result.result_code ) );
				return;
			}
			if( mail_request_result.retailer_mail_status_code == mail_code.FAILURE )
			{
				on_failure( new Error( "RETAILER " +
					mail_request_result.retailer_mail_status_code ) );
				return
			}
			if( mail_request_result.customer_mail_status_code == mail_code.FAILURE )
			{
				on_failure( new Error( "CUSTOMER " + 
					mail_request_result.customer_mail_status_code ) );
				return;
			}
			on_success()
		}
		this._impl.vret_send_customer_mail(
			session_id,
			customer_email,
			want_newsletter,
			want_summary_pdf,
			mail_link_url,
			on_backend_response,
			on_failure);
};



/**
 * @param {string} session_id
 * @param {string} business_group_retailer_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionSetRetailerBusinessGroup = function (
    session_id,
    business_group_retailer_id,
    on_success,
    on_failure) {
    throw new Error("Not supported in legacy backend.");
};


/**
 * @param {string} session_id
 * @param {string} template_name
 * @param {string} retailer_id
 * @param {function(string)} on_success
 * @param {function(Error)} on_failure
 */
spv.vds.impl.IPPAdaptor.prototype.sessionGenerateRetailerHtmlForPdf = function(
	session_id,
	template_name,
	retailer_id,
	on_success,
	on_failure)
{
	throw new Error("Not supported in legacy backend.");
};