Example #1
0
 public function issueSerialCodes($order, $source, $items = NULL, $paid = NULL)
 {
     $orderid = $order->getIncrementId();
     $storeid = $order->getStoreId();
     $backend = Mage::app()->getStore()->isAdmin();
     $admin = Mage::getSingleton('adminhtml/session');
     if ($items === NULL) {
         $items = $order->getAllItems();
     }
     if ($this->getOrderTest($order, $source)) {
         foreach ($items as $item) {
             $configured = 0;
             $issued = 0;
             $product = Mage::getModel('catalog/product')->setStoreId($storeid)->load($item->getProductId());
             $sku = '';
             if ($this->getProductTest($order, $product, $source)) {
                 if ($parentitem = $item->getParentItem()) {
                     $parentproduct = Mage::getModel('catalog/product')->load($parentitem->getProductId());
                     if ($parentitem->getProductType() == 'configurable' && !$this->getProductTest($order, $parentproduct, $source)) {
                         $item = $parentitem;
                     }
                     $parentproduct->clearInstance();
                 }
                 if ($source == 'invoicing') {
                     $qty = round($item->getQtyInvoiced());
                 } else {
                     $qty = round($item->getQtyOrdered());
                 }
                 $pcodes = explode("\n", $item->getSerialCodes());
                 $icodes = array_pad(explode(',', $item->getSerialCodeIds()), $qty, '');
                 $issueoptions = new Varien_Object();
                 $issueoptions->setOption('');
                 Mage::dispatchEvent('sc_issue_get_codepool_before', array('item' => $item, 'source' => $source, 'issue_options' => $issueoptions));
                 if ($issueoptions->getOption() != 'halt_issue') {
                     $codes = $this->getCodePool($item, $source, $product, $sku);
                     if (!($codetype = $product->getSerialCodeType())) {
                         $codetype = Mage::helper('serialcodes')->__('Serial Code');
                     }
                     $states = $this->getInvoiceStates($order, $item->getSku());
                     $issuecustomer = $source == 'controller' && $product->getSerialCodeUseCustomer() && $item->getSerialCodesIssued() == $item->getQtyOrdered();
                     for ($i = 0; $i < $qty; $i++) {
                         $saved = 0;
                         if ($i < $item->getQtyInvoiced() || $issuecustomer) {
                             $sc_status = Mage::getModel('serialcodes/serialcodes');
                             if (is_numeric($icodes[$i]) && $icodes[$i] > -1 && $sc_status->load($icodes[$i])->getStatus() != 1 && $issueoptions->getOption() != 'status_pending' && (!empty($states[$i]) && !($product->getSerialCodeUseCustomer() && !$product->getSerialCodeInvoiced()) || $issuecustomer)) {
                                 $sc_status->setStatus(1)->save();
                                 if ($backend && !$configured) {
                                     $admin->addNotice(Mage::helper('serialcodes')->__('Status of codes has been changed for %s.', $product->getName()));
                                 }
                                 $configured = 1;
                                 continue;
                             }
                         }
                         if (empty($icodes[$i]) && $i >= $item->getSerialCodesIssued()) {
                             foreach ($codes as $code) {
                                 $configured = 1;
                                 if ($code->getStatus() == 0) {
                                     $pcodes[$i] = $code->getCode();
                                     $icodes[$i] = $code->getSerialcodesId();
                                     $item->setSerialCodeType($codetype);
                                     $item->setSerialCodes(implode("\n", $pcodes));
                                     $item->setSerialCodeIds(implode(',', $icodes));
                                     $item->setSerialCodesIssued($item->getSerialCodesIssued() + 1);
                                     $item->setSerialCodePool($sku);
                                     $item->save();
                                     if (($this->getPendingStatus($order, $item, $product, $i, $source) || $source == 'invoicing' && !$paid || $issueoptions->getOption() == 'status_pending') && $issueoptions->getOption() != 'status_used') {
                                         $code->setStatus(2);
                                     } else {
                                         $code->setStatus(1);
                                     }
                                     $code->setNote($orderid);
                                     $code->setUpdateTime(now());
                                     $code->save();
                                     $saved = 1;
                                     if ($backend && !$issued) {
                                         $admin->addSuccess(Mage::helper('serialcodes')->__('Codes issued for %s.', $product->getName()));
                                     }
                                     $issued = 1;
                                     break;
                                 }
                             }
                             if (!$saved && empty($icodes[$i]) && $codes->getFirstItem()->getCode()) {
                                 if (!trim($message = $product->getSerialCodeNotAvailable())) {
                                     $message = Mage::helper('serialcodes')->__('Oops! Not available.');
                                 }
                                 $item->setSerialCodeType($codetype);
                                 $pcodes = explode("\n", $item->getSerialCodes());
                                 $next = '';
                                 if (count(array_filter($pcodes))) {
                                     $next = "\n";
                                 }
                                 if (count(array_filter($pcodes)) < $qty) {
                                     $item->setSerialCodes(implode("\n", $pcodes) . $next . $message);
                                     $item->setSerialCodePool($sku);
                                     $item->save();
                                     $saved = 1;
                                 }
                                 if ($backend && $i == $qty - 1) {
                                     $admin->addError(Mage::helper('serialcodes')->__('Ran out of codes for %s.', $product->getName()));
                                 }
                             }
                         }
                     }
                     if (isset($saved)) {
                         $this->sendWarningLevelEmail($product, $order, $sku);
                     }
                     if ($backend && !$configured) {
                         if (($source == 'controller' || $source == 'invoicing') && $item->getSerialCodesIssued() >= $item->getQtyOrdered()) {
                             if ($source != 'invoicing') {
                                 $admin->addNotice(Mage::helper('serialcodes')->__('All codes have already been issued for %s.', $product->getName()));
                             }
                         } else {
                             $admin->addError(Mage::helper('serialcodes')->__('Unable to issue codes for %s. Check configuration.', $product->getName()));
                         }
                         continue;
                     }
                 }
                 Mage::dispatchEvent('sc_issue_after', array('item' => $item, 'source' => $source));
             }
         }
     }
 }