AyaScript plugin - Sample: generate test workorders

The following script was recently required to diagnose a schedule component issue and we thought it might be of use to others:

//Script created: 3/29/2011 11:07:04 AM
//Name: Test - Generate random workorders
//ShowInMenuFor: Everywhere
//HandlesAyaNovaTypes: Nothing

//*** FOR DEVELOPMENT TESTING PURPOSES. DO NOT USE WITH A PRODUCTION DATABASE! ***

public static void AyaScriptMain(bool IsList, RootObjectTypes objectType, Object ayaNovaObject, List<Guid> objectIDList)
{
//Generate random test workorders and schedule markers
//Modify the values in the block below to adjust how and how many workorders are generated

            DateTime CENTRALDATE = DateTime.Today;//Half the workorders will be generated before this date and half after.  Default it today.
            int DAYSTOGENERATE = 8;//Number of days to generate test workorders for
            int WORKORDERSPERDAYTOGENERATE = 10;//Number of workorders across all users per day to generate
            int SCHEDULEMARKERSPERDAYTOGENERATE = 4;//Number of sched markers across all users per day to generate
            int PERCENTAGEOFAPPOINTMENTSTHATSPANMORETHANONEDAY = 60;//set to zero for no multi day appointments
            int MAXDAYSOFMULTIDAYAPPOINTMENTS = 5;



            if (MessageBox.Show("Generate " + DAYSTOGENERATE.ToString() + " days worth of test data now?", "Generate test data", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                return;

            Random r = new Random();
            System.Collections.Generic.List&lt;Guid&gt; UserList = new System.Collections.Generic.List&lt;Guid&gt;();

            //fill user list
            UserPickList upl = UserPickList.GetList(false);
            foreach (UserPickList.UserPickListInfo i in upl)
                if (i.Type == UserTypes.Schedulable && i.Active)
                    UserList.Add(i.ID);
            if (UserList.Count &lt; 1)
                throw new System.ApplicationException("Need at least one active, scheduleable user to generate data");

            PriorityPickList PriorityList = PriorityPickList.GetList();
            if (PriorityList.Count &lt; 1)
                throw new System.ApplicationException("Need at least one Priority to generate data");

            WorkorderStatusPickList StatusList = WorkorderStatusPickList.GetList();
            if (StatusList.Count &lt; 1)
                throw new System.ApplicationException("Need at least one workorder status to generate data");

            ClientPickList ClientList = ClientPickList.GetList();
            if (ClientList.Count &lt; 1)
                throw new System.ApplicationException("Need at least one active, client to generate data");


            //Put half the items before the central date and half after
            DateTime dtFrom = CENTRALDATE.AddDays(-(DAYSTOGENERATE / 2));

            for (int x = 0; x &lt; DAYSTOGENERATE; x++)
            {
                dtFrom = dtFrom.AddDays(1);
                DateTime dt = new DateTime(dtFrom.Year, dtFrom.Month, dtFrom.Day, 8, 0, 0);

                int WorkordersGenerated = 0;
                while (WorkordersGenerated &lt; WORKORDERSPERDAYTOGENERATE)
                {
                    Workorder w = Workorder.NewItem(WorkorderTypes.Service);
                    w.ClientID = ClientList[r.Next(ClientList.Count)].ID;
                    WorkorderItem wi = w.WorkorderItems[0];
                    WorkorderItemScheduledUser wisu = wi.ScheduledUsers.Add(wi);
                    wisu.UserID = UserList[r.Next(UserList.Count)];
                    DateTime dtStart = dt.AddHours(r.Next(8));
                    DateTime dtStop = dtStart.AddHours(r.Next(0, 4)).AddMinutes(r.Next(10) &gt; 5 ? 30 : 60);
                    if (dtStop == dtStart)
                        dtStop = dtStart.AddMinutes(30);

                    if (PERCENTAGEOFAPPOINTMENTSTHATSPANMORETHANONEDAY &gt; 0)
                    {
                        //Make a multi day appointment?
                        if (r.Next(100) &lt; PERCENTAGEOFAPPOINTMENTSTHATSPANMORETHANONEDAY)
                        {
                            //Add random days 
                            dtStop.AddDays(r.Next(1, MAXDAYSOFMULTIDAYAPPOINTMENTS + 1));
                        }
                    }


                    wisu.StartDate = dtStart;
                    wisu.StopDate = dtStop;

                    wi.PriorityID = PriorityList[r.Next(PriorityList.Count)].ID;
                    wi.WorkorderStatusID = StatusList[r.Next(StatusList.Count)].ID;

                    w.Summary = "Test work order (" + x.ToString() + ", " + WorkordersGenerated.ToString() + ")";
                    wi.Summary = w.Summary.Replace("work order", "WorkorOrderItem");
                    w.Save();
                    WorkordersGenerated++;
                }


                int ScheduleMarkersGenerated = 0;
                while (ScheduleMarkersGenerated &lt; SCHEDULEMARKERSPERDAYTOGENERATE)
                {
                    ScheduleMarker sm = ScheduleMarker.NewItem();
                    sm.ARGB = System.Drawing.Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255)).ToArgb();
                    DateTime dtStart = dt.AddHours(r.Next(8));
                    DateTime dtStop = dtStart.AddHours(r.Next(0, 4)).AddMinutes(r.Next(10) &gt; 5 ? 30 : 60);
                    if (dtStop == dtStart)
                        dtStop = dtStart.AddMinutes(30);
                    if (PERCENTAGEOFAPPOINTMENTSTHATSPANMORETHANONEDAY &gt; 0)
                    {
                        //make a multi day appointment?
                        if (r.Next(100) &lt; PERCENTAGEOFAPPOINTMENTSTHATSPANMORETHANONEDAY)
                        {
                            //Add random days 
                            dtStop.AddDays(r.Next(1, MAXDAYSOFMULTIDAYAPPOINTMENTS + 1));
                        }
                    }
                    sm.StartDate = dtStart;
                    sm.StopDate = dtStop;
                    sm.Name = "Test marker (" + x.ToString() + ", " + ScheduleMarkersGenerated.ToString() + ")";
                    sm.SourceID = UserList[r.Next(UserList.Count)];
                    sm.ScheduleMarkerSourceType = ScheduleMarkerSourceTypes.User;
                    sm.Save();
                    ScheduleMarkersGenerated++;
                }

            }

            MessageBox.Show("Done");

}