@ -0,0 +1,176 @@ | |||
<?php | |||
defined('BASEPATH') or exit('No direct script access allowed'); | |||
class Project_notifications extends AdminController | |||
{ | |||
public function __construct() | |||
{ | |||
parent::__construct(); | |||
$this->load->model('project_notifications_model'); | |||
$this->load->model('project_notifications_email_templates_model'); | |||
$this->load->model('contract_types_model'); | |||
$this->load->model('projects_model'); | |||
$this->load->helper('url'); | |||
} | |||
public function index() | |||
{ | |||
close_setup_menu(); | |||
if (!has_permission('project_notifications', '', 'view')) { | |||
access_denied('project_notifications'); | |||
} | |||
if ($this->input->is_ajax_request()) { | |||
$this->app->get_table_data(module_views_path('project_notifications', 'tables/list')); | |||
} | |||
$data['title'] = _l('pn_title'); | |||
$this->load->view('project_notifications', $data); | |||
} | |||
public function configure($id="") | |||
{ | |||
if (!has_permission('project_notifications', '', 'view')) { | |||
access_denied('project_notifications'); | |||
} | |||
$data['contractTypes'] = $this->contract_types_model->get(); | |||
$data['projectData'] = $this->project_notifications_model->getProjectDataForConfigurations(); | |||
$data['pan'] = $this->project_notifications_model->get($id); | |||
$data['id'] = $id; | |||
$data['title'] = _l('pn_configure_title'); | |||
$data['templates'] = $this->project_notifications_email_templates_model->get(); | |||
$this->load->view('configure', $data); | |||
} | |||
public function configuration($id="") | |||
{ | |||
if (trim($id)!=='') { | |||
if (!has_permission('project_notifications', '', 'edit')) { | |||
access_denied('project_notifications'); | |||
} | |||
} else { | |||
if (!has_permission('project_notifications', '', 'add')) { | |||
access_denied('project_notifications'); | |||
} | |||
} | |||
if ($this->input->post()) { | |||
$post = $this->input->post(); | |||
$data['triggertime'] = $post['triggertime']; | |||
$data['triggerday'] = $post['triggerday']; | |||
$data['emails'] = $post['emails']; | |||
$data['choice_type'] = $post['choice_type']; | |||
$data['contract_type'] = $post['contract_type']; | |||
$data['projects'] = $post['projects']; | |||
$data['dataset'] = (isset($post['prev_week']) && $post['prev_week']=='Y')?'PREV-WEEK':'SO-FAR'; | |||
$data['info_to_send'] = ''; | |||
$data['email_template'] = $post['email_template']; | |||
if (trim($id)!=='') { | |||
$data['id'] = $id; | |||
} | |||
$success = $this->project_notifications_model->upsert($data); | |||
} | |||
redirect('project_notifications'); | |||
} | |||
public function delete($id) | |||
{ | |||
$success = $this->project_notifications_model->delete($id); | |||
redirect('project_notifications'); | |||
} | |||
public function execute($id) | |||
{ | |||
execute_project_notification($id); | |||
redirect('project_notifications'); | |||
} | |||
public function email_templates() | |||
{ | |||
close_setup_menu(); | |||
if (!has_permission('project_notifications', '', 'view')) { | |||
access_denied('project_notifications'); | |||
} | |||
$data['title'] = _l('pn_email_template_title'); | |||
$data['tickets'] = $this->project_notifications_email_templates_model->get(); | |||
$this->load->view('email_templates', $data); | |||
} | |||
public function email_template($id="") | |||
{ | |||
close_setup_menu(); | |||
if (!has_permission('project_notifications', '', 'view')) { | |||
access_denied('project_notifications'); | |||
} | |||
$data['template'] = $this->project_notifications_email_templates_model->get($id); | |||
$data['title'] = $data['template']->name; | |||
$data['id'] = $id; | |||
$data['available_merge_fields'] = $this->project_notifications_email_templates_model->available_merge_fields(); | |||
$this->load->view('template', $data); | |||
} | |||
public function upsertemailtemplate($id="") | |||
{ | |||
if (trim($id)!=='') { | |||
if (!has_permission('project_notifications', '', 'edit')) { | |||
access_denied('project_notifications'); | |||
} | |||
} else { | |||
if (!has_permission('project_notifications', '', 'add')) { | |||
access_denied('project_notifications'); | |||
} | |||
} | |||
if ($this->input->post()) { | |||
$post = $this->input->post(); | |||
$data['type'] = $post['type']; | |||
$data['slug'] = $post['slug']; | |||
$data['language'] = $post['language']; | |||
$data['name'] = $post['name']; | |||
$data['subject'] = $post['subject']; | |||
$data['message'] = $post['message']; | |||
$data['fromname'] = $post['fromname']; | |||
$data['fromemail'] = $post['fromemail']; | |||
$data['plaintext'] = $post['plaintext']; | |||
$data['active'] = $post['active']; | |||
$data['order'] = $post['order']; | |||
if (trim($id)!=='') { | |||
$data['id'] = $id; | |||
} | |||
$success = $this->project_notifications_email_templates_model->upsert($data); | |||
} | |||
redirect('project_notifications/email_templates'); | |||
} | |||
// proivate utilities | |||
// This should not be in the controller and we should be using CI Active Record. | |||
// moved to model | |||
} |
@ -0,0 +1,11 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<title>403 Forbidden</title> | |||
</head> | |||
<body> | |||
<p>Directory access is forbidden.</p> | |||
</body> | |||
</html> |
@ -0,0 +1,362 @@ | |||
<?php | |||
class Project_notifications_module | |||
{ | |||
private $ci; | |||
public function __construct() | |||
{ | |||
$this->ci =& get_instance(); | |||
} | |||
public function executeNotification($id = "") | |||
{ | |||
$this->ci->load->model('project_notifications/project_notifications_model'); | |||
$this->ci->load->model('project_notifications/project_notifications_email_templates_model'); | |||
$this->ci->load->config('email'); | |||
$templates = $this->ci->project_notifications_model->projectNotificationExecution($id); | |||
$execRecord = array(); | |||
foreach($templates["data"] as $template) | |||
{ | |||
if($template['EMAIL_TEMPL_ID']!=='' && is_numeric($template['EMAIL_TEMPL_ID'])) | |||
{ | |||
//echo '<pre>'; print_r($this->ci->project_notifications_email_templates_model->get($template['EMAIL_TEMPL_ID'])); die(); | |||
$emailtemplate = $this->ci->project_notifications_email_templates_model->get($template['EMAIL_TEMPL_ID']); | |||
//echo '<pre>'; print_r($emailtemplate); die(); | |||
$messageData = $this->composeEmailMessageFromTemplate($template['EMAIL_TEMPL_ID'], $template['MESSAGE-DATA'], $emailtemplate); | |||
$this->ci->email->clear(true); | |||
if(trim($messageData['from_email'])!=='') | |||
{ | |||
$this->ci->email->from($messageData['from_name'],$messageData['from_email']); | |||
} | |||
else | |||
{ | |||
$this->ci->email->from($template['FROM_EMAIL'],$template['FROM_NAME']); | |||
} | |||
$this->ci->email->to($template['TO']); | |||
$this->ci->email->subject($messageData['subject']); | |||
$this->ci->email->message($messageData['message']); | |||
$templates["log"][] = "TO => ".$template['TO']; | |||
$templates["log"][] = "SUBJECT => <br>".$messageData['subject']; | |||
$templates["log"][] = "MESSAGE => <br>".$messageData['message']; | |||
if ($this->ci->email->send()) | |||
{ | |||
log_activity('Email Sent To [Email: ' . $template['TO'] . ', Template: Project Notification]'); | |||
$execRecord[$template['NOTIFY_ID']]['NOTIFY_ID'] = $template['NOTIFY_ID']; | |||
$execRecord[$template['NOTIFY_ID']]['TIME'] = date("Y-m-d H:i:s"); | |||
} | |||
} | |||
else | |||
{ | |||
//$message = $this->ci->load->view("email_templates/email", $template['MESSAGE-DATA'], TRUE); | |||
$message = $this->composeEmailMessage($template['MESSAGE-DATA']); | |||
$this->ci->email->clear(true); | |||
$this->ci->email->from($template['FROM_EMAIL'],$template['FROM_NAME']); | |||
$this->ci->email->to($template['TO']); | |||
$this->ci->email->subject($template['SUBJECT']); | |||
//$this->ci->email->message($template['MESSAGE']); | |||
$this->ci->email->message($message); | |||
$templates["log"][] = "TO => ".$template['TO']; | |||
if ($this->ci->email->send()) | |||
{ | |||
log_activity('Email Sent To [Email: ' . $template['TO'] . ', Template: Project Notification]'); | |||
$execRecord[$template['NOTIFY_ID']]['NOTIFY_ID'] = $template['NOTIFY_ID']; | |||
$execRecord[$template['NOTIFY_ID']]['TIME'] = date("Y-m-d H:i:s"); | |||
} | |||
} | |||
} | |||
foreach($execRecord as $record) | |||
{ | |||
$this->ci->db->insert(db_prefix() . 'project_notifications_log', [ | |||
'notify_id' => $record['NOTIFY_ID'], | |||
'triggertime' => $record['TIME'] | |||
]); | |||
} | |||
$templates["log"][] = json_encode($execRecord); | |||
$this->ci->email->clear(true); | |||
$this->ci->email->from(get_option('smtp_email'),get_option('companyname')); | |||
$this->ci->email->to("soumya@sentientgeeks.com"); | |||
$this->ci->email->subject("BROMANAGERS LOG : ".date("Y-m-d H:i:s")); | |||
$this->ci->email->message("<h1>LOG</h1>".implode("<br><br>",$templates["log"])); | |||
//$this->ci->email->send(); | |||
//echo '<pre>'; print_r($templates["log"]); echo '</pre>'; die(); | |||
} | |||
private function composeEmailMessage($data) | |||
{ | |||
extract($data); | |||
$rit = ""; | |||
$rit .= ' <p>Hello. Below you can find an updated log for the time recorded on the <b>'. $projectName .'</b> project. Please make sure the Upwork contract is synced accordingly.</p>'; | |||
$rit .= ' <p>These hours need to be logged into Upwork. Here are his log in details.</p>'; | |||
$upworkAccount = NULL; | |||
$upworkContractId = NULL; | |||
if ((isset($contractCustomFields)) && (!empty($contractCustomFields)) && (is_array($contractCustomFields))) { | |||
foreach ($contractCustomFields as $contractCustomField) { | |||
if ($contractCustomField['slug'] == "contracts_upwork_account") { | |||
$upworkAccount = $contractCustomField['value']; | |||
} elseif ($contractCustomField['slug'] == "contracts_upwork_contract_id") { | |||
$upworkContractId = $contractCustomField['value']; | |||
} | |||
} | |||
} | |||
$rit .= ' <p>'; | |||
$rit .= ' <b>URL:</b> <a href="https://www.upwork.com">Click Here</a><br />'; | |||
$rit .= ' <b>Account:</b>'. $upworkAccount .'<br />'; | |||
$rit .= ' </p>'; | |||
$rit .= ' <p>Simply visit the contract named <a href="http://www.upwork.com/ab/workdiary/freelancer/#/'. $upworkContractId. '">'. $contractSubject .'</a> in Upwork then record the hours listed below. Make sure the total hours match (or exceed) the hours from our portal.</p>'; | |||
//////////// | |||
$ret = ""; | |||
$ret .= ' <table width="75%" cellpadding="5" align="center" style="margin-top: 10px;">'; | |||
$ret .= ' <thead>'; | |||
$ret .= ' <tr>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Task</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Hours</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Minutes</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Decimal</font></th>'; | |||
$ret .= ' </tr>'; | |||
$ret .= ' </thead>'; | |||
if ( isset($taskLists) && is_array($taskLists) ) | |||
{ | |||
$grandTotalTime = 0; | |||
foreach ($taskLists as $taskList) | |||
{ | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#ffd700" colspan="4" align="center">'; | |||
$ret .= ' <font color="#000000">'; | |||
$ret .= ' <b>'. $taskList['DATE'] .'</b>'; | |||
$ret .= ' </font>'; | |||
$ret .= ' </td>'; | |||
$ret .= '</tr>'; | |||
$totalTaskTime = 0; | |||
foreach ($taskList['DETAIL'] as $task) | |||
{ | |||
$time = intval($task['TIME']); | |||
$totalTaskTime += $time; | |||
$mins = $time/60; | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$hrDec = round($mins/60,2); | |||
$min = $mins%60; | |||
$exeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. $task['NAME'] .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. str_pad($hr, 2, "0", STR_PAD_LEFT) .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. str_pad($min, 2, "0", STR_PAD_LEFT) .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. number_format($hrDec,2,'.','') .'</font></td>'; | |||
$ret .= '</tr>'; | |||
} | |||
$mins = floor($totalTaskTime/60); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$taskExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$grandTotalTime += $totalTaskTime; | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#ffd700" colspan="4" align="center"><font color="#000000"><b>Total Time: '. $taskExeTime .' Hours</b></font></td>'; | |||
$ret .= '</tr>'; | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#000000" colspan="4" align="center" style="height: 5px;"></td>'; | |||
$ret .= '</tr>'; | |||
} | |||
$mins = round($grandTotalTime/60,2); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$grandExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$ret .= '<tfoot style="padding-top: -5px;">'; | |||
$ret .= ' <tr>'; | |||
$ret .= ' <td bgcolor="#000000" colspan="4" align="center" valign="middle"><font color="#FFFFFF"><h1>Grand Total Time: '.$grandExeTime .' Hours</h1></font></td>'; | |||
$ret .= ' </tr>'; | |||
$ret .= '</tfoot>'; | |||
} | |||
$ret .= ' </table> '; | |||
return $rit.$ret; | |||
} | |||
private function composeEmailMessageFromTemplate($id,$data,$template) | |||
{ | |||
extract($data); | |||
$upworkAccount = NULL; | |||
$upworkContractId = NULL; | |||
if ((isset($contractCustomFields)) && (!empty($contractCustomFields)) && (is_array($contractCustomFields))) { | |||
foreach ($contractCustomFields as $contractCustomField) { | |||
if ($contractCustomField['slug'] == "contracts_upwork_account") { | |||
$upworkAccount = $contractCustomField['value']; | |||
} elseif ($contractCustomField['slug'] == "contracts_upwork_contract_id") { | |||
$upworkContractId = $contractCustomField['value']; | |||
} | |||
} | |||
} | |||
$upworkLink = '<a href="https://www.upwork.com">Click Here</a>'; | |||
$upworkContractLink = '<a href="http://www.upwork.com/ab/workdiary/freelancer/#/'. $upworkContractId. '">'. $contractSubject .'</a>'; | |||
//////////// | |||
$ret = ""; | |||
$ret .= ' <table width="75%" cellpadding="5" align="center" style="margin-top: 10px;">'; | |||
$ret .= ' <thead>'; | |||
$ret .= ' <tr>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Task</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Hours</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Minutes</font></th>'; | |||
$ret .= ' <th bgcolor="#000000"><font color="#FFFFFF">Decimal</font></th>'; | |||
$ret .= ' </tr>'; | |||
$ret .= ' </thead>'; | |||
if ( isset($taskLists) && is_array($taskLists) ) | |||
{ | |||
$grandTotalTime = 0; | |||
foreach ($taskLists as $taskList) | |||
{ | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#ffd700" colspan="4" align="center">'; | |||
$ret .= ' <font color="#000000">'; | |||
$ret .= ' <b>'. $taskList['DATE'] .'</b>'; | |||
$ret .= ' </font>'; | |||
$ret .= ' </td>'; | |||
$ret .= '</tr>'; | |||
$totalTaskTime = 0; | |||
foreach ($taskList['DETAIL'] as $task) | |||
{ | |||
$time = intval($task['TIME']); | |||
$totalTaskTime += $time; | |||
$mins = $time/60; | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$hrDec = round($mins/60,2); | |||
$min = $mins%60; | |||
$exeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. $task['NAME'] .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. str_pad($hr, 2, "0", STR_PAD_LEFT) .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. str_pad($min, 2, "0", STR_PAD_LEFT) .'</font></td>'; | |||
$ret .= ' <td bgcolor="#808080"><font color="#FFFFFF">'. number_format($hrDec,2,'.','') .'</font></td>'; | |||
$ret .= '</tr>'; | |||
} | |||
$mins = floor($totalTaskTime/60); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$taskExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$grandTotalTime += $totalTaskTime; | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#ffd700" colspan="4" align="center"><font color="#000000"><b>Total Time: '. $taskExeTime .' Hours</b></font></td>'; | |||
$ret .= '</tr>'; | |||
$ret .= '<tr>'; | |||
$ret .= ' <td bgcolor="#000000" colspan="4" align="center" style="height: 5px;"></td>'; | |||
$ret .= '</tr>'; | |||
} | |||
$mins = round($grandTotalTime/60,2); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$grandExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$ret .= '<tfoot style="padding-top: -5px;">'; | |||
$ret .= ' <tr>'; | |||
$ret .= ' <td bgcolor="#000000" colspan="4" align="center" valign="middle"><font color="#FFFFFF"><h1>Grand Total Time: '.$grandExeTime .' Hours</h1></font></td>'; | |||
$ret .= ' </tr>'; | |||
$ret .= '</tfoot>'; | |||
} | |||
$ret .= ' </table> '; | |||
/////// | |||
$message = $template->message; | |||
$subject = $template->subject; | |||
$project_name = $projectName; | |||
$upwork_link = $upworkLink; | |||
$upwork_account = $upworkAccount; | |||
$upwork_contract_link = $upworkContractLink; | |||
$report_body = $ret; | |||
$signature = "TEAM"; | |||
$date = date("m/d/Y"); | |||
$keys = array("{project_name}", "{upwork_link}", "{upwork_account}", "{upwork_contract_link}", "{report_body}", "{signature}", "{date}"); | |||
$values = array( $project_name, $upwork_link, $upwork_account, $upwork_contract_link, $report_body, $signature, $date); | |||
$formated_message = str_replace($keys, $values, $message); | |||
$formated_subject = str_replace($keys, $values, $subject); | |||
return array("message"=>$formated_message,"subject"=>$formated_subject, "from_name"=>$template->fromname, "from_email"=>fromemail); | |||
} | |||
} |
@ -0,0 +1,352 @@ | |||
<?php | |||
defined('BASEPATH') or exit('No direct script access allowed'); | |||
class Project_notifications_model extends App_Model | |||
{ | |||
public function __construct() | |||
{ | |||
parent::__construct(); | |||
} | |||
public function get($id = '',$returnArray=false) | |||
{ | |||
if (is_numeric($id)) { | |||
$this->db->where('id', $id); | |||
if($returnArray===true) | |||
{ | |||
return $this->db->get(db_prefix() . 'project_notifications')->result_array(); | |||
} | |||
else | |||
{ | |||
return $this->db->get(db_prefix() . 'project_notifications')->row(); | |||
} | |||
} | |||
return $this->db->get(db_prefix() . 'project_notifications')->result_array(); | |||
} | |||
public function upsert($data) | |||
{ | |||
if (isset($data['id']) && trim($data['id']) !== '' && is_numeric($data['id'])) { | |||
$this->db->where('id', $data['id']); | |||
$this->db->update(db_prefix() . 'project_notifications', [ | |||
'triggertime' => $data['triggertime'], | |||
'triggerday' => $data['triggerday'], | |||
'emails' => $data['emails'], | |||
'choice_type' => $data['choice_type'], | |||
'contract_type' => $data['contract_type'], | |||
'projects' => $data['projects'], | |||
'dataset' => $data['dataset'], | |||
'info_to_send' => $data['info_to_send'], | |||
'email_template' => $data['email_template'] | |||
]); | |||
if ($this->db->affected_rows() > 0) { | |||
return true; | |||
} | |||
} else { | |||
$this->db->insert(db_prefix() . 'project_notifications', [ | |||
'triggertime' => $data['triggertime'], | |||
'triggerday' => $data['triggerday'], | |||
'emails' => $data['emails'], | |||
'choice_type' => $data['choice_type'], | |||
'contract_type' => $data['contract_type'], | |||
'projects' => $data['projects'], | |||
'dataset' => $data['dataset'], | |||
'info_to_send' => $data['info_to_send'], | |||
'email_template' => $data['email_template'] | |||
]); | |||
$insert_id = $this->db->insert_id(); | |||
if ($insert_id) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
public function delete($id) | |||
{ | |||
$this->db->where('id', $id); | |||
$this->db->delete(db_prefix().'project_notifications'); | |||
if ($this->db->affected_rows() > 0) { | |||
log_activity('Project Activity Configuration Deleted [ID: ' . $id . ']'); // What is suerveyId? | |||
return true; | |||
} | |||
return false; | |||
} | |||
public function getProjectDataForConfigurations() | |||
{ | |||
$this->db->select( db_prefix() . "projects.*, " . db_prefix() . "contracts_types.id AS contract_type_id", FALSE); | |||
$this->db->from( db_prefix() . "projects"); | |||
$this->db->join(db_prefix() . "contracts ", db_prefix() . "projects.id = " . db_prefix() . "contracts.project_id",'left'); | |||
$this->db->join(db_prefix() . "contracts_types ", db_prefix() . "contracts_types.id = " . db_prefix() . "contracts.contract_type",'left'); | |||
$this->db->order_by( db_prefix() . "projects.name", "asc"); | |||
$data = $this->db->get()->result_array(); | |||
$ret = array(); | |||
foreach($data as $d) | |||
{ | |||
$cId = ($d['contract_type_id']=='')?0:$d['contract_type_id']; | |||
$ret[$cId][] = $d; | |||
} | |||
return $ret; | |||
} | |||
public function projectNotificationExecution($id = "") | |||
{ | |||
$emailTemplates = array(); | |||
$log = array(); | |||
if($id!=='') | |||
{ | |||
$notifications = $this->get($id, true); | |||
} | |||
else | |||
{ | |||
$notifications = $this->get(); | |||
} | |||
$log[] = "size(notifications) => ".sizeof($notifications); | |||
$templateCounter = 0; | |||
foreach ($notifications as $notification) | |||
{ | |||
$execTime = date("U", strtotime(date("Y-m-d").' '.$notification['triggertime'].':00')); | |||
$log[] = "id => ".$id; | |||
$log[] = "triggertime => ".date("Y-m-d").' '.$notification['triggertime'].':00'; | |||
$log[] = "now => ".date("Y-m-d H:i:s"); | |||
$log[] = "execTime => ".$execTime; | |||
$this->db->select(); | |||
$this->db->from(db_prefix() . "project_notifications_log"); | |||
$this->db->where("notify_id", $notification['id']); | |||
$this->db->order_by(db_prefix()."project_notifications_log.id", "desc"); | |||
$this->db->limit(1); | |||
$dataLog = $this->db->get()->row(); | |||
$log[] = "dataLog => ".json_encode((array)$dataLog); | |||
$lastTrigger = date('2000-01-01 00:00:00'); | |||
if(isset($dataLog) && $dataLog->triggertime !=='') | |||
{ | |||
$lastTrigger = $dataLog->triggertime; | |||
} | |||
$log[] = "lastTrigger => ".$lastTrigger; | |||
$checktoRun = false; | |||
if( strtoupper($notification['triggerday']) === strtoupper(date('D')) || strtoupper($notification['triggerday']) === 'EVERYDAY' ) | |||
{ | |||
$checktoRun = true; | |||
$log[] = "check 1 (triggerday==today) => (strtoupper(".$notification['triggerday'].") === strtoupper(".date('D')."))"; | |||
$log[] = "check 2 (triggerday==EVERYDAY) => (strtoupper(".$notification['triggerday'].") === EVERYDAY )"; | |||
} | |||
if($checktoRun === true && intval($execTime) <= intval(date("U", strtotime(date("Y-m-d H:i:s") ) ) ) ) | |||
{ | |||
$checktoRun = true; | |||
$log[] = "check 3 (execTime<=NOW) => intval(".$execTime.") <= intval(".date("U", strtotime(date("Y-m-d H:i:s") ) )." )"; | |||
} | |||
else | |||
{ | |||
$checktoRun = false; | |||
$log[] = "check 3 (execTime<=NOW) => intval(".$execTime.") <= intval(".date("U", strtotime(date("Y-m-d H:i:s") ) )." ) -- FAILS"; | |||
} | |||
if($checktoRun === true && intval(date("U", strtotime($lastTrigger))) < intval($execTime)) | |||
{ | |||
$checktoRun = true; | |||
$log[] = "check 4 (lastTrigger < execTime) => intval(".date("U", strtotime($lastTrigger)).") < intval(".$execTime.") )"; | |||
} | |||
else | |||
{ | |||
$checktoRun = false; | |||
$log[] = "check 4 (lastTrigger < execTime) => intval(".date("U", strtotime($lastTrigger)).") < intval(".$execTime.") ) -- FAILS"; | |||
} | |||
if( $checktoRun === true || trim($id) !== "" ) | |||
{ | |||
$this->db->from(db_prefix() . "taskstimers"); | |||
$this->db->join(db_prefix() . "tasks ", db_prefix() . "tasks.id = " . db_prefix() . "taskstimers.task_id"); | |||
$this->db->where(db_prefix() . "tasks.rel_type","project"); | |||
$this->db->join(db_prefix() . "projects ", db_prefix() . "projects.id = " . db_prefix() . "tasks.rel_id"); | |||
if ($notification['choice_type'] == 'CONTRACT') | |||
{ | |||
/* | |||
$this->db->select("IFNULL(project_id,-1)"); | |||
$this->db->from(db_prefix() . "contracts"); | |||
$this->db->where("contract_type", $notification['contract_type']); | |||
$contract_sub_query = $this->db->get_compiled_select(); | |||
*/ | |||
$this->db->select(db_prefix() . "contracts.id as contractId"); | |||
$this->db->select(db_prefix() . "contracts.subject as contractSubject"); | |||
//$this->db->where(db_prefix() . "projects.id IN( $contract_sub_query )"); | |||
$this->db->join(db_prefix() . "contracts ", db_prefix() . "contracts.project_id = " . db_prefix() . "projects.id"); | |||
} | |||
if($notification['choice_type']=='SPECIFIC') | |||
{ | |||
$this->db->where(db_prefix() . "projects.id", $notification['projects']); | |||
} | |||
if(strtoupper(date('D'))=="MON") | |||
{ | |||
$lastMonday = strtotime(date("Y-m-d 00:00:00")); | |||
$previousMonday = strtotime("last monday", $lastMonday); | |||
} | |||
else | |||
{ | |||
$lastMonday = strtotime("last monday"); | |||
$previousMonday = strtotime("last monday", $lastMonday); | |||
} | |||
if($notification['dataset']=='PREV-WEEK') | |||
{ | |||
$this->db->where(db_prefix() . "taskstimers.start_time >= ", date('U', $previousMonday)); | |||
$this->db->where(db_prefix() . "taskstimers.end_time < ", date('U', $lastMonday)); | |||
} | |||
else | |||
{ | |||
$this->db->where(db_prefix() . "taskstimers.start_time >= ", date('U', $lastMonday)); | |||
} | |||
//$this->db->group_by(db_prefix() . "projects.id"); | |||
//$this->db->select("SUM(".db_prefix() . "taskstimers.end_time-".db_prefix() . "taskstimers.start_time) AS exeTime, ".db_prefix() . "projects.name AS projectName"); | |||
$this->db->select(db_prefix() . "taskstimers.*, | |||
(".db_prefix() . "taskstimers.end_time-".db_prefix() . "taskstimers.start_time) AS exeTime, | |||
".db_prefix() . "tasks.name AS taskName, | |||
".db_prefix() . "projects.name AS projectName, | |||
".db_prefix() . "projects.id AS projectId"); | |||
$this->db->order_by( db_prefix() . "taskstimers.start_time", "asc"); | |||
$query = $this->db->get(); | |||
if ($query->num_rows() > 0) { | |||
$sqldata = $query->result_array(); | |||
$log[] = "sqldata => ".json_encode($sqldata); | |||
$recipientEmails = array(); | |||
$data = array(); | |||
$counter = 0; | |||
foreach($sqldata as $record) | |||
{ | |||
$data[$record["projectId"]]['NAME'] = $record["projectName"]; | |||
$date = date("Ymd", $record["start_time"] ) ; | |||
$data[$record["projectId"]]['TASK'][$date]['DATE'] = date("m/d/Y", $record["start_time"] ) ; | |||
$data[$record["projectId"]]['TASK'][$date]['DETAIL'][$counter]['NAME'] = $record["taskName"]; | |||
$data[$record["projectId"]]['TASK'][$date]['DETAIL'][$counter]['TIME'] = $record["exeTime"]; | |||
if ((isset($record["contractId"])) && (!empty($record["contractId"]))) { | |||
$data[$record["projectId"]]['CONTRACTID'] = $record["contractId"]; | |||
} | |||
if ((isset($record["contractSubject"])) && (!empty($record["contractSubject"]))) { | |||
$data[$record["projectId"]]['CONTRACTSUBJECT'] = $record["contractSubject"]; | |||
} | |||
/*$time = $record['exeTime']; | |||
$mins = floor($time/60); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$exeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT).':'.str_pad($sec, 2, "0", STR_PAD_LEFT); | |||
$data[$record["projectId"]]['TASK'][$date]['DETAIL'][$counter]['FORMAT_TIME'] = $exeTime; */ | |||
} | |||
$recepients = explode(',',$notification['emails']); | |||
foreach($recepients as $recepient) | |||
{ | |||
$recipientEmails[] = $recepient; | |||
foreach($data as $projectId => $projectData) | |||
{ | |||
$emailTemplates[$templateCounter]['EMAIL_TEMPL_ID'] = $notification['email_template']; | |||
$emailTemplates[$templateCounter]['NOTIFY_ID'] = $notification['id']; | |||
$emailTemplates[$templateCounter]['TO'] = $recepient; | |||
$emailTemplates[$templateCounter]['FROM_EMAIL'] = get_option('smtp_email'); | |||
$emailTemplates[$templateCounter]['FROM_NAME'] = get_option('companyname'); | |||
$emailTemplates[$templateCounter]['SUBJECT'] = "Time Log For ".$projectData['NAME']." Project As Of ".date("m/d/Y").". "; | |||
$templateData['projectName'] = $projectData['NAME']; | |||
$templateData['taskLists'] = $projectData['TASK']; | |||
$templateData['upworkUserName'] = "Nothing"; | |||
$templateData['contractSubject'] = $projectData['CONTRACTSUBJECT']; | |||
if ($notification['choice_type'] == 'CONTRACT') { | |||
$this->db->select(db_prefix() . "customfields.name"); | |||
$this->db->select(db_prefix() . "customfields.slug"); | |||
$this->db->select(db_prefix() . "customfieldsvalues.value"); | |||
$this->db->from(db_prefix() . "customfieldsvalues"); | |||
$this->db->where(db_prefix() . "customfields.fieldto", 'contracts'); | |||
$this->db->where(db_prefix() . "customfieldsvalues.relid", $projectData['CONTRACTID']); | |||
$this->db->join(db_prefix() . "customfields", db_prefix() . "customfieldsvalues.fieldid = ".db_prefix() . "customfields.id"); | |||
$get_contracts_custom_fields = $this->db->get(); | |||
if ($get_contracts_custom_fields->num_rows() > 0) { | |||
$templateData['contractCustomFields'] = $get_contracts_custom_fields->result_array(); | |||
} else { | |||
$templateData['contractCustomFields'] = FALSE; | |||
} | |||
} | |||
$emailTemplates[$templateCounter]['MESSAGE-DATA'] = $templateData; | |||
//$emailTemplates[$templateCounter]['MESSAGE'] = $this->load->view("email_templates/email", $templateData, TRUE); | |||
$templateCounter++; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
return array("data"=>$emailTemplates,"log"=>$log); | |||
} | |||
} |
@ -0,0 +1,11 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<title>403 Forbidden</title> | |||
</head> | |||
<body> | |||
<p>Directory access is forbidden.</p> | |||
</body> | |||
</html> |
@ -0,0 +1,69 @@ | |||
<?php | |||
defined('BASEPATH') or exit('No direct script access allowed'); | |||
/* | |||
Module Name: Project Notifications | |||
Description: This module will allow you to create automated notifications for projects that have had activity. | |||
Version: 1.0.0 | |||
*/ | |||
define('PROJECT_NOTIFICATIONS_MODULE_NAME', 'project_notifications'); | |||
hooks()->add_action('after_cron_run', 'execute_project_notification'); | |||
hooks()->add_action('admin_init', 'project_notifications_module_init_menu_items'); | |||
hooks()->add_action('admin_init', 'project_notifications_permissions'); | |||
function execute_project_notification($id = "") | |||
{ | |||
$CI = &get_instance(); | |||
$CI->load->library(PROJECT_NOTIFICATIONS_MODULE_NAME . '/' . 'project_notifications_module'); | |||
$CI->project_notifications_module->executeNotification($id); | |||
} | |||
function project_notifications_permissions() | |||
{ | |||
$capabilities = []; | |||
$capabilities['capabilities'] = [ | |||
'view' => _l('permission_view') . '(' . _l('permission_global') . ')', | |||
'create' => _l('permission_create'), | |||
'create_template' => _l('permission_create'), | |||
'edit' => _l('permission_edit'), | |||
'delete' => _l('permission_delete'), | |||
]; | |||
register_staff_capabilities('project_notifications', $capabilities, _l('pn_title')); | |||
} | |||
register_activation_hook(PROJECT_NOTIFICATIONS_MODULE_NAME, 'project_notifications_module_activation_hook'); | |||
function project_notifications_module_activation_hook() | |||
{ | |||
$CI = &get_instance(); | |||
require_once(__DIR__ . '/install.php'); | |||
} | |||
register_language_files(PROJECT_NOTIFICATIONS_MODULE_NAME, [PROJECT_NOTIFICATIONS_MODULE_NAME]); | |||
function project_notifications_module_init_menu_items() | |||
{ | |||
$CI = &get_instance(); | |||
$CI->app->add_quick_actions_link([ | |||
'name' => _l('pn_title'), | |||
'url' => 'project_notifications/notify', | |||
'permission' => 'project_notifications', | |||
'position' => 56, | |||
]); | |||
if (has_permission('pa_notify', '', 'view')) { | |||
$CI->app_menu->add_sidebar_children_item('utilities', [ | |||
'slug' => 'project-notifications', | |||
'name' => _l('pn_title'), | |||
'href' => admin_url('project_notifications'), | |||
'position' => 24, | |||
]); | |||
} | |||
} |
@ -0,0 +1,129 @@ | |||
<p>Hello. Below you can find an updated log for the time recorded on the <b><?php echo $projectName; ?></b> project. Please make sure the Upwork contract is synced accordingly.</p> | |||
<p>These hours need to be logged into Upwork. Here are his log in details.</p> | |||
<?php $upworkAccount = NULL; ?> | |||
<?php $upworkContractId = NULL; ?> | |||
<?php if ((isset($contractCustomFields)) && (!empty($contractCustomFields)) && (is_array($contractCustomFields))): ?> | |||
<?php foreach ($contractCustomFields as $contractCustomField): ?> | |||
<?php if ($contractCustomField['slug'] == "contracts_upwork_account"): ?> | |||
<?php $upworkAccount = $contractCustomField['value']; ?> | |||
<?php elseif ($contractCustomField['slug'] == "contracts_upwork_contract_id"): ?> | |||
<?php $upworkContractId = $contractCustomField['value']; ?> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<?php endif; ?> | |||
<p> | |||
<b>URL:</b> <a href="https://www.upwork.com">Click Here</a><br /> | |||
<b>Account:</b> <?php echo $upworkAccount; ?><br /> | |||
</p> | |||
<p>Simply visit the contract named <a href="http://www.upwork.com/ab/workdiary/freelancer/#/<?php echo $upworkContractId; ?>"><?php echo $contractSubject; ?></a> in Upwork then record the hours listed below. Make sure the total hours match (or exceed) the hours from our portal.</p> | |||
<table width="75%" cellpadding="5" align="center" style="margin-top: 10px;"> | |||
<thead> | |||
<tr> | |||
<th bgcolor="#000000"><font color="#FFFFFF">Task</font></th> | |||
<th bgcolor="#000000"><font color="#FFFFFF">Hours</font></th> | |||
<th bgcolor="#000000"><font color="#FFFFFF">Minutes</font></th> | |||
<th bgcolor="#000000"><font color="#FFFFFF">Decimal</font></th> | |||
</tr> | |||
</thead> | |||
<?php | |||
if ( isset($taskLists) && is_array($taskLists) ) | |||
{ | |||
$grandTotalTime = 0; | |||
foreach ($taskLists as $taskList) | |||
{ | |||
?> | |||
<tr> | |||
<td bgcolor="#ffd700" colspan="4" align="center"> | |||
<font color="#000000"> | |||
<b><?php echo $taskList['DATE']; ?></b> | |||
</font> | |||
</td> | |||
</tr> | |||
<?php | |||
$totalTaskTime = 0; | |||
foreach ($taskList['DETAIL'] as $task) | |||
{ | |||
$time = intval($task['TIME']); | |||
$totalTaskTime += $time; | |||
$mins = $time/60; | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$hrDec = round($mins/60,2); | |||
$min = $mins%60; | |||
$exeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
?> | |||
<tr> | |||
<td bgcolor="#808080"><font color="#FFFFFF"><?php echo $task['NAME']; ?></font></td> | |||
<td bgcolor="#808080"><font color="#FFFFFF"><?php echo str_pad($hr, 2, "0", STR_PAD_LEFT); ?></font></td> | |||
<td bgcolor="#808080"><font color="#FFFFFF"><?php echo str_pad($min, 2, "0", STR_PAD_LEFT); ?></font></td> | |||
<td bgcolor="#808080"><font color="#FFFFFF"><?php echo number_format($hrDec,2,'.',''); ?></font></td> | |||
</tr> | |||
<?php | |||
} | |||
$mins = floor($totalTaskTime/60); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$taskExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
$grandTotalTime += $totalTaskTime; | |||
?> | |||
<tr> | |||
<td bgcolor="#ffd700" colspan="4" align="center"><font color="#000000"><b>Total Time: <?php echo $taskExeTime; ?> Hours</b></font></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#000000" colspan="4" align="center" style="height: 5px;"></td> | |||
</tr> | |||
<?php | |||
} | |||
$mins = round($grandTotalTime/60,2); | |||
$sec = $time%60; | |||
$hr = floor($mins/60); | |||
$min = $mins%60; | |||
$grandExeTime = $hr.':'.str_pad($min, 2, "0", STR_PAD_LEFT); | |||
?> | |||
<tfoot style="padding-top: -5px;"> | |||
<tr> | |||
<td bgcolor="#000000" colspan="4" align="center" valign="middle"><font color="#FFFFFF"><h1>Grand Total Time: <?php echo $grandExeTime; ?> Hours</h1></font></td> | |||
</tr> | |||
</tfoot> | |||
<?php | |||
} | |||
?> | |||
</table> |
@ -0,0 +1,11 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<title>403 Forbidden</title> | |||
</head> | |||
<body> | |||
<p>Directory access is forbidden.</p> | |||
</body> | |||
</html> |
@ -0,0 +1,56 @@ | |||
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?> | |||
<?php init_head(); ?> | |||
<div id="wrapper"> | |||
<div class="content"> | |||
<div class="row"> | |||
<div class="col-md-12"> | |||
<div class="panel_s"> | |||
<div class="panel-body"> | |||
<h4 class="no-margin"><?php echo $title; ?></h4> | |||
<hr class="hr-panel-heading" /> | |||
<div class="row _buttons"> | |||
<div class="col-md-12"> | |||
<?php | |||
if(has_permission('project_notifications','','create')){ | |||
?> | |||
<a href="#" onclick="new_task(<?php echo "'".admin_url('project_notifications/configure')."'"; ?>); return false;" class="btn btn-info pull-left new"><?php echo _l('pa_new_notifier'); ?></a> | |||
<?php | |||
} | |||
?> | |||
<?php | |||
if(has_permission('project_notifications','','create_template')){ | |||
?> | |||
<a href="<?php echo admin_url('project_notifications/email_templates'); ?>" class="btn btn-info pull-right new"><?php echo _l('pa_email_template'); ?></a> | |||
<?php | |||
} | |||
?> | |||
</div> | |||
</div> | |||
<hr class="hr-panel-heading hr-10" /> | |||
<div class="clearfix"></div> | |||
<?php | |||
render_datatable(array( | |||
_l('id'), | |||
_l('pa_trigger_time_h'), | |||
_l('pa_trigger_day_h'), | |||
_l('pa_emails_h'), | |||
_l('pa_task_choice_type_h'), | |||
_l('pa_projects_h'), | |||
_l('pa_dataset_h'), | |||
),'project-activity'); | |||
?> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<?php init_tail(); ?> | |||
</body> | |||
</html> | |||
<script> | |||
$(function(){ | |||
initDataTable('.table-project-activity', window.location.href); | |||
}); | |||
</script> |
@ -0,0 +1,45 @@ | |||
<?php | |||
defined('BASEPATH') or exit('No direct script access allowed'); | |||
$aColumns = [ | |||
'id', | |||
'triggertime', | |||
'triggerday', | |||
'emails', | |||
'(CASE WHEN choice_type="CONTRACT" THEN "Project with Contract Type" ELSE "Specific Project" END)', | |||
'(CASE WHEN choice_type="CONTRACT" THEN (SELECT name FROM ' . db_prefix() . 'contracts_types WHERE ' . db_prefix() . 'contracts_types.id = ' . db_prefix() . 'project_notifications.contract_type) ELSE (SELECT name FROM ' . db_prefix() . 'projects WHERE ' . db_prefix() . 'projects.id = ' . db_prefix() . 'project_notifications.projects) END)', | |||
'(CASE WHEN dataset="SO-FAR" THEN "Send Details So Far" ELSE "Send Details For Previous Week" END)', | |||
]; | |||
$sIndexColumn = 'id'; | |||
$sTable = db_prefix() . 'project_notifications'; | |||
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, [], [], []); | |||
$output = $result['output']; | |||
$rResult = $result['rResult']; | |||
foreach ($rResult as $aRow) { | |||
$row = []; | |||
for ($i = 0; $i < count($aColumns); $i++) { | |||
$_data = $aRow[$aColumns[$i]]; | |||
if ($aColumns[$i] == 'triggertime') { | |||
$_data = '<a href="#" onclick="new_task(\''.admin_url('project_notifications/configure/'.$aRow['id']).'\'); return false;">' . $_data . '</a>'; | |||
$_data .= '<div class="row-options">'; | |||
$_data .= ' <a href="#" onclick="new_task(\''.admin_url('project_notifications/configure/'.$aRow['id']).'\'); return false;">' . _l('edit') . '</a>'; | |||
if (has_permission('notification', '', 'delete')) { | |||
$_data .= ' | <a href="' . admin_url('project_notifications/delete/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>'; | |||
} | |||
$_data .= ' | <a href="' . admin_url('project_notifications/execute/' . $aRow['id']) . '">' . _l('pn_execute') . '</a>'; | |||
$_data .= '</div>'; | |||
} | |||
$row[] = $_data; | |||
} | |||
$row['DT_RowClass'] = 'has-row-options'; | |||
$output['aaData'][] = $row; | |||
} |