From 485f50250d12f31bed90e48bfdc737c8b34386f6 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期三, 27 九月 2023 18:13:28 +0800
Subject: [PATCH] Merge branch 'dev_Kevin' into dev

---
 LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport#382.qbl                   |    4 
 _Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl                                           |    6 +
 _Main/BL/Type_ImportExcel/Method_Execute.qbl                                                   |   43 ++++++++
 _Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl            |   10 ++
 _Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl                                         |   47 +++++++++
 _Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl                                   |   29 +++++
 LibSOPImportExport/metadata.properties                                                         |    2 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport#522.qbl |    5 
 _Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl                 |    6 +
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl                                     |   75 ++++++++++++++
 LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl                |    2 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl     |    4 
 _Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl                                            |   22 ++++
 13 files changed, 248 insertions(+), 7 deletions(-)

diff --git a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
index 9f508eb..c429f65 100644
--- a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
+++ b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
@@ -12,7 +12,6 @@
     Cardinality: '1toN'
     ObjectDefinition: MPSync
     OwningSide: 'Owned'
-    InterfaceProperties { Accessibility: 'Module' }
   }
   RelationSide.RightSide MPSync
   {
@@ -20,6 +19,5 @@
     Cardinality: '0to1'
     ObjectDefinition: ImportExcel
     OwningSide: 'Reference'
-    InterfaceProperties { Accessibility: 'Module' }
   }
 }
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
index 4ea6109..af8fd45 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
@@ -1,6 +1,9 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o, Boolean needUserUploadAllFiles) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o,
+  Boolean needUserUploadAllFiles
+) remote as Boolean
 {
   TextBody:
   [*
diff --git a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
index b8c6585..a6720f7 100644
--- a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
+++ b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   TextBody:
   [*
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
index 590b315..d9785ad 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method CanImport (output Strings missingFiles_o) as Boolean
+Method CanImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   Description: 'Checks if necessary files are sufficent before starting import.'
   TextBody:
diff --git a/LibSOPImportExport/metadata.properties b/LibSOPImportExport/metadata.properties
index c38fbdb..6d65136 100644
--- a/LibSOPImportExport/metadata.properties
+++ b/LibSOPImportExport/metadata.properties
@@ -5,4 +5,4 @@
 system=false
 version.component=2022.3.0.0
 version.fileformat=2
-version.quintiq=6.3.3.0 NightlyBuild 247983, build 247983
+version.quintiq=6.3.3.0 , build 248673
diff --git a/_Main/BL/Type_ImportExcel/Method_Execute.qbl b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
new file mode 100644
index 0000000..8bad7ba
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#parent: #root
+MethodOverride Execute #extension
+{
+  TextBody:
+  [*
+    opt := DatasetFindOptions::Construct( this.MacroPlanDatasetName() );
+    mp := MDSMacroPlan::Find( opt );
+    
+    opt := DatasetFindOptions::Construct();
+    scenarioManager := MDSScenarioManager::Find( opt );
+    
+    // Only get data source which has all required files uploaded
+    dummyMissingFiles := construct( Strings );
+    needUserUploadAllFiles := true;
+    validUploadedFiles := selectset( this, LibSOPImpExp_DataSourceChildren, ds, 
+                                     ds.HasAllRequiredFilesForImport( dummyMissingFiles, needUserUploadAllFiles ) );
+    
+    traverse( validUploadedFiles, Elements, file )
+    {
+      this.LibSOPImpExp_UserInput( relnew, Value := file.Name() );
+    }
+    
+    binaryValues := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile.LibSOPImpExp_ImportUploadedFile, file, true, file.DataAsBinary() );
+    brokerNames := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile, file, true, file.BrokerName() );
+    userinputvalues := selectuniquevalues( this, LibSOPImpExp_UserInput, userinput,
+                                           true,
+                                           userinput.Value() );
+    mpsync := this.MPSync();
+    
+    // Reactive way to import
+    o := this
+    ->SetStatusInProgress()
+    ->|mp->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|scenarioManager->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|mpsync->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|this->SetStatusDone()
+    ->|mp->SetLastImportTime()
+    ->Exception();
+    
+    this->OnException(o);
+  *]
+}
diff --git a/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
new file mode 100644
index 0000000..cd6e3ac
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization ImportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
new file mode 100644
index 0000000..710f4a0
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IsDataSourceIncluded_Tianma (
+  Strings userinputvalues,
+  String datasource_i
+) remote as Boolean
+{
+  Description: 'If data source selected by user to export'
+  TextBody: 'return exists( userinputvalues, Elements, input, input = datasource_i );'
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
new file mode 100644
index 0000000..9510e76
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LibSOPImpExp_ExportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..01d9ef9
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userInput_i - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ImportProfiles() ),
+                 mpBinaryValues_i, mpBrokers_i, is3DDrive, construct( FileItems), construct( Strings ) );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..7d409ec
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Synchronize( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_SupplyChainParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_GlobalParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Periods() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySupplies() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Products() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Forecasts() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ServiceLevels() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Campaigns() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Entities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Costs() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Lanes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Routings() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Capacities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_SupplySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Recipes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Designer_Actuals() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_GlobalParameters_KPIFeedbackName() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_OptimizerPuzzles() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_PostponementSpecAndFulfillmentRestriction() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_CustomerOrder() ),
+                      false, /* isImportBinary */
+                      mpBinaryValues_i,
+                      mpBrokers_i,
+                      is3DDrive,
+                      construct( FileItems ), /* 3ddrive, ignore */
+                      construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
index ca35281..b716d4d 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
@@ -10,7 +10,6 @@
   TextBody:
   [*
     // yypsybs Aug-21-2023 (created)
-    
     keyProductList := construct( Strings );
     if( isKeyProduct ) {
         keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
@@ -59,6 +58,7 @@
                   // ========鍒嗙粍澶勭悊杈撳叆========
                   
                 }
+                
                 if( not isnull( stockingPoint)){
                   if( isKeyProduct){
                       keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
@@ -81,5 +81,78 @@
             this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
         }
     }
+    
+    
+    //
+    //keyProductList := construct( Strings );
+    //if( isKeyProduct ) {
+    //    keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
+    //}
+    //bomList := selectsortedset(  globalOTDTable, Global_MappingOperationBOM, item,
+    //                             ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
+    //                                     true, 
+    ////                                     businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
+    //                                     businessTypes.Find( item.BusinessType() ) >= 0 )
+    ////                             and ifexpr( isKeyProduct, 
+    ////                                         keyProductList.Size() > 0 and keyProductList.Find( item.ComponentCode() ) >= 0,
+    ////                                         true )
+    //                             ,
+    //                             item.OrganCode() + "_" + item.ProductCode() + "_" + item.ProcessSection() );
+    //// 鎸塺outing鍙妑outingStep鍒嗙粍
+    //routingIds := selectuniquevalues( bomList, Elements, item, true, item.OrganCode() + "_" + item.ProductCode() );
+    //traverse( routingIds, Elements, routingId ) {
+    //    routingRows := selectset( bomList, Elements, item, true, routingId = item.OrganCode() + "_" + item.ProductCode() );
+    //    if( routingRows.Size() > 0 ) {
+    //        firstRow := routingRows.Element( 0 );
+    ////        stockingPointId := firstRow.OrganCode()  + "_" + firstRow.ProductType() + "_Stock";
+    ////        inputStockingPointId := firstRow.OrganCode()  + "_" + firstRow.ComponentType() + "_Stock";
+    //        stockingPointId := firstRow.OrganCode()  + "_Stock";
+    //
+    //        // ========妫�鏌�========
+    //        product := Product_MP::FindProductTypeIndex( firstRow.ProductCode() );
+    //        if( not isnull( product ) ) {
+    ////              error( "product : " + firstRow.ProductCode() + " not found" );
+    //          stockingPoint := StockingPoint_MP::FindStockingPointTypeIndex( stockingPointId );
+    //
+    ////          info( stockingPointId.AsQUILL() );
+    //  //        if( isnull( stockingPoint ) ) {
+    //  //            error( "stockingPoint : " + stockingPointId + " not found" );
+    //  //        }
+    //          routing := Routing::FindRoutingTypeIndex(  routingId );
+    //          if( not isnull( routing ) ) {
+    ////              error( "routing : " + routingId + " not found" );
+    //            // ========澶勭悊杈撳嚭========
+    //            if( not isnull( stockingPoint ) ) {
+    ////              info( 1 );
+    //              operationsInLastSteps := Operation::FindFinalOperationsByRoutingId( this, routingId );
+    //              traverse( operationsInLastSteps, Elements, operationsInLastStep ) {
+    //                  operationsInLastStep.CreateOperationBOM( product, stockingPoint, false, true );
+    //                  operationsInLastStep.GetOperationBOM( product.ID(), stockingPoint.ID(), false ).Quantity( 1 );
+    //              }
+    //              // ========鍒嗙粍澶勭悊杈撳叆========
+    //              
+    //            }
+    //            if( not isnull( stockingPoint)){
+    //              if( isKeyProduct){
+    //                  keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,keyRows);
+    //                }else{
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,routingRows);
+    //                }
+    //                
+    //            }
+    //          }
+    //       }
+    //    }
+    //}
+    //if( createPurchaseSupplyMaterial ) {
+    //    toCreateBomList := selectuniquevalues( bomList, Elements, item, 
+    //                                           item.ComponentType() = "P", item.OrganCode() + item.ComponentCode());
+    //    traverse( toCreateBomList, Elements, key ) {
+    //        boms := selectset( bomList, Elements, item, item.ComponentType() = "P" and item.OrganCode() + item.ComponentCode() = key );
+    //        bom := boms.First();
+    //        this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
+    //    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..2c38e3e
--- /dev/null
+++ b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Strategies() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Accounts() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Bookmarks() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_KPISetting() ),
+                 mpBinaryValues_i.Copy(), 
+                 mpBrokers_i, 
+                 is3DDrive, 
+                 construct( FileItems ), /* 3ddrive, ignore */ 
+                 construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}

--
Gitblit v1.9.3