شركة التطبيقات المتكاملة لتصميم النظم البرمجية الخاصة ش.ش.و.

Integrated Applications Programming Company

Skip Navigation LinksHome » Code Library » Staff

Public general use code classes and xml files that we've compiled and used over the years:

Staff support class for Optical Fiber Network (OFN) data model.

   1:  using Microsoft.EntityFrameworkCore;
   2:  using System;
   3:  using System.Collections.Generic;
   4:  using System.Linq;
   5:  using System.Web;
   6:  using System.Web.Security;
   7:   
   8:  namespace Ia.Ngn.Cl.Model.Data
   9:  {
  10:      ////////////////////////////////////////////////////////////////////////////
  11:   
  12:      /// <summary publish="true">
  13:      /// Staff support class for Optical Fiber Network (OFN) data model.
  14:      /// </summary>
  15:      /// 
  16:      /// <remarks> 
  17:      /// Copyright © 2006-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
  18:      ///
  19:      /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
  20:      /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
  21:      ///
  22:      /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  23:      /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  24:      /// 
  25:      /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
  26:      /// 
  27:      /// Copyright notice: This notice may not be removed or altered from any source distribution.
  28:      /// </remarks> 
  29:      public static class Staff
  30:      {
  31:          private const int initialStaffListLength = 200;
  32:          private static List<Ia.Ngn.Cl.Model.Staff> staffList;
  33:          private static DateTime staffUserListUpdateDateTime;
  34:          private static Dictionary<string, string> staffIpDictionary = new Dictionary<string, string>();
  35:          private static DateTime staffIpDictionaryLastClearingTime;
  36:   
  37:          private static readonly object objectLock = new object();
  38:   
  39:          ////////////////////////////////////////////////////////////////////////////
  40:   
  41:          /// <summary>
  42:          ///
  43:          /// </summary>
  44:          public static List<Ia.Ngn.Cl.Model.Staff> List
  45:          {
  46:              get
  47:              {
  48:                  if (staffList == null || staffList.Count == 0 || StaffUserListUpdateDateTime != Ia.Cl.Model.Identity.UserListTimestamp)
  49:                  {
  50:                      lock (objectLock)
  51:                      {
  52:                          staffList = Ia.Ngn.Cl.Model.Data.Staff._List();
  53:                      }
  54:                  }
  55:   
  56:                  return staffList;
  57:              }
  58:          }
  59:   
  60:          ////////////////////////////////////////////////////////////////////////////
  61:   
  62:          /// <summary>
  63:          ///
  64:          /// </summary>
  65:          private static List<Ia.Ngn.Cl.Model.Staff> _List()
  66:          {
  67:              int frameworkId;
  68:              Guid userId;
  69:   
  70:              var staffList = new List<Ia.Ngn.Cl.Model.Staff>(initialStaffListLength);
  71:   
  72:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
  73:              {
  74:                  var userList = Ia.Cl.Model.Identity.UserList;
  75:   
  76:                  var frameworkList = Ia.Ngn.Cl.Model.Data.Administration.FrameworkList;
  77:   
  78:                  if (userList != null && userList.Count > 0)
  79:                  {
  80:                      staffList = (from s in db.Staffs select s).ToList();
  81:   
  82:                      if (staffList.Count > 0)
  83:                      {
  84:                          // below: the order of the multiple foreach loops is imporant
  85:   
  86:                          for (int i = 0; i < staffList.Count; i++)
  87:                          {
  88:                              frameworkId = staffList[i].AdministrativeFrameworkId;
  89:                              userId = staffList[i].UserId;
  90:   
  91:                              staffList[i].User = (from u in userList
  92:                                                   where userId != Guid.Empty && u.ProviderUserKey == userId
  93:                                                   select u).SingleOrDefault();
  94:   
  95:                              staffList[i].Framework = (from u in frameworkList
  96:                                                        where u.Id == frameworkId
  97:                                                        select u).SingleOrDefault();
  98:                          }
  99:   
 100:                          for (int i = 0; i < staffList.Count; i++)
 101:                          {
 102:                              if (staffList[i].Framework != null && staffList[i].Framework.Parent != null)
 103:                              {
 104:                                  staffList[i].Head = (from s in staffList
 105:                                                       where s.IsHead == true && (staffList[i].IsHead == true && s.AdministrativeFrameworkId == staffList[i].Framework.Parent.Id || staffList[i].IsHead == false && s.AdministrativeFrameworkId == staffList[i].Framework.Id)
 106:                                                       select s).SingleOrDefault();
 107:                              }
 108:                          }
 109:   
 110:                          for (int i = 0; i < staffList.Count; i++)
 111:                          {
 112:                              // below: Subordinates
 113:                              if (staffList[i].IsHead)
 114:                              {
 115:                                  staffList[i].Subordinates = (from s in staffList
 116:                                                               where s.Id != staffList[i].Id &&
 117:                                                               (s.Framework == staffList[i].Framework && s.IsHead == false)
 118:                                                               ||
 119:                                                               (
 120:                                                               s.Framework.Parent != null &&
 121:                                                               (s.Framework.Parent == staffList[i].Framework || s.Framework.Parent.Parent != null &&
 122:                                                                (s.Framework.Parent.Parent == staffList[i].Framework || s.Framework.Parent.Parent.Parent != null &&
 123:                                                                 (s.Framework.Parent.Parent.Parent == staffList[i].Framework || s.Framework.Parent.Parent.Parent != null &&
 124:                                                                  (s.Framework.Parent.Parent.Parent.Parent == staffList[i].Framework)
 125:                                                                 )
 126:                                                                )
 127:                                                               )
 128:                                                               )
 129:                                                               select s).ToList();
 130:                              }
 131:                              else
 132:                              {
 133:                                  staffList[i].Subordinates = new List<Ia.Ngn.Cl.Model.Staff>();
 134:                              }
 135:   
 136:                              staffList[i].SubordinatesOrSelf = (from s in staffList where s.Id == staffList[i].Id select s).Union(staffList[i].Subordinates).ToList();
 137:   
 138:   
 139:                              // below: Colleagues
 140:                              if (staffList[i].IsHead)
 141:                              {
 142:                                  staffList[i].Colleagues = (from s in staffList
 143:                                                             where s.Id != staffList[i].Id
 144:                                                             && s.IsHead
 145:                                                             && s.Framework.Parent != null && staffList[i].Framework.Parent != null
 146:                                                             && s.Framework.Parent == staffList[i].Framework.Parent
 147:                                                             select s).ToList();
 148:                              }
 149:                              else
 150:                              {
 151:                                  staffList[i].Colleagues = (from s in staffList
 152:                                                             where s.Id != staffList[i].Id
 153:                                                             && !s.IsHead
 154:                                                             && s.Framework.Parent == staffList[i].Framework.Parent
 155:                                                             select s).ToList();
 156:                              }
 157:   
 158:                              staffList[i].ColleaguesOrSelf = (from s in staffList where s.Id == staffList[i].Id select s).Union(staffList[i].Colleagues).ToList();
 159:   
 160:   
 161:                              // below: Heads
 162:                              staffList[i].Heads = new List<Ia.Ngn.Cl.Model.Staff>();
 163:   
 164:                              foreach (var ancestor in staffList[i].Framework.AncestorsOrSelf)
 165:                              {
 166:                                  var head = (from s in staffList where s.Id != staffList[i].Id && s.Framework == ancestor && s.IsHead select s).SingleOrDefault();
 167:   
 168:                                  if(head != null) staffList[i].Heads.Add(head);
 169:                              }
 170:   
 171:                              staffList[i].HeadsOrSelf = (from s in staffList where s.Id == staffList[i].Id select s).Union(staffList[i].Heads).ToList();
 172:                          }
 173:                      }
 174:   
 175:                      staffList = (from s in staffList select s).OrderByDescending(c => c.IsHead).ThenBy(c => c.AdministrativeFrameworkId).ToList();
 176:   
 177:                      staffUserListUpdateDateTime = Ia.Cl.Model.Identity.UserListTimestamp;
 178:                  }
 179:                  else
 180:                  {
 181:                      throw new ArgumentOutOfRangeException(@"Ia.Ngn.Cl.Model.Data.Staff._List(): userList == null or userList.Count == 0");
 182:                  }
 183:   
 184:                  return staffList;
 185:              }
 186:          }
 187:   
 188:          ////////////////////////////////////////////////////////////////////////////
 189:   
 190:          /// <summary>
 191:          ///
 192:          /// </summary>
 193:          public static DateTime StaffUserListUpdateDateTime
 194:          {
 195:              get
 196:              {
 197:                  return staffUserListUpdateDateTime;
 198:              }
 199:          }
 200:   
 201:          ////////////////////////////////////////////////////////////////////////////
 202:   
 203:          /// <summary>
 204:          ///
 205:          /// </summary>
 206:          public static bool Create(Ia.Ngn.Cl.Model.Staff newStaff, out Ia.Cl.Model.Result result)
 207:          {
 208:              bool b;
 209:   
 210:              b = false;
 211:              result = new Ia.Cl.Model.Result();
 212:   
 213:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 214:              {
 215:                  newStaff.Created = newStaff.Updated = DateTime.UtcNow.AddHours(3);
 216:   
 217:                  db.Staffs.Add(newStaff);
 218:                  db.SaveChanges();
 219:   
 220:                  b = true;
 221:                  result.AddSuccess("Staff " + newStaff.FirstAndMiddleName + " created.");
 222:   
 223:                  staffList = null;
 224:              }
 225:   
 226:              return b;
 227:          }
 228:   
 229:          ////////////////////////////////////////////////////////////////////////////
 230:   
 231:          /// <summary>
 232:          ///
 233:          /// </summary>
 234:          public static Ia.Ngn.Cl.Model.Staff Read(int id)
 235:          {
 236:              Ia.Ngn.Cl.Model.Staff staff;
 237:   
 238:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 239:              {
 240:                  staff = (from s in db.Staffs where s.Id == id select s).SingleOrDefault();
 241:              }
 242:   
 243:              return staff;
 244:          }
 245:   
 246:          ////////////////////////////////////////////////////////////////////////////
 247:   
 248:          /// <summary>
 249:          ///
 250:          /// </summary>
 251:          public static List<Ia.Ngn.Cl.Model.Staff> ReadList()
 252:          {
 253:              List<Ia.Ngn.Cl.Model.Staff> list;
 254:   
 255:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 256:              {
 257:                  list = (from s in db.Staffs select s).ToList();
 258:              }
 259:   
 260:              return list.ToList();
 261:          }
 262:   
 263:          ////////////////////////////////////////////////////////////////////////////
 264:   
 265:          /// <summary>
 266:          ///
 267:          /// </summary>
 268:          public static bool Update(Ia.Ngn.Cl.Model.Staff updatedStaff, out Ia.Cl.Model.Result result)
 269:          {
 270:              bool b;
 271:              Ia.Ngn.Cl.Model.Staff staff;
 272:   
 273:              b = false;
 274:              result = new Ia.Cl.Model.Result();
 275:   
 276:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 277:              {
 278:                  staff = (from s in db.Staffs where s.Id == updatedStaff.Id select s).SingleOrDefault();
 279:   
 280:                  if (staff.Update(updatedStaff))
 281:                  {
 282:                      db.Staffs.Attach(staff);
 283:                      db.Entry(staff).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 284:                  }
 285:   
 286:                  db.SaveChanges();
 287:   
 288:                  b = true;
 289:                  result.AddSuccess("Staff " + updatedStaff.FirstAndMiddleName + " updated.");
 290:   
 291:                  staffList = null;
 292:              }
 293:   
 294:              return b;
 295:          }
 296:   
 297:          ////////////////////////////////////////////////////////////////////////////
 298:   
 299:          /// <summary>
 300:          ///
 301:          /// </summary>
 302:          public static bool AssignUserId(int staffId, Guid userId)
 303:          {
 304:              bool b;
 305:              Ia.Ngn.Cl.Model.Staff updatedStaff;
 306:   
 307:              b = false;
 308:   
 309:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 310:              {
 311:                  updatedStaff = (from s in db.Staffs where s.Id == staffId select s).SingleOrDefault();
 312:   
 313:                  if (updatedStaff != null)
 314:                  {
 315:                      updatedStaff.UserId = userId;
 316:                      updatedStaff.Updated = DateTime.UtcNow.AddHours(3);
 317:   
 318:                      db.Staffs.Attach(updatedStaff);
 319:   
 320:                      var v = db.Entry(updatedStaff);
 321:                      v.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 322:                      db.SaveChanges();
 323:   
 324:                      b = true;
 325:   
 326:                      staffList = null;
 327:                  }
 328:                  else
 329:                  {
 330:                      b = false;
 331:                  }
 332:              }
 333:   
 334:              return b;
 335:          }
 336:   
 337:          ////////////////////////////////////////////////////////////////////////////
 338:   
 339:          /// <summary>
 340:          ///
 341:          /// </summary>
 342:          public static bool Delete(int id, out Ia.Cl.Model.Result result)
 343:          {
 344:              bool b;
 345:   
 346:              b = false;
 347:              result = new Ia.Cl.Model.Result();
 348:   
 349:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 350:              {
 351:                  var staff = (from s in db.Staffs
 352:                               where s.Id == id
 353:                               select s).FirstOrDefault();
 354:   
 355:                  db.Staffs.Remove(staff);
 356:                  db.SaveChanges();
 357:   
 358:                  b = true;
 359:                  result.AddSuccess("Staff " + staff.FirstAndMiddleName + " deleted.");
 360:   
 361:                  staffList = null;
 362:              }
 363:   
 364:              return b;
 365:          }
 366:   
 367:          ////////////////////////////////////////////////////////////////////////////
 368:   
 369:          /// <summary>
 370:          ///
 371:          /// </summary>
 372:          public static Ia.Ngn.Cl.Model.Staff MembershipUser
 373:          {
 374:              get
 375:              {
 376:                  Ia.Ngn.Cl.Model.Staff staffMembershipUser;
 377:   
 378:                  if (HttpContext.Current != null && HttpContext.Current.Session["staffMembershipUser"] != null)
 379:                  {
 380:                      staffMembershipUser = HttpContext.Current.Session["staffMembershipUser"] as Ia.Ngn.Cl.Model.Staff;
 381:                  }
 382:                  else
 383:                  {
 384:                      lock (objectLock)
 385:                      {
 386:                          staffMembershipUser = Ia.Ngn.Cl.Model.Data.Staff._MembershipUser;
 387:   
 388:                          if (HttpContext.Current != null) HttpContext.Current.Session["staffMembershipUser"] = staffMembershipUser;
 389:                      }
 390:                  }
 391:   
 392:                  if (staffMembershipUser != null)
 393:                  {
 394:                      if (!staffIpDictionary.ContainsKey(staffMembershipUser.UserId.ToString()))
 395:                      {
 396:                          staffIpDictionary[staffMembershipUser.UserId.ToString()] = Ia.Cl.Model.Default.RequestUserIP();
 397:                      }
 398:                  }
 399:   
 400:                  return staffMembershipUser;
 401:              }
 402:          }
 403:   
 404:          ////////////////////////////////////////////////////////////////////////////
 405:   
 406:          /// <summary>
 407:          ///
 408:          /// </summary>
 409:          public static void ClearStaffMembershipUserSession()
 410:          {
 411:              if (HttpContext.Current != null && HttpContext.Current.Session["staffMembershipUser"] != null)
 412:              {
 413:                  lock (objectLock)
 414:                  {
 415:                      HttpContext.Current.Session.Remove("staffMembershipUser");
 416:                  }
 417:              }
 418:          }
 419:   
 420:          ////////////////////////////////////////////////////////////////////////////
 421:   
 422:          /// <summary>
 423:          ///
 424:          /// </summary>
 425:          private static Ia.Ngn.Cl.Model.Staff _MembershipUser
 426:          {
 427:              get
 428:              {
 429:                  Ia.Ngn.Cl.Model.Staff staffMembershipUser;
 430:   
 431:                  if (Membership.GetUser() != null)
 432:                  {
 433:                      if (Guid.TryParse(Membership.GetUser().ProviderUserKey.ToString(), out Guid guid))
 434:                      {
 435:                          staffMembershipUser = (from s in Ia.Ngn.Cl.Model.Data.Staff.List where s.User != null && s.UserId == guid select s).SingleOrDefault();
 436:                      }
 437:                      else staffMembershipUser = null;
 438:                  }
 439:                  else staffMembershipUser = null;
 440:   
 441:                  return staffMembershipUser;
 442:              }
 443:          }
 444:   
 445:          ////////////////////////////////////////////////////////////////////////////
 446:   
 447:          /// <summary>
 448:          ///
 449:          /// </summary>
 450:          public static Ia.Ngn.Cl.Model.Staff MembershipUser2(Guid userId)
 451:          {
 452:              Ia.Ngn.Cl.Model.Staff staffMembershipUser;
 453:   
 454:              if (userId != Guid.Empty)
 455:              {
 456:                  staffMembershipUser = (from s in Ia.Ngn.Cl.Model.Data.Staff.List where s.UserId == userId select s).SingleOrDefault();
 457:              }
 458:              else staffMembershipUser = null;
 459:   
 460:              return staffMembershipUser;
 461:          }
 462:   
 463:          ////////////////////////////////////////////////////////////////////////////
 464:   
 465:          /// <summary>
 466:          ///
 467:          /// </summary>
 468:          public static bool NullifyUserId(int staffId)
 469:          {
 470:              bool b;
 471:              Ia.Ngn.Cl.Model.Staff staff;
 472:   
 473:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 474:              {
 475:                  staff = (from s in db.Staffs where s.Id == staffId select s).SingleOrDefault();
 476:   
 477:                  staff.UserId = Guid.Empty;
 478:   
 479:                  db.Staffs.Attach(staff);
 480:                  db.Entry(staff).Property(u => u.UserId).IsModified = true;
 481:   
 482:                  db.SaveChanges();
 483:   
 484:                  b = true;
 485:   
 486:                  staffList = null;
 487:              }
 488:   
 489:              return b;
 490:          }
 491:   
 492:          ////////////////////////////////////////////////////////////////////////////
 493:   
 494:          /// <summary>
 495:          ///
 496:          /// </summary>
 497:          public static void UnlockoutAllMembershipUsers()
 498:          {
 499:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 500:              {
 501:                  db.Database.ExecuteSqlRaw("update Memberships set IsLockedOut = 0;");
 502:              }
 503:          }
 504:   
 505:          ////////////////////////////////////////////////////////////////////////////
 506:   
 507:          /// <summary>
 508:          ///
 509:          /// </summary>
 510:          public static void SetMembershipIsApprovedToFalseIfUserLastActivityDateIsLessThanDateTime(DateTime dateTime)
 511:          {
 512:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 513:              {
 514:                  db.Database.ExecuteSqlRaw("update Memberships set IsApproved = 0 where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 515:              }
 516:          }
 517:   
 518:          ////////////////////////////////////////////////////////////////////////////
 519:   
 520:          /// <summary>
 521:          ///
 522:          /// </summary>
 523:          public static void DeleteStaffIfUserLastActivityDateIsLessThanDateTime(DateTime dateTime)
 524:          {
 525:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 526:              {
 527:                  db.Database.ExecuteSqlRaw("delete Staffs where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 528:                  db.Database.ExecuteSqlRaw("delete Memberships where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 529:                  db.Database.ExecuteSqlRaw("delete UsersInRoles where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 530:                  db.Database.ExecuteSqlRaw("delete Profiles where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 531:                  db.Database.ExecuteSqlRaw("delete Users where UserId in (select u.UserId from Users u where u.LastActivityDate < '" + dateTime.ToString("yyyy-MM-dd") + "'); ");
 532:              }
 533:          }
 534:   
 535:          ////////////////////////////////////////////////////////////////////////////
 536:   
 537:          /// <summary>
 538:          ///
 539:          /// </summary>
 540:          public static void RemoveInactiveStaff(DateTime dateTime)
 541:          {
 542:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 543:              {
 544:                  var v = Membership.GetAllUsers();
 545:                  var list = Ia.Cl.Model.Identity.InactiveSinceDateTimeUserList(dateTime);
 546:   
 547:                  //db.Database.ExecuteSqlRaw("update Memberships set IsLockedOut = 0;");
 548:              }
 549:          }
 550:   
 551:          ////////////////////////////////////////////////////////////////////////////
 552:          ////////////////////////////////////////////////////////////////////////////
 553:   
 554:          /// <summary>
 555:          ///
 556:          /// </summary>
 557:          public static Dictionary<string, string> StaffIpDictionary
 558:          {
 559:              get
 560:              {
 561:                  var now = DateTime.UtcNow.AddHours(3);
 562:   
 563:                  if (now.AddDays(-7) > staffIpDictionaryLastClearingTime)
 564:                  {
 565:                      staffIpDictionary.Clear();
 566:                      staffIpDictionaryLastClearingTime = now;
 567:                  }
 568:   
 569:                  return staffIpDictionary;
 570:              }
 571:          }
 572:   
 573:          ////////////////////////////////////////////////////////////////////////////
 574:          ////////////////////////////////////////////////////////////////////////////
 575:      }
 576:   
 577:      ////////////////////////////////////////////////////////////////////////////
 578:      ////////////////////////////////////////////////////////////////////////////
 579:  }