Page MenuHomeIn-Portal Phabricator

D141.id352.diff
No OneTemporary

File Metadata

Created
Thu, Sep 25, 11:22 AM

D141.id352.diff

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

Event Timeline