db; $sql = "UPDATE orders SET cancellation_reason_id='".$db->real_escape_string($data['cancellation_reason_id'])."', cancellation_info='".$db->real_escape_string($data['cancellation_info'])."', cancellation_date='".$db->real_escape_string($data['cancellation_date'])."', cancellation_status='".$db->real_escape_string($data['cancellation_status'])."', order_status=12 WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); return $db->query($db); } public static function order_cancellability_status($order_id) { $has_cancellation_request = OrderHelper::order_has_cancellation_request($order_id); // default status $status = 'not_cancellable'; if ($has_cancellation_request) { $cancellation_request_status = CancellationRequestsHelper::get_cancellation_request_status_by_order_id($order_id); if ($cancellation_request_status !== false) { if ($cancellation_request_status == '0') { $status = 'cancellation_requested'; } else if ($cancellation_request_status == '1') { $status = 'cancellation_approved'; } else if ($cancellation_request_status == '2') { $status = 'cancellation_denied'; } } } else { $is_cancellable = OrderHelper::is_order_cancellable($order_id); if ($is_cancellable) { $status = 'cancellable'; } } $order_is_cancelled = OrderHelper::is_order_cancelled($order_id); if ($order_is_cancelled) { $status = 'cancelled'; } return $status; } public static function get_order_status_cancellability_array() { $db = Registry::get('base')->db; $sql = "SELECT id, cancellable FROM order_status"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return_data[$obj->id] = $obj->cancellable; } return $return_data; } return false; } public static function is_order_cancellable($order_id) { $db = Registry::get('base')->db; $cancellability_array = OrderHelper::get_order_status_cancellability_array(); $sql = "SELECT * FROM orders WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); $is_order_cancellable = false; if ($result->num_rows > 0) { $order_data = $result->fetch_object(); if ($cancellability_array[$order_data->order_status] == 1) { $is_order_cancellable = true; } } return $is_order_cancellable; } public static function is_order_cancelled($order_id) { $db = Registry::get('base')->db; $sql = "SELECT order_status FROM orders WHERE id=".$db->real_escape_string($order_id)." AND order_status=6"; /*$sql = "SELECT cancellation_date FROM orders WHERE cancellation_date IS NOT NULL AND id=".$db->real_escape_string($order_id);*/ $result = $db->query($sql); if ($result->num_rows > 0) { return true; } return false; } public static function order_has_cancellation_request($order_id) { $db = Registry::get('base')->db; $sql = "SELECT cancellation_reason_id, cancellation_info, cancellation_date, cancellation_status FROM orders WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { $order_data = $result->fetch_object(); if ($order_data->cancellation_status == 1) { return true; } } return false; } // TODO:check public static function reap_order_items($items) { $increment = array(); $remove = array(); // i iterate over items twice since i // am comparint every element to every other element $i = 0; foreach ($items as $item) { $j = 0; foreach ($items as $other_item) { // don't compare item to itself if ($i != $j) { // don't compare items to previous items // they where already compared if ($j > $i) { if ($item['id'] == $other_item['id']) { if ($item['variant1'] == $other_item['variant1']) { if ($item['variant2'] == $other_item['variant2']) { // we have a macht $increment[] = $i; // for copieing $remove[] = $j; // for removing } } } } } $j++; } $i++; } $len = count($remove); if ($len > 0) { // copy the quantity of the duplicate to the original for ($x = 0; $x < $len; $x++) { $items[$increment[$x]]['quantity'] += $items[$remove[$x]]['quantity']; } $y = 0; foreach ($items as $item) { if (!in_array($y, $remove)) { $return[] = $item; } $y++; } } return $items; } public static function get_order_fiels($order_id, $field_array) { $db = Registry::get('base')->db; if (count($field_array) > 0) { $field_string = ''; foreach ($field_array as $field) { if ($field_string == '') { $field_string .= $field; } else { $field_string .= ', '.$field; } } if ($field_string != '') { $sql = "SELECT "; $sql .= $field_string; $sql .= " FROM orders WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object(); } } } return false; } public static function set_order_comment($order_id, $comment, $revisor_id) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET customer_info='".$db->real_escape_string($comment)."', revisor_id='".$db->real_escape_string($revisor_id)."' WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result) { return true; } return false; } public static function set_shipping_address($order_id, $shipping_address, $revisor_id) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET "; $size = count($shipping_address); $i = 1; foreach ($shipping_address as $name => $value) { $sql .= $name."='".$db->real_escape_string($value)."'"; if ($i < $size) { $sql .= ", "; $i++; } } $sql .= ", revisor_id='".$db->real_escape_string($revisor_id)."' WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result) { return true; } return false; } public static function set_billing_address($order_id, $billing_address, $revisor_id) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET "; $size = count($billing_address); $i = 1; foreach ($billing_address as $name => $value) { $sql .= $name."='".$db->real_escape_string($value)."'"; if ($i < $size) { $sql .= ", "; $i++; } } $sql .= ", revisor_id='".$db->real_escape_string($revisor_id)."'WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result) { return true; } return false; } // TODO: put this function in a general utility class with a better name private function php_2_string($data) { $string = ''; if (is_array($data)) { $string .= 'array('; foreach ($data as $key => $value) { if (is_array($value)) { $string .= "'$key' => ".OrderHelper::php_2_string($value).", "; } else { $string .= "'$key' => '$value', "; } } $string .= ")"; } else { $string .= "'".$data."'"; }; return $string; } // TODO: check public static function set_revision_in_order_history($data) { $db = Registry::get('base')->db; $sql = "INSERT INTO order_history ('order_id', 'revisor_id', 'previous_revisor_id', 'changes') "; $sql .= " VALUES ('".$data['order_id']."','".$data['revisor_id']."', '".$data['previous_revisor_id']."', '".$db->real_escape_string(OrderHelper::php_2_string($data['changes']))."')"; echo $sql; exit(); } public static function get_revision_history_for_order($id) { $db = Registry::get('base')->db; $sql = "SELECT t.id FROM orders n JOIN orders t ON t.order_number = n.order_number WHERE n.id=".$db->real_escape_string($id); $result = $db->query($sql); if ($result->num_rows > 0) { $return = ''; while ($obj = $result->fetch_object()) { if ($return == '') { $return .= $obj->id; } else { $return .= ', '.$obj->id; } } return $return; } return false; } public static function get_money_back($order_id) { $db = Registry::get('base')->db; $sql = "SELECT * FROM order_item WHERE order_id=".$db->real_escape_string($order_id)." AND item_status=1"; $result = $db->query($sql); if ($result->num_rows > 0) { $sum = 0.0; while ($obj = $result->fetch_object()) { $sum += $obj->price + $obj->taxes; } return $sum; } return false; } public static function set_paypal_transaction_data($order_id, $paypal_data) { $db = Registry::get('base')->db; $transactionid = $paypal_data['PAYMENTINFO_0_TRANSACTIONID']; $sql = "UPDATE orders SET paypal_transaction_id='".$db->real_escape_string($transactionid)."' WHERE id=".$db->real_escape_string($order_id); $return = $db->query($sql); return $return; } public static function set_paypal_user_data($order_id, $paypal_data) { $db = Registry::get('base')->db; $email = $paypal_data['EMAIL']; $payerid = $paypal_data['PAYERID']; $sql = "UPDATE orders SET paypal_email='".$db->real_escape_string($email)."', paypal_payerid='".$db->real_escape_string($payerid)."' WHERE id=".$db->real_escape_string($order_id); $return = $db->query($sql); return $return; } public static function get_all_orders_with_money_back() { $db = Registry::get('base')->db; $sql = "SELECT o.id, o.order_number, o.order_revision, o.customer_name, o.order_date, oo.order_total, oo.shipping_charges, oo.payment_method_charges, oo.order_total - o.order_total AS total_back FROM orders o LEFT JOIN order_item i ON o.id = i.order_id RIGHT JOIN orders oo ON oo.id = o.revised_order_id WHERE o.payment_method = 4 AND o.payment_status = 2 AND i.item_status = 1"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $obj->total_charges = $obj->payment_method_charges + $obj->shipping_charges; $return[] = $obj; } return $return; } return false; } public static function get_all_customer_orders($customer_id) { $db = Registry::get('base')->db; $order_status_array = OrderStatus::get_id_to_name_array(); $sql = "SELECT * FROM orders o1 WHERE o1.order_revision=(SELECT MAX(o2.order_revision) FROM orders o2 WHERE o1.order_number = o2.order_number) OR o1.order_revision IS NULL AND o1.customer_id=".$db->real_escape_string($customer_id)." AND o1.order_addendum != 'N' ORDER BY o1.order_number DESC"; $sql = "SELECT * FROM orders o1 WHERE o1.customer_id=".$db->real_escape_string($customer_id)." AND o1.order_addendum != 'N' ORDER BY o1.order_number DESC"; $sql = "SELECT * FROM orders o1 WHERE o1.customer_id=".$db->real_escape_string($customer_id)." ORDER BY o1.order_number DESC"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $obj->invoice_status_text = $order_status_array[$obj->order_status]; $return[] = $obj; } return $return; } return false; } public static function get_items_on_backorder() { $db = Registry::get('base')->db; $manufacturer_array = ManufacturerHelper::get_manufacturer_array(); $sql = "SELECT o.id AS order_id, o.customer_id, o.customer_name, o.order_number, o.order_revision, o.order_addendum, oi.item_id, oi.item_name, oi.price AS item_price, oi.amount AS item_quantity, oi.delivery_date AS item_delivery_date, i.manufacturer_id FROM orders o LEFT JOIN order_item oi ON o.id = oi.order_id LEFT JOIN items i ON oi.item_id = i.id WHERE o.order_status = 9 AND oi.item_status = 2"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { if ($manufacturer_array) { try { $obj->manufacturer_name = $manufacturer_array[(int)$obj->manufacturer_id]; } catch (Exception $e) { $obj->manufacturer_name = ''; $obj->manufacturer_id = 0; } } $return[] = $obj; } return $return; } return false; } public static function get_order_items_html($order_id) { $order = new Order(Registry::get('base')); $order->set_id($order_id); $order_data = $order->get_data(); $cg_object = new CustomerGroups(Registry::get('base')); $cg_data = $cg_object->get_by_user($order_data->customer_id); $order_data->cg_show_taxes = $cg_data->show_tax; $di_html = new DeliveryItemsHTML($order_data); return $di_html->PrintOrder(); } public static function get_payment_data($order_id) { $db = Registry::get('base')->db; $sql = "SELECT order_number, order_revision, payment_status, payment_method, paypal_token, paypal_transaction_id FROM orders WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object(); } return false; } public static function order_exists($order_id) { $db = Registry::get('base')->db; $sql = "SELECT * FROM orders WHERE id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { return true; } return false; } public static function make_order_addendum($order_id) { $new_order_id = OrderHelper::clone_order($order_id); if ($new_order_id) { OrderHelper::copy_items_on_back_order($order_id, $new_order_id); } } public static function get_addendum_for_order($order_id) { $db = Registry::get('base')->db; $sql = "SELECT order_number, order_revision FROM orders WHERE id =".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { $order_info = $result->fetch_object(); $sql = "SELECT id FROM orders WHERE order_number=".$order_info->order_number; if (is_numeric($order_info->order_revision)) { $sql .= " AND order_revision=$order_info->order_revision"; } else { $sql .= " AND order_revision IS NULL"; } $sql .= " AND order_addendum='N'"; $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object()->id; } } return false; } public static function copy_items_on_back_order($old_order_id, $new_order_id) { $db = Registry::get('base')->db; $fields = OrderHelper::get_order_item_table_fields(false); $sql = "SELECT price, taxes, tax_id, tax_rate, item_name, item_number, variant1, variant2, item_status, item_status_text, delivery_date, backorder_quantity FROM order_item WHERE order_id=".$db->real_escape_string($old_order_id)." AND item_status=2"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $queries[] = "INSERT INTO order_item ( order_id, price, taxes, tax_id, tax_rate, item_name, item_number, variant1, variant2, item_status, item_status_text, delivery_date, amount ) VALUES ( '".$db->real_escape_string($new_order_id)."', '".$obj->price."', '".$obj->taxes."', '".$obj->tax_id."', '".$obj->tax_rate."', '".$obj->item_name."', '".$obj->item_number."', '".$obj->variant1."', '".$obj->variant2."', '".$obj->item_status."', '".$obj->item_status_text."', '".$obj->delivery_date."', '".$obj->backorder_quantity."' ) "; } foreach ($queries as $sql) { $db->query($sql); } return true; // I don't like this but ... } return false; } public static function clone_order($order_id) { $db = Registry::get('base')->db; $fields = OrderHelper::get_order_table_fields(false); $insert = "INSERT INTO orders ("; $select = ") SELECT "; $from = " FROM orders WHERE id=".$db->real_escape_string($order_id); $i = 0; foreach ($fields as $field) { if ($field == 'order_addendum') { } else if ($field == 'order_status') { } else { if ($i == 0) { $insert .= $field; $select .= $field; } else { $insert .= ', '.$field; $select .= ', '.$field; } $i++; } } $insert .= ', order_addendum'; $select .= ", 'N'"; $insert .= ', order_status'; $select .= ', 9'; $sql = $insert.$select.$from; $result = $db->query($sql); if ($result) { return $db->insert_id; } return false; } public static function get_order_table_fields($with_id = true) { $db = Registry::get('base')->db; $sql = "SHOW COLUMNS FROM orders"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { if ($with_id) { $return[] = $obj->Field; } else { if ($obj->Key != 'PRI') { $return[] = $obj->Field; } } } return $return; } return false; } public static function get_order_item_table_fields($with_id = true) { $db = Registry::get('base')->db; $sql = "SHOW COLUMNS FROM order_item"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { if ($with_id) { $return[] = $obj->Field; } else { if ($obj->Key != 'PRI') { $return[] = $obj->Field; } } } return $return; } return false; } public static function order_has_addendum($order_id) { $db = Registry::get('base')->db; // 2 = nachliefern and needs an addendum $sql = "SELECT * FROM order_item WHERE order_id=".$db->real_escape_string($order_id). " AND item_status=2"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return[] = $obj; } return $return; } return false; } public static function order_has_changed($order_id, $new_order_items_list) { $old_order_items_list = OrderHelper::__get_order_items_from_db($order_id); $new_order_items_list = OrderHelper::__get_order_items_from_new_order_list($new_order_items_list); $something_has_changed = true; if ($old_order_items_list) { $something_has_changed = OrderHelper::__compare_orders($old_order_items_list, $new_order_items_list); } return $something_has_changed; // if the previous order has no items the order has changed per default } public static function get_orders_by_type() { $db = Registry::get('base')->db; $order_statuses = OrderStatus::get_all(); if ($order_statuses) { foreach ($order_statuses as $status) { if ($status->is_showable == 1) { $temp['count'] = OrderHelper::__get_order_status_count($status->id); $temp['name'] = $status->name; $temp['id'] = $status->id; $temp['selector'] = $status->selector; $return[] = $temp; } } } return $return; } public static function set_payment_status($id, $status) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET payment_status = ".$db->real_escape_string($status)." WHERE id = ".$db->real_escape_string($id); if ($db->query($sql)) { if ($status == '2') { $date = getdate(); $today = $date['year'].'-'.$date['mon'].'-'.$date['mday']; $sql = "UPDATE orders SET payment_date = '$today' WHERE id = ".$db->real_escape_string($id)." AND payment_date IS NULL"; if ($db->query($sql)) { return $id; } } else { return $id; } } return false; } // end set_payment_status public static function set_payment_method($id, $method) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET payment_method = ".$db->real_escape_string($method)." WHERE id = ".$db->real_escape_string($id); if ($db->query($sql)) { return $id; } return false; } // end set_payment_method public static function set_order_status($id, $status) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET order_status = ".$db->real_escape_string($status)." WHERE id = ".$db->real_escape_string($id); if ($db->query($sql)) { if ($status == 6) { $item_object = new Item(Registry::get('base')); $order_object = new Order(Registry::get('base')); $raw_order = $order_object->get_order_by_id($id); $items = $raw_order['items']; foreach ($items as $item) { $item_object->increase_inventory($item->amount, $item->variant1, $item->variant2, $item->item_id); } } return $id; } return false; } // end set_order_status public static function set_shipping_method($id, $method) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET shipping_method = ".$db->real_escape_string($method)." WHERE id = ".$db->real_escape_string($id); if ($db->query($sql)) { return $id; } return false; } // end set_shipping_method public static function set_payment_statuses($seting, $ids) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET payment_status = ".$db->real_escape_string($seting)." WHERE id IN (".$db->real_escape_string($ids).")"; if ($db->query($sql)) { if ($seting == '2') { $date = getdate(); $today = $date['year'].'-'.$date['mon'].'-'.$date['mday']; $sql = "UPDATE orders SET payment_date = '$today' WHERE id IN (".$db->real_escape_string($ids).") AND payment_date IS NULL"; if ($db->query($sql)) { return true; } } else { return true; } } return false; } // end set_payment_statuses public static function set_order_statuses($seting, $ids) { $db = Registry::get('base')->db; $sql = "UPDATE orders SET order_status = ".$db->real_escape_string($seting)." WHERE id IN (".$db->real_escape_string($ids).")"; if ($status == 6) { $ids = explode(', ', $ids); $item_object = new Item(Registry::get('base')); $order_object = new Order(Registry::get('base')); foreach ($ids as $id) { $raw_order = $order_object->get_order_by_id($id); $items = $raw_order['items']; foreach ($items as $item) { $item_object->increase_inventory($item->amount, $item->variant1, $item->variant2, $item->item_id); } } } return $db->query($sql); } // end set_order_statuses public static function get_all_orders_by_order_number($number) { $db = Registry::get('base')->db; $sql = "SELECT * FROM orders WHERE order_number=".$db->real_escape_string($number); $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $obj->revisor_name = CustomerHelper::get_revisor_data($obj->revisor_id); $return[] = $obj; } return $return; } return false; } // end get_all_orders_by_order_number public static function order_has_revision($id) { $db = Registry::get('base')->db; $sql = "SELECT order_number FROM orders WHERE id=".$db->real_escape_string($id); $result = $db->query($sql); if ($result->num_rows > 0) { $num = $result->fetch_object()->order_number; $sql = "SELECT * FROM orders WHERE order_number=".$db->real_escape_string($num); $result = $db->query($sql); if ($result->num_rows > 1) { return true; // there is more then one order with this order number } return false; // there is one order with this order number } return false; // there are no orders, very unlikely } public static function get_open_orders($limit) { $db = Registry::get('base')->db; $sql = "SELECT * FROM orders WHERE order_status = 1 LIMIT ".$db->real_escape_string($limit); $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return[] = $obj; } return $return; } return false; } public static function get_order_items($order_id) { $db = Registry::get('base')->db; $sql = "SELECT * FROM order_item oi WHERE order_id = ".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return = $obj; } return $return; } return false; } // end get_order_items public static function get_order_items_with_image($order_id) { $db = Registry::get('base')->db; $sql = "SELECT a.id, a.order_id, a.item_id, a.amount, a.price, a.tax, a.item_name, a.item_number, i.file_name FROM order_item a LEFT JOIN item_files i ON i.item_id = a.item_id WHERE a.order_id = ".$db->real_escape_string($order_id). " AND (i.rang = 1 OR i.rang IS NULL) GROUP BY a.id"; $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return[] = $obj; } return $return; } return false; } // end get_order_items_with_image public static function get_all_order_items_by_customer_id($customer_id) { $db = Registry::get('base')->db; $sql = "SELECT i.id, i.order_id, i.item_id, i.amount, i.price, i.price, i.item_name, i.item_number FROM order_item i JOIN orders o WHERE i.order_id = o.id AND o.customer_id = ".$db->real_escape_string($customer_id); $result = $db->query($sql); if ($result->num_rows > 0) { while ($obj = $result->fetch_object()) { $return[] = $obj; } return $return; } return false; } // end get_all_order_items_by_customer_id public static function get_next_order_number() { $db = Registry::get('base')->db; $sql = "SELECT order_number FROM orders ORDER BY order_number DESC LIMIT 1"; $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object()->order_number + 1; } else if ($result->num_rows == 0) { if (Config::has_key('invoice_start') && Config::is_set('invoice_start')) { return Config::get_value('invoice_start'); } } return 100000; } // end get_next_order_number public static function get_order_number($id) { $db = Registry::get('base')->db; $sql = "SELECT order_number FROM orders WHERE id=".$db->real_escape_string($id); $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object()->order_number; } return false; } // end get_order_number public static function createOrderObject($data, $base_object) { $base = $db = Registry::get('base'); $db = Registry::get('base')->db; $orderDataObject = new stdClass(); // Customer info $orderDataObject->customer = CustomerHelper::getCustomerDataForOrder( $data['customerId'] ); // Billing address $orderDataObject->billingAddress = CustomerHelper::getAddressByIds( $data['customerId'], $data['billingAddressId'] ); // Shipping address $orderDataObject->shippingAddress = CustomerHelper::getAddressByIds( $data['customerId'], $data['shippingAddressId'] ); // Gift certificate if (isset($data['giftCertificate'])) { $orderDataObject->giftCertificateCode = $data['giftCertificate']; } // Items $orderDataObject->items = array(); $orderDataObject->itemsQuantity = 0; $orderDataObject->itemsOverallQuantity = 0; $orderDataObject->itemSumNet = 0; $orderDataObject->itemSumGross = 0; $orderDataObject->itemSumVat = array('id' => array(), 'rate' => array()); $itemsQuery = " SELECT item_id, parent_item_id, variant_1, variant_2, quantity, price_sum_net, price_sum_gross, stamp, user_data FROM shopping_cart_items WHERE session_id = '".$db->real_escape_string($data['cartId'])."' "; $rsItems = $db->query($itemsQuery); if ($base->customer_group->id) { $customer_group_id = $base->customer_group->id; } else { $customer_group_id = 1; } while ($itemDataSet = $rsItems->fetch_object()) { $item_object = new Item($base_object); $item_object->id = $itemDataSet->item_id; $item = $item_object->get_data($customer_group_id); $prices = $item_object->calculate_prices($item, $itemDataSet->quantity, $itemDataSet->variant_1, $itemDataSet->variant_2); $orderDataObject->items[] = array( 'itemId' => $itemDataSet->item_id, 'parentItemId' => $itemDataSet->parent_item_id, 'variant1' => $itemDataSet->variant_1, 'variant2' => $itemDataSet->variant_2, 'quantity' => $itemDataSet->quantity, 'prices' => $prices, 'mainItemNumber' => $item->number, 'variantItemNumber' => (isset($item->variant_data[$itemDataSet->variant_1][$itemDataSet->variant_2]['item_number']) ? $item->variant_data[$itemDataSet->variant_1][$itemDataSet->variant_2]['item_number'] : ''), 'vatId' => $item->tax_id, 'vatRate' => $item->tax, 'vatValue' => $prices['itemPriceGross'] - $prices['itemPriceNet'], 'name' => $item->name, 'stamp' => $itemDataSet->stamp, 'userData' => $itemDataSet->user_data ); ++$orderDataObject->itemsQuantity; $orderDataObject->itemsOverallQuantity += $itemDataSet->quantity; $orderDataObject->itemSumNet += $prices['itemPriceNet'] * $itemDataSet->quantity; $orderDataObject->itemSumGross += $prices['itemPriceGross'] * $itemDataSet->quantity; if (!isset($orderDataObject->itemSumVat['id'][$item->tax_id])) { $orderDataObject->itemSumVat['id'][$item->tax_id] = 0; } $orderDataObject->itemSumVat['id'][$item->tax_id] += ($prices['itemPriceGross'] - $prices['itemPriceNet']) * $itemDataSet->quantity; if (!isset($orderDataObject->itemSumVat['rate'][$item->tax])) { $orderDataObject->itemSumVat['rate'][$item->tax] = 0; } $orderDataObject->itemSumVat['rate'][$item->tax] += ($prices['itemPriceGross'] - $prices['itemPriceNet']) * $itemDataSet->quantity; } // Payment $orderDataObject->payment = PaymentHelper::getPaymentDataByIdAndCountry( $data['paymentMethodId'], $orderDataObject->shippingAddress->country, $base_object->config->shopConfiguration['default_vat_value'], $orderDataObject->itemSumGross ); // Deliverer $orderDataObject->shipping = DelivererHelper::getDeliveryDataByIdAndCountry( $data['shippingMethodId'], $orderDataObject->shippingAddress->country, $base_object->config->shopConfiguration['default_vat_value'] ); return $orderDataObject; } public static function get_order_invoice_pdf($order_id, $return_type = false) { if (!isset($base_object)) { $base_object = $db = Registry::get('base'); } if (isset($base_object->config->shopConfiguration['has_early_payers_rebate']) && $base_object->config->shopConfiguration['has_early_payers_rebate'] == 1) { $skonto = true; $skonto_amount = $base_object->config->shopConfiguration['early_payers_rebate_amount'] / 100.0; } else { $skonto = false; } if ($order_id) { $order = new Order(Registry::get('base')); $order_data = $order->get_order_by_id($order_id); $cg_object = new CustomerGroups(); $cg_data = $cg_object->get_by_user($order_data['header']->customer_id); $order_data['header']->cg_show_taxes = $cg_data->show_tax; $pdf = new InvoicePDF(); $pdf->startPage(); $invoice_address = ''; $invoice_address .= $order_data['header']->billing_honorific_text."\n"; if ($order_data['header']->billing_company != '') { $invoice_address .= $order_data['header']->billing_company."\n"; } $invoice_address .= $order_data['header']->billing_firstname.' '.$order_data['header']->billing_surname."\n"; $invoice_address .= $order_data['header']->billing_street.' '.$order_data['header']->billing_house_number."\n"; $invoice_address .= $order_data['header']->billing_zip_code.' '.$order_data['header']->billing_city."\n"; $invoice_address .= Country::get_name_by_id($order_data['header']->billing_country); $pdf->PrintCustomerAddress($invoice_address); $order_date = explode('-', $order_data['header']->order_date); $billing_date = explode('-', $order_data['header']->billing_date); $order_number = $order_data['header']->order_number; if ($order_data['header']->order_revision != '') { $order_number .= '-'.$order_data['header']->order_revision; } $invoice_data = array( 'Kundennummer' => $order_data['header']->customer_number, 'Bestellnummer' => $order_number, 'Bestelldatum' => $order_date[2].'.'.$order_date[1].'.'.$order_date[0], 'Rechnungsnummer' => $order_data['header']->invoice_number, 'Rechnungsdatum' => $billing_date[2].'.'.$billing_date[1].'.'.$billing_date[0] ); $pdf->PrintInvoiceData($invoice_data); $pdf->PrintInvoiceOrder($order_data); // if payment method has a notice, print it $pm = new Payment_method(Registry::get('base')); $paymentmethod = $pm->get_by_id($order_data['header']->payment_method); // get paymorrow bill data if ($order_data['header']->payment_method == 10) { $paymentmethod->invoice_text .= "\n\nBitte überweisen Sie den Betrag auf folgendes Konto:\n"; if ($order_data['header']->paymorrow_national_bank_code) {$paymentmethod->invoice_text .= "\nBLZ: ".$order_data['header']->paymorrow_national_bank_code."\n";} if ($order_data['header']->paymorrow_national_bank_account_number) {$paymentmethod->invoice_text .= "Konto-Nr: ".$order_data['header']->paymorrow_national_bank_account_number."\n";} if ($order_data['header']->paymorrow_bic) {$paymentmethod->invoice_text .= "BIC: ".$order_data['header']->paymorrow_bic."\n";} if ($order_data['header']->paymorrow_iban) {$paymentmethod->invoice_text .= "IBAN: ".$order_data['header']->paymorrow_iban."\n";} if ($order_data['header']->paymorrow_payment_reference) {$paymentmethod->invoice_text .= "\nBitte bei Überweisung mit angeben: ".$order_data['header']->paymorrow_payment_reference."\n";} } if ($paymentmethod->invoice_text != '' && $paymentmethod->invoice_text != NULL) { // get customer banking account data $customer_banking_account = CustomerHelper::getCustomerBankingAccount($order_data['header']->customer_id); $banking_account_string = $customer_banking_account->bank. ', BLZ.: '.$customer_banking_account->bank_number. ', Kto-Nr.: '.$customer_banking_account->account_number; if ($customer_banking_account->iban && $customer_banking_account->swift_bic) { $banking_account_string .= ', IBAN: '.$customer_banking_account->iban. ', BIC: '.$customer_banking_account->swift_bic; } $paymentmethod->invoice_text = str_replace('[#customer_banking_account]',$banking_account_string,$paymentmethod->invoice_text); $pdf->PrintNotice('Zahlungshinweis - '.$paymentmethod->name, $paymentmethod->invoice_text); } // print skonto if ($skonto) { $pdf->PrintEarlyPaymentRebate($skonto_amount); } // if invoice has a notice, print it $invoice_notice = $order_data['header']->invoice_info; if ($invoice_notice != '' && $invoice_notice != NULL) { $pdf->printNotice('Zusatzinfo', $invoice_notice); } $delivery_address .= $order_data['header']->shipping_honorific_text."\n"; if ($order_data['header']->shipping_company != '') { $delivery_address .= $order_data['header']->shipping_company."\n"; } $delivery_address .= $order_data['header']->shipping_firstname.' '.$order_data['header']->shipping_surname."\n"; $delivery_address .= $order_data['header']->shipping_street.' '.$order_data['header']->shipping_house_number."\n"; $delivery_address .= $order_data['header']->shipping_zip_code.' '.$order_data['header']->shipping_city."\n"; $delivery_address .= Country::get_name_by_id($order_data['header']->shipping_country); $pdf->PrintNotice('Lieferung erfolgt an:', $delivery_address); $filename = 'Rechnung-'.$order_data['header']->invoice_number.'.pdf'; $filename = str_replace('/', '-', $filename); if ($return_type == 1) { return $pdf->Output('', 'S'); exit(); } else if ($return_type == 2) { $path = $_SERVER['DOCUMENT_ROOT'].'/web/'.SHOP_SYSTEM.'/documents/pdf/'; $pdf->Output($path.$filename, 'F'); } else { $pdf->Output($filename, 'D'); exit(); } } else { echo "ERROR: Keine ID."; exit(); } } public static function get_order_delivery_note_pdf($order_id) {; if ($order_id) { $order = new Order(Registry::get('base')); $order->set_id($order_id); $order_data = $order->get_data(); if ($order_data->items != null && sizeof($order_data->items) > 0 ) { foreach ($order_data->items As $index => $row) { if (sizeof($row->attribute_array) > 0) { foreach ($row->attribute_array AS $indece => $att) { if ($order_data->items[$index]->variant1 && $att->value && $att->name && $order_data->items[$index]->variant1 == $att->value) { $order_data->items[$index]->vn1 = $att->name; } if ($order_data->items[$index]->variant2 && $att->value && $att->name && $order_data->items[$index]->variant2 == $att->value) { $order_data->items[$index]->vn2 = $att->name; } } } } } $cg_object = new CustomerGroups(); $cg_data = $cg_object->get_by_user($order_data->customer_id); $order_data->cg_show_taxes = $cg_data->show_tax; $pdf = new DeliveryNotePDF(); $pdf->startPage(); $delivery_address .= $order_data->shipping_honorific_text."\n"; if ($order_data->shipping_company != '') { $delivery_address .= $order_data->shipping_company."\n"; } $delivery_address .= $order_data->shipping_firstname.' '.$order_data->shipping_surname."\n"; $delivery_address .= $order_data->shipping_street.' '.$order_data->shipping_house_number."\n"; $delivery_address .= $order_data->shipping_zip_code.' '.$order_data->shipping_city."\n\n"; $delivery_address .= Country::get_name_by_id($order_data->shipping_country); $pdf->PrintCustomerAddress($delivery_address); $order_date = explode('-', $order_data->order_date); $billing_date = explode('-', $order_data->billing_date); $order_number = $order_data->order_number; if ($order_data->order_revision != '') { $order_number .= '-'.$order_data->order_revision; } $invoice_data = array( 'Kundennummer' => $order_data->customer_number, 'Bestellnummer' => $order_number, 'Bestelldatum' => $order_date[2].'.'.$order_date[1].'.'.$order_date[0], 'Lieferscheinnummer' => $order_data->shipping_list_number ); $pdf->PrintInvoiceData($invoice_data); $pdf->PrintInvoiceOrder($order_data); // if payment method has a notice, print it $pm = new Payment_method(Registry::get('base')); $paymentmethod = $pm->get_by_id($order_data->payment_method); if ($paymentmethod->invoice_text != '' && $paymentmethod->invoice_text != NULL) { $pdf->PrintNotice('Zahlungshinweis - '.$paymentmethod->name, $paymentmethod->invoice_text); } // if delivery note has a notice, print it $delivery_notice = $order_data->delivery_note_info; if ($delivery_notice != '' && $delivery_notice != NULL) { $pdf->printNotice('Zusatzinfo', $delivery_notice); } $filename = 'Lieferschein-'.$order_data->invoice_number.'.pdf'; $pdf->Output($filename, 'D'); exit(); } else { echo "ERROR: Keine ID."; exit(); } } //========================================= // // THE PRIVATE INTERFACE // //========================================= private static function __get_order_items_from_db($order_id) { $db = Registry::get('base')->db; $sql = "SELECT item_id AS id, amount AS quantity, price, item_status, item_status_text, delivery_date, backorder_quantity, variant1, variant2 FROM order_item WHERE order_id=".$db->real_escape_string($order_id); $result = $db->query($sql); if ($result->num_rows > 0) { while ($item = $result->fetch_object()) { if ($item->backorder_quantity == '') { $item->backorder_quantity = 0; } $order_items[] = $item; } return $order_items; } return false; } private static function __get_order_items_from_new_order_list($order_items) { foreach ($order_items as $item) { $return[] = (object) array( 'id' => $item['itemId'], 'quantity' => $item['quantity'], 'price' => $item['prices']['itemPriceNet'], 'item_status' => $item['item_status'], 'item_status_text' => $item['item_status_text'], 'delivery_date' => $item['delivery_date'], 'backorder_quantity' => $item['backorder_quantity'], 'variant1' => $item['variant1'], 'variant2' => $item['variant2'] ); } return $return; } // TODO: unit test for this funciton // this is the perfect candidate for test cases private static function __compare_orders($order_list_one, $order_list_two) { $something_has_changed = false; // if the lists have differing length something must have changed if (count($order_list_one) != count($order_list_two)) { $something_has_changed = true; } foreach ($order_list_one as $order_one_item) { $is_in_new_list = false; foreach ($order_list_two as $order_two_item) { if ($order_one_item->id == $order_two_item->id) { if ($order_one_item->variant1 == $order_two_item->variant1) { if ($order_one_item->variant2 == $order_two_item->variant2) { $is_in_new_list = true; if ($order_one_item->price != $order_two_item->price) { $something_has_changed = true; } // if the quantity of an item has changed so has the list if ($order_one_item->quantity != $order_two_item->quantity) { $something_has_changed = true; } if ($order_one_item->item_status != $order_two_item->item_status) { $something_has_changed = true; } else { if ($order_one_item->item_status_text != $order_two_item->item_status_text) { $something_has_changed = true; } if ($order_one_item->delivery_date != $order_two_item->delivery_date) { $something_has_changed = true; } if ($order_one_item->backorder_quantity != $order_two_item->backorder_quantity) { $something_has_changed = true; } } } } } } // if an item from list one is not in list two something has chagned // if an item in list two is not in list one // the lists must either be of differing length (one or more items have been added to list two) // or if they have the same length one item from list on was replaced with another item and // an item from list one is not in list two if (!is_in_new_list) { $something_has_changed = true; } } return $something_has_changed; } private static function __get_order_status_count($order_status_id) { $db = Registry::get('base')->db; $sql = "SELECT COUNT(*) AS num FROM orders WHERE order_status=".$db->real_escape_string($order_status_id); $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object()->num; } return false; } private static function __get_number_of_orders() { $db = Registry::get('base')->db; $sql = "SELECT COUNT(*) AS num FROM orders"; $result = $db->query($sql); if ($result->num_rows > 0) { return $result->fetch_object()->num; } return false; } public static function get_csv_shipping_export($ids) { if (!isset($base_object)) { $base_object = $db = Registry::get('base'); } $csv_text = ''; $amount_sum = 0; if (sizeof($ids) > 0) { $customer_object = new Customer($base_object); $country_object = new Country($base_object); foreach ($ids As $id) { if (intval($id)) { // get order data $order = new Order(Registry::get('base')); $order->id = $id; $order_data = $order->get_data(); // get customer data $customer_data = $customer_object->get_data($order_data->customer_id); $customer_email = ' '; $customer_phone = ' '; if ($customer_data) { $customer_email = $customer_data->email; $customer_phone = $customer_data->phone; } // get country data $country_object->id = $order_data->shipping_country; $country_data = $country_object->get_data(); $country_iso_code = ' '; if ($country_data) { $country_iso_code = $country_data->ISO3316; } // shipping list number $shipping_list_number = ' '; if ($order_data->shipping_list_number) { $shipping_list_number = $order_data->shipping_list_number; } else { $shipping_list_number = $order_data->order_number; } foreach (array('shipping_company', 'shipping_surname', 'shipping_firstname', 'shipping_street', 'shipping_zip_code', 'shipping_city', 'delivery_note_info') as $key) { if (!$order_data->{$key}) { $order_data->{$key} = ' '; } } // order data $csv_text .= 'A|'. utf8_decode($shipping_list_number).'|'. utf8_decode($order_data->order_number).'|'. utf8_decode($order_data->customer_number).'|'. utf8_decode($order_data->shipping_company).'|'. utf8_decode($order_data->shipping_surname).'|'. utf8_decode($order_data->shipping_firstname).'|'. ' |'. utf8_decode($order_data->shipping_street).' '.$order_data->shipping_house_number.'|'. utf8_decode($order_data->shipping_zip_code).'|'. utf8_decode($order_data->shipping_city).'|'. utf8_decode($country_iso_code).'|'. utf8_decode($customer_email).'|'. utf8_decode($customer_phone).'|'. utf8_decode($order_data->delivery_note_info). "\n"; // order item data foreach ($order_data->items as $item_object) { $amount_sum += $item_object->amount; $csv_text .= 'P|'. $shipping_list_number.'|'. $item_object->item_number.'|'. ' '.'|'. utf8_decode($item_object->item_name).'|'. $item_object->amount.'|'. utf8_decode('Stück').'|'. ' '. "\n"; } } } } $export_count = 1; if (Config::has_key('shipping_export_counter') && Config::is_set('shipping_export_counter')) { $export_count = Config::get_value('shipping_export_counter'); $export_count++; Config::set_key('shipping_export_counter', $export_count); } $today = getdate(); $today = $today['mday'].'.'.$today['mon'].'.'.$today['year']; $csv_text = "H|VGR-Vertrieb GmbH| |".$today."|".$export_count."|".$amount_sum."\n".$csv_text; return $csv_text; } }