Jira Code: DI-34
Written a Suitelet that list the Project created and also Suitelet that displays the Sales Report . Also set values for excel download.
Set filter in index page and profitability project report page.
Cost Section:
Once the user selects a project the corresponding project item list id is used to fetch the items and the budget. Once this is fetched, the Purchase order , Purchase order amount , Bill amount and most real price are fetched for the corresponding project item list id. The values are then listed in UI which also includes the sum of amount
Revenue section:
The project id is used directly to fetch all the details. Once the user selects a project , the project is used to fetch the Sales order, Invoice, items and the invoice amount.
Once the Cost and Revenue section values are obtained then the section above cost and revenue are populated by calculation of sum of values obtained from the values Cost and Revenue.
Suitelet For UI Creation
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description
*
*/
/*******************************************************************************
* Desali Tech | DES- | Script To display the Profitability Report
* **************************************************************************
* Author: Jobin & Jismi IT Services LLP
*
* Date Created : 26 June 2019
*
* REVISION HISTORY
*/
define(['N/ui/serverWidget', 'N/search', 'N/record', 'N/file', "N/render", "N/encode"],
function(serverWidget, search, record, file, render, encode) {
var main = {
// check whether a parameter contains value
checkForParameter: function(parameter, parameterName) {
if (parameter != "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== 'false' && parameter != " ")
return true;
else {
if (parameterName)
log.debug('Empty Value found', 'Empty Value for parameter ' + parameterName);
return false;
}
},
//
onRequest: function(context) {
try {
if (context.request.method == 'GET') {
var prjoectId = context.request.parameters.prjoectId;
var prjoectName = context.request.parameters.prjoectName;
var mode = context.request.parameters.mode;
var dwnldmode = context.request.parameters.dwnldmode;
var fromDate1 = context.request.parameters.fromDate;
var toDate1 = context.request.parameters.toDate;
log.debug("fromDate1", fromDate1);
log.debug("toDate1", toDate1)
var fromDate = decodeURIComponent(fromDate1);
var toDate = decodeURIComponent(toDate1);
fromDate = fromDate.toString();
toDate = toDate.toString();
if (mode == 'change' || mode == 'CHANGE') {
var costObj = main.fetchCostDetails(prjoectId, fromDate, toDate);
var revenueObj = main.fetchRevenueDetails(prjoectId, fromDate, toDate);
} else {
var costObj = main.fetchCostDetails(prjoectId);
var revenueObj = main.fetchRevenueDetails(prjoectId);
}
revenueObj.prjoectId = prjoectId;
revenueObj.prjoectName = prjoectName;
revenueObj.fromDate = fromDate1;
revenueObj.toDate = toDate1;
costObj.amountPO_total = main.assigndefault_value((costObj.amountPO_total ? costObj.amountPO_total : 0).toFixed(2));
costObj.amountBill_total = main.assigndefault_value((costObj.amountBill_total ? costObj.amountBill_total : 0).toFixed(2));
costObj.mostRealPrice_total = main.assigndefault_value((costObj.mostRealPrice_total ? costObj.mostRealPrice_total : 0).toFixed(2));
costObj.POvBudget_total = main.assigndefault_value((costObj.POvBudget_total ? costObj.POvBudget_total : 0).toFixed(2));
costObj.billvPO_total = main.assigndefault_value((costObj.billvPO_total ? costObj.billvPO_total : 0).toFixed(2));
costObj.billvBudget_total = main.assigndefault_value((costObj.billvBudget_total ? costObj.billvBudget_total : 0).toFixed(2));
revenueObj.revenueTotal = main.assigndefault_value((revenueObj.revenueTotal ? revenueObj.revenueTotal : 0).toFixed(2));
costObj.budget_total = costObj.budget_total ? costObj.budget_total : 0;
costObj.PO_progression = main.assigndefault_value(Math.round(((costObj.amountPO_total ? costObj.amountPO_total : 0) / (costObj.budget_total ? costObj.budget_total : 0)) * 100));
revenueObj.budgetedProfit = main.assigndefault_value(((revenueObj.salesorder_total ? revenueObj.salesorder_total : 0) - (costObj.budget_total ? costObj.budget_total : 0)).toFixed(2));
revenueObj.actualProfit = main.assigndefault_value(((revenueObj.salesorder_total ? revenueObj.salesorder_total : 0) - (costObj.mostRealPrice_total ? costObj.mostRealPrice_total : 0)).toFixed(2));
revenueObj.budgetedMargin = main.assigndefault_value(Math.round((((revenueObj.salesorder_total ? revenueObj.salesorder_total : 0) - (costObj.budget_total ? costObj.budget_total : 0)) / (revenueObj.salesorder_total ? revenueObj.salesorder_total : 0)) * 100));
revenueObj.actualMargin = main.assigndefault_value(Math.round(((revenueObj.actualProfit ? revenueObj.actualProfit : 0) / (revenueObj.salesorder_total ? revenueObj.salesorder_total : 0)) * 100));
revenueObj.budgetedRevenue = ((revenueObj.salesorder_total ? revenueObj.salesorder_total : 0).toFixed(2));
revenueObj.invoiceprogression = main.assigndefault_value(Math.round(((revenueObj.revenueTotal ? revenueObj.revenueTotal : 0) / (revenueObj.salesorder_total ? revenueObj.salesorder_total : 0)) * 100));
log.debug("costObj.Expense_amtlist", costObj.Expense_amtlist);
log.debug("revenueObj", revenueObj);
if (dwnldmode == 'download') {
var xml_to_print = main.getXMLDataExcel(costObj, revenueObj)
/*log.debug("entereddownload");*/
var strXmlEncoded = encode.convert({
string: xml_to_print,
inputEncoding: encode.Encoding.UTF_8,
outputEncoding: encode.Encoding.BASE_64
});
var fileObj = file.create({
name: 'Profitability Report.xls',
fileType: file.Type.EXCEL,
contents: strXmlEncoded,
folder: '363'
});
context.response.writeFile(fileObj);
return;
}
var datahtml = file.load({ id: 4124 }).getContents();
var renderer = render.create();
renderer.templateContent = datahtml;
renderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: "costObj",
data: costObj
});
renderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: "revenueObj",
data: revenueObj
});
context.response.write(renderer.renderAsString());
}
} catch (er) {
log.debug('err@onRequest', er);
}
},
// create form
getXMLDataExcel: function(c_results, r_results) {
try {
var limit;
var budget_sum = 0;
var po_sum = 0;
var billing_sum = 0;
var POvBudget_sum = 0;
var billvPO_sum = 0;
var billvBudget_sum = 0;
var inv_price = 0;
var cost = c_results.cost;
var revenue = r_results.revenue;
log.debug("c_results dnld", c_results);
log.debug("r_results dnld", r_results);
if (cost.length > revenue.length) {
limit = cost.length;
} else {
limit = revenue.length;
}
var XML = "";
var myXMLFile = file.load({
id: '4135'
});
/*log.debug('myXMLFile', myXMLFile)*/
var myXMLFile_value = myXMLFile.getContents();
if (limit > 0) {
var TABLE = "";
var TABLE1 = "";
/*log.debug("limit", limit);*/
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEHEAD -->', r_results.prjoectName);
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY1 -->', main.assigndefault_value(c_results.budget_total));
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY2 -->', main.assigndefault_value(c_results.PO_progression) + "%");
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY3 -->', main.assigndefault_value(r_results.budgetedProfit));
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY4 -->', main.assigndefault_value(r_results.actualProfit));
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY5 -->', main.assigndefault_value(r_results.salesProjected));
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY6 -->', main.assigndefault_value(r_results.budgetedMargin) + "%");
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY7 -->', main.assigndefault_value(r_results.actualMargin) + "%");
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY8 -->', main.assigndefault_value(r_results.budgetedRevenue));
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY9 -->', main.assigndefault_value(r_results.invoiceprogression) + "%");
for (var i = 0; i <= limit; i++) {
var strVar = "";
var str = "";
if (cost.length == i) {
strVar += "<Row ss:Height='13.8047'><Cell ss:Index='2' ss:StyleID='s110' ><Data ss:Type='String'>" + 'Total' + "</Data></Cell><Cell ss:StyleID='s108' />"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.budget_total + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.amountPO_total + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.amountBill_total + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.mostRealPrice_total + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.POvBudget_total + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.billvPO_total + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + c_results.billvBudget_total + "</Data></Cell>"
//strVar += "<\/Row>";
} else if (cost[i] != "" && cost[i] != null && cost[i] != undefined && cost[i] != '- None -' && cost[i] != " " && cost[i] != NaN && cost[i] != 'NaN') {
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s108'><Data ss:Type='String'>" + cost[i].document + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + cost[i].item + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].budget + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].amountPO + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].amountBill + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].mostRealPrice + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].POvBudget + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].billvPO + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + cost[i].billvBudget + "</Data></Cell>"
} else {
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
}
if (revenue.length == i) {
strVar += "<Cell ss:StyleID='s92' /><Cell ss:StyleID='s92' /><Cell ss:StyleID='s92'/>"
strVar += "<Cell ss:StyleID='s111'><Data ss:Type='Number'>" + r_results.revenueTotal + "</Data></Cell>"
strVar += "<\/Row>";
} else if (revenue[i] != "" && revenue[i] != null && revenue[i] != undefined && revenue[i] != '- None -' && revenue[i] != " " && revenue[i] != NaN && revenue[i] != 'NaN') {
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + revenue[i].document + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + revenue[i].invoice + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + revenue[i].item + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='Number'>" + revenue[i].invoicePrice + "</Data></Cell>"
strVar += "<\/Row>";
} else {
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<\/Row>";
}
// TABLE = TABLE + str; //totals
TABLE1 = TABLE1 + strVar;
}
/*log.debug("c_results.Expense_amtlist.length", c_results.Expense_amtlist.length);*/
// for (var i = 0; i < c_results.Expense_amtlist.length; i++) {
/**AJ MOD ON 22 July 2019**/
if (c_results.Expense_amtlist.length > 0) {
var expense = c_results.Expense_amtlist[0]['a']['expense'];
/*log.debug("expense dnld", expense);*/
var strVar = "";
// if (expense.length > 0) {
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s110'><Data ss:Type='String'>" + 'Items Added on Bill:' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<\/Row>";
TABLE1 = TABLE1 + strVar;
//}
for (var j = 0; j < expense.length; j++) {
var strVar = "";
/**AJ MOD ON 22 July 2019-- STARTS**/
if (expense[j] != "" && expense[j] != null && expense[j] != undefined && expense[j] != '- None -' && expense[j] != " " && expense[j] != NaN && expense[j] != 'NaN') {
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + main.escape_for_xml(expense[j].expense_cat) + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + expense[j].expense_amt + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='Number'>" + expense[j].expense_amt + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<\/Row>";
} else {
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s108'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<\/Row>";
}
TABLE1 = TABLE1 + strVar;
/**AJ MOD ON 22 July 2019-- ENDS**/
}
var strVar = "";
//expense_sum
strVar += "<Row ss:Height='13.8047'>"
strVar += "<Cell ss:Index='2' ss:StyleID='s110'><Data ss:Type='String'>" + 'Total ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='String'>" + '' + "</Data></Cell>"
log.debug("default", main.assigndefault_value(c_results.Expense_amtlist[0]['a']['expense_sum']))
log.debug("std", (c_results.Expense_amtlist[0]['a']['expense_sum']))
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + main.assigndefault_value(c_results.Expense_amtlist[0]['a']['expense_sum']) + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='Number'>" + main.assigndefault_value(c_results.Expense_amtlist[0]['a']['expense_sum']) + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='String'>" + '' + "</Data></Cell>"
strVar += "<Cell ss:MergeAcross='1' ss:StyleID='s110'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s110'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<Cell ss:StyleID='s92'><Data ss:Type='String'>" + ' ' + "</Data></Cell>"
strVar += "<\/Row>";
TABLE1 = TABLE1 + strVar;
// }
}
//myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLEBODY -->', TABLE);
myXMLFile_value = myXMLFile_value.replace('<!-- REPLACEWITHTABLE1 -->', TABLE1);
/* log.debug("myXMLFile_value1", myXMLFile_value);*/
}
return myXMLFile_value;
} catch (er) {
log.debug('err@createForm', er.message);
}
},
fetchCostDetails: function(prjoectId, fromDate, toDate) {
var costProjectId = null;
var Expense_amtlist = [];
var customrecord_jj_di2_pjct_item_listSearchObj = search.create({
type: "customrecord_jj_di2_pjct_item_list",
filters: [
["custrecord_jj_di2_projects", "anyof", prjoectId]
],
columns: [
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = customrecord_jj_di2_pjct_item_listSearchObj.runPaged().count;
log.debug("customrecord_jj_di2_pjct_item_listSearchObj result count", searchResultCount);
customrecord_jj_di2_pjct_item_listSearchObj.run().each(function(result) {
costProjectId = result.getValue(customrecord_jj_di2_pjct_item_listSearchObj.columns[0])
return true;
});
var cost_array = [];
var budget_total = 0;
var amountPO_total = 0;
var amountBill_total = 0;
var billvPO_total = 0;
var mostRealPrice_total = 0;
var POvBudget_total = 0;
var billvBudget_total = 0;
try {
if (costProjectId) {
var mappedObj = {};
var filters_all = [];
filters_all.push(["custrecord2", "anyof", costProjectId]);
if ((fromDate != "") && (fromDate != null) && (fromDate != undefined) && (toDate != "") && (toDate != null) && (toDate != undefined)) {
filters_all.push("AND");
filters_all.push(["created", "within", fromDate, toDate]);
/*log.debug("inn 2");*/
}
// item list search
var customrecord_jj_di2_item_listSearchObj = search.create({
type: "customrecord_jj_di2_item_list",
filters: filters_all,
columns: [
search.createColumn({ name: "custrecord_jj_di2_items", label: "Items" }),
search.createColumn({ name: "custrecord_jj_di_27_add_budget", label: "Budget" })
]
});
var searchResultCount = customrecord_jj_di2_item_listSearchObj.runPaged().count;
log.debug("customrecord_jj_di2_item_listSearchObj result counttest", searchResultCount);
/*var searchcount = 0;*/
customrecord_jj_di2_item_listSearchObj.run().each(function(result) {
var item = result.getValue(customrecord_jj_di2_item_listSearchObj.columns[0]);
var budget = parseFloat(result.getValue(customrecord_jj_di2_item_listSearchObj.columns[1]));
budget = isNaN(budget) ? 0 : budget;
if (main.checkForParameter(item)) {
// if unreal case (item - item list has one to one mapping)
if (mappedObj[item]) {
mappedObj[item]["budget"] += budget;
} else {
mappedObj[item] = {
item: result.getText(customrecord_jj_di2_item_listSearchObj.columns[0]),
budget: budget,
poDetails: []
};
}
}
return true;
});
filters_purchase = [];
filters_purchase.push(["type", "anyof", "PurchOrd"]);
filters_purchase.push("AND");
filters_purchase.push(["mainline", "is", "F"]);
filters_purchase.push("AND");
filters_purchase.push(["taxline", "is", "F"]);
filters_purchase.push("AND");
filters_purchase.push(["shipping", "is", "F"]);
filters_purchase.push("AND");
filters_purchase.push(["custbody_jj_di_27_relat_prj_itm_list", "anyof", costProjectId]);
if ((fromDate != "") && (fromDate != null) && (fromDate != undefined) && (toDate != "") && (toDate != null) && (toDate != undefined)) {
filters_purchase.push("AND");
filters_purchase.push(["trandate", "within", fromDate, toDate]);
}
log.debug("fromDate", fromDate);
log.debug("toDate", toDate);
var AmountBill = null;
var bill_id = null;
var MostRealPrice = null;
if ((fromDate) && (toDate)) {
AmountBill = "CASE WHEN {billingtransaction.status}!='Cancelled' AND ({billingtransaction.trandate} < TO_DATE('" + toDate + "','mm/dd/yyyy') AND {billingtransaction.trandate} > TO_DATE('" + fromDate + "','mm/dd/yyyy')) THEN {billingamount} ELSE 0 END"
bill_id = "CASE WHEN {billingtransaction.status}!='Cancelled' AND ({billingtransaction.trandate} < TO_DATE('" + toDate + "','mm/dd/yyyy') AND {billingtransaction.trandate} > TO_DATE('" + fromDate + "','mm/dd/yyyy')) THEN {billingtransaction.internalid} ELSE 0 END"
//billPo = "(CASE WHEN {billingtransaction.status}!='Cancelled' AND ({billingtransaction.trandate} < TO_DATE("+toDate+",'mm/dd/yyyy') AND {billingtransaction.trandate} > TO_DATE("+fromDate+",'mm/dd/yyyy')) THEN {billingtransaction.amount} ELSE 0 END) - {amount}"
/* MostRealPrice = "CASE WHEN (({billingtransaction.amount} !=0 OR {billingtransaction.status} !='Cancelled') AND ({billingtransaction.trandate} < TO_DATE(" + toString(toDate) + ",'dd/mm/yyyy') AND {billingtransaction.trandate} > TO_DATE(" + toString(fromDate) + ",'dd/mm/yyyy'))) THEN {billingtransaction.amount} ELSE {amount} END"*/
} else {
AmountBill = "CASE WHEN {billingtransaction.status}='Cancelled' THEN 0 ELSE {billingamount} END"
bill_id = "CASE WHEN {billingtransaction.status}='Cancelled' THEN 0 ELSE {billingtransaction.internalid} END"
/*billPo = "(CASE WHEN {billingtransaction.status}='Cancelled' THEN 0 ELSE {billingtransaction.amount} END) - {amount}"
MostRealPrice = "CASE WHEN ({billingtransaction.amount}=0 OR {billingtransaction.status}='Cancelled') THEN {amount} ELSE {billingtransaction.amount} END"*/
}
var purchaseorderSearchObj = search.create({
type: "purchaseorder",
filters: filters_purchase,
columns: [
search.createColumn({ name: "item", label: "Item" }),
search.createColumn({ name: "tranid", label: "Document (PO)" }),
search.createColumn({ name: "amount", label: "Amount (PO)" }),
search.createColumn({
name: "formulanumeric",
formula: AmountBill,
label: "Amount (Bill)"
}),
search.createColumn({
name: "formulacurrency",
formula: bill_id,
label: "Bill_id"
}),
/* search.createColumn({
name: "formulacurrency",
formula: MostRealPrice,
label: "Most Real Price"
}),*/
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({
name: "custrecord_jj_di_27_total_budget",
join: "CUSTBODY_JJ_DI_27_RELAT_PRJ_ITM_LIST",
label: "Total Budget"
}),
search.createColumn({ name: "amount", label: "Amount" }),
search.createColumn({
name: "internalid",
join: "billingTransaction",
label: "Internal ID"
})
]
});
var searchResultCount = purchaseorderSearchObj.runPaged().count;
log.debug("purchaseorderSearchObj result count", searchResultCount);
var cost_array = [];
var flag = 0;
var bill_idarray = [];
if (searchResultCount > 0) {
flag = 1;
purchaseorderSearchObj.run().each(function(result) {
/* var flag = false;*/
var item = result.getValue(purchaseorderSearchObj.columns[0])
for (var key in mappedObj) {
if (key == item) {
if (main.checkForParameter(item)) {
/* var mostReal_Price;*/
var expense_Id = result.getValue(purchaseorderSearchObj.columns[4]);
if (main.checkForParameter(expense_Id)) {
bill_idarray.push(expense_Id)
}
var amountPO = result.getValue(purchaseorderSearchObj.columns[2]);
var amountBill = result.getValue(purchaseorderSearchObj.columns[3]);
var billvPO = amountBill - amountPO;
/*mostRealPrice = result.getValue(purchaseorderSearchObj.columns[5]);*/
budget_total = budget_total + Number(mappedObj[key].budget);
amountPO_total = amountPO_total + Number(result.getValue(purchaseorderSearchObj.columns[2]));
amountBill_total = amountBill_total + Number(result.getValue(purchaseorderSearchObj.columns[3]));
billvPO_total = billvPO_total + billvPO;
mostReal_Price = Number(result.getValue(purchaseorderSearchObj.columns[3]));
if (mostReal_Price == 0) {
if (amountPO == 0) {
mostReal_Price = mappedObj[key].budget;
mostRealPrice_total = mostRealPrice_total + Number(mappedObj[key].budget);
} else {
mostReal_Price = amountPO;
mostRealPrice_total = mostRealPrice_total + Number(amountPO);
}
} else {
mostReal_Price = mostReal_Price;
mostRealPrice_total = mostRealPrice_total + Number(amountBill);
}
POvBudget_total = POvBudget_total + Number(parseFloat(amountPO - mappedObj[key].budget));
billvBudget_total = billvBudget_total + Number(parseFloat(amountBill - mappedObj[key].budget));
if (mappedObj[item]) {
mappedObj[item]["poDetails"].push({
item: result.getText(purchaseorderSearchObj.columns[0]),
document: result.getValue(purchaseorderSearchObj.columns[1]),
budget: Number(mappedObj[key].budget),
amountPO: Number(result.getValue(purchaseorderSearchObj.columns[2])),
amountBill: Number(result.getValue(purchaseorderSearchObj.columns[3])),
billvPO: billvPO,
mostRealPrice: mostReal_Price,
POvBudget: parseFloat(amountPO - mappedObj[key].budget),
billvBudget: parseFloat(amountBill - mappedObj[key].budget)
});
} else {
mappedObj[item]["poDetails"] = [{
item: result.getText(purchaseorderSearchObj.columns[0]),
budget: Number(mappedObj[key].budget),
document: result.getValue(purchaseorderSearchObj.columns[1]),
amountPO: Number(result.getValue(purchaseorderSearchObj.columns[2])),
amountBill: Number(result.getValue(purchaseorderSearchObj.columns[3])),
billvPO: billvPO,
mostRealPrice: mostReal_Price,
POvBudget: parseFloat(amountPO - mappedObj[key].budget),
billvBudget: parseFloat(amountBill - mappedObj[key].budget)
}];
}
}
}
}
return true;
});
}
log.debug("Flag1", flag);
log.debug("bill_idarray", bill_idarray);
//condition to check whether entered purchase order search then fetch corresponding values
if (flag == 1) {
if (main.checkForParameter(main.fetch_Expense(bill_idarray))) {
Expense_amtlist.push({ a: main.fetch_Expense(bill_idarray) });
} else {
Expense_amtlist = [];
}
for (var key in mappedObj) {
if (mappedObj[key].poDetails.length > 0) {
for (var i = 0; i < mappedObj[key].poDetails.length; i++) {
cost_array.push({
item: mappedObj[key].item,
budget: mappedObj[key].budget,
document: mappedObj[key].poDetails[i].document,
amountPO: mappedObj[key].poDetails[i].amountPO,
amountBill: mappedObj[key].poDetails[i].amountBill,
billvPO: mappedObj[key].poDetails[i].billvPO,
mostRealPrice: mappedObj[key].poDetails[i].mostRealPrice,
POvBudget: mappedObj[key].poDetails[i].POvBudget,
billvBudget: mappedObj[key].poDetails[i].billvBudget
});
}
} else {
budget_total = budget_total + Number(mappedObj[key].budget);
mostRealPrice_total = mostRealPrice_total + Number(mappedObj[key].budget);
cost_array.push({
item: mappedObj[key].item,
budget: mappedObj[key].budget,
document: "",
amountPO: "",
amountBill: "",
billvPO: "",
mostRealPrice: mappedObj[key].budget,
POvBudget: "",
billvBudget: ""
});
}
}
}
return {
cost: cost_array,
budget_total: budget_total,
amountPO_total: amountPO_total,
amountBill_total: amountBill_total,
billvPO_total: billvPO_total,
mostRealPrice_total: mostRealPrice_total,
POvBudget_total: POvBudget_total,
billvBudget_total: billvBudget_total,
Expense_amtlist: Expense_amtlist
};
} else { //not item project id present
var cost_array = [];
cost_array.push({
item: "",
document: "",
budget: "",
amountPO: "",
amountBill: "",
billvPO: "",
mostRealPrice: "",
POvBudget: "",
billvBudget: ""
})
return {
cost: cost_array,
budget_total: budget_total,
amountPO_total: amountPO_total,
amountBill_total: amountBill_total,
billvPO_total: billvPO_total,
mostRealPrice_total: mostRealPrice_total,
POvBudget_total: POvBudget_total,
billvBudget_total: billvBudget_total,
Expense_amtlist: Expense_amtlist
};
}
} catch (er) {
log.debug('err@fetchData', er.message)
}
},
fetchRevenueDetails: function(prjoectId, fromDate, toDate) {
try {
var salesObj = {};
var revenueArr = [];
var revenueTotal = 0;
var salesorder_total = 0;
// sales orders and bills search
log.debug('prjoectId99', prjoectId);
var salesProjected = main.fetchSalesprojected(prjoectId);
salesProjected = main.assigndefault_value(salesProjected.split('.')[0]);
var filter_salesord = [];
filter_salesord.push(["type", "anyof", "SalesOrd"]);
filter_salesord.push("AND");
filter_salesord.push(["custbody4", "anyof", prjoectId]);
filter_salesord.push("AND");
filter_salesord.push(["mainline", "is", "F"]);
filter_salesord.push("AND");
filter_salesord.push(["shipping", "is", "F"]);
filter_salesord.push("AND");
filter_salesord.push(["taxline", "is", "F"]);
/*filter_salesord.push("AND");
filter_salesord.push(["billingtransaction.number", "isnotempty", ""]);*/
if ((fromDate != "") && (fromDate != null) && (fromDate != undefined) && (toDate != "") && (toDate != null) && (toDate != undefined)) {
filter_salesord.push("AND");
filter_salesord.push(["trandate", "within", fromDate, toDate]);
}
var salesOrderRes = null;
/* if ((fromDate) && (toDate)) {
salesOrderRes = "CASE WHEN {billingtransaction.status}!='Cancelled' AND ({billingtransaction.trandate} < TO_DATE(" + toDate + ",'dd/mm/yyyy') AND {billingtransaction.trandate} > TO_DATE(" + fromDate + ",'dd/mm/yyyy')) THEN {billingtransaction.amount} ELSE 0 END"
} else {*/
if ((fromDate) && (toDate)) {
salesOrderRes = "CASE WHEN {billingtransaction.status} !='Cancelled' AND ({billingtransaction.trandate} < TO_DATE('" + toDate + "','dd/mm/yyyy') AND {billingtransaction.trandate} > TO_DATE('" + fromDate + "','dd/mm/yyyy')) THEN {billingtransaction.amount} ELSE 0 END"
} else {
salesOrderRes = "CASE WHEN {billingtransaction.status}='Cancelled' THEN 0 ELSE {billingtransaction.amount} END"
}
//salesOrderRes = "CASE WHEN {billingtransaction.status}='Cancelled' THEN 0 ELSE {billingtransaction.amount} END"
//}
var salesorderSearchObj = search.create({
type: "salesorder",
filters: filter_salesord,
columns: [
search.createColumn({ name: "tranid", label: "Document (SO)" }),
search.createColumn({ name: "item", label: "Item" }),
search.createColumn({ name: "billingtransaction", label: "Document (Invoice)" }),
search.createColumn({
name: "formulacurrency",
formula: "{billingtransaction.amount}",
label: "Amount (Invoice)"
}),
search.createColumn({
name: "internalid",
join: "billingTransaction",
label: "Internal ID (Invoice)"
}),
search.createColumn({name: "total", label: "Amount (Transaction Total)"}),
search.createColumn({
name: "formulacurrency",
formula: salesOrderRes,
label: "Formula (Currency)"
}),
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({ name: "memo", label: "Memo" })
]
});
var searchResultCount = salesorderSearchObj.runPaged().count;
log.debug("salesorderSearchObj result count", searchResultCount);
if(searchResultCount>0){
salesorderSearchObj.run().each(function(result) {
var salesOrder = result.getValue(salesorderSearchObj.columns[0]);
var item = result.getValue(salesorderSearchObj.columns[1]);
var internalid = result.getValue(salesorderSearchObj.columns[7]);
if (main.checkForParameter(item)) {
revenueTotal = revenueTotal + Number(result.getValue(salesorderSearchObj.columns[3]));
salesorder_total = Number(result.getValue(salesorderSearchObj.columns[5]));
revenueArr.push({
document: result.getValue(salesorderSearchObj.columns[0]),
item: result.getValue(salesorderSearchObj.columns[8]),
invoice: result.getText(salesorderSearchObj.columns[2]),
invoicePrice: result.getValue(salesorderSearchObj.columns[3]),
})
}
return true;
});
}
return { revenue: revenueArr, revenueTotal: revenueTotal, salesorder_total: salesorder_total, salesProjected: salesProjected };
} catch (err) {
log.debug("err2", err)
}
},
/*******************************************************************
* Fix text
*
* @param argument
* @returns Created By JJ on 15-Nov-2017 4:30:21 PM
*/
escape_for_xml: function(argument) {
try {
if (argument != "" && argument != null) {
//var newString = xml.escape({
// xmlText : argument
//});
argument = argument.replace(/&/g, '&');
argument = argument.replace(/</g, '<');
argument = argument.replace(/>/g, '>');
argument = argument.replace(/"/g, '"');
argument = argument.replace(/'/g, ''');
return argument;
} else {
return "";
}
} catch (e) {
log.error({
title: e.name,
details: e.message
});
}
},
//function to fetch purchaseorder details
fetchSalesprojected: function(prjoectId) {
var sales_projected;
var jobSearchObj = search.create({
type: "job",
filters: [
["internalidnumber", "equalto", prjoectId]
],
columns: [
search.createColumn({ name: "custentity2", label: "Sales Projected Margin" }),
]
});
var jobSearchObjCount = jobSearchObj.runPaged().count;
jobSearchObj.run().each(function(result) {
sales_projected = result.getValue(jobSearchObj.columns[0]);
return true;
});
return sales_projected;
},
assigndefault_value: function(parameter) {
if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== 'false' && parameter !== " " && parameter !== Infinity) {
var parameter = main.isNaNisFinite(parameter);
return parameter;
} else {
parameter = 0;
return parameter;
}
},
isNaNisFinite: function(parameter) {
if (isNaN(parameter) == false && isFinite(parameter) == true) {
return parameter;
} else {
return 0;
}
},
// function to fetch the expense details for column items added on bill
fetch_Expense: function(expense_Id) {
var expense_array = [];
var expense_maparray = [];
var expense_sum = 0;
var expense = [];
var expense_sum = 0;
for (var i = 0; i < expense_Id.length; i++) {
var vendorbillSearchObj = search.create({
type: "vendorbill",
filters: [
["type", "anyof", "VendBill"],
"AND",
["internalid", "anyof", expense_Id[i]],
"AND",
["taxline", "is", "F"],
"AND",
["shipping", "is", "F"],
"AND",
["expensecategory.account", "noneof", "@NONE@"],
"AND",
["mainline", "is", "F"]
],
columns: [
search.createColumn({
name: "amount",
summary: "SUM",
label: "Amount"
}),
search.createColumn({
name: "account",
join: "expenseCategory",
summary: "GROUP",
label: "Account"
})
]
});
var expensesearch_count = vendorbillSearchObj.runPaged().count;
/*log.debug("expensesearch_count", expensesearch_count);*/
if (expensesearch_count > 0) {
vendorbillSearchObj.run().each(function(result) {
var expense_item = {};
/*if(main.checkForParameter(result.getText(vendorbillSearchObj.columns[1]))){*/
expense_sum = expense_sum + Number(result.getValue(vendorbillSearchObj.columns[0]));
expense_item.expense_cat = result.getText(vendorbillSearchObj.columns[1]);
expense_item.expense_cat_id = result.getValue(vendorbillSearchObj.columns[1]);
expense_item.expense_amt = result.getValue(vendorbillSearchObj.columns[0]) || 0;
var currentIndex = expense_maparray.indexOf(expense_item.expense_cat_id);
if (currentIndex > -1) {
expense_array[currentIndex]["expense_amt"] = parseFloat(expense_array[currentIndex]["expense_amt"]) + parseFloat(expense_item.expense_amt);
} else {
expense_maparray.push(expense_item.expense_cat_id);
expense_array.push(expense_item);
}
return true;
});
}
}
if (expense_array.length > 0) {
return { expense: expense_array, expense_sum: expense_sum };
} else {
return "";
}
}
}
return main;
});
Setting Suitelet data to for Excel Download
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Salman Samiul Haque</Author>
<LastAuthor>user</LastAuthor>
<Created>2019-04-30T15:18:28Z</Created>
<LastSaved>2019-07-09T04:37:02Z</LastSaved>
<Version>12.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>11760</WindowHeight>
<WindowWidth>20730</WindowWidth>
<WindowTopX>-120</WindowTopX>
<WindowTopY>-120</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="m79512896">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="m79512916">
<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="m79512936">
<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="m79512692">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="m79512712">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="m79512772">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s63">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s67">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s68">
<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s69">
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s70">
<Alignment ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s71">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s72">
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s73">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom" ss:WrapText="1"/>
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s80">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat ss:Format="Percent"/>
</Style>
<Style ss:ID="s81">
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat ss:Format="Percent"/>
</Style>
<Style ss:ID="s82">
<Alignment ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s83">
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s84">
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s85">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom" ss:WrapText="1"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s86">
<Borders>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FF0000"/>
<Interior ss:Color="#A9D08E" ss:Pattern="Solid"/>
<NumberFormat ss:Format="Percent"/>
</Style>
<Style ss:ID="s88">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s92">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s94">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s200">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<!-- <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> -->
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s98">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s105">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s106">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s107">
<Alignment ss:Horizontal="Center" ss:Vertical="Top" ss:WrapText="1"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s108">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s109">
<Alignment ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s110">
<Alignment ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#F4B084" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
<Style ss:ID="s111">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
<Interior ss:Color="#9BC2E6" ss:Pattern="Solid"/>
<NumberFormat
ss:Format="_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)"/>
</Style>
</Styles>
<Worksheet ss:Name="PPR Explanation (MRP Margin)">
<Table ss:ExpandedColumnCount="15" ss:ExpandedRowCount="1000000" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="98.25" ss:DefaultRowHeight="15">
<Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="120.75"/>
<Column ss:AutoFitWidth="0" ss:Width="210.75"/>
<Column ss:Width="99"/>
<Column ss:Width="103.5"/>
<Column ss:AutoFitWidth="0" ss:Width="213"/>
<Column ss:AutoFitWidth="0" ss:Width="119.25" ss:Span="1"/>
<Column ss:Index="9" ss:AutoFitWidth="0" ss:Width="124.5"/>
<Column ss:AutoFitWidth="0" ss:Width="85.5"/>
<Column ss:AutoFitWidth="0" ss:Width="142.5"/>
<Column ss:AutoFitWidth="0" ss:Width="101.25"/>
<Column ss:Width="291"/>
<Column ss:Width="63"/>
<Column ss:Width="127.5"/>
<Row ss:AutoFitHeight="0"/>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:MergeAcross="13" ss:StyleID="s63"><Data ss:Type="String"><!-- REPLACEWITHTABLEHEAD --></Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:StyleID="s67"><Data ss:Type="String">Budgeted Cost</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="Number"><!-- REPLACEWITHTABLEBODY1 --></Data></Cell>
<Cell ss:StyleID="s69"/>
<Cell ss:StyleID="s70"><Data ss:Type="String">Budgeted Profit</Data></Cell>
<Cell ss:StyleID="s71"><Data ss:Type="Number"><!-- REPLACEWITHTABLEBODY3 --></Data></Cell>
<Cell ss:StyleID="s72"/>
<Cell ss:StyleID="s73"><Data ss:Type="String">Sales </Data></Cell>
<Cell ss:MergeDown="1" ss:StyleID="m79512692"><Data ss:Type="Number"><!-- REPLACEWITHTABLEBODY5 --></Data></Cell>
<Cell ss:MergeDown="1" ss:StyleID="m79512712"/>
<Cell ss:StyleID="s70"><Data ss:Type="String">Budgeted Margin</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String"><!-- REPLACEWITHTABLEBODY6 --></Data></Cell>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s67"><Data ss:Type="String">Budgeted Revenue</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="Number"><!-- REPLACEWITHTABLEBODY8 --></Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:StyleID="s67"><Data ss:Type="String">PO progression</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String"><!-- REPLACEWITHTABLEBODY2 --></Data></Cell>
<Cell ss:StyleID="s69"/>
<Cell ss:StyleID="s82"><Data ss:Type="String">Actual Profit</Data></Cell>
<Cell ss:StyleID="s83"><Data ss:Type="Number"><!-- REPLACEWITHTABLEBODY4 --></Data></Cell>
<Cell ss:StyleID="s84"/>
<Cell ss:StyleID="s85"><Data ss:Type="String">Projected(%)</Data></Cell>
<Cell ss:Index="11" ss:StyleID="s82"><Data ss:Type="String">Actual Margin</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String"><!-- REPLACEWITHTABLEBODY7 --></Data></Cell>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s67"><Data ss:Type="String">Invoice progression</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String"><!-- REPLACEWITHTABLEBODY9 --></Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:MergeAcross="9" ss:StyleID="s88"><Data ss:Type="String">Cost</Data></Cell>
<!-- <Cell ss:StyleID="s92"/> -->
<Cell ss:MergeAcross="2" ss:StyleID="s94"><Data ss:Type="String">Revenue</Data></Cell>
<Cell ss:StyleID="s200"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:StyleID="s98"><Data ss:Type="String">Document</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">Item</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">Budgeted $</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">PO $</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">Billing $</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">Most Real Price</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">PO vs Budget</Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="m79512772"><Data ss:Type="String">Bill vs PO</Data></Cell>
<Cell ss:StyleID="s98"><Data ss:Type="String">Bill vs Budget</Data></Cell>
<Cell ss:StyleID="s105"><Data ss:Type="String">Document</Data></Cell>
<Cell ss:StyleID="s105"><Data ss:Type="String">Invoice #</Data></Cell>
<Cell ss:StyleID="s105"><Data ss:Type="String">Item</Data></Cell>
<Cell ss:StyleID="s105"><Data ss:Type="String">Invoice Price</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0" ss:Height="47.25">
<Cell ss:Index="2" ss:StyleID="s106"><Data ss:Type="String">(Document number/ PO number)</Data></Cell>
<Cell ss:StyleID="s106"><ss:Data ss:Type="String"
xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">(Items on </Font><B>Project Items List</B><Font
html:Color="#000000">)</Font></ss:Data></Cell>
<Cell ss:StyleID="s106"><Data ss:Type="String">(Item price from Budget Column on Project Items List)</Data></Cell>
<Cell ss:StyleID="s106"><Data ss:Type="String">(Item price from PO)</Data></Cell>
<Cell ss:StyleID="s106"><Data ss:Type="String">(Item price from Bill)</Data></Cell>
<Cell ss:StyleID="s106"/>
<Cell ss:StyleID="s106"><Data ss:Type="String">(PO$ - Budget$)</Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="m79512896"/>
<Cell ss:StyleID="s106"><Data ss:Type="String">(Bill$ - Budget$)</Data></Cell>
<Cell ss:StyleID="s107"><Data ss:Type="String">(Sales Order number)</Data></Cell>
<Cell ss:StyleID="s107"><Data ss:Type="String">(Invoice #)</Data></Cell>
<Cell ss:StyleID="s107"><Data ss:Type="String">(Item on Sales Order)</Data></Cell>
<Cell ss:StyleID="s107"><Data ss:Type="String">(Item price on Invoice)</Data></Cell>
</Row>
<!-- REPLACEWITHTABLE1 -->
<!-- <Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:StyleID="s108"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s109"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="m79512916"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s110"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s92"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s92"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s92"><Data ss:Type="Number">123</Data></Cell>
<Cell ss:StyleID="s111"><Data ss:Type="Number">123</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2" ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s108"/>
<Cell ss:MergeAcross="1" ss:StyleID="m79512936"/>
<Cell ss:StyleID="s108"/>
<Cell ss:StyleID="s92"/>
<Cell ss:StyleID="s92"/>
<Cell ss:StyleID="s92"/>
<Cell ss:StyleID="s92"/>
</Row>-->
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<Unsynced/>
<Print>
<ValidPrinterInfo/>
<HorizontalResolution>300</HorizontalResolution>
<VerticalResolution>300</VerticalResolution>
</Print>
<Zoom>70</Zoom>
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>38</ActiveRow>
<ActiveCol>8</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>