public static List <TimeSlice> GetUnloadSlices(string rampid, string rampdsc, DateTime datefrom, DateTime dateto, List <TimeSlice> tslices, SqlCommand cmd, SqlDataReader dr)
        {
            rampid  = rampid.Trim();
            rampdsc = rampdsc.Trim();
            // Zistenie dynamicky rezervovaných časov rampy ktoré spadajú do čaového úseku od-do
            List <TimeSlice> tmptslices = new List <TimeSlice>();

            cmd.CommandText = "SELECT FORMAT(datefrom, 'yyyy-MM-dd HH:mm:ss'), FORMAT(dateto, 'yyyy-MM-dd HH:mm:ss') FROM trucks_unloads WHERE rampid='" + rampid + "' ";
            cmd.CommandText = cmd.CommandText + "AND NOT ( DATEADD( ss, 1, datefrom )>@Dateto OR DATEADD( ss, -1, dateto )<@Datefrom )";
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@Rampid", SqlDbType.NVarChar).Value   = rampid;
            cmd.Parameters.Add("@Datefrom", SqlDbType.DateTime).Value = datefrom;
            cmd.Parameters.Add("@Dateto", SqlDbType.DateTime).Value   = dateto;
            dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                tmptslices.Clear();
                while (dr.Read())
                {
                    DateTime startdt     = DateTime.ParseExact(dr.GetValue(0).ToString().Trim(), "yyyy-MM-dd HH:mm:ss", null);
                    DateTime enddt       = DateTime.ParseExact(dr.GetValue(1).ToString().Trim(), "yyyy-MM-dd HH:mm:ss", null).AddSeconds(1);
                    int      diffminutes = (int)Math.Floor((double)(int)(enddt - startdt).TotalMinutes / Constants.TimeSliceLenghtInMinutes);
                    tmptslices = WorkCalendar.CreateTimeSlices(rampid, rampdsc, startdt, 1, diffminutes, tmptslices, false);
                }
                // Nájdenie každého dieliku dynamicky rezervovaného času v dielikoch pracovných smien danej rampy a ak sa nájde, tak označenie nájdeného dieliku pracovnej smeny príznakom 'obsadený'
                tslices = WorkCalendar.CompareTimeSlices(tmptslices, tslices);
            }
            dr.Close();
            cmd.Dispose();
            return(tslices);
        }
 public static int IsCalWorkDayShiftInDate(string rampid, DateTime date)
 {
     // Táto metóda zistí, či na danej rampe je v danom dni aspoň jedna smena pracovná
     // Premenná 'date' obsahuje iba dátum, čas má vo formáte 00:00:00, napr. 2018-06-26 00:00:00
     // Ak chcem otestovaťm či je v danom dátum ranná smena, tak k premennej 'date' pridám šesť hodín a dostanem dátum/čas napr. 2018-06-26 06:00:00
     // tento dátum/čas potom otestujem, či spadá do pracovnej smeny danej rampy. Rovnako pre poobednú smenu pripočítam 14 hodín a pre nočnú smenu 22 hodín
     return((WorkCalendar.IsCalWorkDayShiftInDateTime(rampid, date.AddHours(6)) == 1 || WorkCalendar.IsCalWorkDayShiftInDateTime(rampid, date.AddHours(14)) == 1 ||
             WorkCalendar.IsCalWorkDayShiftInDateTime(rampid, date.AddHours(22)) == 1) ? 1 : 0);
 }
        public static List <TimeSlice> GetBlockResSlices(string sqltable, string rampid, string rampdsc, DateTime date, List <TimeSlice> tslices, SqlCommand cmd, SqlDataReader dr, bool isjumpable)
        {
            sqltable = sqltable.Trim();
            rampid   = rampid.Trim();
            rampdsc  = rampdsc.Trim();
            // Zistenie blokovaných/rezervovaných časov rampy pre obdobie, do ktorého spadá zadaný dátum
            List <TimeSlice> tmptslices = new List <TimeSlice>();

            cmd.CommandText = "SELECT mon,tue,wed,thu,fri,sat,sun,timefrom,timeto" + (isjumpable ? ",jumpable" : "") + " FROM " + sqltable + " WHERE rampid=@Rampid AND validfrom<=@Date AND validto>=@Date ";
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@Rampid", SqlDbType.NVarChar).Value = rampid;
            cmd.Parameters.Add("@Date", SqlDbType.Date).Value       = date;
            dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                DateTime startdt, enddt;
                while (dr.Read())
                {
                    // Zistenie, či blokovaný čas platí aj pre deň v týždni na ktorý pripadá dátum zadaný užívateľom
                    if ((date.DayOfWeek == DayOfWeek.Monday && dr.GetValue(0).ToString().Trim() == "1") || (date.DayOfWeek == DayOfWeek.Tuesday && dr.GetValue(1).ToString().Trim() == "1") ||
                        (date.DayOfWeek == DayOfWeek.Wednesday && dr.GetValue(2).ToString().Trim() == "1") || (date.DayOfWeek == DayOfWeek.Thursday && dr.GetValue(3).ToString().Trim() == "1") ||
                        (date.DayOfWeek == DayOfWeek.Friday && dr.GetValue(4).ToString().Trim() == "1") || (date.DayOfWeek == DayOfWeek.Saturday && dr.GetValue(5).ToString().Trim() == "1") ||
                        (date.DayOfWeek == DayOfWeek.Sunday && dr.GetValue(6).ToString().Trim() == "1"))
                    {
                        // Vytvorenie časových dielikov (po 10 minútach) pre blokovaný čas
                        startdt = DateTime.ParseExact(date.ToString("yyyy-MM-dd") + " " + dr.GetValue(7).ToString().Trim() + ":00", "yyyy-MM-dd HH:mm:ss", null);
                        enddt   = DateTime.ParseExact(date.ToString("yyyy-MM-dd") + " " + dr.GetValue(8).ToString().Trim() + ":00", "yyyy-MM-dd HH:mm:ss", null);
                        int diffminutes = (int)Math.Floor((double)(int)(enddt - startdt).TotalMinutes / Constants.TimeSliceLenghtInMinutes);
                        tmptslices.Clear();
                        tmptslices = WorkCalendar.CreateTimeSlices(rampid, rampdsc, startdt, 1, diffminutes, tmptslices, (isjumpable ? dr.GetValue(9).ToString().Trim() == "1" : false));
                        // Nájdenie každého dieliku blokovaného času v dielikoch pracovných smien danej rampy a ak sa nájde, tak označenie nájdeného dieliku pracovnej smeny príznakom 'obsadený' prípadne o bokovaných časov rampy aj príznakom 'obskočiteľný'
                        tslices = WorkCalendar.CompareTimeSlices(tmptslices, tslices);
                    }
                }
            }
            dr.Close();
            cmd.Dispose();
            return(tslices);
        }
        public static int DetectBlockResColision(string mode, int rowid, string rampid, string validfrom, string validto, string timefrom, string timeto, int mon, int tue, int wed, int thu, int fri, int sat, int sun)
        {
            DateTime date;
            int      result = 0, retval = 0;

            for (int i = 0; i <= (DateTime.Parse(validto) - DateTime.Parse(validfrom)).Days; i++)
            {
                date = DateTime.Parse(validfrom).AddDays(i);
                if ((date.DayOfWeek == DayOfWeek.Monday && mon == 1) || (date.DayOfWeek == DayOfWeek.Tuesday && tue == 1) || (date.DayOfWeek == DayOfWeek.Wednesday && wed == 1) ||
                    (date.DayOfWeek == DayOfWeek.Thursday && thu == 1) || (date.DayOfWeek == DayOfWeek.Friday && fri == 1) || (date.DayOfWeek == DayOfWeek.Saturday && sat == 1) ||
                    (date.DayOfWeek == DayOfWeek.Sunday && sun == 1))
                {
                    //date = DateTime.ParseExact(validfrom + " 00:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddDays(i);
                    // Kontrola na koliziu s blokovanymi casami rampy
                    retval = TruckrampFuncs.BlockResColision("truckramps_block", rampid, date, timefrom, timeto, (mode.ToUpper() == "NEW" ? 0 : rowid));
                    switch (retval)
                    {
                    case 1:
                        // Zistena kolizia
                        result = -1;
                        break;

                    case -1:
                        // Vynimka v metode IsRampBlockTimeColision
                        result = -2;
                        break;
                    }
                    if (result == 0)
                    {
                        // Kontrola na koliziu s pevnymi rezervaciami rampy
                        retval = TruckrampFuncs.BlockResColision("sapvendors_res", rampid, date, timefrom, timeto, 0);
                        switch (retval)
                        {
                        case 1:
                            // Zistena kolizia
                            result = -3;
                            break;

                        case -1:
                            // Vynimka v metode IsSAPVendResTimeColision
                            result = -4;
                            break;
                        }
                    }
                }

                if (result == 0)
                {
                    retval = WorkCalendar.IsCalWorkDay(date);   // Zistenie, ci je den pracovny
                    switch (retval)
                    {
                    case 0:
                        // Den nie je pracovny podla pracovneho kalendara firmy, kontrola nie je potrebna
                        break;

                    case 1:
                        // Kontrola zaciatku blokovaneho casu na koliziu s definiciou pracovných smien rampy
                        retval = WorkCalendar.IsCalWorkDayShiftInDateTime(rampid, DateTime.ParseExact(date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture) + " " + timefrom + ":00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
                        switch (retval)
                        {
                        case 0:
                            // V dany cas nie je v kalendary rampy pracovna smena (zistena kolizia)
                            result = -5;
                            break;

                        case 1:
                            break;

                        case -1:
                            // Vynimka v metode IsCalWorkDayShift
                            result = -6;
                            break;

                        case -2:
                            // Chybajuci pracovný kalendar smien rampy
                            result = -7;
                            break;
                        }
                        if (result == 0)
                        {
                            // Kontrola konca blokovaneho casu na koliziu s definiciou pracovných smien
                            retval = WorkCalendar.IsCalWorkDayShiftInDateTime(rampid, DateTime.ParseExact(date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture) + " " + timeto + ":00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddSeconds(-1));
                            switch (retval)
                            {
                            case 0:
                                // V dany cas nie je v kalendary rampy pracovna smena (zistena kolizia)
                                result = -8;
                                break;

                            case 1:
                                break;

                            case -1:
                                // Vynimka v metode IsCalWorkDayShift
                                result = -9;
                                break;

                            case -2:
                                // Chybajuci kalendar smien rampy
                                result = -10;
                                break;
                            }
                        }
                        break;

                    case -1:
                        // Vynimka v metode IsCalWorkDay
                        result = -11;
                        break;
                    }
                }

                if (result != 0)
                {
                    break; // Opustenie cyklu for
                }
            }
            return(result);
        }