Browse Source

initial Commit

master
kris@sentientgeeks.com 4 years ago
commit
1bf7fbee0e
10 changed files with 1222 additions and 0 deletions
  1. +176
    -0
      controllers/Project_notifications.php
  2. +11
    -0
      controllers/index.html
  3. +362
    -0
      libraries/Project_notifications_module.php
  4. +352
    -0
      models/Project_notifications_model.php
  5. +11
    -0
      models/index.html
  6. +69
    -0
      project_notifications.php
  7. +129
    -0
      views/email_templates/email.php
  8. +11
    -0
      views/index.html
  9. +56
    -0
      views/project_notifications.php
  10. +45
    -0
      views/tables/list.php

+ 176
- 0
controllers/Project_notifications.php View File

@ -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
}

+ 11
- 0
controllers/index.html View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

+ 362
- 0
libraries/Project_notifications_module.php View File

@ -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);
}
}

+ 352
- 0
models/Project_notifications_model.php View File

@ -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);
}
}

+ 11
- 0
models/index.html View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

+ 69
- 0
project_notifications.php View File

@ -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,
]);
}
}

+ 129
- 0
views/email_templates/email.php View File

@ -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>

+ 11
- 0
views/index.html View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

+ 56
- 0
views/project_notifications.php View File

@ -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>

+ 45
- 0
views/tables/list.php View File

@ -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;
}

Loading…
Cancel
Save