public function external_hook($hook) { switch ($hook) { case 'public_signup_form': $signup_form = module_template::get_template_by_key('customer_signup_form_wrapper'); $signup_form->page_title = $signup_form->description; $signup_form->assign_values(array('signup_form' => self::get_customer_signup_form_html())); echo $signup_form->render('pretty_html'); exit; case 'public_signup': // sign out if testing. if (module_security::is_logged_in()) { set_message('Logged out due to signup'); module_security::logout(); } $result = array('messages' => array()); function customer_signup_complete($result) { if (isset($_REQUEST['via_ajax'])) { echo json_encode($result); } else { echo implode('<br/>', $result['messages']); } exit; } if (!module_config::c('customer_signup_allowed', 0)) { $result['error'] = 1; $result['messages'][] = 'Customer signup disabled'; customer_signup_complete($result); } //recaptcha on signup form. if (module_config::c('captcha_on_signup_form', 0)) { if (!module_captcha::check_captcha_form()) { $result['error'] = 1; $result['messages'][] = 'Captcha fail, please go back and enter correct captcha code.'; customer_signup_complete($result); } } $customer = isset($_POST['customer']) && is_array($_POST['customer']) ? $_POST['customer'] : array(); $contact = isset($_POST['contact']) && is_array($_POST['contact']) ? $_POST['contact'] : array(); $contact_extra = isset($contact['extra']) && is_array($contact['extra']) ? $contact['extra'] : array(); $contact_group = isset($contact['group_ids']) && is_array($contact['group_ids']) ? $contact['group_ids'] : array(); $customer_extra = isset($customer['extra']) ? $customer['extra'] : array(); $customer_group = isset($customer['group_ids']) && is_array($customer['group_ids']) ? $customer['group_ids'] : array(); $address = isset($_POST['address']) ? $_POST['address'] : array(); $website = isset($_POST['website']) ? $_POST['website'] : array(); $website_extra = isset($website['extra']) ? $website['extra'] : array(); $website_group = isset($website['group_ids']) && is_array($website['group_ids']) ? $website['group_ids'] : array(); $job = isset($_POST['job']) ? $_POST['job'] : array(); $job_extra = isset($job['extra']) ? $job['extra'] : array(); $subscription = isset($_POST['subscription']) ? $_POST['subscription'] : array(); // sanatise possibly problematic fields: // customer: $allowed = array('name', 'last_name', 'customer_name', 'email', 'phone', 'mobile', 'extra', 'type'); foreach ($customer as $key => $val) { if (!in_array($key, $allowed)) { unset($customer[$key]); } } if (isset($customer['type']) && $customer['type'] != _CUSTOMER_TYPE_NORMAL && $customer['type'] != _CUSTOMER_TYPE_LEAD) { unset($customer['type']); } // added multiple contact support in the form of arrays. $contact_fields = array('name', 'last_name', 'email', 'phone'); if (module_config::c('customer_signup_password', 0)) { $contact_fields[] = 'password'; } foreach ($contact_fields as $multi_value) { if (isset($contact[$multi_value])) { if (!is_array($contact[$multi_value])) { $contact[$multi_value] = array($contact[$multi_value]); } } else { if (isset($customer[$multi_value])) { $contact[$multi_value] = array($customer[$multi_value]); } else { $contact[$multi_value] = array(); } } } $valid_contact_email = false; $name_fallback = false; $primary_email = false; foreach ($contact['email'] as $contact_key => $email) { if (!$name_fallback && isset($contact['name'][$contact_key])) { $name_fallback = $contact['name'][$contact_key]; } $contact['email'][$contact_key] = filter_var(strtolower(trim($email)), FILTER_VALIDATE_EMAIL); if ($contact['email'][$contact_key]) { $valid_contact_email = true; if (!$primary_email) { $primary_email = $contact['email'][$contact_key]; // set the primary contact details here by adding them to the master customer array foreach ($contact_fields as $primary_contact_field) { $customer[$primary_contact_field] = isset($contact[$primary_contact_field][$contact_key]) ? $contact[$primary_contact_field][$contact_key] : ''; unset($contact[$primary_contact_field][$contact_key]); } } } } // start error checking / required fields if (!isset($customer['customer_name']) || !strlen($customer['customer_name'])) { $customer['customer_name'] = $name_fallback; } if (!strlen($customer['customer_name'])) { $result['error'] = 1; $result['messages'][] = "Failed, please go back and provide a customer name."; } if (!$valid_contact_email || !$primary_email) { $result['error'] = 1; $result['messages'][] = "Failed, please go back and provide an email address."; } // check all posted required fields. function check_required($postdata, $messages = array()) { if (is_array($postdata)) { foreach ($postdata as $key => $val) { if (strpos($key, '_required') && strlen($val)) { $required_key = str_replace('_required', '', $key); if (!isset($postdata[$required_key]) || !$postdata[$required_key]) { $messages[] = 'Required field missing: ' . htmlspecialchars($val); } } if (is_array($val)) { $messages = check_required($val, $messages); } } } return $messages; } $messages = check_required($_POST); if (count($messages)) { $result['error'] = 1; $result['messages'] = array_merge($result['messages'], $messages); } if (isset($result['error'])) { customer_signup_complete($result); } // end error checking / required fields. // check if this customer already exists in the system, based on email address $customer_id = false; $creating_new = true; $_REQUEST['user_id'] = 0; if (isset($customer['email']) && strlen($customer['email']) && !module_config::c('customer_signup_always_new', 0)) { $users = module_user::get_contacts(array('email' => $customer['email'])); foreach ($users as $user) { if (isset($user['customer_id']) && (int) $user['customer_id'] > 0) { // this user exists as a customer! yey! // add them to this listing. $customer_id = $user['customer_id']; $creating_new = false; $_REQUEST['user_id'] = $user['user_id']; // dont let signups update existing passwords. if (isset($customer['password'])) { unset($customer['password']); } if (isset($customer['new_password'])) { unset($customer['new_password']); } } } } $_REQUEST['extra_customer_field'] = array(); $_REQUEST['extra_user_field'] = array(); module_extra::$config['allow_new_keys'] = false; module_extra::$config['delete_existing_empties'] = false; // save customer extra fields. if (count($customer_extra)) { // format the address so "save_customer" handles the save for us foreach ($customer_extra as $key => $val) { $_REQUEST['extra_customer_field'][] = array('key' => $key, 'val' => $val); } } // save customer and customer contact details: $customer_id = $this->save_customer($customer_id, $customer); if (!$customer_id) { $result['error'] = 1; $result['messages'][] = 'System error: failed to create customer.'; customer_signup_complete($result); } $customer_data = module_customer::get_customer($customer_id); // todo - merge primary and secondary contact/extra/group saving into a single loop if (!$customer_data['primary_user_id']) { $result['error'] = 1; $result['messages'][] = 'System error: Failed to create customer contact.'; customer_signup_complete($result); } else { $role_id = module_config::c('customer_signup_role', 0); if ($role_id > 0) { module_user::add_user_to_role($customer_data['primary_user_id'], $role_id); } // save contact extra data (repeated below for additional contacts) if (isset($contact_extra[0]) && count($contact_extra[0])) { $_REQUEST['extra_user_field'] = array(); foreach ($contact_extra[0] as $key => $val) { $_REQUEST['extra_user_field'][] = array('key' => $key, 'val' => $val); } module_extra::save_extras('user', 'user_id', $customer_data['primary_user_id']); } // save contact groups if (isset($contact_group[0]) && count($contact_group[0])) { foreach ($contact_group[0] as $group_id => $tf) { if ($tf) { module_group::add_to_group($group_id, $customer_data['primary_user_id'], 'user'); } } } } foreach ($contact['email'] as $contact_key => $email) { // add any additional contacts to the customer. $users = module_user::get_contacts(array('email' => $email, 'customer_id' => $customer_id)); if (count($users)) { // this contact already exists for this customer, dont update/change it. continue; } $new_contact = array('customer_id' => $customer_id); foreach ($contact_fields as $primary_contact_field) { $new_contact[$primary_contact_field] = isset($contact[$primary_contact_field][$contact_key]) ? $contact[$primary_contact_field][$contact_key] : ''; } // dont let additional contacts have passwords. if (isset($new_contact['password'])) { unset($new_contact['password']); } if (isset($new_contact['new_password'])) { unset($new_contact['new_password']); } global $plugins; $contact_user_id = $plugins['user']->create_user($new_contact, 'signup'); if ($contact_user_id) { $role_id = module_config::c('customer_signup_role', 0); if ($role_id > 0) { module_user::add_user_to_role($contact_user_id, $role_id); } // save contact extra data (repeated below for primary contacts) if (isset($contact_extra[$contact_key]) && count($contact_extra[$contact_key])) { $_REQUEST['extra_user_field'] = array(); foreach ($contact_extra[$contact_key] as $key => $val) { $_REQUEST['extra_user_field'][] = array('key' => $key, 'val' => $val); } module_extra::save_extras('user', 'user_id', $contact_user_id); } // save contact groups if (isset($contact_group[$contact_key]) && count($contact_group[$contact_key])) { foreach ($contact_group[$contact_key] as $group_id => $tf) { if ($tf) { module_group::add_to_group($group_id, $contact_user_id, 'user'); } } } } } if (count($customer_group)) { // format the address so "save_customer" handles the save for us foreach ($customer_group as $group_id => $tf) { if ($tf) { module_group::add_to_group($group_id, $customer_id, 'customer'); } } } $note_keys = array('customer', 'website', 'job', 'address', 'subscription'); $note_text = _l('Customer signed up from Signup Form:'); $note_text .= "\n\n"; foreach ($note_keys as $note_key) { $note_text .= "\n" . ucwords(_l($note_key)) . "\n"; if (isset($_POST[$note_key]) && is_array($_POST[$note_key])) { foreach ($_POST[$note_key] as $post_key => $post_val) { $note_text .= "\n - " . _l($post_key) . ": "; if (is_array($post_val)) { foreach ($post_val as $p => $v) { $note_text .= "\n - - " . _l($p) . ': ' . $v; } } else { $note_text .= $post_val; } } } } $note_data = array('note_id' => false, 'owner_id' => $customer_id, 'owner_table' => 'customer', 'note_time' => time(), 'note' => $note_text, 'rel_data' => module_customer::link_open($customer_id), 'reminder' => 0, 'user_id' => 0); update_insert('note_id', false, 'note', $note_data); // save customer address fields. if (count($address)) { $address_db = module_address::get_address($customer_id, 'customer', 'physical'); $address_id = $address_db && isset($address_db['address_id']) ? (int) $address_db['address_id'] : false; $address['owner_id'] = $customer_id; $address['owner_table'] = 'customer'; $address['address_type'] = 'physical'; // we have post data to save, write it to the table!! module_address::save_address($address_id, $address); } // website: $allowed = array('url', 'name', 'extra', 'notes'); foreach ($website as $key => $val) { if (!in_array($key, $allowed)) { unset($website[$key]); } } $website['url'] = isset($website['url']) ? strtolower(trim($website['url'])) : ''; $website_id = 0; if (count($website) && class_exists('module_website', false) && module_website::is_plugin_enabled()) { if (strlen($website['url'])) { // see if website already exists, don't create or update existing one for now. $existing_websites = module_website::get_websites(array('customer_id' => $customer_id, 'url' => $website['url'])); foreach ($existing_websites as $existing_website) { $website_id = $existing_website['website_id']; } } // echo $website_id;echo $website['url']; print_r($website_extra);exit; if (!$website_id) { $website_data = module_website::get_website($website_id); $website_data['url'] = isset($website['url']) ? $website['url'] : 'N/A'; $website_data['name'] = isset($website['url']) ? $website['url'] : 'N/A'; $website_data['customer_id'] = $customer_id; $website_id = update_insert('website_id', false, 'website', $website_data); // save website extra data. if ($website_id && count($website_extra)) { $_REQUEST['extra_website_field'] = array(); foreach ($website_extra as $key => $val) { $_REQUEST['extra_website_field'][] = array('key' => $key, 'val' => $val); } module_extra::save_extras('website', 'website_id', $website_id); } if ($website_id && isset($website['notes']) && strlen($website['notes'])) { // add notes to this website. $note_data = array('note_id' => false, 'owner_id' => $website_id, 'owner_table' => 'website', 'note_time' => time(), 'note' => $website['notes'], 'rel_data' => module_website::link_open($website_id), 'reminder' => 0, 'user_id' => $customer_data['primary_user_id']); $note_id = update_insert('note_id', false, 'note', $note_data); } } if ($website_id) { if (count($website_group)) { // format the address so "save_customer" handles the save for us foreach ($website_group as $group_id => $tf) { if ($tf) { module_group::add_to_group($group_id, $website_id, 'website'); } } } } } // generate jobs for this customer. $job_created = array(); if ($job && isset($job['type']) && is_array($job['type'])) { if (module_config::c('customer_signup_any_job_type', 0)) { foreach ($job['type'] as $type_name) { // we have a match in our system. create the job. $job_data = module_job::get_job(false); $job_data['type'] = $type_name; if (!$job_data['name']) { $job_data['name'] = $type_name; } $job_data['website_id'] = $website_id; $job_data['customer_id'] = $customer_id; $job_id = update_insert('job_id', false, 'job', $job_data); // todo: add default tasks for this job type. $job_created[] = $job_id; } } else { foreach (module_job::get_types() as $type_id => $type) { foreach ($job['type'] as $type_name) { if ($type_name == $type) { // we have a match in our system. create the job. $job_data = module_job::get_job(false); $job_data['type'] = $type; if (!$job_data['name']) { $job_data['name'] = $type; } $job_data['website_id'] = $website_id; $job_data['customer_id'] = $customer_id; $job_id = update_insert('job_id', false, 'job', $job_data); // todo: add default tasks for this job type. $job_created[] = $job_id; } } } } if (count($job_created) && count($job_extra)) { // save job extra data. foreach ($job_created as $job_created_id) { if ($job_created_id && count($job_extra)) { $_REQUEST['extra_job_field'] = array(); foreach ($job_extra as $key => $val) { $_REQUEST['extra_job_field'][] = array('key' => $key, 'val' => $val); } module_extra::save_extras('job', 'job_id', $job_created_id); } } } } // save files against customer $uploaded_files = array(); if (isset($_FILES['customerfiles']) && isset($_FILES['customerfiles']['tmp_name'])) { foreach ($_FILES['customerfiles']['tmp_name'] as $file_id => $tmp_file) { if (is_uploaded_file($tmp_file)) { // save to file module for this customer $file_name = basename($_FILES['customerfiles']['name'][$file_id]); if (strlen($file_name)) { $file_path = 'includes/plugin_file/upload/' . md5(time() . $file_name); if (move_uploaded_file($tmp_file, $file_path)) { // success! write to db. $file_data = array('customer_id' => $customer_id, 'job_id' => current($job_created), 'website_id' => $website_id, 'status' => module_config::c('file_default_status', 'Uploaded'), 'pointers' => false, 'description' => "Uploaded from Customer Signup form", 'file_time' => time(), 'file_name' => $file_name, 'file_path' => $file_path, 'file_url' => false); $file_id = update_insert('file_id', false, 'file', $file_data); $uploaded_files[] = $file_id; } } } } } // we create subscriptions for this customer/website (if none already exist) $subscription['subscription_name'] = array(); $subscription['subscription_invoice'] = array(); if (class_exists('module_subscription', false) && module_subscription::is_plugin_enabled() && isset($subscription['for']) && isset($subscription['subscriptions'])) { if ($subscription['for'] == 'website' && $website_id > 0) { $owner_table = 'website'; $owner_id = $website_id; } else { $owner_table = 'customer'; $owner_id = $customer_id; } $available_subscriptions = module_subscription::get_subscriptions(); $members_subscriptions = module_subscription::get_subscriptions_by($owner_table, $owner_id); foreach ($subscription['subscriptions'] as $subscription_id => $tf) { if (isset($available_subscriptions[$subscription_id])) { if (isset($members_subscriptions[$subscription_id])) { // we don't allow a member to sign up to the same subscription twice (just yet) } else { $subscription['subscription_name'][$subscription_id] = $available_subscriptions[$subscription_id]['name']; $start_date = date('Y-m-d'); $start_modifications = module_config::c('customer_signup_subscription_start', ''); if ($start_modifications == 'hidden') { $start_modifications = isset($_REQUEST['customer_signup_subscription_start']) ? $_REQUEST['customer_signup_subscription_start'] : ''; } if (!empty($start_modifications)) { $start_date = date('Y-m-d', strtotime($start_modifications)); } $sql = "INSERT INTO `" . _DB_PREFIX . "subscription_owner` SET "; $sql .= " owner_id = '" . (int) $owner_id . "'"; $sql .= ", owner_table = '" . mysql_real_escape_string($owner_table) . "'"; $sql .= ", subscription_id = '" . (int) $subscription_id . "'"; $sql .= ", start_date = '{$start_date}'"; query($sql); module_subscription::update_next_due_date($subscription_id, $owner_table, $owner_id, true); // and the same option here to send a subscription straight away upon signup if (module_config::c('subscription_send_invoice_straight_away', 0)) { global $plugins; $plugins['subscription']->run_cron(); // check if there are any invoices for this subscription $history = module_subscription::get_subscription_history($subscription_id, $owner_table, $owner_id); if (count($history) > 0) { foreach ($history as $h) { if ($h['invoice_id']) { $invoice_data = module_invoice::get_invoice($h['invoice_id']); if ($invoice_data['date_cancel'] != '0000-00-00') { continue; } $subscription['subscription_invoice'][] = '<a href="' . module_invoice::link_public($h['invoice_id']) . '">' . _l('Invoice #%s for %s', htmlspecialchars($invoice_data['name']), dollar($invoice_data['total_amount'], true, $invoice_data['currency_id'])) . '</a>'; } } } } } } } } if (!count($subscription['subscription_name'])) { $subscription['subscription_name'][] = _l('N/A'); } if (!count($subscription['subscription_invoice'])) { $subscription['subscription_invoice'][] = _l('N/A'); } $subscription['subscription_name'] = implode(', ', $subscription['subscription_name']); $subscription['subscription_invoice'] = implode(', ', $subscription['subscription_invoice']); // email the admin when a customer signs up. $values = array_merge($customer, $customer_extra, $website, $website_extra, $address, $subscription); $values['customer_name'] = $customer['customer_name']; $values['CUSTOMER_LINK'] = module_customer::link_open($customer_id); $values['CUSTOMER_NAME_LINK'] = module_customer::link_open($customer_id, true); if ($website_id) { $values['WEBSITE_LINK'] = module_website::link_open($website_id); $values['WEBSITE_NAME_LINK'] = module_website::link_open($website_id, true); } else { $values['WEBSITE_LINK'] = _l('N/A'); $values['WEBSITE_NAME_LINK'] = _l('N/A'); } $values['JOB_LINKS'] = ''; if (count($job_created)) { $values['JOB_LINKS'] .= 'The customer created ' . count($job_created) . ' jobs in the system: <br>'; foreach ($job_created as $job_created_id) { $values['JOB_LINKS'] .= module_job::link_open($job_created_id, true) . "<br>\n"; } } else { $values['JOB_LINKS'] = _l('N/A'); } if (count($uploaded_files)) { $values['uploaded_files'] = 'The customer uploaded ' . count($uploaded_files) . " files:<br>\n"; foreach ($uploaded_files as $uploaded_file) { $values['uploaded_files'] .= module_file::link_open($uploaded_file, true) . "<br>\n"; } } else { $values['uploaded_files'] = 'No files were uploaded'; } $values['WEBSITE_NAME'] = isset($website['url']) ? $website['url'] : 'N/A'; if (!$creating_new) { $values['system_note'] = "Note: this signup updated the existing customer record in the system."; } else { $values['system_note'] = "Note: this signup created a new customer record in the system."; } $customer_signup_template = module_config::c('customer_signup_email_admin_template', 'customer_signup_email_admin'); if (isset($_REQUEST['customer_signup_email_admin_template'])) { $customer_signup_template = $_REQUEST['customer_signup_email_admin_template']; } if ($customer_signup_template) { $template = module_template::get_template_by_key($customer_signup_template); if ($template->template_id) { $template->assign_values($values); $html = $template->render('html'); $email = module_email::new_email(); $email->replace_values = $values; $email->set_subject($template->description); $email->set_to_manual(module_config::c('customer_signup_admin_email', module_config::c('admin_email_address'))); // do we send images inline? $email->set_html($html); if ($email->send()) { // it worked successfully!! } else { /// log err? } } } $customer_signup_template = module_config::c('customer_signup_email_welcome_template', 'customer_signup_email_welcome'); if (isset($_REQUEST['customer_signup_email_welcome_template'])) { $customer_signup_template = $_REQUEST['customer_signup_email_welcome_template']; } if ($customer_signup_template) { $template = module_template::get_template_by_key($customer_signup_template); if ($template->template_id) { $template->assign_values($values); $html = $template->render('html'); $email = module_email::new_email(); $email->customer_id = $customer_id; $email->replace_values = $values; $email->set_subject($template->description); $email->set_to('user', $customer_data['primary_user_id']); // do we send images inline? $email->set_html($html); if ($email->send()) { // it worked successfully!! } else { /// log err? } } } //todo: optional redirect to url if (isset($_REQUEST['via_ajax'])) { echo json_encode(array('success' => 1, 'customer_id' => $customer_id)); exit; } if (module_config::c('customer_signup_redirect', '')) { redirect_browser(module_config::c('customer_signup_redirect', '')); } // load up the thank you template. $template = module_template::get_template_by_key('customer_signup_thank_you_page'); $template->page_title = _l("Customer Signup"); foreach ($values as $key => $val) { if (!is_array($val)) { $values[$key] = htmlspecialchars($val); } } $template->assign_values($values); echo $template->render('pretty_html'); exit; break; } }
public static function get_finance_summary($week_start, $week_end, $multiplyer = 1, $row_limit = 7) { $cache_key = 'finance_sum_' . md5(module_security::get_loggedin_id() . '_' . serialize(func_get_args())); $cache_timeout = module_config::c('cache_objects', 60); if ($cached_item = module_cache::get('finance', $cache_key)) { return $cached_item; } $base_href = module_finance::link_generate(false, array('full' => false, 'page' => 'dashboard_popup', 'arguments' => array('display_mode' => 'ajax')), array('foo')); $base_href .= '&'; /*$base_href .= (strpos($base_href,'?')!==false) ? '&' : '?'; $base_href .= 'display_mode=ajax&'; $base_href .= 'home_page_stats=true&';*/ // init structure: if ($multiplyer > 1) { $row_limit++; } for ($x = 0; $x < $row_limit; $x++) { //$time = strtotime("+$x days",strtotime($week_start)); $time = strtotime("+" . $x * $multiplyer . " days", strtotime($week_start)); $data[date("Ymd", $time)] = array("day" => $time, "hours" => 0, "amount" => 0, "amount_invoiced" => 0, "amount_paid" => 0, "amount_spent" => 0); if (class_exists('module_envato', false)) { $data[date("Ymd", $time)]['envato_earnings'] = 0; } } $data['total'] = array('day' => _l('Totals:'), 'week' => _l('Totals:'), 'hours' => 0, 'amount' => 0, 'amount_invoiced' => 0, 'amount_paid' => 0, 'amount_spent' => 0); if (class_exists('module_envato', false)) { $data['total']['envato_earnings'] = 0; } if (class_exists('module_job', false)) { module_debug::log(array('title' => 'Finance Dashboard Job', 'data' => '')); // find all task LOGS completed within these dayes $sql = "SELECT t.task_id, tl.date_created, t.hours AS task_hours, t.amount, tl.hours AS hours_logged, p.job_id, p.hourly_rate, t.date_done "; // $sql .= " FROM `"._DB_PREFIX."task_log` tl "; // $sql .= " LEFT JOIN `"._DB_PREFIX."task` t ON tl.task_id = t.task_id "; $sql .= " FROM `" . _DB_PREFIX . "task` t"; $sql .= " LEFT JOIN `" . _DB_PREFIX . "task_log` tl ON t.task_id = tl.task_id "; $sql .= " LEFT JOIN `" . _DB_PREFIX . "job` p ON t.job_id = p.job_id"; $sql .= " WHERE ( (tl.date_created >= '{$week_start}' AND tl.date_created < '{$week_end}') OR (t.fully_completed = 1 AND t.date_done >= '{$week_start}' AND t.date_done < '{$week_end}') )"; $sql .= " AND t.job_id IN ( "; $valid_job_ids = module_job::get_valid_job_ids(); if (count($valid_job_ids)) { foreach ($valid_job_ids as $valid_job_id) { $sql .= (int) $valid_job_id['job_id'] . ", "; } $sql = rtrim($sql, ', '); } else { $sql .= ' NULL '; } $sql .= " ) "; // echo $sql; $tasks = query($sql); $logged_tasks = array(); while ($r = mysql_fetch_assoc($tasks)) { if (!$r['date_created']) { $r['date_created'] = $r['date_done']; } if ($multiplyer > 1) { $week_day = date('w', strtotime($r['date_created'])) - 1; $r['date_created'] = date('Y-m-d', strtotime('-' . $week_day . ' days', strtotime($r['date_created']))); } $key = date("Ymd", strtotime($r['date_created'])); if (!isset($data[$key])) { // for some reason we're getting results here that shouldn't be in the list // for now we just skip these results until I figure out why (only had 1 guy report this error, maybe misconfig) continue; } // copied from dashboard_popup_hours_logged.php // needed get_tasks call to do the _JOB_TASK_ACCESS_ASSIGNED_ONLY permission check $jobtasks = module_job::get_tasks($r['job_id']); $task = isset($jobtasks[$r['task_id']]) ? $jobtasks[$r['task_id']] : false; if (!$task) { continue; } if (!isset($task['manual_task_type']) || $task['manual_task_type'] < 0) { $task['manual_task_type'] = $task['default_task_type']; } if (isset($r['hours_logged']) && $r['hours_logged'] > 0) { if ($r['hours_logged'] == $task['completed']) { // this listing is the only logged hours for this task. if ($task['fully_completed']) { // task complete, we show the final amount and hours. if ($task['amount'] > 0) { if ($task['manual_task_type'] == _TASK_TYPE_QTY_AMOUNT) { $display_amount = $task['amount'] * $task['hours']; } else { $display_amount = $task['amount']; } } else { $display_amount = $r['task_hours'] * $r['hourly_rate']; } } else { // task isn't fully completed yet, just use hourly rate for now. $display_amount = $r['hours_logged'] * $r['hourly_rate']; } } else { // this is part of a bigger log of hours for this single task. $display_amount = $r['hours_logged'] * $r['hourly_rate']; } $hours_logged = $r['task_hours'] > 0 ? $r['hours_logged'] : 0; } else { // there are no logged hours for this particular task, but it is set to completed. // we just assume it is completed on this day. if ($task['amount'] > 0) { if ($task['manual_task_type'] == _TASK_TYPE_QTY_AMOUNT) { $display_amount = $task['amount'] * $task['hours']; } else { $display_amount = $task['amount']; } } else { $display_amount = $r['task_hours'] * $r['hourly_rate']; } $hours_logged = $task['hours']; } $data[$key]['amount'] += $display_amount; $data['total']['amount'] += $display_amount; $data[$key]['hours'] += $hours_logged; $data['total']['hours'] += $hours_logged; /*$hourly_rate = $r['hourly_rate']; if($hours_logged > 0 && $r['amount'] > 0 && $hourly_rate > 0){ // there is a custom amount assigned to thsi task. // only calculate this amount if the full hours is complete. $hourly_rate = $r['amount'] / $r['task_hours']; } if($hours_logged > 0 && $hourly_rate > 0){ $data[$key]['amount'] += ($hours_logged * $hourly_rate); $data['total']['amount'] += ($hours_logged * $hourly_rate); }*/ } } module_debug::log(array('title' => 'Finance Dashboard Invoices', 'data' => '')); // find invoices sent this week. $sql = "SELECT i.* "; $sql .= " FROM `" . _DB_PREFIX . "invoice` i "; $sql .= " LEFT JOIN `" . _DB_PREFIX . "invoice_item` ii ON i.invoice_id = ii.invoice_id "; if (class_exists('module_job', false)) { $sql .= " LEFT JOIN `" . _DB_PREFIX . "task` t ON ii.task_id = t.task_id "; $sql .= " LEFT JOIN `" . _DB_PREFIX . "job` p ON t.job_id = p.job_id "; } $sql .= " WHERE (i.date_create >= '{$week_start}' AND i.date_create <= '{$week_end}')"; $sql .= " GROUP BY i.invoice_id"; // todo - sql in here to limit what they can see. $invoices = query($sql); // group invoices into days of the week. while ($invoice_data = mysql_fetch_assoc($invoices)) { //$invoice_data = module_invoice::get_invoice($i['invoice_id']); if ($invoice_data) { if ($multiplyer > 1) { $week_day = date('w', strtotime($invoice_data['date_create'])) - 1; $invoice_data['date_create'] = date('Y-m-d', strtotime('-' . $week_day . ' days', strtotime($invoice_data['date_create']))); } $key = date("Ymd", strtotime($invoice_data['date_create'])); if (!isset($data[$key])) { // for some reason we're getting results here that shouldn't be in the list // for now we just skip these results until I figure out why (only had 1 guy report this error, maybe misconfig) continue; } if (isset($data[$key])) { $data[$key]['amount_invoiced'] += $invoice_data['c_total_amount']; $data['total']['amount_invoiced'] += $invoice_data['c_total_amount']; } } } module_debug::log(array('title' => 'Finance Dashboard Finances', 'data' => '')); // find all payments made this week. // we also have to search for entries in the new "finance" table and make sure we dont double up here. $finance_records = module_finance::get_finances(array('date_from' => $week_start, 'date_to' => $week_end)); foreach ($finance_records as $finance_record) { if (isset($finance_record['payment_type']) && ($finance_record['payment_type'] == _INVOICE_PAYMENT_TYPE_OVERPAYMENT_CREDIT || $finance_record['payment_type'] == _INVOICE_PAYMENT_TYPE_CREDIT)) { // CODE COPIED FROM FINANCE_LIST.PHP // dont add these ones to the totals on the dashboard continue; } if ($finance_record['credit'] > 0) { if ($multiplyer > 1) { $week_day = date('w', strtotime($finance_record['transaction_date'])) - 1; $finance_record['transaction_date'] = date('Y-m-d', strtotime('-' . $week_day . ' days', strtotime($finance_record['transaction_date']))); } $key = date("Ymd", strtotime($finance_record['transaction_date'])); if (isset($data[$key])) { $data[$key]['amount_paid'] += $finance_record['amount']; $data['total']['amount_paid'] += $finance_record['amount']; } } if ($finance_record['debit'] > 0) { if ($multiplyer > 1) { $week_day = date('w', strtotime($finance_record['transaction_date'])) - 1; $finance_record['transaction_date'] = date('Y-m-d', strtotime('-' . $week_day . ' days', strtotime($finance_record['transaction_date']))); } $key = date("Ymd", strtotime($finance_record['transaction_date'])); if (isset($data[$key])) { $data[$key]['amount_spent'] += $finance_record['amount']; $data['total']['amount_spent'] += $finance_record['amount']; } } } module_debug::log(array('title' => 'Finance Dashboard DONE!', 'data' => '')); /*$sql = "SELECT p.* "; $sql .= " FROM `"._DB_PREFIX."invoice_payment` p "; $sql .= " WHERE (p.date_paid >= '$week_start' AND p.date_paid <= '$week_end')"; // todo - sql in here to limit what they can see. $payments = query($sql); // group invoices into days of the week. while($payment = mysql_fetch_assoc($payments)){ //$invoice_data = module_invoice::get_invoice($i['invoice_id']); if($multiplyer > 1){ $week_day = date('w',strtotime($payment['date_paid'])) - 1; $payment['date_paid'] = date('Y-m-d',strtotime('-'.$week_day.' days',strtotime($payment['date_paid']))); } $key = date("Ymd",strtotime($payment['date_paid'])); if(isset($data[$key])){ $data[$key]['amount_paid'] += $payment['amount']; $data['total']['amount_paid'] += $payment['amount']; } }*/ if (class_exists('module_envato', false)) { $envato_currency = "USD"; $envato = new envato_api(); $local_currency = $envato->read_setting("local_currency", "AUD"); $currency_convert_multiplier = $envato->currency_convert($envato_currency, $local_currency); // find summary of earnings between these dates in the envato statement. $week_start_time = strtotime($week_start); $week_end_time = strtotime($week_end); $sql = "SELECT * FROM `" . _DB_PREFIX . "envato_statement` s WHERE `time` >= '{$week_start_time}' AND `time` <= {$week_end_time}"; $sql .= " AND ( `type` = 'sale' OR `type` = 'referral_cut' )"; foreach (qa($sql) as $sale) { $sale_time = $sale['time']; if ($multiplyer > 1) { $week_day = date('w', $sale_time) - 1; $sale_time = strtotime('-' . $week_day . ' days', $sale_time); } $key = date("Ymd", $sale_time); if (!isset($data[$key])) { continue; } $data[$key]['envato_earnings'] += round($currency_convert_multiplier * $sale['earnt'], 2); $data['total']['envato_earnings'] += round($currency_convert_multiplier * $sale['earnt'], 2); /*if($sale['type']=='sale'){ $sales_count++; } $sales_amount+= $sale['earnt'];*/ } } if ($multiplyer > 1) { // dont want totals on previous weeks listing unset($data['total']); } foreach ($data as $data_id => $row) { //$row['amount'] = dollar($row['amount']); $row['chart_amount'] = $row['amount']; $row['amount'] = currency((int) $row['amount']); $row['chart_amount_invoiced'] = $row['amount_invoiced']; $row['amount_invoiced'] = currency((int) $row['amount_invoiced']); $row['chart_amount_paid'] = $row['amount_paid']; $row['amount_paid'] = currency((int) $row['amount_paid']); $row['chart_amount_spent'] = $row['amount_spent']; $row['amount_spent'] = currency((int) $row['amount_spent']); if (class_exists('module_envato', false)) { $row['chart_envato_earnings'] = $row['envato_earnings']; $row['envato_earnings'] = currency((int) $row['envato_earnings']); } // combine together $row['chart_hours'] = $row['hours']; $row['hours'] = sprintf('%s (%s)', $row['hours'], $row['amount']); if (is_numeric($row['day'])) { $time = $row['day']; $date = date('Y-m-d', $time); $row['date'] = $date; if ($multiplyer > 1) { $date .= '|' . date('Y-m-d', strtotime('+' . $multiplyer . ' days', $time)); } //$row['hours'] = '<a href="'.$base_href.'w=hours&date='.$date.'" class="summary_popup">'. _l('%s hours',$row['hours']) . '</a>'; $row['hours_link'] = '<a href="' . $base_href . 'w=hours&date=' . $date . '" class="summary_popup">' . $row['hours'] . '</a>'; $row['amount_link'] = '<a href="' . $base_href . 'w=hours&date=' . $date . '" class="summary_popup">' . $row['amount'] . '</a>'; $row['amount_invoiced_link'] = '<a href="' . $base_href . 'w=amount_invoiced&date=' . $date . '" class="summary_popup">' . $row['amount_invoiced'] . '</a>'; $row['amount_paid_link'] = '<a href="' . $base_href . 'w=amount_paid&date=' . $date . '" class="summary_popup">' . $row['amount_paid'] . '</a>'; $row['amount_spent_link'] = '<a href="' . $base_href . 'w=amount_spent&date=' . $date . '" class="summary_popup">' . $row['amount_spent'] . '</a>'; $row['day'] = _l(date('D', $time)) . ' ' . date('j', $time) . _l(date('S', $time)); $row['week'] = _l(date('M', $time)) . ' ' . date('j', $time) . _l(date('S', $time)); // if it's today. if ($time == strtotime(date("Y-m-d"))) { $row['highlight'] = true; } } else { } $data[$data_id] = $row; } module_cache::put('finance', $cache_key, $data, $cache_timeout); return $data; }
<?php /** * Copyright: dtbaker 2012 * Licence: Please check CodeCanyon.net for licence details. * More licence clarification available here: http://codecanyon.net/wiki/support/legal-terms/licensing-terms/ * Deploy: 9809 f200f46c2a19bb98d112f2d32a8de0c4 * Envato: 4ffca17e-861e-4921-86c3-8931978c40ca * Package Date: 2015-11-25 02:55:20 * IP Address: 67.79.165.254 */ $job_safe = true; // stop including files directly. if (!module_job::can_i('view', 'Jobs')) { echo 'permission denied'; return; } if (isset($_REQUEST['job_id'])) { if (isset($_REQUEST['email_staff'])) { include module_theme::include_ucm("includes/plugin_job/pages/job_admin_email_staff.php"); } else { if (isset($_REQUEST['email'])) { include module_theme::include_ucm("includes/plugin_job/pages/job_admin_email.php"); } else { if ((int) $_REQUEST['job_id'] > 0) { include module_theme::include_ucm("includes/plugin_job/pages/job_admin_edit.php"); //include("job_admin_edit.php"); } else { include module_theme::include_ucm("includes/plugin_job/pages/job_admin_create.php"); //include("job_admin_create.php"); }
public static function invoice_html($invoice_id, $invoice_data, $mode = 'html') { if ($invoice_id && $invoice_data) { // spit out the invoice html into a file, then pass it to the pdf converter // to convert it into a PDF. ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/invoice_print.php'); module_template::init_template('invoice_print', ob_get_clean(), 'Used for printing out an invoice for the customer.', 'html'); ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/invoice_print_basic.php'); module_template::init_template('invoice_print_basic', ob_get_clean(), 'Alternative template for printing out an invoice for the customer.', 'html'); ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/credit_note_pdf.php'); module_template::init_template('credit_note_pdf', ob_get_clean(), 'Used for printing out a a credit note for the customer.', 'html'); $invoice = $invoice_data; if (class_exists('module_company', false) && isset($invoice_data['company_id']) && (int) $invoice_data['company_id'] > 0) { module_company::set_current_company_id($invoice_data['company_id']); } $job_data = module_job::get_job(current($invoice_data['job_ids'])); $website_data = $job_data['website_id'] ? module_website::get_website($job_data['website_id']) : array(); $website_data = array_merge($website_data, isset($invoice_data['website_id']) && $invoice_data['website_id'] ? module_website::get_website($invoice_data['website_id']) : array()); $invoice_template = isset($invoice_data['invoice_template_print']) && strlen($invoice_data['invoice_template_print']) ? $invoice_data['invoice_template_print'] : module_config::c('invoice_template_print_default', 'invoice_print'); $invoice_template_suffix = ''; if ($invoice_template != 'invoice_print') { $invoice_template_suffix = str_replace('invoice_print', '', $invoice_template); } ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/invoice_task_list.php'); $task_list_html = ob_get_clean(); ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/invoice_payment_history.php'); $payment_history = ob_get_clean(); ob_start(); include module_theme::include_ucm('includes/plugin_invoice/template/invoice_payment_methods.php'); $payment_methods = ob_get_clean(); $replace = self::get_replace_fields($invoice_id, $invoice_data); $replace['payment_history'] = $payment_history; $replace['payment_methods'] = $payment_methods; $replace['task_list'] = $task_list_html; $replace['external_invoice_template_html'] = ''; //$external_invoice_template = module_template::get_template_by_key('external_invoice'); $external_invoice_template = false; if (isset($invoice_template_suffix) && strlen($invoice_template_suffix) > 0) { $external_invoice_template = module_template::get_template_by_key('external_invoice' . $invoice_template_suffix); if (!$external_invoice_template->template_id) { $external_invoice_template = false; } } if (!$external_invoice_template) { $external_invoice_template = module_template::get_template_by_key('external_invoice'); } $external_invoice_template->assign_values($replace); $replace['external_invoice_template_html'] = $external_invoice_template->replace_content(); if (isset($invoice_data['credit_note_id']) && $invoice_data['credit_note_id']) { if ($invoice_data['invoice_template_print']) { $invoice_data['invoice_template_print'] = 'credit_note_pdf'; } $invoice_template = 'credit_note_pdf'; } ob_start(); $template = module_template::get_template_by_key($invoice_template); if (!$template || $template->template_key != $invoice_template) { echo "Invoice template {$invoice_template} not found"; } else { $template->assign_values($replace); echo $template->render('html'); } $invoice_html = ob_get_clean(); return $invoice_html; } return false; }
}); if (module_config::c('quote_allow_staff_assignment', 1)) { $columns['quote_staff'] = array('title' => 'Staff Member', 'callback' => function ($quote) { echo module_user::link_open($quote['user_id'], true); }); } if (module_job::can_i('view', 'Jobs')) { $job_ids = array(); $columns['job'] = array('title' => 'Job', 'callback' => function ($quote) use(&$job_ids) { $job_ids = array(); foreach (module_job::get_jobs(array('quote_id' => $quote['quote_id'])) as $job) { $job = module_job::get_job($job['job_id']); if (!$job) { continue; } echo module_job::link_open($job['job_id'], true); $job_ids[] = $job['job_id']; echo " "; echo '<span class="'; if ($job['total_amount_due'] > 0) { echo 'error_text'; } else { echo 'success_text'; } echo '">'; if ($job['total_amount'] > 0) { echo dollar($job['total_amount'], true, $job['currency_id']); } echo '</span>'; echo "<br>"; }
$search['bucket_parent_file_id'] = $file['file_id']; echo _l('%s files', count(module_file::get_files($search))); } else { if (file_exists($file['file_path'])) { echo module_file::format_bytes(filesize($file['file_path'])); } } }); if (!isset($_REQUEST['customer_id'])) { $columns['file_customer'] = array('title' => 'Customer', 'callback' => function ($file) { echo module_customer::link_open($file['customer_id'], true); }); } if (class_exists('module_job', false)) { $columns['file_job'] = array('title' => 'Job', 'callback' => function ($file) { echo module_job::link_open($file['job_id'], true); }); } if (class_exists('module_quote', false) && module_quote::is_plugin_enabled()) { $columns['file_quote'] = array('title' => 'Quote', 'callback' => function ($file) { echo module_quote::link_open($file['quote_id'], true); }); } $columns['file_date_added'] = array('title' => 'Date Added', 'callback' => function ($file) { echo _l('%s by %s', print_date($file['date_created']), module_user::link_open($file['create_user_id'], true)); }); if (module_file::can_i('edit', 'Files')) { $columns['file_action'] = array('title' => ' ', 'callback' => function ($file) { echo '<input type="checkbox" name="bulk_operation[' . $file['file_id'] . ']" value="yes">'; }); }
public static function hook_job_task_after($hook, $job_id, $task_id, $job_data, $task_data) { $comments = get_multiple('job_discussion', array('job_id' => $job_id, 'task_id' => $task_id), 'job_discussion_id', 'exact', 'job_discussion_id'); if ($job_data && isset($job_data['job_discussion']) && $job_data['job_discussion'] == 1) { // disabled & hidden. return; } if ($job_data && isset($job_data['job_discussion']) && $job_data['job_discussion'] == 2 && count($comments) == 0) { // disabled & shown. return; } if (isset($_POST['job_discussion_add_job_id']) && isset($_POST['job_discussion_add_task_id']) && $_POST['job_discussion_add_job_id'] == $job_id && $_POST['job_discussion_add_task_id'] == $task_id && isset($_POST['note']) && strlen($_POST['note'])) { $x = 0; while (ob_get_level() && $x++ < 10) { ob_end_clean(); } $current_user_id = module_security::get_loggedin_id(); $customer = module_customer::get_customer($job_data['customer_id']); if (!$current_user_id) { if ($job_data['customer_id'] && $customer['primary_user_id']) { $current_user_id = $customer['primary_user_id']; } } $result = array(); // adding a new note. $job_discussion_id = update_insert('job_discussion_id', 0, 'job_discussion', array('job_id' => $job_id, 'task_id' => $task_id, 'user_id' => $current_user_id, 'note' => $_POST['note'])); $result['job_discussion_id'] = $job_discussion_id; $result['count'] = count($comments) + 1; $tasks = module_job::get_tasks($job_id); $result['email_customer'] = array(); if (isset($_POST['sendemail_customer']) && is_array($_POST['sendemail_customer'])) { //$_POST['sendemail_customer'] == 'yes' && $customer['primary_user_id']){ // send email to customer primary user id. $customer_contacts = module_user::get_contacts(array('customer_id' => $job_data['customer_id'])); foreach ($_POST['sendemail_customer'] as $user_id) { $user_id = (int) $user_id; if ($user_id && isset($customer_contacts[$user_id])) { // we can email this user. $user = module_user::get_user($user_id, false); if ($user && $user['user_id'] == $user_id) { $values = array_merge($user, $job_data); $values['job_url'] = module_job::link_public($job_id); $values['job_url'] .= (strpos($values['job_url'], '?') === false ? '?' : '&') . 'discuss=' . $task_id . '#discuss' . $task_id; $values['job_name'] = $job_data['name']; $values['customer_name'] = $user['name'] . ' ' . $user['last_name']; $values['note'] = $_POST['note']; //todo: no order if no showning numbers $values['task_name'] = '#' . $tasks[$task_id]['task_order'] . ': ' . $tasks[$task_id]['description']; $template = module_template::get_template_by_key('job_discussion_email_customer'); $template->assign_values($values); $html = $template->render('html'); $email = module_email::new_email(); $email->replace_values = $values; $email->set_to('user', $user['user_id']); $email->set_from('user', $current_user_id); $email->set_subject($template->description); // do we send images inline? $email->set_html($html); if ($email->send()) { // it worked successfully!! $result['email_customer'][] = $user['user_id']; } else { /// log err? } } } } /*$user = module_user::get_user($customer['primary_user_id'],false); if($user['user_id'] == $customer['primary_user_id']){ $values = array_merge($user,$job_data); $values['job_url'] = module_job::link_public($job_id); $values['job_url'] .= (strpos($values['job_url'],'?')===false ? '?' : '&').'discuss='.$task_id.'#discuss'.$task_id; $values['job_name'] = $job_data['name']; $values['customer_name'] = $user['name'].' '.$user['last_name']; $values['note'] = $_POST['note']; //todo: no order if no showning numbers $values['task_name'] = '#'.$tasks[$task_id]['task_order'].': '.$tasks[$task_id]['description']; $template = module_template::get_template_by_key('job_discussion_email_customer'); $template->assign_values($values); $html = $template->render('html'); $email = module_email::new_email(); $email->replace_values = $values; $email->set_to('user',$user['user_id']); $email->set_from('user',$current_user_id); $email->set_subject($template->description); // do we send images inline? $email->set_html($html); if($email->send()){ // it worked successfully!! $result['email_customer'] = 1; }else{ /// log err? $result['email_customer'] = 0; } }else{ // log error? $result['email_customer'] = 0; }*/ } if (isset($_POST['sendemail_staff']) && is_array($_POST['sendemail_staff'])) { // == 'yes' && $job_data['user_id'] // todo: handle the restul better when sending to multiple people $result['email_staff_list'] = $_POST['sendemail_staff']; foreach ($_POST['sendemail_staff'] as $staff_id) { // send email to staff $staff_id = (int) $staff_id; if (!$staff_id) { $result['nostaff'] = 1; continue; } if (isset($task_data['user_id']) && $task_data['user_id'] == $staff_id || isset($job_data['user_id']) && $job_data['user_id'] == $staff_id) { //$user = module_user::get_user($job_data['user_id'],false); $user = module_user::get_user($staff_id, false); if ($user['user_id'] == $staff_id) { $values = array_merge($user, $job_data); $values['job_url'] = module_job::link_public($job_id); $values['job_url'] .= (strpos($values['job_url'], '?') === false ? '?' : '&') . 'discuss=' . $task_id . '#discuss' . $task_id; $values['job_name'] = $job_data['name']; $values['staff_name'] = $user['name'] . ' ' . $user['last_name']; $values['note'] = $_POST['note']; //todo: no order if no showning numbers $values['task_name'] = '#' . $tasks[$task_id]['task_order'] . ': ' . $tasks[$task_id]['description']; $template = module_template::get_template_by_key('job_discussion_email_staff'); $template->assign_values($values); $html = $template->render('html'); $email = module_email::new_email(); $email->replace_values = $values; $email->set_to('user', $staff_id); $email->set_from('user', $current_user_id); $email->set_subject($template->description); // do we send images inline? $email->set_html($html); if ($email->send()) { // it worked successfully!! $result['email_staff'] = 1; } else { /// log err? $result['email_staff'] = 0; } } else { // log error? $result['email_staff'] = 0; } } } } $x = 0; while ($x++ < 5 && ob_get_level()) { ob_end_clean(); } header("Content-type: text/javascript", true); echo json_encode($result); exit; } $label = htmlspecialchars(module_config::c('job_discussion_button_label', 'Task Comments')); ?> <a href="<?php echo self::link_public($job_id, $task_id); ?> " id="discuss<?php echo $task_id; ?> " class="task_job_discussion <?php echo $label ? 'with_text' : ''; ?> " title="<?php _e('View Discussion'); ?> "><span><?php echo count($comments) > 0 ? count($comments) : ''; ?> </span><?php echo $label; ?> </a> <div class="task_job_discussion_holder"<?php echo isset($_REQUEST['discuss']) && $_REQUEST['discuss'] == $task_id ? ' style="display:block;"' : ''; ?> > <?php if (isset($_REQUEST['discuss']) && $_REQUEST['discuss'] == $task_id) { $_REQUEST['t'] = $task_id; $_REQUEST['i'] = $job_id; $_REQUEST['hash'] = self::link_public($job_id, $task_id, true); self::external_hook('public'); } ?> </div> <?php }
echo $invoice_item_id; ?> "> <br/> <textarea name="invoice_invoice_item[<?php echo $invoice_item_id; ?> ][long_description]" style="width:90%;"><?php echo htmlspecialchars($invoice_item_data['custom_long_description'] ? $invoice_item_data['custom_long_description'] : $invoice_item_data['long_description']); ?> </textarea> <?php if ($invoice_item_data['task_id']) { // echo htmlspecialchars($invoice_item_data['custom_description'] ? $invoice_item_data['custom_description'] : $invoice_item_data['description']); echo '<br/>'; echo _l('(linked to job: %s)', module_job::link_open($invoice_item_data['job_id'], true)); } else { } ?> <a href="#" onclick="if(confirm('<?php _e('Delete invoice item?'); ?> ')){$(this).parent().find('input').val(''); $('#invoice_form')[0].submit();} return false;" class="delete ui-state-default ui-corner-all ui-icon ui-icon-trash" style="display:inline-block; float:right;">[x]</a> </td> <?php if ($show_task_dates) { ?> <td> <input type="text" name="invoice_invoice_item[<?php
This email is regarding your file <strong>{FILE_NAME}</strong>{if:JOB_LINK} related to the job <a href="{JOB_LINK}">{JOB_NAME}</a>{endif:JOB_LINK}.<br><br> Please view this file and comments online by <a href="{FILE_URL}">clicking here</a>.<br><br> Thank you,<br><br> {FROM_NAME} ', 'File for Approval: {FILE_NAME}', array('CUSTOMER_NAME' => 'Customers Name', 'FILE_NAME' => 'File Name', 'JOB_NAME' => 'Job Name', 'FROM_NAME' => 'Your name', 'FILE_URL' => 'Link to file for customer')); // template for sending emails. // are we sending the paid one? or the dueone. //$template_name = 'file_email'; $template_name = isset($_REQUEST['template_name']) ? $_REQUEST['template_name'] : 'file_approval_email'; $template = module_template::get_template_by_key($template_name); $file['from_name'] = module_security::get_loggedin_name(); $file['file_url'] = module_file::link_public($file_id); if (class_exists('module_job', false) && $file['job_id']) { $job_data = module_job::get_job($file['job_id'], false); $file['job_name'] = htmlspecialchars($job_data['name']); $file['job_link'] = module_job::link_public($file['job_id']); } else { $file['job_name'] = _l('N/A'); $file['job_link'] = ''; } // find available "to" recipients. // customer contacts. $to_select = false; if ($file['customer_id']) { $customer = module_customer::get_customer($file['customer_id']); $file['customer_name'] = $customer['customer_name']; $to = module_user::get_contacts(array('customer_id' => $file['customer_id'])); if ($customer['primary_user_id']) { $primary = module_user::get_user($customer['primary_user_id']); if ($primary) { $to_select = $primary['email'];
function customer_admin_email_generate_invoice_list($invoices, $customer_id) { ob_start(); $colspan = 9; $colspan2 = 0; $invoice_total = array(); $invoice_total_due = array(); foreach ($invoices as $invoice) { if (!isset($invoice_total[$invoice['currency_id']])) { $invoice_total[$invoice['currency_id']] = 0; } if ($invoice['c_total_amount'] == 0) { $invoice = module_invoice::get_invoice($invoice['invoice_id']); } $invoice_total[$invoice['currency_id']] += $invoice['c_total_amount']; if (!isset($invoice_total_due[$invoice['currency_id']])) { $invoice_total_due[$invoice['currency_id']] = 0; } $invoice_total_due[$invoice['currency_id']] += $invoice['c_total_amount_due']; } $table_manager = module_theme::new_table_manager(); $columns = array(); $columns['invoice_number'] = array('title' => 'Invoice Number', 'callback' => function ($invoice) { //echo module_invoice::link_open($invoice['invoice_id'],true,$invoice); echo '<a href="' . module_invoice::link_public($invoice['invoice_id']) . '">' . htmlspecialchars($invoice['name']) . '</a>'; }, 'cell_class' => 'row_action'); $columns['invoice_status'] = array('title' => 'Status', 'callback' => function ($invoice) { echo htmlspecialchars($invoice['status']); }); $columns['invoice_create_date'] = array('title' => 'Create Date', 'callback' => function ($invoice) { if (!$invoice['date_create'] || $invoice['date_create'] == '0000-00-00') { //echo print_date($invoice['date_created']); } else { echo print_date($invoice['date_create']); } }); $columns['invoice_due_date'] = array('title' => 'Due Date', 'callback' => function ($invoice) { if ((!$invoice['date_paid'] || $invoice['date_paid'] == '0000-00-00') && strtotime($invoice['date_due']) < time()) { echo '<span class="error_text">'; echo print_date($invoice['date_due']); echo '</span>'; } else { echo print_date($invoice['date_due']); } }); $columns['invoice_sent_date'] = array('title' => 'Sent Date', 'callback' => function ($invoice) { if ($invoice['date_sent'] && $invoice['date_sent'] != '0000-00-00') { ?> <?php echo print_date($invoice['date_sent']); ?> <?php } else { ?> <span class="error_text"><?php _e('Not sent'); ?> </span> <?php } }); $columns['invoice_paid_date'] = array('title' => 'Paid Date', 'callback' => function ($invoice) { if ($invoice['date_paid'] && $invoice['date_paid'] != '0000-00-00') { ?> <?php echo print_date($invoice['date_paid']); ?> <?php } else { if ($invoice['date_cancel'] && $invoice['date_cancel'] != '0000-00-00') { ?> <span class="error_text"><?php _e('Cancelled'); ?> </span> <?php } else { if ($invoice['overdue']) { ?> <span class="error_text" style="font-weight: bold; text-decoration: underline;"><?php _e('Overdue'); ?> </span> <?php } else { ?> <span class="error_text"><?php _e('Not paid'); ?> </span> <?php } } } }); if (class_exists('module_website', false) && module_website::is_plugin_enabled() && module_website::can_i('view', module_config::c('project_name_plural', 'Websites'))) { $colspan++; $columns['invoice_website'] = array('title' => module_config::c('project_name_single', 'Website'), 'callback' => function ($invoice) { if (isset($invoice['website_ids'])) { foreach ($invoice['website_ids'] as $website_id) { if ((int) $website_id > 0) { echo module_website::link_open($website_id, true); echo '<br/>'; } } } }); } $columns['invoice_job'] = array('title' => 'Job', 'callback' => function ($invoice) { foreach ($invoice['job_ids'] as $job_id) { if ((int) $job_id > 0) { //echo module_job::link_open($job_id,true); $job_data = module_job::get_job($job_id); echo '<a href="' . module_job::link_public($job_id) . '">' . htmlspecialchars($job_data['name']) . '</a>'; if ($job_data['date_start'] && $job_data['date_start'] != '0000-00-00' && $job_data['date_renew'] && $job_data['date_renew'] != '0000-00-00') { _e(' (%s to %s)', print_date($job_data['date_start']), print_date(strtotime("-1 day", strtotime($job_data['date_renew'])))); } echo "<br/>\n"; } } hook_handle_callback('invoice_admin_list_job', $invoice['invoice_id']); }); if (!isset($_REQUEST['customer_id']) && module_customer::can_i('view', 'Customers')) { $colspan++; $columns['invoice_customer'] = array('title' => 'Customer', 'callback' => function ($invoice) { echo module_customer::link_open($invoice['customer_id'], true); }); } $columns['c_invoice_total'] = array('title' => 'Invoice Total', 'callback' => function ($invoice) { echo dollar($invoice['total_amount'], true, $invoice['currency_id']); }); $columns['c_invoice_total_due'] = array('title' => 'Amount Due', 'callback' => function ($invoice) { echo dollar($invoice['total_amount_due'], true, $invoice['currency_id']); ?> <?php if ($invoice['total_amount_credit'] > 0) { ?> <span class="success_text"><?php echo _l('Credit: %s', dollar($invoice['total_amount_credit'], true, $invoice['currency_id'])); ?> </span> <?php } }); if (class_exists('module_extra', false)) { ob_start(); $colspan2 += module_extra::print_table_header('invoice'); // used in the footer calc. ob_end_clean(); $table_manager->display_extra('invoice', function ($invoice) { module_extra::print_table_data('invoice', $invoice['invoice_id']); }); } $table_manager->set_columns($columns); $table_manager->row_callback = function ($row_data) { // load the full vendor data before displaying each row so we have access to more details if (isset($row_data['invoice_id']) && (int) $row_data['invoice_id'] > 0) { return module_invoice::get_invoice($row_data['invoice_id']); } return array(); }; $table_manager->set_rows($invoices); if (module_config::c('invoice_list_show_totals', 1)) { $footer_rows = array(); foreach ($invoice_total + $invoice_total_due as $currency_id => $foo) { $currency = get_single('currency', 'currency_id', $currency_id); $footer_rows[] = array('invoice_number' => array('data' => '<strong>' . _l('%s Totals:', $currency && isset($currency['code']) ? $currency['code'] : '') . '</strong>', 'cell_colspan' => $colspan - 2, 'cell_class' => 'text-right'), 'c_invoice_total' => array('data' => '<strong>' . dollar(isset($invoice_total[$currency_id]) ? $invoice_total[$currency_id] : 0, true, $currency_id) . '</strong>'), 'c_invoice_total_due' => array('data' => '<strong>' . dollar(isset($invoice_total_due[$currency_id]) ? $invoice_total_due[$currency_id] : 0, true, $currency_id) . '</strong>'), 'row_bulk_action' => array('data' => ' ', 'cell_colspan' => $colspan2)); } $table_manager->set_footer_rows($footer_rows); } $table_manager->pagination = false; $table_manager->print_table(); return ob_get_clean(); }
?> </span> </div> </div> </a> </li><!-- end task item --> <?php } } ?> </ul> </li> <li class="footer"> <a href="<?php echo module_job::link_open(false); ?> "><?php _e('View All Jobs'); ?> </a> </li> </ul> </li> <?php } $job_todo_cache = ob_get_clean(); echo $job_todo_cache; module_cache::put('job', 'job_todo_header_cache', $job_todo_cache); } }
?> </a> </td> <?php if ($display_mode != 'mobile') { ?> <td width="5%"> <?php echo $percentage * 100; ?> % </td> <td> <?php echo module_job::link_open($todo_item['job_id'], true, $job_data); ?> </td> <td width="16%"> <?php $alert = process_alert($todo_item['date_due'], 'temp'); ?> <?php echo $alert['warning'] ? '<span class="important">' : ''; ?> <?php echo $alert['days']; ?>
} ?> </td> <td> <?php echo $hours_logged; if ($hours_logged != $r['hours']) { _e(' of %s', $r['hours']); } echo _l('hrs'); ?> </td> <td> <?php $percentage = module_job::get_percentage($task); echo $percentage * 100 . '%'; ?> </td> <td> <?php echo dollar($display_amount); ?> </td> </tr> <?php } ?> </tbody> <tfoot> <tr>
echo dollar($job['total_amount_outstanding'], true, $job['currency_id']); ?> </span> </td> <td> </td> </tr> <?php } ?> </tbody> </table> <?php } else { if ($job['staff_total_amount'] > 0 && !module_job::can_i('view', 'Job Split Pricing')) { } else { ?> <?php echo _l('%s Hours Total', $job['total_hours']); ?> <?php if ($job['total_hours_overworked']) { ?> <?php echo _l('(%s Hours Over)', $job['total_hours_overworked']); ?> <?php } ?> <br/>
public static function get_statistics_staff($search) { $staff_members = module_user::get_staff_members(); $statistics = array(); foreach ($staff_members as $staff_member) { $statistics[$staff_member['user_id']] = array('user_id' => $staff_member['user_id'], 'job_ids' => array(), 'job_count' => 0, 'task_count' => 0, 'task_ids' => array(), 'task_complete_ids' => array(), 'tasks_complete' => 0, 'hours_logged' => 0, 'hours_billed' => 0, 'amount_billed' => 0, 'amount_invoiced' => 0); $sql = "SELECT COUNT(j.job_id) AS job_count "; $sql .= " FROM `" . _DB_PREFIX . "job` j"; $sql .= " WHERE j.user_id = " . (int) $staff_member['user_id']; if (isset($search['date_from']) && $search['date_from']) { $sql .= " AND j.date_start >= '" . input_date($search['date_from']) . "'"; } if (isset($search['date_to']) && $search['date_to']) { $sql .= " AND j.date_start <= '" . input_date($search['date_to']) . "'"; } $res = qa1($sql); $statistics[$staff_member['user_id']]['job_count'] = $res['job_count']; $sql = "SELECT COUNT(t.task_id) AS task_count "; $sql .= " FROM `" . _DB_PREFIX . "task` t"; $sql .= " LEFT JOIN `" . _DB_PREFIX . "job` j ON t.job_id = j.job_id"; $sql .= " WHERE 1"; $sql .= " AND t.user_id = " . (int) $staff_member['user_id']; if (isset($search['date_from']) && $search['date_from']) { $sql .= " AND j.date_start >= '" . input_date($search['date_from']) . "'"; } if (isset($search['date_to']) && $search['date_to']) { $sql .= " AND j.date_start <= '" . input_date($search['date_to']) . "'"; } $res = qa1($sql); $statistics[$staff_member['user_id']]['task_count'] = $res['task_count']; // tasks completed on this date: $sql = "SELECT COUNT(t.task_id) AS task_count "; $sql .= " FROM `" . _DB_PREFIX . "task` t"; $sql .= " LEFT JOIN `" . _DB_PREFIX . "job` j ON t.job_id = j.job_id"; $sql .= " WHERE 1"; $sql .= " AND t.user_id = " . (int) $staff_member['user_id']; if (isset($search['date_from']) && $search['date_from']) { $sql .= " AND t.date_done >= '" . input_date($search['date_from']) . "'"; } if (isset($search['date_to']) && $search['date_to']) { $sql .= " AND t.date_done <= '" . input_date($search['date_to']) . "'"; } $res = qa1($sql); $statistics[$staff_member['user_id']]['tasks_complete'] = $res['task_count']; $sql = "SELECT t.task_id, tl.date_created, t.hours AS task_hours, t.amount, tl.hours AS hours_logged, p.job_id, p.hourly_rate "; $sql .= ", tl.create_user_id AS logged_user_id"; $sql .= " FROM `" . _DB_PREFIX . "task_log` tl "; $sql .= " LEFT JOIN `" . _DB_PREFIX . "task` t ON tl.task_id = t.task_id "; $sql .= " LEFT JOIN `" . _DB_PREFIX . "job` p ON tl.job_id = p.job_id"; $sql .= " WHERE 1 "; $sql .= " AND ( tl.create_user_id = " . (int) $staff_member['user_id'] . " )"; //t.user_id = ".(int)$staff_member['user_id'] . " OR if (isset($search['date_from']) && $search['date_from']) { $sql .= " AND tl.log_time >= '" . strtotime(input_date($search['date_from']) . " 00:00:00") . "'"; } if (isset($search['date_to']) && $search['date_to']) { $sql .= " AND tl.log_time <= '" . strtotime(input_date($search['date_to']) . " 23:59:59") . "'"; } //echo $sql; $tasks = query($sql); while ($r = mysql_fetch_assoc($tasks)) { //print_r($r); $jobtasks = module_job::get_tasks($r['job_id']); $statistics[$staff_member['user_id']]['job_ids'][$r['job_id']] = true; $task = $jobtasks[$r['task_id']]; // this user has been assiged to this job individual task. if ($task['fully_completed']) { $statistics[$staff_member['user_id']]['task_complete_ids'][$r['task_id']] = true; $statistics[$staff_member['user_id']]['hours_billed'] += $r['task_hours']; if ($task['amount'] > 0) { $statistics[$staff_member['user_id']]['amount_billed'] += $task['amount']; } else { $statistics[$staff_member['user_id']]['amount_billed'] += $r['task_hours'] * $r['hourly_rate']; } $sql = "SELECT * FROM `" . _DB_PREFIX . "invoice_item` ii WHERE ii.task_id = " . (int) $r['task_id']; $task_invoice = qa1($sql); if ($task_invoice && $task_invoice['task_id'] == $r['task_id']) { if ($task_invoice['amount'] > 0) { $statistics[$staff_member['user_id']]['amount_invoiced'] += $task_invoice['amount']; } else { $statistics[$staff_member['user_id']]['amount_invoiced'] += $task_invoice['hours'] * $task_invoice['hourly_rate']; } } } $statistics[$staff_member['user_id']]['task_ids'][$r['task_id']] = true; $statistics[$staff_member['user_id']]['hours_logged'] += $r['hours_logged']; } //$statistics[$staff_member['user_id']]['job_count'] = count($statistics[$staff_member['user_id']]['job_ids']); } return $statistics; }
<form action="" method="post" id="product_form"> <input type="hidden" name="_process" value="save_product" /> <input type="hidden" name="product_id" value="<?php echo $product_id; ?> " /> <?php module_form::set_required(array('fields' => array('name' => 'Name'))); module_form::prevent_exit(array('valid_exits' => array('.submit_button'))); $fieldset_data = array('heading' => array('type' => 'h3', 'title' => 'Product Information'), 'class' => 'tableclass tableclass_form tableclass_full', 'elements' => array()); $fieldset_data['elements'][] = array('title' => 'Name', 'fields' => array(array('type' => 'text', 'name' => 'name', 'value' => $product['name']))); $fieldset_data['elements'][] = array('title' => 'Category', 'fields' => array(array('type' => 'select', 'name' => 'product_category_id', 'options' => module_product::get_product_categories(), 'options_array_id' => 'product_category_name', 'value' => $product['product_category_id']))); $fieldset_data['elements'][] = array('title' => 'Hours/Quantity', 'fields' => array(array('type' => 'text', 'name' => 'quantity', 'value' => $product['quantity']))); $fieldset_data['elements'][] = array('title' => 'Amount', 'fields' => array(array('type' => 'currency', 'name' => 'amount', 'value' => $product['amount']))); $fieldset_data['elements'][] = array('title' => 'Description', 'fields' => array(array('type' => 'textarea', 'name' => 'description', 'value' => $product['description']))); $types = module_job::get_task_types(); $types['-1'] = _l('Default'); $fieldset_data['elements'][] = array('title' => 'Task Type', 'fields' => array(array('type' => 'select', 'name' => 'default_task_type', 'options' => $types, 'value' => isset($product['default_task_type']) ? $product['default_task_type'] : -1, 'blank' => false))); $fieldset_data['elements'][] = array('title' => 'Billable', 'fields' => array(array('type' => 'checkbox', 'name' => 'billable', 'value' => isset($product['billable']) ? $product['billable'] : 1))); $fieldset_data['elements'][] = array('title' => 'Taxable', 'fields' => array(array('type' => 'checkbox', 'name' => 'taxable', 'value' => isset($product['taxable']) ? $product['taxable'] : 1))); echo module_form::generate_fieldset($fieldset_data); unset($fieldset_data); $form_actions = array('class' => 'action_bar action_bar_center', 'elements' => array(array('type' => 'save_button', 'name' => 'butt_save', 'value' => _l('Save')), array('ignore' => !(int) $product_id, 'type' => 'delete_button', 'name' => 'butt_del', 'value' => _l('Delete')), array('type' => 'button', 'name' => 'cancel', 'value' => _l('Cancel'), 'class' => 'submit_button', 'onclick' => "window.location.href='" . $module->link_open(false) . "';"))); echo module_form::generate_form_actions($form_actions); ?> </form>
if (module_job::can_i('edit', 'Job Tasks')) { $task_editable = true; } else { $task_editable = false; } echo module_job::generate_task_preview($job_id, $job, $task_id, $task_data, $task_editable); } ?> </tbody> </table> <?php if ((int) $job_id > 0) { ?> <div id="job_summary"> <?php echo module_job::generate_job_summary($job_id, $job, $show_hours_summary); ?> </div> <?php } ?> </div> <?php $fieldset_data = array('heading' => $header, 'elements_before' => ob_get_clean()); echo module_form::generate_fieldset($fieldset_data); } // end can i view job tasks if (module_invoice::can_i('view', 'Invoices') && (int) $job_id > 0) { ?>
$related_job = module_job::get_job($file['job_id'], false, true); if ($related_job && $related_job['job_id'] == $file['job_id']) { $related_customer = module_customer::get_customer($related_job['customer_id'], true); if ($related_customer && $related_customer['customer_id'] == $related_job['customer_id']) { $c[$file['job_id']] = _l('%s (from %s)', $related_job['name'], $related_customer['customer_name']); } else { $file['job_id'] = false; } } else { $file['job_id'] = false; } } $fieldset_data['elements'][] = array('title' => 'Job', 'fields' => array(array('type' => 'select', 'name' => 'job_id', 'value' => $file['job_id'], 'options' => $c), function () use(&$file) { if ($file['job_id']) { echo ' '; echo '<a href="' . module_job::link_open($file['job_id'], false) . '">' . _l('Open Job »') . '</a>'; } })); } if (class_exists('module_quote', false) && module_quote::is_plugin_enabled()) { $c = array(); $res = module_quote::get_quotes(array('customer_id' => $file['customer_id'])); foreach ($res as $row) { $c[$row['quote_id']] = $row['name']; } if ($file['quote_id'] && !isset($c[$file['quote_id']])) { // this file is related to another quote. from another customer. $related_quote = module_quote::get_quote($file['quote_id'], false, true); if ($related_quote && $related_quote['quote_id'] == $file['quote_id']) { $related_customer = module_customer::get_customer($related_quote['customer_id'], true); if ($related_customer && $related_customer['customer_id'] == $related_quote['customer_id']) {
} ?> <?php echo _l('%s of %s hours have been logged:', $completed_value, $hours_value); ?> <input type="hidden" name="job_task[<?php echo $task_id; ?> ][completed]" value="<?php echo $task_data['completed']; ?> "> <br/> <?php // show a log of any existing hours against this task. $task_logs = module_job::get_task_log($task_id); foreach ($task_logs as $task_log) { if (function_exists('decimal_time_out')) { $hours_value = decimal_time_out($task_log['hours']); } else { $hours_value = number_out($task_log['hours'], true); } echo _l('%s hrs <span class="text_shrink">%s</a> - <span class="text_shrink">%s</span>', $hours_value, print_date($task_log['log_time'], true), $staff_member_rel[$task_log['create_user_id']]); ?> <a href="#" class="error_text" onclick="return delete_task_hours(<?php echo $task_id; ?> ,<?php echo $task_log['task_log_id']; ?> );">x</a> <?php
foreach ($job_reports as $original_job_data) { $job_data = module_job::get_job($original_job_data['job_id'], true); $total['total_hours'] += $job_data['total_hours']; if (!isset($total['total_amount_invoicable'][$job_data['currency_id']])) { $total['total_amount_invoicable'][$job_data['currency_id']] = 0; } $total['total_amount_invoicable'][$job_data['currency_id']] += $job_data['total_amount']; ?> <tr class="<?php echo $c++ % 2 ? "odd" : "even"; ?> "> <td> <?php echo module_job::link_open($job_data['job_id'], true, $job_data); ?> <?php if (isset($original_job_data['renew_from_job_id'])) { _e('(will renew on %s)', print_date($original_job_data['date_start'])); } ?> </td> <td> <?php echo module_website::link_open($original_job_data['website_id'], true); ?> </td>
$c = 0; $task_number = 0; foreach ($job_tasks as $task_id => $task_data) { $task_number++; if (module_security::is_page_editable() && module_job::can_i('edit', 'Job Tasks')) { ?> <tbody id="task_edit_<?php echo $task_id; ?> " style="display:none;" class="task_edit"></tbody> <?php } else { $task_editable = false; } echo module_job::generate_task_preview($job_id, $job, $task_id, $task_data, false, array('from_quote' => isset($_REQUEST['from_quote_id']))); ?> <input type="hidden" name="job_task[new<?php echo $task_number; ?> ][description]" value="<?php echo htmlspecialchars($task_data['description']); ?> "> <input type="hidden" name="job_task[new<?php echo $task_number; ?> ][long_description]" value="<?php echo htmlspecialchars($task_data['long_description']); ?>
<td><?php if ($finance['invoice_id']) { $invoice_data = module_invoice::get_invoice($finance['invoice_id']); echo module_invoice::link_open($finance['invoice_id'], true, $invoice_data); } else { _e('N/A'); } ?> </td> <td><?php if (isset($finance['job_id']) && $finance['job_id']) { echo module_job::link_open($finance['job_id'], true); } else { if ($finance['invoice_id'] && count($invoice_data['job_ids'])) { foreach ($invoice_data['job_ids'] as $job_id) { echo module_job::link_open($job_id, true) . ' '; } } else { _e('N/A'); } } ?> </td> <?php foreach ($currencies as $currency_id) { $currency = get_single('currency', 'currency_id', $currency_id); if (!isset($search['type']) || $search['type'] == 'ie' || $search['type'] == 'i') { ?> <td> <?php
$show_split_hours = false; $task_decimal_places = module_config::c('task_amount_decimal_places', -1); if ($task_decimal_places < 0) { $task_decimal_places = false; // use default currency dec places. } $task_decimal_places_trim = module_config::c('task_amount_decimal_places_trim', 0); if (module_job::job_task_has_split_hours($job_id, $job, $task_id, $task_data)) { if ($task_data['staff_split']) { // has saved this task - using database detauls } else { // use defaults above. $task_data['staff_hours'] = $task_data['hours']; $task_data['staff_amount'] = $task_data['amount']; } if (module_job::can_i('view', 'Job Split Pricing')) { $show_split_hours = true; // do we show the staff_ settings or default them to the job settings? } else { $hours_prefix = 'staff_'; } } ?> <tr class="task_row_<?php echo $task_id; ?> task_preview<?php echo $percentage >= 1 ? ' tasks_completed' : ''; ?> <?php echo $task_editable ? ' task_editable' : '';
</li> </ol> </fieldset> <fieldset> <legend>Project Details</legend> <ol> <li> <label for="website[url]">Website Address</label> <input type="text" id="website[url]" name="website[url]" /> </li> <li> <fieldset> <legend>Which of the below services do you require? <span class="required">*</span></legend> <?php $has_type = false; foreach (module_job::get_types() as $type_id => $type) { $has_type = true; ?> <label><input type="checkbox" name="job[type][<?php echo htmlspecialchars($type_id); ?> ]" value="<?php echo htmlspecialchars($type); ?> " /> <?php echo htmlspecialchars($type); ?> </label> <?php } if ($has_type) {
public function get_data() { if (count($this->_get_data_cache)) { return $this->_get_data_cache; } $file = false; if ($this->file_id > 0) { $file = get_single("file", "file_id", $this->file_id); } // check user has permissions to view this file. // for now we just base this on the customer id check if ($file) { // staff listing $staff = get_multiple('file_user_rel', array('file_id' => $file['file_id']), 'user_id'); $file['staff_ids'] = array_keys($staff); $file['type'] = isset($file['file_url']) && $file['file_url'] ? 'remote' : (isset($file['bucket']) && $file['bucket'] ? 'bucket' : 'upload'); if ($this->do_permissions) { switch (module_file::get_file_data_access()) { case _FILE_ACCESS_ALL: // all files, no limits on SQL here break; case _FILE_ACCESS_JOBS: $jobs = module_job::get_jobs(array(), array('columns' => 'u.job_id AS id')); if (!$file['job_id'] || !isset($jobs[$file['job_id']])) { $file = false; } break; case _FILE_ACCESS_ME: if ($file['create_user_id'] != module_security::get_loggedin_id()) { $file = false; } break; case _FILE_ACCESS_ASSIGNED: if (!in_array(module_security::get_loggedin_id(), $file['staff_ids'])) { $file = false; } break; case _FILE_ACCESS_CUSTOMERS: default: if (class_exists('module_customer', false)) { //added for compat in newsletter system that doesn't have customer module $customer_permission_check = module_customer::get_customer($file['customer_id']); if ($customer_permission_check['customer_id'] != $file['customer_id']) { $file = false; } } } // file data access switch } } if (!$file) { $file = array('new' => true, 'type' => 'upload', 'file_id' => 0, 'customer_id' => isset($_REQUEST['customer_id']) ? $_REQUEST['customer_id'] : 0, 'job_id' => isset($_REQUEST['job_id']) ? $_REQUEST['job_id'] : 0, 'quote_id' => isset($_REQUEST['quote_id']) ? $_REQUEST['quote_id'] : 0, 'description' => '', 'status' => module_config::c('file_default_status', 'Uploaded'), 'file_name' => '', 'file_url' => '', 'staff_ids' => array(), 'bucket' => 0, 'bucket_parent_file_id' => 0, 'approved_time' => 0); } $this->_get_data_cache = $file; return $file; }
public static function get_types() { $sql = "SELECT `type` FROM `" . _DB_PREFIX . "quote` GROUP BY `type` ORDER BY `type`"; $statuses = module_job::get_types(); foreach (qa($sql) as $r) { $statuses[$r['type']] = $r['type']; } return $statuses; }
</tbody> </table> </div> <?php $fieldset_data = array('heading' => array('title' => _l('Invoice Payment History'), 'type' => 'h3'), 'elements_before' => ob_get_clean()); echo module_form::generate_fieldset($fieldset_data); unset($fieldset_data); if (class_exists('module_finance', false) && module_finance::is_plugin_enabled() && module_finance::can_i('view', 'Finance') && module_finance::is_enabled() && is_file('includes/plugin_finance/pages/finance_invoice_edit.php') && module_config::c('invoice_show_finances', 1)) { include 'includes/plugin_finance/pages/finance_invoice_edit.php'; } } // invoice_id check hook_handle_callback('layout_column_half', 'end'); $form_actions = array('class' => 'action_bar action_bar_left', 'elements' => array(array('type' => 'save_button', 'name' => 'butt_save', 'onclick' => "\$('#form_redirect').val('" . (!$invoice_id && isset($_REQUEST['job_id']) && (int) $_REQUEST['job_id'] > 0 ? module_job::link_open($_REQUEST['job_id']) : module_invoice::link_open(false)) . "');", 'value' => _l('Save and Return')), array('type' => 'save_button', 'name' => 'butt_save', 'value' => _l('Save')))); if ((int) $invoice_id) { if ($invoice['date_paid'] && $invoice['date_paid'] != '0000-00-00') { $form_actions['elements'][] = array('type' => 'save_button', 'class' => 'submit_button', 'name' => 'butt_email', 'value' => _l('Email Receipt')); } else { $form_actions['elements'][] = array('type' => 'submit', 'class' => 'submit_button', 'name' => 'butt_email', 'value' => _l('Email Invoice')); } if (function_exists('convert_html2pdf')) { if (!module_invoice::can_i('edit', 'Invoices')) { $form_actions['elements'][] = array('type' => 'button', 'class' => 'submit_button no_permissions', 'name' => 'butt_print', 'value' => _l('Print PDF'), 'onclick' => "window.location.href='" . module_invoice::link_public_print($invoice_id) . "';"); } else { $form_actions['elements'][] = array('type' => 'submit', 'class' => 'submit_button', 'name' => 'butt_print', 'value' => _l('Print PDF')); } } } if ((int) $invoice_id && module_invoice::can_i('delete', 'Invoices')) {
public static function hook_filter_var_job_list($call, $attributes) { if (!is_array($attributes)) { $attributes = array(); } foreach (module_job::get_jobs(array('customer_id' => isset($_REQUEST['customer_id']) ? (int) $_REQUEST['customer_id'] : false), array('columns' => 'u.job_id, u.name')) as $job) { $attributes[$job['job_id']] = $job['name']; } return $attributes; }
function handle_hook($hook, $calling_module = false, $owner_table = false, $key_name = false, $key_value = false, $rel_data = false) { switch ($hook) { case "home_alerts": $alerts = array(); if (module_config::c('allow_note_reminders', 1)) { // find any jobs that are past the due date and dont have a finished date. $key = _l('Note Reminder'); if (class_exists('module_dashboard', false)) { module_dashboard::register_group($key, array('columns' => array('name' => _l('Reminder'), 'type' => _l('Type'), 'full_link' => _l('Link'), 'date' => _l('Date'), 'days' => _l('Date')))); } $sql = "SELECT * FROM `" . _DB_PREFIX . "note` n "; $sql .= " WHERE n.`reminder` = 1 AND n.note_time < " . (int) strtotime('+' . module_config::c('alert_days_in_future', 5) . ' days') . ""; $sql .= " AND ( n.`user_id` = 0 OR n.`user_id` = " . module_security::get_loggedin_id() . ")"; $sql .= " ORDER BY n.note_time ASC"; $tasks = qa($sql); foreach ($tasks as $task) { $alert_res = process_alert(date('Y-m-d', $task['note_time']), $key); if ($alert_res) { $alert_res['link'] = $task['rel_data']; // fix for linking when changing folder. $alert_res['type'] = _l(ucwords($task['owner_table'])); switch ($task['owner_table']) { case 'user': $user = module_user::get_user($task['owner_id']); if ($user['customer_id'] || $user['vendor_id']) { $alert_res['link'] = module_user::link_open_contact($task['owner_id'], false, $user); $alert_res['full_link'] = module_user::link_open_contact($task['owner_id'], true, $user); $alert_res['type'] = _l('Contact'); } else { $alert_res['link'] = module_user::link_open($task['owner_id'], false, $user); $alert_res['full_link'] = module_user::link_open($task['owner_id'], true, $user); } break; case 'invoice': $invoice_data = module_invoice::get_invoice($task['owner_id'], true); if (!$invoice_data || !isset($invoice_data['invoice_id']) || $invoice_data['invoice_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_invoice::link_open($task['owner_id'], false, $invoice_data); $alert_res['full_link'] = module_invoice::link_open($task['owner_id'], true, $invoice_data); break; case 'quote': $quote_data = module_quote::get_quote($task['owner_id'], true); if (!$quote_data || !isset($quote_data['quote_id']) || $quote_data['quote_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_quote::link_open($task['owner_id'], false, $quote_data); $alert_res['full_link'] = module_quote::link_open($task['owner_id'], true, $quote_data); break; case 'website': $website_data = module_website::get_website($task['owner_id']); if (!$website_data || !isset($website_data['website_id']) || $website_data['website_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_website::link_open($task['owner_id'], false); $alert_res['full_link'] = module_website::link_open($task['owner_id'], true); break; case 'customer': $customer_data = module_customer::get_customer($task['owner_id']); if (!$customer_data || !isset($customer_data['customer_id']) || $customer_data['customer_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_customer::link_open($task['owner_id'], false, $customer_data); $alert_res['full_link'] = module_customer::link_open($task['owner_id'], true, $customer_data); break; case 'vendor': $vendor_data = module_vendor::get_vendor($task['owner_id']); if (!$vendor_data || !isset($vendor_data['vendor_id']) || $vendor_data['vendor_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_vendor::link_open($task['owner_id'], false, $vendor_data); $alert_res['full_link'] = module_vendor::link_open($task['owner_id'], true, $vendor_data); break; case 'job': $job_data = module_job::get_job($task['owner_id']); if (!$job_data || !isset($job_data['job_id']) || $job_data['job_id'] != $task['owner_id']) { continue 2; } $alert_res['link'] = module_job::link_open($task['owner_id'], false, $job_data); $alert_res['full_link'] = module_job::link_open($task['owner_id'], true, $job_data); break; // todo - add others. } $alert_res['name'] = $task['note']; $alert_res['date'] = print_date($alert_res['date']); $alert_res['time'] = $task['note_time']; $alerts[] = $alert_res; } } } return $alerts; break; /*case "note_list": if($owner_id && $owner_id != 'new'){ $note_items = $this->get_notes(array("owner_table"=>$owner_table,"owner_id"=>$owner_id)); foreach($note_items as &$note_item){ // do it in loop here because of $this issues in static method below. // instead of include file below. $note_item['html'] = $this->print_note($note_item['note_id']); } include("pages/note_list.php"); }else{ echo 'Please save first before creating notes.'; } break;*/ /*case "note_list": if($owner_id && $owner_id != 'new'){ $note_items = $this->get_notes(array("owner_table"=>$owner_table,"owner_id"=>$owner_id)); foreach($note_items as &$note_item){ // do it in loop here because of $this issues in static method below. // instead of include file below. $note_item['html'] = $this->print_note($note_item['note_id']); } include("pages/note_list.php"); }else{ echo 'Please save first before creating notes.'; } break;*/ case "note_delete": // find the key we are saving this address against. $owner_id = (int) $key_value; if (!$owner_id || $owner_id == 'new') { // find one in the post data. if (isset($_REQUEST[$key_name])) { $owner_id = $_REQUEST[$key_name]; } } $note_hash = md5($owner_id . '|' . $owner_table); // just for posting unique arrays. if ($owner_table && $owner_id) { $this->note_delete($owner_table, $owner_id); } break; } }
if (isset($invoice['website_ids'])) { foreach ($invoice['website_ids'] as $website_id) { if ((int) $website_id > 0) { echo module_website::link_open($website_id, true); echo '<br/>'; } } } }); } if (module_job::is_plugin_enabled() && module_job::can_i('view', 'Jobs')) { $columns['invoice_job'] = array('title' => 'Job', 'callback' => function ($invoice) { foreach ($invoice['job_ids'] as $job_id) { if ((int) $job_id > 0) { echo module_job::link_open($job_id, true); $job_data = module_job::get_job($job_id); if ($job_data['date_start'] && $job_data['date_start'] != '0000-00-00' && $job_data['date_renew'] && $job_data['date_renew'] != '0000-00-00') { _e(' (%s to %s)', print_date($job_data['date_start']), print_date(strtotime("-1 day", strtotime($job_data['date_renew'])))); } echo "<br/>\n"; } } hook_handle_callback('invoice_admin_list_job', $invoice['invoice_id']); }); } if (!isset($_REQUEST['customer_id']) && module_customer::can_i('view', 'Customers')) { $colspan++; $columns['invoice_customer'] = array('title' => 'Customer', 'callback' => function ($invoice) { echo module_customer::link_open($invoice['customer_id'], true); }); }