public function is_allowed_for_invoice($invoice_id) { if (!self::is_enabled()) { return false; } $old_default = module_config::c('__inv_google_' . $invoice_id); if ($old_default !== false) { $this->set_allowed_for_invoice($invoice_id, $old_default); delete_from_db('config', 'key', '__inv_google_' . $invoice_id); module_cache::clear('config'); return $old_default; } // check for manually enabled invoice payment method. $invoice_payment_methods = module_invoice::get_invoice_payment_methods($invoice_id); if (isset($invoice_payment_methods['google'])) { return $invoice_payment_methods['google']['enabled']; } return module_config::c('payment_method_google_enabled_default', 1); }
public function is_allowed_for_invoice($invoice_id) { if (!self::is_enabled()) { return false; } $old_default = module_config::c('__inv_coinbase_' . $invoice_id); if ($old_default !== false) { $this->set_allowed_for_invoice($invoice_id, $old_default); delete_from_db('config', 'key', '__inv_coinbase_' . $invoice_id); module_cache::clear('config'); return $old_default; } // check for manually enabled invoice payment method. $invoice_payment_methods = module_invoice::get_invoice_payment_methods($invoice_id); if (isset($invoice_payment_methods['coinbase'])) { return $invoice_payment_methods['coinbase']['enabled']; } // check currency and value amounts $invoice_data = module_invoice::get_invoice($invoice_id); $cur = trim(strtolower(module_config::c('payment_method_coinbase_currency', ''))); $dollar_limit = module_config::c('payment_method_coinbase_limit_type', 'above'); $dollar_value = module_config::c('payment_method_coinbase_limit_value', 0); if ($dollar_limit == 'above' && $invoice_data['total_amount_due'] < $dollar_value) { return false; } else { if ($dollar_limit == 'below' && $invoice_data['total_amount_due'] > $dollar_value) { return false; } } if (strlen($cur) > 1) { $allowed_currencies = explode(',', $cur); if (count($allowed_currencies)) { $currency = module_config::get_currency($invoice_data['currency_id']); if (!in_array(strtolower($currency['code']), $allowed_currencies)) { return false; } } } return module_config::c('payment_method_coinbase_enabled_default', 1); }
public function run_cron($debug = false) { // we only want to perform these cron actions if we're after a certain time of day // because we dont want to be generating these renewals and sending them at midnight, can get confusing $after_time = module_config::c('invoice_automatic_after_time', 7); $time_of_day = date('G'); if ($time_of_day < $after_time) { if ($debug) { echo "Not performing automatic invoice operations until after {$after_time}:00 - it is currently {$time_of_day}:" . date('i') . "<br>\n"; } return; } // find automaitic invoice overdues $sql = "SELECT * FROM `" . _DB_PREFIX . "invoice` "; $sql .= " WHERE date_due != '0000-00-00' AND date_due <= '" . date('Y-m-d') . "' AND date_paid = '0000-00-00' AND date_cancel = '0000-00-00'"; $invoice_items = qa($sql); if ($debug) { echo "Processing " . count($invoice_items) . " overdue invoices: <br>\n"; } foreach ($invoice_items as $invoice_item) { module_cache::clear('invoice'); $invoice = module_invoice::get_invoice($invoice_item['invoice_id']); if ($invoice['overdue'] && $invoice['overdue_email_auto']) { if ($debug) { echo "Processing overdue for invoice: " . module_invoice::link_open($invoice['invoice_id'], true) . " <br>\n"; } if ($debug) { echo " - last sent: " . $invoice['date_sent'] . " <br>\n"; } if ($debug) { echo " - due date: " . $invoice['date_due'] . " <br>\n"; } if ($debug) { echo " - now: " . date('Y-m-d') . " ( " . time() . " ) <br>\n"; } // if you change this calculation make sure it is changed in the dashboard alerts above to $send_email_on = false; if ($invoice['date_sent'] && $invoice['date_sent'] != '0000-00-00' && strtotime($invoice['date_sent']) > strtotime($invoice['date_due'])) { // we have sent a reminder already (todo: this isn't correct logic, fix it up so it can tell for sure if we have sent a reminder already or not (eg: look through email history table) $last_invoice_sent = strtotime($invoice['date_sent']); if (module_config::c('overdue_email_auto_days_repeat', 7) <= 0) { continue; // skip sendin repeat reminders. } $send_email_on = strtotime('+' . module_config::c('overdue_email_auto_days_repeat', 7) . ' days', $last_invoice_sent); } else { if ($invoice['date_sent'] && $invoice['date_sent'] != '0000-00-00') { $invoice_is_due = strtotime($invoice['date_due']); $send_email_on = strtotime('+' . module_config::c('overdue_email_auto_days', 3) . ' days', $invoice_is_due); if ($debug) { echo module_config::c('overdue_email_auto_days', 3) . " days from " . $invoice['date_due'] . " is " . date('Y-m-d', $send_email_on) . "<br>\n"; } } else { // this invoice has not been sent yet, so we don't send an automated overdue notice. // the user has to pick a "sent datE" before the system will send overdue notices. if ($debug) { echo " - NOT Sending Overdue Invoice Notice for " . module_invoice::link_open($invoice['invoice_id'], true) . " because it has no SENT DATE.<br>\n"; } $send_email_on = false; } } if ($invoice['date_sent'] && $invoice['date_sent'] != '0000-00-00' && date('Y-m-d', $send_email_on) == $invoice['date_sent']) { if ($debug) { echo " - NOT Sending Overdue Invoice Notice for " . module_invoice::link_open($invoice['invoice_id'], true) . " because it was last sent today already.<br>\n"; } $send_email_on = false; } if ($send_email_on !== false && $debug) { echo " - will send next invoice at: " . date('Y-m-d', $send_email_on) . " ( {$send_email_on} ) <br>\n"; } if ($send_email_on !== false && $send_email_on <= strtotime(date('Y-m-d'))) { if ($debug) { echo " - Automatically Sending Overdue Invoice Notice for " . module_invoice::link_open($invoice['invoice_id'], true) . "<br>\n"; } if ($debug) { echo " - Emailing invoice to customer..."; } if (module_invoice::email_invoice_to_customer($invoice['invoice_id'], $debug)) { if ($debug) { echo "sent successfully<br>\n"; } } else { echo "sending overdue invoice email failed for " . module_invoice::link_open($invoice['invoice_id'], true) . "<br>\n"; } if ($debug) { echo "<br>\n"; } } } } // find automatic invoice renewals $sql = "SELECT i.* FROM `" . _DB_PREFIX . "invoice` i "; $sql .= " WHERE i.date_renew != '0000-00-00'"; $sql .= " AND i.date_create != '0000-00-00'"; $sql .= " AND i.date_cancel = '0000-00-00'"; $sql .= " AND i.date_renew <= '" . date('Y-m-d') . "'"; $sql .= " AND (i.renew_invoice_id IS NULL OR i.renew_invoice_id = 0)"; $sql .= " AND (i.renew_auto = 1)"; $renew_invoices = qa($sql); foreach ($renew_invoices as $renew_invoice) { // time to automatically renew this invoice! woo! if ($debug) { echo "Automatically Renewing invoice " . module_invoice::link_open($renew_invoice['invoice_id'], true) . "<br>\n"; } $invoice_data = module_invoice::get_invoice($renew_invoice['invoice_id']); if (module_config::c('invoice_auto_renew_only_paid_invoices', 1) && $invoice_data['total_amount_due'] > 0) { // invoice hasnt been paid, dont continue with renewl if ($debug) { echo "NOT RENEWING INVOICE because it hasn't been paid yet !!! <br>\n"; } } else { $new_invoice_id = $this->renew_invoice($renew_invoice['invoice_id']); if ($new_invoice_id) { //module_cache::clear_cache(); if ($debug) { echo "invoice Automatically Renewed: " . module_invoice::link_open($new_invoice_id, true) . "<br>\n"; } if ($renew_invoice['renew_email']) { if ($debug) { echo "Emailing invoice to customer..."; } if (module_invoice::email_invoice_to_customer($new_invoice_id, $debug)) { if ($debug) { echo "send successfully"; } } else { echo "sending renewed invoice email failed for " . module_invoice::link_open($new_invoice_id, true) . "<br>\n"; } if ($debug) { echo "<br>\n"; } } } } } }
private static function update_job_completion_status($job_id) { module_cache::clear('job'); //module_cache::clear_cache(); $data = self::save_job_cache($job_id); $return_status = $data['status']; $tasks = self::get_tasks($job_id); $all_completed = count($tasks) > 0; foreach ($tasks as $task) { if (module_config::c('job_task_log_all_hours', 1) && $task['fully_completed'] || !module_config::c('job_task_log_all_hours', 1) && ($task['fully_completed'] || $task['hours'] > 0 && $task['completed'] >= $task['hours'] || $task['hours'] <= 0 && $task['completed'] > 0)) { // this one is done! } else { $all_completed = false; break; } } if ($all_completed) { if (!isset($data['date_completed']) || !$data['date_completed'] || $data['date_completed'] == '0000-00-00') { // update, dont complete if no tasks. //if(count($tasks)){ $return_status = $data['status'] == module_config::s('job_status_default', 'New') ? _l('Completed') : $data['status']; update_insert("job_id", $job_id, "job", array('date_completed' => date('Y-m-d'), 'status' => $return_status)); //} } } else { // not completed. remove compelted date and reset the job status $return_status = $data['status'] == _l('Completed') ? module_config::s('job_status_default', 'New') : $data['status']; update_insert("job_id", $job_id, "job", array('date_completed' => '0000-00-00', 'status' => $return_status)); } module_cache::clear('job'); return $return_status; }
private static function update_quote_completion_status($quote_id) { //module_cache::clear_cache(); module_cache::clear('quote'); $data = self::get_quote($quote_id); // save our cacheable items foreach (array('total_amount_invoicable') as $cacheable_item) { if (isset($data[$cacheable_item])) { // cacheable items can be the same name or prefixed with c_ update_insert('quote_id', $quote_id, 'quote', array($cacheable_item => $data[$cacheable_item], "c_{$cacheable_item}" => $data[$cacheable_item])); } } $return_status = $data['status']; module_cache::clear('quote'); return $return_status; }
* Envato: 4ffca17e-861e-4921-86c3-8931978c40ca * Package Date: 2015-11-25 02:55:20 * IP Address: 67.79.165.254 */ $autoreply_queue = array(); //set_time_limit(10); // find all the mail setting accounts to check. foreach (module_ticket::get_accounts() as $account) { $updated_tickets = module_ticket::import_email($account['ticket_account_id']); if (is_array($updated_tickets)) { $autoreply_queue = array_merge($autoreply_queue, $updated_tickets); } } imap_errors(); //print_r($autoreply_queue); module_cache::clear('ticket'); foreach ($autoreply_queue as $ticket_id) { ob_start(); handle_hook('ticket_sidebar', $ticket_id); // to get envato hook working quicker ob_end_clean(); // we have to send the email to admin notifying them about this ticket too. // if this latest email came from an admin user (ie: the user is replying to a customer via email) // then we don't send_admin_alert or autoreply, we just send reply back to customer. $ticket_data = module_ticket::get_ticket($ticket_id); $last_ticket_message = module_ticket::get_ticket_message($ticket_data['last_ticket_message_id']); $admins_rel = module_ticket::get_ticket_staff_rel(); // if the last email was from admin, send customer alert. if (isset($admins_rel[$last_ticket_message['from_user_id']])) { // echo "sending a customer alert "; // print_r($last_ticket_message);
public function complete_plugin_installation($plugin_name) { global $plugins; $result = array('message' => ''); $new_system_version = module_config::current_version(); $fail = false; if (isset($plugins[$plugin_name])) { $result['message'] .= "Processing update: <span style='text-decoration:underline;'>" . $plugin_name . "</span> - Current Version: " . $plugins[$plugin_name]->get_plugin_version() . ".... "; ob_start(); if ($version = $plugins[$plugin_name]->install_upgrade()) { $result['message'] .= '<span class="success_text">all good</span>'; $new_system_version = max($version, $new_system_version); $plugins[$plugin_name]->init(); // lol typo - oh well. $plugins[$plugin_name]->set_insatlled_plugin_version($version); } else { $fail = true; $result['message'] .= '<span class="error_text">failed</span> '; } $result['message'] .= ob_get_clean() . '<br/>'; $result['message'] .= '<br/>'; if ($fail) { $result['message'] .= _('Some things failed. Please go back and try again.'); } else { $result['message'] .= '<strong>' . _l('Success! Everything worked.') . '</strong>'; module_config::set_system_version($new_system_version); module_config::save_config('last_update', time()); } if (isset($_SESSION['_message']) && count($_SESSION['_message'])) { $result['message'] .= '<br/>'; $result['message'] .= implode('<br/>', $_SESSION['_message']); unset($_SESSION['_errors']); } if (isset($_SESSION['_errors']) && count($_SESSION['_errors'])) { $result['message'] .= '<br/>'; $result['message'] .= implode('<br/>', $_SESSION['_errors']); unset($_SESSION['_errors']); } } else { if ($plugin_name == 'corefiles' || $plugin_name == 'database') { } else { $fail = true; } } // hack to clear db field cache: module_cache::clear('db'); if (!$fail) { $result['success'] = 1; } return $result; }
public static function remove_credit($customer_id, $credit, $note = false) { $customer_data = self::get_customer($customer_id); $customer_data['credit'] -= $credit; update_insert('customer_id', $customer_id, 'customer', array('credit' => $customer_data['credit'])); module_cache::clear('customer'); //self::add_history($customer_id,'Added '.dollar($credit).' credit to customers account.'); }
public function save_user($user_id, $data, $from_public = false) { $use_master_key = $this->get_contact_master_key(); if ($from_public) { $user_id = 0; } else { if ($use_master_key && isset($data[$use_master_key]) && $data[$use_master_key]) { if (!module_user::can_i('edit', 'Contacts', 'Customer')) { set_error('Unable to edit contacts.'); return false; } } else { if (!self::can_i('edit', 'Users', 'Config')) { set_error('Unable to edit users.'); return false; } } $user_id = (int) $user_id; } $temp_user = array(); if ($user_id > 0) { // check permissions $temp_user = $this->get_user($user_id, true, false); if (!$temp_user || $temp_user['user_id'] != $user_id || isset($temp_user['_perms'])) { $user_id = false; } } if (!$user_id && !$from_public) { if ($use_master_key && isset($data[$use_master_key]) && $data[$use_master_key]) { if (!module_user::can_i('create', 'Contacts', 'Customer')) { set_error('Unable to create new contacts.'); return false; } } else { if (!self::can_i('create', 'Users', 'Config')) { set_error('Unable to create new users.'); return false; } } } else { if ($user_id == 1 && module_security::get_loggedin_id() != 1) { set_error('Sorry only the administrator can modify this account'); } } // check the customer id is valid assignment to someone who has these perms. if (!$from_public) { if (isset($data['customer_id']) && (int) $data['customer_id'] > 0) { $temp_customer = module_customer::get_customer($data['customer_id']); if (!$temp_customer || $temp_customer['customer_id'] != $data['customer_id']) { unset($data['customer_id']); } } if (isset($data['vendor_id']) && (int) $data['vendor_id'] > 0) { $temp_vendor = module_vendor::get_vendor($data['vendor_id']); if (!$temp_vendor || $temp_vendor['vendor_id'] != $data['vendor_id']) { unset($data['vendor_id']); } } } if (isset($data['password'])) { unset($data['password']); } // we do the password hash thing here. if (isset($data['password_new']) && strlen($data['password_new'])) { // an admin is trying to set the password for this account. // same permissions checks as on the user_admin_edit_login.php page if (!$user_id || isset($temp_user['password']) && !$temp_user['password'] || module_user::can_i('create', 'Users Passwords', 'Config') || isset($_REQUEST['reset_password']) && $_REQUEST['reset_password'] == module_security::get_auto_login_string($user_id)) { // we allow the admin to set a new password without typing in previous password. $data['password'] = $data['password_new']; } else { set_error('Sorry, no permissions to set a new password.'); } } else { if ($user_id && isset($data['password_new1']) && isset($data['password_new2']) && strlen($data['password_new1'])) { // the user is trying to change their password. // only do this if the user has edit password permissions and their password matches. if (module_user::can_i('edit', 'Users Passwords', 'Config') || $user_id == module_security::get_loggedin_id()) { if (isset($data['password_old']) && (md5($data['password_old']) == $temp_user['password'] || $data['password_old'] == $temp_user['password'])) { // correct old password // verify new password. if ($data['password_new1'] == $data['password_new2']) { $data['password'] = $data['password_new1']; } else { set_error('Verified password mismatch. Password unchanged.'); } } else { set_error('Old password does not match. Password unchanged.'); } } else { set_error('No permissions to change passwords'); } } } // and we finally hash our password if (isset($data['password']) && strlen($data['password']) > 0) { $data['password'] = md5($data['password']); // if you change md5 also change it in customer import. // todo - salt? meh. } $user_id = update_insert("user_id", $user_id, "user", $data); $use_master_key = $this->get_contact_master_key(); // this will be customer_id or supplier_id if ($use_master_key && (isset($data[$use_master_key]) && $data[$use_master_key])) { if ($user_id) { if (isset($data['customer_primary']) && $data['customer_primary']) { // update the customer/supplier to mark them as primary or not.. switch ($use_master_key) { case 'customer_id': module_customer::set_primary_user_id($data['customer_id'], $user_id); break; case 'vendor_id': module_vendor::set_primary_user_id($data['vendor_id'], $user_id); break; } } else { // check if this contact was the old customer/supplier primary and switch ($use_master_key) { case 'customer_id': $customer_data = module_customer::get_customer($data['customer_id']); if ($customer_data['primary_user_id'] == $user_id) { module_customer::set_primary_user_id($data['customer_id'], 0); } break; case 'vendor_id': $vendor_data = module_vendor::get_vendor($data['vendor_id']); if ($vendor_data['primary_user_id'] == $user_id) { module_vendor::set_primary_user_id($data['vendor_id'], 0); } break; } } } } if (!$from_public) { // hack for linked user accounts. if ($user_id && isset($data['link_customers']) && $data['link_customers'] == 'yes' && isset($data['link_user_ids']) && is_array($data['link_user_ids']) && isset($data['email']) && $data['email']) { $others = module_user::get_contacts(array('email' => $data['email'])); foreach ($data['link_user_ids'] as $link_user_id) { if (!(int) $link_user_id) { continue; } if ($link_user_id == $user_id) { continue; } // shouldnt happen foreach ($others as $other) { if ($other['user_id'] == $link_user_id) { // success! they'renot trying to hack us. $sql = "REPLACE INTO `" . _DB_PREFIX . "user_customer_rel` SET user_id = '" . (int) $link_user_id . "', customer_id = '" . (int) $other['customer_id'] . "', `primary` = " . (int) $user_id; query($sql); update_insert('user_id', $link_user_id, 'user', array('linked_parent_user_id' => $user_id)); } } } update_insert('user_id', $user_id, 'user', array('linked_parent_user_id' => $user_id)); } if ($user_id && isset($data['unlink']) && $data['unlink'] == 'yes') { $sql = "DELETE FROM `" . _DB_PREFIX . "user_customer_rel` WHERE user_id = '" . (int) $user_id . "'"; query($sql); update_insert('user_id', $user_id, 'user', array('linked_parent_user_id' => 0)); } handle_hook("address_block_save", $this, "physical", "user", "user_id", $user_id); handle_hook("address_block_save", $this, "postal", "user", "user_id", $user_id); if (class_exists('module_extra', false) && module_extra::is_plugin_enabled()) { module_extra::save_extras('user', 'user_id', $user_id); } // find current role / permissions $user_data = $this->get_user($user_id); $previous_user_roles = $user_data['roles']; $re_save_role_perms = false; // hack to support only 1 role (we may support multi-role in the future) // TODO: check we have permissions to set this role id, otherwise anyone can set their own role. if (isset($_REQUEST['role_id'])) { $sql = "DELETE FROM `" . _DB_PREFIX . "user_role` WHERE user_id = '" . (int) $user_id . "'"; query($sql); if ((int) $_REQUEST['role_id'] > 0) { if (!isset($previous_user_roles[$_REQUEST['role_id']])) { $re_save_role_perms = (int) $_REQUEST['role_id']; } $_REQUEST['role'] = array($_REQUEST['role_id'] => 1); } } // save users roles (support for multi roles in future - but probably will never happen) if (isset($_REQUEST['role']) && is_array($_REQUEST['role'])) { foreach ($_REQUEST['role'] as $role_id => $tf) { $this->add_user_to_role($user_id, $role_id); } } if ($re_save_role_perms) { // copy role permissiosn to user permissions $sql = "DELETE FROM `" . _DB_PREFIX . "user_perm` WHERE user_id = " . (int) $user_id; query($sql); // update - we are not relying on these permissions any more. // if the user has a role assigned, we use those permissions period // we ignore all permissions in the user_perm table if the user has a role. // if the user doesn't have a role, then we use these user_perm permissions. /*$security_role = module_security::get_security_role($re_save_role_perms); foreach($security_role['permissions'] as $security_permission_id => $d){ $sql = "INSERT INTO `"._DB_PREFIX."user_perm` SET user_id = ".(int)$user_id.", security_permission_id = '".(int)$security_permission_id."'"; foreach(module_security::$available_permissions as $perm){ $sql .= ", `".$perm."` = ".(int)$d[$perm]; } query($sql); }*/ } else { if (isset($_REQUEST['permission']) && is_array($_REQUEST['permission'])) { $sql = "DELETE FROM `" . _DB_PREFIX . "user_perm` WHERE user_id = '" . (int) $user_id . "'"; query($sql); // update permissions for this user. foreach ($_REQUEST['permission'] as $security_permission_id => $permissions) { $actions = array(); foreach (module_security::$available_permissions as $permission) { if (isset($permissions[$permission]) && $permissions[$permission]) { $actions[$permission] = 1; } } $sql = "REPLACE INTO `" . _DB_PREFIX . "user_perm` SET user_id = '" . (int) $user_id . "', security_permission_id = '" . (int) $security_permission_id . "' "; foreach ($actions as $permission => $tf) { $sql .= ", `" . mysql_real_escape_string($permission) . "` = 1"; } query($sql); } } } /*global $plugins; if($user_id && isset($data['user_type_id']) && $data['user_type_id'] == 1 && $data['site_id']){ // update the site. $plugins['site']->set_primary_user_id($data['site_id'],$user_id); }else{ //this use isn't (or isnt any more) the sites primary user. // unset this if he was the primary user before $site_data = $plugins['site']->get_site($data['site_id']); if(isset($site_data['primary_user_id']) && $site_data['primary_user_id'] == $user_id){ $plugins['site']->set_primary_user_id($data['site_id'],0); } }*/ // save the company information if it's available if (class_exists('module_company', false) && module_company::can_i('edit', 'Company') && module_company::is_enabled() && module_user::can_i('edit', 'User')) { if (isset($_REQUEST['available_user_company']) && is_array($_REQUEST['available_user_company'])) { $selected_companies = isset($_POST['user_company']) && is_array($_POST['user_company']) ? $_POST['user_company'] : array(); foreach ($_REQUEST['available_user_company'] as $company_id => $tf) { if (!isset($selected_companies[$company_id]) || !$selected_companies[$company_id]) { // remove user from this company module_company::delete_user($company_id, $user_id); } else { // add user to this company (if they are not already existing) module_company::add_user_to_company($company_id, $user_id); } } } } } module_cache::clear('user'); return $user_id; }
public static function bulk_handle_status() { if (isset($_REQUEST['bulk_action']) && isset($_REQUEST['bulk_action']['status_resolved']) && $_REQUEST['bulk_action']['status_resolved'] == 'yes' && isset($_REQUEST['bulk_change_status_id']) && $_REQUEST['bulk_change_status_id'] > 0) { // confirm deletion of these tickets: $ticket_ids = isset($_REQUEST['bulk_operation']) && is_array($_REQUEST['bulk_operation']) ? $_REQUEST['bulk_operation'] : array(); foreach ($ticket_ids as $ticket_id => $k) { if ($k != 'yes') { unset($ticket_ids[$ticket_id]); } else { $ticket_ids[$ticket_id] = '#' . self::ticket_number($ticket_id); } } if (count($ticket_ids) > 0) { foreach ($ticket_ids as $ticket_id => $ticket_number) { update_insert('ticket_id', $ticket_id, 'ticket', array('status_id' => $_REQUEST['bulk_change_status_id'])); } module_cache::clear('ticket'); $statuses = self::get_statuses(); set_message(_l("%s tickets marked as %s", count($ticket_ids), $statuses[$_REQUEST['bulk_change_status_id']])); //redirect_browser(self::link_open(false)); } } }