abstract
MFPsystem
2..3
hierarchies
calendar
->
CalendarHierarchy
producth
->
ProductHierarchy
location
->
LocationHierarchy
hasTheFollowingWorkflows
->
workflow
+
//***************** Concrete Clafers *****************
Oracle
:
MFPsystem
[
calendar
=
Cal2012
]
[
producth
=
Menswear
]
[
hasTheFollowingWorkflows
=
PreSeasonTargetSettingWorkflow
]
[
PreSeasonTargetSettingWorkflow
,
InSeasonTargetSettingWorkflow
]
abstract
Hierarchy
abstract
CalendarHierarchy
:
Hierarchy
levels
->
HierarchyLevel
+
[
all l
:
levels
|
l
.
levelBelongsToThis
=
this
]
abstract
ProductHierarchy
:
Hierarchy
levels
->
HierarchyLevel
+
[
all l
:
levels
|
l
.
levelBelongsToThis
=
this
]
abstract
LocationHierarchy
:
Hierarchy
levels
->
HierarchyLevel
+
[
all l
:
levels
|
l
.
levelBelongsToThis
=
this
]
abstract
HierarchyLevel
levelBelongsToThis
->
Hierarchy
spreadsToLowerLevel
->
HierarchyLevel
?
aggregatesToHigherLevel
->
HierarchyLevel
?
[
all disj d1; d2
:
HierarchyLevel
|
d2
=
d1
.
aggregatesToHigherLevel
<=>
d1
=
d2
.
spreadsToLowerLevel
]
abstract
HierarchyLevelInstance
instanceBelongsTo
->
HierarchyLevel
instanceAggregatesTo
->
HierarchyLevelInstance
?
instanceSpreadsTo
->
HierarchyLevelInstance
?
[
all disj d1; d2
:
HierarchyLevelInstance
|
d2
=
d1
.
instanceAggregatesTo
<=>
d1
=
d2
.
instanceSpreadsTo
]
Cal2012
:
CalendarHierarchy
[
levels
=
Year
,
Season
,
Month
,
Week
]
//***************** Concrete Clafers ******************
Menswear
:
ProductHierarchy
[
levels
=
MensCasualWear
,
MensSportsWear
]
Year
:
HierarchyLevel
[
levelBelongsToThis
=
Cal2012
]
[
spreadsToLowerLevel
=
Season
]
[
no
aggregatesToHigherLevel
]
Season
:
HierarchyLevel
[
levelBelongsToThis
=
Cal2012
]
[
spreadsToLowerLevel
=
Month
]
[
aggregatesToHigherLevel
=
Year
]
Month
:
HierarchyLevel
[
levelBelongsToThis
=
Cal2012
]
[
spreadsToLowerLevel
=
Week
]
[
aggregatesToHigherLevel
=
Season
]
Week
:
HierarchyLevel
[
levelBelongsToThis
=
Cal2012
]
[
no
spreadsToLowerLevel
]
[
aggregatesToHigherLevel
=
Month
]
MensCasualWear
:
HierarchyLevel
[
levelBelongsToThis
=
Menswear
]
[
no
spreadsToLowerLevel
]
[
no
aggregatesToHigherLevel
]
MensSportsWear
:
HierarchyLevel
[
levelBelongsToThis
=
Menswear
]
[
no
spreadsToLowerLevel
]
[
no
aggregatesToHigherLevel
]
enum
VersionAbbreviation =
Op
|
Cp
|
Wp
|
Ly
|
Wa
|
Tgt
abstract
plan
PlanCreatedBy
->
planningRole
+
versionAbbreviation
->
VersionAbbreviation
xor
retailChannels
store
internet
// planSeenInTheFollowingViews -> view +
catalog
abstract
WorkingPlan
:
plan
[
versionAbbreviation
=
Wp
]
seeded
?
seedingSource
->
LastYear
lastSeedingDate
:
string
seededWithThoseInstances
->
HierarchyLevelInstance
*
abstract
OriginalPlan
:
plan
[
versionAbbreviation
=
Op
]
abstract
CurrentPlan
:
plan
[
versionAbbreviation
=
Cp
]
abstract
LastYear
:
plan
[
versionAbbreviation
=
Ly
]
abstract
TargetPlan
:
plan
[
versionAbbreviation
=
Tgt
]
composedOf
->
Target
+
abstract
WaitingForApproval
:
plan
[
versionAbbreviation
=
Wa
]
WorkingPlan2012
:
WorkingPlan
[
PlanCreatedBy
=
ExecutiveManager
,
PlanningDirector
,
MerchandisePlanner
]
[
seeded
]
[
retailChannels
.
internet
]
TargetPlan2012
:
TargetPlan
[
PlanCreatedBy
=
ExecutiveManager
,
PlanningDirector
,
MerchandisePlanner
]
[
composedOf
=
TopDownSalesTargets2012
,
MiddleOutMarkdownTargets2012
]
[
retailChannels
.
internet
]
OriginalPlan2012
:
OriginalPlan
[
PlanCreatedBy
=
MerchandisePlanner
]
[
retailChannels
.
store
]
// planSeenInTheFollowingViews = 2012PlanningView
abstract
metric
xor
metricName
xor
sales
regularSales
// planSeenInTheFollowingViews = Targets2012PlanningView
promotionalSales
clearanceSales
xor
markdown
regularMarkdown
// planSeenInTheFollowingViews = Targets2012ReviewView
promotionalMarkdown
permenantMarkdown
turn
receipts
inventory
grossMargin
openToBuy
sales2011
:
metric
[
regularSales
]
markdown2011
:
metric
[
promotionalMarkdown
]
enum
PlanningRoleLevel =
TopDown
|
MiddleOut
|
BottomUp
abstract
planningRole
roleLevel
->
PlanningRoleLevel
roleCreatedTheFollowingPlans
->
plan
+
roleCreatedTheFollowingTargets
->
Target
*
[
roleLevel
=
BottomUp
=>
no
roleCreatedTheFollowingTargets
]
//***************** Concrete Clafers ******************
roleReceivesTheFollowingTargets
->
Target
*
[
roleLevel
=
TopDown
=>
no
roleReceivesTheFollowingTargets
]
RoleSeesTheFollowingViews
->
view
+
roleEditsTheFollowingMeasures
->
Measure
*
PlanningDirector
:
planningRole
[
roleLevel
=
MiddleOut
]
[
roleCreatedTheFollowingPlans
=
WorkingPlan2012
,
TargetPlan2012
]
[
roleCreatedTheFollowingTargets
=
MiddleOutMarkdownTargets2012
]
[
roleReceivesTheFollowingTargets
=
TopDownSalesTargets2012
]
[
RoleSeesTheFollowingViews
=
Targets2012ApprovalView
,
Targets2012ReviewView
]
ExecutiveManager
:
planningRole
[
roleLevel
=
TopDown
]
[
roleCreatedTheFollowingPlans
=
WorkingPlan2012
,
TargetPlan2012
]
[
roleCreatedTheFollowingTargets
=
TopDownSalesTargets2012
]
[
no
roleReceivesTheFollowingTargets
]
[
RoleSeesTheFollowingViews
=
Targets2012PlanningView
,
Targets2012ReviewView
]
MerchandisePlanner
:
planningRole
[
roleLevel
=
BottomUp
]
[
roleCreatedTheFollowingPlans
=
WorkingPlan2012
,
OriginalPlan2012
]
[
no
roleCreatedTheFollowingTargets
]
[
roleReceivesTheFollowingTargets
=
MiddleOutMarkdownTargets2012
]
[
RoleSeesTheFollowingViews
=
Targets2012ReviewView
]
abstract
Target
belongsTo
->
TargetPlan
createdBy
->
planningRole
[
! createdBy.
roleLevel
=
BottomUp
]
publishedTo
->
planningRole
[
createdBy
.
roleLevel
=
TopDown
=>
publishedTo
.
roleLevel
=
MiddleOut
]
[
createdBy
.
roleLevel
=
MiddleOut
=>
publishedTo
.
roleLevel
=
BottomUp
]
TopDownSalesTargets2012
:
Target
[
belongsTo
=
TargetPlan2012
]
[
createdBy
=
ExecutiveManager
]
[
publishedTo
=
PlanningDirector
]
MiddleOutMarkdownTargets2012
:
Target
// BottomUp roles can't create Targets
[
belongsTo
=
TargetPlan2012
]
[
createdBy
=
PlanningDirector
]
[
publishedTo
=
MerchandisePlanner
]
abstract
workflow
belongsToThisSystem
->
MFPsystem
xor
workflowPlanningSeason
//**************** Concrete Clafers *******************
preSeasonPlanning
inSeasonPlanning
proceededBy
->
workflow
?
[
proceededBy
!=
workflow
]
followedBy
->
workflow
?
[
followedBy
!=
workflow
]
[
all v
:
workflow
|
v
.
workflowPlanningSeason
.
preSeasonPlanning
=>
no
proceededBy
]
[
all v
:
workflow
|
v
.
workflowPlanningSeason
.
preSeasonPlanning
=>
v
.
followedBy
.
workflowPlanningSeason
.
inSeasonPlanning
]
[
all v
:
workflow
|
v
.
workflowPlanningSeason
.
inSeasonPlanning
=>
no
followedBy
]
[
all v
:
workflow
|
v
.
workflowPlanningSeason
.
inSeasonPlanning
=>
v
.
proceededBy
.
workflowPlanningSeason
.
preSeasonPlanning
]
views
->
view
+
//if I want to say can't be proceeded by the same workflow.
PreSeasonTargetSettingWorkflow
:
workflow
//if I want to say can't be followed by the same workflow instance.
[
belongsToThisSystem
=
Oracle
]
[
workflowPlanningSeason
.
preSeasonPlanning
]
[
no
proceededBy
]
[
followedBy
=
InSeasonTargetSettingWorkflow
]
[
views
=
Targets2012PlanningView
,
Targets2012ApprovalView
]
// The following two constraints ensure that in-season is proceeded by pre-season and isn't followed by anything.
InSeasonTargetSettingWorkflow
:
workflow
[
belongsToThisSystem
=
Oracle
]
[
workflowPlanningSeason
.
inSeasonPlanning
]
[
proceededBy
=
PreSeasonTargetSettingWorkflow
]
[
no
followedBy
]
[
views
=
Targets2012ReviewView
]
abstract
view
viewBelongsTo
->
workflow
xor
visibility
specificRole
->
planningRole
[
viewBelongsTo
.
workflowPlanningSeason
.
inSeasonPlanning
=> !
specificRole
.
roleLevel
=
TopDown
]
allRoles
roles
->
planningRole
* =
planningRole
measures
->
Measure
+
planversion
->
plan
[
viewBelongsTo
.
workflowPlanningSeason
.
inSeasonPlanning
=> !
planversion
=
WaitingForApproval
||
planversion
=
LastYear
]
xor
viewType
Approval
[
specificRole
.
roleLevel
=
MiddleOut
]
[
planversion
=
WaitingForApproval
]
[
viewBelongsTo
.
workflowPlanningSeason
.
preSeasonPlanning
]
Seeding
[
viewBelongsTo
.
workflowPlanningSeason
.
preSeasonPlanning
]
[
specificRole
.
roleLevel
=
TopDown
||
specificRole
.
roleLevel
=
MiddleOut
]
[
planversion
=
WorkingPlan
]
Review
Planning
Targets2012PlanningView
:
view
[
viewBelongsTo
=
PreSeasonTargetSettingWorkflow
]
[
specificRole
=
ExecutiveManager
]
[
measures
=
LyMarkdown
,
TgtSales
]
[
planversion
=
TargetPlan2012
]
[
viewType
.
Planning
]
Targets2012ApprovalView
:
view
[
viewBelongsTo
=
PreSeasonTargetSettingWorkflow
]
[
specificRole
=
PlanningDirector
]
[
measures
=
LyMarkdown
]
[
planversion
=
TargetPlan2012
]
[
viewType
.
Approval
]
Targets2012ReviewView
:
view
[
viewBelongsTo
=
InSeasonTargetSettingWorkflow
]
[
allRoles
]
[
measures
=
TgtSales
]
[
planversion
=
OriginalPlan2012
]
[
viewType
.
Review
]
//***************** Concrete Clafers ******************
abstract
Measure
belongsTo
->
view
+
measureMetric
->
metric
or
unitOfMeasure
amount
percentage
measureBelongsToThisPlan
->
plan
xor
measureType
referenceMeasure
nonReferenceMeasure
editedBy
->
planningRole
?
derivedByAnotherMeasures
?
derivedByTheseMeasures
->
Measure
+
derivedByThisRule
->
Rule
derivesOtherMeasures
?
derivesTheseMeasures
->
Measure
+
// A measure belongs to one or more views.
derivesUsingThisRule
->
Rule
TgtSales
:
Measure
[
belongsTo
=
Targets2012PlanningView
,
Targets2012ReviewView
]
[
measureMetric
=
sales2011
]
[
amount
]
[
measureBelongsToThisPlan
=
TargetPlan2012
]
[
nonReferenceMeasure
]
LyMarkdown
:
Measure
[
belongsTo
=
Targets2012PlanningView
,
Targets2012ApprovalView
]
[
measureMetric
=
markdown2011
]
[
percentage
]
[
measureBelongsToThisPlan
=
TargetPlan2012
]
[
referenceMeasure
]
abstract
Rule
RelatedMeasure
->
Measure
*
//***************** Concrete Clafers ******************
[
this
.
derivedByAnotherMeasures
.
derivedByThisRule
= Rule ||
this
.
derivesOtherMeasures
.
derivesUsingThisRule
= Rule
]