diff --git a/Sevomin.Models/AvalinViewModel.cs b/Sevomin.Models/AvalinViewModel.cs new file mode 100644 index 0000000..4df9295 --- /dev/null +++ b/Sevomin.Models/AvalinViewModel.cs @@ -0,0 +1,54 @@ +using Sevomin.Models.Helpers; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sevomin.Models +{ + public class AvalinViewModel + { + public string DisplayName + { + get + { + return this.CompanyName; + } + } + + [Required] + [DisplayName("نام شرکت")] + public string CompanyName { get; set; } + + [StringLength(12)] + [DisplayName("شناسه ملی")] + public string NationalId { get; set; } + + [StringLength(10)] + [DisplayName("شماره ثبت")] + public string RegisterId { get; set; } + + [DisplayName("آدرس")] + public string Address { get; set; } + + [DisplayName("شماره تماس")] + public string CompanyPhoneNumber { get; set; } + + [RegularExpression(@"^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$", ErrorMessage = "لطفا ایمیل معتبر وارد کنید.")] + [DisplayName("ایمیل")] + public string EMail { get; set; } + + public AvalinViewModel(Avalin avalin) + { + this.CompanyName = avalin.CompanyName; + this.NationalId = avalin.NationalId; + this.RegisterId = avalin.RegisterId; + this.Address = avalin.Address; + this.CompanyPhoneNumber = avalin.CompanyPhoneNumber; + this.EMail = avalin.Email; + } + } +} diff --git a/Sevomin.Models/DovominJob.cs b/Sevomin.Models/DovominJob.cs index 3b017eb..3f9b12d 100644 --- a/Sevomin.Models/DovominJob.cs +++ b/Sevomin.Models/DovominJob.cs @@ -48,11 +48,13 @@ namespace Sevomin.Models public DovominJob() { - } - private void CalculateAffinity() + public void CalculateAffinity() { + if (Dovomin == null || Job == null) + return; + MinimumRequirement = true; decimal sum = 0; decimal count = 0; @@ -84,11 +86,12 @@ namespace Sevomin.Models } if (dpv == null) continue; - if (jpv > dpv) + if (jpv <= dpv) sum += m; else sum += m * ((jpv.Value - dpv.Value) / jpv.Value); } + this.Affinity = sum / count; } } } diff --git a/Sevomin.Models/DovominJobViewModel.cs b/Sevomin.Models/DovominJobViewModel.cs index ac8add3..2b3b981 100644 --- a/Sevomin.Models/DovominJobViewModel.cs +++ b/Sevomin.Models/DovominJobViewModel.cs @@ -32,7 +32,7 @@ namespace Sevomin.Models } [Required(ErrorMessage = "ورود {0} الزامی است.")] - [DisplayName("نامه خصوصی برای کارفرما")] + [DisplayName("یادداشت برای کارفرما")] public string CoverLetter { get; set; } public decimal Affinity { get; set; } diff --git a/Sevomin.Models/DovominViewModel.cs b/Sevomin.Models/DovominViewModel.cs index 84892c1..5928bfe 100644 --- a/Sevomin.Models/DovominViewModel.cs +++ b/Sevomin.Models/DovominViewModel.cs @@ -14,6 +14,7 @@ namespace Sevomin.Models [StringLength(128)] public string Id { get; set; } + [DisplayName("نام و نام خانوادگی")] public string DisplayName { get diff --git a/Sevomin.Models/Helpers/SevominUserValidator.cs b/Sevomin.Models/Helpers/SevominUserValidator.cs index e5cd4da..a986260 100644 --- a/Sevomin.Models/Helpers/SevominUserValidator.cs +++ b/Sevomin.Models/Helpers/SevominUserValidator.cs @@ -16,9 +16,9 @@ namespace Sevomin.Models.Helpers } public async Task ValidateAsync(User item) - { + { var errors = new List(); - + if (string.IsNullOrWhiteSpace(item.UserName)) errors.Add("نام کاربری نمی تواند خالی باشد. لطفا ایمیل خود را وارد نمایید."); else if (await (manager.FindByNameAsync(item.UserName)) != null) diff --git a/Sevomin.Models/JobMiniViewModel.cs b/Sevomin.Models/JobMiniViewModel.cs index 2f6ca27..7d4f000 100644 --- a/Sevomin.Models/JobMiniViewModel.cs +++ b/Sevomin.Models/JobMiniViewModel.cs @@ -19,6 +19,8 @@ namespace Sevomin.Models [StringLength(128)] public string AvalinId { get; set; } + public string AvalinUsername { get; set; } + [DisplayName("آخرین مهلت اعلام آمادگی")] [DataType(DataType.Date)] public DateTime ExpireDate { get; set; } @@ -55,7 +57,7 @@ namespace Sevomin.Models this.AvalinId = job.AvalinId; this.ExpireDate = job.ExpireDate == DateTime.MinValue ? DateTime.Now.AddDays(14) : job.ExpireDate; this.IsFullTime = job.IsFullTime; - + this.AvalinUsername = job.Avalin.UserName; this.ShowCompanyLogo = job.ShowCompanyLogo; this.ShowCompanyName = job.ShowCompanyName; if (this.ShowCompanyName) diff --git a/Sevomin.Models/Repositories/IRepository.cs b/Sevomin.Models/Repositories/IRepository.cs index ab9b80c..4dfed4e 100644 --- a/Sevomin.Models/Repositories/IRepository.cs +++ b/Sevomin.Models/Repositories/IRepository.cs @@ -19,7 +19,7 @@ namespace Sevomin.Models.Repositories { Job GetEmptyJobFor(Avalin avalin); IQueryable ListAll(); - void Apply(Dovomin dovomin, Job job, string coverLetter); + DovominJob Apply(Dovomin dovomin, Job job, string coverLetter); } public interface IParameterRepository : IRepository diff --git a/Sevomin.Models/Repositories/JobRepository.cs b/Sevomin.Models/Repositories/JobRepository.cs index e20f0f7..2fe8a6e 100644 --- a/Sevomin.Models/Repositories/JobRepository.cs +++ b/Sevomin.Models/Repositories/JobRepository.cs @@ -82,7 +82,7 @@ namespace Sevomin.Models.Repositories return job; } - public void Apply(Dovomin dovomin, Job job, string coverLetter) + public DovominJob Apply(Dovomin dovomin, Job job, string coverLetter) { DovominJob dj = new DovominJob(dovomin, job); dj.ApplyDate = DateTime.UtcNow; @@ -98,6 +98,8 @@ namespace Sevomin.Models.Repositories } Save(); + + return dj; } #endregion } diff --git a/Sevomin.Models/Sevomin.Models.csproj b/Sevomin.Models/Sevomin.Models.csproj index 8354892..11ea09c 100644 --- a/Sevomin.Models/Sevomin.Models.csproj +++ b/Sevomin.Models/Sevomin.Models.csproj @@ -62,6 +62,7 @@ + diff --git a/Sevomin.WebFrontend.Controllers/AccountController.cs b/Sevomin.WebFrontend.Controllers/AccountController.cs index 95fe084..5fb9fda 100644 --- a/Sevomin.WebFrontend.Controllers/AccountController.cs +++ b/Sevomin.WebFrontend.Controllers/AccountController.cs @@ -8,6 +8,7 @@ using System; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; +using System.Linq; namespace Sevomin.WebFrontend.Controllers { @@ -60,6 +61,9 @@ namespace Sevomin.WebFrontend.Controllers if (!(await roleManager.RoleExistsAsync("Dovomin"))) await roleManager.CreateAsync(new IdentityRole("Dovomin")); + //Todo: Check this + UserManager.UserValidator = new UserValidator(UserManager); + if (user is Avalin) await UserManager.AddToRoleAsync(user.Id, "Avalin"); else if(user is Dovomin) @@ -123,34 +127,6 @@ namespace Sevomin.WebFrontend.Controllers AuthenticationManager.SignOut(); return RedirectToAction("Index", "Home"); } - - - private async Task SignInAsync(User user, bool isPersistent) - { - AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); - var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); - AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); - } - - private ActionResult RedirectToLocal(string returnUrl) - { - if (Url.IsLocalUrl(returnUrl)) - { - return Redirect(returnUrl); - } - else - { - return RedirectToAction("Index", "Home"); - } - } - - private void AddErrors(IdentityResult result) - { - foreach (var error in result.Errors) - { - ModelState.AddModelError("", error); - } - } [Authorize] public async Task MyProfile(bool? success) @@ -163,7 +139,7 @@ namespace Sevomin.WebFrontend.Controllers User u = await UserManager.FindByNameAsync(User.Identity.Name); if (u is Avalin) { - return View("ProfileAvalin", u as Avalin); + return View("ProfileAvalin", new AvalinViewModel(u as Avalin)); } else { @@ -186,7 +162,7 @@ namespace Sevomin.WebFrontend.Controllers try { Dovomin dovomin = (Dovomin)u; - dovomin.BirthDate = DateAssist.ToMiladi(JalaliBirthDate); + dovomin.BirthDate = DateAssist.ValidateAndSetToMiladi(JalaliBirthDate); dovomin.Description = Description; dovomin.FirstName = FirstName; dovomin.LastName = LastName; @@ -199,7 +175,7 @@ namespace Sevomin.WebFrontend.Controllers string value = form[string.Format("value-{0}", jp.Parameter.Id)]; jp.SetValue(value); } - + if (EnglishResume != null) { dovomin.EnglishResume = string.Format("{0}-resume-en{2}", User.Identity.Name, "", System.IO.Path.GetExtension(EnglishResume.FileName)); @@ -209,7 +185,7 @@ namespace Sevomin.WebFrontend.Controllers { dovomin.PersianResume = string.Format("{0}-resume-fa{2}", User.Identity.Name, "", System.IO.Path.GetExtension(PersianResume.FileName)); PersianResume.SaveAs(System.IO.Path.Combine(Server.MapPath("~/App_Data/resumes"), dovomin.PersianResume)); - } + } SevominDbContext.Current.SaveChanges(); @@ -218,7 +194,7 @@ namespace Sevomin.WebFrontend.Controllers catch (Exception) { throw; - } + } } [Authorize] @@ -241,13 +217,66 @@ namespace Sevomin.WebFrontend.Controllers SevominDbContext.Current.SaveChanges(); + return RedirectToAction("MyProfile", new { success = true }); } catch (Exception) { - + throw; } - return View("ProfileAvalin", u as Avalin); } + + public async Task Dovomin(string userId) + { + User user = await UserManager.FindByIdAsync(userId); + + if ((user as Dovomin) == null) + return HttpNotFound(); + + if (User.IsInRole("Dovomin")) + { + if (userId != user.Id) + { + return HttpNotFound(); + } + else { } + } + else if (User.IsInRole("Avalin")) + { + if (!(user as Avalin).Jobs.Any(j => j.Applications.Any(c => c.DovominId == userId))) + { + return HttpNotFound(); + } + } + + return View(new DovominViewModel(user as Dovomin)); + } + + private async Task SignInAsync(User user, bool isPersistent) + { + AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); + var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); + AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); + } + + private ActionResult RedirectToLocal(string returnUrl) + { + if (Url.IsLocalUrl(returnUrl)) + { + return Redirect(returnUrl); + } + else + { + return RedirectToAction("Index", "Home"); + } + } + + private void AddErrors(IdentityResult result) + { + foreach (var error in result.Errors) + { + ModelState.AddModelError("", error); + } + } } } diff --git a/Sevomin.WebFrontend.Controllers/JobController.cs b/Sevomin.WebFrontend.Controllers/JobController.cs index 7eb6914..d8b53aa 100644 --- a/Sevomin.WebFrontend.Controllers/JobController.cs +++ b/Sevomin.WebFrontend.Controllers/JobController.cs @@ -1,9 +1,12 @@ -using Microsoft.AspNet.Identity.EntityFramework; +using Microsoft.AspNet.Identity; +using Microsoft.AspNet.Identity.EntityFramework; +using Microsoft.Owin.Security; using Sevomin.Models; using Sevomin.Models.Enums; using Sevomin.Models.Helpers; using Sevomin.Models.Repositories; using System; +using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -14,7 +17,7 @@ namespace Sevomin.WebFrontend.Controllers { public class JobController : AuthorizedController { - IJobRepository _JobRepository; + IJobRepository _jobRepository; private HttpContextBase _httpContext; public JobController() @@ -31,7 +34,7 @@ namespace Sevomin.WebFrontend.Controllers public JobController(IJobRepository jobRepository, SevominUserManager userManager, HttpContextBase httpContext) : base(userManager) { - _JobRepository = jobRepository; + _jobRepository = jobRepository; _httpContext = httpContext; } @@ -43,7 +46,7 @@ namespace Sevomin.WebFrontend.Controllers Avalin avalin = u as Avalin; if (avalin == null) throw new InvalidOperationException("جای شما که اینجا نیست!"); - Job job = _JobRepository.GetEmptyJobFor(avalin); + Job job = _jobRepository.GetEmptyJobFor(avalin); return job; } @@ -84,15 +87,20 @@ namespace Sevomin.WebFrontend.Controllers if (u == null) throw new InvalidOperationException("شما خیلی هنرمندی! به ما هم بگو چجوری!"); Avalin avalin = (Avalin)u; - Job job = _JobRepository.Find(id); + Job job = _jobRepository.Find(id); if (job == null || job.AvalinId != avalin.Id) throw new InvalidOperationException("شماره آگهی استخدام مورد نظر معتبر نیست"); return job; } - public async Task Edit(long id) + [Authorize(Roles= "Avalin")] + public async Task Edit(long id) { Job job = await FetchJob(id); + + if (job.AvalinId != (await UserManager.FindByNameAsync(User.Identity.Name)).Id) + return HttpNotFound(); + JobViewModel jvm = new JobViewModel(job); return View(jvm); } @@ -103,6 +111,10 @@ namespace Sevomin.WebFrontend.Controllers bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form) { Job job = await FetchJob(id); + + if (job.AvalinId != (await UserManager.FindByNameAsync(User.Identity.Name)).Id) + return HttpNotFound(); + try { UpdateFields(JalaliExpireDate, ContactPersonName, ContactPersonPhone, @@ -121,20 +133,31 @@ namespace Sevomin.WebFrontend.Controllers return View(new JobViewModel(job)); } } - + + [AllowAnonymous] + public ActionResult RecentJobs() + { + return View(_jobRepository.ListAll() + .Where(d => d.ExpireDate >= DateTime.Now) + .OrderByDescending(d => d.ExpireDate) + .ToList() + .Select(j => new JobMiniViewModel(j)).ToList()); + } + public PartialViewResult LatestJobList(int count) { - return PartialView("JobList", JobRepository.Current.ListAll() + return PartialView("JobList", _jobRepository.ListAll() .Where(d => d.ExpireDate >= DateTime.Now) - .OrderBy(d => d.ExpireDate) + .OrderByDescending(d => d.ExpireDate) .Take(count) .ToList() .Select(j => new JobMiniViewModel(j)).ToList()); } + [AllowAnonymous] public ActionResult SingleJob(long jobId) { - Job job = _JobRepository.Find(jobId); + Job job = _jobRepository.Find(jobId); if (job == null) return HttpNotFound(); @@ -153,11 +176,13 @@ namespace Sevomin.WebFrontend.Controllers public async Task Apply(long jobId) { Dovomin user = (await UserManager.FindByNameAsync(User.Identity.Name)) as Dovomin; - Job job = _JobRepository.Find(jobId); + Job job = _jobRepository.Find(jobId); if (user == null || job == null) return HttpNotFound(); - DovominJob dj = new DovominJob(user, job); + bool alreadyApplied = job.Applications.Any(a => a.DovominId == user.Id); + DovominJob dj = alreadyApplied ? job.Applications.First(a => a.DovominId == user.Id) : new DovominJob(user, job); + dj.CalculateAffinity(); JobMiniViewModel jvm = new JobMiniViewModel(job, 3); StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه "); @@ -165,7 +190,8 @@ namespace Sevomin.WebFrontend.Controllers sb.Append(string.Format(param.Item1 + " ", param.Item2)); ViewBag.ShortJobDescription = sb.ToString(); - ViewBag.Job = new JobViewModel(job); + ViewBag.Job = new JobViewModel(job); + ViewBag.AlreadyApplied = alreadyApplied; return View(new DovominJobViewModel(dj)); } @@ -176,11 +202,11 @@ namespace Sevomin.WebFrontend.Controllers public async Task Apply(long jobId, string CoverLetter) { Dovomin user = (await UserManager.FindByNameAsync(User.Identity.Name)) as Dovomin; - Job job = _JobRepository.Find(jobId); + Job job = _jobRepository.Find(jobId); if (user == null || job == null) return HttpNotFound(); - _JobRepository.Apply(user, job, CoverLetter); + DovominJob dj = _jobRepository.Apply(user, job, CoverLetter); JobMiniViewModel jvm = new JobMiniViewModel(job, 3); StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه "); @@ -189,12 +215,36 @@ namespace Sevomin.WebFrontend.Controllers ViewBag.ShortJobDescription = sb.ToString(); ViewBag.Job = new JobViewModel(job); + ViewBag.AlreadyApplied = true; ViewBag.Result = new PostResultViewModel(true, "اعلام آمادگی شما برای این فرصت شغلی ثبت شد."); - return View(); + return View(new DovominJobViewModel(dj)); } - + + public ActionResult MyJobs(int? count) + { + User user = UserManager.FindByName(User.Identity.Name); + + List retList = new List(); + + if (user is Avalin) + retList = _jobRepository.ListAll() + .Where(j => j.AvalinId == user.Id) + .OrderByDescending(j => j.CreateDate) + .ToList() + .Select(j => new JobMiniViewModel(j)) + .ToList(); + else + retList = _jobRepository.ListAll() + .Where(j => j.Applications.Any(a => a.DovominId == user.Id)) + .OrderByDescending(j => j.CreateDate) + .ToList() + .Select(j => new JobMiniViewModel(j)) + .ToList(); + + return PartialView("JobList", retList); + } 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) { @@ -227,4 +277,4 @@ namespace Sevomin.WebFrontend.Controllers } } } -} +} \ No newline at end of file diff --git a/Sevomin.WebFrontend/App_Start/RouteConfig.cs b/Sevomin.WebFrontend/App_Start/RouteConfig.cs index 9925869..9153f85 100644 --- a/Sevomin.WebFrontend/App_Start/RouteConfig.cs +++ b/Sevomin.WebFrontend/App_Start/RouteConfig.cs @@ -48,6 +48,11 @@ namespace Sevomin.WebFrontend url: "my-profile", defaults: new { controller = "Account", action = "MyProfile" } ); + routes.MapRoute( + name: "DovominProfile", + url: "dovomin/id-{userId}", + defaults: new { controller = "Account", action = "Dovomin" } + ); #endregion #region For Jobs @@ -69,6 +74,12 @@ namespace Sevomin.WebFrontend defaults: new { controller = "Job", action = "Apply" } ); + routes.MapRoute( + name: "RecentJobs", + url: "jobs", + defaults: new { controller = "Job", action = "RecentJobs" } + ); + routes.MapRoute( name: "SingleJob", url: "jobs/{jobId}", diff --git a/Sevomin.WebFrontend/Content/common.css b/Sevomin.WebFrontend/Content/common.css index 8522d99..33e661d 100644 --- a/Sevomin.WebFrontend/Content/common.css +++ b/Sevomin.WebFrontend/Content/common.css @@ -5,10 +5,15 @@ url('/fonts/BKoodakBold.ttf') format('truetype'); /* Saf3—5, Chrome4+, FF3.5, Opera 10+ */ } @font-face { - font-family: 'Yekan'; - src: url('/fonts/BYekan.eot?#') format('eot'), /* IE6–8 */ - url('/fonts/BYekan.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('/fonts/BYekan.ttf') format('truetype'); /* Saf3—5, Chrome4+, FF3.5, Opera 10+ */ + font-family: 'Yekan'; + src: url('/fonts/WebYekan.eot'); + src: url('/fonts/WebYekan.eot?#iefix') format('embedded-opentype'), + url('/fonts/WebYekan.woff') format('woff'), + url('/fonts/WebYekan.ttf') format('truetype'), + url('/fonts/WebYekan.svg#WebYekan') format('svg'); + font-weight: normal; + font-style: normal; + unicode-range: U+0600–06FF; } body{ @@ -74,4 +79,17 @@ th{ .job-list-bottom-toolbar .date{ float: right; +} + +#login-intro-text{ + line-height: 1.5em; + font-size: 1.3em; +} + +#login-intro-box{ + border-radius: 5px; + border: 1px solid #808080; + margin: 10px; + padding: 5px; + background: #dcdcdc; } \ No newline at end of file diff --git a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj index 118e3ad..006af29 100644 --- a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj +++ b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj @@ -199,18 +199,19 @@ + - - - + + + @@ -262,6 +263,8 @@ + + Web.config diff --git a/Sevomin.WebFrontend/Views/Account/Dovomin.cshtml b/Sevomin.WebFrontend/Views/Account/Dovomin.cshtml new file mode 100644 index 0000000..720d2d4 --- /dev/null +++ b/Sevomin.WebFrontend/Views/Account/Dovomin.cshtml @@ -0,0 +1,68 @@ +@model Sevomin.Models.DovominViewModel + +@{ + ViewBag.Title = "Dovomin"; +} + + + +
+ + + + + + + + + + + + + + + + + + + +
@Html.DisplayNameFor(m => m.JalaliBirthDate)تمایل به کار فول تایمتمایل به کار پارت تایم@Html.DisplayNameFor(m => m.EnglishResume)@Html.DisplayNameFor(m => m.PersianResume)
@Html.DisplayFor(m => m.JalaliBirthDate)@(Model.IsFullTime ? "بله" : "خیر")@(Model.IsPartTime ? "بله" : "خیر") + @if (!string.IsNullOrWhiteSpace(Model.EnglishResume)){ + فایل رزومه انگلیسی + } + else { + ندارد + } + + @if (!string.IsNullOrWhiteSpace(Model.PersianResume)){ + فایل رزومه فارسی + } + else { + ندارد + } +
+

+ @Model.Description +

+ + + + + + + + @foreach (var param in Model.Parameters) + { + if (!string.IsNullOrWhiteSpace(param.StringValue)) + { + + + + + } + } + +
توانایی های فردی
@param.ParameterName@(param.DisplayMethod == 4 ? param.ParameterValues.FirstOrDefault(v => v.Item1.ToString() == param.StringValue).Item2 : param.StringValue)
+
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Account/Login.cshtml b/Sevomin.WebFrontend/Views/Account/Login.cshtml index d6de565..a025df8 100644 --- a/Sevomin.WebFrontend/Views/Account/Login.cshtml +++ b/Sevomin.WebFrontend/Views/Account/Login.cshtml @@ -6,6 +6,14 @@

ورود به سومین

+
+
+

+ اگر قبلا در سایت ثبت‌نام کرده‌اید می‌توانید با وارد کردن کد کاربری و کلمه عبور وارد سایت شوید. +اگر قبلا در سایت ثبت‌نام نکرده‌اید می‌توانید هم‌اکنون به هر بخشی که مایل هستید بروید و اطلاعات موجود در سایت را مرور کنید (به جز مواردی که از سوی اشخاص محرمانه معرفی شده‌اند). می‌توانید با مراجعه به صفحه اول سایت ثبت‌نام نیز بکنید تا بتوانید برای آگهی‌های استخدام اعلام آمادگی کنید، آگهی استخدام ثبت کنید و ... +

+
+

@Html.ValidationSummary() @@ -39,11 +47,4 @@

}
-
-

- لورم ایپسوم متنی است که ساختگی برای طراحی و چاپ آن مورد است. صنعت چاپ زمانی لازم بود شرایطی شما باید فکر ثبت نام و طراحی، لازمه خروج می باشد. در ضمن قاعده همفکری ها جوابگوی سئوالات زیاد شاید باشد، آنچنان که لازم بود طراحی گرافیکی خوب بود. کتابهای زیادی شرایط سخت ، دشوار و کمی در سالهای دور لازم است. هدف از این نسخه فرهنگ پس از آن و دستاوردهای خوب شاید باشد. حروفچینی لازم در شرایط فعلی لازمه تکنولوژی بود که گذشته، حال و آینده را شامل گردد. سی و پنج درصد از طراحان در قرن پانزدهم میبایست پرینتر در ستون و سطر حروف لازم است، بلکه شناخت این ابزار گاه اساسا بدون هدف بود و سئوالهای زیادی در گذشته بوجود می آید، تنها لازمه آن بود. - -لورم ایپسوم متنی است که ساختگی برای طراحی و چاپ آن مورد است. صنعت چاپ زمانی لازم بود شرایطی شما باید فکر ثبت نام و طراحی، لازمه خروج می باشد. در ضمن قاعده همفکری ها جوابگوی سئوالات زیاد شاید باشد، آنچنان که لازم بود طراحی گرافیکی خوب بود. کتابهای زیادی شرایط سخت ، دشوار و کمی در سالهای دور لازم است. هدف از این نسخه فرهنگ پس از آن و دستاوردهای خوب شاید باشد. حروفچینی لازم در شرایط فعلی لازمه تکنولوژی بود که گذشته، حال و آینده را شامل گردد. سی و پنج درصد از طراحان در قرن پانزدهم میبایست پرینتر در ستون و سطر حروف لازم است، بلکه شناخت این ابزار گاه اساسا بدون هدف بود و سئوالهای زیادی در گذشته بوجود می آید، تنها لازمه آن بود. -

-
- \ No newline at end of file + diff --git a/Sevomin.WebFrontend/Views/Account/ProfileAvalin.cshtml b/Sevomin.WebFrontend/Views/Account/ProfileAvalin.cshtml index 292210d..0667897 100644 --- a/Sevomin.WebFrontend/Views/Account/ProfileAvalin.cshtml +++ b/Sevomin.WebFrontend/Views/Account/ProfileAvalin.cshtml @@ -1,5 +1,55 @@ -@{ - ViewBag.Title = "View1"; +@model Sevomin.Models.AvalinViewModel +@{ + ViewBag.Title = "ویرایش پروفایل"; } -

ProfileAvalin

\ No newline at end of file +@Html.Partial("PostResult", ViewBag.Result as Sevomin.Models.PostResultViewModel) + + +@using (Html.BeginForm("ProfileAvalin", "Account", FormMethod.Post, new { role = "form", @class = "assess-inputs", enctype = "multipart/form-data" })) +{ +
+
+ +
+
+
+
+
+
+
+ @Html.LabelFor(model => model.CompanyPhoneNumber) + @Html.TextBoxFor(model => model.CompanyPhoneNumber, new { @class = "form-control" }) +
+
+ @Html.LabelFor(model => model.EMail) + @Html.TextBoxFor(model => model.EMail, new { @class = "form-control" }) +
+
+ @Html.LabelFor(model => model.Address) + @Html.TextAreaFor(model => model.Address, new { @class = "form-control" }) +
+
+
+
+ @Html.LabelFor(model => model.CompanyName) + @Html.TextBoxFor(model => model.CompanyName, new { @class = "form-control" }) +
+
+ @Html.LabelFor(model => model.NationalId) + @Html.TextBoxFor(model => model.NationalId, new { @class = "form-control" }) +
+
+ @Html.LabelFor(model => model.RegisterId) + @Html.TextBoxFor(model => model.RegisterId, new { @class = "form-control" }) +
+
+
+
+
+
+ +
+} \ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Home/AvalinIndex.cshtml b/Sevomin.WebFrontend/Views/Home/AvalinIndex.cshtml index 12d7c71..82284cf 100644 --- a/Sevomin.WebFrontend/Views/Home/AvalinIndex.cshtml +++ b/Sevomin.WebFrontend/Views/Home/AvalinIndex.cshtml @@ -4,10 +4,17 @@ \ No newline at end of file + + +
+
+

آگهی های شما

+ @Html.Action("MyJobs", "Job") +
+
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Home/DovominIndex.cshtml b/Sevomin.WebFrontend/Views/Home/DovominIndex.cshtml index 88a9f9a..f228982 100644 --- a/Sevomin.WebFrontend/Views/Home/DovominIndex.cshtml +++ b/Sevomin.WebFrontend/Views/Home/DovominIndex.cshtml @@ -3,6 +3,8 @@ }
- @Html.Action("LatestJobList", "Job", new { count = 15 }) +
+ @Html.Action("LatestJobList", "Job", new { count = 15 }) +
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Job/Apply.cshtml b/Sevomin.WebFrontend/Views/Job/Apply.cshtml index 4bfcf5b..c0ac2a1 100644 --- a/Sevomin.WebFrontend/Views/Job/Apply.cshtml +++ b/Sevomin.WebFrontend/Views/Job/Apply.cshtml @@ -2,26 +2,67 @@ @{ ViewBag.Title = ViewBag.ShortJobDescription; + bool AlreadyApplied = (ViewBag.AlreadyApplied != null && (bool)ViewBag.AlreadyApplied); } @Html.Partial("PostResult", ViewBag.Result as Sevomin.Models.PostResultViewModel) -
-

@ViewBag.ShortJobDescription

+

@ViewBag.ShortJobDescription

- @Html.Partial("JobDigest", (Sevomin.Models.JobViewModel)ViewBag.Job) +@if (User.IsInRole("Dovomin")) { +
+
+ میزان مطابقت شما با این فرصت شغلی @(Model.Affinity*100) درصد می باشد. +
+
+ @(Model.Affinity*100)% +
+
+
+
+ @if (!Model.MinimumRequirement) + { + این فرصت شغلی نیاز به مهارت هایی دارد که با پروفایل شما مطابقت ندارد. اگر هنوز اطلاعات خود را کامل نکرده اید، به صفحه ویرایش پروفایل مراجعه نمایید. + } + else { + شما تمامی مهارت های الزامی مورد نیاز این فرصت شغلی را دارید. + } +
+
+} + +
+
+ @if (AlreadyApplied) + { +
اعلام آمادگی شما برای این فرصت شغلی ثبت شده است.
+ } + + @Html.Partial("JobDigest", (Sevomin.Models.JobViewModel)ViewBag.Job) - @using (Html.BeginForm("Apply", "Job", FormMethod.Post, new { role = "form" })) - { - @Html.AntiForgeryToken() -
- @Html.LabelFor(model => model.CoverLetter) -

برای کارفرمای مربوطه پیغامی داری بگو

- @Html.TextAreaFor(model => model.CoverLetter, new { @class = "form-control" }) - @Html.ValidationMessageFor(m => m.CoverLetter) -
-
- -
- } + @if (AlreadyApplied) + { +
+ @Html.LabelFor(model => model.CoverLetter) +

+ @Model.CoverLetter +

+
+ } + else { + using (Html.BeginForm("Apply", "Job", FormMethod.Post, new { role = "form" })) + { + @Html.AntiForgeryToken() +
+ @Html.LabelFor(model => model.CoverLetter) + + @Html.TextAreaFor(model => model.CoverLetter, new { @class = "form-control" }) + @Html.ValidationMessageFor(m => m.CoverLetter) +
+
+ +
+ } + } +
diff --git a/Sevomin.WebFrontend/Views/Job/Edit.cshtml b/Sevomin.WebFrontend/Views/Job/Edit.cshtml index 8f4f04b..8e0eab7 100644 --- a/Sevomin.WebFrontend/Views/Job/Edit.cshtml +++ b/Sevomin.WebFrontend/Views/Job/Edit.cshtml @@ -6,7 +6,7 @@ @Html.Partial("PostResult", ViewBag.Result as Sevomin.Models.PostResultViewModel) @using (Html.BeginForm("Edit", "Job", FormMethod.Post, new { role = "form", @class = "assess-inputs" })) diff --git a/Sevomin.WebFrontend/Views/Job/JobDigest.cshtml b/Sevomin.WebFrontend/Views/Job/JobDigest.cshtml index 00d8471..347e8c3 100644 --- a/Sevomin.WebFrontend/Views/Job/JobDigest.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobDigest.cshtml @@ -40,4 +40,4 @@ } -
+ \ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml b/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml index 305edf1..b831a4e 100644 --- a/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml @@ -61,9 +61,8 @@
-
مشخصات اضافه آگهی
-
-
سلام چطورین؟
+
مشخصات تکمیلی آگهی
+
@foreach (var category in Model.Parameters.GroupBy(m => m.GroupName)) { diff --git a/Sevomin.WebFrontend/Views/Job/JobList.cshtml b/Sevomin.WebFrontend/Views/Job/JobList.cshtml index 6ba8a6c..99a2c63 100644 --- a/Sevomin.WebFrontend/Views/Job/JobList.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobList.cshtml @@ -1,30 +1,43 @@ @model IList - -
-
- @foreach (var job in Model) +
+ @if (User.IsInRole("Avalin") && Model.Count == 0) + { +
+
+
شما هیچ آگهی منتشر شده ای ندارید.
+

+ برای انتشار آگهی به صفحه انتشار آگهی مراجعه کنید. +

+
+
+ } + else + { + foreach (var job in Model) { -
-
- -

- کارشناس برنامه ریزی و کنترل پروژه +

+
+ +

+ کارشناس برنامه ریزی و کنترل پروژه @foreach (var param in job.Parameters) { @MvcHtmlString.Create(string.Format(param.Item1, param.Item2) + " ") } -

-
- آخرین مهلت اعلام آمادگی: @job.JalaliExpireDate - @if (User.IsInRole("Dovomin")) +

+
+ آخرین مهلت اعلام آمادگی: @job.JalaliExpireDate + @if(Request.IsAuthenticated){ + if (User.IsInRole("Avalin") && job.AvalinUsername == User.Identity.Name) { - اعلام آمادگی + ویرایش آگهی } -
+ }
+
} -
-
+ } + \ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Job/NewJob.cshtml b/Sevomin.WebFrontend/Views/Job/NewJob.cshtml index 4a81a23..52f3ea5 100644 --- a/Sevomin.WebFrontend/Views/Job/NewJob.cshtml +++ b/Sevomin.WebFrontend/Views/Job/NewJob.cshtml @@ -5,7 +5,7 @@ @Html.Partial("PostResult", ViewBag.Result as Sevomin.Models.PostResultViewModel) @using (Html.BeginForm("NewJob", "Job", FormMethod.Post, new { role = "form", @class = "assess-inputs" })) diff --git a/Sevomin.WebFrontend/Views/Job/RecentJobs.cshtml b/Sevomin.WebFrontend/Views/Job/RecentJobs.cshtml new file mode 100644 index 0000000..c29ac82 --- /dev/null +++ b/Sevomin.WebFrontend/Views/Job/RecentJobs.cshtml @@ -0,0 +1,19 @@ +@model IEnumerable + +@{ + ViewBag.Title = "آگهی های استخدام"; +} + +

آگهی های استخدام تازه

+ +@if (!Request.IsAuthenticated) { +

+ شما در سایت وارد نشده اید. برای اعلام آمادگی برای هرکدام از فرصت های شغلی، به سایت وارد شوید یا ثبت نام کنید. +

+} + +
+
+ @Html.Partial("JobList", Model) +
+
\ No newline at end of file diff --git a/Sevomin.WebFrontend/Views/Shared/Navbar.cshtml b/Sevomin.WebFrontend/Views/Shared/Navbar.cshtml index 2c82f69..d12763d 100644 --- a/Sevomin.WebFrontend/Views/Shared/Navbar.cshtml +++ b/Sevomin.WebFrontend/Views/Shared/Navbar.cshtml @@ -18,13 +18,9 @@ } else {
  • ورود به سایت
  • - } - @*
  • تماس با ما
  • -
  • درباره ما
  • *@ -
  • مشخصات متخصصین
  • -
  • آگهی های استخدام
  • + }
  • خانه
  • - + \ No newline at end of file diff --git a/Sevomin.WebFrontend/fonts/BYekan.eot b/Sevomin.WebFrontend/fonts/BYekan.eot deleted file mode 100644 index 1e032e2..0000000 Binary files a/Sevomin.WebFrontend/fonts/BYekan.eot and /dev/null differ diff --git a/Sevomin.WebFrontend/fonts/BYekan.ttf b/Sevomin.WebFrontend/fonts/BYekan.ttf deleted file mode 100644 index d96a729..0000000 Binary files a/Sevomin.WebFrontend/fonts/BYekan.ttf and /dev/null differ diff --git a/Sevomin.WebFrontend/fonts/BYekan.woff b/Sevomin.WebFrontend/fonts/BYekan.woff deleted file mode 100644 index bf95c57..0000000 Binary files a/Sevomin.WebFrontend/fonts/BYekan.woff and /dev/null differ diff --git a/Sevomin.WebFrontend/fonts/WebYekan.eot b/Sevomin.WebFrontend/fonts/WebYekan.eot new file mode 100644 index 0000000..e56399e Binary files /dev/null and b/Sevomin.WebFrontend/fonts/WebYekan.eot differ diff --git a/Sevomin.WebFrontend/fonts/WebYekan.svg b/Sevomin.WebFrontend/fonts/WebYekan.svg new file mode 100644 index 0000000..9893ad6 --- /dev/null +++ b/Sevomin.WebFrontend/fonts/WebYekan.svg @@ -0,0 +1,612 @@ + + + + +Created by FontForge 1853326994 at Sun Oct 13 04:53:50 2013 + By U-zoghal-god\zoghal,S-1-5-21-2758449068-1321902542-3097588897-1003 +(c) 1392 Rita Development Corpertion(RitaCo) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sevomin.WebFrontend/fonts/WebYekan.ttf b/Sevomin.WebFrontend/fonts/WebYekan.ttf new file mode 100644 index 0000000..ba02801 Binary files /dev/null and b/Sevomin.WebFrontend/fonts/WebYekan.ttf differ diff --git a/Sevomin.WebFrontend/fonts/WebYekan.woff b/Sevomin.WebFrontend/fonts/WebYekan.woff new file mode 100644 index 0000000..068520f Binary files /dev/null and b/Sevomin.WebFrontend/fonts/WebYekan.woff differ