public ProductionBed( RecProductionFormStd form, BedFilter filter )
            : base( form )
        {
            this.bedFilter = filter;
            IsFull = false;
            if( null != form.ProductionCast && form.ProductionCast.CastId > 0 )
            {
                // Well this is never used so far
                this.ProductionCast = form.ProductionCast;
            }
            else
            {
                // Create a cast object
                var cast = new RecProductionCast( form )
                               {
                                   Factory = filter.Factory,
                                   Project = filter.Project,
                                   StartDate = filter.StartDateFrom,
                                   EndDate = filter.EndDateFrom,
                                   Shift = filter.Shift
                               };

                if( form.FormType == V120.Planning.Common.FormType.Bed && form.StrandType == V120.Planning.Common.StrandType.Bed )
                {
                    var strand = new RecProductionFormStrandStd()
                                     { Factory = filter.Factory, Project = filter.Project, Name = form.Name };
                    cast.Strands = LoadStandardStrands( strand );
                }

                this.ProductionCast = cast;
            }
        }
 /// <summary>
 /// Returns true if it Has Existing Elements
 /// </summary>
 /// <param name="castUnit"></param>
 /// <returns></returns>
 public bool HasExistingElements( RecProductionFormStd castUnit )
 {
     var productionBed = this.GetCastUnit( castUnit );
     if( null == productionBed )
     {
         return false;
     }
     return productionBed.HasExistingElements();
 }
		private ExBed GetBed( RecProductionFormStd form)
		{
			// Search for available Bed
			foreach( ExBed curBed in _beds )
			{
				if( curBed.Name.Equals(form.Name) )
				{
					return curBed;
				}
			}
			return null;
		}
		public int Sort( List<RecTMElement> elements, RecProductionFormStd form, BedFilter filter )
		{
			_filter = filter;
			if( form == null )
			{
				string msg = string.Format( "No forms defined!" );
				throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot manage form!" );
			}

            ExBed bed = new ExBed( form, filter );

			List<RecTMElement> result = bed.FillBed( elements );
			return bed.Save( result );
		}
		public List<RecTMElement> PositionedElementsOnBed( RecProductionFormStd bed, List<RecTMElement> elements )
		{
            ExBed exBed = GetBed( bed );
            if( null == exBed )
            {
                return null;
            }

            List<RecTMElement> result = exBed.FillBed( elements );
            if( null != result && result.Count > 0 )
            {
                exBed.Save( result );
            }

			return result;
		}
Exemple #6
0
		public ExBed( RecProductionFormStd form, BedFilter filter )
			: base( form )
		{
			_bedFilter = filter;
			IsFull = false;
			// Create a cast object
			RecProductionCast cast = new RecProductionCast( form );
			cast.Factory = filter.Factory;
			cast.Project = filter.Project;

			cast.StartDate = filter.StartDateFrom;
			cast.EndDate = filter.EndDateFrom;

			cast.Shift = filter.Shift;
			AddCast( cast );
		}
 public DataHolder( RecProductionCast cast, RecProductionFormStd form, RecTMElement element )
 {
     this.Cast = cast;
     this.Form = form;
     this.Element = element;
 }
 /// <summary>
 /// Returns no of strands
 /// </summary>
 /// <param name="castunit"></param>
 /// <returns></returns>
 private int GetNumberOfStrands( RecProductionFormStd castunit )
 {
     var nbrOfStrands = 0;
     if( castunit == null || string.IsNullOrEmpty( castunit.Factory ) || string.IsNullOrEmpty( castunit.Project ) )
     {
         return nbrOfStrands;
     }
     var svc = new ProjectManager();
     var recStrand = new RecProductionFormStrandStd { Factory = castunit.Factory, Project = castunit.Project, Name = castunit.Name };
     var strands = svc.LoadProductionFormStrandStd( recStrand );
     if( null != strands )
     {
         nbrOfStrands = (from o in strands where o.IsUsed select o).Count();
     }
     return nbrOfStrands;
 }
            public void Parse( RecProductionFormStd form, RecProductionCast cast, RecTMElement elem )
            {
                string formKey = form.Factory + form.Project + form.Name;
                RecProductionFormStd formObj = null;
                if( dic.ContainsKey( formKey ) )
                {
                    formObj = dic[formKey];
                }
                else
                {
                    formObj = new RecProductionFormStd( form );
                    dic.Add( formKey, formObj );
                    tmList.Add( formObj );
                }

                RecProductionCast castObj = null;
                if( cast != null )
                {
                    castObj = formObj.FindCast( cast );
                    if( castObj == null )
                    {
                        castObj = new RecProductionCast( cast ) { Form = form.Name };
                        formObj.ProductionCast = castObj;
                    }
                }
                // Save the element if we do have an element
                if( null == elem || elem.ElementId <= 0 )
                {
                    return;
                }
                if( castObj == null || castObj.CastId <= 0 )
                {
                    return;
                }
                elem.CastId = castObj.CastId;
                castObj.Project = elem.Project;
                castObj.AddElement( elem );
            }
            public void Parse( RecProductionFormStd form, RecProductionCast cast, RecTMElement elem )
            {
                string castKey = cast.Factory + cast.Project + cast.CastId;
                RecProductionCast castObj = null;
                if( dic.ContainsKey( castKey ) )
                {
                    castObj = dic[castKey];
                }
                else
                {
                    castObj = new RecProductionCast( cast );
                    dic.Add( castKey, castObj );
                    tmList.Add( castObj );
                }

                // Save the element if we do have an element
                if( elem != null && elem.ElementId > 0 )
                {
                    if( castObj != null && castObj.CastId > 0 )
                    {
                        elem.CastId = castObj.CastId;
                        castObj.Project = elem.Project;
                        castObj.AddElement( elem );
                    }
                }
            }
		/// <summary>
		/// Delete the specified record from the database.
		/// This method should be optimized
		/// </summary>
		/// <param name="record">The record to delete from the database.</param>
		/// <returns>The number of affected records.</returns>
		public int DeleteProductionFormStd( RecProductionFormStd record )
		{
			ProjectManager castSvc = new ProjectManager( );
			int count = castSvc.GetCastCount( record );
			if( count > 0 )
			{
				return 0;
			}

			// Delete form std strands
			RecProductionFormStrandStd strand = new RecProductionFormStrandStd( );
			strand.Factory = record.Factory;
			strand.Project = record.Project;
			strand.Name = record.Name;
			strand.StrandPos = 0;//Means delete all strands related to this form
			ProjectManager svc = new ProjectManager();
			svc.DeleteProductionFormStrandStd( strand );

			// (2) Now delete form
			var delete = new ImpactDelete( ImpProductionFormStd.Instance )
			{
				Where = 
				{
					{ ImpProductionFormStd.Factory.Equal( record.Factory )},
					{ ImpProductionFormStd.Project.Equal( record.Factory )}, //Factory Level, ie(Factory, Factory)
					{ ImpProductionFormStd.Name.Equal( record.Name )},
				}
			};

			string statement = delete.ToString();

			int result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return result;
		}
        /// <summary>
        /// Sort existin elements
        /// </summary>
        /// <param name="elements"></param>
        /// <param name="form"></param>
        /// <param name="curFilter"></param>
        /// <returns></returns>
		public int Sort( List<RecTMElement> elements, RecProductionFormStd form, BedFilter curFilter )
		{
			if( null == form || null == elements || elements.Count == 0 )
			{
				var msg = string.Format( "Missing sorting input!" );
				throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot sort form!" );
			}

			this.filter = curFilter;
            var bed = new ProductionBed( form, curFilter );

			var positionedElements = bed.FillBed( elements );
			var savedElem = bed.Save( positionedElements );

            if( savedElem < elements.Count )
            {
                // remove the delta
                var mgr = new ProjectManager();
                var planner = new ModelPlanner();
                foreach( RecTMElement elem in elements )
                {
                    if( !mgr.Find( positionedElements, elem ) )
                    {
                        planner.ResetElementProduction( elem.Factory, elem.Project, 0, elem.ElementId, false );
                    }
                }
            }

            return 0;
		}
		/// <summary>
		/// Update the specified record in the database.
		/// </summary>
		/// <param name="record">The record to update.</param>
		/// <returns></returns>
		public int UpdateProductionFormStd( RecProductionFormStd record )
		{
			var update = new ImpactUpdate( ImpProductionFormStd.Instance )
			{
				Columns = 
				{
					{ ImpProductionFormStd.FormType, record.FormType },
					{ ImpProductionFormStd.Description, record.Description },
					{ ImpProductionFormStd.Location, record.Location },
					{ ImpProductionFormStd.NbrOfShift, record.NbrOfShift },
					{ ImpProductionFormStd.Length, record.Length },
					{ ImpProductionFormStd.Width, record.Width },
					{ ImpProductionFormStd.Height, record.Height },
					{ ImpProductionFormStd.Tolerance, record.Tolerance },
					{ ImpProductionFormStd.MaxMass, record.MaxMass },
					{ ImpProductionFormStd.ElementType, record.ElementType },
					{ ImpProductionFormStd.Style, record.Style },
					{ ImpProductionFormStd.StrandType, record.StrandType },
					{ ImpProductionFormStd.Strandptn, record.Strandptn },
					{ ImpProductionFormStd.Division, record.Division },
					{ ImpProductionFormStd.CreatedBy, record.CreatedBy },
					{ ImpProductionFormStd.CreatedDate, record.CreatedDate },
					{ ImpProductionFormStd.ChangedBy, record.ChangedBy },
					{ ImpProductionFormStd.ChangedDate, record.ChangedDate },
				},
				Where = 
				{
					{ ImpProductionFormStd.Factory.Equal( record.Factory ) },
					{ ImpProductionFormStd.Project.Equal( record.Factory ) },//Factory Leveö
					{ ImpProductionFormStd.Name.Equal( record.Name ) },
				},
			};

            // Never change bed dimensions if it is used in some casts!
			ProjectManager castSvc = new ProjectManager( );
			int numOfExistingCasts = castSvc.GetCastCount( record );
            if( 0 == numOfExistingCasts )
			{
                update.Columns.Add(ImpProductionFormStd.MaxLength, record.MaxLength);
                update.Columns.Add(ImpProductionFormStd.MaxWidth, record.MaxWidth);
                update.Columns.Add(ImpProductionFormStd.MaxHeight, record.MaxHeight);
			}

			string statement = update.ToString();

			int result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return result;
		}
        /// <summary>
        /// Parsing helper
        /// </summary>
        /// <param name="column">column</param>
        /// <returns></returns>
        private static DataHolder ParseSchedule( DbDataReader column )
        {
            RecProductionCast cast = new RecProductionCast()
            {
                CastId = DataConverter.Cast<int>( column[0] ),

                Description = DataConverter.Cast<string>( column[1] ),
                StartDate = DataConverter.Cast<DateTime>( column[2] ),
                EndDate = DataConverter.Cast<DateTime?>( column[3] ),
                Tolerance = DataConverter.Cast<double>( column[4] ),
                ElementType = DataConverter.Cast<string>( column[5] ),
                Style = DataConverter.Cast<string>( column[6] ),
                Strandptn = DataConverter.Cast<string>( column[7] ),
                CastStatus = DataConverter.Cast<int>( column[8] ),
                CastType = DataConverter.Cast<int>( column[9] ),

                Form = DataConverter.Cast<string>( column[10] ),
                Shift = DataConverter.Cast<int>( column[11] ),
                NumOfStrands = DataConverter.Cast<int>( column[12] ),
                Location = DataConverter.Cast<string>( column[13] ),
            };
            RecProductionFormStd form = new RecProductionFormStd()
            {
                Location = DataConverter.Cast<string>( column[13] ), // Location repeated here!!!
                FormType = DataConverter.Cast<int>( column[14] ),
                MaxLength = DataConverter.Cast<double?>( column[15] ) ?? 0d,
                MaxWidth = DataConverter.Cast<double?>( column[16] ) ?? 0d,
                MaxHeight = DataConverter.Cast<double?>( column[17] ) ?? 0d,
                ElementType = DataConverter.Cast<string>( column[18] ),
            };

            RecTMElement elem = null;
            int elementId = DataConverter.Cast<int?>( column[19] ) ?? 0;
            if( 0 != elementId )
            {
                elem = new RecTMElement()
                {
                    ElementId = elementId,
                    ElementMark = DataConverter.Cast<string>( column[20] ),

                    Building = DataConverter.Cast<string>( column[21] ),
                    FloorId = DataConverter.Cast<int?>( column[22] ) ?? 0,
                    Phase = DataConverter.Cast<string>( column[23] ),

                    ErectionSequenceNo = DataConverter.Cast<int?>( column[24] ) ?? 0,
                    TransportId = DataConverter.Cast<int?>( column[25] ) ?? 0,

                    BedSequenceNo = DataConverter.Cast<int>( column[26] ),
                    BedX = DataConverter.Cast<double>( column[27] ),
                    BedY = DataConverter.Cast<double>( column[28] ),
                    BedZ = DataConverter.Cast<double>( column[29] ),
                    BedRotation = DataConverter.Cast<double>( column[30] ),
                    ElementIdStatus = DataConverter.Cast<int>( column[31] ),

                    ProductionDate = column[32].Cast<DateTime?>(),
                    PlannedProductionDate = column[33].Cast<DateTime?>(),

                    ElementLength = DataConverter.Cast<double?>( column[34] ) ?? 0d,
                    ElementWidth = DataConverter.Cast<double?>( column[35] ) ?? 0d,
                    ElementHeight = DataConverter.Cast<double?>( column[36] ) ?? 0d,
                    ElementType = DataConverter.Cast<string>( column[37] ),
                    GrossArea = DataConverter.Cast<double?>( column[38] ) ?? 0d,
                    NetArea = DataConverter.Cast<double?>( column[39] ) ?? 0d,
                    Volume = DataConverter.Cast<double?>( column[40] ) ?? 0d,
                    Product = DataConverter.Cast<string>( column[41] ),
                    Project = DataConverter.Cast<string>( column[42] ),
                    AngleLeft = DataConverter.Cast<double?>( column[43] ) ?? 0d,
                    AngleRight = DataConverter.Cast<double?>( column[44] ) ?? 0d,
                    Mass = DataConverter.Cast<double?>( column[45] ) ?? 0d,

                    Style = DataConverter.Cast<string>( column[46] ),
                    Strandptn = DataConverter.Cast<string>( column[47] ),
                    NbrOfStrands = DataConverter.Cast<int>( column[48] ),
                };
            }

            return new DataHolder( cast, form, elem );
        }
        /// <summary>
        /// Create Production Cast
        /// </summary>
        /// <param name="castUnit"></param>
        /// <param name="element"></param>
        /// <returns></returns>
        public RecProductionCast AdjustProductionCastToElement( RecProductionFormStd castUnit, RecTMElement element )
        {
            var productionBed = this.GetCastUnit( castUnit ); 

            return null == productionBed ? null : productionBed.AdjustProductionCastToElement( element );
        }
		/// <summary>
		/// 
		/// </summary>
		/// <param name="record"></param>
		/// <returns></returns>
		public int GetCastCount(  RecProductionFormStd record )
		{
			if( record == null )
			{
				throw new ArgumentNullException( "Production Cast" );
			}
			int ret = 0;
			using( ImpactDatabase database = new ImpactDatabase() )
			{
                ImpactQuery query = new ImpactQuery()
                {
                    Select =
					{
						 Aggregate.Count( )
					},
                    From = { ImpProductionCast.As( "T1" ) },

                    Join =
                    {
					    Join.Left( ImpModelPlanning.As( "T2" ),	
						    ImpProductionCast.Factory.Equal( ImpModelPlanning.Factory ),
						    ImpProductionCast.Project.Equal( ImpModelPlanning.Factory ),// Factory, Factory for productionCast & ProductionCastStrand
						    ImpProductionCast.CastId.Equal( ImpModelPlanning.CastId ) ),
                    },

                     Where = 
                     { 
                         ImpProductionCast.Factory.Equal( record.Factory ), 
						 ImpProductionCast.Form.Equal( record.Name ),
						 ImpModelPlanning.CastId.GreaterThan( 0 )
                     },
                };
				string statement = query.ToString();
				List<int> result = null;
				try
				{
					result = database.GetAll( statement, column =>
					{
						return DataConverter.Cast<int?>( column[0] ) ?? 0;
					} );
					ret = result[0];
				}
				catch( Exception ) { }//Just eat it please!
			}
			return ret;
		}
 /// <summary>
 /// Returns forms Production Cast if any otherwise null is returned
 /// </summary>
 /// <param name="castUnit"></param>
 /// <returns></returns>
 public RecProductionCast GetProductionCast( RecProductionFormStd castUnit )
 {
     var productionBed = this.GetCastUnit( castUnit );
     return null == productionBed ? null : productionBed.GetProductionCast();
 }
	    /// <summary>
        /// Position Elements OnBed
        /// </summary>
        /// <param name="bed"></param>
        /// <param name="elements"></param>
        /// <returns></returns>
		public List<RecTMElement> PositionElementsOnBed( RecProductionFormStd bed, List<RecTMElement> elements )
		{
            var productionBed = this.GetCastUnit( bed );
            if( null == productionBed )
            {
                return null;
            }

            productionBed.PrepareLastElement();
            var result = productionBed.FillBed( elements );
			return result;
		}
        /// <summary>
        /// CastUnit
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
		private ProductionBed GetCastUnit( RecProductionFormStd form)
		{
		    // Search for available Bed
		    return this.CastUnits.FirstOrDefault( curBed => curBed.Name.Equals( form.Name ) );
		}
        /// <summary>
        /// Returns a list of elements that are allowed to bed positioned of the given castunit(bed)
        /// </summary>
        /// <param name="filter">curFilter</param>
        /// <param name="form">castunit</param>
        /// <param name="recProductionCast"> </param>
        /// <param name="elements">A list of elements to be positioned</param>
        /// <param name="strict">Strict flag</param>
        /// <returns></returns>
        private List<RecTMElement> LoadAllowedElements( BedFilter filter, RecProductionFormStd form, RecProductionCast recProductionCast, List<RecTMElement> elements, bool strict )
        {
            if( elements == null || elements.Count == 0 || form == null &&
                filter == null || string.IsNullOrEmpty( filter.Factory ) || string.IsNullOrEmpty( filter.Project ) )
            {
                return null;
            }

            var inVect = ( from o in elements select o.ElementId ).ToArray();

            List<RecTMElement> result;
            var query = new ImpactQuery()
            {
                Select =
				{
                    ImpElement.ElementMark,

                    ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,

                    ImpElement.ElementType,
                    ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,

                    ImpModelGeometry.Factory,
                    ImpModelGeometry.Project,
                    ImpModelGeometry.ElementId,
				},

                From = { ImpElement.As( "ELM" ) },

                Join =
				{
					Join.Left( ImpModelGeometry.As( "GEO" ),	
						ImpModelGeometry.Factory.Equal( ImpElement.Factory ),
						ImpModelGeometry.Project.Equal( ImpElement.Project ),
						ImpModelGeometry.ElementMark.Equal( ImpElement.ElementMark ) ),
				},

                Where = {
							ImpElement.Factory.Equal( filter.Factory ), 
							ImpElement.Project.Equal( filter.Project ), 
							ImpModelGeometry.ElementId.In( inVect ), 
						},
            };

            if( form != null && ( strict && form.FormType == FormType.Bed ) )
            {
                query.Where.Add( ImpElement.ElementType.Equal( form.ElementType ) );

                var hasStrands = form.ElementType.Equals( ImpactElementType.HollowCore ) ||
                                  form.ElementType.Equals( ImpactElementType.PrestressedSlab ) ||
                                  form.ElementType.Equals( ImpactElementType.PrestressedFormSlab );

                if( hasStrands )
                {
                    if( filter.ForceStyleControl )
                    {
                        var style = (null != recProductionCast)? recProductionCast.Style : form.Style;
                        var strandptn = (null != recProductionCast)? recProductionCast.Strandptn : form.Strandptn;
                        var nbrOfStrands = (null != recProductionCast)? GetNumberOfStrands( recProductionCast ) : GetNumberOfStrands( form );

                        query.Where.Add( ImpElement.Style.Equal( style ) );
                        query.Where.Add( ImpElement.Strandptn.Equal( strandptn ) );
                        query.Where.Add( ImpElement.NbrOfStrands.LessThanOrEqual( nbrOfStrands ) );
                    }
                }
            }

            var statement = query.ToString();
            using( var database = new ImpactDatabase() )  
            {
                result = database.GetAll( statement, ElementParse );
            }

            return result;
        }
		/// <summary>
		/// Insert the specified record into the database.
		/// </summary>
		/// <param name="record">The record to insert into the database.</param>
		/// <returns>The number of affected records.</returns>
		public int InsertProductionFormStd( RecProductionFormStd record )
		{
			var insert = new ImpactInsert( ImpProductionFormStd.Instance )
			{
				Columns = 
				{
					{ ImpProductionFormStd.Factory, record.Factory },
					{ ImpProductionFormStd.Project, record.Factory }, // Factory level ie(Factory, Factory)!!!
					{ ImpProductionFormStd.Name, record.Name },
					{ ImpProductionFormStd.FormType, record.FormType },
					{ ImpProductionFormStd.Description, record.Description },
					{ ImpProductionFormStd.Location, record.Location },
					{ ImpProductionFormStd.NbrOfShift, record.NbrOfShift },
					{ ImpProductionFormStd.Length, record.Length },
					{ ImpProductionFormStd.Width, record.Width },
					{ ImpProductionFormStd.Height, record.Height },
					{ ImpProductionFormStd.Tolerance, record.Tolerance },
					{ ImpProductionFormStd.MaxLength, record.MaxLength },
					{ ImpProductionFormStd.MaxWidth, record.MaxWidth },
					{ ImpProductionFormStd.MaxHeight, record.MaxHeight },
					{ ImpProductionFormStd.MaxMass, record.MaxMass },
					{ ImpProductionFormStd.ElementType, record.ElementType },
					{ ImpProductionFormStd.Style, record.Style },
					{ ImpProductionFormStd.StrandType, record.StrandType },
					{ ImpProductionFormStd.Strandptn, record.Strandptn },
					{ ImpProductionFormStd.Division, record.Division },
					{ ImpProductionFormStd.CreatedBy, record.CreatedBy },
					{ ImpProductionFormStd.CreatedDate, record.CreatedDate },
					{ ImpProductionFormStd.ChangedBy, record.ChangedBy },
					{ ImpProductionFormStd.ChangedDate, record.ChangedDate },
				}
			};

			string statement = insert.ToString();

			int result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return result;
		}
        /// <summary>
        /// Sorts element on bed
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="form"></param>
        /// <param name="sortType"></param>
        /// <returns></returns>
        public bool SortBedElements( BedFilter filter, RecProductionFormStd form, SortType sortType )
        {
            // Let's work on a copy of the given curFilter
            // Make sure that SingleElementCastUnit is set to false
            var curFilter = new BedFilter( filter ) { SingleElementCastUnit = false };

            var castData = LoadBedPlanning( curFilter, form );
            var forms = castData.CastList;
            if( forms != null )
            {
                foreach( var bed in forms )
                {
                    if( bed.ProductionCast == null )
                    {
                        continue;
                    }
                    if( bed.ProductionCast.Elements == null || bed.ProductionCast.Elements.Count <= 0 )
                    {
                        continue;
                    }
                    List<RecTMElement> sortedElements;
                    if( sortType == SortType.DimensionAscending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ElementWidth ).ThenBy( x => x.ElementLengthOnBed ).ToList();
                    }
                    else if( sortType == SortType.DimensionDescending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ElementWidth ).ThenByDescending( x => x.ElementLengthOnBed ).ToList();
                    }
                    else if( sortType == SortType.ErectionSequenceAscending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ErectionSequenceNo ).ToList();
                    }
                    else //( sortType == SortType.ErectionSequenceDescending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ErectionSequenceNo ).ToList();
                    }

                    var bpc = new ProductionBedContainer();
                    bpc.Sort( sortedElements, bed, curFilter );
                }
            }

            return true;
        }
 /// <summary>
 /// MoveElement
 /// </summary>
 /// <param name="filter"></param>
 /// <param name="form"></param>
 /// <param name="elements"></param>
 /// <returns></returns>
 public BedResult MoveElementBedManager( BedFilter filter, RecProductionFormStd form, List<RecTMElement> elements )
 {
     if( null == filter || null == form || null == elements || elements.Count == 0 )
     {
         throw new ArgumentNullException( "AutoBedManage, Missing input!" );
     }
     var castUnits = new List<RecProductionFormStd> { form };
     var positionedElements = new List<RecTMElement>();
     bool hasShiftExistingElements;
     return ProcessElement( filter, castUnits, elements, positionedElements, out hasShiftExistingElements, true );
 }
        /// <summary>
        /// Returns CastData which contains the following info
        /// (1) List<RecProductionFormStd>: a set of beds, each with one production cast ONLY.
        /// The production cast object can contain elements.
        /// (2) ProductionFormStdData: Production Forms Standard Data
        /// </summary>
        /// <param name="filter">BedFilter</param>
        /// <param name="form">RecProductionFormStd</param>
        /// <returns></returns>
        public CastData LoadBedPlanning( BedFilter filter, RecProductionFormStd form )
        {
            if( null == filter || 
                string.IsNullOrEmpty( filter.Factory ) || 
                string.IsNullOrEmpty( filter.Project ) )
            {
                return null;
            }

            ImpactQuery query = new ImpactQuery()
            {
                Select =
				{
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
                    ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
                    ImpProductionCast.CastType,
					ImpProductionCast.CastStatus,
                    ImpProductionCast.Form,
					ImpProductionCast.Shift,
					Aggregate.Count( ImpProductionCastStrand.StrandPos ),

					ImpProductionFormStd.Name,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,
                    ImpProductionFormStd.Style,
					ImpProductionFormStd.Strandptn,
                    ImpProductionFormStd.StrandType,
                    ImpProductionFormStd.FormType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,
					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,
                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

					ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
                    ImpElement.Volume,
                },

                From = { ImpProductionFormStd.As( "FRM" ) },

                Join =
				{
					Join.Left( ImpProductionCast.As( "CST" ),	
						ImpProductionCast.Factory.Equal( ImpProductionFormStd.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionFormStd.Project ),//Factory, Factory
						ImpProductionCast.Form.Equal( ImpProductionFormStd.Name ) ),

					Join.Left( ImpProductionCastStrand.As( "STA" ),	
						ImpProductionCast.Factory.Equal( ImpProductionCastStrand.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionCastStrand.Project ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.CastId.Equal( ImpProductionCastStrand.CastId ) ),


					Join.Left( ImpModelPlanning.As( "MPL" ),	
						ImpProductionCast.Factory.Equal( ImpModelPlanning.Factory ),
						ImpProductionCast.Project.Equal( ImpModelPlanning.Factory ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.CastId.Equal( ImpModelPlanning.CastId ) ),


					Join.Left( ImpModelGeometry.As( "MGO" ),	
						ImpModelPlanning.Factory.Equal( ImpModelGeometry.Factory ),
						ImpModelPlanning.Project.Equal( ImpModelGeometry.Project ),
						ImpModelPlanning.ElementId.Equal( ImpModelGeometry.ElementId ) ),

					Join.Left( ImpElement.As( "ELM" ),	
						ImpModelGeometry.Factory.Equal( ImpElement.Factory ),
						ImpModelGeometry.Project.Equal( ImpElement.Project ),
						ImpModelGeometry.ElementMark.Equal( ImpElement.ElementMark ) ),
				},

                Where = {
							ImpProductionCast.Factory.Equal( filter.Factory ), 
							ImpProductionCast.Project.Equal( filter.Factory ), // Factory, Factory for productionCast & ProductionCastStrand
							ImpProductionCast.StartDate.Equal( filter.StartDateFrom ), 
                            ImpProductionCast.Shift.Equal( filter.Shift ), 
						   // ImpModelPlanning.CastId.GreaterThan( 0 ),      // Get even the casts without elements!
						},

                GroupBy = 
                {
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
                    ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
                    ImpProductionCast.CastType,
					ImpProductionCast.CastStatus,
					ImpProductionCast.Form,
					ImpProductionCast.Shift,

					ImpProductionFormStd.Name,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,
                    ImpProductionFormStd.Style,
					ImpProductionFormStd.Strandptn,
                    ImpProductionFormStd.StrandType,
                    ImpProductionFormStd.FormType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,
					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,
                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

					ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
                    ImpElement.Volume,
                },

                OrderBy = 
				{ 
					{ ImpElement.Project },
					{ ImpProductionFormStd.Name },
					{ ImpProductionCast.CastId },
					{ ImpModelPlanning.BedSequenceNo, OrderBy.Ascending }
				},
            };

            if( filter.FormType != FormType.All )
            {
                query.Where.Add( ImpProductionCast.CastType.Equal( filter.FormType ) );
            }

            if( !string.IsNullOrWhiteSpace( filter.Location ) && !filter.Location.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionFormStd.Location.Equal( filter.Location ) );
            }
            if( !filter.Bed.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionCast.Form.Equal( filter.Bed ) );
            }

            // used when sorting elements on bed
            if( form != null && !string.IsNullOrWhiteSpace( form.Name ) )
            {
                query.Where.Add( ImpProductionFormStd.Name.Equal( form.Name ) );
            }

            var statement = query.ToString();

            var tmList = new List<RecProductionFormStd>();
            var parser = new FormParser( tmList );

            using( var database = new ImpactDatabase() )
            {
                var list = database.GetAll( statement, ParseCast );

                foreach( var item in list )
                {
                    item.Form.Factory = filter.Factory;
                    item.Cast.Factory = filter.Factory;

                    item.Form.Project = filter.Project; // What does that really mean!
                    item.Cast.Project = filter.Project; // What does that really mean!

                    if( null != item.Element )
                    {
                        item.Element.Factory = filter.Factory;
                        // Never set element.project to curFilter.project
                        // since we retrieve elmenets from different projects!
                    }

                    parser.Parse( item.Form, item.Cast, item.Element );
                }
            }

            var formSvc = new ProjectManager();
            var filter2 = new BedFilter( filter ) { Location = "" };
            var productionFormStdData = formSvc.LoadProductionFormStd( filter2 );

            // Load strands
            LoadCastStrands( tmList, filter );
            LoadFormStrands( productionFormStdData.Forms, filter );

            return new CastData( tmList, productionFormStdData );
        }
        /// <summary>
        /// LoadHollowcoreStrands
        /// </summary>
        /// <param name="form"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        private List<RecProductionFormStrandStd> LoadHollowcoreStrands( RecProductionFormStd form, Filter filter )
        {

            if( string.IsNullOrEmpty( form.Style ) || string.IsNullOrEmpty( form.Strandptn ) )
            {
                return null;
            }
            var strandSvc = new ProjectManager();
            var strands = strandSvc.LoadStrands(
                            filter.Factory,
                            filter.Project,
                            form.ElementType,
                            form.Style,
                            form.Strandptn );
            if( null != strands && strands.Count > 0 )
            {
                var list = new List<RecProductionFormStrandStd>();
                foreach( var strand in strands)
                {
                    var strandStd = new RecProductionFormStrandStd 
                    { 
                        Factory = strand.Factory, 
                        Project = strand.Project, 
                        StrandPos = strand.StrandPos, 
                        StrandX = strand.StrandX, 
                        StrandY = strand.StrandY, 
                        StrandQuality = strand.StrandQuality,
                        StrandDimension = strand.StrandDimension,
                        StrandPrestressing = strand.StrandPrestressing,
                    };

                    list.Add( strandStd );
                }

                return list;
            }

            return null;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="records"></param>
        /// <param name="form"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        public int BulkInsertProductionCastStrand( List<RecProductionCastStrand> records, RecProductionFormStd form, BedFilter filter )
        {
            if( null == records || records.Count == 0 )
            {
                return -1;
            }

            foreach( var recProductionCastStrand in records )
            {
                this.InsertProductionCastStrand( recProductionCastStrand, form, filter );
            }

            return 0;
        }
 /// <summary>
 /// Saves elements into db
 /// </summary>
 /// <param name="bed"></param>
 /// <param name="elements"></param>
 public void Save( RecProductionFormStd bed, List<RecTMElement> elements )
 {
     var productionBed = this.GetCastUnit( bed );
     if( null == productionBed )
     {
         return;
     }
   
     if( null != elements && elements.Count > 0 )
     {
         productionBed.Save( elements );
     }
 }
	    /// <summary>
		/// Insert the specified record into the database.
		/// </summary>
		/// <param name="record">The record to insert into the database.</param>
		/// <returns>The number of affected records.</returns>
        public int InsertProductionCastStrand(RecProductionCastStrand record, RecProductionFormStd form, BedFilter filter)
		{
            if (null == record)
            {
                return -1;
            }
            int castId = record.CastId;
            if (castId <= 0)
            {
                if (null == form || null == filter)
                {
                    return -1;
                }
                var cast = new RecProductionCast
                    {
                        Factory = record.Factory,
                        Project = record.Project,
                        CastType = form.FormType,
                        Description = "",
                        Shift = filter.Shift,
                        StartDate = filter.StartDateFrom,
                        EndDate = filter.StartDateFrom,
                        Form = form.Name,
                        Tolerance = form.Tolerance,
                        ElementType = form.ElementType,
                        Style = form.Style,
                        Strandptn = form.Strandptn,
                        CastStatus = 0,
                        CastDivision = ""
                    };

                var svc = new ProjectManager();
                var newCast = svc.InsertProductionCast(cast);
                castId = newCast.CastId;
            }

			var insert = new ImpactInsert( ImpProductionCastStrand.Instance )
			{
				Columns = 
				{
					{ ImpProductionCastStrand.Factory, record.Factory },
					{ ImpProductionCastStrand.Project, record.Factory },// Factory, Factory for productionCast & ProductionCastStrand
					{ ImpProductionCastStrand.CastId, castId },
					{ ImpProductionCastStrand.StrandPos, record.StrandPos },
					{ ImpProductionCastStrand.StrandX, record.StrandX },
					{ ImpProductionCastStrand.StrandY, record.StrandY },
					{ ImpProductionCastStrand.StrandQuality, record.StrandQuality },
					{ ImpProductionCastStrand.StrandDimension, record.StrandDimension },
					{ ImpProductionCastStrand.StrandPrestressing, record.StrandPrestressing },
				}
			};

			string statement = insert.ToString();

			int result;

			using( var database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return result;
		}
        /// <summary>
        /// Parses one row in <see cref="System.Data.Common.DbDataReader"/> into
        /// a new instance of <see cref="Paths.Common.Records.RecProductionFormStd"></see>.
        /// </summary>
        /// <param name="dataReader"></param>
        /// <returns></returns>
        public static RecProductionFormStd ParseProductionFormStd( DbDataReader dataReader )
		{
			var record = new RecProductionFormStd();
			record.Factory = DataConverter.Cast<string>( dataReader[0] );
			record.Project = DataConverter.Cast<string>( dataReader[1] );
			record.Name = DataConverter.Cast<string>( dataReader[2] );
			record.FormType = DataConverter.Cast<int>( dataReader[3] );
			record.Description = DataConverter.Cast<string>( dataReader[4] );
			record.Location = DataConverter.Cast<string>( dataReader[5] );
			record.NbrOfShift = DataConverter.Cast<int>( dataReader[6] );
			record.Length = DataConverter.Cast<double>( dataReader[7] );
			record.Width = DataConverter.Cast<double>( dataReader[8] );
			record.Height = DataConverter.Cast<double>( dataReader[9] );
			record.Tolerance = DataConverter.Cast<double>( dataReader[10] );
			record.MaxLength = DataConverter.Cast<double>( dataReader[11] );
			record.MaxWidth = DataConverter.Cast<double>( dataReader[12] );
			record.MaxHeight = DataConverter.Cast<double>( dataReader[13] );
			record.MaxMass = DataConverter.Cast<double>( dataReader[14] );
			record.ElementType = DataConverter.Cast<string>( dataReader[15] );
			record.Style = DataConverter.Cast<string>( dataReader[16] );
			record.StrandType = DataConverter.Cast<int>( dataReader[17] );
			record.Strandptn = DataConverter.Cast<string>( dataReader[18] );
			record.Division = DataConverter.Cast<string>( dataReader[19] );
			record.CreatedBy = DataConverter.Cast<string>( dataReader[20] );
			record.CreatedDate = DataConverter.Cast<System.DateTime?>( dataReader[21] );
			record.ChangedBy = DataConverter.Cast<string>( dataReader[22] );
			record.ChangedDate = DataConverter.Cast<System.DateTime?>( dataReader[23] );

            record.NumOfStrands = DataConverter.Cast<int>( dataReader[24] );
			return record;
		}