From b9410bba592974163b81088cfdc0831927eb9bda Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Thu, 24 Oct 2013 12:34:44 +0200 Subject: [PATCH 1/2] Implemented prices conversion management --- .../Thelia/Config/Resources/routing/admin.xml | 6 +- .../Controller/Admin/CurrencyController.php | 1 + .../Controller/Admin/ProductController.php | 109 +++++++-- .../Form/ProductSaleElementUpdateForm.php | 8 + core/lib/Thelia/Model/Base/Currency.php | 7 +- core/lib/Thelia/Model/Base/Customer.php | 7 +- core/lib/Thelia/Model/Base/Newsletter.php | 228 +----------------- .../lib/Thelia/Model/Base/NewsletterQuery.php | 195 +-------------- core/lib/Thelia/Model/Base/ProductPrice.php | 18 +- core/lib/Thelia/Model/Map/AddressTableMap.php | 4 +- .../lib/Thelia/Model/Map/CartItemTableMap.php | 6 +- core/lib/Thelia/Model/Map/CartTableMap.php | 19 +- .../lib/Thelia/Model/Map/CurrencyTableMap.php | 3 +- .../lib/Thelia/Model/Map/CustomerTableMap.php | 3 +- .../Thelia/Model/Map/NewsletterTableMap.php | 65 ++--- .../Thelia/Model/Map/ProductPriceTableMap.php | 6 +- .../Model/Map/ProductSaleElementsTableMap.php | 3 +- core/lib/Thelia/Model/Map/ProductTableMap.php | 3 +- install/thelia.sql | 30 ++- local/config/schema.xml | 22 +- .../default/includes/product-details-tab.html | 28 ++- templates/admin/default/product-edit.html | 101 +++++--- 22 files changed, 293 insertions(+), 579 deletions(-) diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index df8c9e4df..019abcfa0 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -303,10 +303,14 @@ Thelia\Controller\Admin\ProductController::updateContentPositionAction - + Thelia\Controller\Admin\ProductController::priceCaclulator + + Thelia\Controller\Admin\ProductController::loadConvertedPrices + + diff --git a/core/lib/Thelia/Controller/Admin/CurrencyController.php b/core/lib/Thelia/Controller/Admin/CurrencyController.php index a50a5cdd6..504877157 100644 --- a/core/lib/Thelia/Controller/Admin/CurrencyController.php +++ b/core/lib/Thelia/Controller/Admin/CurrencyController.php @@ -32,6 +32,7 @@ use Thelia\Model\CurrencyQuery; use Thelia\Form\CurrencyModificationForm; use Thelia\Form\CurrencyCreationForm; use Thelia\Core\Event\UpdatePositionEvent; +use Thelia\Core\Security\AccessManager; /** * Manages currencies diff --git a/core/lib/Thelia/Controller/Admin/ProductController.php b/core/lib/Thelia/Controller/Admin/ProductController.php index d56898662..7e54e6345 100644 --- a/core/lib/Thelia/Controller/Admin/ProductController.php +++ b/core/lib/Thelia/Controller/Admin/ProductController.php @@ -65,6 +65,8 @@ use Thelia\Model\Country; use Thelia\Model\CountryQuery; use Thelia\Model\TaxRuleQuery; use Thelia\Tools\NumberFormat; +use Thelia\Model\Product; +use Thelia\Model\CurrencyQuery; /** * Manages products @@ -206,7 +208,9 @@ class ProductController extends AbstractCrudController ->findOne() ; - if ($productPrice == null) $productPrice = new ProductPrice(); + if ($productPrice == null) { + $productPrice = new ProductPrice(); + } $isDefaultPse = count($saleElement->getAttributeCombinations()) == 0; @@ -219,12 +223,14 @@ class ProductController extends AbstractCrudController "product_sale_element_id" => $saleElement->getId(), "reference" => $saleElement->getRef(), "price" => $productPrice->getPrice(), + "price_with_tax" => $this->computePrice($productPrice->getPrice(), 'without_tax', $object), "use_exchange_rate" => $productPrice->getFromDefaultCurrency() ? 1 : 0, "tax_rule" => $object->getTaxRuleId(), "currency" => $productPrice->getCurrencyId(), "weight" => $saleElement->getWeight(), "quantity" => $saleElement->getQuantity(), "sale_price" => $productPrice->getPromoPrice(), + "sale_price_with_tax" => $this->computePrice($productPrice->getPromoPrice(), 'without_tax', $object), "onsale" => $saleElement->getPromo() > 0 ? 1 : 0, "isnew" => $saleElement->getNewness() > 0 ? 1 : 0, "isdefault" => $saleElement->getIsDefault() > 0 ? 1 : 0, @@ -847,7 +853,7 @@ class ProductController extends AbstractCrudController protected function processProductSaleElementUpdate($changeForm) { // Check current user authorization - if (null !== $response = $this->checkAuth("admin.products.update")) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, AccessManager::UPDATE)) return $response; $error_msg = false; @@ -928,24 +934,102 @@ class ProductController extends AbstractCrudController ); } + /** + * Invoked through Ajax; this methow calculate the taxed price from the unaxed price, and + * vice versa. + */ public function priceCaclulator() { - $price = floatval($this->getRequest()->get('price', 0)); - $tax_rule = intval($this->getRequest()->get('tax_rule_id', 0)); // The tax rule ID - $action = $this->getRequest()->get('action', ''); // With ot without tax - $convert = intval($this->getRequest()->get('convert_from_default_currency', 0)); + $return_price = 0; + + $price = floatval($this->getRequest()->get('price', 0)); + $product_id = intval($this->getRequest()->get('product_id', 0)); + $action = $this->getRequest()->get('action', ''); // With ot without tax + $convert = intval($this->getRequest()->get('convert_from_default_currency', 0)); + + if (null !== $product = ProductQuery::create()->findPk($product_id)) { + + if ($action == 'to_tax') { + $return_price = $this->computePrice($price, 'without_tax', $product); + } + else if ($action == 'from_tax') { + $return_price = $this->computePrice($price, 'with_tax', $product); + } + else { + $return_price = $price; + } + + if ($convert != 0) { + $return_price = $prix * Currency::getDefaultCurrency()->getRate(); + } + } + + return new JsonResponse(array('result' => $return_price)); + } + + public function loadConvertedPrices() { + + $product_sale_element_id = intval($this->getRequest()->get('product_sale_element_id', 0)); + $currency_id = intval($this->getRequest()->get('currency_id', 0)); + + $price_with_tax = $price_without_tax = $sale_price_with_tax = $sale_price_without_tax = 0; + + if (null !== $pse = ProductSaleElementsQuery::create()->findPk($product_sale_element_id)) { + if ($currency_id > 0 + && + $currency_id != Currency::getDefaultCurrency()->getId() + && + null !== $currency = CurrencyQuery::create()->findPk($currency_id)) { + + // Get the default currency price + $productPrice = ProductPriceQuery::create() + ->filterByCurrency(Currency::getDefaultCurrency()) + ->filterByProductSaleElementsId($product_sale_element_id) + ->findOne() + ; + + // Calculate the converted price + if (null !== $productPrice) { + $price_without_tax = $productPrice->getPrice() * $currency->getRate(); + $sale_price_without_tax = $productPrice->getPromoPrice() * $currency->getRate(); + } + } + + if (null !== $product = $pse->getProduct()) { + $price_with_tax = $this->computePrice($price_without_tax, 'with_tax', $product); + $sale_price_with_tax = $this->computePrice($sale_price_without_tax, 'with_tax', $product); + } + } + + return new JsonResponse(array( + 'price_with_tax' => NumberFormat::getInstance($this->getRequest())->format($price_with_tax, null, '.'), + 'price_without_tax' => NumberFormat::getInstance($this->getRequest())->format($price_without_tax, null, '.'), + 'sale_price_with_tax' => NumberFormat::getInstance($this->getRequest())->format($sale_price_with_tax, null, '.'), + 'sale_price_without_tax' => NumberFormat::getInstance($this->getRequest())->format($sale_price_without_tax, null, '.') + )); + } + + /** + * Calculate taxed/untexted price for a product + * + * @param unknown $price + * @param unknown $price_type + * @param Product $product + * @return Ambigous + */ + protected function computePrice($price, $price_type, Product $product, $convert = false) { $calc = new Calculator(); - $calc->loadTaxRule( - TaxRuleQuery::create()->findPk($tax_rule), + $calc->load( + $product, Country::getShopLocation() ); - if ($action == 'to_tax') { + if ($price_type == 'without_tax') { $return_price = $calc->getTaxedPrice($price); } - else if ($action == 'from_tax') { + else if ($price_type == 'with_tax') { $return_price = $calc->getUntaxedPrice($price); } else { @@ -955,10 +1039,7 @@ class ProductController extends AbstractCrudController if ($convert != 0) { $return_price = $prix * Currency::getDefaultCurrency()->getRate(); } - // Format the number using '.', to perform further calculation - $return_price = NumberFormat::getInstance($this->getRequest())->format($return_price, null, '.'); - - return new JsonResponse(array('result' => $return_price)); + return NumberFormat::getInstance($this->getRequest())->format($return_price, null, '.'); } } diff --git a/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php b/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php index e3a74a755..3d7966cab 100644 --- a/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php +++ b/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php @@ -52,6 +52,10 @@ class ProductSaleElementUpdateForm extends BaseForm "label" => Translator::getInstance()->trans("Product price excluding taxes *"), "label_attr" => array("for" => "price_field") )) + ->add("price_with_tax", "number", array( + "label" => Translator::getInstance()->trans("Product price including taxes"), + "label_attr" => array("for" => "price_with_tax_field") + )) ->add("currency", "integer", array( "constraints" => array(new NotBlank()), "label" => Translator::getInstance()->trans("Price currency *"), @@ -76,6 +80,10 @@ class ProductSaleElementUpdateForm extends BaseForm "label" => Translator::getInstance()->trans("Sale price without taxes *"), "label_attr" => array("for" => "price_with_tax_field") )) + ->add("sale_price_with_tax", "number", array( + "label" => Translator::getInstance()->trans("Sale price including taxes"), + "label_attr" => array("for" => "sale_price_with_tax_field") + )) ->add("onsale", "integer", array( "label" => Translator::getInstance()->trans("This product is on sale"), "label_attr" => array("for" => "onsale_field") diff --git a/core/lib/Thelia/Model/Base/Currency.php b/core/lib/Thelia/Model/Base/Currency.php index fea63f546..2161e4425 100644 --- a/core/lib/Thelia/Model/Base/Currency.php +++ b/core/lib/Thelia/Model/Base/Currency.php @@ -1008,10 +1008,9 @@ abstract class Currency implements ActiveRecordInterface if ($this->cartsScheduledForDeletion !== null) { if (!$this->cartsScheduledForDeletion->isEmpty()) { - foreach ($this->cartsScheduledForDeletion as $cart) { - // need to save related object because we set the relation to null - $cart->save($con); - } + \Thelia\Model\CartQuery::create() + ->filterByPrimaryKeys($this->cartsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); $this->cartsScheduledForDeletion = null; } } diff --git a/core/lib/Thelia/Model/Base/Customer.php b/core/lib/Thelia/Model/Base/Customer.php index 8ec119627..857dc5e17 100644 --- a/core/lib/Thelia/Model/Base/Customer.php +++ b/core/lib/Thelia/Model/Base/Customer.php @@ -1350,10 +1350,9 @@ abstract class Customer implements ActiveRecordInterface if ($this->cartsScheduledForDeletion !== null) { if (!$this->cartsScheduledForDeletion->isEmpty()) { - foreach ($this->cartsScheduledForDeletion as $cart) { - // need to save related object because we set the relation to null - $cart->save($con); - } + \Thelia\Model\CartQuery::create() + ->filterByPrimaryKeys($this->cartsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); $this->cartsScheduledForDeletion = null; } } diff --git a/core/lib/Thelia/Model/Base/Newsletter.php b/core/lib/Thelia/Model/Base/Newsletter.php index 5282045d3..ff7afb159 100644 --- a/core/lib/Thelia/Model/Base/Newsletter.php +++ b/core/lib/Thelia/Model/Base/Newsletter.php @@ -2,7 +2,6 @@ namespace Thelia\Model\Base; -use \DateTime; use \Exception; use \PDO; use Propel\Runtime\Propel; @@ -15,8 +14,6 @@ use Propel\Runtime\Exception\BadMethodCallException; use Propel\Runtime\Exception\PropelException; use Propel\Runtime\Map\TableMap; use Propel\Runtime\Parser\AbstractParser; -use Propel\Runtime\Util\PropelDateTime; -use Thelia\Model\Newsletter as ChildNewsletter; use Thelia\Model\NewsletterQuery as ChildNewsletterQuery; use Thelia\Model\Map\NewsletterTableMap; @@ -78,24 +75,6 @@ abstract class Newsletter implements ActiveRecordInterface */ protected $lastname; - /** - * The value for the locale field. - * @var string - */ - protected $locale; - - /** - * The value for the created_at field. - * @var string - */ - protected $created_at; - - /** - * The value for the updated_at field. - * @var string - */ - protected $updated_at; - /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -406,57 +385,6 @@ abstract class Newsletter implements ActiveRecordInterface return $this->lastname; } - /** - * Get the [locale] column value. - * - * @return string - */ - public function getLocale() - { - - return $this->locale; - } - - /** - * Get the [optionally formatted] temporal [created_at] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw \DateTime object will be returned. - * - * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 - * - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getCreatedAt($format = NULL) - { - if ($format === null) { - return $this->created_at; - } else { - return $this->created_at instanceof \DateTime ? $this->created_at->format($format) : null; - } - } - - /** - * Get the [optionally formatted] temporal [updated_at] column value. - * - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the raw \DateTime object will be returned. - * - * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 - * - * @throws PropelException - if unable to parse/validate the date/time value. - */ - public function getUpdatedAt($format = NULL) - { - if ($format === null) { - return $this->updated_at; - } else { - return $this->updated_at instanceof \DateTime ? $this->updated_at->format($format) : null; - } - } - /** * Set the value of [id] column. * @@ -541,69 +469,6 @@ abstract class Newsletter implements ActiveRecordInterface return $this; } // setLastname() - /** - * Set the value of [locale] column. - * - * @param string $v new value - * @return \Thelia\Model\Newsletter The current object (for fluent API support) - */ - public function setLocale($v) - { - if ($v !== null) { - $v = (string) $v; - } - - if ($this->locale !== $v) { - $this->locale = $v; - $this->modifiedColumns[] = NewsletterTableMap::LOCALE; - } - - - return $this; - } // setLocale() - - /** - * Sets the value of [created_at] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or \DateTime value. - * Empty strings are treated as NULL. - * @return \Thelia\Model\Newsletter The current object (for fluent API support) - */ - public function setCreatedAt($v) - { - $dt = PropelDateTime::newInstance($v, null, '\DateTime'); - if ($this->created_at !== null || $dt !== null) { - if ($dt !== $this->created_at) { - $this->created_at = $dt; - $this->modifiedColumns[] = NewsletterTableMap::CREATED_AT; - } - } // if either are not null - - - return $this; - } // setCreatedAt() - - /** - * Sets the value of [updated_at] column to a normalized version of the date/time value specified. - * - * @param mixed $v string, integer (timestamp), or \DateTime value. - * Empty strings are treated as NULL. - * @return \Thelia\Model\Newsletter The current object (for fluent API support) - */ - public function setUpdatedAt($v) - { - $dt = PropelDateTime::newInstance($v, null, '\DateTime'); - if ($this->updated_at !== null || $dt !== null) { - if ($dt !== $this->updated_at) { - $this->updated_at = $dt; - $this->modifiedColumns[] = NewsletterTableMap::UPDATED_AT; - } - } // if either are not null - - - return $this; - } // setUpdatedAt() - /** * Indicates whether the columns in this object are only set to default values. * @@ -652,21 +517,6 @@ abstract class Newsletter implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : NewsletterTableMap::translateFieldName('Lastname', TableMap::TYPE_PHPNAME, $indexType)]; $this->lastname = (null !== $col) ? (string) $col : null; - - $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : NewsletterTableMap::translateFieldName('Locale', TableMap::TYPE_PHPNAME, $indexType)]; - $this->locale = (null !== $col) ? (string) $col : null; - - $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : NewsletterTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)]; - if ($col === '0000-00-00 00:00:00') { - $col = null; - } - $this->created_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; - - $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : NewsletterTableMap::translateFieldName('UpdatedAt', TableMap::TYPE_PHPNAME, $indexType)]; - if ($col === '0000-00-00 00:00:00') { - $col = null; - } - $this->updated_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; $this->resetModified(); $this->setNew(false); @@ -675,7 +525,7 @@ abstract class Newsletter implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 7; // 7 = NewsletterTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 4; // 4 = NewsletterTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating \Thelia\Model\Newsletter object", 0, $e); @@ -806,19 +656,8 @@ abstract class Newsletter implements ActiveRecordInterface $ret = $this->preSave($con); if ($isInsert) { $ret = $ret && $this->preInsert($con); - // timestampable behavior - if (!$this->isColumnModified(NewsletterTableMap::CREATED_AT)) { - $this->setCreatedAt(time()); - } - if (!$this->isColumnModified(NewsletterTableMap::UPDATED_AT)) { - $this->setUpdatedAt(time()); - } } else { $ret = $ret && $this->preUpdate($con); - // timestampable behavior - if ($this->isModified() && !$this->isColumnModified(NewsletterTableMap::UPDATED_AT)) { - $this->setUpdatedAt(time()); - } } if ($ret) { $affectedRows = $this->doSave($con); @@ -907,15 +746,6 @@ abstract class Newsletter implements ActiveRecordInterface if ($this->isColumnModified(NewsletterTableMap::LASTNAME)) { $modifiedColumns[':p' . $index++] = 'LASTNAME'; } - if ($this->isColumnModified(NewsletterTableMap::LOCALE)) { - $modifiedColumns[':p' . $index++] = 'LOCALE'; - } - if ($this->isColumnModified(NewsletterTableMap::CREATED_AT)) { - $modifiedColumns[':p' . $index++] = 'CREATED_AT'; - } - if ($this->isColumnModified(NewsletterTableMap::UPDATED_AT)) { - $modifiedColumns[':p' . $index++] = 'UPDATED_AT'; - } $sql = sprintf( 'INSERT INTO newsletter (%s) VALUES (%s)', @@ -939,15 +769,6 @@ abstract class Newsletter implements ActiveRecordInterface case 'LASTNAME': $stmt->bindValue($identifier, $this->lastname, PDO::PARAM_STR); break; - case 'LOCALE': - $stmt->bindValue($identifier, $this->locale, PDO::PARAM_STR); - 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(); @@ -1022,15 +843,6 @@ abstract class Newsletter implements ActiveRecordInterface case 3: return $this->getLastname(); break; - case 4: - return $this->getLocale(); - break; - case 5: - return $this->getCreatedAt(); - break; - case 6: - return $this->getUpdatedAt(); - break; default: return null; break; @@ -1063,9 +875,6 @@ abstract class Newsletter implements ActiveRecordInterface $keys[1] => $this->getEmail(), $keys[2] => $this->getFirstname(), $keys[3] => $this->getLastname(), - $keys[4] => $this->getLocale(), - $keys[5] => $this->getCreatedAt(), - $keys[6] => $this->getUpdatedAt(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -1117,15 +926,6 @@ abstract class Newsletter implements ActiveRecordInterface case 3: $this->setLastname($value); break; - case 4: - $this->setLocale($value); - break; - case 5: - $this->setCreatedAt($value); - break; - case 6: - $this->setUpdatedAt($value); - break; } // switch() } @@ -1154,9 +954,6 @@ abstract class Newsletter implements ActiveRecordInterface if (array_key_exists($keys[1], $arr)) $this->setEmail($arr[$keys[1]]); if (array_key_exists($keys[2], $arr)) $this->setFirstname($arr[$keys[2]]); if (array_key_exists($keys[3], $arr)) $this->setLastname($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setLocale($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setCreatedAt($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setUpdatedAt($arr[$keys[6]]); } /** @@ -1172,9 +969,6 @@ abstract class Newsletter implements ActiveRecordInterface if ($this->isColumnModified(NewsletterTableMap::EMAIL)) $criteria->add(NewsletterTableMap::EMAIL, $this->email); if ($this->isColumnModified(NewsletterTableMap::FIRSTNAME)) $criteria->add(NewsletterTableMap::FIRSTNAME, $this->firstname); if ($this->isColumnModified(NewsletterTableMap::LASTNAME)) $criteria->add(NewsletterTableMap::LASTNAME, $this->lastname); - if ($this->isColumnModified(NewsletterTableMap::LOCALE)) $criteria->add(NewsletterTableMap::LOCALE, $this->locale); - if ($this->isColumnModified(NewsletterTableMap::CREATED_AT)) $criteria->add(NewsletterTableMap::CREATED_AT, $this->created_at); - if ($this->isColumnModified(NewsletterTableMap::UPDATED_AT)) $criteria->add(NewsletterTableMap::UPDATED_AT, $this->updated_at); return $criteria; } @@ -1241,9 +1035,6 @@ abstract class Newsletter implements ActiveRecordInterface $copyObj->setEmail($this->getEmail()); $copyObj->setFirstname($this->getFirstname()); $copyObj->setLastname($this->getLastname()); - $copyObj->setLocale($this->getLocale()); - $copyObj->setCreatedAt($this->getCreatedAt()); - $copyObj->setUpdatedAt($this->getUpdatedAt()); if ($makeNew) { $copyObj->setNew(true); $copyObj->setId(NULL); // this is a auto-increment column, so set to default value @@ -1281,9 +1072,6 @@ abstract class Newsletter implements ActiveRecordInterface $this->email = null; $this->firstname = null; $this->lastname = null; - $this->locale = null; - $this->created_at = null; - $this->updated_at = null; $this->alreadyInSave = false; $this->clearAllReferences(); $this->resetModified(); @@ -1317,20 +1105,6 @@ abstract class Newsletter implements ActiveRecordInterface return (string) $this->exportTo(NewsletterTableMap::DEFAULT_STRING_FORMAT); } - // timestampable behavior - - /** - * Mark the current object so that the update date doesn't get updated during next save - * - * @return ChildNewsletter The current object (for fluent API support) - */ - public function keepUpdateDateUnchanged() - { - $this->modifiedColumns[] = NewsletterTableMap::UPDATED_AT; - - return $this; - } - /** * Code to be run before persisting the object * @param ConnectionInterface $con diff --git a/core/lib/Thelia/Model/Base/NewsletterQuery.php b/core/lib/Thelia/Model/Base/NewsletterQuery.php index ef9ac0a22..79474e629 100644 --- a/core/lib/Thelia/Model/Base/NewsletterQuery.php +++ b/core/lib/Thelia/Model/Base/NewsletterQuery.php @@ -22,17 +22,11 @@ use Thelia\Model\Map\NewsletterTableMap; * @method ChildNewsletterQuery orderByEmail($order = Criteria::ASC) Order by the email column * @method ChildNewsletterQuery orderByFirstname($order = Criteria::ASC) Order by the firstname column * @method ChildNewsletterQuery orderByLastname($order = Criteria::ASC) Order by the lastname column - * @method ChildNewsletterQuery orderByLocale($order = Criteria::ASC) Order by the locale column - * @method ChildNewsletterQuery orderByCreatedAt($order = Criteria::ASC) Order by the created_at column - * @method ChildNewsletterQuery orderByUpdatedAt($order = Criteria::ASC) Order by the updated_at column * * @method ChildNewsletterQuery groupById() Group by the id column * @method ChildNewsletterQuery groupByEmail() Group by the email column * @method ChildNewsletterQuery groupByFirstname() Group by the firstname column * @method ChildNewsletterQuery groupByLastname() Group by the lastname column - * @method ChildNewsletterQuery groupByLocale() Group by the locale column - * @method ChildNewsletterQuery groupByCreatedAt() Group by the created_at column - * @method ChildNewsletterQuery groupByUpdatedAt() Group by the updated_at column * * @method ChildNewsletterQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method ChildNewsletterQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -45,17 +39,11 @@ use Thelia\Model\Map\NewsletterTableMap; * @method ChildNewsletter findOneByEmail(string $email) Return the first ChildNewsletter filtered by the email column * @method ChildNewsletter findOneByFirstname(string $firstname) Return the first ChildNewsletter filtered by the firstname column * @method ChildNewsletter findOneByLastname(string $lastname) Return the first ChildNewsletter filtered by the lastname column - * @method ChildNewsletter findOneByLocale(string $locale) Return the first ChildNewsletter filtered by the locale column - * @method ChildNewsletter findOneByCreatedAt(string $created_at) Return the first ChildNewsletter filtered by the created_at column - * @method ChildNewsletter findOneByUpdatedAt(string $updated_at) Return the first ChildNewsletter filtered by the updated_at column * * @method array findById(int $id) Return ChildNewsletter objects filtered by the id column * @method array findByEmail(string $email) Return ChildNewsletter objects filtered by the email column * @method array findByFirstname(string $firstname) Return ChildNewsletter objects filtered by the firstname column * @method array findByLastname(string $lastname) Return ChildNewsletter objects filtered by the lastname column - * @method array findByLocale(string $locale) Return ChildNewsletter objects filtered by the locale column - * @method array findByCreatedAt(string $created_at) Return ChildNewsletter objects filtered by the created_at column - * @method array findByUpdatedAt(string $updated_at) Return ChildNewsletter objects filtered by the updated_at column * */ abstract class NewsletterQuery extends ModelCriteria @@ -144,7 +132,7 @@ abstract class NewsletterQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT ID, EMAIL, FIRSTNAME, LASTNAME, LOCALE, CREATED_AT, UPDATED_AT FROM newsletter WHERE ID = :p0'; + $sql = 'SELECT ID, EMAIL, FIRSTNAME, LASTNAME FROM newsletter WHERE ID = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -361,121 +349,6 @@ abstract class NewsletterQuery extends ModelCriteria return $this->addUsingAlias(NewsletterTableMap::LASTNAME, $lastname, $comparison); } - /** - * Filter the query on the locale column - * - * Example usage: - * - * $query->filterByLocale('fooValue'); // WHERE locale = 'fooValue' - * $query->filterByLocale('%fooValue%'); // WHERE locale LIKE '%fooValue%' - * - * - * @param string $locale The value to use as filter. - * Accepts wildcards (* and % trigger a LIKE) - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function filterByLocale($locale = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($locale)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $locale)) { - $locale = str_replace('*', '%', $locale); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(NewsletterTableMap::LOCALE, $locale, $comparison); - } - - /** - * Filter the query on the created_at column - * - * Example usage: - * - * $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14' - * $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14' - * $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13' - * - * - * @param mixed $createdAt The value to use as filter. - * Values can be integers (unix timestamps), DateTime objects, or strings. - * Empty strings are treated as NULL. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function filterByCreatedAt($createdAt = null, $comparison = null) - { - if (is_array($createdAt)) { - $useMinMax = false; - if (isset($createdAt['min'])) { - $this->addUsingAlias(NewsletterTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($createdAt['max'])) { - $this->addUsingAlias(NewsletterTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(NewsletterTableMap::CREATED_AT, $createdAt, $comparison); - } - - /** - * Filter the query on the updated_at column - * - * Example usage: - * - * $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14' - * $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14' - * $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13' - * - * - * @param mixed $updatedAt The value to use as filter. - * Values can be integers (unix timestamps), DateTime objects, or strings. - * Empty strings are treated as NULL. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function filterByUpdatedAt($updatedAt = null, $comparison = null) - { - if (is_array($updatedAt)) { - $useMinMax = false; - if (isset($updatedAt['min'])) { - $this->addUsingAlias(NewsletterTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($updatedAt['max'])) { - $this->addUsingAlias(NewsletterTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(NewsletterTableMap::UPDATED_AT, $updatedAt, $comparison); - } - /** * Exclude object from result * @@ -567,70 +440,4 @@ abstract class NewsletterQuery extends ModelCriteria } } - // timestampable behavior - - /** - * Filter by the latest updated - * - * @param int $nbDays Maximum age of the latest update in days - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function recentlyUpdated($nbDays = 7) - { - return $this->addUsingAlias(NewsletterTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); - } - - /** - * Filter by the latest created - * - * @param int $nbDays Maximum age of in days - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function recentlyCreated($nbDays = 7) - { - return $this->addUsingAlias(NewsletterTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); - } - - /** - * Order by update date desc - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function lastUpdatedFirst() - { - return $this->addDescendingOrderByColumn(NewsletterTableMap::UPDATED_AT); - } - - /** - * Order by update date asc - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function firstUpdatedFirst() - { - return $this->addAscendingOrderByColumn(NewsletterTableMap::UPDATED_AT); - } - - /** - * Order by create date desc - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function lastCreatedFirst() - { - return $this->addDescendingOrderByColumn(NewsletterTableMap::CREATED_AT); - } - - /** - * Order by create date asc - * - * @return ChildNewsletterQuery The current query, for fluid interface - */ - public function firstCreatedFirst() - { - return $this->addAscendingOrderByColumn(NewsletterTableMap::CREATED_AT); - } - } // NewsletterQuery diff --git a/core/lib/Thelia/Model/Base/ProductPrice.php b/core/lib/Thelia/Model/Base/ProductPrice.php index 363244e07..e5c5b3f27 100644 --- a/core/lib/Thelia/Model/Base/ProductPrice.php +++ b/core/lib/Thelia/Model/Base/ProductPrice.php @@ -72,19 +72,21 @@ abstract class ProductPrice implements ActiveRecordInterface /** * The value for the price field. + * Note: this column has a database default value of: 0 * @var double */ protected $price; /** * The value for the promo_price field. + * Note: this column has a database default value of: 0 * @var double */ protected $promo_price; /** * The value for the from_default_currency field. - * Note: this column has a database default value of: false + * Note: this column has a database default value of: true * @var boolean */ protected $from_default_currency; @@ -127,7 +129,9 @@ abstract class ProductPrice implements ActiveRecordInterface */ public function applyDefaultValues() { - $this->from_default_currency = false; + $this->price = 0; + $this->promo_price = 0; + $this->from_default_currency = true; } /** @@ -658,7 +662,15 @@ abstract class ProductPrice implements ActiveRecordInterface */ public function hasOnlyDefaultValues() { - if ($this->from_default_currency !== false) { + if ($this->price !== 0) { + return false; + } + + if ($this->promo_price !== 0) { + return false; + } + + if ($this->from_default_currency !== true) { return false; } diff --git a/core/lib/Thelia/Model/Map/AddressTableMap.php b/core/lib/Thelia/Model/Map/AddressTableMap.php index 46e2be02d..ff9925d38 100644 --- a/core/lib/Thelia/Model/Map/AddressTableMap.php +++ b/core/lib/Thelia/Model/Map/AddressTableMap.php @@ -238,8 +238,8 @@ class AddressTableMap extends TableMap $this->addRelation('Customer', '\\Thelia\\Model\\Customer', RelationMap::MANY_TO_ONE, array('customer_id' => 'id', ), 'CASCADE', 'RESTRICT'); $this->addRelation('CustomerTitle', '\\Thelia\\Model\\CustomerTitle', RelationMap::MANY_TO_ONE, array('title_id' => 'id', ), 'RESTRICT', 'RESTRICT'); $this->addRelation('Country', '\\Thelia\\Model\\Country', RelationMap::MANY_TO_ONE, array('country_id' => 'id', ), 'RESTRICT', 'RESTRICT'); - $this->addRelation('CartRelatedByAddressDeliveryId', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'address_delivery_id', ), null, null, 'CartsRelatedByAddressDeliveryId'); - $this->addRelation('CartRelatedByAddressInvoiceId', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'address_invoice_id', ), null, null, 'CartsRelatedByAddressInvoiceId'); + $this->addRelation('CartRelatedByAddressDeliveryId', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'address_delivery_id', ), 'RESTRICT', 'RESTRICT', 'CartsRelatedByAddressDeliveryId'); + $this->addRelation('CartRelatedByAddressInvoiceId', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'address_invoice_id', ), 'RESTRICT', 'RESTRICT', 'CartsRelatedByAddressInvoiceId'); } // buildRelations() /** diff --git a/core/lib/Thelia/Model/Map/CartItemTableMap.php b/core/lib/Thelia/Model/Map/CartItemTableMap.php index c48d298e0..cf10165ed 100644 --- a/core/lib/Thelia/Model/Map/CartItemTableMap.php +++ b/core/lib/Thelia/Model/Map/CartItemTableMap.php @@ -199,9 +199,9 @@ class CartItemTableMap extends TableMap */ public function buildRelations() { - $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::MANY_TO_ONE, array('cart_id' => 'id', ), null, null); - $this->addRelation('Product', '\\Thelia\\Model\\Product', RelationMap::MANY_TO_ONE, array('product_id' => 'id', ), null, null); - $this->addRelation('ProductSaleElements', '\\Thelia\\Model\\ProductSaleElements', RelationMap::MANY_TO_ONE, array('product_sale_elements_id' => 'id', ), null, null); + $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::MANY_TO_ONE, array('cart_id' => 'id', ), 'CASCADE', 'RESTRICT'); + $this->addRelation('Product', '\\Thelia\\Model\\Product', RelationMap::MANY_TO_ONE, array('product_id' => 'id', ), 'CASCADE', 'RESTRICT'); + $this->addRelation('ProductSaleElements', '\\Thelia\\Model\\ProductSaleElements', RelationMap::MANY_TO_ONE, array('product_sale_elements_id' => 'id', ), 'CASCADE', 'RESTRICT'); } // buildRelations() /** diff --git a/core/lib/Thelia/Model/Map/CartTableMap.php b/core/lib/Thelia/Model/Map/CartTableMap.php index d839b4e91..2f81472cd 100644 --- a/core/lib/Thelia/Model/Map/CartTableMap.php +++ b/core/lib/Thelia/Model/Map/CartTableMap.php @@ -181,11 +181,11 @@ class CartTableMap extends TableMap */ public function buildRelations() { - $this->addRelation('Customer', '\\Thelia\\Model\\Customer', RelationMap::MANY_TO_ONE, array('customer_id' => 'id', ), null, null); - $this->addRelation('AddressRelatedByAddressDeliveryId', '\\Thelia\\Model\\Address', RelationMap::MANY_TO_ONE, array('address_delivery_id' => 'id', ), null, null); - $this->addRelation('AddressRelatedByAddressInvoiceId', '\\Thelia\\Model\\Address', RelationMap::MANY_TO_ONE, array('address_invoice_id' => 'id', ), null, null); - $this->addRelation('Currency', '\\Thelia\\Model\\Currency', RelationMap::MANY_TO_ONE, array('currency_id' => 'id', ), null, null); - $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'cart_id', ), null, null, 'CartItems'); + $this->addRelation('Customer', '\\Thelia\\Model\\Customer', RelationMap::MANY_TO_ONE, array('customer_id' => 'id', ), 'CASCADE', 'RESTRICT'); + $this->addRelation('AddressRelatedByAddressDeliveryId', '\\Thelia\\Model\\Address', RelationMap::MANY_TO_ONE, array('address_delivery_id' => 'id', ), 'RESTRICT', 'RESTRICT'); + $this->addRelation('AddressRelatedByAddressInvoiceId', '\\Thelia\\Model\\Address', RelationMap::MANY_TO_ONE, array('address_invoice_id' => 'id', ), 'RESTRICT', 'RESTRICT'); + $this->addRelation('Currency', '\\Thelia\\Model\\Currency', RelationMap::MANY_TO_ONE, array('currency_id' => 'id', ), 'CASCADE', 'RESTRICT'); + $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'cart_id', ), 'CASCADE', 'RESTRICT', 'CartItems'); } // buildRelations() /** @@ -200,6 +200,15 @@ class CartTableMap extends TableMap 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), ); } // getBehaviors() + /** + * Method to invalidate the instance pool of all tables related to cart * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CartItemTableMap::clearInstancePool(); + } /** * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. diff --git a/core/lib/Thelia/Model/Map/CurrencyTableMap.php b/core/lib/Thelia/Model/Map/CurrencyTableMap.php index 9c0e65296..3d4e6ebac 100644 --- a/core/lib/Thelia/Model/Map/CurrencyTableMap.php +++ b/core/lib/Thelia/Model/Map/CurrencyTableMap.php @@ -185,7 +185,7 @@ class CurrencyTableMap extends TableMap public function buildRelations() { $this->addRelation('Order', '\\Thelia\\Model\\Order', RelationMap::ONE_TO_MANY, array('id' => 'currency_id', ), 'RESTRICT', 'RESTRICT', 'Orders'); - $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'currency_id', ), null, null, 'Carts'); + $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'currency_id', ), 'CASCADE', 'RESTRICT', 'Carts'); $this->addRelation('ProductPrice', '\\Thelia\\Model\\ProductPrice', RelationMap::ONE_TO_MANY, array('id' => 'currency_id', ), 'CASCADE', null, 'ProductPrices'); $this->addRelation('CurrencyI18n', '\\Thelia\\Model\\CurrencyI18n', RelationMap::ONE_TO_MANY, array('id' => 'id', ), 'CASCADE', null, 'CurrencyI18ns'); } // buildRelations() @@ -210,6 +210,7 @@ class CurrencyTableMap extends TableMap { // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CartTableMap::clearInstancePool(); ProductPriceTableMap::clearInstancePool(); CurrencyI18nTableMap::clearInstancePool(); } diff --git a/core/lib/Thelia/Model/Map/CustomerTableMap.php b/core/lib/Thelia/Model/Map/CustomerTableMap.php index 2c1fdfae2..b3cc9d077 100644 --- a/core/lib/Thelia/Model/Map/CustomerTableMap.php +++ b/core/lib/Thelia/Model/Map/CustomerTableMap.php @@ -226,7 +226,7 @@ class CustomerTableMap extends TableMap $this->addRelation('CustomerTitle', '\\Thelia\\Model\\CustomerTitle', RelationMap::MANY_TO_ONE, array('title_id' => 'id', ), 'RESTRICT', 'RESTRICT'); $this->addRelation('Address', '\\Thelia\\Model\\Address', RelationMap::ONE_TO_MANY, array('id' => 'customer_id', ), 'CASCADE', 'RESTRICT', 'Addresses'); $this->addRelation('Order', '\\Thelia\\Model\\Order', RelationMap::ONE_TO_MANY, array('id' => 'customer_id', ), 'RESTRICT', 'RESTRICT', 'Orders'); - $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'customer_id', ), null, null, 'Carts'); + $this->addRelation('Cart', '\\Thelia\\Model\\Cart', RelationMap::ONE_TO_MANY, array('id' => 'customer_id', ), 'CASCADE', 'RESTRICT', 'Carts'); } // buildRelations() /** @@ -249,6 +249,7 @@ class CustomerTableMap extends TableMap // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. AddressTableMap::clearInstancePool(); + CartTableMap::clearInstancePool(); } /** diff --git a/core/lib/Thelia/Model/Map/NewsletterTableMap.php b/core/lib/Thelia/Model/Map/NewsletterTableMap.php index 192c8cfa6..1aed936b7 100644 --- a/core/lib/Thelia/Model/Map/NewsletterTableMap.php +++ b/core/lib/Thelia/Model/Map/NewsletterTableMap.php @@ -57,7 +57,7 @@ class NewsletterTableMap extends TableMap /** * The total number of columns */ - const NUM_COLUMNS = 7; + const NUM_COLUMNS = 4; /** * The number of lazy-loaded columns @@ -67,7 +67,7 @@ class NewsletterTableMap extends TableMap /** * The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 7; + const NUM_HYDRATE_COLUMNS = 4; /** * the column name for the ID field @@ -89,21 +89,6 @@ class NewsletterTableMap extends TableMap */ const LASTNAME = 'newsletter.LASTNAME'; - /** - * the column name for the LOCALE field - */ - const LOCALE = 'newsletter.LOCALE'; - - /** - * the column name for the CREATED_AT field - */ - const CREATED_AT = 'newsletter.CREATED_AT'; - - /** - * the column name for the UPDATED_AT field - */ - const UPDATED_AT = 'newsletter.UPDATED_AT'; - /** * The default string format for model objects of the related table */ @@ -116,12 +101,12 @@ class NewsletterTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'Email', 'Firstname', 'Lastname', 'Locale', 'CreatedAt', 'UpdatedAt', ), - self::TYPE_STUDLYPHPNAME => array('id', 'email', 'firstname', 'lastname', 'locale', 'createdAt', 'updatedAt', ), - self::TYPE_COLNAME => array(NewsletterTableMap::ID, NewsletterTableMap::EMAIL, NewsletterTableMap::FIRSTNAME, NewsletterTableMap::LASTNAME, NewsletterTableMap::LOCALE, NewsletterTableMap::CREATED_AT, NewsletterTableMap::UPDATED_AT, ), - self::TYPE_RAW_COLNAME => array('ID', 'EMAIL', 'FIRSTNAME', 'LASTNAME', 'LOCALE', 'CREATED_AT', 'UPDATED_AT', ), - self::TYPE_FIELDNAME => array('id', 'email', 'firstname', 'lastname', 'locale', 'created_at', 'updated_at', ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + self::TYPE_PHPNAME => array('Id', 'Email', 'Firstname', 'Lastname', ), + self::TYPE_STUDLYPHPNAME => array('id', 'email', 'firstname', 'lastname', ), + self::TYPE_COLNAME => array(NewsletterTableMap::ID, NewsletterTableMap::EMAIL, NewsletterTableMap::FIRSTNAME, NewsletterTableMap::LASTNAME, ), + self::TYPE_RAW_COLNAME => array('ID', 'EMAIL', 'FIRSTNAME', 'LASTNAME', ), + self::TYPE_FIELDNAME => array('id', 'email', 'firstname', 'lastname', ), + self::TYPE_NUM => array(0, 1, 2, 3, ) ); /** @@ -131,12 +116,12 @@ class NewsletterTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'Email' => 1, 'Firstname' => 2, 'Lastname' => 3, 'Locale' => 4, 'CreatedAt' => 5, 'UpdatedAt' => 6, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'email' => 1, 'firstname' => 2, 'lastname' => 3, 'locale' => 4, 'createdAt' => 5, 'updatedAt' => 6, ), - self::TYPE_COLNAME => array(NewsletterTableMap::ID => 0, NewsletterTableMap::EMAIL => 1, NewsletterTableMap::FIRSTNAME => 2, NewsletterTableMap::LASTNAME => 3, NewsletterTableMap::LOCALE => 4, NewsletterTableMap::CREATED_AT => 5, NewsletterTableMap::UPDATED_AT => 6, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'EMAIL' => 1, 'FIRSTNAME' => 2, 'LASTNAME' => 3, 'LOCALE' => 4, 'CREATED_AT' => 5, 'UPDATED_AT' => 6, ), - self::TYPE_FIELDNAME => array('id' => 0, 'email' => 1, 'firstname' => 2, 'lastname' => 3, 'locale' => 4, 'created_at' => 5, 'updated_at' => 6, ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + self::TYPE_PHPNAME => array('Id' => 0, 'Email' => 1, 'Firstname' => 2, 'Lastname' => 3, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'email' => 1, 'firstname' => 2, 'lastname' => 3, ), + self::TYPE_COLNAME => array(NewsletterTableMap::ID => 0, NewsletterTableMap::EMAIL => 1, NewsletterTableMap::FIRSTNAME => 2, NewsletterTableMap::LASTNAME => 3, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'EMAIL' => 1, 'FIRSTNAME' => 2, 'LASTNAME' => 3, ), + self::TYPE_FIELDNAME => array('id' => 0, 'email' => 1, 'firstname' => 2, 'lastname' => 3, ), + self::TYPE_NUM => array(0, 1, 2, 3, ) ); /** @@ -159,9 +144,6 @@ class NewsletterTableMap extends TableMap $this->addColumn('EMAIL', 'Email', 'VARCHAR', true, 255, null); $this->addColumn('FIRSTNAME', 'Firstname', 'VARCHAR', false, 255, null); $this->addColumn('LASTNAME', 'Lastname', 'VARCHAR', false, 255, null); - $this->addColumn('LOCALE', 'Locale', 'VARCHAR', false, 45, null); - $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); - $this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null); } // initialize() /** @@ -171,19 +153,6 @@ class NewsletterTableMap extends TableMap { } // buildRelations() - /** - * - * Gets the list of behaviors registered for this table - * - * @return array Associative array (name => parameters) of behaviors - */ - public function getBehaviors() - { - return array( - 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), - ); - } // getBehaviors() - /** * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. * @@ -326,17 +295,11 @@ class NewsletterTableMap extends TableMap $criteria->addSelectColumn(NewsletterTableMap::EMAIL); $criteria->addSelectColumn(NewsletterTableMap::FIRSTNAME); $criteria->addSelectColumn(NewsletterTableMap::LASTNAME); - $criteria->addSelectColumn(NewsletterTableMap::LOCALE); - $criteria->addSelectColumn(NewsletterTableMap::CREATED_AT); - $criteria->addSelectColumn(NewsletterTableMap::UPDATED_AT); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.EMAIL'); $criteria->addSelectColumn($alias . '.FIRSTNAME'); $criteria->addSelectColumn($alias . '.LASTNAME'); - $criteria->addSelectColumn($alias . '.LOCALE'); - $criteria->addSelectColumn($alias . '.CREATED_AT'); - $criteria->addSelectColumn($alias . '.UPDATED_AT'); } } diff --git a/core/lib/Thelia/Model/Map/ProductPriceTableMap.php b/core/lib/Thelia/Model/Map/ProductPriceTableMap.php index 7a80d2e12..81eed9609 100644 --- a/core/lib/Thelia/Model/Map/ProductPriceTableMap.php +++ b/core/lib/Thelia/Model/Map/ProductPriceTableMap.php @@ -157,9 +157,9 @@ class ProductPriceTableMap extends TableMap // columns $this->addForeignPrimaryKey('PRODUCT_SALE_ELEMENTS_ID', 'ProductSaleElementsId', 'INTEGER' , 'product_sale_elements', 'ID', true, null, null); $this->addForeignPrimaryKey('CURRENCY_ID', 'CurrencyId', 'INTEGER' , 'currency', 'ID', true, null, null); - $this->addColumn('PRICE', 'Price', 'FLOAT', true, null, null); - $this->addColumn('PROMO_PRICE', 'PromoPrice', 'FLOAT', false, null, null); - $this->addColumn('FROM_DEFAULT_CURRENCY', 'FromDefaultCurrency', 'BOOLEAN', true, 1, false); + $this->addColumn('PRICE', 'Price', 'FLOAT', true, null, 0); + $this->addColumn('PROMO_PRICE', 'PromoPrice', 'FLOAT', true, null, 0); + $this->addColumn('FROM_DEFAULT_CURRENCY', 'FromDefaultCurrency', 'BOOLEAN', true, 1, true); $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); $this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null); } // initialize() diff --git a/core/lib/Thelia/Model/Map/ProductSaleElementsTableMap.php b/core/lib/Thelia/Model/Map/ProductSaleElementsTableMap.php index a4dc06d9f..f6de901ed 100644 --- a/core/lib/Thelia/Model/Map/ProductSaleElementsTableMap.php +++ b/core/lib/Thelia/Model/Map/ProductSaleElementsTableMap.php @@ -195,7 +195,7 @@ class ProductSaleElementsTableMap extends TableMap { $this->addRelation('Product', '\\Thelia\\Model\\Product', RelationMap::MANY_TO_ONE, array('product_id' => 'id', ), 'CASCADE', 'RESTRICT'); $this->addRelation('AttributeCombination', '\\Thelia\\Model\\AttributeCombination', RelationMap::ONE_TO_MANY, array('id' => 'product_sale_elements_id', ), 'CASCADE', 'RESTRICT', 'AttributeCombinations'); - $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'product_sale_elements_id', ), null, null, 'CartItems'); + $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'product_sale_elements_id', ), 'CASCADE', 'RESTRICT', 'CartItems'); $this->addRelation('ProductPrice', '\\Thelia\\Model\\ProductPrice', RelationMap::ONE_TO_MANY, array('id' => 'product_sale_elements_id', ), 'CASCADE', null, 'ProductPrices'); } // buildRelations() @@ -219,6 +219,7 @@ class ProductSaleElementsTableMap extends TableMap // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. AttributeCombinationTableMap::clearInstancePool(); + CartItemTableMap::clearInstancePool(); ProductPriceTableMap::clearInstancePool(); } diff --git a/core/lib/Thelia/Model/Map/ProductTableMap.php b/core/lib/Thelia/Model/Map/ProductTableMap.php index 273ed7382..68a34a393 100644 --- a/core/lib/Thelia/Model/Map/ProductTableMap.php +++ b/core/lib/Thelia/Model/Map/ProductTableMap.php @@ -211,7 +211,7 @@ class ProductTableMap extends TableMap $this->addRelation('ProductDocument', '\\Thelia\\Model\\ProductDocument', RelationMap::ONE_TO_MANY, array('id' => 'product_id', ), 'CASCADE', 'RESTRICT', 'ProductDocuments'); $this->addRelation('AccessoryRelatedByProductId', '\\Thelia\\Model\\Accessory', RelationMap::ONE_TO_MANY, array('id' => 'product_id', ), 'CASCADE', 'RESTRICT', 'AccessoriesRelatedByProductId'); $this->addRelation('AccessoryRelatedByAccessory', '\\Thelia\\Model\\Accessory', RelationMap::ONE_TO_MANY, array('id' => 'accessory', ), 'CASCADE', 'RESTRICT', 'AccessoriesRelatedByAccessory'); - $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'product_id', ), null, null, 'CartItems'); + $this->addRelation('CartItem', '\\Thelia\\Model\\CartItem', RelationMap::ONE_TO_MANY, array('id' => 'product_id', ), 'CASCADE', 'RESTRICT', 'CartItems'); $this->addRelation('ProductAssociatedContent', '\\Thelia\\Model\\ProductAssociatedContent', RelationMap::ONE_TO_MANY, array('id' => 'product_id', ), 'CASCADE', 'RESTRICT', 'ProductAssociatedContents'); $this->addRelation('ProductI18n', '\\Thelia\\Model\\ProductI18n', RelationMap::ONE_TO_MANY, array('id' => 'id', ), 'CASCADE', null, 'ProductI18ns'); $this->addRelation('ProductVersion', '\\Thelia\\Model\\ProductVersion', RelationMap::ONE_TO_MANY, array('id' => 'id', ), 'CASCADE', null, 'ProductVersions'); @@ -247,6 +247,7 @@ class ProductTableMap extends TableMap ProductImageTableMap::clearInstancePool(); ProductDocumentTableMap::clearInstancePool(); AccessoryTableMap::clearInstancePool(); + CartItemTableMap::clearInstancePool(); ProductAssociatedContentTableMap::clearInstancePool(); ProductI18nTableMap::clearInstancePool(); ProductVersionTableMap::clearInstancePool(); diff --git a/install/thelia.sql b/install/thelia.sql index 7fa114536..697db5bf0 100755 --- a/install/thelia.sql +++ b/install/thelia.sql @@ -1199,16 +1199,24 @@ CREATE TABLE `cart` INDEX `idx_cart_currency_id` (`currency_id`), CONSTRAINT `fk_cart_customer_id` FOREIGN KEY (`customer_id`) - REFERENCES `customer` (`id`), + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, CONSTRAINT `fk_cart_address_delivery_id` FOREIGN KEY (`address_delivery_id`) - REFERENCES `address` (`id`), + REFERENCES `address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, CONSTRAINT `fk_cart_address_invoice_id` FOREIGN KEY (`address_invoice_id`) - REFERENCES `address` (`id`), + REFERENCES `address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, CONSTRAINT `fk_cart_currency_id` FOREIGN KEY (`currency_id`) REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE ) ENGINE=InnoDB; -- --------------------------------------------------------------------- @@ -1237,13 +1245,19 @@ CREATE TABLE `cart_item` INDEX `idx_cart_item_product_sale_elements_id` (`product_sale_elements_id`), CONSTRAINT `fk_cart_item_cart_id` FOREIGN KEY (`cart_id`) - REFERENCES `cart` (`id`), + REFERENCES `cart` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, CONSTRAINT `fk_cart_item_product_id` FOREIGN KEY (`product_id`) - REFERENCES `product` (`id`), + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, CONSTRAINT `fk_cart_item_product_sale_elements_id` FOREIGN KEY (`product_sale_elements_id`) REFERENCES `product_sale_elements` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE ) ENGINE=InnoDB; -- --------------------------------------------------------------------- @@ -1256,9 +1270,9 @@ CREATE TABLE `product_price` ( `product_sale_elements_id` INTEGER NOT NULL, `currency_id` INTEGER NOT NULL, - `price` FLOAT NOT NULL, - `promo_price` FLOAT, - `from_default_currency` TINYINT(1) DEFAULT 0 NOT NULL, + `price` FLOAT DEFAULT 0 NOT NULL, + `promo_price` FLOAT DEFAULT 0 NOT NULL, + `from_default_currency` TINYINT(1) DEFAULT 1 NOT NULL, `created_at` DATETIME, `updated_at` DATETIME, PRIMARY KEY (`product_sale_elements_id`,`currency_id`), diff --git a/local/config/schema.xml b/local/config/schema.xml index 61c4aabf5..91a16eb84 100755 --- a/local/config/schema.xml +++ b/local/config/schema.xml @@ -931,16 +931,16 @@ - + - + - + - + @@ -971,13 +971,13 @@ - + - + - + @@ -994,9 +994,9 @@ - - - + + + @@ -1245,7 +1245,7 @@
- +
diff --git a/templates/admin/default/includes/product-details-tab.html b/templates/admin/default/includes/product-details-tab.html index 738359a50..7adb09715 100644 --- a/templates/admin/default/includes/product-details-tab.html +++ b/templates/admin/default/includes/product-details-tab.html @@ -115,7 +115,7 @@
@@ -129,19 +129,21 @@
- + {$currency_symbol}
{/form_field} -
- -
- - {$currency_symbol} -
-
+ {form_field form=$form field='price_with_tax'} +
+ +
+ + {$currency_symbol} +
+
+ {/form_field} {module_include location='product_details_pricing_form'} @@ -203,19 +205,21 @@
- + {$currency_symbol}
{/form_field} + {form_field form=$form field='sale_price_with_tax'}
- +
- + {$currency_symbol}
+ {/form_field} {form_field form=$form field='onsale'}
diff --git a/templates/admin/default/product-edit.html b/templates/admin/default/product-edit.html index 2a2d94ca8..bf40dc0ac 100644 --- a/templates/admin/default/product-edit.html +++ b/templates/admin/default/product-edit.html @@ -275,48 +275,83 @@ $(function() { }); // In details tab, process exchange rate usage checkbox changes - $('use_exchange_rate_box').change(function(ev) { - $('.') + $('.use_exchange_rate_box').change(function(ev) { + + if ($(this).is(':checked')) { + + var pse_id = $(this).data('pse-id'); + + $('.price_field').prop('readonly', true); + + // Reload prices + $.ajax({ + url : '{url path="/admin/product/load-converted-prices"}', + data : { + product_sale_element_id : pse_id, + currency_id : {$edit_currency_id} + }, + type : 'get', + dataType : 'json', + success : function(json) { + console.log(json); + + $('input[data-pse-id="'+pse_id+'"][data-price-type="price-with-tax"]').val(json.price_with_tax); + $('input[data-pse-id="'+pse_id+'"][data-price-type="price-without-tax"]').val(json.price_without_tax); + $('input[data-pse-id="'+pse_id+'"][data-price-type="sale-price-with-tax"]').val(json.sale_price_with_tax); + $('input[data-pse-id="'+pse_id+'"][data-price-type="sale-price-without-tax"]').val(json.sale_price_without_tax); + }, + error : function(jqXHR, textStatus, errorThrown) { + alert("{intl l='Failed to get converted prices. Please try again.'} (" +errorThrown+ ")"); + } + }); + + } + else { + $('.price_field').prop('readonly', false) + } }); + function update_price(price, price_type, dest_field_id) { + var tax_rule_id = $('#tax_rule_field').val(); + + if (tax_rule_id != "") { + + var operation; + + if (price_type.indexOf('with-tax') != -1) + operation = 'from_tax'; + else if (price_type.indexOf('without-tax') != -1) + operation = 'to_tax'; + else + operation = ''; + + $.ajax({ + url : '{url path="/admin/product/calculate-price"}', + data : { + price : price, + action : operation, + product_id : {$product_id} + }, + type : 'get', + dataType : 'json', + success : function(json) { + $('#' + dest_field_id).val(json.result); + }, + error : function(jqXHR, textStatus, errorThrown) { + alert("{intl l='Failed to get prices. Please try again.'} (" +errorThrown+ ")"); + } + }); + } + } + // Automatic update of price fields: any change in the taxed (resp. untaxed) price // will update the untaxed (resp. taxed) one $('.automatic_price_field').typeWatch({ captureLength: 1, callback: function () { - - var tax_rule_id = $('#tax_rule_field').val(); - - if (tax_rule_id != "") { - var priceType = $(this).data('price-type'); - var dest_field_id = $(this).data('rel-price'); - - var operation; - - if (priceType == 'with-tax') - operation = 'from_tax'; - else if (priceType == 'without-tax') - operation = 'to_tax'; - else - operation = ''; - - $.ajax({ - url : '{url path="/admin/product/calculate-price"}', - data : { - price : $(this).val(), - action : operation, - tax_rule_id : $('#tax_rule_field').val() - }, - type : 'get', - dataType : 'json', - success : function(json) { - $('#' + dest_field_id).val(json.result); - } - }); - } + update_price($(this).val(), $(this).data('price-type'), $(this).data('rel-price')); } }); - }); From 4f7e7660ca18982b0ac380db7366cbd50295e26f Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Thu, 24 Oct 2013 16:39:22 +0200 Subject: [PATCH 2/2] Finished PSE management for products with no combinations --- core/lib/Thelia/Action/ProductSaleElement.php | 31 ++++++++--- .../Controller/Admin/ProductController.php | 52 ++++++++++++++++--- .../ProductSaleElementUpdateEvent.php | 22 ++++++-- .../lib/Thelia/Core/Template/Loop/Product.php | 1 + .../ProductDefaultSaleElementUpdateForm.php | 2 +- .../Form/ProductSaleElementUpdateForm.php | 4 +- .../default/includes/product-details-tab.html | 4 +- 7 files changed, 91 insertions(+), 25 deletions(-) diff --git a/core/lib/Thelia/Action/ProductSaleElement.php b/core/lib/Thelia/Action/ProductSaleElement.php index 730fe0764..facadfc4b 100644 --- a/core/lib/Thelia/Action/ProductSaleElement.php +++ b/core/lib/Thelia/Action/ProductSaleElement.php @@ -67,11 +67,11 @@ class ProductSaleElement extends BaseAction implements EventSubscriberInterface ->findOne($con); if ($salesElement == null) { - // Create a new product sale element + // Create a new default product sale element $salesElement = $event->getProduct()->createDefaultProductSaleElement($con, 0, 0, $event->getCurrencyId(), true); } else { - // This one is the default + // This (new) one is the default $salesElement->setIsDefault(true)->save($con); } @@ -122,6 +122,9 @@ class ProductSaleElement extends BaseAction implements EventSubscriberInterface try { + // Update the product's tax rule + $event->getProduct()->setTaxRuleId($event->getTaxRuleId())->save($con); + // If product sale element is not defined, create it. if ($salesElement == null) { $salesElement = new ProductSaleElements(); @@ -158,11 +161,25 @@ class ProductSaleElement extends BaseAction implements EventSubscriberInterface ; } - $productPrice - ->setPromoPrice($event->getSalePrice()) - ->setPrice($event->getPrice()) - ->save($con) - ; + // Check if we have to store the price + $productPrice->setFromDefaultCurrency($event->getFromDefaultCurrency()); + + if ($event->getFromDefaultCurrency() == 0) { + // Store the price + $productPrice + ->setPromoPrice($event->getSalePrice()) + ->setPrice($event->getPrice()) + ; + } + else { + // Do not store the price. + $productPrice + ->setPromoPrice(0) + ->setPrice(0) + ; + } + + $productPrice->save($con); // Store all the stuff ! $con->commit(); diff --git a/core/lib/Thelia/Controller/Admin/ProductController.php b/core/lib/Thelia/Controller/Admin/ProductController.php index 7e54e6345..a7ee65ccd 100644 --- a/core/lib/Thelia/Controller/Admin/ProductController.php +++ b/core/lib/Thelia/Controller/Admin/ProductController.php @@ -189,6 +189,23 @@ class ProductController extends AbstractCrudController return $event->hasProduct(); } + protected function updatePriceFromDefaultCurrency($productPrice, $saleElement, $defaultCurrency, $currentCurrency) { + + // Get price for default currency + $priceForDefaultCurrency = ProductPriceQuery::create() + ->filterByCurrency($defaultCurrency) + ->filterByProductSaleElements($saleElement) + ->findOne() + ; + + if ($priceForDefaultCurrency !== null) { + $productPrice + ->setPrice($priceForDefaultCurrency->getPrice() * $currentCurrency->getRate()) + ->setPromoPrice($priceForDefaultCurrency->getPromoPrice() * $currentCurrency->getRate()) + ; + } + } + protected function hydrateObjectForm($object) { $defaultPseData = $combinationPseData = array(); @@ -198,18 +215,35 @@ class ProductController extends AbstractCrudController ->filterByProduct($object) ->find(); + $defaultCurrency = Currency::getDefaultCurrency(); + $currentCurrency = $this->getCurrentEditionCurrency(); + foreach($saleElements as $saleElement) { // Get the product price for the current currency - $productPrice = ProductPriceQuery::create() - ->filterByCurrency($this->getCurrentEditionCurrency()) + ->filterByCurrency($currentCurrency) ->filterByProductSaleElements($saleElement) ->findOne() ; - if ($productPrice == null) { + // No one exists ? + if ($productPrice === null) { $productPrice = new ProductPrice(); + + // If the current currency is not the default one, calculate the price + // using default currency price and current currency rate + if ($currentCurrency->getId() != $defaultCurrency->getId()) { + + $productPrice->setFromDefaultCurrency(true); + + $this->updatePriceFromDefaultCurrency($productPrice, $saleElement, $defaultCurrency, $currentCurrency); + } + } + + // Caclulate prices if we have to use the rate * defaulkt currency price + if ($productPrice->getFromDefaultCurrency() == true) { + $this->updatePriceFromDefaultCurrency($productPrice, $saleElement, $defaultCurrency, $currentCurrency); } $isDefaultPse = count($saleElement->getAttributeCombinations()) == 0; @@ -236,7 +270,6 @@ class ProductController extends AbstractCrudController "isdefault" => $saleElement->getIsDefault() > 0 ? 1 : 0, "ean_code" => $saleElement->getEanCode() ); - } else { } @@ -246,9 +279,13 @@ class ProductController extends AbstractCrudController $combinationPseForm = new ProductSaleElementUpdateForm($this->getRequest(), "form", $combinationPseData); $this->getParserContext()->addForm($combinationPseForm); + + var_dump($defaultPseData); + + var_dump($combinationPseData); } - // Prepare the data that will hydrate the form + // Prepare the data that will hydrate the form(s) $data = array( 'id' => $object->getId(), 'ref' => $object->getRef(), @@ -260,8 +297,6 @@ class ProductController extends AbstractCrudController 'visible' => $object->getVisible(), 'url' => $object->getRewrittenUrl($this->getCurrentEditionLocale()), 'default_category' => $object->getDefaultCategoryId() - - // A terminer pour les prix ); // Setup the object form @@ -881,7 +916,8 @@ class ProductController extends AbstractCrudController ->setIsnew($data['isnew']) ->setIsdefault($data['isdefault']) ->setEanCode($data['ean_code']) - ->setTaxrule($data['tax_rule']) + ->setTaxRuleId($data['tax_rule']) + ->setFromDefaultCurrency($data['use_exchange_rate']) ; $this->dispatch(TheliaEvents::PRODUCT_UPDATE_PRODUCT_SALE_ELEMENT, $event); diff --git a/core/lib/Thelia/Core/Event/ProductSaleElement/ProductSaleElementUpdateEvent.php b/core/lib/Thelia/Core/Event/ProductSaleElement/ProductSaleElementUpdateEvent.php index a3eed8a2a..8a0618dc5 100644 --- a/core/lib/Thelia/Core/Event/ProductSaleElement/ProductSaleElementUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/ProductSaleElement/ProductSaleElementUpdateEvent.php @@ -41,7 +41,8 @@ class ProductSaleElementUpdateEvent extends ProductSaleElementEvent protected $isnew; protected $isdefault; protected $ean_code; - protected $taxrule; + protected $tax_rule_id; + protected $from_default_currency; public function __construct(Product $product, $product_sale_element_id) { @@ -196,16 +197,27 @@ class ProductSaleElementUpdateEvent extends ProductSaleElementEvent return $this; } - public function getTaxrule() + public function getTaxRuleId() { - return $this->taxrule; + return $this->tax_rule_id; } - public function setTaxrule($taxrule) + public function setTaxRuleId($tax_rule_id) { - $this->taxrule = $taxrule; + $this->tax_rule_id = $tax_rule_id; return $this; } + public function getFromDefaultCurrency() + { + return $this->from_default_currency; + } + + public function setFromDefaultCurrency($from_default_currency) + { + $this->from_default_currency = $from_default_currency; + return $this; + } + } diff --git a/core/lib/Thelia/Core/Template/Loop/Product.php b/core/lib/Thelia/Core/Template/Loop/Product.php index 2d6125a37..a2ddd9433 100755 --- a/core/lib/Thelia/Core/Template/Loop/Product.php +++ b/core/lib/Thelia/Core/Template/Loop/Product.php @@ -668,6 +668,7 @@ class Product extends BaseI18nLoop ->set("PREVIOUS" , $previous != null ? $previous->getId() : -1) ->set("NEXT" , $next != null ? $next->getId() : -1) ->set("DEFAULT_CATEGORY" , $default_category_id) + ->set("TAX_RULE_ID" , $product->getTaxRuleId()) ; diff --git a/core/lib/Thelia/Form/ProductDefaultSaleElementUpdateForm.php b/core/lib/Thelia/Form/ProductDefaultSaleElementUpdateForm.php index 807f8ac07..ebc081faf 100644 --- a/core/lib/Thelia/Form/ProductDefaultSaleElementUpdateForm.php +++ b/core/lib/Thelia/Form/ProductDefaultSaleElementUpdateForm.php @@ -28,4 +28,4 @@ class ProductDefaultSaleElementUpdateForm extends ProductSaleElementUpdateForm { return "thelia_product_default_sale_element_update_form"; } -} +} \ No newline at end of file diff --git a/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php b/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php index 3d7966cab..f93a4e251 100644 --- a/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php +++ b/core/lib/Thelia/Form/ProductSaleElementUpdateForm.php @@ -77,7 +77,7 @@ class ProductSaleElementUpdateForm extends BaseForm "label_attr" => array("for" => "quantity_field") )) ->add("sale_price", "number", array( - "label" => Translator::getInstance()->trans("Sale price without taxes *"), + "label" => Translator::getInstance()->trans("Sale price without taxes"), "label_attr" => array("for" => "price_with_tax_field") )) ->add("sale_price_with_tax", "number", array( @@ -96,7 +96,7 @@ class ProductSaleElementUpdateForm extends BaseForm "label" => Translator::getInstance()->trans("Is it the default product sale element ?"), "label_attr" => array("for" => "isdefault_field") )) - ->add("ean_code", "integer", array( + ->add("ean_code", "text", array( "label" => Translator::getInstance()->trans("EAN Code"), "label_attr" => array("for" => "ean_code_field") )) diff --git a/templates/admin/default/includes/product-details-tab.html b/templates/admin/default/includes/product-details-tab.html index 7adb09715..57dda78cf 100644 --- a/templates/admin/default/includes/product-details-tab.html +++ b/templates/admin/default/includes/product-details-tab.html @@ -83,7 +83,7 @@
@@ -280,7 +280,7 @@