From 7387de1c18fb4e542522da7977ef2f876ccb6c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bukovenszki=20Tam=C3=A1s?= Date: Thu, 26 Oct 2017 20:51:50 +0200 Subject: [PATCH] add statistic and some fixes --- .../App_Data/ResourceImages/b4dcrlcs.jpeg | Bin 3079 -> 0 bytes .../{r3pwxdm0.jpeg => bluetooth.jpg} | Bin .../{udebpkxl.png => laptop.jpg} | Bin .../{dfxabb0x.jpeg => mobile.jpg} | Bin .../ResourceImages/{nsbf4oyr.jpeg => mt.jpg} | Bin .../App_Data/ResourceImages/phone.jpg | Bin 0 -> 3393 bytes .../App_Data/ResourceImages/projector.jpg | Bin 0 -> 2809 bytes .../Controllers/AccountController.cs | 23 +++- .../Controllers/ReservationsController.cs | 30 +++- .../Controllers/ResourcesController.cs | 21 +++ .../Controllers/StatisticsController.cs | 32 +++++ .../Controllers/SubscribeController.cs | 26 ++++ .../Helpers/NotificationHelper.cs | 5 +- .../ResoursesManager/Models/IdentityModels.cs | 27 +++- .../ResoursesManager/Models/StatisticModel.cs | 21 +++ .../ResoursesManager/ResoursesManager.csproj | 11 ++ .../ResoursesManager/Scripts/dateformat.js | 130 ++++++++++++++++++ .../Scripts/dateformat.min.js | 1 + .../Views/Reservations/Create.cshtml | 23 ++-- .../Views/Reservations/Day.cshtml | 2 +- .../Views/Reservations/Index.cshtml | 2 +- .../Views/Reservations/Week.cshtml | 2 +- .../Views/Shared/_Layout.cshtml | 5 + .../Views/Statistics/Index.cshtml | 57 ++++++++ .../ResoursesManager/logs/log.txt | 92 +++++++++++++ .../ResoursesManager/packages.config | 1 + 26 files changed, 491 insertions(+), 20 deletions(-) delete mode 100644 ResoursesManager/ResoursesManager/App_Data/ResourceImages/b4dcrlcs.jpeg rename ResoursesManager/ResoursesManager/App_Data/ResourceImages/{r3pwxdm0.jpeg => bluetooth.jpg} (100%) rename ResoursesManager/ResoursesManager/App_Data/ResourceImages/{udebpkxl.png => laptop.jpg} (100%) rename ResoursesManager/ResoursesManager/App_Data/ResourceImages/{dfxabb0x.jpeg => mobile.jpg} (100%) rename ResoursesManager/ResoursesManager/App_Data/ResourceImages/{nsbf4oyr.jpeg => mt.jpg} (100%) create mode 100644 ResoursesManager/ResoursesManager/App_Data/ResourceImages/phone.jpg create mode 100644 ResoursesManager/ResoursesManager/App_Data/ResourceImages/projector.jpg create mode 100644 ResoursesManager/ResoursesManager/Controllers/StatisticsController.cs create mode 100644 ResoursesManager/ResoursesManager/Models/StatisticModel.cs create mode 100644 ResoursesManager/ResoursesManager/Scripts/dateformat.js create mode 100644 ResoursesManager/ResoursesManager/Scripts/dateformat.min.js create mode 100644 ResoursesManager/ResoursesManager/Views/Statistics/Index.cshtml diff --git a/ResoursesManager/ResoursesManager/App_Data/ResourceImages/b4dcrlcs.jpeg b/ResoursesManager/ResoursesManager/App_Data/ResourceImages/b4dcrlcs.jpeg deleted file mode 100644 index 9aa2be21a9ea333797e2172f750cb7ba4b73d364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3079 zcmbW$cTm$?76)R5+Dzvw4n4(Xo1i}@ySCv z2uPP+V`w5BX^Xo%Z)f(e-TmIVf1NXT&S&nNtEsC+fL;fx4Fy0T5b)yq09P}B8bD4; zN=8aTPDVyXK|xMQ%}hg0MMZssk%^9(n}e5!n}dss4{}F{@1~dl7uRh$VX?nSNJ~re z3MnYbODf)xl9v4S2#A7$f|`n&orZ>8lAnuT@_)|NM}UDG2nUS7pql^@0|?9jy7~n0 z0sx5QdfHzD|0^IOFfj=!894i{tW2_wIRDk+ox zOR}4u%#sm_dE^2QvF$7dBfAhOYp+NON>(=Z8yteSgl-FqNXy8|$t&DbQ`dlMYH8~j zJ~J|Y{+o%Zjjf%%gQJtPw~w!%e?VYR)az(?Ol%w?DLEw-mG^nw5+DK zuD+qM3D^8*$EVJ&?w;PhFQa4Q6O&WZUze6wR@c_?-v}E&_Vy1BkB(1HfBtfT0PsIq zf64yC#c=H+A|?hCll^jmi2ScFn1PstUxJiTRiEsoC(}*I2y*6!iFw#|3IQpDT^4Jv z5lU8w^pfC@U$lS7{ySLY|0Vki_HWl$fEo{qp zI8w8Vs%Fin6auDbJ)oZRZIzdFCy$}+e63^`8BsYCXlE<3y4w|yR|-1?nY3~Z=a;F2 z&{Rc5+@V~`MgE%dD+803(RZGvNrYtzNc>`oHIAnXJ&+O58AMpHNq`x+j&Qkd5k+b* zKKo&&?Qv#fo<0+!D=V7-i4GaC4W_*U5*}}$31eUBz3hW(2!!OQTlcd`>}IXBJ@AlA zQq-mH-dozxdg9w<6?0mI=j7!UJG2(89W??E29Mv^7_FuSZmJ_~VY=#?m9WH=!rP<> zHV?uV#0dSXz{R^Py32DM!85Vy2AWvnKv152n|o+c*v zIcPWg3edX(UaLMdKTY#`yf^0&@HTU0uhab`KUknx`vO~`S>iO{rv(Ovvcr?l!>e+< zb)G0aiNbU1?9BO671q7&hY5NzWmn+jRbtDI{MhbQ_Q1c&`rE|w^~$Is&*DrZ1;qUD zql%%a8&?3O@{nEr#@DPr(Z89&mX&J4iu{dpYDxy;bE`zzuYl{B9mvg*LYuS`RO4OAMk+wwid-hS3Z5Fnj3=4PO*FLR-h)TP0$fuPvd~3k|L< zFAxyG~!VTC#V?O0cCQHZqtOgJ0<_<8(&@Ml0gqSUla8yHR>adkl zhkF+NDJS}pup=tCID^x|yc?9ZT~^07eFo(hH~LN){j6khjLNSbKUBKim+pHo(a+x> zJ9Fb^xkX#&VZZsDE@WS#H;@xDZs*;aY#3O;(%+YYK^07VI%+68OV?!RVDJAR85-^{ zRPSG-dy%>uXbEB9erP{ckld&=S{B@{q_jC2;tw?Lrp5S7#q@I5BzGHp z3_Be3vd+fp;VQ}JHB&UGlORJ;v16<%rdvLnpo=u7?Xx~w=MOo>aUu6Bw0=iX13v*# z|A$0wlru;y-6*1;!7Kw7zZEa$-RQAp(`lzeuD~*GW#-^Pglj<~u*;Z~ff7bHS))@G zb)<{T&q@hzIb!OSs4KMBsYll7OiP>AlW(PounclC%iT+@pqkJ&(p+|#X>}*kDP}DD9P)=Fz zx_U10f-L5crsMnLl~ZHo9AD2O)7XSRvfQcaTt^xQN)%Q@WoEyje!qzEVLK_b`ANBd zdNAW=Wsx8##;9qO$h-pKST7M2ew1N@nQTkQTV2RQffHvLB2_5y^|98kWtr=;QfTX) zX>Of$Jg+HgP5xYL&XTeud)#RkkiD#RsBNQm>{6Dgbfz)K-b?U{7asX2?kQBn>p)a(-LGqwlYgS-az`CRh=UGeA_1dThFr>nQwyj^q8qPkJU!7mT^m!7QQ)jroB?@F7C5K zn|nyQWeIb#Sgj1RCSL=vY#=+PLc}xUaaT||`=f}jg_h)ab_LS>bUEa+#q%yqzdM#W zDid)a2zhC}SKUlxwJfmCb6{+1&>9?xy^&v%dcYDF@w9u>wE4~(^a=db^`J#F+fuH2 zNr0?{C)~I@I+VvEAX3%eTWIPa_ar!GMStN1*p9>)J?`? zJ=AEs5Yyt+m{*|_6Md|*5$3ckvhlZ%xFrl;p+LMSZ0wj9QApEyX^n*{gZ1ZJBu?hx zrb(oXd@59r>}KmA`MO=4G}@lJR^csg^CzJ93LxT|q*$(kKR4}}vkNBu{u5TnsMIs0 z5)IQ^)`(9dM&X^4+l#xGtL8}@EI#0KMkk_O<~yMk`8#hUW1jqwdz~+9TKrxS75Z#HX*p+bn(+?F^q!3pzGKPotLNGzP>EdA2Zf#{fbF!^&i zx?N1Tg$8RPtkGq)SCp|wYlX|$E7EJ&t8{0Mv6aSiU(wl+{i*!NGB#F;R7E#%E#;TE zT*nCb;>u>`_@k~YC^JP&2#?D%ugvpiqjDYp849J3q=;d-7MrJCKri0u3fLU65GhKH zt(B@$H1qYmwK!1O;^#elX5>G)12N)^NeFcbwprJL+wR!i=!vp#J%k?+Y*q@qj8=fl~lUv_^YJa`uluyVV z9{awBf%?6(#|9mY7@Qh}diMSK1!Gsf^GKOvKS;n8CtQE7j&`9ii{x=4dLfx#5;*%- z+|_F8Cl97Snk+eT7Oz=L7#puan&@0gg$+k;5ppU$JS{(GmKT7h5P>Zu9n$=I#|84` qKH4|}s#3A#xKOtd;9BL~&BrO-)#ovf8p87>oe+(>6E+W#81kg}IQz?hQ5$Pp4h^T;+&_O_YZy_Q@ ziqfQa5C}B_fdD~DK)S%ibI-bWt@rD_w`cA7F|*gK`DXUn#MvC+ioUjTs!GejWPcq3WMpJyzR1jZ=@O@`07O9c{~Tw{09FQoBj5!Hcmr^O z6$oMlp0xq^001EE`E7q)_@4k?0MXFW(K9eIT|6(Sz5=)a1c5HlfM{uHXwItx&i4T{ zth84JWHjj5j33kAa0kl<#bz@I-mPe1HyPd%l6&Iul97qy8YkCvVG&WNm^e)SmV%;^ zvgSQ4Z5>@b{Ra;bre@|ANIQE6$3L7<&YoW0KE8hb=vS|ULqgw#g~!DwBqqI0PD#zl z&C4$+EGjPfP+3)7^Rc$BzV%C6dq-zichAVz(XnyD#N^cc0%>uHyu7kXp>FT|*xlPd zI6V600s=t)X8lL@KU}Qmt_w6YAR78#F5m^<^8~Td&dV&SZ=IiN`P#hY)ODnEH$Mx9oohd-?y8{Rj46*A##m1U&yd5Gz0(upi<$mzKl})L)gkC)22{V|602Y&Md2jkRWj=TnV(?=Fdo<53tK z_J#^uT<&m-lIvhWcW_2@i=b=MGGIkL?(t7~iQX3rR6db^DzZBg5N`9*+~R&LGXXAf zA4kdFX3R{a0&$C7rHBWTr0JfhJsH_hK`YIIvT$v#j?&RgX_{<3z5>G@88 zOV_D5YTLqjh*APH$f`JDiVDm}&mVWL*?3Z&%^invIi@1!uCi{5Tn{?OKa}C=&|FrB zGR8YY)LBjBm3wxyeJ@-=JPbXBEpV^*Vk*U{wfuvL0@10al9_5V?Gx?JFmbJ@~FMT zy+co_-N*beA{}560Wet-g0*#2&ds5Rd;_#@GsWe{lSr5DEqdzk*T_p+#yaJ!|v& z2VUfYdX-GMDOJ;>1iGa>bDAJWnY3H2ZWH?*F2$9V*QHL{<7AxX6G~*1X6gsrYC*DYu_pmYF#t96!_~s(y|&;C!6@$M z^lRM+5|_)RJfg zznWKZ2!(XtnCCL|r&lFG#-BIL&)%l=V3M<+X6hp!@Z`}PYD_n9e|EPKbHU`yz@NF(MF%>lRSZlnUgCD2P9x`kl_Z}5UPs!X zMyw4ycDU?f zJr?*0jnP>>GWw`_igTpOgzH~pspN$PQkqg?H>VnP=n=tSu3wwITbpVU z>JdLPJ|?tOy!05_5%FQ>d)4$Apt@B7Qp*$I(s+Ohplu3Y`j{Lf++ShNc?R%zddT| za6;d4>*#jQk(a{D1>s(9%?z_5C(CTb0W-B){Qb($HKR`j8>$i=LNpQ`&H$=>&hu4x z+Q}J7#-i!Bl~pReGt#rO9ZEf-pukMs?*5kB3v% zTm(%PReK>qJ74E1OC}K`|EqWG-AM(j4;eLB@OBKKBt0PGqe&LYp>*NUete&2n_b7pMX5^Hep_0;TCayD0&y=0o_ zm#Bac%uu}iK%xAI0aJgpRE)w^i2HydiSJFh0!`WJ&Wb=-v9Z2_B?jlazB56V$8fx_ zixtudu_3A6+@-HAG1Bd75)aueKUhP$<~zRsHW3n*XfCVE6|b~hF`%tjX4!O!!!%PT z*}6?hhF2I~w26RbUHc5S!H{RPMKRVY!tuFp-a_V~w2C2*Se`KVH(n^M<~WA%N`0N+HT zM=Gk)4Y|j*L45Lb+B%X=3+jn3h52{uRghTSdv z62k3v!drzaE&Jcdrz>j~@y?ww$r==Yn92t*YQ!}BWA@4^h$^wVuRdueb&8dHzLGiT zIlU5?IsVy%>)va#0UO>|Mx)*?dO0DEAEO+66C$C2W$I6fZ?F&F5n%)O(VWj+4RjAx zXHE8gj_zZQV*0rIo)wpDWK^U7^vCYXGyYD{TLLpX!C@i8d0 zGOELz1DX29e!O!SDbI^Aye9jm+uY8GYp`N>^T15Mrx`senF6uDe&5=>$RJ7IIvP^* zepvby3Rz~H|DAb7+V1hrp`ECZFU|X(60~K3@2l^Ro1J>sTKA@H-lc~V)UjxIm@2qF zLQ5*^STeR-C?)I;aS+>fyd{x2atfiC*yd8qZ0wC_I{}0Od;NYHN<2O zS9Me#eF|w(2>o8Yb}w#Y?Dt@e9k!*%oj4D4<_o-(9_EI0E?@H*Kq7i2P=BvMjbDq? z6j|l^F{M3OEcxl!^d_;<+GjYi5PFf z>#7qC)rJN?GF;mxQ~zmbke9VGTz0BQKK^)FQfDY5abT-{1O0wr{h}hpkN9rh`VTXK zK3m7Ix*d@L_%NE_pYxaU`x*(M;p&;(gM#DSmCq8xH@-?OEb@!sB=2~!e}Z<1zO&^+ z)?g?7xsp<0MkOzEL0O<6gLfnHup`*-X9nU9{FsNd(>FVm|t>w z4E4Nif>LFC=gW8Iz%W$PWMjTl&Wl=VLD0#RU*(kIv=%r-5y`jbbS#L*fsH`Hm6sRN l_Z)Y@#`@nigX?y|IS{n5mPDj2^eCLh{-zSxSeNB&@?S#lc7p%_ literal 0 HcmV?d00001 diff --git a/ResoursesManager/ResoursesManager/App_Data/ResourceImages/projector.jpg b/ResoursesManager/ResoursesManager/App_Data/ResourceImages/projector.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2917ccf1b7fd6868fb8c240e21f834751eec5951 GIT binary patch literal 2809 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 W2U5eEOxbL%6jK90@UJ4V=>Gr!xi@kE literal 0 HcmV?d00001 diff --git a/ResoursesManager/ResoursesManager/Controllers/AccountController.cs b/ResoursesManager/ResoursesManager/Controllers/AccountController.cs index ea68631..5730db6 100644 --- a/ResoursesManager/ResoursesManager/Controllers/AccountController.cs +++ b/ResoursesManager/ResoursesManager/Controllers/AccountController.cs @@ -17,6 +17,7 @@ namespace ResoursesManager.Controllers { private ApplicationSignInManager _signInManager; private ApplicationUserManager _userManager; + private ApplicationDbContext db = new ApplicationDbContext(); public AccountController() { @@ -79,6 +80,13 @@ namespace ResoursesManager.Controllers switch (result) { case SignInStatus.Success: + db.Statistic.Add(new StatisticModel() + { + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Login, + DateTime = DateTime.Now + }); + db.SaveChanges(); return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); @@ -158,7 +166,13 @@ namespace ResoursesManager.Controllers if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); - + db.Statistic.Add(new StatisticModel() + { + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Register, + DateTime = DateTime.Now + }); + db.SaveChanges(); // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); @@ -393,6 +407,13 @@ namespace ResoursesManager.Controllers [ValidateAntiForgeryToken] public ActionResult LogOff() { + db.Statistic.Add(new StatisticModel() + { + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Logout, + DateTime = DateTime.Now + }); + db.SaveChanges(); AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); return RedirectToAction("Index", "Home"); } diff --git a/ResoursesManager/ResoursesManager/Controllers/ReservationsController.cs b/ResoursesManager/ResoursesManager/Controllers/ReservationsController.cs index b052408..eb26eeb 100644 --- a/ResoursesManager/ResoursesManager/Controllers/ReservationsController.cs +++ b/ResoursesManager/ResoursesManager/Controllers/ReservationsController.cs @@ -144,8 +144,8 @@ namespace ResoursesManager.Controllers }; if (resourceId != null) { - model.Reservation.Begining = DateTime.Now; - model.Reservation.End = DateTime.Now.AddHours(1); + model.Reservation.Begining = DateTime.Now.AddHours(1); + model.Reservation.End = DateTime.Now.AddHours(2); model.Reservation.ResourceId = (int)resourceId; model.Reservation.Resource = db.Resources.Find(resourceId); } @@ -211,6 +211,14 @@ namespace ResoursesManager.Controllers } db.Reservations.Add(model); + db.Statistic.Add(new StatisticModel() + { + ReservationId = model.Id, + ResourceId = model.ResourceId, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Reserv, + DateTime = DateTime.Now + }); db.SaveChanges(); log.Info("Új Foglalás: " + model.ToString()); @@ -310,7 +318,15 @@ namespace ResoursesManager.Controllers var r = db.Reservations.First(f => f.Id == reservation.Id); r.Begining = reservation.Begining; r.End = reservation.End; - + + db.Statistic.Add(new StatisticModel() + { + ReservationId = r.Id, + ResourceId = r.ResourceId, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.ReservartionModified, + DateTime = DateTime.Now + }); db.SaveChanges(); log.Info("Új foglalás: " + r.ToString()); @@ -377,6 +393,14 @@ namespace ResoursesManager.Controllers NotificationHelper.Send(users, "Foglalás törlés", message, reservation.Resource.ImagePath, null); db.Reservations.Remove(reservation); + db.Statistic.Add(new StatisticModel() + { + ReservationId = reservation.Id, + ResourceId = reservation.ResourceId, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.ReservationDelete, + DateTime = DateTime.Now + }); db.SaveChanges(); log.Info("Foglalás törölve id: " + id); } diff --git a/ResoursesManager/ResoursesManager/Controllers/ResourcesController.cs b/ResoursesManager/ResoursesManager/Controllers/ResourcesController.cs index ab610dd..14acf62 100644 --- a/ResoursesManager/ResoursesManager/Controllers/ResourcesController.cs +++ b/ResoursesManager/ResoursesManager/Controllers/ResourcesController.cs @@ -153,6 +153,13 @@ namespace ResoursesManager.Controllers { resource.Users = db.Users.ToList(); db.Resources.Add(pictureUploadTo(resource)); + db.Statistic.Add(new StatisticModel() + { + ResourceId = resource.Id, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.ResourceCreate, + DateTime = DateTime.Now + }); db.SaveChanges(); } catch (Exception e) @@ -249,6 +256,13 @@ namespace ResoursesManager.Controllers model.TimeLimit = resource.TimeLimit; db.Entry(model).State = EntityState.Modified; + db.Statistic.Add(new StatisticModel() + { + ResourceId = resource.Id, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.ResourceModified, + DateTime = DateTime.Now + }); db.SaveChanges(); //Értesítés küldés @@ -302,6 +316,13 @@ namespace ResoursesManager.Controllers NotificationHelper.Send(users, "Erőforrás törlés", message, null, null); db.Resources.Remove(resource); + db.Statistic.Add(new StatisticModel() + { + ResourceId = resource.Id, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.ResourceDelete, + DateTime = DateTime.Now + }); db.SaveChanges(); pictureDelete(resource.ImagePath); } diff --git a/ResoursesManager/ResoursesManager/Controllers/StatisticsController.cs b/ResoursesManager/ResoursesManager/Controllers/StatisticsController.cs new file mode 100644 index 0000000..5353a6d --- /dev/null +++ b/ResoursesManager/ResoursesManager/Controllers/StatisticsController.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Entity; +using System.Linq; +using System.Net; +using System.Web; +using System.Web.Mvc; +using ResoursesManager.Models; + +namespace ResoursesManager.Controllers +{ + public class StatisticsController : Controller + { + private ApplicationDbContext db = new ApplicationDbContext(); + + // GET: Statistics + public ActionResult Index() + { + return View(db.Statistic.ToList()); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + db.Dispose(); + } + base.Dispose(disposing); + } + } +} diff --git a/ResoursesManager/ResoursesManager/Controllers/SubscribeController.cs b/ResoursesManager/ResoursesManager/Controllers/SubscribeController.cs index ef7c596..88d00c1 100644 --- a/ResoursesManager/ResoursesManager/Controllers/SubscribeController.cs +++ b/ResoursesManager/ResoursesManager/Controllers/SubscribeController.cs @@ -32,6 +32,13 @@ namespace ResoursesManager.Controllers var user = db.Users.Find(User.Identity.GetUserId()); db.Resources.Find(resourceId).Users.Add(user); + db.Statistic.Add(new StatisticModel() + { + ResourceId = (int)resourceId, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Subscribe, + DateTime = DateTime.Now + }); db.SaveChanges(); } catch (Exception e) @@ -52,6 +59,12 @@ namespace ResoursesManager.Controllers { item.Users.Remove(user); } + db.Statistic.Add(new StatisticModel() + { + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.SubscribeAll, + DateTime = DateTime.Now + }); db.SaveChanges(); } catch (Exception e) @@ -71,6 +84,12 @@ namespace ResoursesManager.Controllers { item.Users.Add(user); } + db.Statistic.Add(new StatisticModel() + { + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.UnsubscirbeAll, + DateTime = DateTime.Now + }); db.SaveChanges(); } catch (Exception e) @@ -92,6 +111,13 @@ namespace ResoursesManager.Controllers } var user = db.Users.Find(User.Identity.GetUserId()); db.Resources.Find(resourceId).Users.Remove(user); + db.Statistic.Add(new StatisticModel() + { + ResourceId = (int)resourceId, + UserId = User.Identity.GetUserId(), + StatisticType = StatisticType.Unsubscirbe, + DateTime = DateTime.Now + }); db.SaveChanges(); } catch (Exception e) diff --git a/ResoursesManager/ResoursesManager/Helpers/NotificationHelper.cs b/ResoursesManager/ResoursesManager/Helpers/NotificationHelper.cs index 308b817..39306fa 100644 --- a/ResoursesManager/ResoursesManager/Helpers/NotificationHelper.cs +++ b/ResoursesManager/ResoursesManager/Helpers/NotificationHelper.cs @@ -59,13 +59,14 @@ namespace ResoursesManager.Helpers db.Notifications.Add(notify); } db.SaveChanges(); + //todo: null exeptionre fut + var id = db.Notifications.OrderByDescending(k => k.CreateDate).FirstOrDefault(k => k.User == HttpContext.Current.User.Identity.Name).Id; + GlobalHost.ConnectionManager.GetHubContext().Clients.Users(users).send(title, message, img, url, id); } catch (Exception e) { logger.Error("Save notification message", e); } - var id = db.Notifications.OrderByDescending(k => k.CreateDate).FirstOrDefault(k => k.User == HttpContext.Current.User.Identity.Name).Id; - GlobalHost.ConnectionManager.GetHubContext().Clients.Users(users).send(title, message, img, url, id); } } } diff --git a/ResoursesManager/ResoursesManager/Models/IdentityModels.cs b/ResoursesManager/ResoursesManager/Models/IdentityModels.cs index 505df24..c8cf3ee 100644 --- a/ResoursesManager/ResoursesManager/Models/IdentityModels.cs +++ b/ResoursesManager/ResoursesManager/Models/IdentityModels.cs @@ -38,6 +38,7 @@ namespace ResoursesManager.Models public DbSet Reservations { get; set; } public DbSet Resources { get; set; } public DbSet Notifications { get; set; } + public DbSet Statistic { get; set; } public static ApplicationDbContext Create() { @@ -60,12 +61,32 @@ namespace ResoursesManager.Models } } - - - public class MyDbInitializer : DropCreateDatabaseIfModelChanges + + public class MyDbInitializer : CreateDatabaseIfNotExists { protected override void Seed(ApplicationDbContext context) { + List defaults = new List(); + + defaults.Add(new Resource() { Name = "Kihangosító", AssetTag = "ASDF654", Description = "A kedvenc kihangosítónk.", TimeLimit = 1, ImagePath = "~/App_Data/ResourceImages/bluetooth.jpg" }); + defaults.Add(new Resource() { Name = "Laptop", AssetTag = "GFDS5412", Description = "Ez egy szép piros laptop", TimeLimit = 24, ImagePath= "~/App_Data/ResourceImages/laptop.jpg" }); + defaults.Add(new Resource() { Name = "Piros Telefon", AssetTag = "ASDHGD5423", Description = "Ez a vészhívó telefon", ImagePath = "~/App_Data/ResourceImages/phone.jpg" }); + defaults.Add(new Resource() { Name = "Projektor", AssetTag = "BD435", Description = "A fekete projektor", TimeLimit = 4, ImagePath = "~/App_Data/ResourceImages/projector.jpg" }); + defaults.Add(new Resource() { Name = "Tárgyaló", AssetTag = "BDFS4353", Description = "A céges tárgyaló", TimeLimit = 12, ImagePath = "~/App_Data/ResourceImages/mt.jpg" }); + defaults.Add(new Resource() { Name = "Asus Laptop", AssetTag = "FSDAFAS423", Description = "Ez egy szép zöld laptop", TimeLimit = 72, ImagePath = "~/App_Data/ResourceImages/laptop.jpg" }); + defaults.Add(new Resource() { Name = "Lenovo Mobil", AssetTag = "FAS324", Description = "Ez egy mobil", ImagePath = "~/App_Data/ResourceImages/mobile.jpg" }); + defaults.Add(new Resource() { Name = "Benq Projektor", AssetTag = "BD434355", Description = "A szürke projektor", ImagePath = "~/App_Data/ResourceImages/projector.jpg" }); + defaults.Add(new Resource() { Name = "Dell Laptop", AssetTag = "HFG435", Description = "Ez egy szép laptop", ImagePath = "~/App_Data/ResourceImages/laptop.jpg" }); + defaults.Add(new Resource() { Name = "IPhone", AssetTag = "GDSG3453", Description = "Ez egy iPhone", ImagePath = "~/App_Data/ResourceImages/mobile.jpg" }); + defaults.Add(new Resource() { Name = "Epson Projektor", AssetTag = "BFR435", Description = "Az Epson projektor", TimeLimit = 8, ImagePath = "~/App_Data/ResourceImages/projector.jpg" }); + defaults.Add(new Resource() { Name = "Egyéb", AssetTag = "HFG345", Description = "Ez valami egyéb gyári képpel.", ImagePath = "~/App_Data/ResourceImages/DefaultResource.png" }); + + foreach (var item in defaults) + { + context.Resources.Add(item); + } + + base.Seed(context); } } } \ No newline at end of file diff --git a/ResoursesManager/ResoursesManager/Models/StatisticModel.cs b/ResoursesManager/ResoursesManager/Models/StatisticModel.cs new file mode 100644 index 0000000..3d311f3 --- /dev/null +++ b/ResoursesManager/ResoursesManager/Models/StatisticModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace ResoursesManager.Models +{ + public enum StatisticType + { + ResourceCreate, ResourceModified, ResourceDelete, Reserv, ReservartionModified, ReservationDelete, Subscribe, Unsubscirbe, SubscribeAll, UnsubscirbeAll, Register, Login, Logout + } + public class StatisticModel + { + public int Id { get; set; } + public string UserId { get; set; } + public int ResourceId { get; set; } + public int ReservationId { get; set; } + public StatisticType StatisticType { get; set; } + public DateTime DateTime { get; set; } + } +} \ No newline at end of file diff --git a/ResoursesManager/ResoursesManager/ResoursesManager.csproj b/ResoursesManager/ResoursesManager/ResoursesManager.csproj index 95f0632..53bba17 100644 --- a/ResoursesManager/ResoursesManager/ResoursesManager.csproj +++ b/ResoursesManager/ResoursesManager/ResoursesManager.csproj @@ -215,6 +215,7 @@ + Global.asax @@ -228,13 +229,20 @@ + + + + + + + @@ -251,6 +259,8 @@ + + @@ -345,6 +355,7 @@ + diff --git a/ResoursesManager/ResoursesManager/Scripts/dateformat.js b/ResoursesManager/ResoursesManager/Scripts/dateformat.js new file mode 100644 index 0000000..37d67e7 --- /dev/null +++ b/ResoursesManager/ResoursesManager/Scripts/dateformat.js @@ -0,0 +1,130 @@ +/* +* Date Format 1.2.3 +* (c) 2007-2009 Steven Levithan +* MIT license +* +* Includes enhancements by Scott Trenda +* and Kris Kowal +* +* Accepts a date, a mask, or a date and a mask. +* Returns a formatted version of the given date. +* The date defaults to the current date/time. +* The mask defaults to dateFormat.masks.default. +*/ + +var dateFormat = function () +{ + var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, + timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, + timezoneClip = /[^-+\dA-Z]/g, + pad = function (val, len) + { + val = String(val); + len = len || 2; + while (val.length < len) val = "0" + val; + return val; + }; + + // Regexes and supporting functions are cached through closure + return function (date, mask, utc) + { + var dF = dateFormat; + + // You can't provide utc if you skip other args (use the "UTC:" mask prefix) + if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { + mask = date; + date = undefined; + } + + // Passing date through Date applies Date.parse, if necessary + date = date ? new Date(date) : new Date; + if (isNaN(date)) throw SyntaxError("invalid date"); + + mask = String(dF.masks[mask] || mask || dF.masks["default"]); + + // Allow setting the utc argument via the mask + if (mask.slice(0, 4) == "UTC:") { + mask = mask.slice(4); + utc = true; + } + + var _ = utc ? "getUTC" : "get", + d = date[_ + "Date"](), + D = date[_ + "Day"](), + m = date[_ + "Month"](), + y = date[_ + "FullYear"](), + H = date[_ + "Hours"](), + M = date[_ + "Minutes"](), + s = date[_ + "Seconds"](), + L = date[_ + "Milliseconds"](), + o = utc ? 0 : date.getTimezoneOffset(), + flags = { + d: d, + dd: pad(d), + ddd: dF.i18n.dayNames[D], + dddd: dF.i18n.dayNames[D + 7], + m: m + 1, + mm: pad(m + 1), + mmm: dF.i18n.monthNames[m], + mmmm: dF.i18n.monthNames[m + 12], + yy: String(y).slice(2), + yyyy: y, + h: H % 12 || 12, + hh: pad(H % 12 || 12), + H: H, + HH: pad(H), + M: M, + MM: pad(M), + s: s, + ss: pad(s), + l: pad(L, 3), + L: pad(L > 99 ? Math.round(L / 10) : L), + t: H < 12 ? "a" : "p", + tt: H < 12 ? "am" : "pm", + T: H < 12 ? "A" : "P", + TT: H < 12 ? "AM" : "PM", + Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), + o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), + S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] + }; + + return mask.replace(token, function ($0) + { + return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); + }); + }; +} (); + +// Some common format strings +dateFormat.masks = { + "default": "ddd mmm dd yyyy HH:MM:ss", + shortDate: "m/d/yy", + mediumDate: "mmm d, yyyy", + longDate: "mmmm d, yyyy", + fullDate: "dddd, mmmm d, yyyy", + shortTime: "h:MM TT", + mediumTime: "h:MM:ss TT", + longTime: "h:MM:ss TT Z", + isoDate: "yyyy-mm-dd", + isoTime: "HH:MM:ss", + isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", + isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" +}; + +// Internationalization strings +dateFormat.i18n = { + dayNames: [ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + ] +}; + +// For convenience... +Date.prototype.format = function (mask, utc) +{ + return dateFormat(this, mask, utc); +} diff --git a/ResoursesManager/ResoursesManager/Scripts/dateformat.min.js b/ResoursesManager/ResoursesManager/Scripts/dateformat.min.js new file mode 100644 index 0000000..67df8fa --- /dev/null +++ b/ResoursesManager/ResoursesManager/Scripts/dateformat.min.js @@ -0,0 +1 @@ +var dateFormat=function(){var t=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,r=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,i=/[^-+\dA-Z]/g,n=function(n,t){n=String(n),t=t||2;while(n.length99?Math.round(l/10):l),t:s<12?"a":"p",tt:s<12?"am":"pm",T:s<12?"A":"P",TT:s<12?"AM":"PM",Z:e?"UTC":(String(u).match(r)||[""]).pop().replace(i,""),o:(v>0?"-":"+")+n(Math.floor(Math.abs(v)/60)*100+Math.abs(v)%60,4),S:["th","st","nd","rd"][c%10>3?0:(c%100-c%10!=10)*c%10]};return f.replace(t,function(n){return n in p?p[n]:n.slice(1,n.length-1)})}}();dateFormat.masks={"default":"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"},dateFormat.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]},Date.prototype.format=function(n,t){return dateFormat(this,n,t)} \ No newline at end of file diff --git a/ResoursesManager/ResoursesManager/Views/Reservations/Create.cshtml b/ResoursesManager/ResoursesManager/Views/Reservations/Create.cshtml index 3dd3ff0..b97d2ff 100644 --- a/ResoursesManager/ResoursesManager/Views/Reservations/Create.cshtml +++ b/ResoursesManager/ResoursesManager/Views/Reservations/Create.cshtml @@ -42,7 +42,7 @@
*@Html.LabelFor(model => model.Reservation.Begining, htmlAttributes: new { @class = "control-label col-md-2" })
- + @Html.ValidationMessageFor(model => model.Reservation.Begining, "", new { @class = "text-danger" })
@@ -50,7 +50,7 @@
*@Html.LabelFor(model => model.Reservation.End, htmlAttributes: new { @class = "control-label col-md-2" })
- + @Html.ValidationMessageFor(model => model.Reservation.End, "", new { @class = "text-danger" })
@@ -69,12 +69,19 @@ @section Scripts{ } \ No newline at end of file diff --git a/ResoursesManager/ResoursesManager/Views/Reservations/Day.cshtml b/ResoursesManager/ResoursesManager/Views/Reservations/Day.cshtml index 7460284..19a88a3 100644 --- a/ResoursesManager/ResoursesManager/Views/Reservations/Day.cshtml +++ b/ResoursesManager/ResoursesManager/Views/Reservations/Day.cshtml @@ -34,7 +34,7 @@ if (item.Begining.Hour == i.Hour) { - @item.Begining.ToString("hh:mm") - @item.End.ToString("hh:mm") @item.Resource.Name @item.Resource.AssetTag
+ @item.Begining.ToString("HH:mm") - @item.End.ToString("HH:mm") @item.Resource.Name @item.Resource.AssetTag
} } diff --git a/ResoursesManager/ResoursesManager/Views/Reservations/Index.cshtml b/ResoursesManager/ResoursesManager/Views/Reservations/Index.cshtml index 009a5ee..9355b8b 100644 --- a/ResoursesManager/ResoursesManager/Views/Reservations/Index.cshtml +++ b/ResoursesManager/ResoursesManager/Views/Reservations/Index.cshtml @@ -54,7 +54,7 @@ if (item.Begining.Month == i.Month && item.Begining.Day == i.Day) { - @item.Begining.ToString("hh")-@item.Begining.ToString("hh")ó @item.Resource.Name + @item.Begining.ToString("HH")-@item.End.ToString("HH")ó @item.Resource.Name
j++; } diff --git a/ResoursesManager/ResoursesManager/Views/Reservations/Week.cshtml b/ResoursesManager/ResoursesManager/Views/Reservations/Week.cshtml index 5cb80a9..4f276d1 100644 --- a/ResoursesManager/ResoursesManager/Views/Reservations/Week.cshtml +++ b/ResoursesManager/ResoursesManager/Views/Reservations/Week.cshtml @@ -47,7 +47,7 @@ if (item.Begining.Day == j.Day && item.Begining.Hour == j.Hour) { - @item.Begining.ToString("hh")-@item.Begining.ToString("hh")ó @item.Resource.Name + @item.Begining.ToString("HH")-@item.End.ToString("HH")ó @item.Resource.Name
} diff --git a/ResoursesManager/ResoursesManager/Views/Shared/_Layout.cshtml b/ResoursesManager/ResoursesManager/Views/Shared/_Layout.cshtml index 4d107ce..ae161e2 100644 --- a/ResoursesManager/ResoursesManager/Views/Shared/_Layout.cshtml +++ b/ResoursesManager/ResoursesManager/Views/Shared/_Layout.cshtml @@ -24,6 +24,10 @@
  • @Html.ActionLink("ErÅ‘források", "Index", "Resources")
  • @Html.ActionLink("Felíratkozás", "Index", "Subscribe")
  • @Html.ActionLink("Naptár", "Index", "Reservations")
  • + @if (Context.User.IsInRole("Admin")) + { +
  • @Html.ActionLink("Statisztika", "Index", "Statistics")
  • + } @Html.Partial("_LoginPartial") @@ -72,6 +76,7 @@ +