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)); } } } }