public void CreateAllStaffInAssembly_ReturnsListOfStaff()
        {
            var assembly = new Dictionary <int, int>
            {
                { SpecificStaffFunction.ManagerFunctions.HeadManager, 1 },
                { SpecificStaffFunction.ManagerFunctions.AssistentManager, 1 },
                { SpecificStaffFunction.ManagerFunctions.YouthManager, 1 },
                { SpecificStaffFunction.CoachFunctions.GoalKeepingCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.DefenceCoach, 2 },
                { SpecificStaffFunction.CoachFunctions.AttackingCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.TechnicalCoach, 2 },
                { SpecificStaffFunction.CoachFunctions.MentalCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.PhysicalCoach, 2 },
                { SpecificStaffFunction.ScoutFunctions.FirstTeamScout, 2 },
                { SpecificStaffFunction.ScoutFunctions.YouthScout, 1 },
            };
            var staff = AssemblyGeneratorBase <Staff> .CreateAllPersonsInAssembly(assembly, RandomUtil.GetRandomInt(5, 125), ePerson.Staff);

            Assert.IsNotEmpty(staff);
            Assert.AreEqual(15, staff.Count);
            foreach (var element in assembly)
            {
                Assert.AreEqual(element.Value, staff.Count(p => p.MainFunction == element.Key));
            }
        }
        /// <summary>
        /// Adds the existing records classes.
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="processView">The process view.</param>
        /// <param name="viewConfig">The view configuration.</param>
        /// <param name="process">The process.</param>
        /// <param name="assemblyGenerator">The assembly generator.</param>
        private static void AddExistingRecordsClasses(StringBuilder assemblyCode, IProcessView processView, DataCollectProcessViewConfigurator viewConfig, IProcessDefinition process, AssemblyGeneratorBase assemblyGenerator)
        {
            var dcConfig = (DataCollectViewConfig) processView.ViewConfiguration;
            var table = new TableDefinition { Name = process.Name };

            assemblyCode.AppendFormat(
               @"
    [Serializable]
    public class {0} : BaseReferenceInfo<{0}>
    {{
        {1}

        public static ReferenceFieldDefinition GetFieldDefinition()
        {{
            ReferenceFieldDefinition fieldDefinition = null;
{2}
            return fieldDefinition;
        }}
    }}
",
               GetExistingRecordsChildClassName(processView, viewConfig, process),
               AssemblyGeneratorBase.GetDisplaylistRefEditableChildProperties(table, dcConfig.ReferenceField),
               assemblyGenerator.GetReferenceDefinition(new TableDefinition {Name = process.Name}, dcConfig.ReferenceField, "fieldDefinition"));

            assemblyCode.AppendFormat(
       @"
    [Serializable]
    public class {0} : BaseReferenceInfoList<{0}, {1}>
    {{
        public static void BeginGetList(int pageNumber, int pageSize, SortList sorting, string filter, System.Action<object, IDataPortalResult> callback)
        {{
            DataPortal.BeginFetch<{0}>(new PagedCriteria {{ PageNumber = pageNumber, PageSize = pageSize, SortColumns = sorting, Filter = filter }}, (o, result) => callback(o, result));
        }}

        public void Assign(IReverseCrossReferenceItem item)
        {{
            IsReadOnly = false;
            Add(({1})item);
            IsReadOnly = true;
        }}

        public void Load(IEnumerable<IReverseCrossReferenceItem> items)
        {{
            IsReadOnly = false;

            Clear();
            AddRange(items.Cast<{1}>());

            IsReadOnly = true;
        }}
    }}
",
GetExistingRecordsListClassName(processView, viewConfig, process),
GetExistingRecordsChildClassName(processView, viewConfig, process));
        }
        public void CountNumberOfPlayers_ReturnsNumberOfPlayersInSquadAssembly()
        {
            var squadAssembly = new Dictionary <int, int>
            {
                { Position.Goaly, 5 },
                { Position.Defence, 5 },
                { Position.Midfield, 0 },
                { Position.Forward, 5 },
            };

            Assert.AreEqual(15, AssemblyGeneratorBase <Player> .CountNumberOfPersonsInAssembly(squadAssembly));
        }
        /// <summary>
        /// Called when [after add process view classes].
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="process">The process.</param>
        /// <param name="assemblyGenerator">The assembly generator.</param>
        public override void OnAfterAddProcessViewClasses(StringBuilder assemblyCode, IProcessDefinition process, AssemblyGeneratorBase assemblyGenerator)
        {
            base.OnAfterAddProcessViewClasses(assemblyCode, process, assemblyGenerator);

            foreach (var processView in process.ProcessViews)
            {
                if (processView.ViewType != ProcessViewType.APQP)
                    continue;

                var viewConfig = new APQPProcessViewConfigurator();
                viewConfig.SetConfigurationString(processView.Configuration);

            }
        }
        /// <summary>
        /// Called when [after add process view classes].
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="process">The process.</param>
        /// <param name="assemblyGenerator">The assembly generator.</param>
        public override void OnAfterAddProcessViewClasses(StringBuilder assemblyCode, IProcessDefinition process, AssemblyGeneratorBase assemblyGenerator)
        {
            base.OnAfterAddProcessViewClasses(assemblyCode, process, assemblyGenerator);

            foreach (var processView in process.ProcessViews)
            {
                if (processView.ViewType != ProcessViewType.DataCollect)
                    continue;

                var viewConfig = new DataCollectProcessViewConfigurator();
                viewConfig.SetConfigurationString(processView.Configuration);

                if (viewConfig.ExistingRecordFields.Count > 0)
                    AddExistingRecordsClasses(assemblyCode, processView, viewConfig, process, assemblyGenerator);
            }
        }
        public void CreateAllPlayersInAssembly_ReturnsListOfPlayers()
        {
            var squadAssembly = new Dictionary <int, int>
            {
                { Position.Goaly, 2 },
                { Position.Defence, 3 },
                { Position.Midfield, 3 },
                { Position.Forward, 2 },
            };
            var players = AssemblyGeneratorBase <Player> .CreateAllPersonsInAssembly(squadAssembly, RandomUtil.GetRandomInt(5, 125), ePerson.Player);

            Assert.IsNotEmpty(players);
            Assert.AreEqual(10, players.Count);
            foreach (var element in squadAssembly)
            {
                Assert.AreEqual(element.Value, players.Count(p => p.MainFunction == element.Key));
            }
        }
        public void CountNumberOfStaff_ReturnsNumberOfStaffInSquadAssembly()
        {
            var assembly = new Dictionary <int, int>
            {
                { SpecificStaffFunction.ManagerFunctions.HeadManager, 1 },
                { SpecificStaffFunction.ManagerFunctions.AssistentManager, 1 },
                { SpecificStaffFunction.ManagerFunctions.YouthManager, 1 },
                { SpecificStaffFunction.CoachFunctions.GoalKeepingCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.DefenceCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.AttackingCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.TechnicalCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.MentalCoach, 1 },
                { SpecificStaffFunction.CoachFunctions.PhysicalCoach, 1 },
                { SpecificStaffFunction.ScoutFunctions.FirstTeamScout, 1 },
                { SpecificStaffFunction.ScoutFunctions.YouthScout, 1 }
            };

            Assert.AreEqual(11, AssemblyGeneratorBase <Player> .CountNumberOfPersonsInAssembly(assembly));
        }
        /// <summary>
        /// Adds the existing records classes.
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="processView">The process view.</param>
        /// <param name="viewConfig">The view configuration.</param>
        /// <param name="process">The process.</param>
        /// <param name="assemblyGenerator">The assembly generator.</param>
        private static void AddExistingRecordsClasses(StringBuilder assemblyCode, IProcessView processView, DataCollectProcessViewConfigurator viewConfig, IProcessDefinition process, AssemblyGeneratorBase assemblyGenerator)
        {
            var dcConfig = (DataCollectViewConfig)processView.ViewConfiguration;
            var table = new TableDefinition {Name = process.Name};
            assemblyCode.AppendFormat(

                @"
    [Serializable]
    public class {0} : BaseReferenceInfo<{0}>
    {{
        {1}

        public static {0} Get{0}(SafeDataReader reader)
        {{
            return DataPortal.FetchChild<{0}>(reader);
        }}

        private void Child_Fetch(SafeDataReader reader)
        {{
            var displayName = new System.Text.StringBuilder();
{2}
        }}

        public static Cebos.Veyron.SharedTypes.ReferenceFieldDefinition GetFieldDefinition()
        {{
            Cebos.Veyron.SharedTypes.ReferenceFieldDefinition fieldDefinition = null;
{3}
            return fieldDefinition;
        }}
    }}
",
                GetExistingRecordsChildClassName(processView, viewConfig, process),
                AssemblyGeneratorBase.GetDisplaylistRefEditableChildProperties(table, dcConfig.ReferenceField),
                ((ServerAssemblyGenerator)assemblyGenerator).GetReverseCrossRefChildPropertiesLoad(dcConfig.ReferenceField),
                assemblyGenerator.GetReferenceDefinition(table, dcConfig.ReferenceField, "fieldDefinition")
            );
        }
        /// <summary>
        /// Adds the existing records classes.
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="processView">The process view.</param>
        /// <param name="viewConfig">The view configuration.</param>
        /// <param name="process">The process.</param>
        /// <param name="assemblyGenerator">The assembly generator.</param>
        private void AddExistingRecordsClasses(StringBuilder assemblyCode, IProcessView processView, DataCollectProcessViewConfigurator viewConfig, IProcessDefinition process, AssemblyGeneratorBase assemblyGenerator)
        {
            assemblyCode.AppendFormat(
       @"
    [Serializable]
    public class {0} : BaseReferenceInfoList<{0}, {1}>
    {{
        private void DataPortal_Fetch(PagedCriteria criteria)
        {{
            var fieldDefinition = {1}.GetFieldDefinition();
            var queryGenerator = new SearchQueryGenerator {{ PageSize = criteria.PageSize, PageNumber = criteria.PageNumber }};         

            Dynamic{2}.{2}List.AddTables(queryGenerator);          
                       
            queryGenerator.RefUpdateFields(fieldDefinition);

            var filterList = (new List<IFilterDescriptor>());
            if (!string.IsNullOrWhiteSpace(criteria.Filter))
            {{
                // new JSON filter format
                filterList.Add(Cebos.Veyron.SharedTypes.FilterDescriptor.FromJSON(criteria.Filter));
            }}
            
            if (filterList.Any())
            {{
                QueryGeneratorExtensions.AddFilters(filterList, queryGenerator.Filters, queryGenerator.RootTable, queryGenerator);
            }}           

            if (criteria.SortColumns != null) 
            {{
                foreach(var col in criteria.SortColumns)
                {{
                    queryGenerator.SortOrders.Add(new Cebos.Veyron.SharedTypes.QueryGenerator.SortDescriptor(col.Direction, queryGenerator.FindColumn(col.ColumnName), col.ColumnName));
                }}               
            }}

            var cmdText = queryGenerator.RefGetQueryForList(fieldDefinition);
            
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            using (var ctx = ConnectionManager<SqlConnection>.GetManager(ServerSettings.ConnectionString, false))
            {{         
                using (var cmd = new SqlCommand(cmdText, ctx.Connection))
                {{
                    using (var reader = new SafeDataReader(cmd.ExecuteReader()))
                    {{
                        bool isFirstRow = true;

                        while (reader.Read())
                        {{
                            var item = {1}.Get{1}(reader);
                            Add(item);    

                            if (!isFirstRow) 
                            {{
                                continue;
                            }}
                            TotalRowCount = (int)reader.GetInt64(0);
                            isFirstRow = false;                     
                        }}
                    }}
                }}              
            }}

            PageNumber = criteria.PageNumber;           

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }}
    }}
",
GetExistingRecordsListClassName(processView, viewConfig, process),
GetExistingRecordsChildClassName(processView, viewConfig, process),
process.Name);
        }
 /// <summary>
 /// Called when [after add process view classes].
 /// </summary>
 /// <param name="assemblyCode">The assembly code.</param>
 /// <param name="process">The process.</param>
 /// <param name="assemblyGeneratorBase">The assembly generator base.</param>
 public virtual void OnAfterAddProcessViewClasses(StringBuilder assemblyCode, IProcessDefinition process, AssemblyGeneratorBase assemblyGeneratorBase)
 {}