• DE
  • EN
  • ES
  • NL

Blog

Crear un cupón con condiciones programáticamente en Magento


Este artículo fue publicado originalmente en inglés en el Blog Magentron con el título Programmatically creating a coupon (including the rule) with conditions in Magento.

Publicado el martes 22 de mayo de 2012 por Jeroen Derks.

Para uno de mis proyectos necesitaba crear programáticamente un cupón aleatorio para un producto concreto en Magento. Como no encontré un ejemplo exacto que pudiera reutilizar, decidí publicar mi solución aquí.

NB: Ten en cuenta que este post es un trabajo en progreso, los resultados pueden variar, así que prueba a fondo antes de usar esta solución en un entorno de producción.
Por favor, cuéntame si encuentras algún problema con esta solución. ¡Gracias!

<?php
              // load product
              /** @var Mage_Catalog_Model_Product $product */
              $product = Mage::getModel('catalog/product')
                              ->setStoreId($storeId)
                              ->load($productId);

              // set length of coupon code
              /** @var Mage_SalesRule_Model_Coupon_Codegenerator $generator */
              $generator = Mage::getModel('salesrule/coupon_codegenerator')
                                  ->setLength(8);
              /** @var Mage_SalesRule_Model_Rule_Condition_Product $conditionProduct */
              $conditionProduct = Mage::getModel('salesrule/rule_condition_product')
                                                          ->setType('salesrule/rule_condition_product')
                                                          ->setAttribute('sku')
                                                          ->setOperator('==')
                                                          ->setValue($product->getSku());

              /** @var Mage_SalesRule_Model_Rule_Condition_Product_Found $conditionProductFound */
              $conditionProductFound = Mage::getModel('salesrule/rule_condition_product_found')
                                                      ->setConditions(array($conditionProduct));
              /** @var Mage_SalesRule_Model_Rule_Condition_Combine $condition */
              $condition = Mage::getModel('salesrule/rule_condition_combine')
                              ->setConditions(array($conditionProductFound));

              /** @var Mage_SalesRule_Model_Coupon $coupon */
              $coupon = Mage::getModel('salesrule/coupon');
              // try to generate unique coupon code
              $attempts = 0;
              do {
                  if ($attempts++ >= 8) {
                      Mage::throwException(Mage::helper('mymodule')->__('Unable to create requested Coupons. Please try again.'));
                  }
                  $code = $generator->generateCode();
              } while ($coupon->getResource()->exists($code));

              // create rule
              /** @var Mage_SalesRule_Model_Rule $rule */
              $rule = Mage::getModel('salesrule/rule');
              $rule->setName(Mage::helper('mymodule')->__('Name of the coupon'))
                  ->setDescription($rule->getName())
                  ->setFromDate(date('Y-m-d'))
                  ->setCustomerGroupIds($this->_getCustomerGroups())
                  ->setIsActive(1)
                  ->setConditionsSerialized(serialize($condition->asArray()))
                  //->setActionsSerialized
                  //->setStopRulesProcessing
                  //->setIsAdvanced
                  ->setSimpleAction(Mage_SalesRule_Model_Rule::BY_FIXED_ACTION)
                  ->setDiscountAmount($product->getFinalPrice())
                  ->setDiscountQty(1)
                  //->setDiscountStep
                  ->setStopRulesProcessing(0)
                  ->setIsRss(0)
                  ->setWebsiteIds(array(1))
                  ->setCouponType(Mage_SalesRule_Model_Rule::COUPON_TYPE_SPECIFIC)
                  ->setConditions($condition)
                  ->save();

              // create coupon
              $coupon->setId(null)
                  ->setRuleId($rule->getRuleId())
                  ->setCode($code)
                  ->setUsageLimit(1)
                  //->setUsagePerCustomer
                  //->setTimesUsed
                  //->setExpirationDate
                  ->setIsPrimary(1)
                  ->setCreatedAt(time())
                  ->setType(Mage_SalesRule_Helper_Coupon::COUPON_TYPE_SPECIFIC_AUTOGENERATED)
                  ->save();
          

¡Cuéntame si te funciona o no!

¿Necesitas ayuda con PHP, Magento o Laravel? No dudes en ponerte en contacto.