initial github commit

This commit is contained in:
2017-12-21 11:51:55 +01:00
commit 9936a38843
413 changed files with 12623 additions and 0 deletions
@@ -0,0 +1,14 @@
import Ember from 'ember'
import DS from 'ember-data'
businessDayComputations = (target, prefix, options = {}) ->
if options.add_attributes
Ember.defineProperty target, "#{prefix}_value", DS.attr('number', defaultValue: 0)
Ember.defineProperty target, "#{prefix}_unit", DS.attr('string', defaultValue: options.default_unit || 'day')
Ember.defineProperty target, "#{prefix}_business_days", DS.attr(defaultValue: -> [ 1, 2, 3, 4, 5 ])
#Ember.defineProperty target, "#{prefix}_business_days_index_sum", Ember.computed.sum "#{prefix}_business_days"
#Ember.defineProperty target, "has_default_#{prefix}_business_days", Ember.computed "#{prefix}_business_days.length", "#{prefix}_business_days_index_sum", ->
# @get("#{prefix}_business_days.length") is 5 and @get("#{prefix}_business_days_index_sum") is 15
#Ember.defineProperty target, "#{prefix}_unit_businessday", Ember.computed.equal "#{prefix}_unit", 'businessday'
true
export default businessDayComputations
+28
View File
@@ -0,0 +1,28 @@
// Generated by CoffeeScript 1.12.5
var businessDayComputations;
import Ember from 'ember';
import DS from 'ember-data';
businessDayComputations = function(target, prefix, options) {
if (options == null) {
options = {};
}
if (options.add_attributes) {
Ember.defineProperty(target, prefix + "_value", DS.attr('number', {
defaultValue: 0
}));
Ember.defineProperty(target, prefix + "_unit", DS.attr('string', {
defaultValue: options.default_unit || 'day'
}));
Ember.defineProperty(target, prefix + "_business_days", DS.attr({
defaultValue: function() {
return [1, 2, 3, 4, 5];
}
}));
}
return true;
};
export default businessDayComputations;
+148
View File
@@ -0,0 +1,148 @@
'use strict'
# taken from https://github.com/kalmecak/moment-business-days
#if (typeof require === 'function') {
# var moment = require('moment');
#}
moment.fn.isHoliday = ->
locale = @localeData()
if locale._holidays
if locale._holidays.indexOf(@format(locale._holidayFormat)) >= 0
return true
if locale.holiday
if locale.holiday(this)
return true
else
return false
false
moment.fn.isBusinessDay = (options) ->
locale = @localeData()
defaultWorkingWeekdays = [ 1, 2, 3, 4, 5 ]
workingWeekdays = options.business_days or locale._workingWeekdays or defaultWorkingWeekdays
if @isHoliday()
return false
if workingWeekdays.indexOf(@day()) >= 0
return true
false
moment.fn.businessDaysIntoMonth = ->
businessDay = if @isBusinessDay() then this else @prevBusinessDay()
monthBusinessDays = businessDay.monthBusinessDays()
businessDaysIntoMonth = undefined
monthBusinessDays.map (day, index) ->
if day.format('M/DD/YY') == businessDay.format('M/DD/YY')
businessDaysIntoMonth = index + 1
return
businessDaysIntoMonth
moment.fn.businessDiff = (param) ->
d1 = @clone()
d2 = param.clone()
start = if d1 < d2 then d1 else d2
end = if d2 > d1 then d2 else d1
daysBetween = 0
if start == end
return daysBetween
while start < end
if start.isBusinessDay()
daysBetween++
start.add 1, 'd'
daysBetween
moment.fn.businessAdd = (number, options = {}) ->
options.period ||= 'days'
day = @clone()
signal = if number < 0 then -1 else 1
remaining = Math.abs(number)
while remaining
day.add signal, options.period
if day.isBusinessDay(options)
remaining--
day
moment.fn.businessSubtract = (number, options = {}) ->
@businessAdd -number, options
moment.fn.nextBusinessDay = ->
iterator = 1
limit = 7
while iterator < limit
if @add(1, 'd').isBusinessDay()
break
iterator++
this
moment.fn.prevBusinessDay = ->
iterator = 1
limit = 7
while iterator < limit
if @subtract(1, 'd').isBusinessDay()
break
iterator++
this
moment.fn.monthBusinessDays = (partialEndDate) ->
me = @clone()
day = me.clone().startOf('month')
end = if partialEndDate then partialEndDate else me.clone().endOf('month')
daysArr = []
done = false
while !done
if day.isBusinessDay()
daysArr.push day.clone()
if end.diff(day.add(1, 'd')) < 0
done = true
daysArr
moment.fn.monthNaturalDays = (fromToday) ->
me = @clone()
day = if fromToday then me.clone() else me.clone().startOf('month')
end = me.clone().endOf('month')
daysArr = []
done = false
while !done
daysArr.push day.clone()
if end.diff(day.add(1, 'd')) < 0
done = true
daysArr
moment.fn.monthBusinessWeeks = (fromToday) ->
me = @clone()
day = if fromToday then me.clone() else me.clone().startOf('month')
end = me.clone().endOf('month')
weeksArr = []
daysArr = []
done = false
while !done
if day.day() >= 1 and day.day() < 6
daysArr.push day.clone()
if day.day() == 5
weeksArr.push daysArr
daysArr = []
if end.diff(day.add(1, 'd')) < 0
if daysArr.length < 5
weeksArr.push daysArr
done = true
weeksArr
moment.fn.monthNaturalWeeks = (fromToday) ->
me = @clone()
day = if fromToday then me.clone() else me.clone().startOf('month')
end = me.clone().endOf('month')
weeksArr = []
daysArr = []
done = false
while !done
daysArr.push day.clone()
if day.day() == 6
weeksArr.push daysArr
daysArr = []
if end.diff(day.add(1, 'd')) < 0
if daysArr.length < 7
weeksArr.push daysArr
done = true
weeksArr
if typeof module isnt 'undefined' and module.exports
module.exports = moment
+204
View File
@@ -0,0 +1,204 @@
// Generated by CoffeeScript 1.12.5
'use strict';
moment.fn.isHoliday = function() {
var locale;
locale = this.localeData();
if (locale._holidays) {
if (locale._holidays.indexOf(this.format(locale._holidayFormat)) >= 0) {
return true;
}
}
if (locale.holiday) {
if (locale.holiday(this)) {
return true;
} else {
return false;
}
}
return false;
};
moment.fn.isBusinessDay = function(options) {
var defaultWorkingWeekdays, locale, workingWeekdays;
locale = this.localeData();
defaultWorkingWeekdays = [1, 2, 3, 4, 5];
workingWeekdays = options.business_days || locale._workingWeekdays || defaultWorkingWeekdays;
if (this.isHoliday()) {
return false;
}
if (workingWeekdays.indexOf(this.day()) >= 0) {
return true;
}
return false;
};
moment.fn.businessDaysIntoMonth = function() {
var businessDay, businessDaysIntoMonth, monthBusinessDays;
businessDay = this.isBusinessDay() ? this : this.prevBusinessDay();
monthBusinessDays = businessDay.monthBusinessDays();
businessDaysIntoMonth = void 0;
monthBusinessDays.map(function(day, index) {
if (day.format('M/DD/YY') === businessDay.format('M/DD/YY')) {
businessDaysIntoMonth = index + 1;
}
});
return businessDaysIntoMonth;
};
moment.fn.businessDiff = function(param) {
var d1, d2, daysBetween, end, start;
d1 = this.clone();
d2 = param.clone();
start = d1 < d2 ? d1 : d2;
end = d2 > d1 ? d2 : d1;
daysBetween = 0;
if (start === end) {
return daysBetween;
}
while (start < end) {
if (start.isBusinessDay()) {
daysBetween++;
}
start.add(1, 'd');
}
return daysBetween;
};
moment.fn.businessAdd = function(number, options) {
var day, remaining, signal;
if (options == null) {
options = {};
}
options.period || (options.period = 'days');
day = this.clone();
signal = number < 0 ? -1 : 1;
remaining = Math.abs(number);
while (remaining) {
day.add(signal, options.period);
if (day.isBusinessDay(options)) {
remaining--;
}
}
return day;
};
moment.fn.businessSubtract = function(number, options) {
if (options == null) {
options = {};
}
return this.businessAdd(-number, options);
};
moment.fn.nextBusinessDay = function() {
var iterator, limit;
iterator = 1;
limit = 7;
while (iterator < limit) {
if (this.add(1, 'd').isBusinessDay()) {
break;
}
iterator++;
}
return this;
};
moment.fn.prevBusinessDay = function() {
var iterator, limit;
iterator = 1;
limit = 7;
while (iterator < limit) {
if (this.subtract(1, 'd').isBusinessDay()) {
break;
}
iterator++;
}
return this;
};
moment.fn.monthBusinessDays = function(partialEndDate) {
var day, daysArr, done, end, me;
me = this.clone();
day = me.clone().startOf('month');
end = partialEndDate ? partialEndDate : me.clone().endOf('month');
daysArr = [];
done = false;
while (!done) {
if (day.isBusinessDay()) {
daysArr.push(day.clone());
}
if (end.diff(day.add(1, 'd')) < 0) {
done = true;
}
}
return daysArr;
};
moment.fn.monthNaturalDays = function(fromToday) {
var day, daysArr, done, end, me;
me = this.clone();
day = fromToday ? me.clone() : me.clone().startOf('month');
end = me.clone().endOf('month');
daysArr = [];
done = false;
while (!done) {
daysArr.push(day.clone());
if (end.diff(day.add(1, 'd')) < 0) {
done = true;
}
}
return daysArr;
};
moment.fn.monthBusinessWeeks = function(fromToday) {
var day, daysArr, done, end, me, weeksArr;
me = this.clone();
day = fromToday ? me.clone() : me.clone().startOf('month');
end = me.clone().endOf('month');
weeksArr = [];
daysArr = [];
done = false;
while (!done) {
if (day.day() >= 1 && day.day() < 6) {
daysArr.push(day.clone());
}
if (day.day() === 5) {
weeksArr.push(daysArr);
daysArr = [];
}
if (end.diff(day.add(1, 'd')) < 0) {
if (daysArr.length < 5) {
weeksArr.push(daysArr);
}
done = true;
}
}
return weeksArr;
};
moment.fn.monthNaturalWeeks = function(fromToday) {
var day, daysArr, done, end, me, weeksArr;
me = this.clone();
day = fromToday ? me.clone() : me.clone().startOf('month');
end = me.clone().endOf('month');
weeksArr = [];
daysArr = [];
done = false;
while (!done) {
daysArr.push(day.clone());
if (day.day() === 6) {
weeksArr.push(daysArr);
daysArr = [];
}
if (end.diff(day.add(1, 'd')) < 0) {
if (daysArr.length < 7) {
weeksArr.push(daysArr);
}
done = true;
}
}
return weeksArr;
};
if (typeof module !== 'undefined' && module.exports) {
module.exports = moment;
}
+51
View File
@@ -0,0 +1,51 @@
export default pandaRouteSetup = (context) ->
context.route 'project', ->
@route 'show', path: ':project_id', ->
@route 'dunlop'
@route 'tracker-subjects'
@route 'tracker-subject', path: 'tracker-subject/:tracker_subject_id'
@route 'add-progress'
#@route 'tracker-subject', ->
# @route 'show'
@route 'dunlop-generator'
@route 'analysis'
@route 'project-instance', ->
@route 'show', path: ':project_instance_id', ->
@route 'groups'
@route 'list'
@route 'actions'
@route 'graphs'
@route 'project-instance-group', ->
@route 'show', path: ':project_instance_group_id'
@route 'project-instance-action', ->
@route 'show', path: ':project_instance_action_id'
#@route 'project/views', path: 'views'
context.route 'login'
#@route 'organization', path: 'organizations/:organization_id'
context.route 'action-list'
context.route 'organization', ->
@route 'show', path: ':organization_id', ->
@route 'project-actions'
context.route 'user', ->
@route 'profile'
@route 'show', path: ':user_id'
context.route 'tracker-subject', ->
@route 'show', path: ':tracker_subject_id', ->
@route 'tracking-connections'
@route 'tracker-group', path: 'tracker-groups/:tracker_group_id'
@route 'project', path: 'projects/:project_id'
#@route 'tracker-subject/tracker-group', path: 'tracker-subjects/:tracker_subject_id/tracker-groups/:tracker_group_id'
context.route 'event'
context.route 'meeting-reports'
context.route 'manual', ->
@route 'project', ->
@route 'dunlop'
@route 'tracker', ->
@route 'tricks' # dummy/empty now, to genate the index
true
+78
View File
@@ -0,0 +1,78 @@
// Generated by CoffeeScript 1.12.5
var pandaRouteSetup;
export default pandaRouteSetup = function(context) {
context.route('project', function() {
return this.route('show', {
path: ':project_id'
}, function() {
this.route('dunlop');
this.route('tracker-subjects');
this.route('tracker-subject', {
path: 'tracker-subject/:tracker_subject_id'
});
this.route('add-progress');
this.route('dunlop-generator');
this.route('analysis');
this.route('project-instance', function() {
return this.route('show', {
path: ':project_instance_id'
}, function() {
this.route('groups');
this.route('list');
this.route('actions');
return this.route('graphs');
});
});
this.route('project-instance-group', function() {
return this.route('show', {
path: ':project_instance_group_id'
});
});
return this.route('project-instance-action', function() {
return this.route('show', {
path: ':project_instance_action_id'
});
});
});
});
context.route('login');
context.route('action-list');
context.route('organization', function() {
return this.route('show', {
path: ':organization_id'
}, function() {
return this.route('project-actions');
});
});
context.route('user', function() {
this.route('profile');
return this.route('show', {
path: ':user_id'
});
});
context.route('tracker-subject', function() {
return this.route('show', {
path: ':tracker_subject_id'
}, function() {
this.route('tracking-connections');
this.route('tracker-group', {
path: 'tracker-groups/:tracker_group_id'
});
return this.route('project', {
path: 'projects/:project_id'
});
});
});
context.route('event');
context.route('meeting-reports');
context.route('manual', function() {
this.route('project', function() {
return this.route('dunlop');
});
return this.route('tracker', function() {
return this.route('tricks');
});
});
return true;
};
@@ -0,0 +1,45 @@
import Ember from 'ember'
# get_active_workflow_action_definitions(workflow_action_definitions, project_scenarios, set_operation = 'union or intersection')
# this util takes as first arguments the workflow_action_definitions scope
# and tries to apply filtering based on the given project_scenarios and set_operation
get_active_workflow_action_definitions_using_union = (project_scenarios) ->
selected_project_scenario_workflow_action_definition_ids = []
working_workflow_action_definitions = []
project_scenarios.forEach (selected_project_scenario) ->
selected_project_scenario.get('workflow_action_definitions').forEach (workflow_action_definition) ->
if selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0
selected_project_scenario_workflow_action_definition_ids.push workflow_action_definition.get('id')
working_workflow_action_definitions.push workflow_action_definition
working_workflow_action_definitions
get_active_workflow_action_definitions_using_intersection = (workflow_action_definitions, project_scenarios) ->
selected_project_scenario_workflow_action_definition_ids = []
first_run = true
project_scenarios.forEach (selected_project_scenario) ->
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray()
if first_run
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids
first_run = false
return
selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter (id) -> id in current_workflow_action_definition_ids
workflow_action_definitions.filter((r) -> r.get('id') in selected_project_scenario_workflow_action_definition_ids)
get_active_workflow_action_definitions = (workflow_action_definitions, project_scenarios, set_operation = 'union') ->
project_scenarios = Ember.makeArray(project_scenarios)
workflow_action_definitions = workflow_action_definitions.toArray()
# initialize unused working workflow-action-definitions
if project_scenarios.length
if set_operation is 'intersection'
get_active_workflow_action_definitions_using_intersection(workflow_action_definitions, project_scenarios)
else
get_active_workflow_action_definitions_using_union(project_scenarios)
else
# no filtering can be allplied, return all
workflow_action_definitions
export { get_active_workflow_action_definitions_using_union }
export { get_active_workflow_action_definitions_using_intersection }
export { get_active_workflow_action_definitions }
export default get_active_workflow_action_definitions
@@ -0,0 +1,73 @@
// Generated by CoffeeScript 1.12.5
var get_active_workflow_action_definitions, get_active_workflow_action_definitions_using_intersection, get_active_workflow_action_definitions_using_union,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
import Ember from 'ember';
get_active_workflow_action_definitions_using_union = function(project_scenarios) {
var selected_project_scenario_workflow_action_definition_ids, working_workflow_action_definitions;
selected_project_scenario_workflow_action_definition_ids = [];
working_workflow_action_definitions = [];
project_scenarios.forEach(function(selected_project_scenario) {
return selected_project_scenario.get('workflow_action_definitions').forEach(function(workflow_action_definition) {
if (selected_project_scenario_workflow_action_definition_ids.indexOf(workflow_action_definition.get('id')) < 0) {
selected_project_scenario_workflow_action_definition_ids.push(workflow_action_definition.get('id'));
return working_workflow_action_definitions.push(workflow_action_definition);
}
});
});
return working_workflow_action_definitions;
};
get_active_workflow_action_definitions_using_intersection = function(workflow_action_definitions, project_scenarios) {
var first_run, selected_project_scenario_workflow_action_definition_ids;
selected_project_scenario_workflow_action_definition_ids = [];
first_run = true;
project_scenarios.forEach(function(selected_project_scenario) {
var current_workflow_action_definition_ids;
current_workflow_action_definition_ids = selected_project_scenario.get('workflow_action_definitions').mapBy('id').toArray();
if (first_run) {
selected_project_scenario_workflow_action_definition_ids = current_workflow_action_definition_ids;
first_run = false;
return;
}
return selected_project_scenario_workflow_action_definition_ids = selected_project_scenario_workflow_action_definition_ids.filter(function(id) {
return indexOf.call(current_workflow_action_definition_ids, id) >= 0;
});
});
return workflow_action_definitions.filter(function(r) {
var ref;
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_action_definition_ids, ref) >= 0;
});
};
get_active_workflow_action_definitions = function(workflow_action_definitions, project_scenarios, set_operation) {
if (set_operation == null) {
set_operation = 'union';
}
project_scenarios = Ember.makeArray(project_scenarios);
workflow_action_definitions = workflow_action_definitions.toArray();
if (project_scenarios.length) {
if (set_operation === 'intersection') {
return get_active_workflow_action_definitions_using_intersection(workflow_action_definitions, project_scenarios);
} else {
return get_active_workflow_action_definitions_using_union(project_scenarios);
}
} else {
return workflow_action_definitions;
}
};
export {
get_active_workflow_action_definitions_using_union
};
export {
get_active_workflow_action_definitions_using_intersection
};
export {
get_active_workflow_action_definitions
};
export default get_active_workflow_action_definitions;
@@ -0,0 +1,45 @@
import Ember from 'ember'
# get_active_workflow_groups(workflow_groups, project_scenarios, set_operation = 'union or intersection')
# this util takes as first arguments the workflow_groups scope
# and tries to apply filtering based on the given project_scenarios and set_operation
get_active_workflow_groups_using_union = (project_scenarios) ->
selected_project_scenario_workflow_group_ids = []
working_workflow_groups = []
project_scenarios.forEach (selected_project_scenario) ->
selected_project_scenario.get('workflow_groups').forEach (workflow_group) ->
if selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0
selected_project_scenario_workflow_group_ids.push workflow_group.get('id')
working_workflow_groups.push workflow_group
working_workflow_groups
get_active_workflow_groups_using_intersection = (workflow_groups, project_scenarios) ->
selected_project_scenario_workflow_group_ids = []
first_run = true
project_scenarios.forEach (selected_project_scenario) ->
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray()
if first_run
selected_project_scenario_workflow_group_ids = current_workflow_group_ids
first_run = false
return
selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter (id) -> id in current_workflow_group_ids
workflow_groups.filter((r) -> r.get('id') in selected_project_scenario_workflow_group_ids)
get_active_workflow_groups = (workflow_groups, project_scenarios, set_operation = 'union') ->
project_scenarios = Ember.makeArray(project_scenarios)
workflow_groups = workflow_groups.toArray()
# initialize unused working workflow-groups
if project_scenarios.length
if set_operation is 'intersection'
get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios)
else
get_active_workflow_groups_using_union(project_scenarios)
else
# no filtering can be allplied, return all
workflow_groups
export { get_active_workflow_groups_using_union }
export { get_active_workflow_groups_using_intersection }
export { get_active_workflow_groups }
export default get_active_workflow_groups
@@ -0,0 +1,73 @@
// Generated by CoffeeScript 1.12.5
var get_active_workflow_groups, get_active_workflow_groups_using_intersection, get_active_workflow_groups_using_union,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
import Ember from 'ember';
get_active_workflow_groups_using_union = function(project_scenarios) {
var selected_project_scenario_workflow_group_ids, working_workflow_groups;
selected_project_scenario_workflow_group_ids = [];
working_workflow_groups = [];
project_scenarios.forEach(function(selected_project_scenario) {
return selected_project_scenario.get('workflow_groups').forEach(function(workflow_group) {
if (selected_project_scenario_workflow_group_ids.indexOf(workflow_group.get('id')) < 0) {
selected_project_scenario_workflow_group_ids.push(workflow_group.get('id'));
return working_workflow_groups.push(workflow_group);
}
});
});
return working_workflow_groups;
};
get_active_workflow_groups_using_intersection = function(workflow_groups, project_scenarios) {
var first_run, selected_project_scenario_workflow_group_ids;
selected_project_scenario_workflow_group_ids = [];
first_run = true;
project_scenarios.forEach(function(selected_project_scenario) {
var current_workflow_group_ids;
current_workflow_group_ids = selected_project_scenario.get('workflow_groups').mapBy('id').toArray();
if (first_run) {
selected_project_scenario_workflow_group_ids = current_workflow_group_ids;
first_run = false;
return;
}
return selected_project_scenario_workflow_group_ids = selected_project_scenario_workflow_group_ids.filter(function(id) {
return indexOf.call(current_workflow_group_ids, id) >= 0;
});
});
return workflow_groups.filter(function(r) {
var ref;
return ref = r.get('id'), indexOf.call(selected_project_scenario_workflow_group_ids, ref) >= 0;
});
};
get_active_workflow_groups = function(workflow_groups, project_scenarios, set_operation) {
if (set_operation == null) {
set_operation = 'union';
}
project_scenarios = Ember.makeArray(project_scenarios);
workflow_groups = workflow_groups.toArray();
if (project_scenarios.length) {
if (set_operation === 'intersection') {
return get_active_workflow_groups_using_intersection(workflow_groups, project_scenarios);
} else {
return get_active_workflow_groups_using_union(project_scenarios);
}
} else {
return workflow_groups;
}
};
export {
get_active_workflow_groups_using_union
};
export {
get_active_workflow_groups_using_intersection
};
export {
get_active_workflow_groups
};
export default get_active_workflow_groups;
+4
View File
@@ -0,0 +1,4 @@
projectContract = () ->
true
export default projectContract
+8
View File
@@ -0,0 +1,8 @@
// Generated by CoffeeScript 1.12.5
var projectContract;
projectContract = function() {
return true;
};
export default projectContract;
@@ -0,0 +1,295 @@
#projectGetWorkflowActionDefinitionOffsets = () ->
# true
#export default projectGetWorkflowActionDefinitionOffsets
import Ember from 'ember'
RecordNode = Ember.Object.extend
resolved: false
title: Ember.computed 'record.title', 'value_shift', ->
title = @get('record.title')
title = " #{title} (#{value_shift}d)" if value_shift = @get('value_shift')
title
OffsetNode = Ember.Object.extend
record: null
total_offset: 0
value_shift: 0
resulting_absolute_value: 0
WorkflowActionDefinitionOffsetNodes = Ember.Object.extend
iteration_context_counter: 0
workflow_action_definitions: []
reference_date: null
batch_size: 0
active_project_scenario: null
forEach: ->
@get('processed_workflow_action_definitions').forEach(arguments...)
filterBy: ->
@get('processed_workflow_action_definitions').filterBy(arguments...)
get_resolved: ->
@get('processed_workflow_action_definitions').filterBy('resolved')
init: ->
@set 'scope_workflow_action_definition_ids', @get('workflow_action_definitions').mapBy('id').toArray()
@set 'processed_workflow_action_definitions', []
@set 'working_workflow_action_definitions', []
@get_workflow_action_definition_offsets()
get_workflow_action_definition_offsets: ->
base = @
active_scenario_identifier = @get('active_project_scenario.identifier')
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
first_loop_actions = []
working_workflow_action_definitions = []
@get('workflow_action_definitions').forEach (workflow_action_definition) ->
action_added = false
if workflow_action_definition.get('offset_type') is 'configured'
workflow_action_definition.get('workflow_action_offsets').forEach (workflow_action_offset) ->
return if action_added
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
if not workflow_action_offset.get('base_workflow_action_definition.content') # x_based
[offset_date, offset_value] = base.get_offset_for_target(workflow_action_offset, 0)
[date, value_shift] = base.get_dynamic_offset_for_target(workflow_action_offset, offset_value)
absolute_value = offset_value + value_shift
record_wrapper = RecordNode.create
record: workflow_action_definition
record_id: workflow_action_definition.get('id')
offset_wrappers: [
OffsetNode.create(total_offset: absolute_value, value_shift: value_shift)
]
absolute_value: absolute_value
value_shift: value_shift
date: date
resolve_type: 'x'
resolved: true
resolve_level: 0
first_loop_actions.push record_wrapper
action_added = true
working_workflow_action_definitions.push workflow_action_definition unless action_added
@set 'processed_workflow_action_definitions', first_loop_actions
@set 'working_workflow_action_definitions', working_workflow_action_definitions
@incrementProperty 'iteration_context_counter'
#@set 'working_workflow_action_definitions', @get('workflow_action_definitions').filterBy('offset_type', 'configured')
@run_critical_path_resolve_loop()
resolve_level = @get('iteration_context_counter')
@get('working_workflow_action_definitions').forEach (unresolved_workflow_action_definition) => # add unresolved records
offset_wrappers = []
unresolved_workflow_action_definition.get('workflow_action_offsets').forEach (action_offset) ->
return unless action_offset.get('base_workflow_action_definition.id') in scope_workflow_action_definition_ids # do not add offsets from other scenarios
offset_wrappers.push OffsetNode.create
total_offset: action_offset.get('offset_value')
record: action_offset
@get('processed_workflow_action_definitions').push RecordNode.create
record: unresolved_workflow_action_definition
record_id: unresolved_workflow_action_definition.get('id')
offset_wrappers: offset_wrappers
resolved: false
resolve_level: resolve_level
resolve_type: 'unresolved'
get_dynamic_offset_for_target: (target, absolute_value) ->
base_date = @get('reference_date').clone().add(absolute_value, 'day')
empty = [base_date, 0]
return empty unless batch_size = @get('batch_size')
return empty unless threshold = target.get('batch_element_threshold_value')
return empty unless threshold_exceedance = Math.floor(batch_size / (0.1 + parseInt(threshold))) # + 0.1 (delta) to exclude exact match of batch_size and threshold. First day is action day
period_unit = target.get('batch_element_threshold_unit')
offset_value = target.get('offset_value')
operation = if offset_value < 0 then 'subtract' else 'add'
if period_unit is 'businessday'
operation = "business#{operation.capitalize()}"
shifted_date = base_date.clone()[operation](threshold_exceedance, business_days: target.get('batch_element_threshold_business_days'))
else
shifted_date = base_date.clone()[operation](threshold_exceedance, period_unit)
value_shift = shifted_date.diff(base_date, 'day')
[shifted_date, value_shift]
get_offset_for_target: (target, absolute_value) ->
base_date = @get('reference_date').clone().add(absolute_value, 'day')
empty = [base_date, 0]
return empty unless offset_value = target.get('offset_value')
period_unit = target.get('offset_unit')
operation = if offset_value < 0 then 'subtract' else 'add'
if period_unit is 'businessday'
operation = "business#{operation.capitalize()}"
shifted_date = base_date.clone()[operation](Math.abs(offset_value), business_days: target.get('offset_business_days'))
else
shifted_date = base_date.clone()[operation](Math.abs(offset_value), period_unit)
value_shift = shifted_date.diff(base_date, 'day')
#debugger if target.get('workflow_action_definition.title') is 'Initial check done'
[shifted_date, value_shift]
run_critical_path_resolve_loop: ->
working_indices_to_be_removed = []
active_scenario_identifier = @get('active_project_scenario.identifier')
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
get_offset_for_target = @get('get_offset_for_target').bind(@)
resolve_level = @get('iteration_context_counter')
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
return unless working_workflow_action_definition.get('offset_type') is 'configured'
farthest_absolute_value = 0
farthest_absolute_value_value_shift = 0
farthest_result_total_offset = 0
date = null # scoping
resolved_offset_wrappers = []
all_offsets_resolved = working_workflow_action_definition.get('workflow_action_offsets').every (workflow_action_offset) ->
return true if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('base_workflow_action_definition.id')
if workflow_action_offset.get('base_workflow_action_definition.id') not in scope_workflow_action_definition_ids # base is not present in this scenario, do not pursue this connection
return true
return false
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
farthest_absolute_value = current_connection_absolute_value
farthest_absolute_value_value_shift = current_connection_value_shift
farthest_result_total_offset = current_connection_total_offset_value
resolved_offset_wrappers.push OffsetNode.create
record: workflow_action_offset
value_shift: current_connection_value_shift
total_offset: current_connection_total_offset_value
resulting_absolute_value: current_connection_absolute_value
true # indicate processed_base_workflow_action_definition_wrapper found for all_offsets_resolved value
if all_offsets_resolved and resolved_offset_wrappers.length
record_wrapper = RecordNode.create
record: working_workflow_action_definition
record_id: working_workflow_action_definition.get('id')
offset_wrappers: resolved_offset_wrappers
value_shift: farthest_absolute_value_value_shift
absolute_value: farthest_absolute_value
date: date
resolved: true
resolve_level: resolve_level
resolve_type: 'critical-path'
processed_workflow_action_definitions.push record_wrapper
working_indices_to_be_removed.push working_index
if working_indices_to_be_removed.length
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
@run_critical_path_resolve_loop()
else
@incrementProperty 'iteration_context_counter'
@run_unresolved_tree_resolve_loop()
run_unresolved_tree_resolve_loop: ->
working_indices_to_be_removed = []
active_scenario_identifier = @get('active_project_scenario.identifier')
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
get_offset_for_target = @get('get_offset_for_target').bind(@)
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
resolve_level = @get('iteration_context_counter')
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
return unless working_workflow_action_definition.get('offset_type') is 'configured'
farthest_absolute_value = 0
farthest_absolute_value_value_shift = 0
farthest_result_total_offset = 0
date = null # scoping
resolved_offset_wrappers = []
working_workflow_action_definition.get('workflow_action_offsets').forEach (workflow_action_offset) ->
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
return unless workflow_action_offset.get('base_workflow_action_definition.id') in scope_workflow_action_definition_ids
return unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('base_workflow_action_definition.id')
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
farthest_absolute_value = current_connection_absolute_value
farthest_absolute_value_value_shift = current_connection_value_shift
farthest_result_total_offset = current_connection_total_offset_value
resolved_offset_wrappers.push OffsetNode.create
record: workflow_action_offset
value_shift: current_connection_value_shift
total_offset: current_connection_total_offset_value
resulting_absolute_value: current_connection_absolute_value
if resolved_offset_wrappers.length
record_wrapper = RecordNode.create
record: working_workflow_action_definition
record_id: working_workflow_action_definition.get('id')
offset_wrappers: resolved_offset_wrappers # .clone()?
value_shift: farthest_absolute_value_value_shift
absolute_value: farthest_absolute_value
date: date
resolved: true
resolve_level: resolve_level
resolve_type: 'with-non-rooted-offsets'
processed_workflow_action_definitions.push record_wrapper
working_indices_to_be_removed.push working_index
if working_indices_to_be_removed.length
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
@run_critical_path_resolve_loop()
else
@run_offset_forwarding_loop()
run_offset_forwarding_loop: ->
working_indices_to_be_removed = []
active_scenario_identifier = @get('active_project_scenario.identifier')
processed_workflow_action_definitions = @get('processed_workflow_action_definitions')
scope_workflow_action_definition_ids = @get('scope_workflow_action_definition_ids')
get_offset_for_target = @get('get_offset_for_target').bind(@)
get_dynamic_offset_for_target = @get('get_dynamic_offset_for_target').bind(@)
resolve_level = @get('iteration_context_counter')
@get('working_workflow_action_definitions').forEach (working_workflow_action_definition, working_index) ->
farthest_absolute_value = 0
farthest_absolute_value_value_shift = 0
farthest_result_total_offset = 0
date = null # scoping
resolved_offset_wrappers = []
working_workflow_action_definition.get('dependent_workflow_action_offsets').forEach (workflow_action_offset) ->
return if active_scenario_identifier and workflow_action_offset.get('project_scenario.identifier') and workflow_action_offset.get('project_scenario.identifier') isnt active_scenario_identifier
return unless workflow_action_offset.get('workflow_action_definition.id') in scope_workflow_action_definition_ids
return unless processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy 'record_id', workflow_action_offset.get('workflow_action_definition.id')
#return if workflow_action_offset.get('workflow_action_definition.offset_type') is 'none' # do not resolve on none offset typed nodes
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value')
[offset_date, working_offset_value] = get_offset_for_target(workflow_action_offset, processed_absolute_value)
[date, current_connection_value_shift] = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value)
current_connection_total_offset_value = current_connection_value_shift + working_offset_value
#NOTE MINUS!!!!!!!!!!!!!!!!!!!!!
current_connection_absolute_value = processed_absolute_value - current_connection_total_offset_value
#debugger if processed_base_workflow_action_definition_wrapper.get('record.title') is 'Initial check done'
#debugger if working_workflow_action_definition.get('title') is 'Initial check done'
if Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)
farthest_absolute_value = current_connection_absolute_value
farthest_absolute_value_value_shift = current_connection_value_shift
farthest_result_total_offset = current_connection_total_offset_value
resolved_offset_wrappers.push OffsetNode.create
record: workflow_action_offset
value_shift: current_connection_value_shift
total_offset: current_connection_total_offset_value
resulting_absolute_value: current_connection_absolute_value
if resolved_offset_wrappers.length
record_wrapper = RecordNode.create
record: working_workflow_action_definition
record_id: working_workflow_action_definition.get('id')
offset_wrappers: resolved_offset_wrappers # .clone()?
value_shift: farthest_absolute_value_value_shift
absolute_value: farthest_absolute_value
date: date
resolved: true
resolve_level: resolve_level
resolve_type: 'offset-lookup-inversion'
processed_workflow_action_definitions.push record_wrapper
working_indices_to_be_removed.push working_index
if working_indices_to_be_removed.length
@get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1) while working_indices_to_be_removed.length
@run_critical_path_resolve_loop()
export default WorkflowActionDefinitionOffsetNodes
@@ -0,0 +1,389 @@
// Generated by CoffeeScript 1.12.5
var OffsetNode, RecordNode, WorkflowActionDefinitionOffsetNodes,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
import Ember from 'ember';
RecordNode = Ember.Object.extend({
resolved: false,
title: Ember.computed('record.title', 'value_shift', function() {
var title, value_shift;
title = this.get('record.title');
if (value_shift = this.get('value_shift')) {
title = " " + title + " (" + value_shift + "d)";
}
return title;
})
});
OffsetNode = Ember.Object.extend({
record: null,
total_offset: 0,
value_shift: 0,
resulting_absolute_value: 0
});
WorkflowActionDefinitionOffsetNodes = Ember.Object.extend({
iteration_context_counter: 0,
workflow_action_definitions: [],
reference_date: null,
batch_size: 0,
active_project_scenario: null,
forEach: function() {
var ref;
return (ref = this.get('processed_workflow_action_definitions')).forEach.apply(ref, arguments);
},
filterBy: function() {
var ref;
return (ref = this.get('processed_workflow_action_definitions')).filterBy.apply(ref, arguments);
},
get_resolved: function() {
return this.get('processed_workflow_action_definitions').filterBy('resolved');
},
init: function() {
this.set('scope_workflow_action_definition_ids', this.get('workflow_action_definitions').mapBy('id').toArray());
this.set('processed_workflow_action_definitions', []);
this.set('working_workflow_action_definitions', []);
return this.get_workflow_action_definition_offsets();
},
get_workflow_action_definition_offsets: function() {
var active_scenario_identifier, base, first_loop_actions, resolve_level, scope_workflow_action_definition_ids, working_workflow_action_definitions;
base = this;
active_scenario_identifier = this.get('active_project_scenario.identifier');
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
first_loop_actions = [];
working_workflow_action_definitions = [];
this.get('workflow_action_definitions').forEach(function(workflow_action_definition) {
var action_added;
action_added = false;
if (workflow_action_definition.get('offset_type') === 'configured') {
workflow_action_definition.get('workflow_action_offsets').forEach(function(workflow_action_offset) {
var absolute_value, date, offset_date, offset_value, record_wrapper, ref, ref1, value_shift;
if (action_added) {
return;
}
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
return;
}
if (!workflow_action_offset.get('base_workflow_action_definition.content')) {
ref = base.get_offset_for_target(workflow_action_offset, 0), offset_date = ref[0], offset_value = ref[1];
ref1 = base.get_dynamic_offset_for_target(workflow_action_offset, offset_value), date = ref1[0], value_shift = ref1[1];
absolute_value = offset_value + value_shift;
record_wrapper = RecordNode.create({
record: workflow_action_definition,
record_id: workflow_action_definition.get('id'),
offset_wrappers: [
OffsetNode.create({
total_offset: absolute_value,
value_shift: value_shift
})
],
absolute_value: absolute_value,
value_shift: value_shift,
date: date,
resolve_type: 'x',
resolved: true,
resolve_level: 0
});
first_loop_actions.push(record_wrapper);
return action_added = true;
}
});
}
if (!action_added) {
return working_workflow_action_definitions.push(workflow_action_definition);
}
});
this.set('processed_workflow_action_definitions', first_loop_actions);
this.set('working_workflow_action_definitions', working_workflow_action_definitions);
this.incrementProperty('iteration_context_counter');
this.run_critical_path_resolve_loop();
resolve_level = this.get('iteration_context_counter');
return this.get('working_workflow_action_definitions').forEach((function(_this) {
return function(unresolved_workflow_action_definition) {
var offset_wrappers;
offset_wrappers = [];
unresolved_workflow_action_definition.get('workflow_action_offsets').forEach(function(action_offset) {
var ref;
if (ref = action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
return;
}
return offset_wrappers.push(OffsetNode.create({
total_offset: action_offset.get('offset_value'),
record: action_offset
}));
});
return _this.get('processed_workflow_action_definitions').push(RecordNode.create({
record: unresolved_workflow_action_definition,
record_id: unresolved_workflow_action_definition.get('id'),
offset_wrappers: offset_wrappers,
resolved: false,
resolve_level: resolve_level,
resolve_type: 'unresolved'
}));
};
})(this));
},
get_dynamic_offset_for_target: function(target, absolute_value) {
var base_date, batch_size, empty, offset_value, operation, period_unit, shifted_date, threshold, threshold_exceedance, value_shift;
base_date = this.get('reference_date').clone().add(absolute_value, 'day');
empty = [base_date, 0];
if (!(batch_size = this.get('batch_size'))) {
return empty;
}
if (!(threshold = target.get('batch_element_threshold_value'))) {
return empty;
}
if (!(threshold_exceedance = Math.floor(batch_size / (0.1 + parseInt(threshold))))) {
return empty;
}
period_unit = target.get('batch_element_threshold_unit');
offset_value = target.get('offset_value');
operation = offset_value < 0 ? 'subtract' : 'add';
if (period_unit === 'businessday') {
operation = "business" + (operation.capitalize());
shifted_date = base_date.clone()[operation](threshold_exceedance, {
business_days: target.get('batch_element_threshold_business_days')
});
} else {
shifted_date = base_date.clone()[operation](threshold_exceedance, period_unit);
}
value_shift = shifted_date.diff(base_date, 'day');
return [shifted_date, value_shift];
},
get_offset_for_target: function(target, absolute_value) {
var base_date, empty, offset_value, operation, period_unit, shifted_date, value_shift;
base_date = this.get('reference_date').clone().add(absolute_value, 'day');
empty = [base_date, 0];
if (!(offset_value = target.get('offset_value'))) {
return empty;
}
period_unit = target.get('offset_unit');
operation = offset_value < 0 ? 'subtract' : 'add';
if (period_unit === 'businessday') {
operation = "business" + (operation.capitalize());
shifted_date = base_date.clone()[operation](Math.abs(offset_value), {
business_days: target.get('offset_business_days')
});
} else {
shifted_date = base_date.clone()[operation](Math.abs(offset_value), period_unit);
}
value_shift = shifted_date.diff(base_date, 'day');
return [shifted_date, value_shift];
},
run_critical_path_resolve_loop: function() {
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
working_indices_to_be_removed = [];
active_scenario_identifier = this.get('active_project_scenario.identifier');
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
get_offset_for_target = this.get('get_offset_for_target').bind(this);
resolve_level = this.get('iteration_context_counter');
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
var all_offsets_resolved, date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
if (working_workflow_action_definition.get('offset_type') !== 'configured') {
return;
}
farthest_absolute_value = 0;
farthest_absolute_value_value_shift = 0;
farthest_result_total_offset = 0;
date = null;
resolved_offset_wrappers = [];
all_offsets_resolved = working_workflow_action_definition.get('workflow_action_offsets').every(function(workflow_action_offset) {
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
return true;
}
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('base_workflow_action_definition.id')))) {
if (ref = workflow_action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
return true;
}
return false;
}
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value;
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
farthest_absolute_value = current_connection_absolute_value;
farthest_absolute_value_value_shift = current_connection_value_shift;
farthest_result_total_offset = current_connection_total_offset_value;
}
resolved_offset_wrappers.push(OffsetNode.create({
record: workflow_action_offset,
value_shift: current_connection_value_shift,
total_offset: current_connection_total_offset_value,
resulting_absolute_value: current_connection_absolute_value
}));
return true;
});
if (all_offsets_resolved && resolved_offset_wrappers.length) {
record_wrapper = RecordNode.create({
record: working_workflow_action_definition,
record_id: working_workflow_action_definition.get('id'),
offset_wrappers: resolved_offset_wrappers,
value_shift: farthest_absolute_value_value_shift,
absolute_value: farthest_absolute_value,
date: date,
resolved: true,
resolve_level: resolve_level,
resolve_type: 'critical-path'
});
processed_workflow_action_definitions.push(record_wrapper);
return working_indices_to_be_removed.push(working_index);
}
});
if (working_indices_to_be_removed.length) {
while (working_indices_to_be_removed.length) {
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
}
return this.run_critical_path_resolve_loop();
} else {
this.incrementProperty('iteration_context_counter');
return this.run_unresolved_tree_resolve_loop();
}
},
run_unresolved_tree_resolve_loop: function() {
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
working_indices_to_be_removed = [];
active_scenario_identifier = this.get('active_project_scenario.identifier');
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
get_offset_for_target = this.get('get_offset_for_target').bind(this);
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
resolve_level = this.get('iteration_context_counter');
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
var date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
if (working_workflow_action_definition.get('offset_type') !== 'configured') {
return;
}
farthest_absolute_value = 0;
farthest_absolute_value_value_shift = 0;
farthest_result_total_offset = 0;
date = null;
resolved_offset_wrappers = [];
working_workflow_action_definition.get('workflow_action_offsets').forEach(function(workflow_action_offset) {
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
return;
}
if (ref = workflow_action_offset.get('base_workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
return;
}
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('base_workflow_action_definition.id')))) {
return;
}
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
current_connection_absolute_value = processed_absolute_value + current_connection_total_offset_value;
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
farthest_absolute_value = current_connection_absolute_value;
farthest_absolute_value_value_shift = current_connection_value_shift;
farthest_result_total_offset = current_connection_total_offset_value;
}
return resolved_offset_wrappers.push(OffsetNode.create({
record: workflow_action_offset,
value_shift: current_connection_value_shift,
total_offset: current_connection_total_offset_value,
resulting_absolute_value: current_connection_absolute_value
}));
});
if (resolved_offset_wrappers.length) {
record_wrapper = RecordNode.create({
record: working_workflow_action_definition,
record_id: working_workflow_action_definition.get('id'),
offset_wrappers: resolved_offset_wrappers,
value_shift: farthest_absolute_value_value_shift,
absolute_value: farthest_absolute_value,
date: date,
resolved: true,
resolve_level: resolve_level,
resolve_type: 'with-non-rooted-offsets'
});
processed_workflow_action_definitions.push(record_wrapper);
return working_indices_to_be_removed.push(working_index);
}
});
if (working_indices_to_be_removed.length) {
while (working_indices_to_be_removed.length) {
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
}
return this.run_critical_path_resolve_loop();
} else {
return this.run_offset_forwarding_loop();
}
},
run_offset_forwarding_loop: function() {
var active_scenario_identifier, get_dynamic_offset_for_target, get_offset_for_target, processed_workflow_action_definitions, resolve_level, scope_workflow_action_definition_ids, working_indices_to_be_removed;
working_indices_to_be_removed = [];
active_scenario_identifier = this.get('active_project_scenario.identifier');
processed_workflow_action_definitions = this.get('processed_workflow_action_definitions');
scope_workflow_action_definition_ids = this.get('scope_workflow_action_definition_ids');
get_offset_for_target = this.get('get_offset_for_target').bind(this);
get_dynamic_offset_for_target = this.get('get_dynamic_offset_for_target').bind(this);
resolve_level = this.get('iteration_context_counter');
this.get('working_workflow_action_definitions').forEach(function(working_workflow_action_definition, working_index) {
var date, farthest_absolute_value, farthest_absolute_value_value_shift, farthest_result_total_offset, record_wrapper, resolved_offset_wrappers;
farthest_absolute_value = 0;
farthest_absolute_value_value_shift = 0;
farthest_result_total_offset = 0;
date = null;
resolved_offset_wrappers = [];
working_workflow_action_definition.get('dependent_workflow_action_offsets').forEach(function(workflow_action_offset) {
var current_connection_absolute_value, current_connection_total_offset_value, current_connection_value_shift, offset_date, processed_absolute_value, processed_base_workflow_action_definition_wrapper, ref, ref1, ref2, working_offset_value;
if (active_scenario_identifier && workflow_action_offset.get('project_scenario.identifier') && workflow_action_offset.get('project_scenario.identifier') !== active_scenario_identifier) {
return;
}
if (ref = workflow_action_offset.get('workflow_action_definition.id'), indexOf.call(scope_workflow_action_definition_ids, ref) < 0) {
return;
}
if (!(processed_base_workflow_action_definition_wrapper = processed_workflow_action_definitions.findBy('record_id', workflow_action_offset.get('workflow_action_definition.id')))) {
return;
}
processed_absolute_value = processed_base_workflow_action_definition_wrapper.get('absolute_value');
ref1 = get_offset_for_target(workflow_action_offset, processed_absolute_value), offset_date = ref1[0], working_offset_value = ref1[1];
ref2 = get_dynamic_offset_for_target(workflow_action_offset, processed_absolute_value + working_offset_value), date = ref2[0], current_connection_value_shift = ref2[1];
current_connection_total_offset_value = current_connection_value_shift + working_offset_value;
current_connection_absolute_value = processed_absolute_value - current_connection_total_offset_value;
if (Math.abs(current_connection_absolute_value) > Math.abs(farthest_absolute_value)) {
farthest_absolute_value = current_connection_absolute_value;
farthest_absolute_value_value_shift = current_connection_value_shift;
farthest_result_total_offset = current_connection_total_offset_value;
}
return resolved_offset_wrappers.push(OffsetNode.create({
record: workflow_action_offset,
value_shift: current_connection_value_shift,
total_offset: current_connection_total_offset_value,
resulting_absolute_value: current_connection_absolute_value
}));
});
if (resolved_offset_wrappers.length) {
record_wrapper = RecordNode.create({
record: working_workflow_action_definition,
record_id: working_workflow_action_definition.get('id'),
offset_wrappers: resolved_offset_wrappers,
value_shift: farthest_absolute_value_value_shift,
absolute_value: farthest_absolute_value,
date: date,
resolved: true,
resolve_level: resolve_level,
resolve_type: 'offset-lookup-inversion'
});
processed_workflow_action_definitions.push(record_wrapper);
return working_indices_to_be_removed.push(working_index);
}
});
if (working_indices_to_be_removed.length) {
while (working_indices_to_be_removed.length) {
this.get('working_workflow_action_definitions').splice(working_indices_to_be_removed.pop(), 1);
}
return this.run_critical_path_resolve_loop();
}
}
});
export default WorkflowActionDefinitionOffsetNodes;