From 2f841fb68d79b4276da8ebabee845cc7f961ffb9 Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期四, 16 五月 2024 11:33:02 +0800
Subject: [PATCH] 发动机匹配

---
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_OnOK.def                                              |   15 
 _Main/BL/InfoMessages.qbl                                                                                                         |   43 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlActions.def                                     |   40 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Component_listContextMenu852.def                                                    |   69 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlContent.def                                       |  113 ++
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mSelectAll_OnClick.def                                |   17 
 _Main/BL/Type_SixDigitCode/Attribute_Power.qbl                                                                                    |    8 
 _Main/BL/Relations/Relation_PR_PP_Budget_MacroPlan_MacroPlan_PR_PP_Budget.qbl                                                     |   23 
 _Main/BL/Type_SixDigitCode/_ROOT_Type_SixDigitCode.qbl                                                                            |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mDelete_OnClick.def                                       |   19 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnOk_OnClick.def                          |   31 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bExport_OnClick.def                                                |   12 
 _Main/BL/Type_PR_PP_Budget/Attribute_VehicleModel.qbl                                                                             |    8 
 _Main/BL/Type_SixDigitCode/Attribute_Remarks.qbl                                                                                  |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnOk_OnClick.def                          |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_Edit.def                                                |   16 
 _Main/BL/Type_Product_MP/_ROOT_Type_Product_MP.qbl                                                                                |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mDelete_OnClick.def                                   |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bExport_OnClick.def                                   |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mNew_OnClick.def                                      |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlActions.def                                       |   40 
 _Main/UI/MacroPlannerWebApp/Views/PR_PP_Budget.vw                                                                                 |  146 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlEnginePartNumber_OnSelectionChanged.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mNew_OnClick.def                                                   |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pContent#925.def                                                 |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlContent.def                                     |   36 
 _Main/BL/Type_PR_PP_Budget/Attribute_Engine.qbl                                                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mDelete_OnClick.def                                                |   19 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnCancel_OnClick.def                      |   15 
 _Main/UI/MacroPlannerWebApp/Component_Form989/_ROOT_Component_FormThreeDigitCode#989.def                                          |   18 
 _Main/BL/Relations/Relation_ThreeDigitCode_MacroPlan_MacroPlan_ThreeDigitCode.qbl                                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_List531.def                                                      |   59 +
 _Main/BL/Relations/_ROOT_Relations.qbl                                                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlContent.def                                       |  125 ++
 _Main/BL/Type_PR_PP_Budget/StaticMethod_ValidateInput.qbl                                                                         |   45 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def                                       |   12 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlVehicleModel_OnSelectionChanged.def     |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mEdit_OnClick.def                                         |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mSelectAll_OnClick.def                                    |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listContextMenu852.def                                           |   69 +
 _Main/BL/Type_ThreeDigitCode/_ROOT_Type_ThreeDigitCode.qbl                                                                        |    9 
 _Main/BL/Type_DMF_CustomLogic/_ROOT_Type_DMF_CustomLogic.qbl                                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Component_listActionBarPage453.def                                                  |   10 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mSelectAll_OnClick.def                                             |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listContextMenu852#1.def                                         |   69 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_Edit.def                                                |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_New.def                                                 |   14 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmEngineMatching.def                                      |   46 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_List531#836.def                                                  |   59 +
 _Main/UI/MacroPlannerWebApp/Views/SixDigitCode.vw                                                                                 |  244 ++++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/_ROOT_Component_DialogCreateEditSixDigitCode.def               |   31 
 _Main/BL/Relations/Relation_SixDigitCode_MacroPlan_MacroPlan_SixDigitCode.qbl                                                     |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/_ROOT_Component_FormPR_PP_Budget.def                                       |   18 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Component_pContent.def                                                              |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listActionBarPage453.def                                         |   10 
 _Main/BL/Type_SixDigitCode/Attribute_EnginePartNumber.qbl                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_New.def                                               |   14 
 _Main/BL/Type_PR_PP_Budget/Attribute_EngineFourDigitCode.qbl                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mNew_OnClick.def                                          |   23 
 _Main/BL/Type_SalesSegment_MP/_ROOT_Type_SalesSegment_MP.qbl                                                                      |    6 
 _Main/BL/Type_MacroPlan/_ROOT_Type_MacroPlan.qbl                                                                                  |    6 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m3DigitCode_OnClick.def      |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnOk_OnClick.def                        |   15 
 _Main/BL/Dataset_Archive/_ROOT_Dataset_Archive.qbl                                                                                |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listActionBarPage453#1.def                                       |   10 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mEdit_OnClick.def                                                  |   21 
 _Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl                                                                               |   58 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/_ROOT_Component_DialogCreateEditThreeDigitCode.def           |   31 
 _Main/BL/Type_SixDigitCode/Attribute_Code.qbl                                                                                     |    8 
 _Main/BL/Type_ThreeDigitCode/Attribute_Code.qbl                                                                                   |    8 
 _Main/BL/Type_PR_PP_Budget/Attribute_EnginePartNumber.qbl                                                                         |    8 
 _Main/BL/Type_SixDigitCode/Attribute_ProducingArea.qbl                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Component_pHeader.def                                                               |   36 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def                                   |   12 
 _Main/BL/Type_Archive/StaticMethod_OnServerStartup.qbl                                                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/_ROOT_Component_FormSixDigitCode.def                                       |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_New.def                                                 |   14 
 .gitignore                                                                                                                        |   42 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_Edit.def                                              |   16 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m6DigitCode_OnClick.def      |   16 
 _Main/BL/Type_SixDigitCode/Attribute_Engine.qbl                                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnCancel_OnClick.def                    |   15 
 _Main/BL/Type_ThreeDigitCode/Attribute_VehicleModel.qbl                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_OnOK.def                                                |   20 
 _Main/BL/Type_SixDigitCode/Attribute_Curve.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pContent.def                                                     |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnCancel_OnClick.def                      |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlActions.def                                       |   40 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Component_List531.def                                                               |   59 +
 _Main/BL/Type_PR_PP_Budget/StaticMethod_Download.qbl                                                                              |   44 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                         |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_OnOK.def                                                |   15 
 _Main/BL/Type_SixDigitCode/Attribute_EngineFourDigitCode.qbl                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageSales.def                                    |    8 
 _Main/BL/Type_SixDigitCode/Attribute_VehicleModel.qbl                                                                             |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pHeader.def                                                      |   36 
 _Main/UI/MacroPlannerWebApp/Views/ThreeDigitCode.vw                                                                               |  181 +++
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pHeader#393.def                                                  |   36 
 _Main/BL/Type_PR_PP_Budget/StaticMethod_ExportCreateCell.qbl                                                                      |   15 
 _Main/BL/Type_Archive/_ROOT_Type_Archive.qbl                                                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/_ROOT_Component_DialogCreateEditPR_PP_Budget.def               |   43 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mEdit_OnClick.def                                     |   21 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def                                                |   12 
 _Main/BL/Type_PR_PP_Budget/Attribute_ProducingArea.qbl                                                                            |    8 
 _Main/BL/Type_PR_PP_Budget/Attribute_Model.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_mPR_PP_Budget_OnClick.def    |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bExport_OnClick.def                                       |   22 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgRequirementPreprocessing.def                           |   29 
 _Main/BL/Type_PR_PP_Budget/Attribute_ModelCode.qbl                                                                                |    7 
 _Main/BL/Type_PR_PP_Budget/_ROOT_Type_PR_PP_Budget.qbl                                                                            |    9 
 110 files changed, 2,972 insertions(+), 9 deletions(-)

diff --git a/.gitignore b/.gitignore
index 32858aa..d3a0bd1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,36 @@
-*.class
+# Specifies files or directories that the Git version control system should not track.
+# You can add model-specific ignore rules, e.g. to exclude large or frequently updated binary files.
+# For the format of .gitignore rules, refer to the Quintiq version control documentation or search the internet; it is a standard Git feature.
 
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
+# Do not store these settings in version control, they are machine/user specific
+**/Settings/UserSettings/**
+Local*.properties
 
-# Package Files #
-*.jar
-*.war
-*.ear
+# Excel files will quickly let repository sizes grow out of control.
 
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
+# The lock file is created/used by Quintiq components to synchronize which component can write to the model; it does not need to be in version control.
+/Lock
+# Files commonly left behind by merge tools or text editors (if not configured to clean up those files)
+*.rej
+*.orig
+*.bak
+*.tmp
+*.qdataset
+
+**/Settings/UserLibSettings/**
+
+**/UserSettings/**
+**/LibUserSettings/**
+
+/.idea
+_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
+#*.properties
+_var/_Main/ProjSettings/MacroPlanner/Views/Empty__dialog_initialization__\[124808.0.140900041\].vw
+_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
+_var/_Main/Data/.keep
+
+_var/_Main/LibProjSettings/LibSCIIntegration/LibSCIIntegrationWeb/ColSch
+_var/_Main/LibProjSettings/LibMacroPlannerIntegration/LibMacroPlannerIntegration/ColSch
+_var/_Main/ProjSettings/MacroPlannerWebApp/ColSch
+
+_var/_Main/ProjSettings/MacroPlannerWebApp/Views/
\ No newline at end of file
diff --git a/_Main/BL/Dataset_Archive/_ROOT_Dataset_Archive.qbl b/_Main/BL/Dataset_Archive/_ROOT_Dataset_Archive.qbl
new file mode 100644
index 0000000..e7f57f6
--- /dev/null
+++ b/_Main/BL/Dataset_Archive/_ROOT_Dataset_Archive.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Dataset Archive
+{
+  #keys: '2[413988.0.1153445593][413988.0.1153445592]'
+  DefaultMDSName: 'Archive'
+  InstanceType: Archive
+}
diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
new file mode 100644
index 0000000..220018c
--- /dev/null
+++ b/_Main/BL/InfoMessages.qbl
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#parent: #root
+InfoMessages id:#InfoMessages #extension
+{
+  InfoMessage A_VWED_PR_PP_Budget_VerificationRules1 (
+    const String fieldName
+  )
+  {
+    DefaultText: 'Missing mandatory field锛欯fieldName@'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_Engine
+  {
+    DefaultText: 'Engine'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_EnginePartNumber
+  {
+    DefaultText: 'Engine Part Number'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_Model
+  {
+    DefaultText: 'Model'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_ModelCode
+  {
+    DefaultText: 'Model Code'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_VehicleModel
+  {
+    DefaultText: 'Vehicle Model'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_VerificationRules2
+  {
+    DefaultText: 'Car model and system Sales Segments do not match'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_VerificationRules3
+  {
+    DefaultText: 'The engine part number does not match the system Products'
+  }
+  InfoMessage A_VWED_PR_PP_Budget_VerificationRules4
+  {
+    DefaultText: 'The vehicle model, engine part number, and existing data do not match'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_PR_PP_Budget_MacroPlan_MacroPlan_PR_PP_Budget.qbl b/_Main/BL/Relations/Relation_PR_PP_Budget_MacroPlan_MacroPlan_PR_PP_Budget.qbl
new file mode 100644
index 0000000..42fc2bd
--- /dev/null
+++ b/_Main/BL/Relations/Relation_PR_PP_Budget_MacroPlan_MacroPlan_PR_PP_Budget.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation PR_PP_Budget_MacroPlan_MacroPlan_PR_PP_Budget
+{
+  #keys: '1[413988.0.1140900048]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1140900050][413988.0.1140900049][413988.0.1140900051]'
+    Cardinality: '0to1'
+    ObjectDefinition: PR_PP_Budget
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide PR_PP_Budget
+  {
+    #keys: '3[413988.0.1140900053][413988.0.1140900052][413988.0.1140900054]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_SixDigitCode_MacroPlan_MacroPlan_SixDigitCode.qbl b/_Main/BL/Relations/Relation_SixDigitCode_MacroPlan_MacroPlan_SixDigitCode.qbl
new file mode 100644
index 0000000..cb38985
--- /dev/null
+++ b/_Main/BL/Relations/Relation_SixDigitCode_MacroPlan_MacroPlan_SixDigitCode.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation SixDigitCode_MacroPlan_MacroPlan_SixDigitCode
+{
+  #keys: '1[413988.0.1141654607]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1141654609][413988.0.1141654608][413988.0.1141654610]'
+    Cardinality: '0to1'
+    ObjectDefinition: SixDigitCode
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide SixDigitCode
+  {
+    #keys: '3[413988.0.1141654612][413988.0.1141654611][413988.0.1141654613]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ThreeDigitCode_MacroPlan_MacroPlan_ThreeDigitCode.qbl b/_Main/BL/Relations/Relation_ThreeDigitCode_MacroPlan_MacroPlan_ThreeDigitCode.qbl
new file mode 100644
index 0000000..b46b0e2
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ThreeDigitCode_MacroPlan_MacroPlan_ThreeDigitCode.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ThreeDigitCode_MacroPlan_MacroPlan_ThreeDigitCode
+{
+  #keys: '1[413988.0.1146011023]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1146011025][413988.0.1146011024][413988.0.1146011026]'
+    Cardinality: '0to1'
+    ObjectDefinition: ThreeDigitCode
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ThreeDigitCode
+  {
+    #keys: '3[413988.0.1146011028][413988.0.1146011027][413988.0.1146011029]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/_ROOT_Relations.qbl b/_Main/BL/Relations/_ROOT_Relations.qbl
new file mode 100644
index 0000000..ff1ff51
--- /dev/null
+++ b/_Main/BL/Relations/_ROOT_Relations.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Relations id:#Relations #extension
+{
+}
diff --git a/_Main/BL/Type_Archive/StaticMethod_OnServerStartup.qbl b/_Main/BL/Type_Archive/StaticMethod_OnServerStartup.qbl
new file mode 100644
index 0000000..3f79c19
--- /dev/null
+++ b/_Main/BL/Type_Archive/StaticMethod_OnServerStartup.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnServerStartup
+{
+  TextBody:
+  [*
+    // lihongji May-15-2024 (created)
+    folder := DomainModel::Domain().MDSFolderDefinitions().FindFolder( "/root" );
+    
+    datasetName := typeof( Archive ).Name();
+    
+    oinfo := MDSEditor::Editor().ObjectInfos( datasetName, folder.FolderID(), datasetName );
+    
+    o := select( oinfo, Elements, o, not o.IsLoaded() );
+    emptydataset := isnull( o );
+    
+    if ( emptydataset ) {
+      MDSArchive::CreateMDS( datasetName, DMF_Utility::GetStorageState() );
+    } else {
+      MDSArchive::LoadMDSAndConvert( o.MDSID(), DMF_Utility::GetStorageState() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Archive/_ROOT_Type_Archive.qbl b/_Main/BL/Type_Archive/_ROOT_Type_Archive.qbl
new file mode 100644
index 0000000..fe15069
--- /dev/null
+++ b/_Main/BL/Type_Archive/_ROOT_Type_Archive.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Archive
+{
+  #keys: '5[413988.0.1153445587][413988.0.1153445585][0.0.0][413988.0.1153445586][413988.0.1153445588]'
+  BaseType: Object
+  StructuredName: 'Archives'
+}
diff --git a/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
new file mode 100644
index 0000000..5202502
--- /dev/null
+++ b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
@@ -0,0 +1,58 @@
+Quintiq file version 2.0
+#parent: #root
+MethodOverride OnFinished #extension
+{
+  TextBody:
+  [*
+    // MODELING HANDLE
+    // The server will create a memory only dataset if the ODBC is not started before the server is started
+    //Enable / disable internal data depending on server startup mode
+    DomainModel::Domain().MDSStorageDefinitionManager().DatabaseEnabled( GlobalParameters_MP::IsFullStorageState() or
+                                                                         GlobalParameters_MP::IsPartialStorageState() or
+                                                                         GlobalParameters_MP::IsCachedStorageState() or
+                                                                         GlobalParameters_MP::IsHybridStorage() );
+    
+    // 鍒涘缓瀛樻。鏁版嵁闆�
+    Archive::OnServerStartup();
+    
+    // Create MPDomainHandler
+    MPDomainHandler::OnServerStartup();
+    
+    // Create datasets for DataExchangeFramework, ideally it should be done before loading MacroPlans.
+    LibDEF_API::OnServerStartup();
+    // 3DSpace library, on top of DEF
+    LibInt_IntegratorProxy::InitializeIntegrationLibrary();
+    integratorConfig := select( DomainModel::Domain(), IntegratorConfigManager.IntegratorConfigurations, ic, true );
+    Lib3DS_API::Initialize( integratorConfig.Name() );
+    
+    // Create ScenarioManager
+    ScenarioManager::OnServerStartUp();
+    
+    // Create a MemoryOnly-dataset that is used to receive SOAP-calls from the DataManager.
+    MDSScenarioManager::CreateMemoryOnlyMDS( ScenarioManager::GetDatasetNameReceiver() );
+    
+    // Create dataset for MPSync on startup.
+    MPSync::OnServerStartUp();
+    
+    // Create dataset for S&OP Workflow
+    SWF_WorkflowDataset::OnServerStartup( GlobalParameters_MP::GetStorageState(), 
+                                          SWF_Utility::MDSName_WorkflowDatatset() );
+    
+    // Create Communicaiton dataset
+    SWF_CommunicationDataset::OnServerStartup( GlobalParameters_MP::GetStorageState(), 
+                                               SWF_Utility::MDSKind_CommunicationDataset() );
+    // Create or load a dataset for the UnitTestFramework
+    LibUTF::OnServerStartup( MDSInterface::MemoryOnlyState() );
+    
+    LibInt_IntegratorProxy::InitializeIntegrationLibrary();
+    KpiTracker::OnServerStartup();
+    
+    this.OnFinishedCustom();
+    
+    // Create or load a dataset for the Monitoring Library
+    LibMon_Monitor::OnServerStartup( MDSInterface::MemoryOnlyState() ); 
+    smangerOption := DatasetFindOptions::Construct().Kind( typeof( ScenarioManager ).ShortName() );
+    smDataset := MDSScenarioManager::Find( smangerOption );
+    smDataset->LibMon_CollectInfo();
+  *]
+}
diff --git a/_Main/BL/Type_DMF_CustomLogic/_ROOT_Type_DMF_CustomLogic.qbl b/_Main/BL/Type_DMF_CustomLogic/_ROOT_Type_DMF_CustomLogic.qbl
new file mode 100644
index 0000000..00963f9
--- /dev/null
+++ b/_Main/BL/Type_DMF_CustomLogic/_ROOT_Type_DMF_CustomLogic.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization DMF_CustomLogic #extension
+{
+}
diff --git a/_Main/BL/Type_MacroPlan/_ROOT_Type_MacroPlan.qbl b/_Main/BL/Type_MacroPlan/_ROOT_Type_MacroPlan.qbl
new file mode 100644
index 0000000..6ac381e
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/_ROOT_Type_MacroPlan.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MacroPlan #extension
+{
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_Engine.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_Engine.qbl
new file mode 100644
index 0000000..22e0c39
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_Engine.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Engine
+{
+  #keys: '3[413988.0.1140900087][413988.0.1140900086][413988.0.1140900088]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_EngineFourDigitCode.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_EngineFourDigitCode.qbl
new file mode 100644
index 0000000..0c8071e
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_EngineFourDigitCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineFourDigitCode
+{
+  #keys: '3[413988.0.1140900127][413988.0.1140900126][413988.0.1140900128]'
+  Description: '鍙戝姩鏈哄洓浣嶇爜'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_EnginePartNumber.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_EnginePartNumber.qbl
new file mode 100644
index 0000000..a2baa5f
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_EnginePartNumber.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EnginePartNumber
+{
+  #keys: '3[413988.0.1140900117][413988.0.1140900116][413988.0.1140900118]'
+  Description: '鍙戝姩鏈洪浂浠跺彿'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_Model.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_Model.qbl
new file mode 100644
index 0000000..2607b37
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_Model.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Model
+{
+  #keys: '3[413988.0.1140900067][413988.0.1140900066][413988.0.1140900068]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_ModelCode.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_ModelCode.qbl
new file mode 100644
index 0000000..046e05d
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_ModelCode.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ModelCode
+{
+  #keys: '3[413988.0.1140900077][413988.0.1140900076][413988.0.1140900078]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_ProducingArea.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_ProducingArea.qbl
new file mode 100644
index 0000000..1e4d56b
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_ProducingArea.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProducingArea
+{
+  #keys: '3[413988.0.1140900097][413988.0.1140900096][413988.0.1140900098]'
+  Description: '浜у湴'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/Attribute_VehicleModel.qbl b/_Main/BL/Type_PR_PP_Budget/Attribute_VehicleModel.qbl
new file mode 100644
index 0000000..457350c
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/Attribute_VehicleModel.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VehicleModel
+{
+  #keys: '3[413988.0.1140900107][413988.0.1140900106][413988.0.1140900108]'
+  Description: '杞﹀瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/StaticMethod_Download.qbl b/_Main/BL/Type_PR_PP_Budget/StaticMethod_Download.qbl
new file mode 100644
index 0000000..de2a8ce
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/StaticMethod_Download.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name><column><name>Model</name><type>String</type></column><column><name>Model Code</name><type>String</type></column><column><name>Engine</name><type>String</type></column><column><name>浜у湴</name><type>String</type></column><column><name>杞﹀瀷</name><type>String</type></column><column><name>鍙戝姩鏈洪浂浠跺彿</name><type>String</type></column><column><name>鍙戝姩鏈哄洓浣嶇爜</name><type>String</type></column></table>' );
+    
+    tableElement              := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    modelColumn               := tableElement.GetElementByTagName( "column", 0 ); // Model
+    modelCodeColumn           := tableElement.GetElementByTagName( "column", 1 ); // Model Code
+    engineColumn              := tableElement.GetElementByTagName( "column", 2 ); // Engine
+    productingAreaColumn      := tableElement.GetElementByTagName( "column", 3 ); // 浜у湴
+    vehicleModelColumn        := tableElement.GetElementByTagName( "column", 4 ); // 杞﹀瀷
+    enginePartNumberColumn    := tableElement.GetElementByTagName( "column", 5 ); // 鍙戝姩鏈洪浂浠跺彿
+    engineFourDigitCodeColumn := tableElement.GetElementByTagName( "column", 6 ); // 鍙戝姩鏈哄洓浣嶇爜
+    
+    traverse ( macroPlan, PR_PP_Budget, prppb ) {
+      PR_PP_Budget::ExportCreateCell( xmlDOM, modelColumn, prppb.Model() );                             // Model
+      PR_PP_Budget::ExportCreateCell( xmlDOM, modelCodeColumn, prppb.ModelCode() );                     // Model Code
+      PR_PP_Budget::ExportCreateCell( xmlDOM, engineColumn, prppb.Engine() );                           // Engine
+      PR_PP_Budget::ExportCreateCell( xmlDOM, productingAreaColumn, prppb.ProducingArea() );            // 浜у湴
+      PR_PP_Budget::ExportCreateCell( xmlDOM, vehicleModelColumn, prppb.VehicleModel() );               // 杞﹀瀷
+      PR_PP_Budget::ExportCreateCell( xmlDOM, enginePartNumberColumn, prppb.EnginePartNumber() );       // 鍙戝姩鏈洪浂浠跺彿
+      PR_PP_Budget::ExportCreateCell( xmlDOM, engineFourDigitCodeColumn, prppb.EngineFourDigitCode() ); // 鍙戝姩鏈哄洓浣嶇爜
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/StaticMethod_ExportCreateCell.qbl b/_Main/BL/Type_PR_PP_Budget/StaticMethod_ExportCreateCell.qbl
new file mode 100644
index 0000000..73774b9
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/StaticMethod_ExportCreateCell.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportCreateCell (
+  XMLDOMDocument xmlDOM,
+  XMLDOMElement column,
+  String value
+)
+{
+  TextBody:
+  [*
+    cell := xmlDOM.CreateElement( "cell" );
+    cell.SetAttribute( "value", value );
+    column.AppendChild( cell );
+  *]
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/StaticMethod_ValidateInput.qbl b/_Main/BL/Type_PR_PP_Budget/StaticMethod_ValidateInput.qbl
new file mode 100644
index 0000000..12b34c0
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/StaticMethod_ValidateInput.qbl
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ValidateInput (
+  output String feedback_o,
+  output String sanitycheckfeedback_o,
+  MacroPlan macroPlan,
+  String model,
+  String modelCode,
+  String engine,
+  String productingArea,
+  String vehicleModel,
+  String enginePartNumber,
+  String engineFourDigitCode,
+  PR_PP_Budget selection
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    // lihongji May-14-2024 (created)
+    feedback_o            := "";
+    sanitycheckfeedback_o := "";
+    
+    if ( model.TrimBoth() = "" or modelCode.TrimBoth() = "" or engine.TrimBoth() = "" or vehicleModel.TrimBoth() = "" or enginePartNumber = "" ) {
+      feedback_o            := ifexpr( model.TrimBoth() = "", Translations::A_VWED_PR_PP_Budget_Model() + "銆�", "" )                       +  
+                               ifexpr( modelCode.TrimBoth() = "", Translations::A_VWED_PR_PP_Budget_ModelCode() + "銆�", "" )               +
+                               ifexpr( engine.TrimBoth() = "", Translations::A_VWED_PR_PP_Budget_Engine() + "銆�", "" )                     +
+                               ifexpr( vehicleModel.TrimBoth() = "", Translations::A_VWED_PR_PP_Budget_VehicleModel() + "銆�", "" )         + 
+                               ifexpr( enginePartNumber.TrimBoth() = "", Translations::A_VWED_PR_PP_Budget_EnginePartNumber() + "銆�", "" );
+      feedback_o            := Translations::A_VWED_PR_PP_Budget_VerificationRules1( guard( feedback_o.SubString( 0, feedback_o.Length() - 1 ), "error" ) );
+      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryPlanningWarning();
+    } else if ( vehicleModel.TrimBoth() <> "" and not exists( macroPlan, SalesSegment_MP, tempSSMP, tempSSMP.Name() = vehicleModel ) ) {
+      feedback_o            := Translations::A_VWED_PR_PP_Budget_VerificationRules2();
+      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryPlanningWarning();
+    } else if ( enginePartNumber.TrimBoth() <> "" and not exists( macroPlan, Product_MP, tempPMP, tempPMP.ID() = enginePartNumber ) ) {
+      feedback_o            := Translations::A_VWED_PR_PP_Budget_VerificationRules3();
+      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryPlanningWarning();
+    } else if ( guard( select( macroPlan, PR_PP_Budget, tempPRPPB, tempPRPPB.Model() = model and tempPRPPB.ModelCode() = modelCode and tempPRPPB.Engine() = engine and tempPRPPB <> selection ).VehicleModel() <> vehicleModel.TrimBoth(), false )        or
+                guard( select( macroPlan, PR_PP_Budget, tempPRPPB, tempPRPPB.Model() = model and tempPRPPB.ModelCode() = modelCode and tempPRPPB.Engine() = engine and tempPRPPB <> selection ).EnginePartNumber() <> enginePartNumber.TrimBoth(), false) ) {
+      feedback_o            := Translations::A_VWED_PR_PP_Budget_VerificationRules4();
+      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryPlanningWarning();
+    }
+    
+    return feedback_o = "";
+  *]
+}
diff --git a/_Main/BL/Type_PR_PP_Budget/_ROOT_Type_PR_PP_Budget.qbl b/_Main/BL/Type_PR_PP_Budget/_ROOT_Type_PR_PP_Budget.qbl
new file mode 100644
index 0000000..f5d905d
--- /dev/null
+++ b/_Main/BL/Type_PR_PP_Budget/_ROOT_Type_PR_PP_Budget.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type PR_PP_Budget
+{
+  #keys: '5[413988.0.1140900045][413988.0.1140900043][0.0.0][413988.0.1140900044][413988.0.1140900046]'
+  BaseType: Object
+  StructuredName: 'PR_PP_Budgets'
+}
diff --git a/_Main/BL/Type_Product_MP/_ROOT_Type_Product_MP.qbl b/_Main/BL/Type_Product_MP/_ROOT_Type_Product_MP.qbl
new file mode 100644
index 0000000..69754d9
--- /dev/null
+++ b/_Main/BL/Type_Product_MP/_ROOT_Type_Product_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Product_MP #extension
+{
+}
diff --git a/_Main/BL/Type_SalesSegment_MP/_ROOT_Type_SalesSegment_MP.qbl b/_Main/BL/Type_SalesSegment_MP/_ROOT_Type_SalesSegment_MP.qbl
new file mode 100644
index 0000000..2fb1fb8
--- /dev/null
+++ b/_Main/BL/Type_SalesSegment_MP/_ROOT_Type_SalesSegment_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type SalesSegment_MP #extension
+{
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_Code.qbl b/_Main/BL/Type_SixDigitCode/Attribute_Code.qbl
new file mode 100644
index 0000000..a9f5213
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_Code.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Code
+{
+  #keys: '3[413988.0.1146000058][413988.0.1146000057][413988.0.1146000059]'
+  Description: '鍏綅鐮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_Curve.qbl b/_Main/BL/Type_SixDigitCode/Attribute_Curve.qbl
new file mode 100644
index 0000000..85e05e4
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_Curve.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Curve
+{
+  #keys: '3[413988.0.1141654626][413988.0.1141654625][413988.0.1141654627]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_Engine.qbl b/_Main/BL/Type_SixDigitCode/Attribute_Engine.qbl
new file mode 100644
index 0000000..90e017c
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_Engine.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Engine
+{
+  #keys: '3[413988.0.1141654656][413988.0.1141654655][413988.0.1141654657]'
+  Description: '鍙戝姩鏈�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_EngineFourDigitCode.qbl b/_Main/BL/Type_SixDigitCode/Attribute_EngineFourDigitCode.qbl
new file mode 100644
index 0000000..84821ed
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_EngineFourDigitCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineFourDigitCode
+{
+  #keys: '3[413988.0.1146000035][413988.0.1146000034][413988.0.1146000036]'
+  Description: '鍙戝姩鏈哄洓浣嶇爜'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_EnginePartNumber.qbl b/_Main/BL/Type_SixDigitCode/Attribute_EnginePartNumber.qbl
new file mode 100644
index 0000000..f21a7e1
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_EnginePartNumber.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EnginePartNumber
+{
+  #keys: '3[413988.0.1146000025][413988.0.1146000024][413988.0.1146000026]'
+  Description: '鍙戝姩鏈洪浂浠跺彿'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_Power.qbl b/_Main/BL/Type_SixDigitCode/Attribute_Power.qbl
new file mode 100644
index 0000000..fc3c4c5
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_Power.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Power
+{
+  #keys: '3[413988.0.1145944630][413988.0.1145944629][413988.0.1145944631]'
+  Description: '鍔熺巼'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_ProducingArea.qbl b/_Main/BL/Type_SixDigitCode/Attribute_ProducingArea.qbl
new file mode 100644
index 0000000..f5754cc
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_ProducingArea.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProducingArea
+{
+  #keys: '3[413988.0.1141654646][413988.0.1141654645][413988.0.1141654647]'
+  Description: '浜у湴'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_Remarks.qbl b/_Main/BL/Type_SixDigitCode/Attribute_Remarks.qbl
new file mode 100644
index 0000000..21f9ae2
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_Remarks.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Remarks
+{
+  #keys: '3[413988.0.1146000048][413988.0.1146000047][413988.0.1146000049]'
+  Description: '澶囨敞'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/Attribute_VehicleModel.qbl b/_Main/BL/Type_SixDigitCode/Attribute_VehicleModel.qbl
new file mode 100644
index 0000000..feabc8a
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/Attribute_VehicleModel.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VehicleModel
+{
+  #keys: '3[413988.0.1141654636][413988.0.1141654635][413988.0.1141654637]'
+  Description: '杞﹀瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SixDigitCode/_ROOT_Type_SixDigitCode.qbl b/_Main/BL/Type_SixDigitCode/_ROOT_Type_SixDigitCode.qbl
new file mode 100644
index 0000000..e80edeb
--- /dev/null
+++ b/_Main/BL/Type_SixDigitCode/_ROOT_Type_SixDigitCode.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type SixDigitCode
+{
+  #keys: '5[413988.0.1141654604][413988.0.1141654602][0.0.0][413988.0.1141654603][413988.0.1141654605]'
+  BaseType: Object
+  StructuredName: 'SixDigitCodes'
+}
diff --git a/_Main/BL/Type_ThreeDigitCode/Attribute_Code.qbl b/_Main/BL/Type_ThreeDigitCode/Attribute_Code.qbl
new file mode 100644
index 0000000..47be48e
--- /dev/null
+++ b/_Main/BL/Type_ThreeDigitCode/Attribute_Code.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Code
+{
+  #keys: '3[413988.0.1146011039][413988.0.1146011038][413988.0.1146011040]'
+  Description: '涓変綅鐮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ThreeDigitCode/Attribute_VehicleModel.qbl b/_Main/BL/Type_ThreeDigitCode/Attribute_VehicleModel.qbl
new file mode 100644
index 0000000..b65ccfb
--- /dev/null
+++ b/_Main/BL/Type_ThreeDigitCode/Attribute_VehicleModel.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VehicleModel
+{
+  #keys: '3[413988.0.1146011049][413988.0.1146011048][413988.0.1146011050]'
+  Description: '杞﹀瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ThreeDigitCode/_ROOT_Type_ThreeDigitCode.qbl b/_Main/BL/Type_ThreeDigitCode/_ROOT_Type_ThreeDigitCode.qbl
new file mode 100644
index 0000000..2a9091c
--- /dev/null
+++ b/_Main/BL/Type_ThreeDigitCode/_ROOT_Type_ThreeDigitCode.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ThreeDigitCode
+{
+  #keys: '5[413988.0.1146011020][413988.0.1146011018][0.0.0][413988.0.1146011019][413988.0.1146011021]'
+  BaseType: Object
+  StructuredName: 'ThreeDigitCodes'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageSales.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageSales.def
new file mode 100644
index 0000000..08c6546
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageSales.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component ActionBarPageSales #extension
+{
+  Children:
+  [
+    #child: abgRequirementPreprocessing
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgRequirementPreprocessing.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgRequirementPreprocessing.def
new file mode 100644
index 0000000..b4b4725
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgRequirementPreprocessing.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component abgRequirementPreprocessing
+{
+  #keys: '[413988.0.1139790760]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component bEngineMatching
+    {
+      #keys: '[413988.0.1139760887]'
+      BaseType: 'WebButton'
+      Children:
+      [
+        #child: cmEngineMatching
+      ]
+      Properties:
+      [
+        Image: 'INDUSTRIAL_ROBOT'
+        Label: 'Engine matching'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Category: 'Actions-3'
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmEngineMatching.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmEngineMatching.def
new file mode 100644
index 0000000..d0da2fb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmEngineMatching.def
@@ -0,0 +1,46 @@
+Quintiq file version 2.0
+Component cmEngineMatching
+{
+  #keys: '[413988.0.1141020488]'
+  BaseType: 'WebContextMenu'
+  Children:
+  [
+    Component mPR_PP_Budget
+    {
+      #keys: '[413988.0.1141020489]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'TAG'
+        Taborder: 0
+        Title: 'PR&PP&Budget'
+      ]
+    }
+    Component m6DigitCode
+    {
+      #keys: '[413988.0.1139722046]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'KEYBOARD_KEY_6'
+        Taborder: 1
+        Title: '6-digit code'
+      ]
+    }
+    Component m3DigitCode
+    {
+      #keys: '[413988.0.1139722069]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'KEYBOARD_KEY_3'
+        Taborder: 2
+        Title: '3-digit code'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m3DigitCode_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m3DigitCode_OnClick.def
new file mode 100644
index 0000000..1bc655a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m3DigitCode_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: cmEngineMatching/m3DigitCode
+Response OnClick () id:Response_MacroPlanner_cmEngineMatching_m3DigitCode_OnClick
+{
+  #keys: '[413988.0.1141220432]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "ThreeDigitCode", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m6DigitCode_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m6DigitCode_OnClick.def
new file mode 100644
index 0000000..c2ff182
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_m6DigitCode_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: cmEngineMatching/m6DigitCode
+Response OnClick () id:Response_MacroPlanner_cmEngineMatching_m6DigitCode_OnClick
+{
+  #keys: '[413988.0.1141349890]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "SixDigitCode", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_mPR_PP_Budget_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_mPR_PP_Budget_OnClick.def
new file mode 100644
index 0000000..d80ffd4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_cmEngineMatching_mPR_PP_Budget_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: cmEngineMatching/mPR_PP_Budget
+Response OnClick () id:Response_MacroPlanner_cmEngineMatching_mPR_PP_Budget_OnClick
+{
+  #keys: '[413988.0.1141011461]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "PR_PP_Budget", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 719ed35..075a217 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -10,6 +10,7 @@
       Children:
       [
         #child: ActionBarPageData
+        #child: ActionBarPageSales
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlActions.def
new file mode 100644
index 0000000..13779a3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1141931967]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1141931971]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1141931973]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlContent.def
new file mode 100644
index 0000000..fb37708
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Component_pnlContent.def
@@ -0,0 +1,125 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1141931965]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efModel
+    {
+      #keys: '[413988.0.1143411690]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Model'
+        Label: 'Model'
+        Taborder: 0
+      ]
+    }
+    Component efModelCode
+    {
+      #keys: '[413988.0.1143411710]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ModelCode'
+        Label: 'Model Code'
+        Taborder: 1
+      ]
+    }
+    Component efEngine
+    {
+      #keys: '[413988.0.1143411712]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Engine'
+        Label: 'Engine'
+        Taborder: 2
+      ]
+    }
+    Component efProducingArea
+    {
+      #keys: '[413988.0.1143411714]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ProducingArea'
+        Enabled: false
+        Label: 'Producing Area'
+        Taborder: 3
+      ]
+    }
+    Component efEngineFourDigitCode
+    {
+      #keys: '[413988.0.1143411720]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.EngineFourDigitCode'
+        Enabled: false
+        Label: 'Engine Four Digit Code'
+        Taborder: 6
+      ]
+    }
+    Component ddlEnginePartNumber
+    {
+      #keys: '[413988.0.1154740853]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Product_MP'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[413988.0.1154740855]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'Product_MP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'ID'
+        Label: 'Engine Part Number'
+        Taborder: 5
+      ]
+    }
+    Component ddlVehicleModel
+    {
+      #keys: '[413988.0.1156632659]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'SalesSegment_MP'
+      Children:
+      [
+        Component deContent199
+        {
+          #keys: '[413988.0.1156632661]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'SalesSegment_MP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: 'Vehicle Model'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_Edit.def
new file mode 100644
index 0000000..60d3a7a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_Edit.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  PR_PP_Budget selection
+) id:Method_DialogCreateEditPR_PP_Budget_Edit
+{
+  #keys: '[413988.0.1144540442]'
+  Body:
+  [*
+    data := shadow( selection );
+    
+    ssmp := select( MacroPlan, SalesSegment_MP, tempSSMP, tempSSMP.Name() = selection.VehicleModel() );
+    ddlVehicleModel.Data( ssmp );
+    
+    pmp  := select( MacroPlan, Product_MP, tempPMP, tempPMP.ID() = selection.EnginePartNumber() );
+    ddlEnginePartNumber.Data( pmp );
+    
+    DataHolderDialogData.Data( &data );
+    dhSelectionPR_PP_Budget.Data( selection );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_New.def
new file mode 100644
index 0000000..3926351
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_New.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method New () id:Method_DialogCreateEditPR_PP_Budget_New
+{
+  #keys: '[413988.0.1141932163]'
+  Body:
+  [*
+    data := MacroPlan.PR_PP_Budget( relshadow );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_OnOK.def
new file mode 100644
index 0000000..247400a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Method_OnOK.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogCreateEditPR_PP_Budget_OnOK
+{
+  #keys: '[413988.0.1143412444]'
+  Body:
+  [*
+    // On ok
+    Form.ApplyChanges();
+    
+    data := DataHolderDialogData.Data();
+    
+    data.VehicleModel( guard( ddlVehicleModel.Data().Name(), "" ) );
+    data.EnginePartNumber( guard( ddlEnginePartNumber.Data().ID(), "" ) );
+    
+    data.Commit();
+    
+    Form.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..8ce843e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[413988.0.1141931977]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..0e9b2f2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1141931976]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    sanitycheckfeedback := '';
+    return PR_PP_Budget::ValidateInput( feedback,
+                                        sanitycheckfeedback,
+                                        MacroPlan,
+                                        efModel.Text(),
+                                        efModelCode.Text(),
+                                        efEngine.Text(),
+                                        efProducingArea.Text(),
+                                        ddlVehicleModel.Data().Name(),
+                                        ddlEnginePartNumber.Data().ID(),
+                                        efEngineFourDigitCode.Text(),
+                                        dhSelectionPR_PP_Budget.Data() );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      // On ok
+      Form.OnOK();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlEnginePartNumber_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlEnginePartNumber_OnSelectionChanged.def
new file mode 100644
index 0000000..b1a7900
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlEnginePartNumber_OnSelectionChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: pnlContent/ddlEnginePartNumber
+Response OnSelectionChanged () id:Response_pnlContent_ddlEnginePartNumber_OnSelectionChanged
+{
+  #keys: '[413988.0.1156661093]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      efEngineFourDigitCode.Text( guard( this.Data().Notes(), "" ) );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlVehicleModel_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlVehicleModel_OnSelectionChanged.def
new file mode 100644
index 0000000..007efcd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/Response_pnlContent_ddlVehicleModel_OnSelectionChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: pnlContent/ddlVehicleModel
+Response OnSelectionChanged () id:Response_pnlContent_ddlVehicleModel_OnSelectionChanged
+{
+  #keys: '[413988.0.1156813119]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      efProducingArea.Text( guard( this.Data().Parent().Parent().Name(), "" ) );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/_ROOT_Component_DialogCreateEditPR_PP_Budget.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/_ROOT_Component_DialogCreateEditPR_PP_Budget.def
new file mode 100644
index 0000000..deda280
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPR_PP_Budget/_ROOT_Component_DialogCreateEditPR_PP_Budget.def
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditPR_PP_Budget
+{
+  #keys: '[413988.0.1141931963]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderDialogData
+    {
+      #keys: '[413988.0.1141932924]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[PR_PP_Budget]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhSelectionPR_PP_Budget
+    {
+      #keys: '[413988.0.1155802684]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'PR_PP_Budget'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    MinimumColumns: 50
+    Padding: 'false'
+    Title: 'PR_PP_Budget'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlActions.def
new file mode 100644
index 0000000..0b80965
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1148570670]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1148570674]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1148570676]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlContent.def
new file mode 100644
index 0000000..17b8dc0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Component_pnlContent.def
@@ -0,0 +1,113 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1148570668]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efCode
+    {
+      #keys: '[413988.0.1148720681]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Code'
+        Label: 'Code'
+        Taborder: 0
+      ]
+    }
+    Component efCurve
+    {
+      #keys: '[413988.0.1148720709]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Curve'
+        Label: 'Curve'
+        Taborder: 1
+      ]
+    }
+    Component efVehicleModel
+    {
+      #keys: '[413988.0.1148720711]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.VehicleModel'
+        Label: 'Vehicle Model'
+        Taborder: 2
+      ]
+    }
+    Component efProducingArea
+    {
+      #keys: '[413988.0.1148720713]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ProducingArea'
+        Label: 'Producing Area'
+        Taborder: 3
+      ]
+    }
+    Component efEngine
+    {
+      #keys: '[413988.0.1148720715]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Engine'
+        Label: 'Engine'
+        Taborder: 4
+      ]
+    }
+    Component efPower
+    {
+      #keys: '[413988.0.1148720717]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Power'
+        Label: 'Power'
+        Taborder: 5
+      ]
+    }
+    Component efEnginePartNumber
+    {
+      #keys: '[413988.0.1148720719]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.EnginePartNumber'
+        Label: 'Engine Part Number'
+        Taborder: 6
+      ]
+    }
+    Component efEngineFourDigitCode
+    {
+      #keys: '[413988.0.1148720721]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.EngineFourDigitCode'
+        Label: 'Engine Four Digit Code'
+        Taborder: 7
+      ]
+    }
+    Component efRemarks
+    {
+      #keys: '[413988.0.1148720723]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Remarks'
+        Label: 'Remarks'
+        Taborder: 8
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_Edit.def
new file mode 100644
index 0000000..26e644b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_Edit.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  SixDigitCode selection
+) id:Method_DialogCreateEditSixDigitCode_Edit
+{
+  #keys: '[413988.0.1147490410]'
+  Body:
+  [*
+    data := shadow( selection );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_New.def
new file mode 100644
index 0000000..218cf4a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_New.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method New () id:Method_DialogCreateEditSixDigitCode_New
+{
+  #keys: '[413988.0.1147490412]'
+  Body:
+  [*
+    data := MacroPlan.SixDigitCode( relshadow );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_OnOK.def
new file mode 100644
index 0000000..f533f6c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Method_OnOK.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogCreateEditSixDigitCode_OnOK
+{
+  #keys: '[413988.0.1147490413]'
+  Body:
+  [*
+    // On ok
+    Form.ApplyChanges();
+    
+    DataHolderDialogData.Data().Commit();
+    
+    Form.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..13d615f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[413988.0.1148570680]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..dc55f58
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1148570679]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.OnOK();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/_ROOT_Component_DialogCreateEditSixDigitCode.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/_ROOT_Component_DialogCreateEditSixDigitCode.def
new file mode 100644
index 0000000..ce45008
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditSixDigitCode/_ROOT_Component_DialogCreateEditSixDigitCode.def
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditSixDigitCode
+{
+  #keys: '[413988.0.1148570666]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderDialogData
+    {
+      #keys: '[413988.0.1148630765]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[SixDigitCode]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlActions.def
new file mode 100644
index 0000000..7d9539f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1149411977]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1149411981]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1149411983]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlContent.def
new file mode 100644
index 0000000..b6fcc49
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Component_pnlContent.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1149411975]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efCode
+    {
+      #keys: '[413988.0.1149413253]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Code'
+        Label: 'Code'
+        Taborder: 0
+      ]
+    }
+    Component efVehicleModel
+    {
+      #keys: '[413988.0.1149413314]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.VehicleModel'
+        Label: 'Vehicle Model'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_Edit.def
new file mode 100644
index 0000000..d7fa2f6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_Edit.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  ThreeDigitCode selection
+) id:Method_DialogCreateEditThreeDigitCode_Edit
+{
+  #keys: '[413988.0.1149412223]'
+  Body:
+  [*
+    data := shadow( selection );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_New.def
new file mode 100644
index 0000000..899f48d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_New.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method New () id:Method_DialogCreateEditThreeDigitCode_New
+{
+  #keys: '[413988.0.1149412225]'
+  Body:
+  [*
+    data := MacroPlan.ThreeDigitCode( relshadow );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_OnOK.def
new file mode 100644
index 0000000..f4fee66
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Method_OnOK.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogCreateEditThreeDigitCode_OnOK
+{
+  #keys: '[413988.0.1149412226]'
+  Body:
+  [*
+    // On ok
+    Form.ApplyChanges();
+    
+    DataHolderDialogData.Data().Commit();
+    
+    Form.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..63a96d3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[413988.0.1149411987]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..34c846c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1149411986]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.OnOK();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/_ROOT_Component_DialogCreateEditThreeDigitCode.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/_ROOT_Component_DialogCreateEditThreeDigitCode.def
new file mode 100644
index 0000000..d8b80bf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThreeDigitCode/_ROOT_Component_DialogCreateEditThreeDigitCode.def
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditThreeDigitCode
+{
+  #keys: '[413988.0.1149411973]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderDialogData id:DataHolderDialogData_545
+    {
+      #keys: '[413988.0.1149412161]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[ThreeDigitCode]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_List531.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_List531.def
new file mode 100644
index 0000000..e67c89d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_List531.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component List531
+{
+  #keys: '[413988.0.1147414065]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractor611
+    {
+      #keys: '[413988.0.1147414066]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'ThreeDigitCode'
+      ]
+    }
+    #child: listActionBarPage453
+    Component DataSetLevel933
+    {
+      #keys: '[413988.0.1147414068]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenu852
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Code","title":"Code","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Code"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VehicleModel","title":"VehicleModel","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VehicleModel"}}]'
+        ContextMenu: 'listContextMenu852'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_List531_WebMenu_OnClick
+    {
+      #keys: '[413988.0.1147414057]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[2899.0.17454228]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listActionBarPage453.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listActionBarPage453.def
new file mode 100644
index 0000000..ef65321
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listActionBarPage453.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPage453
+{
+  #keys: '[413988.0.1147414067]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listContextMenu852.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listContextMenu852.def
new file mode 100644
index 0000000..46b3d8b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_listContextMenu852.def
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component listContextMenu852
+{
+  #keys: '[413988.0.1147414069]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component mNew
+    {
+      #keys: '[413988.0.1147414070]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 4
+        Title: 'New'
+      ]
+    }
+    Component mEdit
+    {
+      #keys: '[413988.0.1147414071]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        BindOnDoubleClick: true
+        Image: 'PENCIL'
+        Taborder: 5
+        Title: 'Edit'
+      ]
+    }
+    Component mDelete
+    {
+      #keys: '[413988.0.1147414072]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 6
+        Title: 'Delete'
+      ]
+    }
+    Component mSelectAll
+    {
+      #keys: '[413988.0.1147414073]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION_VIEW'
+        Shortcut: 'Ctrl+A'
+        Taborder: 2
+        Title: 'Select all'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pContent.def
new file mode 100644
index 0000000..4d374b1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.0.1147414064]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: List531
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pHeader.def
new file mode 100644
index 0000000..731789f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Component_pHeader.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.0.1147413981]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport
+    {
+      #keys: '[413988.0.1147413982]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 0
+      ]
+    }
+    Component bImport
+    {
+      #keys: '[413988.0.1147413983]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Upload'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mDelete_OnClick.def
new file mode 100644
index 0000000..f355243
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick (
+  structured[ThreeDigitCode] selection
+) id:Response_List531_mDelete_OnClick
+{
+  #keys: '[413988.0.1147414062]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      MacroPlan::DeleteObjects( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mEdit_OnClick.def
new file mode 100644
index 0000000..98661c5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick (
+  ThreeDigitCode selection
+) id:Response_List531_mEdit_OnClick
+{
+  #keys: '[413988.0.1147414061]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditThreeDigitCode );
+      
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mNew_OnClick.def
new file mode 100644
index 0000000..4b7a581
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mNew_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick () id:Response_List531_mNew_OnClick
+{
+  #keys: '[413988.0.1147414060]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mNew'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditThreeDigitCode );
+      
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mSelectAll_OnClick.def
new file mode 100644
index 0000000..05e0fda
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_List531_mSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick () id:Response_List531_mSelectAll_OnClick
+{
+  #keys: '[413988.0.1147414059]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bExport_OnClick.def
new file mode 100644
index 0000000..a7f6969
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bExport_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader/bExport
+Response OnClick () id:Response_pHeader_bExport_OnClick
+{
+  #keys: '[413988.0.1147413980]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def
new file mode 100644
index 0000000..3d75f01
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader/bImport
+Response OnClick () id:Response_pHeader_bImport_OnClick
+{
+  #keys: '[413988.0.1147413979]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form989/_ROOT_Component_FormThreeDigitCode\043989.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form989/_ROOT_Component_FormThreeDigitCode\043989.def"
new file mode 100644
index 0000000..505681f
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form989/_ROOT_Component_FormThreeDigitCode\043989.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormThreeDigitCode
+{
+  #keys: '[413988.0.1147413891]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pHeader
+    #child: pContent
+  ]
+  Properties:
+  [
+    Image: 'TABLE'
+    Title: 'ThreeDigitCode'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_List531.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_List531.def
new file mode 100644
index 0000000..742cf8b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_List531.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component List531
+{
+  #keys: '[413988.0.1141382059]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractor611
+    {
+      #keys: '[413988.0.1141382060]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'PR_PP_Budget'
+      ]
+    }
+    #child: listActionBarPage453
+    Component DataSetLevel933
+    {
+      #keys: '[413988.0.1141382065]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenu852
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Model","title":"Model","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Model"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModelCode","title":"ModelCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModelCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Engine","title":"Engine","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Engine"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProducingArea","title":"ProducingArea","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProducingArea"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VehicleModel","title":"VehicleModel","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VehicleModel"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EnginePartNumber","title":"EnginePartNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EnginePartNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineFourDigitCode","title":"EngineFourDigitCode","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"EngineFourDigitCode"}}]'
+        ContextMenu: 'listContextMenu852'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_List531_WebMenu_OnClick
+    {
+      #keys: '[413988.0.1143180584]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[2899.0.17454228]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listActionBarPage453.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listActionBarPage453.def
new file mode 100644
index 0000000..5c12b85
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listActionBarPage453.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPage453
+{
+  #keys: '[413988.0.1141382062]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listContextMenu852.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listContextMenu852.def
new file mode 100644
index 0000000..8fccfc8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_listContextMenu852.def
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component listContextMenu852
+{
+  #keys: '[413988.0.1141382067]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component mNew
+    {
+      #keys: '[413988.0.1143000443]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 4
+        Title: 'New'
+      ]
+    }
+    Component mEdit
+    {
+      #keys: '[413988.0.1143000461]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        BindOnDoubleClick: true
+        Image: 'PENCIL'
+        Taborder: 5
+        Title: 'Edit'
+      ]
+    }
+    Component mDelete
+    {
+      #keys: '[413988.0.1143000472]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 6
+        Title: 'Delete'
+      ]
+    }
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component mSelectAll
+    {
+      #keys: '[413988.0.1143320620]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION_VIEW'
+        Shortcut: 'Ctrl+A'
+        Taborder: 2
+        Title: 'Select all'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pContent.def
new file mode 100644
index 0000000..3544efb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.0.1141442642]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: List531
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pHeader.def
new file mode 100644
index 0000000..81c8be6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Component_pHeader.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.0.1141442630]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport
+    {
+      #keys: '[413988.0.1139762203]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 0
+      ]
+    }
+    Component bImport
+    {
+      #keys: '[413988.0.1141012027]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Upload'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mDelete_OnClick.def
new file mode 100644
index 0000000..cb216c1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick (
+  structured[PR_PP_Budget] selection
+) id:Response_List531_mDelete_OnClick
+{
+  #keys: '[413988.0.1141931465]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      MacroPlan::DeleteObjects( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mEdit_OnClick.def
new file mode 100644
index 0000000..f2e291e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick (
+  PR_PP_Budget selection
+) id:Response_List531_mEdit_OnClick
+{
+  #keys: '[413988.0.1143460616]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditPR_PP_Budget );
+      
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mNew_OnClick.def
new file mode 100644
index 0000000..e3d0446
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mNew_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick () id:Response_List531_mNew_OnClick
+{
+  #keys: '[413988.0.1143360023]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mNew'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditPR_PP_Budget );
+      
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mSelectAll_OnClick.def
new file mode 100644
index 0000000..a874745
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_List531_mSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: List531
+Response OnClick () id:Response_List531_mSelectAll_OnClick
+{
+  #keys: '[413988.0.1143320748]'
+  CanBindMultiple: false
+  DefinitionID => /List531/Responsedef_List531_WebMenu_OnClick
+  Initiator: 'mSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bExport_OnClick.def
new file mode 100644
index 0000000..58beff0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bExport
+Response OnClick () id:Response_pHeader_bExport_OnClick
+{
+  #keys: '[413988.0.1141930504]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := PR_PP_Budget::Download( MacroPlan );
+      
+      Application.Download( "鍙戝姩鏈哄尮閰�-PR&PP&Budget.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def
new file mode 100644
index 0000000..903035c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader/bImport
+Response OnClick () id:Response_pHeader_bImport_OnClick
+{
+  #keys: '[413988.0.1141930584]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/_ROOT_Component_FormPR_PP_Budget.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/_ROOT_Component_FormPR_PP_Budget.def
new file mode 100644
index 0000000..b5c0ee4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/_ROOT_Component_FormPR_PP_Budget.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormPR_PP_Budget
+{
+  #keys: '[413988.0.1141350288]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pContent
+    #child: pHeader
+  ]
+  Properties:
+  [
+    Image: 'TABLE'
+    Title: 'PR_PP_Budget'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_List531\043836.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_List531\043836.def"
new file mode 100644
index 0000000..5e5e4ca
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_List531\043836.def"
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component List531 id:List531_836
+{
+  #keys: '[413988.0.1146140364]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractor611
+    {
+      #keys: '[413988.0.1146140365]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'SixDigitCode'
+      ]
+    }
+    #child: listActionBarPage453_1
+    Component DataSetLevel933
+    {
+      #keys: '[413988.0.1146140367]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenu852_1
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Code","title":"Code","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Code"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Curve","title":"Curve","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Curve"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VehicleModel","title":"VehicleModel","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VehicleModel"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProducingArea","title":"ProducingArea","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProducingArea"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Engine","title":"Engine","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Engine"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Power","title":"Power","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Power"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EnginePartNumber","title":"EnginePartNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EnginePartNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineFourDigitCode","title":"EngineFourDigitCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EngineFourDigitCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Remarks","title":"Remarks","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Remarks"}}]'
+        ContextMenu: 'listContextMenu852'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_List531_836_WebMenu_OnClick
+    {
+      #keys: '[413988.0.1146140356]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[2899.0.17454228]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listActionBarPage453\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listActionBarPage453\0431.def"
new file mode 100644
index 0000000..3c44d0b
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listActionBarPage453\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPage453 id:listActionBarPage453_1
+{
+  #keys: '[413988.0.1146140366]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listContextMenu852\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listContextMenu852\0431.def"
new file mode 100644
index 0000000..bb99695
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_listContextMenu852\0431.def"
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component listContextMenu852 id:listContextMenu852_1
+{
+  #keys: '[413988.0.1146140368]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component mNew
+    {
+      #keys: '[413988.0.1146140369]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 4
+        Title: 'New'
+      ]
+    }
+    Component mEdit
+    {
+      #keys: '[413988.0.1146140370]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        BindOnDoubleClick: true
+        Image: 'PENCIL'
+        Taborder: 5
+        Title: 'Edit'
+      ]
+    }
+    Component mDelete
+    {
+      #keys: '[413988.0.1146140371]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 6
+        Title: 'Delete'
+      ]
+    }
+    Component mSelectAll
+    {
+      #keys: '[413988.0.1146140372]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION_VIEW'
+        Shortcut: 'Ctrl+A'
+        Taborder: 2
+        Title: 'Select all'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pContent\043925.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pContent\043925.def"
new file mode 100644
index 0000000..9009a76
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pContent\043925.def"
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent id:pContent_925
+{
+  #keys: '[413988.0.1146140363]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: List531_836
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pHeader\043393.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pHeader\043393.def"
new file mode 100644
index 0000000..99d689b
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Component_pHeader\043393.def"
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pHeader id:pHeader_393
+{
+  #keys: '[413988.0.1146140233]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport
+    {
+      #keys: '[413988.0.1146140234]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 0
+      ]
+    }
+    Component bImport
+    {
+      #keys: '[413988.0.1146140235]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Upload'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mDelete_OnClick.def
new file mode 100644
index 0000000..55df893
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: List531_836
+Response OnClick (
+  structured[SixDigitCode] selection
+) id:Response_List531_836_mDelete_OnClick
+{
+  #keys: '[413988.0.1146140361]'
+  CanBindMultiple: false
+  DefinitionID => /List531_836/Responsedef_List531_836_WebMenu_OnClick
+  Initiator: 'mDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      MacroPlan::DeleteObjects( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mEdit_OnClick.def
new file mode 100644
index 0000000..8f7d9f1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: List531_836
+Response OnClick (
+  SixDigitCode selection
+) id:Response_List531_836_mEdit_OnClick
+{
+  #keys: '[413988.0.1146140360]'
+  CanBindMultiple: false
+  DefinitionID => /List531_836/Responsedef_List531_836_WebMenu_OnClick
+  Initiator: 'mEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditSixDigitCode );
+      
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mNew_OnClick.def
new file mode 100644
index 0000000..3ef256d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mNew_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: List531_836
+Response OnClick () id:Response_List531_836_mNew_OnClick
+{
+  #keys: '[413988.0.1146140359]'
+  CanBindMultiple: false
+  DefinitionID => /List531_836/Responsedef_List531_836_WebMenu_OnClick
+  Initiator: 'mNew'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditSixDigitCode );
+      
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mSelectAll_OnClick.def
new file mode 100644
index 0000000..485feff
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_List531_836_mSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: List531_836
+Response OnClick () id:Response_List531_836_mSelectAll_OnClick
+{
+  #keys: '[413988.0.1146140358]'
+  CanBindMultiple: false
+  DefinitionID => /List531_836/Responsedef_List531_836_WebMenu_OnClick
+  Initiator: 'mSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bExport_OnClick.def
new file mode 100644
index 0000000..079d0f8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bExport_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader_393/bExport
+Response OnClick () id:Response_pHeader_393_bExport_OnClick
+{
+  #keys: '[413988.0.1146140232]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def
new file mode 100644
index 0000000..506669c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader_393/bImport
+Response OnClick () id:Response_pHeader_393_bImport_OnClick
+{
+  #keys: '[413988.0.1146140231]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/_ROOT_Component_FormSixDigitCode.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/_ROOT_Component_FormSixDigitCode.def
new file mode 100644
index 0000000..598f24d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/_ROOT_Component_FormSixDigitCode.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormSixDigitCode
+{
+  #keys: '[413988.0.1144800629]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pHeader_393
+    #child: pContent_925
+  ]
+  Properties:
+  [
+    Image: 'TABLE'
+    Title: 'SixDigitCode'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/PR_PP_Budget.vw b/_Main/UI/MacroPlannerWebApp/Views/PR_PP_Budget.vw
new file mode 100644
index 0000000..4c8b214
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/PR_PP_Budget.vw
@@ -0,0 +1,146 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormPR_PP_Budget
+      {
+        title: 'QMacroPlanner::FormPR_PP_Budget'
+        shown: true
+        componentID: 'QMacroPlanner::FormPR_PP_Budget'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 14
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components: null
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'BEAR'
+    description: ''
+  }
+  formatversion: 2
+  id: 'PR_PP_Budget'
+  name: 'PR_PP_Budget'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/SixDigitCode.vw b/_Main/UI/MacroPlannerWebApp/Views/SixDigitCode.vw
new file mode 100644
index 0000000..7ee4404
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/SixDigitCode.vw
@@ -0,0 +1,244 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormSixDigitCode
+      {
+        title: 'QMacroPlanner::FormSixDigitCode'
+        shown: true
+        componentID: 'QMacroPlanner::FormSixDigitCode'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 14
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormSixDigitCode_pHeader
+          {
+            sizeRatio: 1
+          }
+          FormSixDigitCode_pContent
+          {
+            sizeRatio: 1
+          }
+          FormSixDigitCode_List531
+          {
+          }
+          FormSixDigitCode_DataSetLevel933
+          {
+            groupDepth: -1
+            column_Code
+            {
+              columnId: 'Code'
+              dataPath: 'Code'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Curve
+            {
+              columnId: 'Curve'
+              dataPath: 'Curve'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_VehicleModel
+            {
+              columnId: 'VehicleModel'
+              dataPath: 'VehicleModel'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_ProducingArea
+            {
+              columnId: 'ProducingArea'
+              dataPath: 'ProducingArea'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Engine
+            {
+              columnId: 'Engine'
+              dataPath: 'Engine'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Power
+            {
+              columnId: 'Power'
+              dataPath: 'Power'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_EnginePartNumber
+            {
+              columnId: 'EnginePartNumber'
+              dataPath: 'EnginePartNumber'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_EngineFourDigitCode
+            {
+              columnId: 'EngineFourDigitCode'
+              dataPath: 'EngineFourDigitCode'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_Remarks
+            {
+              columnId: 'Remarks'
+              dataPath: 'Remarks'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'KEYBOARD_KEY_6'
+    description: ''
+  }
+  formatversion: 2
+  id: 'SixDigitCode'
+  name: 'SixDigitCode'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ThreeDigitCode.vw b/_Main/UI/MacroPlannerWebApp/Views/ThreeDigitCode.vw
new file mode 100644
index 0000000..e803165
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/ThreeDigitCode.vw
@@ -0,0 +1,181 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormThreeDigitCode
+      {
+        title: 'QMacroPlanner::FormThreeDigitCode'
+        shown: true
+        componentID: 'QMacroPlanner::FormThreeDigitCode'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 14
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormThreeDigitCode_pHeader
+          {
+            sizeRatio: 1
+          }
+          FormThreeDigitCode_pContent
+          {
+            sizeRatio: 1
+          }
+          FormThreeDigitCode_List531
+          {
+          }
+          FormThreeDigitCode_DataSetLevel933
+          {
+            groupDepth: -1
+            column_Code
+            {
+              columnId: 'Code'
+              dataPath: 'Code'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_VehicleModel
+            {
+              columnId: 'VehicleModel'
+              dataPath: 'VehicleModel'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'KEYBOARD_KEY_3'
+    description: ''
+  }
+  formatversion: 2
+  id: 'ThreeDigitCode'
+  name: 'ThreeDigitCode'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3