ias
Version:
A node client to interface with IAS soap web services
228 lines (182 loc) • 6.22 kB
JavaScript
/*
This module take xml2js data and normalizes it into well formed data
*/
var _ = require('lodash');
var debug = require('debug')('ias');
var normalize = module.exports = {};
/**
* Converts the xml2js IAS RateType (product) to a simple object while stripping the : from the keys
* @param p {object} - the xml2js version of a ratetype (product)
*/
function scrubber(p) {
var ret = {};
_.each(p, function(v, k) {
ret[k.replace('a:','')] = typeof v[0] === 'string' ? v[0] : '';
});
return ret;
}
/**
* extract the GetRates products from the xml2js soap response
* @params soapEnvelopeJs {object} - soap xml converted to js via xml2js
*/
function extractProducts(soapEnvelopeJs) {
var productsRaw = [];
var normalizedProducts = [];
try {
productsRaw = soapEnvelopeJs['s:Envelope']['s:Body'][0].GetRatesResponse[0].GetRatesResult[0]['a:Rates'][0]['a:Common.RateType'];
} catch (ex) {
return null;
}
productsRaw.forEach(function(v) {
var p = scrubber(v);
normalizedProducts.push(p);
});
return normalizedProducts;
}
function extractFormFields(soapEnvelopeJs) {
var result = {};
try {
var forms = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.GetElectronicContractFormFieldsResponse[0]
.GetElectronicContractFormFieldsResult[0]['a:FormFieldsListings'][0]['a:IElectronicProcessing.FormFieldsListingType'];
forms.forEach(function(v, k) {
var name = v['a:FormName'][0];
var fields = v['a:FormFields'][0]['a:IElectronicProcessing.FormFieldType'];
result[name] = {};
fields.forEach(function(v) {
var fieldName = v['a:Name'][0];
var required = v['a:IsRequired'][0];
result[name][fieldName] = required === 'true';
});
});
} catch (ex) {
result = null;
}
return result;
}
function extractContracts(soapEnvelopeJs) {
var result = {contractFiles: []};
try {
var forms = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.GenerateElectronicContractResponse[0]
.GenerateElectronicContractResult[0]
['a:ElectronicContracts'][0];
if (typeof forms['a:IElectronicProcessing.PendingElectronicContractType'] !== 'undefined') {
forms['a:IElectronicProcessing.PendingElectronicContractType'].forEach(function(v, k) {
var pdfData = v['a:PDFData'][0];
var name = v['a:PDFFileName'][0];
var contractId = v['a:PendingElectronicContractID'][0];
var form = name.split('.')[4];
result.contractFiles.push({name: name, data: pdfData, contractId: contractId, form: form});
});
}
} catch (ex) {
// console.log(ex);
result = null;
}
return result;
}
function extractGetElectronicContractFormSignatureLocations(soapEnvelopeJs) {
var result = {};
try {
var forms = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.GetElectronicContractFormSignatureLocationsResponse[0]
.GetElectronicContractFormSignatureLocationsResult[0]
['a:FormSignatureLocations'][0]
['a:IElectronicProcessing.FormSignatureLocationType'];
forms.forEach(function(v, k) {
var name = v['a:Form'][0];
var locations = {
buyerSignature: {top:-1, right: -1, bottom: -1, left: -1}
, dealerSignature: {top:-1, right: -1, bottom: -1, left: -1}
, cobuyerSignature: {top:-1, right: -1, bottom: -1, left: -1}
};
var tokens = ['a:BuyerSignature', 'a:DealerSignature','a:CobuyerSignature'];
var locs = ['Top','Right','Bottom','Left'];
_.each(tokens, function(prefix) {
_.each(locs, function(pos) {
var prop = _.camelCase(prefix.replace('a:',''));
// if (locations[prop][pos.toLowerCase()] !== undefined) {
locations[prop][pos.toLowerCase()] = parseInt(v[prefix + pos][0]);
// }
});
});
result[name] = locations;
});
} catch (ex) {
debug(ex);
result = null;
}
return result;
}
function extractConfirmElectronicSignatures(soapEnvelopeJs) {
var result = {success: false};
try {
var data = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.ConfirmElectronicSignaturesResponse[0]
.ConfirmElectronicSignaturesResult[0];
if (data['a:ErrorOccurred'][0] == 'false') {
result.success = true;
}
} catch (ex) {
// console.log(ex);
result = null;
}
return result;
}
function extractGetPendingElectronicContracts(soapEnvelopeJs) {
var result = {contractFiles: []};
try {
var forms = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.GetPendingElectronicContractsResponse[0]
.GetPendingElectronicContractsResult[0]
['a:ElectronicContracts'][0]
['a:IElectronicProcessing.PendingElectronicContractType'];
forms.forEach(function(v, k) {
var pdfData = v['a:PDFData'][0];
var name = v['a:PDFFileName'][0];
var contractId = v['a:PendingElectronicContractID'][0];
var dealNumber = v['a:DealNumber'][0];
result.contractFiles.push({name: name, data: pdfData, contractId: contractId, dealNumber: dealNumber});
});
} catch (ex) {
// console.log(ex);
result = null;
}
return result;
}
function extractGenerateElectronicRemittanceBatch(soapEnvelopeJs) {
var result = {batches: []};
try {
var data = soapEnvelopeJs['s:Envelope']['s:Body'][0]
.GenerateElectronicRemittanceBatchResponse[0]
.GenerateElectronicRemittanceBatchResult[0];
if (data['a:ErrorInfo'][0]['a:ErrorOccurred'][0] === 'false') {
result.success = true;
} else {
result.success = false;
result.message = data['a:ErrorInfo'][0]['a:ErrorDescription'][0]
}
var batches = data
['a:BatchHeaders'][0]
['a:IElectronicProcessing.ElectronicBatchHeaderType'];
batches.forEach(function(v) {
result.batches.push(scrubber(v));
});
if (data['a:RemittanceRegisterPDF']) {
result.pdf = data['a:RemittanceRegisterPDF'][0];
}
} catch (ex) {
result = {
success: false, message: ex.toString()
};
}
return result;
}
normalize.GetRates = extractProducts;
normalize.GetElectronicContractFormFields = extractFormFields;
normalize.GenerateElectronicContract = extractContracts;
normalize.GetElectronicContractFormSignatureLocations = extractGetElectronicContractFormSignatureLocations;
normalize.ConfirmElectronicSignatures = extractConfirmElectronicSignatures;
normalize.GetPendingElectronicContracts = extractGetPendingElectronicContracts;
normalize.GenerateElectronicRemittanceBatch = extractGenerateElectronicRemittanceBatch;