public static Tuple <int, string> AddUpdateDelete(string mode, int rowid, string rampid, string vendnum, DateTime datefrom, DateTime dateto, int palqnty, int src, int blocktype, string remark, int startrowid, string inetname, bool checkblockcolision) { int result = 0; string result2 = ""; DateTime tmpdatetime; SqlConnection conn = new SqlConnection(ConnString.Value); SqlCommand cmd = new SqlCommand(); SqlDataReader dr; try { rampid = rampid.Trim(); vendnum = vendnum.Trim(); string name = ""; string surname = ""; cmd.Connection = conn; cmd.Connection.Open(); if (mode.ToUpper() == "NEW" || mode.ToUpper() == "MODIFY") { // 1. je to aktivny dodavatel? cmd.CommandText = "SELECT xftimeflag, xftimeval FROM sapvendors WHERE num=@Num AND xactive=1"; cmd.Parameters.Clear(); cmd.Parameters.Add("@Num", SqlDbType.NVarChar).Value = vendnum; dr = cmd.ExecuteReader(); if (dr.HasRows) { dr.Read(); if (dr.GetValue(0).ToString().Trim() == "1") { // 2. datum/cas zaciatku vykladky je vacsi alebo rovny minimalnemu casu vykladky danej firmy if (datefrom < DateTime.ParseExact(datefrom.ToString("yyyy-MM-dd") + " " + dr.GetValue(1).ToString().Trim() + ":00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)) { // Cas zaciatku vykladky je nizsi ako minimalny cas vykladky tohto dodavatela! result = -1; } } } else { // Neaktivny dodavatel sa neda vykladat! result = -2; } dr.Close(); cmd.Dispose(); if (result == 0) { // 3. na tejto rampe moze byt vylozena tato firma (pripad, ze firmu, co ma vyhradenu svoju jednu rampu alebo viac ramp, sa pokusame zapisat na inu rampu) if (TruckrampFuncs.AllowReservationVendOnRamp(1, rampid, vendnum) == false) { // Tento dodavatel sa na tejto rampe nevyklada! (1) result = -3; } dr.Close(); cmd.Dispose(); } if (result == 0) { // 4. na tejto rampe moze byt vylozena tato firma (pripad, ze firmu, co nema vyhradenu ziadnu svoju rampu, sa pokusame zapisat na vyhradenu rampu inych firiem) if (TruckrampFuncs.AllowReservationVendOnRamp(2, rampid, vendnum) == false) { // Tento dodavatel sa na tejto rampe nevyklada! (2) result = -4; } } if (result == 0) { // 5. datum zaciatku vykladky je pracovny den tmpdatetime = DateTime.ParseExact(datefrom.ToString("yyyy-MM-dd") + " 06:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); if (WorkCalendar.IsCalWorkDay(DateTime.ParseExact(datefrom.ToString("yyyy-MM-dd") + " 00:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddDays(datefrom < tmpdatetime ? -1 : 0)) != 1) { // Zaciatok vykladky spada do nepracovneho dna! result = -5; } } if (result == 0) { // 6. datum konca vykladky je pracovny den tmpdatetime = DateTime.ParseExact(dateto.ToString("yyyy-MM-dd") + " 06:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); if (WorkCalendar.IsCalWorkDay(DateTime.ParseExact(dateto.ToString("yyyy-MM-dd") + " 00:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddDays(dateto < tmpdatetime ? -1 : 0)) != 1) { // Koniec vykladky spada do nepracovneho dna! result = -6; } } if (result == 0) { // 7. datum/cas zaciatku vykladky je pracovna smena if (WorkCalendar.IsCalWorkDayShiftInDateTime(rampid.Trim(), datefrom) != 1) { // Cas zaciatku vykladky spada do nepracovnej smeny tejto linky! result = -7; } } if (result == 0) { // 8. datum/cas konca vykladky je pracovna smena if (WorkCalendar.IsCalWorkDayShiftInDateTime(rampid.Trim(), datefrom) != 1) { // Cas konca vykladky spada do nepracovnej smeny tejto linky! result = -8; } } if (result == 0 && checkblockcolision == true) { // 9. nekoliduje s blokovanym casom rampy if (datefrom.ToString("yyyy-MM-dd") == dateto.ToString("yyyy-MM-dd")) { // ak je zaciatok a koniec vykladky v jednom dni if (TruckrampFuncs.BlockResColision("truckramps_block", rampid, datefrom, datefrom.ToString("HH:mm:ss"), dateto.ToString("HH:mm:ss"), 0) != 0) { // Vykladka koliduje s niektorym blokovanym casom rampy! (1) result = -9; } } else { // ak je zaciatok a koniec vykladky v roznych dnoch, teda zacina pred pol nocou a konci po nej // skontrolujeme najprv jej cast od zaciatku po polnoc if (TruckrampFuncs.BlockResColision("truckramps_block", rampid, datefrom, datefrom.ToString("HH:mm:ss"), "23:59:59", 0) != 0) { // Vykladka koliduje s niektorym blokovanym casom rampy! (2) result = -10; } else { // a potom cast od polnoci po koniec if (TruckrampFuncs.BlockResColision("truckramps_block", rampid, dateto, "00:00:00", dateto.ToString("HH:mm:ss"), 0) != 0) { // Vykladka koliduje s niektorym blokovanym casom rampy! (3) result = -11; } } } } if (result == 0) { // 10. nekoliduje s pevnou rezervaciou rampy if (datefrom.ToString("yyyy-MM-dd") == dateto.ToString("yyyy-MM-dd")) { // ak je zaciatok a koniec vykladky v jednom dni if (TruckrampFuncs.BlockResColision("sapvendors_res", rampid, datefrom, datefrom.ToString("HH:mm:ss"), dateto.ToString("HH:mm:ss"), 0) != 0) { // Vykladka koliduje s niektorou pevnou rezervaciou dodavatela! (1) result = -12; } } else { // ak je zaciatok a koniec vykladky v roznych dnoch, teda zacina pred pol nocou a konci po nej // skontrolujeme najprv jej cast od zaciatku po polnoc if (TruckrampFuncs.BlockResColision("sapvendors_res", rampid, datefrom, datefrom.ToString("HH:mm:ss"), "23:59:59", 0) != 0) { // Vykladka koliduje s niektorou pevnou rezervaciou dodavatela! (2) result = -13; } else { // a potom cast od polnoci po koniec if (TruckrampFuncs.BlockResColision("sapvendors_res", rampid, dateto, "00:00:00", dateto.ToString("HH:mm:ss"), 0) != 0) { // Vykladka koliduje s niektorou pevnou rezervaciou dodavatela! (3) result = -14; } } } } if (result == 0) { // 11. nekoliduje s dynamickou rezervaciou if (TruckrampFuncs.UnloadColision(rampid, datefrom, dateto, rowid) != 0) { // Vykladka koliduje s inou vykladkou! result = -15; } } if (result == 0 && Strings.Decrypt(inetname).Trim() != "") { // 12. pracovnik existuje List <Sapvendor_pers> pers = Sapvendors_persDataManagement.GetData(2, inetname.Trim()); if (pers.Count == 0) { // Neexistujúci pracovnik result = -16; } else { name = pers[0].Name; surname = pers[0].Surname; } } } if (result == 0) { cmd.Parameters.Clear(); cmd.Parameters.Add("@Rampid", SqlDbType.NVarChar).Value = rampid; cmd.Parameters.Add("@Vendnum", SqlDbType.NVarChar).Value = vendnum; cmd.Parameters.Add("@FromDate", SqlDbType.DateTime).Value = datefrom; cmd.Parameters.Add("@ToDate", SqlDbType.DateTime).Value = dateto; cmd.Parameters.Add("@Palqnty", SqlDbType.SmallInt).Value = palqnty; cmd.Parameters.Add("@Src", SqlDbType.TinyInt).Value = src; cmd.Parameters.Add("@Blocktype", SqlDbType.TinyInt).Value = blocktype; cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark; cmd.Parameters.Add("@Startrowid", SqlDbType.SmallInt).Value = startrowid; cmd.Parameters.Add("@Rowid", SqlDbType.Int).Value = rowid; cmd.Parameters.Add("@Inetname", SqlDbType.NVarChar).Value = inetname; cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = name; cmd.Parameters.Add("@Surname", SqlDbType.NVarChar).Value = surname; switch (mode.ToUpper()) { case "NEW": cmd.CommandText = "INSERT INTO trucks_unloads (rampid,vendnum,datefrom,dateto,palqnty,src,blocktype,remark,startrowid,inetname,name,surname) "; cmd.CommandText = cmd.CommandText + "VALUES (@Rampid, @Vendnum, @FromDate, @ToDate, @Palqnty, @Src, @Blocktype, @Remark, @Startrowid, @Inetname, @Name, @Surname);"; cmd.CommandText = cmd.CommandText + "SELECT CAST(scope_identity() AS int) AS rowid"; result = (Int32)cmd.ExecuteScalar(); break; case "MODIFY": cmd.CommandText = "UPDATE trucks_unloads SET rampid=@Rampid, vendnum=@Vendnum, datefrom=@FromDate, dateto=@ToDate, palqnty=@Palqnty, src=@Src, blocktype=@Blocktype, "; cmd.CommandText = cmd.CommandText + "remark=@Remark, startrowid=@Startrowid, inetname=@Inetname, name=@Name, surname=@Surname WHERE rowid=@Rowid"; cmd.ExecuteNonQuery(); break; case "DELETE": cmd.CommandText = "DELETE FROM trucks_unloads WHERE rowid=@Rowid"; cmd.ExecuteNonQuery(); break; } cmd.Dispose(); } } catch (Exception ex) { result = -16; result2 = ex.Message; } finally { conn.Close(); conn.Dispose(); } return(Tuple.Create(result, result2)); }
public IActionResult OnPostOK() { if (!ModelState.IsValid) { GetFooter(); return(Page()); } ResData.Remark = (ResData.Remark != null ? ResData.Remark.Trim() : ""); bool success = true; DateTime resdate; int unloadrowid = 0; List <TimeSlice> freetimeslices = new List <TimeSlice>(); SqlConnection conn = new SqlConnection(ConnString.Value); SqlCommand cmd = new SqlCommand(); SqlDataReader dr; try { resdate = DateTime.ParseExact(ResData.Date, "yyyy-MM-dd", null); // Detaily prihlásenho užívateľa List <Sapvendor_pers> pers = Sapvendors_persDataManagement.GetData(2, Strings.Encrypt(CurrentUser.InetName)); if (pers.Count > 0) // Vždy by malo byť { List <Truckramp> truckramps = new List <Truckramp>(); cmd.Connection = conn; cmd.Connection.Open(); // Nájdeme rampy, ktoré sú priradené firme prihláseného užívateľa cmd.CommandText = "SELECT sapvendors_ramp.rampid, truckramps.dsc, truckramps.vendres, truckramps.paltime FROM sapvendors_ramp LEFT OUTER JOIN truckramps ON sapvendors_ramp.rampid=truckramps.id "; cmd.CommandText = cmd.CommandText + "WHERE sapvendors_ramp.num=@Num"; cmd.Parameters.Add("@Num", SqlDbType.NVarChar).Value = pers[0].Num.Trim(); dr = cmd.ExecuteReader(); if (dr.HasRows == false) { // Firma prihláseného užívateľa NEMÁ priradené žiadne rampy, preto skusime nájsť všetky rampy, ktoré nie su priradene žiadnej firme dr.Close(); cmd.Dispose(); cmd.CommandText = "SELECT truckramps.id, truckramps.dsc, truckramps.vendres, truckramps.paltime FROM truckramps "; cmd.CommandText = cmd.CommandText + "EXCEPT SELECT truckramps.id, truckramps.dsc, truckramps.vendres, truckramps.paltime FROM truckramps JOIN sapvendors_ramp ON truckramps.id = sapvendors_ramp.rampid"; dr = cmd.ExecuteReader(); } if (dr.HasRows) { // Našli sa rampy while (dr.Read()) { truckramps.Add(new Truckramp(dr.GetValue(0).ToString().Trim(), Strings.Decrypt(dr.GetValue(1).ToString().Trim()), Int32.Parse(dr.GetValue(2).ToString().Trim()), dr.GetValue(3).ToString().Trim())); } } dr.Close(); cmd.Dispose(); if (truckramps.Count == 0) { ResData.ErrorMsg = _loc["There is no available ramp for your company"]; success = false; } if (success == true) { // Kontrola u každej rampy, že v daný deň je na nej v kalenáry smien zadefinovaná aspoň jedna pracovná smena for (int i = truckramps.Count - 1; i >= 0; i--) { if (WorkCalendar.IsCalWorkDayShiftInDate(truckramps[i].Id, resdate) == 0) { // V daný deň na danej rampe nie je žiadna pracovná smena, vyradíme teda rampu zo zoznamu // !!! Keďže prechádzame zoznam rámp od konca po prvú, môžeme v cykle použiť metódu RemoveAt truckramps.RemoveAt(i); } } if (truckramps.Count == 0) { // Na žiadnej z rámp možných použiť pre firmu prihláseného užívateľa nie je v daný deň pracovná smena ResData.ErrorMsg = _loc["There is no working shifts for selected day on available ramps for your company"]; success = false; } } List <TimeSlice> tslices = new List <TimeSlice>(); if (success == true) { // Vytvorenie zoznamu časových dielikov (po 10 minútach) pre každú rampu a jej pracovné smeny. Zoznam je zoradeny podľa dátumu/času. Prvý dielik je napr. 2018-06-28 06:00:00-06:09:59 a posledný môže byť ďalší deň o 2018-06-29 05:50:00-05:59:59 for (int i = 0; i <= truckramps.Count - 1; i++) { if (WorkCalendar.IsCalWorkDayShiftInDateTime(truckramps[i].Id, resdate.AddHours(6)) == 1) { tslices = WorkCalendar.CreateTimeSlices(truckramps[i].Id, truckramps[i].Dsc, resdate.AddHours(6), 1, Constants.TimeSlicesPerShift, tslices, false); } if (WorkCalendar.IsCalWorkDayShiftInDateTime(truckramps[i].Id, resdate.AddHours(14)) == 1) { tslices = WorkCalendar.CreateTimeSlices(truckramps[i].Id, truckramps[i].Dsc, resdate.AddHours(14), 2, Constants.TimeSlicesPerShift, tslices, false); } if (WorkCalendar.IsCalWorkDayShiftInDateTime(truckramps[i].Id, resdate.AddHours(22)) == 1) { tslices = WorkCalendar.CreateTimeSlices(truckramps[i].Id, truckramps[i].Dsc, resdate.AddHours(22), 3, Constants.TimeSlicesPerShift, tslices, false); } } // Ak má firma minimálny čas príjazdu, tak treba vyradiť u každej rampy časové dieliky, ktoré sú pred minimálnym časom príjazdu List <Sapvendor> vendor = SapvendorDataManagement.GetData(pers[0].Num.Trim()); // Táto metóda vždy vráti práve jeden element zoznamu if (vendor.Count > 0) { // Kontrola, či má firma zapnutý príznak minimálneho času príjazdu if (vendor[0].Xftimeflag == 1) { // Pre minimálny čas príjazdu platí, že môže byť len z rozsahu 06:00-23:59. Nikdy nesmie byť z rozsahu 00:00-05:59 DateTime mindate = DateTime.ParseExact(ResData.Date + " " + vendor[0].Xftimeval + ":00", "yyyy-MM-dd HH:mm:ss", null); for (int i = 0; i <= truckramps.Count - 1; i++) { // V dielikoch rampy nájdeme tie, ktoré majú čas nižší ako minimálny čas príjazdu a také vymažeme zo zoznamu // Prechádzame dieliky všetkých rámp a hľadáme tie, ktoré patria aktuálnej rampe z nadradeného cyklu for (int j = tslices.Count - 1; j >= 0; j--) { // Zistenie či časový dielik patrí aktuálnej rampe z nadradeného cyklu a zároveň či jeho čas je nižší ako minimálny čas príjazdu if (truckramps[i].Id == tslices[j].rampid && tslices[j].startdt < mindate) { // Ak či časový dielik patrí aktuálnej rampe z nadradeného cyklu a zároveň je jeho čas nižší ako minimálny čas príjazdu, vymažeme ho zo zoznamu dielikov // !!! Keďže prechádzame zoznam rámp od konca po prvú, môžeme v cykle použiť metódu RemoveAt tslices.RemoveAt(j); } } } } } else { // Nenašla sa firma prihláseného užívateľa // Toto by nemalo nikdy nastať ResData.ErrorMsg = _loc["There is no vendor for user"]; success = false; } // Po vyradení časových dielikov pred minimálnym časom príjazdu treba skontrolovať, či ostal v aspoň jednej rampe nejaký čas, // situácia keď neostane žiadny čas môže nastať napr. v prípade, že firma má jednu rampu, čas príchodu je napr. 15:00 a v daný // deň rampa pracuje iba na rannú smenu if (tslices.Count == 0) { // Na žiadnej z rámp možných použiť pre firmu prihláseného užívateľa nie je v daný deň k dispozícii pracovný čas po minimálnom čase príjazdu ResData.ErrorMsg = _loc["There is no working times after minimal arrive time for selected day on available ramps for your company"]; success = false; } } if (success == true) { // Zaciatocný čas pracovného dňa, napr. 2018-07-04 06:00:00 DateTime workdaystart = DateTime.ParseExact(ResData.Date + " 06:00:00", "yyyy-MM-dd HH:mm:ss", null); // Koncový čas pracovného dňa, napr. 2018-07-05 05:59:59 DateTime workdayend = DateTime.ParseExact(ResData.Date + " 06:00:00", "yyyy-MM-dd HH:mm:ss", null).AddHours(24).AddSeconds(-1); // Označenie časových dielikov ako 'obsadené' blokovanými časmi, pevnými rezerváciami a dynamickými rezerváciami foreach (Truckramp ramp in truckramps) { // Nájdenie blokovaných časov každej rampy a uznačenie patričných časových dielikov ako obsadených pre blokované časy TruckrampFuncs.GetBlockResSlices("truckramps_block", ramp.Id, ramp.Dsc, resdate, tslices, cmd, dr, true); // Nájdenie pevne rezervovaných časov každej rampy a uznačenie patričných časových dielikov ako obsadených pre pevne rezervované časy TruckrampFuncs.GetBlockResSlices("sapvendors_res", ramp.Id, ramp.Dsc, resdate, tslices, cmd, dr, false); // Nájdenie dynamicky rezervovaných časov každej rampy a uznačenie patričných časových dielikov ako obsadených pre dynamicky rezervované časy TruckrampFuncs.GetUnloadSlices(ramp.Id, ramp.Dsc, workdaystart, workdayend, tslices, cmd, dr); } // Nájdenie dostatočne veľkého volného časového okna na vykládku v pracovnom čase každej rampy a nakoniec vybratie okna s najnižším časom (časom najbližším k začiatku pracovného dňa) int loadtslices, numoffree, begin_j; bool sliceok; for (int i = 0; i <= truckramps.Count - 1; i++) { // Výpočet počtu 10 minútových dielikov potrebných pre vykládku daného počtu paliet. // Prevedieme čas vykládky jednej palety na danej rampe v tvare MM:SS na sekundy, vynásobíme daným počtom paliet, dostaneme počet sekúnd nutný na vyloženie daného počtu paliet // Počet sekúnd nutný na vyloženie daného počtu paliet vydelíme počtom sekúnd jedného 10 minútového dielika a výsledok zaokrúhlime na nabližšie vyššie celé číslo // Výsledok predstavuje počet 10 minútových dielikov potrebných na vyloženie daného počtu paliet loadtslices = (int)Math.Ceiling((double)TimeFuncs.ConvToS("00:" + truckramps[i].Paltime) * (int)ResData.PalQnty / (Constants.TimeSliceLenghtInMinutes * 60)); numoffree = 0; begin_j = -1; // V dielikoch rampy nájdeme prvý súvislý blok (okno) voľných 10 minútových dielikov, ktorých počet je rovný alebo väčší ako počet dielikov potrebných na vykládku daného počtu paliet // Prechádzame dieliky všetkých rámp a hľadáme tie, ktoré patria aktuálnej rampe z nadradeného cyklu for (int j = 0; j <= tslices.Count - 1; j++) { // Zistenie či časový dielik patrí aktuálnej rampe z nadradeného cyklu if (truckramps[i].Id == tslices[j].rampid) { // Zistenie, či časový dielik je voľný if (tslices[j].loaded == false) { // Časový dielik je voľný if (begin_j == -1) { // Ak je nájdený voľný časový dielik prvý, tak si zapämatáme jeho index begin_j = j; sliceok = true; } else { // Ak je nájdený dielik druhý a ďalší v okne, tak zistíme, či náhodou nie je už z ďalšej smeny oproti prvému dieliku if (tslices[j].shift - tslices[begin_j].shift <= 1) { // Ak je nájdený dielik z tej istej smeny alebo z nasledujúcej smeny, tak je to ok, lebo okno môže začínať na konci prvej a pokračovať do druhej smeny (alebo z druhej do tretej) sliceok = true; } else { // Aj je nájdený dielik z nenadväzujúcej smeny, tak ho zahodíme a vynulujeme okno (toto rieši nepravdepodobný prípad, že je pracovná prvá smena a a potom až tretia. T. j. druhá smena je nepracovná. // Ak by sa okno začínalo na konci prvej smeny a pokračovalo na začiatku tretej, tak to nesmie byť sliceok = false; } } if (sliceok == true) { numoffree = numoffree + 1; if (numoffree >= loadtslices) { freetimeslices.Add(new TimeSlice(truckramps[i].Id, truckramps[i].Dsc, tslices[begin_j].startdt, tslices[j].enddt, 0, false, false)); break; } } else { numoffree = 0; begin_j = -1; } } else { // Dielik je obsadený. Vtedy zistíme, či je obskočitelný. Ak nie, tak vynulujeme pocitadlo. Ak áno, tak nič nenulujeme. if (tslices[j].jumpable == false) { numoffree = 0; begin_j = -1; } } } } } if (freetimeslices.Count > 0) { // Ak sa našli nejaké voľné okná v rampách v daný deň, zoradíme voľné okná podľa začiatočného času a prvá rampa bude tá s najnižším časom voľného okna freetimeslices = freetimeslices.OrderBy(o => o.startdt).ToList(); // Zapíšeme do databázy vykládku do nájdeného voľného okna Tuple <int, string> retval = Truck_unloadDataManagement.AddUpdateDelete("NEW", 0, freetimeslices[0].rampid, pers[0].Num, freetimeslices[0].startdt, freetimeslices[0].enddt, (int)ResData.PalQnty, 1, 0, Strings.Encrypt(ResData.Remark), 0, Strings.Encrypt(CurrentUser.InetName), false); unloadrowid = retval.Item1; if (unloadrowid > 0) { } else { // Vyskytla sa neznáma chyba pri zápise dát ResData.ErrorMsg = _loc["Uknown error occured ({0}), ({1})", unloadrowid, retval.Item2]; success = false; } } else { // Nenašlo sa žiadne voľné okno na žiadnej rampe v daný deň ResData.ErrorMsg = _loc["There is no available time for selected day on available ramps for your company, try another day"]; success = false; } } if (success == true && pers[0].Email.Trim() != "") { // Rezervácia prebehla v poriadku a preto užívateľovi pošleme o tom e-mail string htmlcode = System.IO.File.ReadAllText(_hostingEnviroment.ContentRootPath + "/EmailHTMLTemplate_NewReservation.html"); IHtmlLocalizer translate = _htmlLocalizerFactory.Create(Includes.AppShortName + ".Pages.Reservation", Includes.AppShortName).WithCulture(CultureInfo.CreateSpecificCulture(AppCulture.Name)); htmlcode = htmlcode.Replace("#$EMAIL-RESERVATION$#", translate["EMAIL-RESERVATION"].Value); htmlcode = htmlcode.Replace("#$EMAIL-TITLE$#", translate["EMAIL-TITLE"].Value); htmlcode = htmlcode.Replace("#$EMAIL-UNLOAD-NUMBER$#", translate["EMAIL-UNLOAD-NUMBER"].Value); htmlcode = htmlcode.Replace("#$EMAIL-UNLOAD-START$#", translate["EMAIL-UNLOAD-START"].Value); htmlcode = htmlcode.Replace("#$EMAIL-UNLOAD-END$#", translate["EMAIL-UNLOAD-END"].Value); htmlcode = htmlcode.Replace("#$EMAIL-PALETTE-QNTY$#", translate["EMAIL-PALETTE-QNTY"].Value); htmlcode = htmlcode.Replace("#$EMAIL-RAMP$#", translate["EMAIL-RAMP"].Value); htmlcode = htmlcode.Replace("#$EMAIL-REMARK$#", translate["EMAIL-REMARK"].Value); htmlcode = htmlcode.Replace("#$EMAIL-FOOTER$#", translate["EMAIL-FOOTER"].Value); htmlcode = htmlcode.Replace("#$VENDOR$#", Sapvendors_persDataManagement.GetPersInfo(CurrentUser.InetName)); htmlcode = htmlcode.Replace("#$ROWID$#", unloadrowid.ToString()); htmlcode = htmlcode.Replace("#$STARTDATETIME$#", freetimeslices[0].startdt.ToString("d.M.yyyy H:mm")); htmlcode = htmlcode.Replace("#$ENDDATETIME$#", freetimeslices[0].enddt.AddSeconds(1).ToString("d.M.yyyy H:mm")); htmlcode = htmlcode.Replace("#$PALETTES$#", ResData.PalQnty.ToString()); htmlcode = htmlcode.Replace("#$RAMP$#", freetimeslices[0].rampdsc); htmlcode = htmlcode.Replace("#$REMARK$#", ResData.Remark); AlternateView avHtml = AlternateView.CreateAlternateViewFromString(htmlcode, null, MediaTypeNames.Text.Html); LinkedResource inline = new LinkedResource(_hostingEnviroment.WebRootPath + "/images/vg_logo.jpg", MediaTypeNames.Image.Jpeg); inline.ContentId = "vg_logo.jpg"; inline.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; avHtml.LinkedResources.Add(inline); MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress(Constants.ProAlfaTruckManagementEmailAddress); mailMessage.To.Add(Strings.Decrypt(pers[0].Email.Trim())); List <Sapvendor_buy> buyers = Sapvendor_buyDataManagement.GetData(1, pers[0].Num, ""); foreach (Sapvendor_buy buyer in buyers) { if (Strings.Decrypt(buyer.Email.Trim()).Trim() != "") { mailMessage.CC.Add(Strings.Decrypt(buyer.Email.Trim())); } } mailMessage.Subject = translate["EMAIL-RESERVATION"].Value; mailMessage.AlternateViews.Add(avHtml); mailMessage.IsBodyHtml = true; _emailService.Send(mailMessage, _hostingEnviroment); } } else { success = false; } } catch (Exception ex) { success = false; HttpContext.Session.SetString(SessionVariables.LastError, ex.Message); return(RedirectToPage("/Error")); } finally { conn.Close(); conn.Dispose(); } if (success == true) { //Presmerovanie na stránku s informáciami o rezervácii return(RedirectToPage("/ReservationSummary", "Values", new { Rowid = unloadrowid, Start = freetimeslices[0].startdt.ToString("d.M.yyyy H:mm"), End = freetimeslices[0].enddt.AddSeconds(1).ToString("d.M.yyyy H:mm"), Qnty = ResData.PalQnty, RampDsc = freetimeslices[0].rampdsc, Remark = ResData.Remark, culture = AppCulture.Name })); } else { GetFooter(); return(Page()); } }