/**
  * Check if logging is enabled
  *
  * @return bool
  */
 public function is_enabled()
 {
     // Settings object
     $settings = new WC_XR_Settings();
     // Check if debug is on
     if ('on' === $settings->get_option('debug')) {
         return true;
     }
     return false;
 }
 /**
  * Setup the class
  */
 public function setup()
 {
     // Setup the autoloader
     $this->setup_autoloader();
     // Load textdomain
     load_plugin_textdomain('wc-xero', false, dirname(plugin_basename(self::get_plugin_file())) . '/languages');
     // Setup Settings
     $settings = new WC_XR_Settings();
     $settings->setup_hooks();
     // Setup order actions
     $order_actions = new WC_XR_Order_Actions();
     $order_actions->setup_hooks();
     // Setup Invoice hooks
     $invoice_manager = new WC_XR_Invoice_Manager();
     $invoice_manager->setup_hooks();
     // Plugins Links
     add_filter('plugin_action_links_' . plugin_basename(self::get_plugin_file()), array($this, 'plugin_links'));
 }
 /**
  * Get payment by order
  *
  * @param WC_Order $order
  *
  * @return WC_XR_Payment
  */
 public function get_payment_by_order($order)
 {
     // Get the XERO invoice ID
     $invoice_id = get_post_meta($order->id, '_xero_invoice_id', true);
     // Get the XERO currency rate
     $currency_rate = get_post_meta($order->id, '_xero_currencyrate', true);
     // Date time object of order data
     $order_dt = new DateTime($order->order_date);
     // Settings object
     $settings = new WC_XR_Settings();
     // The Payment object
     $payment = new WC_XR_Payment();
     // Set the invoice ID
     $payment->set_invoice_id($invoice_id);
     // Set the Payment Account code
     $payment->set_code($settings->get_option('payment_account'));
     // Set the payment date
     $payment->set_date($order_dt->format('Y-m-d'));
     // Set the currency rate
     $payment->set_currency_rate($currency_rate);
     // Set the amount
     $payment->set_amount($order->order_total);
     return $payment;
 }
 /**
  * Send invoice to XERO API
  *
  * @param int $order_id
  *
  * @return bool
  */
 public function send_invoice($order_id)
 {
     // Get the order
     $order = wc_get_order($order_id);
     // Get the invoice
     $invoice = $this->get_invoice_by_order($order);
     // Settings object
     $settings = new WC_XR_Settings();
     // Write exception message to log
     $logger = new WC_XR_Logger();
     // Check if the order total is 0 and if we need to send 0 total invoices to Xero
     if (0 == $invoice->get_total() && 'on' !== $settings->get_option('export_zero_amount')) {
         $logger->write('INVOICE HAS TOTAL OF 0, NOT SENDING ORDER WITH ID ' . $order->id);
         $order->add_order_note(__("XERO: Didn't create invoice because total is 0 and send order with zero total is set to off.", 'wc-xero'));
         return false;
     }
     // Invoice Request
     $invoice_request = new WC_XR_Request_Invoice($this->get_invoice_by_order($order));
     // Logging
     $logger->write('START XERO NEW INVOICE. order_id=' . $order->id);
     // Try to do the request
     try {
         // Do the request
         $invoice_request->do_request();
         // Parse XML Response
         $xml_response = $invoice_request->get_response_body_xml();
         // Check response status
         if ('OK' == $xml_response->Status) {
             // Add order meta data
             add_post_meta($order->id, '_xero_invoice_id', (string) $xml_response->Invoices->Invoice[0]->InvoiceID);
             add_post_meta($order->id, '_xero_currencyrate', (string) $xml_response->Invoices->Invoice[0]->CurrencyRate);
             // Log response
             $logger->write('XERO RESPONSE:' . "\n" . $invoice_request->get_response_body());
             // Add Order Note
             $order->add_order_note(__('Xero Invoice created.  ', 'wc-xero') . ' Invoice ID: ' . (string) $xml_response->Invoices->Invoice[0]->InvoiceID);
             // Settings object
             $settings = new WC_XR_Settings();
             // Check if sending payment is on
             if ('on' === $settings->get_option('send_payments') && $invoice->get_total() > 0) {
                 // Payment Manager
                 $payment_manager = new WC_XR_Payment_Manager();
                 // Send payment
                 $payment_manager->send_payment($order->id);
             }
         } else {
             // XML reponse is not OK
             // Log reponse
             $logger->write('XERO ERROR RESPONSE:' . "\n" . $invoice_request->get_response_body());
             // Format error message
             $error_message = $xml_response->Elements->DataContractBase->ValidationErrors->ValidationError->Message ? $xml_response->Elements->DataContractBase->ValidationErrors->ValidationError->Message : __('None', 'wc-xero');
             // Add order note
             $order->add_order_note(__('ERROR creating Xero invoice: ', 'wc-xero') . __(' ErrorNumber: ', 'wc-xero') . $xml_response->ErrorNumber . __(' ErrorType: ', 'wc-xero') . $xml_response->Type . __(' Message: ', 'wc-xero') . $xml_response->Message . __(' Detail: ', 'wc-xero') . $error_message);
         }
     } catch (Exception $e) {
         // Add Exception as order note
         $order->add_order_note($e->getMessage());
         $logger->write($e->getMessage());
         return false;
     }
     $logger->write('END XERO NEW INVOICE');
     return true;
 }
 /**
  * Build a correction line if needed
  *
  * @param WC_Order $order
  * @param array <WC_XR_Line_Item>
  *
  * @return WC_XR_Line_Item
  */
 public function build_correction($order, $line_items)
 {
     // Line Item
     $correction_line = null;
     // The line item total in cents
     $line_item_total_cents = 0;
     // Get a sum of the amount and tax of all line items
     if (count($line_items) > 0) {
         foreach ($line_items as $line_item) {
             // Check if line amount is set
             if (null !== $line_item->get_line_amount()) {
                 // Use line amount if set
                 $line_item_total_cents += $line_item->get_line_amount() * 100;
             } else {
                 // Use unit amount if line amount is not set
                 $line_item_total_cents += $line_item->get_unit_amount() * 100;
             }
             $line_item_total_cents += $line_item->get_tax_amount() * 100;
         }
     }
     // Order total in cents
     $order_total_cents = intval(floatval($order->order_total) * 100);
     // We want an integer
     $line_item_total_cents = intval($line_item_total_cents);
     // Check if there's a difference
     if ($line_item_total_cents !== $order_total_cents) {
         // Calculate difference
         $diff = round($order_total_cents - $line_item_total_cents) / 100;
         // Settings object
         $settings = new WC_XR_Settings();
         // Get rounding account code
         $account_code = $settings->get_option('rounding_account');
         // Check rounding account code
         if ('' !== $account_code) {
             // Create correction line item
             $correction_line = new WC_XR_Line_Item();
             // Correction description
             $correction_line->set_description('Rounding adjustment');
             // Correction quantity
             $correction_line->set_quantity(1);
             // Correction amount
             $correction_line->set_unit_amount($diff);
             $correction_line->set_account_code($account_code);
         } else {
             // There's a rounding difference but no rounding account
             $logger = new WC_XR_Logger();
             $logger->write("There's a rounding difference but no rounding account set in XERO settings.");
         }
     }
     return $correction_line;
 }
 /**
  * @return string
  */
 public function get_invoice_number()
 {
     // Settings object
     $settings = new WC_XR_Settings();
     // Load invoice prefix
     $prefix = trim($settings->get_option('invoice_prefix'));
     // Set invoice number
     $invoice_number = $this->invoice_number;
     // Check prefix
     if ($prefix !== '') {
         // Prefix invoice number with prefix
         $invoice_number = $prefix . $invoice_number;
     }
     return apply_filters('woocommerce_xero_invoice_invoice_number', $invoice_number, $this);
 }