You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
13 KiB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
  1. using Microsoft.AspNet.Identity;
  2. using Microsoft.AspNet.Identity.EntityFramework;
  3. using Microsoft.Owin.Security;
  4. using Sevomin.Models;
  5. using Sevomin.Models.Enums;
  6. using Sevomin.Models.Helpers;
  7. using Sevomin.Models.Repositories;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Web;
  14. using System.Web.Mvc;
  15. namespace Sevomin.WebFrontend.Controllers
  16. {
  17. public class JobController : AuthorizedController
  18. {
  19. IJobRepository _jobRepository;
  20. private HttpContextBase _httpContext;
  21. public JobController()
  22. : this(JobRepository.Current,
  23. new SevominUserManager(new UserStore<User>(SevominDbContext.Current)), null)
  24. {
  25. }
  26. protected override void Initialize(System.Web.Routing.RequestContext requestContext)
  27. {
  28. base.Initialize(requestContext);
  29. _httpContext = requestContext.HttpContext;
  30. }
  31. public JobController(IJobRepository jobRepository, SevominUserManager userManager, HttpContextBase httpContext) : base(userManager)
  32. {
  33. _jobRepository = jobRepository;
  34. _httpContext = httpContext;
  35. }
  36. private async Task<Job> GetEmptyJob()
  37. {
  38. User u = await UserManager.FindByNameAsync(User.Identity.Name);
  39. if (u == null)
  40. throw new InvalidOperationException("شما خیلی هنرمندی! به ما هم بگو چجوری!");
  41. Avalin avalin = u as Avalin;
  42. if (avalin == null)
  43. throw new InvalidOperationException("جای شما که اینجا نیست!");
  44. Job job = _jobRepository.GetEmptyJobFor(avalin);
  45. return job;
  46. }
  47. [Authorize(Roles = "Avalin")]
  48. public async Task<ActionResult> NewJob()
  49. {
  50. Avalin u = await UserManager.FindByNameAsync(User.Identity.Name) as Avalin;
  51. Job job = await GetEmptyJob();
  52. JobViewModel jvm = new JobViewModel(job);
  53. if (u == null)
  54. throw new InvalidOperationException();
  55. if (!u.EmailConfirmed)
  56. {
  57. ViewBag.Result = new PostResultViewModel(false, "ایمیل شما در سایت تایید نشده است. لطفا پس از تایید ایمیل برای تعریف این فرصت شغلی اقدام نمایید.");
  58. return View(jvm);
  59. }
  60. return View(jvm);
  61. }
  62. [Authorize(Roles = "Avalin")]
  63. [HttpPost]
  64. public async Task<ActionResult> NewJob(string JalaliExpireDate, string ContactPersonName,
  65. string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime,
  66. bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form)
  67. {
  68. Avalin u = await UserManager.FindByNameAsync(User.Identity.Name) as Avalin;
  69. Job job = await GetEmptyJob();
  70. if (u == null)
  71. throw new InvalidOperationException();
  72. if (!u.EmailConfirmed)
  73. {
  74. ViewBag.Result = new PostResultViewModel(false, "ایمیل شما در سایت تایید نشده است. لطفا پس از تایید ایمیل برای تعریف این فرصت شغلی اقدام نمایید.");
  75. return View(new JobViewModel(job));
  76. }
  77. try
  78. {
  79. UpdateFields(JalaliExpireDate, ContactPersonName, ContactPersonPhone,
  80. ContactPersonEMail, IsFullTime, ShowCompanyName,
  81. Description, ShowCompanyLogo, ResumeType, form, job);
  82. JobRepository.Current.Save();
  83. ViewBag.Result = new PostResultViewModel(true, "آگهی شما با موفقیت منتشر شد.");
  84. return RedirectToAction("SingleJob", new { jobId = job.Id });
  85. }
  86. catch (Exception)
  87. {
  88. ViewBag.Result = new PostResultViewModel(true, "در انتشار آگهی خطایی پیش آمده.");
  89. return View(new JobViewModel(job));
  90. }
  91. }
  92. private async Task<Job> FetchJob(long id)
  93. {
  94. User u = await UserManager.FindByNameAsync(User.Identity.Name);
  95. if (u == null)
  96. throw new InvalidOperationException("شما خیلی هنرمندی! به ما هم بگو چجوری!");
  97. Avalin avalin = (Avalin)u;
  98. Job job = _jobRepository.Find(id);
  99. if (job == null || job.AvalinId != avalin.Id)
  100. throw new InvalidOperationException("شماره آگهی استخدام مورد نظر معتبر نیست");
  101. return job;
  102. }
  103. [Authorize(Roles= "Avalin")]
  104. public async Task<ActionResult> Edit(long id)
  105. {
  106. Job job = await FetchJob(id);
  107. if (job.AvalinId != (await UserManager.FindByNameAsync(User.Identity.Name)).Id)
  108. return HttpNotFound();
  109. JobViewModel jvm = new JobViewModel(job);
  110. return View(jvm);
  111. }
  112. [HttpPost]
  113. public async Task<ActionResult> Edit(long id, string JalaliExpireDate, string ContactPersonName,
  114. string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime,
  115. bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form)
  116. {
  117. Job job = await FetchJob(id);
  118. if (job.AvalinId != (await UserManager.FindByNameAsync(User.Identity.Name)).Id)
  119. return HttpNotFound();
  120. try
  121. {
  122. UpdateFields(JalaliExpireDate, ContactPersonName, ContactPersonPhone,
  123. ContactPersonEMail, IsFullTime, ShowCompanyName,
  124. Description, ShowCompanyLogo, ResumeType, form, job);
  125. JobRepository.Current.Save();
  126. ViewBag.Result = new PostResultViewModel(true, "آگهی شما با موفقیت به روز رسانی شد.");
  127. return View(new JobViewModel(job));
  128. }
  129. catch (Exception)
  130. {
  131. ViewBag.Result = new PostResultViewModel(false, "در به روز رسانی آگهی خطایی پیش آمد.");
  132. return View(new JobViewModel(job));
  133. }
  134. }
  135. [AllowAnonymous]
  136. public ActionResult RecentJobs()
  137. {
  138. return View(_jobRepository.ListAll()
  139. .Where(d => d.ExpireDate >= DateTime.Now)
  140. .OrderByDescending(d => d.ExpireDate)
  141. .ToList()
  142. .Select(j => new JobMiniViewModel(j)).ToList());
  143. }
  144. [AllowAnonymous]
  145. public PartialViewResult LatestJobList(int count)
  146. {
  147. return PartialView("JobList", _jobRepository.ListAll()
  148. .Where(d => d.ExpireDate >= DateTime.Now)
  149. .OrderByDescending(d => d.CreateDate)
  150. .Take(count)
  151. .ToList()
  152. .Select(j => new JobMiniViewModel(j)).ToList());
  153. }
  154. [AllowAnonymous]
  155. public async Task<ActionResult> SingleJob(long jobId)
  156. {
  157. Job job = _jobRepository.Find(jobId);
  158. if (job == null)
  159. return HttpNotFound();
  160. JobViewModel viewModel = new JobViewModel(job);
  161. JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
  162. StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
  163. foreach (var param in jvm.Parameters)
  164. sb.Append(string.Format(param.Item1 + " ", param.Item2));
  165. ViewBag.ShortJobDescription = sb.ToString();
  166. if (Request.IsAuthenticated && User.IsInRole("Dovomin"))
  167. {
  168. Dovomin user = await UserManager.FindByNameAsync(User.Identity.Name) as Dovomin;
  169. DovominJobViewModel djvm = new DovominJobViewModel(new DovominJob(user, job));
  170. ViewBag.MinimumRequirement = djvm.MinimumRequirement;
  171. ViewBag.Affinity = djvm.Affinity.ToString();
  172. }
  173. return View(viewModel);
  174. }
  175. [Authorize(Roles = "Dovomin")]
  176. public async Task<ActionResult> Apply(long jobId)
  177. {
  178. Dovomin user = (await UserManager.FindByNameAsync(User.Identity.Name)) as Dovomin;
  179. Job job = _jobRepository.Find(jobId);
  180. if (user == null || job == null)
  181. return HttpNotFound();
  182. bool alreadyApplied = job.Applications.Any(a => a.DovominId == user.Id);
  183. DovominJob dj = alreadyApplied ? job.Applications.First(a => a.DovominId == user.Id) : new DovominJob(user, job);
  184. dj.CalculateAffinity();
  185. PrepareJobApplication(user, job, alreadyApplied);
  186. return View(new DovominJobViewModel(dj));
  187. }
  188. [Authorize(Roles = "Dovomin")]
  189. [HttpPost]
  190. [ValidateAntiForgeryToken]
  191. public async Task<ActionResult> Apply(long jobId, string CoverLetter)
  192. {
  193. Dovomin user = (await UserManager.FindByNameAsync(User.Identity.Name)) as Dovomin;
  194. Job job = _jobRepository.Find(jobId);
  195. if (user == null || job == null)
  196. return HttpNotFound();
  197. bool alreadyApplied = job.Applications.Any(a => a.DovominId == user.Id);
  198. PrepareJobApplication(user, job, alreadyApplied);
  199. DovominJob dj = alreadyApplied ? job.Applications.First(a => a.DovominId == user.Id) : new DovominJob(user, job);
  200. dj.CalculateAffinity();
  201. if (alreadyApplied)
  202. {
  203. ViewBag.Result = new PostResultViewModel(false, "اعلام آمادگی شما برای این فرصت شغلی قبلا ثبت شده است.");
  204. return View(new DovominJobViewModel(dj));
  205. }
  206. else if (!user.EmailConfirmed)
  207. {
  208. ViewBag.Result = new PostResultViewModel(false, "ایمیل شما در سایت تایید نشده است. لطفا پس از تایید ایمیل خود، مجددا برای این فرصت شغلی اعلام آمادگی نمایید.");
  209. return View(new DovominJobViewModel(dj));
  210. }
  211. dj = _jobRepository.Apply(user, job, CoverLetter);
  212. ViewBag.Result = new PostResultViewModel(true, "اعلام آمادگی شما برای این فرصت شغلی ثبت شد.");
  213. return View(new DovominJobViewModel(dj));
  214. }
  215. public ActionResult MyJobs(int? count)
  216. {
  217. User user = UserManager.FindByName(User.Identity.Name);
  218. List<JobMiniViewModel> retList = new List<JobMiniViewModel>();
  219. if (user is Avalin)
  220. retList = _jobRepository.ListAll()
  221. .Where(j => j.AvalinId == user.Id)
  222. .OrderByDescending(j => j.CreateDate)
  223. .ToList()
  224. .Select(j => new JobMiniViewModel(j))
  225. .ToList();
  226. else
  227. retList = _jobRepository.ListAll()
  228. .Where(j => j.Applications.Any(a => a.DovominId == user.Id))
  229. .OrderByDescending(j => j.CreateDate)
  230. .ToList()
  231. .Select(j => new JobMiniViewModel(j))
  232. .ToList();
  233. return PartialView("JobList", retList);
  234. }
  235. [Authorize(Roles = "Avalin")]
  236. public ActionResult JobRequests()
  237. {
  238. Avalin user = UserManager.FindByName(User.Identity.Name) as Avalin;
  239. if (user == null)
  240. return HttpNotFound();
  241. var applications = SevominDbContext.Current.DovominJobs
  242. .Where(a => a.Job.AvalinId == user.Id)
  243. .OrderByDescending(a => a.ApplyDate)
  244. .ToList()
  245. .Select(a => new JobApplicationViewModel(a));
  246. return PartialView(applications);
  247. }
  248. private void PrepareJobApplication(Dovomin user, Job job, bool alreadyApplied = true)
  249. {
  250. JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
  251. StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
  252. foreach (var param in jvm.Parameters)
  253. sb.Append(string.Format(param.Item1 + " ", param.Item2));
  254. ViewBag.ShortJobDescription = sb.ToString();
  255. ViewBag.Job = new JobViewModel(job);
  256. ViewBag.AlreadyApplied = alreadyApplied;
  257. }
  258. private static void UpdateFields(string JalaliExpireDate, string ContactPersonName, string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime, bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form, Job job)
  259. {
  260. job.ExpireDate = DateAssist.ToMiladi(JalaliExpireDate);
  261. job.ContactPersonEMail = ContactPersonEMail;
  262. job.ContactPersonName = ContactPersonName;
  263. job.ContactPersonPhone = ContactPersonPhone;
  264. job.Description = Description;
  265. job.IsFullTime = IsFullTime;
  266. job.ShowCompanyLogo = ShowCompanyLogo;
  267. job.ShowCompanyName = ShowCompanyName;
  268. job.ResumeType = (byte)ResumeType;
  269. foreach (var jp in job.JobParameters)
  270. {
  271. string value = form[string.Format("value-{0}", jp.Parameter.Id)];
  272. byte moscow = 0;
  273. byte.TryParse(form[string.Format("moscow-{0}", jp.Parameter.Id)], out moscow);
  274. jp.SetValue(value);
  275. if (jp.Parameter.Moscow)
  276. {
  277. if (string.IsNullOrWhiteSpace(jp.StringValue))
  278. jp.Moscow = 0;
  279. else
  280. jp.Moscow = moscow;
  281. }
  282. else
  283. {
  284. jp.Moscow = 4;
  285. }
  286. }
  287. }
  288. }
  289. }