setRef($this->generateRef()); $this->dispatchEvent(TheliaEvents::ORDER_BEFORE_CREATE, new OrderEvent($this)); return true; } /** * {@inheritDoc} */ public function postInsert(ConnectionInterface $con = null) { $this->dispatchEvent(TheliaEvents::ORDER_AFTER_CREATE, new OrderEvent($this)); } public function generateRef() { /* order addresses are unique */ return uniqid('ORD', true); } /** * calculate the total amount * * @param int $tax * * @return int|string|Base\double */ public function getTotalAmount(&$tax = 0) { $amount = 0; $tax = 0; /* browse all products */ $orderProductIds = array(); foreach($this->getOrderProducts() as $orderProduct) { $taxAmountQuery = OrderProductTaxQuery::create(); if($orderProduct->getWasInPromo() == 1) { $taxAmountQuery->withColumn('SUM(' . OrderProductTaxTableMap::PROMO_AMOUNT . ')', 'total_tax'); } else { $taxAmountQuery->withColumn('SUM(' . OrderProductTaxTableMap::AMOUNT . ')', 'total_tax'); } $taxAmount = $taxAmountQuery->filterByOrderProductId($orderProduct->getId(), Criteria::EQUAL) ->findOne(); $amount += ($orderProduct->getWasInPromo() == 1 ? $orderProduct->getPromoPrice() : $orderProduct->getPrice()) * $orderProduct->getQuantity(); $tax += round($taxAmount->getVirtualColumn('total_tax'), 2) * $orderProduct->getQuantity(); } return $amount + $tax + $this->getPostage(); // @todo : manage discount } /** * PROPEL SHOULD FIX IT * * Insert the row in the database. * * @param ConnectionInterface $con * * @throws PropelException * @see doSave() */ protected function doInsert(ConnectionInterface $con) { $modifiedColumns = array(); $index = 0; $this->modifiedColumns[] = OrderTableMap::ID; if (null !== $this->id) { throw new PropelException('Cannot insert a value for auto-increment primary key (' . OrderTableMap::ID . ')'); } // check the columns in natural order for more readable SQL queries if ($this->isColumnModified(OrderTableMap::ID)) { $modifiedColumns[':p' . $index++] = 'ID'; } if ($this->isColumnModified(OrderTableMap::REF)) { $modifiedColumns[':p' . $index++] = 'REF'; } if ($this->isColumnModified(OrderTableMap::CUSTOMER_ID)) { $modifiedColumns[':p' . $index++] = 'CUSTOMER_ID'; } if ($this->isColumnModified(OrderTableMap::INVOICE_ORDER_ADDRESS_ID)) { $modifiedColumns[':p' . $index++] = 'INVOICE_ORDER_ADDRESS_ID'; } if ($this->isColumnModified(OrderTableMap::DELIVERY_ORDER_ADDRESS_ID)) { $modifiedColumns[':p' . $index++] = 'DELIVERY_ORDER_ADDRESS_ID'; } if ($this->isColumnModified(OrderTableMap::INVOICE_DATE)) { $modifiedColumns[':p' . $index++] = 'INVOICE_DATE'; } if ($this->isColumnModified(OrderTableMap::CURRENCY_ID)) { $modifiedColumns[':p' . $index++] = 'CURRENCY_ID'; } if ($this->isColumnModified(OrderTableMap::CURRENCY_RATE)) { $modifiedColumns[':p' . $index++] = 'CURRENCY_RATE'; } if ($this->isColumnModified(OrderTableMap::TRANSACTION_REF)) { $modifiedColumns[':p' . $index++] = 'TRANSACTION_REF'; } if ($this->isColumnModified(OrderTableMap::DELIVERY_REF)) { $modifiedColumns[':p' . $index++] = 'DELIVERY_REF'; } if ($this->isColumnModified(OrderTableMap::INVOICE_REF)) { $modifiedColumns[':p' . $index++] = 'INVOICE_REF'; } if ($this->isColumnModified(OrderTableMap::POSTAGE)) { $modifiedColumns[':p' . $index++] = 'POSTAGE'; } if ($this->isColumnModified(OrderTableMap::PAYMENT_MODULE_ID)) { $modifiedColumns[':p' . $index++] = 'PAYMENT_MODULE_ID'; } if ($this->isColumnModified(OrderTableMap::DELIVERY_MODULE_ID)) { $modifiedColumns[':p' . $index++] = 'DELIVERY_MODULE_ID'; } if ($this->isColumnModified(OrderTableMap::STATUS_ID)) { $modifiedColumns[':p' . $index++] = 'STATUS_ID'; } if ($this->isColumnModified(OrderTableMap::LANG_ID)) { $modifiedColumns[':p' . $index++] = 'LANG_ID'; } if ($this->isColumnModified(OrderTableMap::CREATED_AT)) { $modifiedColumns[':p' . $index++] = 'CREATED_AT'; } if ($this->isColumnModified(OrderTableMap::UPDATED_AT)) { $modifiedColumns[':p' . $index++] = 'UPDATED_AT'; } $db = Propel::getServiceContainer()->getAdapter(OrderTableMap::DATABASE_NAME); if ($db->useQuoteIdentifier()) { $tableName = $db->quoteIdentifierTable(OrderTableMap::TABLE_NAME); } else { $tableName = OrderTableMap::TABLE_NAME; } $sql = sprintf( 'INSERT INTO %s (%s) VALUES (%s)', $tableName, implode(', ', $modifiedColumns), implode(', ', array_keys($modifiedColumns)) ); try { $stmt = $con->prepare($sql); foreach ($modifiedColumns as $identifier => $columnName) { switch ($columnName) { case 'ID': $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); break; case 'REF': $stmt->bindValue($identifier, $this->ref, PDO::PARAM_STR); break; case 'CUSTOMER_ID': $stmt->bindValue($identifier, $this->customer_id, PDO::PARAM_INT); break; case 'INVOICE_ORDER_ADDRESS_ID': $stmt->bindValue($identifier, $this->invoice_order_address_id, PDO::PARAM_INT); break; case 'DELIVERY_ORDER_ADDRESS_ID': $stmt->bindValue($identifier, $this->delivery_order_address_id, PDO::PARAM_INT); break; case 'INVOICE_DATE': $stmt->bindValue($identifier, $this->invoice_date ? $this->invoice_date->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); break; case 'CURRENCY_ID': $stmt->bindValue($identifier, $this->currency_id, PDO::PARAM_INT); break; case 'CURRENCY_RATE': $stmt->bindValue($identifier, $this->currency_rate, PDO::PARAM_STR); break; case 'TRANSACTION_REF': $stmt->bindValue($identifier, $this->transaction_ref, PDO::PARAM_STR); break; case 'DELIVERY_REF': $stmt->bindValue($identifier, $this->delivery_ref, PDO::PARAM_STR); break; case 'INVOICE_REF': $stmt->bindValue($identifier, $this->invoice_ref, PDO::PARAM_STR); break; case 'POSTAGE': $stmt->bindValue($identifier, $this->postage, PDO::PARAM_STR); break; case 'PAYMENT_MODULE_ID': $stmt->bindValue($identifier, $this->payment_module_id, PDO::PARAM_INT); break; case 'DELIVERY_MODULE_ID': $stmt->bindValue($identifier, $this->delivery_module_id, PDO::PARAM_INT); break; case 'STATUS_ID': $stmt->bindValue($identifier, $this->status_id, PDO::PARAM_INT); break; case 'LANG_ID': $stmt->bindValue($identifier, $this->lang_id, PDO::PARAM_INT); break; case 'CREATED_AT': $stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); break; case 'UPDATED_AT': $stmt->bindValue($identifier, $this->updated_at ? $this->updated_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); break; } } $stmt->execute(); } catch (Exception $e) { Propel::log($e->getMessage(), Propel::LOG_ERR); throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); } try { $pk = $con->lastInsertId(); } catch (Exception $e) { throw new PropelException('Unable to get autoincrement id.', 0, $e); } $this->setId($pk); $this->setNew(false); } }