Basic split, seems to work (and save).
authorMaxime Bourget <bmx007@gmail.com>
Sat, 8 Jun 2013 15:00:56 +0000 (16:00 +0100)
committerMaxime Bourget <bmx007@gmail.com>
Sat, 8 Jun 2013 15:01:17 +0000 (16:01 +0100)
includes/order_lines.inc
includes/splitter.inc
order_lines_view.php

index 8c0373b39f8895d096d4bd215763952e23fe06cb..9366ecb97779182e80973b2bc9c7413cbfed6d90 100644 (file)
@@ -71,7 +71,7 @@ function split_order_details() {
        if(!isset($_POST['Split']) || $_POST['Split'] != 'Split')  return;
        $splitter = new Splitter($_POST);
        begin_transaction();
-               $splitter->splitAll();
+               if($splitter->splitAll()) display_warning("Items have been split.");
        commit_transaction();
 }
 
index 7804483dd2a8c6485e20bf41890dfa6afd15e8fc..1350f9f297f92966e1014e3c53abe06c7edb37a4 100644 (file)
@@ -1,5 +1,28 @@
 <?php
 require_once($path_to_root.'/'.'includes/date_functions.inc');
+class SqlSet {
+       protected $pairs;
+       function __construct($set=null) {
+               $this->pairs = $set ?  array_merge($set->pairs) : array();
+       }
+
+       function add($value, $field, $quote=true) {
+               if($value !=null)  {
+                       array_push($this->pairs, $quote ? "$field = '$value'" : "$field = $value");
+               }
+
+               return $this;
+       }
+
+       function addDate($date, $field) {
+               return $this->add(date2sql($date), $field);
+       }
+
+       function toString() {
+               return implode(', ', $this->pairs);
+       }
+       
+}
 class Split {
        public $start_date;
        public $end_date;
@@ -26,9 +49,9 @@ class Splitter {
        public $max_quantity;
 
        public function __construct(array $data) {
-               $this->details_id = array();
+               $this->detail_ids = array();
                foreach($data['detail'] as $detail_id => $detail) {
-                       array_push($this->details_id, $detail_id);
+                       array_push($this->detail_ids, $detail_id);
                }
                $this->start_date = $data['start_date'];
                $this->end_date = $data['end_date'];
@@ -46,11 +69,15 @@ class Splitter {
        }
 
        public function splitAll() {
+               $ok =  true;
                foreach($this->detail_ids as $detail_id) {
+display_warning("processing $detail_id");
                                $detail = $this->loadDetail($detail_id);
                                $splits = $this->split($detail);
-                               $this->saveSplits($detail, $splits);
+                               $ok &= $this->saveSplits($detail, $splits);
                }
+
+               return $ok; 
        }
 
        public function days() {
@@ -104,5 +131,55 @@ class Splitter {
                return $splits;
        }
 
+       public function saveSplits($detail, $splits) {
+               if(empty($splits)) return true;
+
+               $detail_id = $detail['id'];
+               $priority = $detail['priority'];
+               $order_no = $detail['order_no'];
+               $trans_type = $detail['trans_type'];
+
+               /* We need to update the first one (as it exists already in the database)
+                * but insert the following one.
+                */
+               $first = array_shift($splits);
+               $set = new SqlSet();
+               $set->addDate($first->start_date, 'hold_until_date')
+                               ->addDate($first->end_date, 'expiry_date')
+                               ->add($first->quantity, 'quantity', false)
+                               ->add($priority, 'priority');
+       display_warning($set->toString());
+               db_query("UPDATE ".TB_PREF."sales_order_details
+                                                       SET {$set->toString()}
+                                                       WHERE id = $detail_id", "Problem splitting order details $detail_id");
+
+               // Compute common field for each split
+               $common_set  = new SqlSet();
+               $common_set->add($order_no, 'order_no', false)
+                               ->add($priority, 'priority')
+                               ->add($trans_type, 'trans_type')
+                               ->add($detail['required_date'], 'required_date')
+                               ->add($detail['comment'], 'comment')
+                               ->add($detail['stk_code'], 'stk_code')
+                               ->add($detail['description'], 'description')
+                               ->add($detail['unit_price'], 'unit_price', false)
+                               ->add($detail['discount_percent'], 'discount_percent', false);
+
+               foreach($splits as $split) {
+                       $set = new SqlSet($common_set);
+                       $set->addDate($split->start_date, 'hold_until_date')
+                               ->addDate($split->end_date, 'expiry_date')
+                               ->add($split->quantity, 'quantity', false);
+       display_warning($set->toString());
+               db_query("INSERT INTO ".TB_PREF."sales_order_details
+                                                       SET {$set->toString()}"
+                                                ,"Problem spliting order details $detail_id");
+               }
+
+               return true;
+               
+
+       }
+
 }
 ?>
index 362b3f0112aa1b2716d4128508de09f3918f3109..926a8a9f8859238674bc7372689aa8f3a7d54e2f 100644 (file)
@@ -17,6 +17,7 @@ include_once($path_to_root . "/sales/includes/sales_ui.inc");
 include_once($path_to_root . "/reporting/includes/reporting.inc");
 
 include_once("includes/order_lines.inc");
+include_once("includes/splitter.inc");
 
 $page_security = 'SA_ORDERLINEX_EDIT';
 add_access_extensions();
@@ -111,9 +112,9 @@ display_db_pager($table);
 
 function display_split_area() {
 start_table(TABLESTYLE_NOBORDER);
-date_cells('Start', 'name', 'title');
-date_cells('End', 'name', 'title');
-qty_cells('Max', 'huu', 6);
+date_cells('Start', 'start_date');
+date_cells('End', 'end_date');
+qty_cells('Max', 'max_quantity', 6);
 submit_cells('Split', 'Split');
 end_table();