Index: modules/in-commerce/units/orders/orders_event_handler.php =================================================================== --- modules/in-commerce/units/orders/orders_event_handler.php +++ modules/in-commerce/units/orders/orders_event_handler.php @@ -2271,21 +2271,18 @@ } /** - * Set next available order number + * Set next available order number. * - * @param kEvent $event + * @param kEvent $event Event. + * + * @return void */ - function setNextOrderNumber($event) + protected function setNextOrderNumber(kEvent $event) { + /** @var OrdersItem $object */ $object = $event->getObject(); - /* @var $object OrdersItem */ - - $sql = 'SELECT MAX(Number) - FROM ' . $this->Application->GetLiveName($object->TableName); - $next_order_number = $this->Conn->GetOne($sql) + 1; - $next_order_number = max($next_order_number, $this->Application->ConfigValue('Comm_Next_Order_Number')); - $this->Application->SetConfigValue('Comm_Next_Order_Number', $next_order_number + 1); + $next_order_number = $this->getNextOrderNumber(); $object->SetDBField('Number', $next_order_number); $object->SetDBField('SubNumber', 0); @@ -2299,6 +2296,50 @@ } /** + * Returns order number to be used next. + * + * @return integer + */ + protected function getNextOrderNumber() + { + $lock_clause = array( + TABLE_PREFIX . 'IdGenerator WRITE', + $this->Application->getUnitOption('conf', 'TableName') . ' WRITE', + $this->Application->getUnitOption($this->Prefix, 'TableName') . ' WRITE', + ); + $this->Conn->Query('LOCK TABLES ' . implode(', ', $lock_clause)); + + $sql = 'UPDATE ' . $this->Application->getUnitOption('conf', 'TableName') . ' + SET VariableValue = GREATEST(VariableValue, ' . $this->getLastUsedOrderNumber() . ') + 1 + WHERE VariableName = "Comm_Next_Order_Number"'; + $this->Conn->Query($sql); + + $sql = 'SELECT VariableValue + FROM ' . $this->Application->getUnitOption('conf', 'TableName') . ' + WHERE VariableName = "Comm_Next_Order_Number"'; + $next_order_number = $this->Conn->GetOne($sql); + + $this->Application->SetConfigValue('Comm_Next_Order_Number', $next_order_number); + + $this->Conn->Query('UNLOCK TABLES'); + + return $next_order_number - 1; + } + + /** + * Returns last used order number. + * + * @return integer + */ + protected function getLastUsedOrderNumber() + { + $sql = 'SELECT MAX(Number) + FROM ' . $this->Application->getUnitOption($this->Prefix, 'TableName'); + + return (int)$this->Conn->GetOne($sql); + } + + /** * Set's new order address based on another address from order (e.g. billing from shipping) * * @param unknown_type $object