Skip to content
Snippets Groups Projects
Commit 9806ce46 authored by Johannes Hörmann's avatar Johannes Hörmann
Browse files

refactored turnover-process

parent 9d243126
No related branches found
No related tags found
No related merge requests found
import("system.vars");
import("system.datetime");
import("system.db");
import("Sql_lib");
import("system.result");
import("system.translate");
import("Data_lib");
import("Keyword_lib");
import("Money_lib");
import("system.datetime");
import("system.db");
import("KeywordRegistry_basic");
import("Keyword_lib");
import("system.translate");
import("system.SQLTYPES");
var turnoverCategory = translate.text('Turnover');
var forecastCategory = translate.text('Forecast');
// load data
var sumOfMonthTurnover = db.table("select year(SALESORDERDATE) yearNum, month(SALESORDERDATE) monthNum, sum(NET + VAT) from SALESORDER group by year(SALESORDERDATE), month(SALESORDERDATE) order by yearNum, monthNum");
var sumOfMonthForecast = db.table("select year(DATE_START) yearNum, month(DATE_START) monthNum, sum(VOLUME * 1000) from SALESPROJECT_FORECAST group by year(DATE_START), month(DATE_START) order by yearNum, monthNum");
var sumOfMonthProductsTurnover = db.table("select year(SALESORDERDATE) yearNum, month(SALESORDERDATE) monthNum, SALESORDERITEM.DISCOUNT, SALESORDERITEM.VAT, SALESORDERITEM.PRICE, sum(SALESORDERITEM.QUANTITY), SALESORDERITEM.GROUPCODEID, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "SALESORDERITEM.GROUPCODEID") + ") \n\
from SALESORDER \n\
join SALESORDERITEM on SALESORDERITEM.SALESORDER_ID = SALESORDER.SALESORDERID \n\
where SALESORDERITEM.OPTIONAL <> 1 \n\
group by year(SALESORDERDATE), month(SALESORDERDATE), SALESORDERITEM.GROUPCODEID, SALESORDERITEM.DISCOUNT, SALESORDERITEM.VAT, SALESORDERITEM.PRICE \n\
order by yearNum, monthNum"); // V--V--> there is no VAT/Discount in forecasts V-----> forecasts are grouped by grupcode and have always quantity 1
var sumOfMonthProductsForecast = db.table("select year(DATE_START) yearNum, month(DATE_START) monthNum, 0, 0, sum(VOLUME * 1000), 1, GROUPCODE, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "GROUPCODE") + ") from SALESPROJECT_FORECAST group by year(DATE_START), month(DATE_START), GROUPCODE order by yearNum, monthNum");
// build chartData
var rootNode = "";
var chartData = ReferencingData.begin(rootNode);
var skippedCounts = {};
var maxYear = parseInt(vars.get("$param.MaxYear_param"));
var yearCountToShow = parseInt(vars.get("$param.YearCountToShow_param"));
var minYear = maxYear - yearCountToShow + 1;
for (let i = 0; i < yearCountToShow; i++)
{
var year = i + maxYear - yearCountToShow + 1;
var turnoverYearSum = 0;
var forecastYearSum = 0;
// filter data by current year
var turnoverYearData = sumOfMonthTurnover.filter(function(row)
{
return row[0] == year;
});
var forecastYearData = sumOfMonthForecast.filter(function(row)
{
return row[0] == year;
});
for (let i = 1; i <= 12; i++)
{
// add months
turnoverYearSum += _addMonth(year, i, turnoverYearData, turnoverCategory);
forecastYearSum += _addMonth(year, i, forecastYearData, forecastCategory);
_addProducts(year, i, sumOfMonthProductsTurnover, turnoverCategory);
_addProducts(year, i, sumOfMonthProductsForecast, forecastCategory);
}
// add year nodes
chartData.add(turnoverCategory + year, rootNode, [turnoverCategory, year.toString(), turnoverYearSum]);
chartData.add(forecastCategory + year, rootNode, [forecastCategory, year.toString(), forecastYearSum]);
// load data
var data = db.table(SqlCondition.begin()
.andPrepare("SALESPROJECT_FORECAST.DATE_START", maxYear, "year(#) <= ?", SQLTYPES.INTEGER)
.andPrepare("SALESPROJECT_FORECAST.DATE_START", minYear, "year(#) >= ?", SQLTYPES.INTEGER)
.buildSql("select 'Forecast', year(DATE_START) yearNum, month(DATE_START) monthNum, 0 discount, 0 vat, sum(VOLUME * 1000) price, 1 quantity, GROUPCODE prodGroup, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "GROUPCODE") + ") prodGroupName from SALESPROJECT_FORECAST", "1=2", " group by year(DATE_START), month(DATE_START), GROUPCODE order by yearNum, monthNum"))
.concat(db.table(SqlCondition.begin()
.and("SALESORDERITEM.OPTIONAL <> 1")
.andPrepare("SALESORDER.SALESORDERDATE", maxYear, "year(#) <= ?", SQLTYPES.INTEGER)
.andPrepare("SALESORDER.SALESORDERDATE", minYear, "year(#) >= ?", SQLTYPES.INTEGER)
.buildSql("select 'Turnover', year(SALESORDERDATE) yearNum, month(SALESORDERDATE) monthNum, SALESORDERITEM.DISCOUNT discount, SALESORDERITEM.VAT vat, SALESORDERITEM.PRICE price, sum(SALESORDERITEM.QUANTITY) quantity, SALESORDERITEM.GROUPCODEID prodGroup, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "SALESORDERITEM.GROUPCODEID") + ") prodGroupName \n\
from SALESORDER \n\
join SALESORDERITEM on SALESORDERITEM.SALESORDER_ID = SALESORDER.SALESORDERID", "1=2", "group by year(SALESORDERDATE), month(SALESORDERDATE), SALESORDERITEM.GROUPCODEID, SALESORDERITEM.DISCOUNT, SALESORDERITEM.VAT, SALESORDERITEM.PRICE \n\
order by yearNum, monthNum ")))
}
var columns = {
type: 0,
year: 1,
month: 2,
discount: 3,
vat: 4,
price: 5,
quantity: 6,
groupcodeId: 7,
groupcodeName: 8
};
result.object(chartData.toArray());
var chartData = [];
var countData = {}
function _addMonth(pYear, pMonth, pData, pCategory)
var monthDate;
// add all months for all years
for (let y = minYear; y <= maxYear; y++)
{
var yearSum = 0;
// count months, which didn't exist in data source.
if (pMonth == 1)
for (let m = 0; m < 12; m++)
{
skippedCounts[pCategory] = 0;
monthDate = new Date(y, m-1);
monthDate = datetime.toDate(monthDate.getTime(), "MMM yyyy", "UTC");
logging.log(monthDate)
_addCount(["Forecast", ""+y, [m, monthDate]], 0.0);
_addCount(["Turnover", ""+y, [m, monthDate]], 0.0);
}
}
var currentMonthData = pData[pMonth - skippedCounts[pCategory] - 1];
var monthDate = new Date(pYear, pMonth-1);
data.forEach(function(row)
{
monthDate = new Date(row[columns.year], row[columns.month]-1);
monthDate = datetime.toDate(monthDate.getTime(), "MMM yyyy", "UTC");
var monthValue = 0.0;
if (currentMonthData != undefined && currentMonthData[1] == pMonth.toString())
{
monthValue = currentMonthData[2];
yearSum += parseInt(currentMonthData[2]);
}
else
switch(row[columns.type])
{
// if month didn't exist in data source, use 0.0 as value.
skippedCounts[pCategory]++;
case "Forecast":
_addCount([row[columns.type], row[columns.year], [row[columns.month], monthDate], [row[columns.groupcodeId], row[columns.groupcodeName]]], row[columns.price]);
break;
case "Turnover":
_addCount([row[columns.type], row[columns.year], [row[columns.month], monthDate], [row[columns.groupcodeId], row[columns.groupcodeName]]],
MoneyUtils.getGross(
(row[columns.vat] ? parseFloat(row[columns.vat]) : 0.0),
(row[columns.price] ? parseFloat(row[columns.price]) : 0.0),
(row[columns.quantity] ? parseFloat(row[columns.quantity]) : 0.0),
(row[columns.discount] ? parseFloat(row[columns.discount]) : 0.0)));
break;
}
});
// add month node
chartData.add(pCategory + pYear + pMonth, pCategory + pYear, [pCategory, monthDate, monthValue]);
return yearSum;
for (let key in countData) {
var countDataSet = countData[key];
chartData.push([key, countDataSet.parent, countDataSet.category, countDataSet.x, countDataSet.count]);
}
function _addProducts(pYear, pMonth, pData, pCategory)
{
var monthDate = new Date(pYear, pMonth-1);
monthDate = datetime.toDate(monthDate.getTime(), "MMM yyyy", "UTC");
var groupcodeSums = {};
result.object(chartData);
/**
* add the counts to countData for the given key and value
* @param {Array} pKeys an array containing all keys for this value. If the x-value for one key is different from the key-value: add an array [key, value] instead of only the key
* the first key is the Category
* @param {float} pValue the value to display
*/
function _addCount(pKeys, pValue) {
var key = "";
for (let i = 0; i < pData.length; i++)
{
if (pData[i][0] == pYear && pData[i][1] == pMonth)
for (let i = 0; i < pKeys.length; i++) {
let keyId;
let keyName;
if (typeof pKeys[i] != "object")
{
var groupCode = pData[i][6];
if (groupCode != undefined)
{
if (groupcodeSums[groupCode] == undefined)
{
groupcodeSums[groupCode] = {
sum: 0,
name: pData[i][7]
}
}
pData[i][2] = pData[i][2] || 0;
pData[i][3] = pData[i][3] || 0;
pData[i][4] = pData[i][4] || 0;
pData[i][5] = pData[i][5] || 0;
groupcodeSums[groupCode]["sum"] += MoneyUtils.getGross(parseFloat(pData[i][3]), parseFloat(pData[i][4]), parseFloat(pData[i][5]), parseFloat(pData[i][2]));
}
keyId = pKeys[i];
keyName = pKeys[i];
}
}
for (let groupcode in groupcodeSums)
{
if (groupcodeSums[groupcode]["sum"])
else // handle array: first is id seccond is name for X-value
{
chartData.add(pCategory + pYear + pMonth + groupcode, pCategory + pYear + pMonth, [pCategory, groupcodeSums[groupcode]["name"] + " (" + monthDate.toString() + ")", groupcodeSums[groupcode]["sum"]]);
keyId = pKeys[i][0];
keyName = pKeys[i][1];
}
var parent = key;
if (i < 2)
{
parent = ""
}
key += ";" + keyId;
if (i > 0)
{
if (countData[key] == undefined)
{
countData[key] = {parent: parent, count: 0.0, category: pKeys[0], x: keyName}; // keys[0] is the category
}
countData[key].count += parseFloat(pValue);
}
}
}
}
\ No newline at end of file
import("system.db");
import("system.neon");
import("Context_lib");
/**
* Methods used for time tracking.
* Do not create an instance of this!
*
* @class
*/
function Timetracking() {}
/**
* calculates the total time of all time trackings of the object
*
* @param {String} pRowId the rowId
*
* @return {Number} total time in minutes
*/
Timetracking.getTotalTrackingTime = function (pRowId)
{
var objectId = ContextUtils.getCurrentContextId();
var totalMinutes = db.cell(SqlCondition.begin()
.andPrepare("TIMETRACKING.OBJECT_ID", objectId)
.andPrepare("TIMETRACKING.ROW_ID", pRowId)
.buildSql("select sum(MINUTES) from TIMETRACKING", "1=0"));
return Number(totalMinutes);
}
/**
* Create a new time tracking
*
* @param {String} pRowId the rowId
*
* @return {Number} total time in minutes
*/
Timetracking.createNewTimeTracking = function (pRowId)
{
var objectId = ContextUtils.getCurrentContextId();
var params = {
"ObjectId_param" : objectId,
"RowId_param" : pRowId
};
neon.openContext("Timetracking", null, null, neon.OPERATINGSTATE_NEW, params);
}
/*
* converts minutes tho hours and minuets. e.g. 105 to 1:45
*
* @param {integer} pMinutes req
*
* @return {String} Hours:Minutes
*/
Timetracking.minutesToReadableHour = function(pMinutes)
{
var timeHour = parseInt(pMinutes / 60);
var minutes = parseInt(pMinutes % 60);
return "" + timeHour + ":" + ((minutes <= 9) ? "0" + minutes : minutes);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment