| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod GetSalesSegmentToSave ( | 
|   SalesSegment_MPs checkSalesSegments | 
| ) as owning SalesSegment_MPs | 
| { | 
|   Description: | 
|   [* | 
|     Web introduced new bookmark logic. Keep bookmark as short as possible. | 
|     If all children (and descendants) checked, store the parent only. If partial, then no choice we store the checked children. | 
|   *] | 
|   TextBody: | 
|   [* | 
|     result := construct( SalesSegment_MPs ); // Sales Segment to bookmark | 
|      | 
|     // Filter out parent sales segments | 
|     checkLeafSalesSegments := selectset( checkSalesSegments, Elements, c, c.Child( relsize ) = 0 ); | 
|      | 
|     // Based on filtered sales segment, get all their parents | 
|     allParentsSorted := selectsortedset( SalesSegment_MP::GetAllParents( checkLeafSalesSegments ),  | 
|                                          Elements, e,  | 
|                                          e.Child( relsize ) > 0,  // Filter out the leaf as GetAllParents return the sales segment itself as well | 
|                                          e.DisplayIndex() );      // Sort from root down to lower level sales segment  | 
|      | 
|     // Important to start with root, as we will remove 'intersecting' leaf salse segment as we loop | 
|     traverse( allParentsSorted, Elements, parent, checkLeafSalesSegments.Size() > 0 ) // Continue as long as there's sales segment to be considered | 
|     { | 
|       leafDescendants := selectset( parent, AllChildren.AsChildren, ss, ss.Child( relsize ) = 0 );  | 
|      | 
|       // If current parent's leaf descendants are found in user checked sales segment | 
|       // We only bookmark the parent and remove leaf descendants from the list and proceed next parent | 
|       // Example (Food demo): Add sales segment Target if ALL its children are part of user checked sales segment | 
|       if( checkLeafSalesSegments.ContainsAll( leafDescendants ) ) | 
|       { | 
|         checkLeafSalesSegments.Remove( leafDescendants );   | 
|         result.Add( parent );   | 
|       } | 
|     } | 
|      | 
|     // If there's leaf sales segment left (not all siblings checked), add them to the result | 
|     if( checkLeafSalesSegments.Size() > 0 ) | 
|     { | 
|       result := result.Union( checkLeafSalesSegments ); | 
|     } | 
|      | 
|     return &result; | 
|   *] | 
| } |