Browse Source

notification emails refined

master
Milad Karbasizadeh 11 years ago
parent
commit
a9b268727a
11 changed files with 105 additions and 78 deletions
  1. +18
    -5
      Sevomin.Models/Helpers/ScheduledTasks/NewApplication.cs
  2. +4
    -4
      Sevomin.Models/Helpers/ScheduledTasks/NewJob.cs
  3. +1
    -1
      Sevomin.Models/Helpers/SevominRegistry.cs
  4. +3
    -6
      Sevomin.Models/JobApplicationViewModel.cs
  5. +8
    -0
      Sevomin.Models/JobMiniViewModel.cs
  6. +4
    -10
      Sevomin.WebFrontend.Controllers/JobController.cs
  7. +5
    -1
      Sevomin.WebFrontend/Global.asax.cs
  8. +56
    -45
      Sevomin.WebFrontend/Views/God/Index.cshtml
  9. +1
    -1
      Sevomin.WebFrontend/Views/Shared/Navbar.cshtml
  10. +4
    -4
      Sevomin.WebFrontend/Views/Shared/SocialMetaTags.cshtml
  11. +1
    -1
      Sevomin.WebFrontend/Web.config

+ 18
- 5
Sevomin.Models/Helpers/ScheduledTasks/NewApplication.cs View File

@ -11,15 +11,28 @@ namespace Sevomin.Models.Helpers.ScheduledTasks
{ {
public async void Execute() public async void Execute()
{ {
var avalins = SevominDbContext.Current.DovominJobs.Where(dj => dj.ApplyDate.Date == DateTime.Now.AddDays(-2).Date).Select(a => a.Job.Avalin);
var avalins = SevominDbContext.Current.DovominJobs.Where(dj => dj.ApplyDate.Date >= DateTime.Now.AddDays(-2).Date).Select(a => a.Job.Avalin);
foreach (var avalin in avalins.Distinct()) foreach (var avalin in avalins.Distinct())
{ {
SevominEmailer emailer = new SevominEmailer();
emailer.EmailType = EmailType.NewApplication;
emailer.Parameters.Add("", "");
var applies = SevominDbContext.Current.DovominJobs.Where(dj => dj.Job.AvalinId == avalin.Id && dj.ApplyDate.Date == DateTime.Now.AddDays(-2).Date);
await emailer.SendAsync(avalin.Email, "", true);
foreach (var apply in applies)
{
SevominEmailer emailer = new SevominEmailer();
emailer.EmailType = EmailType.NewApplication;
emailer.Parameters.Add("avalin-name", avalin.DisplayName);
emailer.Parameters.Add("avalin-contact", string.IsNullOrWhiteSpace(apply.Job.ContactPersonName) ? "" : apply.Job.ContactPersonName);
emailer.Parameters.Add("dovomin-name", apply.Dovomin.DisplayName);
if (string.IsNullOrWhiteSpace(apply.Job.ContactPersonEMail))
await emailer.SendAsync(avalin.Email, "اعلام آمادگی جدید برای فرصت شغلی اعلام شده در سومین", true);
else
{
await emailer.SendAsync(avalin.Email, "اعلام آمادگی جدید برای فرصت شغلی اعلام شده در سومین", true);
await emailer.SendAsync(apply.Job.ContactPersonEMail, "اعلام آمادگی جدید برای فرصت شغلی اعلام شده در سومین", true);
}
}
} }
} }
} }


+ 4
- 4
Sevomin.Models/Helpers/ScheduledTasks/NewJob.cs View File

@ -12,16 +12,16 @@ namespace Sevomin.Models.Helpers.ScheduledTasks
{ {
public async void Execute() public async void Execute()
{ {
var newJobs = JobRepository.Current.ListAll().Where(j => j.CreateDate.Date == DateTime.Now.AddDays(-1).Date).ToList();
var newJobs = JobRepository.Current.ListAll().Where(j => j.CreateDate.Date >= DateTime.Now.AddDays(-1).Date).ToList();
if (newJobs.Count > 0) if (newJobs.Count > 0)
{ {
foreach (var dovomin in UserRepository.Current.ListAll().Where(u => u is Dovomin && u.EmailConfirmed)) foreach (var dovomin in UserRepository.Current.ListAll().Where(u => u is Dovomin && u.EmailConfirmed))
{ {
SevominEmailer emailer = new SevominEmailer(); SevominEmailer emailer = new SevominEmailer();
emailer.EmailType = EmailType.NewJob;
emailer.Parameters.Add("", "");
emailer.EmailType = EmailType.NewJob;
emailer.Parameters.Add("display-name", dovomin.DisplayName);
await emailer.SendAsync(dovomin.Email, "", true);
await emailer.SendAsync(dovomin.Email, "آگهی استخدام جدید در سومین", true);
} }
} }
} }


+ 1
- 1
Sevomin.Models/Helpers/SevominRegistry.cs View File

@ -14,7 +14,7 @@ namespace Sevomin.Models.Helpers
{ {
Schedule<NewApplication>().ToRunEvery(2).Days().At(8, 0); Schedule<NewApplication>().ToRunEvery(2).Days().At(8, 0);
Schedule<ExpiringJob>().ToRunEvery(1).Days().At(8, 10); Schedule<ExpiringJob>().ToRunEvery(1).Days().At(8, 10);
Schedule<NewJob>().ToRunEvery(2).Days().At(8, 20);
Schedule<NewJob>().ToRunEvery(1).Days().At(8, 20);
} }
} }
} }

+ 3
- 6
Sevomin.Models/JobApplicationViewModel.cs View File

@ -29,13 +29,10 @@ namespace Sevomin.Models
this.CoverLetter = dj.CoverLetter; this.CoverLetter = dj.CoverLetter;
this.Affinity = (float)(dj.Affinity * 100); this.Affinity = (float)(dj.Affinity * 100);
this.MinimumRequirement = dj.MinimumRequirement; this.MinimumRequirement = dj.MinimumRequirement;
var jmvm = new JobMiniViewModel(dj.Job, 2);
StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
var jmvm = new JobMiniViewModel(dj.Job, 2);
foreach (var param in jmvm.Parameters)
sb.Append(string.Format(param.Item1 + " ", param.Item2));
this.JobSummary = sb.ToString();
this.JobSummary = jmvm.JobSummary;
} }
} }
} }

+ 8
- 0
Sevomin.Models/JobMiniViewModel.cs View File

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text;
//استخدام نیروی «کنترل پروژه» با ×× سال سابقه ×× دارای ×مدرک× ×× برای کار در ×کشور×شهر× //استخدام نیروی «کنترل پروژه» با ×× سال سابقه ×× دارای ×مدرک× ×× برای کار در ×کشور×شهر×
namespace Sevomin.Models namespace Sevomin.Models
@ -48,6 +49,8 @@ namespace Sevomin.Models
public string CompanyName { get; set; } public string CompanyName { get; set; }
public string CompanyLogo { get; set; } public string CompanyLogo { get; set; }
public string JobSummary { private set; get; }
public IList<Tuple<string, string>> Parameters; public IList<Tuple<string, string>> Parameters;
public JobMiniViewModel(Job job, int maxNumberOfMiniParams = 6) public JobMiniViewModel(Job job, int maxNumberOfMiniParams = 6)
@ -84,6 +87,11 @@ namespace Sevomin.Models
} }
Parameters.Add(new Tuple<string,string>(format, value)); Parameters.Add(new Tuple<string,string>(format, value));
} }
StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
foreach (var param in Parameters)
sb.Append(string.Format(param.Item1 + " ", param.Item2));
this.JobSummary = sb.ToString();
} }
} }
} }

+ 4
- 10
Sevomin.WebFrontend.Controllers/JobController.cs View File

@ -184,12 +184,9 @@ namespace Sevomin.WebFrontend.Controllers
return HttpNotFound(); return HttpNotFound();
JobViewModel viewModel = new JobViewModel(job); JobViewModel viewModel = new JobViewModel(job);
JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
foreach (var param in jvm.Parameters)
sb.Append(string.Format(param.Item1 + " ", param.Item2));
JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
ViewBag.ShortJobDescription = sb.ToString();
ViewBag.ShortJobDescription = jvm.JobSummary;
if (Request.IsAuthenticated && User.IsInRole("Dovomin")) if (Request.IsAuthenticated && User.IsInRole("Dovomin"))
{ {
Dovomin user = await UserManager.FindByNameAsync(User.Identity.Name) as Dovomin; Dovomin user = await UserManager.FindByNameAsync(User.Identity.Name) as Dovomin;
@ -292,12 +289,9 @@ namespace Sevomin.WebFrontend.Controllers
private void PrepareJobApplication(Dovomin user, Job job, bool alreadyApplied = true) private void PrepareJobApplication(Dovomin user, Job job, bool alreadyApplied = true)
{ {
JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه ");
foreach (var param in jvm.Parameters)
sb.Append(string.Format(param.Item1 + " ", param.Item2));
JobMiniViewModel jvm = new JobMiniViewModel(job, 3);
ViewBag.ShortJobDescription = sb.ToString();
ViewBag.ShortJobDescription = jvm.JobSummary;
ViewBag.Job = new JobViewModel(job); ViewBag.Job = new JobViewModel(job);
ViewBag.AlreadyApplied = alreadyApplied; ViewBag.AlreadyApplied = alreadyApplied;
} }


+ 5
- 1
Sevomin.WebFrontend/Global.asax.cs View File

@ -18,9 +18,13 @@ namespace Sevomin.WebFrontend
AreaRegistration.RegisterAllAreas(); AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); RouteConfig.RegisterRoutes(RouteTable.Routes);
//TaskManager.Initialize(new SevominRegistry());
#if !DEBUG
TaskManager.Initialize(new SevominRegistry());
#endif
} }
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{ {
if ((e.Exception.GetBaseException() is HttpException if ((e.Exception.GetBaseException() is HttpException


+ 56
- 45
Sevomin.WebFrontend/Views/God/Index.cshtml View File

@ -11,13 +11,13 @@
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap.min.css")" /> <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap.min.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap-theme.min.css")" /> <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/bootstrap-theme.min.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/common.css")" /> <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/common.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/forms.css")" />
<link rel="stylesheet" type="text/css" href="@Url.Content("~/content/forms.css")" />
</head> </head>
<body> <body>
<div class="container rtl"> <div class="container rtl">
<div class="jumbotron"> <div class="jumbotron">
<h1>سلام!</h1> <h1>سلام!</h1>
<p>یک سری اطلاعات کلی درباره وب سایت سومین در این محل قابل ارائه می باشد.</p>
<p>یک سری اطلاعات کلی درباره وب سایت سومین در این محل قابل ارائه می باشد.</p>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
@ -46,59 +46,70 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 pull-right">
<div class="col-md-6 pull-right rtl">
<h2>اعلام آمادگی های فرصت های شغلی</h2> <h2>اعلام آمادگی های فرصت های شغلی</h2>
@foreach (Sevomin.Models.Avalin avalin in Sevomin.Models.SevominDbContext.Current.Users.OfType<Sevomin.Models.Avalin>().ToList())
{
if (avalin.Jobs.Count == 0)
{ continue; }
<h3>@avalin.DisplayName</h3>
foreach (var job in avalin.Jobs)
<div class="panel-group" id="accordion">
@foreach (Sevomin.Models.Avalin avalin in Sevomin.Models.SevominDbContext.Current.Users.OfType<Sevomin.Models.Avalin>().ToList())
{ {
if (job.Applications.Count == 0)
if (avalin.Jobs.Count == 0)
{ continue; } { continue; }
foreach (var application in job.Applications)
{
Sevomin.Models.JobApplicationViewModel apply = new Sevomin.Models.JobApplicationViewModel(application);
<div class="panel panel-default rtl">
<div class="panel-body">
<em>از طرف <a href="@Url.Action("Dovomin", "Account", new { userId = apply.DovominId })">@apply.DovominDisplayName</a>
(@(string.IsNullOrWhiteSpace(job.ContactPersonName) ? "نام وارد نشده" : job.ContactPersonName)
@((string.IsNullOrWhiteSpace(job.ContactPersonEMail) ? "ایمیل وارد نشده" : job.ContactPersonEMail))
@((string.IsNullOrWhiteSpace(job.ContactPersonPhone) ? "تلفن وارد نشده" : job.ContactPersonPhone)))
</em>
<h4>@apply.JobSummary</h4>
@if (!string.IsNullOrWhiteSpace(apply.CoverLetter))
{
<h5>پیغام متخصص:</h5>
<blockquote>@apply.CoverLetter</blockquote>
}
@if (apply.MinimumRequirement)
{
<p>این متخصص تمامی مهارت های الزامی برای این فرصت شغلی را دارد. همچنین میزان مطابقت ایشان با این فرصت شغلی، @apply.Affinity درصد است.</p>
}
else
{
<p>این متخصص برخی مهارت های الزامی برای این فرصت شغلی را ندارد. همچنین میزان مطابقت ایشان با این فرصت شغلی، @apply.Affinity درصد است.</p>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#@avalin.Id">@avalin.DisplayName
</a>
</h4>
</div>
@foreach (var job in avalin.Jobs)
{
if (job.Applications.Count == 0)
{ continue; }
<div id="@avalin.Id" class="panel-collapse collapse in">
<div class="panel-body">
<p>@((new Sevomin.Models.JobMiniViewModel(job)).JobSummary) @Html.ActionLink("مشاهده آگهی", "SingleJob", "Job", new { jobId = job.Id })</p>
<h5>اطلاعات فرد پاسخگو به این آگهی: (@(string.IsNullOrWhiteSpace(job.ContactPersonName) ? "نام وارد نشده" : job.ContactPersonName)
@((string.IsNullOrWhiteSpace(job.ContactPersonEMail) ? "ایمیل وارد نشده" : job.ContactPersonEMail))
@((string.IsNullOrWhiteSpace(job.ContactPersonPhone) ? "تلفن وارد نشده" : job.ContactPersonPhone)))</h5>
</div>
@foreach (var application in job.Applications.OrderByDescending(a => a.ApplyDate))
{
Sevomin.Models.JobApplicationViewModel apply = new Sevomin.Models.JobApplicationViewModel(application);
<div class="panel-body">
<em>از طرف <a href="@Url.Action("Dovomin", "Account", new { userId = apply.DovominId })">@apply.DovominDisplayName</a></em>
@if (!string.IsNullOrWhiteSpace(apply.CoverLetter))
{
<h5>پیغام متخصص:</h5>
<blockquote>@apply.CoverLetter</blockquote>
}
@if (apply.MinimumRequirement)
{
<p>این متخصص تمامی مهارت های الزامی برای این فرصت شغلی را دارد. همچنین میزان مطابقت ایشان با این فرصت شغلی، @apply.Affinity درصد است.</p>
}
else
{
<p>این متخصص برخی مهارت های الزامی برای این فرصت شغلی را ندارد. همچنین میزان مطابقت ایشان با این فرصت شغلی، @apply.Affinity درصد است.</p>
}
</div>
}
</div>
} }
</div>
</div>
}
}
}
</div>
}
</div>
</div> </div>
</div> </div>
</div> </div>
<script src="@Url.Content("~/scripts/jquery-2.1.0.min.js")"></script> <script src="@Url.Content("~/scripts/jquery-2.1.0.min.js")"></script>
<script src="@Url.Content("~/scripts/jquery-ui-1.10.4.js")"></script>
<script src="@Url.Content("~/scripts/jquery-ui-1.10.4.js")"></script>
<script src="@Url.Content("~/scripts/jalaliCalendar.js")"></script> <script src="@Url.Content("~/scripts/jalaliCalendar.js")"></script>
<script src="@Url.Content("~/scripts/jquery-ui-i18n.min.js")"></script>
<script src="@Url.Content("~/scripts/jquery-ui-i18n.min.js")"></script>
<script src="@Url.Content("~/scripts/jquery.validate.min.js")"></script> <script src="@Url.Content("~/scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/scripts/jquery.validate.unobtrusive.min.js")"></script> <script src="@Url.Content("~/scripts/jquery.validate.unobtrusive.min.js")"></script>
<script src="@Url.Content("~/scripts/bootstrap.min.js")"></script>
<script src="@Url.Content("~/scripts/sevomin-ui.js")"></script>
<script src="@Url.Content("~/scripts/bootstrap.min.js")"></script>
<script>
$(function () {
$('.collapse').collapse();
});
</script>
</body> </body>
</html> </html>

+ 1
- 1
Sevomin.WebFrontend/Views/Shared/Navbar.cshtml View File

@ -17,7 +17,7 @@
<li class="rtl"><a href="@Url.Action("Index", "Home")"><span class="glyphicon glyphicon-home"></span> @(User.IsInRole("Dovomin") ? "آگهی های استخدام" : "خانه")</a></li> <li class="rtl"><a href="@Url.Action("Index", "Home")"><span class="glyphicon glyphicon-home"></span> @(User.IsInRole("Dovomin") ? "آگهی های استخدام" : "خانه")</a></li>
@if (!Request.IsAuthenticated) @if (!Request.IsAuthenticated)
{ {
<li class="rtl"><a href="@Url.Action("", "Jobs")">آگهی‌های استخدام</a></li>
<li class="rtl"><a href="@Url.Action("RecentJobs", "Job")">آگهی‌های استخدام</a></li>
<li class="rtl"><a href="@Url.Action("Login", "Account")">ورود به سایت</a></li> <li class="rtl"><a href="@Url.Action("Login", "Account")">ورود به سایت</a></li>
} }
else else


+ 4
- 4
Sevomin.WebFrontend/Views/Shared/SocialMetaTags.cshtml View File

@ -1,14 +1,14 @@
<meta name="description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/> <meta name="description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/>
<meta itemprop="name" content="سومین" /> <meta itemprop="name" content="سومین" />
<meta itemprop="description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/> <meta itemprop="description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/>
<meta itemprop="image" content="@Url.Content("~/content/logo.png")"/>
<meta itemprop="image" content="@Url.Content("~/content/images/logo.png")"/>
<meta name="twitter:card" content="summary"/> <meta name="twitter:card" content="summary"/>
<meta name="twitter:site" content="@MvcHtmlString.Create("@sevomin")"/> <meta name="twitter:site" content="@MvcHtmlString.Create("@sevomin")"/>
<meta name="twitter:title" content="سومین"/> <meta name="twitter:title" content="سومین"/>
<meta name="twitter:description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/> <meta name="twitter:description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/>
<meta name="twitter:creator" content="@MvcHtmlString.Create("@sevomin")"/> <meta name="twitter:creator" content="@MvcHtmlString.Create("@sevomin")"/>
<meta name="twitter:image:src" content="@Url.Content("~/content/logo.png")"/>
<meta name="twitter:image:src" content="@Url.Content("~/content/images/logo.png")"/>
<meta name="twitter:domain" content="http://www.sevom.in"/> <meta name="twitter:domain" content="http://www.sevom.in"/>
@*<meta name="twitter:app:name:iphone" content="Vine"> @*<meta name="twitter:app:name:iphone" content="Vine">
<meta name="twitter:app:name:ipad" content="Vine"> <meta name="twitter:app:name:ipad" content="Vine">
@ -26,8 +26,8 @@
<meta property="og:site_name" content="سومین" /> <meta property="og:site_name" content="سومین" />
<meta property="og:url" content="http://www.sevom.in" /> <meta property="og:url" content="http://www.sevom.in" />
<meta property="og:description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/> <meta property="og:description" content="مرکز کاریابی برنامه‌ریزی و کنترل پروژه - @(string.IsNullOrWhiteSpace(ViewBag.Title) ? "خانه" : ViewBag.Title)"/>
<meta property="og:image" content="@Url.Content("~/content/logo.png")"/>
<link rel="icon" type="image/png" href="@Url.Content("~/content/3-icon.png")" />
<meta property="og:image" content="@Url.Content("~/content/images/logo.png")"/>
<link rel="icon" type="image/png" href="@Url.Content("~/content/images/3-icon.png")" />
@*<link rel="apple-touch-icon" href="@Url.Content("~/Content/images/57x57.png")" /> @*<link rel="apple-touch-icon" href="@Url.Content("~/Content/images/57x57.png")" />
<link rel="apple-touch-icon" sizes="72x72" href="@Url.Content("~/Content/icons/72x72.png")" /> <link rel="apple-touch-icon" sizes="72x72" href="@Url.Content("~/Content/icons/72x72.png")" />
<link rel="apple-touch-icon" sizes="114x114" href="@Url.Content("~/Content/icons/114x114.png")" /> <link rel="apple-touch-icon" sizes="114x114" href="@Url.Content("~/Content/icons/114x114.png")" />

+ 1
- 1
Sevomin.WebFrontend/Web.config View File

@ -15,7 +15,7 @@
</configSections> </configSections>
<connectionStrings> <connectionStrings>
<clear /> <clear />
<add name="SevominConnectionString" connectionString="Data Source=codiato;Initial Catalog=Sevomin;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" />
<add name="SevominConnectionString" connectionString="Data Source=codiato;Initial Catalog=Sevomin;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" />
</connectionStrings> </connectionStrings>
<appSettings> <appSettings>
<add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Version" value="3.0.0.0" />


Loading…
Cancel
Save