public static function user_creation_notification($user_id, $args = array()) { $client_ids = SI_Client::get_clients_by_user($user_id); $client = !empty($client_ids) ? SI_Client::get_instance($client_ids[0]) : 0; $to = self::get_user_email($user_id); $data = array('user_id' => $user_id, 'client' => $client, 'user_args' => $args, 'to' => $to); self::send_notification('user_notification', $data, $to); }
/** * Create a project select list that are grouped by client. * @param integer $selected_id * @return string */ function si_projects_select($selected_id = 0, $client_id = 0, $blank = true, $el_id = 'doc_project') { $selections = array(); if ($client_id) { $client = SI_Client::get_instance($client_id); if (is_a($client, 'SI_Client')) { $projects = SI_Project::get_projects_by_client($client_id); $selections[$client->get_title()] = $projects; } } if (empty($selections)) { $args = array('post_type' => SI_Project::POST_TYPE, 'post_status' => 'any', 'posts_per_page' => -1, 'fields' => 'ids'); $projects = get_posts($args); foreach ($projects as $project_id) { $project = SI_Project::get_instance($project_id); $clients = $project->get_associated_clients(); foreach ($clients as $client_id) { $client = SI_Client::get_instance($client_id); if (is_a($client, 'SI_Client')) { if (!isset($selections[$client->get_title()])) { $selections[$client->get_title()] = array(); } $selections[$client->get_title()][] = $project_id; } else { // no client assigned $selections[si__('Client N/A')][] = $project_id; } } } } if (!empty($selections)) { $out = '<select name="' . $el_id . '" class="select2">'; if ($blank) { $out .= sprintf('<option value="0">%s</option>', si__('Select Project')); } foreach ($selections as $client => $projects) { $out .= sprintf('<optgroup label="%s">', $client); foreach ($projects as $project_id) { $out .= sprintf('<option value="%s" %s>%s</option>', $project_id, selected($project_id, $selected_id, false), get_the_title($project_id)); } $out .= '</optgroup>'; } $out .= '</select>'; } else { $out = '<span>' . sprintf(si__('No <a href="%s" target="_blank">projects</a> found'), admin_url('post-new.php?post_type=' . SI_Project::POST_TYPE)) . '</span>'; } echo $out; }
/** * Return the user object for the person responsible paying at the time of purchase. * @param SI_Invoice $invoice * @return object/false */ function si_default_client_user($client_id = 0) { if (!$client_id) { $client_id = get_the_id(); } $user = false; $client = SI_Client::get_instance($client_id); if (!is_wp_error($client)) { $client_users = $client->get_associated_users(); $client_user_id = array_shift($client_users); if ($client_user_id) { $user = get_userdata($client_user_id); } } return apply_filters('si_default_client_user', $user, $invoice); }
public static function create_invoice($invoice = array()) { $possible_dups = SI_Post_Type::find_by_meta(SI_Invoice::POST_TYPE, array(self::FRESHBOOKS_ID => $invoice['invoice_id'])); // Don't create a duplicate if this was already imported. if (!empty($possible_dups)) { do_action('si_error', 'Invoice imported already', $invoice['invoice_id']); return; } $clients = SI_Post_Type::find_by_meta(SI_Client::POST_TYPE, array(self::FRESHBOOKS_ID => $invoice['client_id'])); // Get client and confirm it's validity $client = SI_Client::get_instance($clients[0]); $client_id = is_a($client, 'SI_Client') ? $client->get_id() : 0; $args = array('subject' => isset($invoice['description']) ? $invoice['description'] : 'Freshbooks Import #' . $invoice['invoice_id']); $new_invoice_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP); update_post_meta($new_invoice_id, self::FRESHBOOKS_ID, $invoice['invoice_id']); $inv = SI_Invoice::get_instance($new_invoice_id); $inv->set_client_id($client_id); if (!is_array($invoice['number'])) { $inv->set_invoice_id($invoice['number']); } if (!is_array($invoice['amount'])) { $inv->set_total($invoice['amount']); } if (!is_array($invoice['currency_code'])) { $inv->set_currency($invoice['currency_code']); } if (!is_array($invoice['po_number'])) { $inv->set_po_number($invoice['po_number']); } if (!is_array($invoice['discount'])) { $inv->set_discount($invoice['discount']); } if (!is_array($invoice['notes'])) { $inv->set_notes($invoice['notes']); } if (!is_array($invoice['terms'])) { $inv->set_terms($invoice['terms']); } $inv->set_issue_date(strtotime($invoice['date'])); // post date $inv->set_post_date(date('Y-m-d H:i:s', strtotime($invoice['date']))); // line items $line_items = array(); if (isset($invoice['lines']['line']) && !empty($invoice['lines']['line'])) { // for some reason FB if (isset($invoice['lines']['line'][0])) { foreach ($invoice['lines']['line'] as $key => $item) { $line_items[] = array('rate' => !is_array($item['unit_cost']) ? $item['unit_cost'] : '', 'qty' => !is_array($item['quantity']) ? $item['quantity'] : '', 'desc' => !is_array($item['description']) ? $item['description'] : '', 'type' => !is_array($item['type']) ? $item['type'] : '', 'total' => !is_array($item['amount']) ? $item['amount'] : '', 'tax' => !is_array($item['tax1_percent']) ? $item['tax1_percent'] : ''); } } else { $line_items[] = array('rate' => !is_array($invoice['lines']['line']['unit_cost']) ? $invoice['lines']['line']['unit_cost'] : '', 'qty' => !is_array($invoice['lines']['line']['quantity']) ? $invoice['lines']['line']['quantity'] : '', 'desc' => !is_array($invoice['lines']['line']['description']) ? $invoice['lines']['line']['description'] : '', 'type' => !is_array($invoice['lines']['line']['type']) ? $invoice['lines']['line']['type'] : '', 'total' => !is_array($invoice['lines']['line']['amount']) ? $invoice['lines']['line']['amount'] : '', 'tax' => !is_array($invoice['lines']['line']['tax1_percent']) ? $invoice['lines']['line']['tax1_percent'] : ''); } } $inv->set_line_items($line_items); // Record do_action('si_new_record', $invoice, self::RECORD, $new_invoice_id, self::__('Invoice Imported'), 0); return $inv; }
public static function create_invoice($invoice = array()) { if (isset($invoice['Description']) && $invoice['Description'] != '') { $subject = $invoice['Description']; } elseif (isset($invoice['Client']) && $invoice['Client'] != '') { $subject = $invoice['Client'] . ' #' . $invoice['Invoice ID']; } else { $subject = '#' . $invoice['Invoice ID']; } $args = array('subject' => $subject); // Attempt to find matching client if (isset($invoice['Company'])) { global $wpdb; $client_ids = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = %s", esc_sql($invoice['Company']), SI_Client::POST_TYPE)); // Get client and confirm it's validity if (is_array($client_ids) && !empty($client_ids)) { $client = SI_Client::get_instance($client_ids[0]); $args['client_id'] = $client->get_id(); } } if (isset($invoice['Invoice ID'])) { $args['invoice_id'] = $invoice['Invoice ID']; } if (isset($invoice['Total'])) { $args['total'] = $invoice['Total']; } if (isset($invoice['Currency Code'])) { $args['currency'] = $invoice['Currency Code']; } if (isset($invoice['PO Number'])) { $args['po_number'] = $invoice['PO Number']; } if (isset($invoice['Discount %'])) { $args['discount'] = $invoice['Discount %']; } if (isset($invoice['Tax 1 %'])) { $args['tax'] = $invoice['Tax 1 %']; } if (isset($invoice['Tax 2 %'])) { $args['tax2'] = $invoice['Tax 2 %']; } if (isset($invoice['Notes'])) { $args['notes'] = $invoice['Notes']; } if (isset($invoice['Terms'])) { $args['terms'] = $invoice['Terms']; } if (isset($invoice['Invoice Date'])) { $args['issue_date'] = strtotime($invoice['Invoice Date']); } if (isset($invoice['Due Date'])) { $args['due_date'] = strtotime($invoice['Due Date']); } $line_items = self::build_line_items($invoice); $args['line_items'] = $line_items; $new_invoice_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_PENDING); update_post_meta($new_invoice_id, self::CSV_ID, $invoice['Invoice ID']); $inv = SI_Invoice::get_instance($new_invoice_id); // post date if (isset($invoice['Invoice Date'])) { $inv->set_post_date(date('Y-m-d H:i:s', strtotime($invoice['Invoice Date']))); } return $inv; }
/** * Meta box view * Abstracted to be called via AJAX * @param int $client_id * */ public static function submit_meta_box_view($client_id = 0) { if (!current_user_can('edit_sprout_invoices')) { self::ajax_fail('User cannot create new posts!'); } if (!$client_id && isset($_REQUEST['client_id'])) { $client_id = $_REQUEST['client_id']; } $client = SI_Client::get_instance($client_id); if (!is_a($client, 'SI_Client')) { self::ajax_fail('Client not found.'); } global $post; $post = $client->get_post(); print self::show_submit_meta_box($client->get_post(), array()); exit; }
public static function invoice_data(SI_Invoice $invoice) { $invoice_data = array('title' => $invoice->get_title(), 'id' => $invoice->get_id(), 'invoice_id' => $invoice->get_invoice_id(), 'status' => $invoice->get_status(), 'balance' => $invoice->get_balance(), 'deposit' => $invoice->get_deposit(), 'issue_date' => $invoice->get_issue_date(), 'estimate_id' => $invoice->get_estimate_id(), 'due_date' => $invoice->get_due_date(), 'expiration_date' => $invoice->get_expiration_date(), 'client_id' => $invoice->get_client_id(), 'client_data' => array(), 'po_number' => $invoice->get_po_number(), 'discount' => $invoice->get_discount(), 'tax' => $invoice->get_tax(), 'tax2' => $invoice->get_tax2(), 'currency' => $invoice->get_currency(), 'subtotal' => $invoice->get_subtotal(), 'calculated_total' => $invoice->get_calculated_total(), 'project_id' => $invoice->get_project_id(), 'terms' => $invoice->get_terms(), 'notes' => $invoice->get_notes(), 'line_items' => $invoice->get_line_items(), 'user_id' => $invoice->get_user_id(), 'payment_ids' => $invoice->get_payments()); if ($invoice->get_client_id()) { $client = SI_Client::get_instance($invoice->get_client_id()); if (is_a($client, 'SI_Client')) { $invoice_data['client_data'] = self::client_data($client); } } return $invoice_data; }
/** * Client */ public function get_client() { if (!$this->get_client_id()) { return new WP_Error('no_client', __('No client associated with this invoice.', 'sprout-invoices')); } return SI_Client::get_instance($this->get_client_id()); }
/** * Prep data. * * @uses $this->_column_headers * @uses $this->items * @uses $this->get_columns() * @uses $this->get_sortable_columns() * @uses $this->get_pagenum() * @uses $this->set_pagination_args() * */ function prepare_items() { /** * First, lets decide how many records per page to show */ $per_page = 25; /** * Define our column headers. */ $columns = $this->get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); /** * REQUIRED. Build an array to be used by the class for column * headers. */ $this->_column_headers = array($columns, $hidden, $sortable); $filter = isset($_REQUEST['post_status']) ? $_REQUEST['post_status'] : array(SI_Payment::STATUS_PENDING, SI_Payment::STATUS_AUTHORIZED, SI_Payment::STATUS_COMPLETE, SI_Payment::STATUS_PARTIAL, SI_Payment::STATUS_RECURRING, SI_Payment::STATUS_CANCELLED); $args = array('post_type' => SI_Payment::POST_TYPE, 'post_status' => $filter, 'posts_per_page' => $per_page, 'paged' => $this->get_pagenum()); // Check based on post_type id if (isset($_REQUEST['s']) && is_numeric($_REQUEST['s'])) { $post_id = $_REQUEST['s']; switch (get_post_type($post_id)) { case SI_Payment::POST_TYPE: $payment_ids = array($post_id); break; case SI_Invoice::POST_TYPE: $invoice = SI_Invoice::get_instance($post_id); $payment_ids = $invoice->get_payments(); break; case SI_Client::POST_TYPE: $client = SI_Client::get_instance($post_id); $payment_ids = $client->get_payments(); break; default: $payment_ids = false; break; } if ($payment_ids) { $meta_query = array('post__in' => $payment_ids); $args = array_merge($args, $meta_query); } } elseif (isset($_GET['s']) && $_GET['s'] != '') { $args = array_merge($args, array('s' => sanitize_text_field($_GET['s']))); } // Filter by date if (isset($_GET['m']) && $_GET['m'] != '') { $args = array_merge($args, array('m' => sanitize_text_field($_GET['m']))); } $payments = new WP_Query($args); /** * REQUIRED. *Sorted* data to the items property, where * it can be used by the rest of the class. */ $this->items = apply_filters('si_mngt_payments_items', $payments->posts); /** * REQUIRED. Register our pagination options & calculations. */ $this->set_pagination_args(array('total_items' => $payments->found_posts, 'per_page' => $per_page, 'total_pages' => $payments->max_num_pages)); }
public static function create_invoice(Harvest_Invoice $invoice) { $possible_dups = SI_Post_Type::find_by_meta(SI_Invoice::POST_TYPE, array(self::HARVEST_ID => $invoice->id)); // Don't create a duplicate if this was already imported. if (!empty($possible_dups)) { do_action('si_error', 'Invoice imported already', $invoice->id); return; } $clients = SI_Post_Type::find_by_meta(SI_Client::POST_TYPE, array(self::HARVEST_ID => $invoice->client_id)); // Get client and confirm it's validity $client = SI_Client::get_instance($clients[0]); $client_id = is_a($client, 'SI_Client') ? $client->get_id() : 0; $args = array('subject' => $invoice->subject ? $invoice->subject : 'Harvest Import #' . $invoice->id); $inv_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP); update_post_meta($inv_id, self::HARVEST_ID, $invoice->id); $inv = SI_Invoice::get_instance($inv_id); $inv->set_client_id($client_id); $inv->set_invoice_id($invoice->number); $inv->set_total($invoice->amount); $inv->set_tax($invoice->tax); $inv->set_discount($invoice->discount); $inv->set_notes($invoice->notes); $inv->set_due_date(strtotime($invoice->due_at)); $inv->set_issue_date(strtotime($invoice->created_at)); // post date $inv->set_post_date(date('Y-m-d H:i:s', strtotime($invoice->created_at))); // Record do_action('si_new_record', $invoice, self::RECORD, $inv_id, self::__('Invoice Imported'), 0); return $inv; }
public static function create_invoice($wp_invoice = array(), $client_id = 0) { // Don't create a duplicate if this was already imported. $possible_dups = SI_Post_Type::find_by_meta(SI_Invoice::POST_TYPE, array(self::WPINVOICE_ID => $wp_invoice['ID'])); if (!empty($possible_dups)) { do_action('si_error', 'Invoice imported already', $wp_invoice['ID']); return; } // Get client if (!$client_id) { $clients = SI_Post_Type::find_by_meta(SI_Client::POST_TYPE, array(self::WPINVOICE_ID => $wp_invoice['ID'])); // Get client and confirm it's validity $client = SI_Client::get_instance($clients[0]); $client_id = is_a($client, 'SI_Client') ? $client->get_id() : 0; } $args = array('subject' => $wp_invoice['post_title'] ? $wp_invoice['post_title'] : 'WPInvoice Import #' . $wp_invoice['ID']); $new_invoice_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP); update_post_meta($new_invoice_id, self::WPINVOICE_ID, $wp_invoice['invoice_id']); $invoice = SI_Invoice::get_instance($new_invoice_id); $invoice->set_client_id($client_id); if (isset($wp_invoice['invoice_id'])) { $invoice->set_invoice_id($wp_invoice['invoice_id']); } if (isset($wp_invoice['subtotal'])) { $invoice->set_total($wp_invoice['subtotal']); } if (isset($wp_invoice['deposit_amount'])) { $invoice->set_deposit($wp_invoice['deposit_amount']); } if (isset($wp_invoice['default_currency_code'])) { $invoice->set_currency($wp_invoice['default_currency_code']); } if (isset($wp_invoice['custom_id'])) { $invoice->set_po_number($wp_invoice['custom_id']); } if (isset($wp_invoice['total_discount'])) { $invoice->set_discount($wp_invoice['total_discount']); } if (isset($wp_invoice['post_content'])) { $invoice->set_notes($wp_invoice['post_content']); } if (isset($wp_invoice['post_status'])) { switch ($wp_invoice['post_status']) { case 'paid': $invoice->set_as_paid(); break; case 'active': case 'pending': $invoice->set_pending(); break; case 'refund': $invoice->set_as_written_off(); break; default: $invoice->set_as_temp(); break; } } $invoice->set_issue_date(strtotime($wp_invoice['due_date_day'] . '-' . $wp_invoice['due_date_month'] . '-' . $wp_invoice['due_date_year'])); // post date $invoice->set_post_date(date('Y-m-d H:i:s', strtotime($wp_invoice['post_date']))); // line items $line_items = array(); if (isset($wp_invoice['itemized_list']) && !empty($wp_invoice['itemized_list'])) { foreach ($wp_invoice['itemized_list'] as $key => $item) { $line_items[] = array('rate' => isset($item['price']) ? $item['price'] : '', 'qty' => isset($item['quantity']) ? $item['quantity'] : '', 'desc' => $item['description'] == '' ? $item['name'] : '<strong>' . $item['name'] . '</strong><br/>' . $item['description'], 'type' => '', 'total' => isset($item['line_total_after_tax']) ? $item['line_total_after_tax'] : '', 'tax' => isset($item['tax_rate']) ? $item['tax_rate'] : ''); } } // I don't know what itemized charges could possibly be used for but they can be items. if (isset($wp_invoice['itemized_charges']) && !empty($wp_invoice['itemized_charges'])) { foreach ($wp_invoice['itemized_charges'] as $key => $item) { $line_items[] = array('rate' => isset($item['amount']) ? $item['amount'] : '', 'qty' => 1, 'desc' => isset($item['name']) ? $item['name'] : '', 'type' => '', 'total' => isset($item['after_tax']) ? $item['after_tax'] : '', 'tax' => isset($item['tax']) ? $item['tax'] : ''); } } $invoice->set_line_items($line_items); // Records if (!empty($wp_invoice['log'])) { foreach ($wp_invoice['log'] as $key => $event) { if ($event['attribute'] == 'notification') { // payments are added separately do_action('si_new_record', self::__('Notification content was not stored by WP-Invoice.'), SI_Notifications::RECORD, $new_invoice_id, $event['text'], 0, false); } } } do_action('si_new_record', $wp_invoice, self::RECORD, $new_invoice_id, self::__('Invoice Imported'), 0); return $invoice; }
public static function validate_token() { $user_id = 0; if (!isset($_REQUEST[self::USER_QUERY_ARG]) || $_REQUEST[self::USER_QUERY_ARG] == '') { return false; } if (!isset($_REQUEST[self::CLIENT_TOKEN_QUERY_ARG]) || $_REQUEST[self::CLIENT_TOKEN_QUERY_ARG] == '') { return false; } $user_id = $_REQUEST[self::USER_QUERY_ARG]; $token = $_REQUEST[self::CLIENT_TOKEN_QUERY_ARG]; // Search for client with token. $clients = SI_Post_Type::find_by_meta(SI_Client::POST_TYPE, array(self::CLIENT_TOKEN_META => $token)); if (empty($clients)) { return false; } foreach ($clients as $client_id) { $client = SI_Client::get_instance($client_id); // confirm user id is associated still. if (!in_array($user_id, $client->get_associated_users())) { return false; } } return $clients; }
public static function client($data = array()) { if (!isset($data['id'])) { $data['id'] = $_GET['id']; } $client = SI_Client::get_instance($data['id']); if (!is_a($client, 'SI_Client')) { return; } return self::client_data($client); }
// Add a progress bar to show table record collection. echo '<tr class="odd" id="progress_row"><td valign="top" colspan="8" class="dataTables_empty"><div id="rows_progress" style="width:100%;border:1px solid #ccc;"></div> <div id="table_progress">' . __('Preparing rows...', 'sprout-invoices') . '</div></td></tr>'; $records = new WP_Query($args); $i = 0; while ($records->have_posts()) { $records->the_post(); // Calculate the percentage $i++; $percent = intval($i / $records->found_posts * 100) . "%"; // Javascript for updating the progress bar and information echo '<script language="javascript" id="progress_js"> document.getElementById("rows_progress").innerHTML="<div style=\\"width:' . $percent . ';background-color:#ddd;\\"> </div>"; document.getElementById("table_progress").innerHTML="' . sprintf(__('%o records(s) of %o added.', 'sprout-invoices'), $i, $records->found_posts) . '"; document.getElementById("progress_js").remove(); </script>'; $client = SI_Client::get_instance(get_the_ID()); $estimates = $client->get_estimates(); $invoices = $client->get_invoices(); $number_estimate = count($estimates); $number_invoices = count($invoices); $number_estimate_complete = 0; if (!empty($estimates)) { foreach ($estimates as $estimate_id) { if (get_post_status($estimate_id) == SI_Estimate::STATUS_APPROVED) { $number_estimate_complete += 1; } } } $number_invoices_complete = 0; $total_invoiced = 0; $total_payments = 0;
function process_ajax_on_project_change() { $has_admin = array(); //@TODO ADD NONCE CHECK $post_id = $_POST['post_id']; if ($post_id <= 0) { return; } $SI_Project = SI_Project::get_instance($post_id); $invoice_ids = $SI_Project->get_invoices(); $estimate_ids = $SI_Project->get_estimates(); $client_ids = $SI_Project->get_associated_clients(); $clients = array(); $estimates = array(); $invoices = array(); $asscoiativeTasks = array(); foreach ($client_ids as $clients_id) { $SI_Client = SI_Client::get_instance($clients_id); $user_ids = $SI_Client->get_associated_users(); foreach ($user_ids as $user_id) { if (user_can($user_id, 'update_core')) { $has_admin[] = $user_id; } $user = get_user_by('ID', $user_id); $display_name = $user->data->display_name; $clients[] = array('user_id' => (int) $user_id, 'display_name' => $display_name); } } if (empty($has_admin) && current_user_can('update_core')) { $args = array('role' => 'administrator'); $users = get_users($args); foreach ($users as $user) { $clients[] = array('user_id' => (int) $user->ID, 'display_name' => $user->data->display_name); } } $blank_option = array('user_id' => '', 'display_name' => ''); array_unshift($clients, $blank_option); foreach ($estimate_ids as $estimate_id) { $title = get_the_title($estimate_id); $estimates[] = array('est_id' => (int) $estimate_id, 'est_title' => $title); } foreach ($invoice_ids as $invoice_id) { $title = get_the_title($invoice_id); $invoices[] = array('inv_id' => (int) $invoice_id, 'inv_title' => $title); } $args = array('post_type' => 'mg_task', 'meta_key' => 'project', 'meta_value' => $post_id, 'post_status' => array('complete', 'in-progress', 'not-started', 'publish', 'published')); $the_query = new WP_Query($args); while ($the_query->have_posts()) { $the_query->the_post(); $asscoiativeTasks[] = array('task_title' => get_the_title(), 'task_id' => get_the_ID()); } $data = array('clients' => $clients, 'estimates' => $estimates, 'invoices' => $invoices, 'tasks' => $asscoiativeTasks); $output = json_encode($data); exit($output); }
public static function client_name($atts = array()) { $id = 0; if (si_get_doc_context() == 'estimate') { $id = si_get_estimate_id(); } else { $id = si_get_invoice_id(); } $doc = si_get_doc_object($id); if (!$doc->get_client_id()) { return ''; } $client = SI_Client::get_instance($client_id); return $client->get_title(); }