import("system.translate");
import("system.neon");
/**
* provides methods for interactions with keywords
*/
function KeywordUtils(){
/**
* returns the default case for keyword-arrays (id and translated name)
* @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
* @return {Array} a 2D array in form of [["id1", "name1"], ["idN", "nameN"]]
* @example
* var kwdUtils, items;
*
* kwdUtils = new KeywordUtils();
* items = kwdUtils.getStandardArray("ADDRESS.TYPE");
* result.object(items);
*/
this.getStandardArray = function(keywordType){
return this.createKeyword(keywordType).toArray(["id", "name"]);
}
/**
* returns a specific name (translated) - this is normally the view-value - of a given keyword;
* <br/>if the key could not be found an empty string "" is returned
* @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
* @param {String} key id value of the keyword where the view-value shall be searched
* @return {String} representation of the translated name of the keyword-key
* @example
* var kwdUtils, histMedium;
* histMedium = vars.get("$field.MEDIUM");
* if (histMedium){
* kwdUtils = new KeywordUtils();
* result.string(vars.get("$field.SUBJECT") + " (" + kwdUtils.getViewValue("HISTORY.MEDIUM", histMedium) + ")");
* }
*/
this.getViewValue = function(keywordType, key){
var k = this.createKeyword(keywordType);
return k.getPropForKey(key, "name") || "";
}
/**
* creates an object with methods for interacting with an specific keyword
* @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
* @return {Object} object with the following methods:
* <br/>- toArray
* <br/>- getPropForKey
* <br/>- getPropsForKey
* <br/>- filter
*/
this.createKeyword = function(keywordType){//TODO: rename ot createKeywordObj?
var valueContainer, _toArrayFn, _getPropForKeyFn, _getPropsForKeyFn;
switch (keywordType){
case "RELATION.STATUS":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Inactive"))
,createKeywordEntry("1", translate.text("Active"))
,createKeywordEntry("2", translate.text("In review"))
]);
break;
case "COUNTRY":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("DE", translate.text("Germany"))
,createKeywordEntry("AT", translate.text("Austria"))
,createKeywordEntry("CH", translate.text("Switzerland"))
,createKeywordEntry("GB", translate.text("United Kingdom"))
,createKeywordEntry("NO", translate.text("Norway"))
]);
break;
case "LANGUAGE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("de", translate.text("German"))
,createKeywordEntry("de-DE", translate.text("German (Germany)"))
,createKeywordEntry("de-AT", translate.text("German (Austria)"))
,createKeywordEntry("en", translate.text("English"))
,createKeywordEntry("en-GB", translate.text("English (United Kingdom)"))
,createKeywordEntry("no-NO", translate.text("Norwegian"))
]);
break;
case "HISTORY.DIRECTION":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("i", translate.text("Incoming"))
,createKeywordEntry("o", translate.text("Outgoing"))
]);
break;
case "HISTORY.MEDIUM":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Visit"))
,createKeywordEntry("1", translate.text("E-Mail"))
,createKeywordEntry("2", translate.text("Phone"))
,createKeywordEntry("3", translate.text("Internal"))
,createKeywordEntry("4", translate.text("Online-Meeting"))
]);
case "COMM.MEDIUM":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Mobile"), null, {category: "PHONE", contentType: "TELEPHONE"})
,createKeywordEntry("1", translate.text("E-Mail"), null, {category: "EMAIL", contentType: "EMAIL"})
,createKeywordEntry("2", translate.text("Phone"), null, {category: "PHONE", contentType: "TELEPHONE"})
,createKeywordEntry("3", translate.text("Internet"), null, {category: "OTHER", contentType: "LINK"})
]);
break;
case "ADDRESS.TYPE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Office address"))
,createKeywordEntry("2", translate.text("Home address"))
,createKeywordEntry("3", translate.text("Delivery address"))
,createKeywordEntry("4", translate.text("Post office box"))
]);
break;
case "ORG.TYPE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Customer"))
,createKeywordEntry("1", translate.text("Prospect"))
,createKeywordEntry("2", translate.text("Supplier"))
,createKeywordEntry("3", translate.text("${ORGTYPE_OTHER}"))
]);
break;
case "PERS.GENDER":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("f", translate.text("Female"))
,createKeywordEntry("m", translate.text("Male"))
,createKeywordEntry("o", translate.text("${GENDER_OTHER}"))
]);
break;
case "CONTRACT.CONTRACTTYPE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Framework contract"))
,createKeywordEntry("1", translate.text("Service contract"))
,createKeywordEntry("2", translate.text("Maintenance contract"))
]);
break;
case "CONTRACT.CONTRACTSTATUS":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Valid, unlimited"))
,createKeywordEntry("1", translate.text("Valid, limited"))
,createKeywordEntry("2", translate.text("Not signed yet"))
,createKeywordEntry("3", translate.text("None, individual count"))
,createKeywordEntry("4", translate.text("Cancelled"))
]);
break;
case "CONTRACT.PAYMENT":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("0", translate.text("Annually"))
,createKeywordEntry("1", translate.text("Semiannually"))
,createKeywordEntry("2", translate.text("Quarterly"))
]);
break;
case "GROUPCODE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Commodity group 1"))
,createKeywordEntry("2", translate.text("Commodity group 2"))
,createKeywordEntry("3", translate.text("Commodity group 3"))
,createKeywordEntry("4", translate.text("Discount"))
,createKeywordEntry("5", translate.text("Spare parts"))
,createKeywordEntry("6", translate.text("Service"))
]);
break;
case "UNIT":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Pieces"))
,createKeywordEntry("2", translate.text("Kgs"))
,createKeywordEntry("3", translate.text("Liter"))
,createKeywordEntry("4", translate.text("Hours"))
]);
break;
case "PRICELIST":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("${PRICELIST_DEFAULT}"))
,createKeywordEntry("2", translate.text("Key account"))
,createKeywordEntry("3", translate.text("Special price list1"))
,createKeywordEntry("4", translate.text("${PRICELIST_SERVICE}"))
]);
break;
case "CURRENCY":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("EUR"))
,createKeywordEntry("2", translate.text("USD"))
,createKeywordEntry("3", translate.text("CND"))
,createKeywordEntry("4", translate.text("CHF"))
]);
break;
case "STOCK.WAREHOUSE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Warehouse 1"))
,createKeywordEntry("2", translate.text("Warehouse 2"))
,createKeywordEntry("3", translate.text("Warehouse 3"))
]);
break;
case "SALESPROJECT.ESTIMATION":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Project_volume sufficient"))
,createKeywordEntry("2", translate.text("Project_budget available"))
,createKeywordEntry("3", translate.text("Project_specifications available"))
,createKeywordEntry("4", translate.text("Project_timeframe critical"))
,createKeywordEntry("5", translate.text("Project_payment default/penalty critical"))
,createKeywordEntry("6", translate.text("Project_references available"))
,createKeywordEntry("7", translate.text("Product_requirements suitable"))
,createKeywordEntry("8", translate.text("Product_philosophy fitting"))
,createKeywordEntry("9", translate.text("Product_industry template available"))
,createKeywordEntry("10", translate.text("Other_sympathy available"))
,createKeywordEntry("11", translate.text("Other_advocate available"))
]);
break;
case "SALESPROJECT.SOURCE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Own website"))
,createKeywordEntry("2", translate.text("Customer recommendation"))
,createKeywordEntry("3", translate.text("Address purchase"))
,createKeywordEntry("4", translate.text("Fair"))
,createKeywordEntry("5", translate.text("IBau"))
]);
break;
case "SALESPROJECT.STATE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Open"))
,createKeywordEntry("2", translate.text("Postponed"))
,createKeywordEntry("3", translate.text("Aborted"))
,createKeywordEntry("4", translate.text("Partial order"))
,createKeywordEntry("5", translate.text("Order"))
,createKeywordEntry("6", translate.text("Lost"))
]);
break;
case "SALESPROJECT.PHASE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("9", translate.text("Project decision"))
,createKeywordEntry("8", translate.text("Negotiation"))
,createKeywordEntry("7", translate.text("Workshop"))
,createKeywordEntry("6", translate.text("Presentation follow-up"))
,createKeywordEntry("5", translate.text("Presentation preparation"))
,createKeywordEntry("4", translate.text("Deliver opinion"))
,createKeywordEntry("3", translate.text("Specifications in progress"))
,createKeywordEntry("2", translate.text("Waiting for requirements"))
,createKeywordEntry("1", translate.text("Lead"))
]);
break;
case "SALESPROJECT.WONLOST":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Project_volume"))
,createKeywordEntry("2", translate.text("Project_duration"))
,createKeywordEntry("3", translate.text("Project_reference"))
,createKeywordEntry("4", translate.text("Product_technic"))
,createKeywordEntry("5", translate.text("Product_flexibility"))
,createKeywordEntry("6", translate.text("Product_GuI"))
,createKeywordEntry("7", translate.text("Product_functionality"))
,createKeywordEntry("8", translate.text("Product_industry knowhow"))
,createKeywordEntry("9", translate.text("Product_mobile use"))
,createKeywordEntry("10", translate.text("Company_size"))
,createKeywordEntry("11", translate.text("Company_internationality"))
,createKeywordEntry("12", translate.text("Company_industry knowhow"))
,createKeywordEntry("13", translate.text("Other_existing Customer"))
,createKeywordEntry("14", translate.text("Other_unknown"))
]);
break;
case "SALESPROJECT.ROLE":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Project manager"))
,createKeywordEntry("2", translate.text("Project assistant"))
,createKeywordEntry("3", translate.text("Adviser"))
,createKeywordEntry("4", translate.text("Decision maker"))
,createKeywordEntry("5", translate.text("Sales AD"))
,createKeywordEntry("6", translate.text("Sales ID"))
]);
break;
case "OFFER.PROBABILITY":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("0 %"), null, {percentValue: 0})
,createKeywordEntry("2", translate.text("25 %"), null, {percentValue: 25})
,createKeywordEntry("3", translate.text("50 %"), null, {percentValue: 50})
,createKeywordEntry("4", translate.text("75 %"), null, {percentValue: 75})
,createKeywordEntry("5", translate.text("100 %"), null, {percentValue: 100})
]);
break;
case "OFFER.STATUS":
valueContainer = createKeywordEntriesContainer([
createKeywordEntry("1", translate.text("Checked"))
,createKeywordEntry("2", translate.text("Sent"))
,createKeywordEntry("3", translate.text("Won"))
,createKeywordEntry("4", translate.text("Lost"))
]);
break;
default:
throw new Error(translate.withArguments("[%0]the given keyword \"%1\" has no match with the possible keywordlist", [
arguments.callee.name, keywordType
]));
break;
}
_getPropForKeyFn = function(key, field, isCustom) {
var keyObject;
if (isCustom)
keyObject = valueContainer[key]["customProperties"];
else
keyObject = valueContainer[key];
if (keyObject == undefined)
return undefined;
return keyObject[field];
};
_getPropsForKeyFn = function(key, fields) {
var keyObject, i, l, currentRow, currentField;
keyObject = valueContainer[key];
if (keyObject == undefined)
return [];//TODO: throw error instead?
l = fields.length;
currentRow = [];
for (i = 0; i < l; i++){
currentField = fields[i];
//check if the passed fieldnames match the existing fieldnames (<=> properties in the object)
//to prevent errors and unexpected behaviour
if (keyObject[currentField])
currentRow.push(keyObject[currentField]);
else
currentRow.push("");
}
return currentRow;
};
_toArrayFn = function(fields){
var res, id, currentRow;
res = [];
if (!fields)
fields = ["id", "name"];
else if (typeof(fields) == "string"){
for (id in valueContainer){
res.push(_getPropForKeyFn(id, fields));
}
return res;
}
for (id in valueContainer){
currentRow = _getPropsForKeyFn(id, fields);
res.push(currentRow);
}
return res;
};
return {
/**
* toArray
*/
toArray: _toArrayFn
,getPropForKey: _getPropForKeyFn
,getPropsForKey: _getPropsForKeyFn
,filter: function (callbackFn, thisArg){
for (id in valueContainer){
if (false == callbackFn.call(thisArg, valueContainer[id].id, valueContainer[id].name, valueContainer[id].customProperties,
valueContainer[id], valueContainer)){
delete valueContainer[id];
}
}
return this;
}
};
};
/**
* internal function for creating an object that represents a keyword entry
* @param {String} id represents the key of an entry; a KeywordEntriesContainer can contain the same key only once
* @param {String} name represents the translated name of an entry; this is in most cases the view-value
* @param {String} [description=""] description text for describing the keyword
* @param {Object} [customProperties=null] an Object with additional properties; these can be virtually anything
* @return {Object} object that represents a single keyword entry; normally severel entries are cumulated in a "keywordEntriesContainer"
*/
function createKeywordEntry(id, name, description, customProperties){
//TODO: verify if mandatory-checks are really that usefull or can at least be made easier
if (!id)
throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
"id", arguments.callee.name
]));
if (!name)
throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
"name", arguments.callee.name
]));
return {
id: id
,name: name
,description: description || ""
,customProperties: customProperties
};
}
/**
* internal function for creating an object that represents a container of several keywordEntries
* @param {Array} keywordEntries an Array of keywordEntry-objects (as they are created by "createKeywordEntry"
* @return {Object} object that contains several keywordEntries
*/
function createKeywordEntriesContainer(keywordEntries){
var res, i, l, id;
res = {};
for (i = 0, l = keywordEntries.length; i < l; i++){
id = keywordEntries[i].id;
if (res[id] != undefined){
throw new Error("the given id is not unique since it already exists");
}
res[id] = keywordEntries[i];
}
return res;
}
}