function build_test_invoice($total = 0)
 {
     $user_args = array('user_login' => '*****@*****.**', 'display_name' => 'Unit Tester', 'user_pass' => wp_generate_password(), 'user_email' => '*****@*****.**');
     $user_id = SI_Clients::create_user($user_args);
     $args = array('company_name' => 'Test Client', 'user_id' => $user_id);
     $client_id = SI_Client::new_client($args);
     $args = array('subject' => 'TESTING Payments');
     $id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP);
     $this->invoice_ids[] = $id;
     $invoice = SI_Invoice::get_instance($id);
     $invoice->set_client_id($client_id);
     // No total set make them random
     if (!$total) {
         $line_items = array();
         for ($i = 0; $i < 10; $i++) {
             $rate = rand(1000, 4000);
             $qty = rand(1, 10);
             $line_items[] = array('rate' => $rate, 'qty' => $qty, 'desc' => 'This is a test line item for a test invoice.', 'type' => '', 'total' => $rate * $qty, 'tax' => 0);
         }
     } else {
         $line_items = array(array('rate' => $total, 'qty' => 1, 'desc' => 'This is a test line item for a test invoice.', 'type' => '', 'total' => $total, 'tax' => 0));
     }
     $invoice->set_line_items($line_items);
     $this->assertTrue(in_array($id, $this->invoice_ids));
     return $id;
 }
 function setUp()
 {
     parent::setUp();
     $args = array('subject' => 'TEST');
     $this->invoice_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP);
     $this->invoice = SI_Invoice::get_instance($this->invoice_id);
     $line_items = array();
     for ($i = 0; $i < 10; $i++) {
         $rate = rand(100, 1000);
         $qty = rand(1, 10);
         $line_items[] = array('rate' => $rate, 'qty' => $qty, 'desc' => 'This is a test line item for a test invoice.', 'type' => '', 'total' => $rate * $qty, 'tax' => 0);
     }
     $this->invoice->set_line_items($line_items);
 }
 function setUp()
 {
     parent::setUp();
     $user_args = array('user_login' => '*****@*****.**', 'display_name' => 'Unit Tester', 'user_pass' => wp_generate_password(), 'user_email' => '*****@*****.**');
     $user_id = SI_Clients::create_user($user_args);
     $args = array('company_name' => 'Test Client', 'user_id' => $user_id);
     $client_id = SI_Client::new_client($args);
     $args = array('subject' => 'TEST Payment');
     $this->invoice_id = SI_Invoice::create_invoice($args, SI_Invoice::STATUS_TEMP);
     $this->invoice = SI_Invoice::get_instance($this->invoice_id);
     $this->invoice->set_client_id($client_id);
     $line_items = array();
     for ($i = 0; $i < 10; $i++) {
         $rate = rand(100, 1000);
         $qty = rand(1, 10);
         $line_items[] = array('rate' => $rate, 'qty' => $qty, 'desc' => 'This is a test line item for a test invoice.', 'type' => '', 'total' => $rate * $qty, 'tax' => 0);
     }
     $this->invoice->set_line_items($line_items);
 }
 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;
 }
Esempio n. 5
0
 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;
 }
 public static function create_invoice($data = array())
 {
     $invoice_id = SI_Invoice::create_invoice($data);
     return self::invoice_data($invoice_id);
 }
 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;
 }
Esempio n. 8
0
 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;
 }
 /**
  * Process the payment and return the result
  *
  * @param int $order_id
  * @return array
  */
 public function process_payment($order_id)
 {
     $order = wc_get_order($order_id);
     ///////////////////////////
     // Create Sprout Invoice //
     ///////////////////////////
     /**
      * Build line item array
      * @var array
      */
     $line_items = array();
     $tax = 0;
     foreach ($order->get_items() as $key => $item) {
         $_product = apply_filters('woocommerce_order_item_product', $order->get_product_from_item($item), $item);
         if ($_product && !$_product->is_visible()) {
             $desc = apply_filters('woocommerce_order_item_name', $item['name'], $item);
         } else {
             $desc = apply_filters('woocommerce_order_item_name', sprintf('<a href="%s">%s</a>', get_permalink($item['product_id']), $item['name']), $item);
         }
         $line_items[] = array('rate' => $item['line_subtotal'] / $item['qty'], 'qty' => (int) $item['qty'], 'desc' => $desc, 'total' => $item['line_subtotal'], 'tax' => -$tax);
     }
     if ($order->get_total_shipping() > 0.0) {
         $line_items[] = array('rate' => $order->get_total_shipping(), 'qty' => 1, 'desc' => __('Shipping', 'sprout-invoices'), 'total' => $order->get_total_shipping(), 'tax' => 0);
     }
     foreach ($order->get_tax_totals() as $code => $tax) {
         $line_items[] = array('rate' => $tax->amount - $order->get_total_tax_refunded_by_rate_id($tax->rate_id), 'qty' => 1, 'desc' => $tax->label, 'total' => $tax->amount - $order->get_total_tax_refunded_by_rate_id($tax->rate_id), 'tax' => 0);
     }
     if ('' !== $order->customer_note) {
         $line_items[] = array('rate' => 0, 'qty' => 0, 'desc' => $order->customer_note, 'total' => 0, 'tax' => 0);
     }
     $invoice_args = array('status' => SI_Invoice::STATUS_PENDING, 'subject' => sprintf(__('Order #%s', 'sprout-invoices'), $order_id), 'line_items' => $line_items);
     $invoice_id = SI_Invoice::create_invoice($invoice_args);
     $invoice = SI_Invoice::get_instance($invoice_id);
     $invoice->set_discount($order->get_total_discount());
     $invoice->set_total($order->get_total());
     if (method_exists($invoice, 'set_email')) {
         $invoice->set_email($order->billing_email);
     }
     if ($order->get_user_id()) {
         $client_ids = SI_Client::get_clients_by_user($order->get_user_id());
         if (!empty($client_ids)) {
             $client_id = array_pop($client_ids);
         }
         if (!$client_id) {
             $address = array('street' => $order->billing_address_1 . ' ' . $order->billing_address_2, 'city' => $order->billing_city, 'zone' => $order->billing_state, 'postal_code' => $order->billing_postcode, 'country' => $order->billing_country);
             $args = array('company_name' => '' !== $order->billing_company ? $order->billing_company : $order->billing_first_name . ' ' . $order->billing_last_name, 'website' => '', 'address' => $address, 'user_id' => $order->get_user_id());
             $client_id = SI_Client::new_client($args);
         }
         $invoice->set_client_id($client_id);
     }
     // History
     do_action('si_new_record', sprintf('<a href="%s">#%s</a>', add_query_arg(array('post' => $order_id, 'action' => 'edit'), admin_url('post.php')), $order_id), 'woocommerce_order', $invoice_id, sprintf('<a href="%s">#%s</a>', add_query_arg(array('post' => $order_id, 'action' => 'edit'), admin_url('post.php')), $order_id), 0, false);
     // store the order id within the invoice
     update_post_meta($invoice_id, Woo_Integration::ORDER_ID_META, $order_id);
     do_action('si_woocommerce_payment', $order_id, $invoice_id);
     ////////////
     // Return //
     ////////////
     // Mark as on-hold (we're awaiting the sprout_invoices)
     $order->update_status('on-hold', __('Awaiting invoice payment', 'sprout-invoices'));
     // Reduce stock levels
     $order->reduce_order_stock();
     // Remove cart
     WC()->cart->empty_cart();
     // Return thankyou redirect
     return array('result' => 'success', 'redirect' => $this->get_return_url($order));
 }
 public static function create_invoice($data = array())
 {
     $invoice_id = SI_Invoice::create_invoice($data);
     $invoice = SI_Invoice::get_instance($invoice_id);
     if (!is_a($invoice, 'SI_Invoice')) {
         return;
     }
     return self::invoice_data($invoice);
 }