/** * Displays the edit template form * */ public function editEbayTemplate() { GetLib('class.json'); $templateId = (int)$_GET['templateId']; try { $template = new ISC_ADMIN_EBAY_TEMPLATE($templateId); $this->template->assign('templateId', $templateId); $this->template->assign('formTitle', GetLang('EditEbayTemplate')); $this->template->assign('hasStore', (bool)GetConfig('EbayStore')); $this->template->assign('ebaySites', $this->getSupportedSites()); $this->template->assign('siteId', $template->getSiteId()); $this->template->assign('templateName', $template->getTemplateName()); $this->template->assign('templateIsDefault', $template->isDefaultTemplate()); $this->template->assign('isPrivateListing', $template->isPrivateListing()); // setup category details $primaryCategoryOptions = $template->getPrimaryCategoryOptions(); $secondaryCategoryOptions = $template->getSecondaryCategoryOptions(); $this->template->assign('primaryCategory', $primaryCategoryOptions['path']); $this->template->assign('primaryCategoryOptions', ISC_JSON::encode($primaryCategoryOptions)); $this->template->assign('categoryOptions', $primaryCategoryOptions); $this->template->assign('sellingMethod', $template->getSellingMethod()); try { if (empty ($secondaryCategoryOptions)) { $secondaryCategoryId = $template->getSecondaryCategoryId(); if (!empty ($secondaryCategoryId)) { $secondaryCategoryOptions = ''; $secondaryCategoryOptions = ISC_ADMIN_EBAY_CATEGORIES::getCategoryFeatures($secondaryCategoryId, $template->getSiteId()); $categoryPath = ISC_ADMIN_EBAY_CATEGORIES::getFormattedCategoryPath($secondaryCategoryId, $template->getSiteId()); $secondaryCategoryOptions['path'] = $categoryPath; } else { $secondaryCategoryOptions = ISC_ADMIN_EBAY_CATEGORIES::getCategoryOptionsFromId($template->getSecondaryCategoryId(), $template->getSiteId()); } } } catch (Exception $ex) { $secondaryCategoryOptions = array( 'category_id' => $template->getSecondaryCategoryId(), 'name' => $template->getSecondaryCategoryName(), 'path' => $template->getSecondaryCategoryName(), ); } if ($secondaryCategoryOptions) { $this->template->assign('secondaryCategoryOptionsData', $secondaryCategoryOptions); $this->template->assign('secondaryCategory', $secondaryCategoryOptions['path']); } $secCatNotSupportVariations = (isset ($secondaryCategoryOptions['variations_supported']) && $secondaryCategoryOptions['variations_supported'] == 0); $this->template->assign('secCatSelectedNotSupportVariations', ($secCatNotSupportVariations)); $this->template->assign('secondaryCategoryOptions', ISC_JSON::encode($secondaryCategoryOptions)); $this->template->assign('categoryFeaturesList', $this->template->render('ebay.template.featureslist.tpl')); $primaryStoreCategoryOptions = array(); if ($template->getPrimaryStoreCategoryId()) { $primaryStoreCategoryOptions = array( 'category_id' => $template->getPrimaryStoreCategoryId(), 'name' => $template->getPrimaryStoreCategoryName(), 'path' => $template->getPrimaryStoreCategoryName(), ); $this->template->assign('primaryStoreCategory', $primaryStoreCategoryOptions['path']); } $this->template->assign('primaryStoreCategoryOptions', ISC_JSON::encode($primaryStoreCategoryOptions)); $secondaryStoreCategoryOptions = array(); if ($template->getSecondaryStoreCategoryId()) { $secondaryStoreCategoryOptions = array( 'category_id' => $template->getSecondaryStoreCategoryId(), 'name' => $template->getSecondaryStoreCategoryName(), 'path' => $template->getSecondaryStoreCategoryName(), ); $this->template->assign('secondaryStoreCategory', $secondaryStoreCategoryOptions['path']); } $this->template->assign('secondaryStoreCategoryOptions', ISC_JSON::encode($secondaryStoreCategoryOptions)); $this->template->assign('sellingMethod', $template->getSellingMethod()); } catch (Exception $ex) { FlashMessage($ex->getMessage(), MSG_ERROR, 'index.php?ToDo=viewEbay'); } $GLOBALS['BreadcrumEntries'][GetLang('EditEbayTemplate')] = 'index.php?ToDo=editEbayTemplate'; $this->engine->PrintHeader(); $this->template->display('ebay.template.form.tpl'); $this->engine->PrintFooter(); }
/** * Displays the list of supported category features * */ private function getCategoryFeaturesListAction() { $templateId = (int)$_POST['templateId']; $productOptions = $_POST['productOptions']; $originalProductCount = $_POST['originalProductCount']; $productCount = $_POST['productCount']; $output['productOptions'] = $productOptions; $output['productCount'] = $productCount; $message = ''; try { $template = new ISC_ADMIN_EBAY_TEMPLATE($templateId); } catch (Exception $ex) { ISC_JSON::output('', false); } $categoryOptions = $template->getPrimaryCategoryOptions(); $secondaryCategoryOptions = $template->getSecondaryCategoryOptions(); $secCatNotSupportVariations = (isset ($secondaryCategoryOptions['variations_supported']) && $secondaryCategoryOptions['variations_supported'] == 0); // if product variations are not supported in both primary, secondary categories, or the selling method is fixed selling method if ((empty ($categoryOptions['variations_supported']) || $secCatNotSupportVariations) || $template->getSellingMethod() != ISC_ADMIN_EBAY::FIXED_PRICE_LISTING) { $updatedProducts['productIds'] = array(); if ($where = ISC_ADMIN_EBAY_LIST_PRODUCTS::getWhereFromOptions($productOptions)) { $where .= " AND "; } $where .= " p.prodvariationid <= 0 "; $res = ISC_ADMIN_EBAY_LIST_PRODUCTS::getProducts($where); while ($row = $this->db->Fetch($res)) { $updatedProducts['productIds'][] = urlencode('products[]='.$row['productid']); } $validProductCount = count($updatedProducts['productIds']); $invalidProductsCount = $originalProductCount - $validProductCount; if (empty ($validProductCount)) { // all selected products have variation $message = GetLang('VariationInvalidProducts'); $output['productCount'] = 0; $output['productOptions'] = ''; } else if ($validProductCount != $originalProductCount) { // some products couldn't be listed $message = sprintf(GetLang('PartialVariationInvalidProducts'), $invalidProductsCount); $output['productOptions']['productIds'] = implode('&', $updatedProducts['productIds']); $output['productCount'] = $validProductCount; } } // generate a list of features $this->template->assign('secCatSelectedNotSupportVariations', ($secCatNotSupportVariations)); $this->template->assign('categoryOptions', $categoryOptions); $this->template->assign('secondaryCategoryOptionsData', $secondaryCategoryOptions); $this->template->assign('currency', $template->getCurrency()); $this->template->assign('message', $message); $this->template->assign('sellingMethod', $template->getSellingMethod()); $output['html'] = $this->template->render('ebay.template.featureslist.tpl'); ISC_JSON::output('', true, $output); }
public function perform() { // validate the listing if (!$this->_validateListing()) { $this->_logDebug('Listing validation failed.'); $this->_removeListing(); return; } $templateId = $this->_getListingData('templateid'); $where = $this->_getListingData('where'); $offset = $this->_getListingData('offset'); $listingDate = $this->_getListingData('listing_date'); $scheduleDate = $this->_getListingData('schedule_date'); $this->_logDebug('listing template Id ' . $templateId . ' starting from row ' . $offset . ' with batch size ' . self::BATCH_SIZE); // get the template object try { $template = new ISC_ADMIN_EBAY_TEMPLATE($templateId); } catch (Exception $ex) { $error = GetLang('Ebay_Listing_Log_TemplateNotFound', array('id' => $templateId)); $this->_logError($error); $this->_errorListing($error); $this->_endListing(); return; } $primaryOptions = $template->getPrimaryCategoryOptions(); $secondaryOptions = $template->getSecondaryCategoryOptions(); // did the user choose to schedule the listing for a future date? if ($listingDate == 'schedule') { $template->setScheduleDate($scheduleDate); } // query for the products to export $query = ISC_ADMIN_EBAY_LIST_PRODUCTS::getListQuery($where, self::BATCH_SIZE, $offset); $this->_logDebug('query', $query); $res = $this->_db->Query($query); if (!$res) { $error = GetLang('Ebay_Listing_Log_JobDatabaseError'); $this->_logError($error); $this->_errorListing($error); $this->_endListing(); return; } $successCount = 0; $warningCount = 0; $errorCount = 0; $connectFailCount = 0; // nothing left to list? $resultCount = $this->_db->CountResult($res); if ($resultCount == 0) { $this->_logDebug('no more items to list'); $this->_endListing(); return; } $productsToList = array(); while ($row = $this->_db->Fetch($res)) { // does this product have a variation? if ($row['prodvariationid']) { $variationError = ''; // if the primary category or selling method doesn't support them? if ((empty ($primaryOptions['variations_supported']) || (isset ($secondaryOptions['variations_supported']) && $secondaryOptions['variations_supported'] == 0)) || $template->getSellingMethod() == ISC_ADMIN_EBAY::CHINESE_AUCTION_LISTING) { $variationError = GetLang('EbayListingVariationsNotSupported'); } // does the product have more than 120 combinations (eBay max)? elseif (($totalCombinations = Store_Variations::getCombinationsCount($row['productid'], $row['prodvariationid'])) > 120) { $variationError = GetLang('EbayListingVariationCombinationsExceeded', array('totalCombinations' => $totalCombinations)); } // log error and skip this product if ($variationError) { $error = array( 'prodname' => $row['prodname'], 'time' => time(), 'message' => $variationError, ); $this->_keystore->set($this->_prefix . 'error:' . md5($row['productid'] . uniqid('', true)), ISC_JSON::encode($error)); $errorCount++; continue; } } // add any custom fields and configurable fields to the product ISC_ADMIN_EBAY_LIST_PRODUCTS::addCustomAndConfigurableFields($row); $productsToList[$row['productid']] = $row; } $itemsToAdd = 1; // for chinese auctions if we're selling more than one item, then create multiple items if ($template->getSellingMethod() == ISC_ADMIN_EBAY::CHINESE_AUCTION_LISTING && $template->getQuantityToSell() > 1) { $itemsToAdd = $template->getQuantityToSell(); } $thisBatchSize = $resultCount; $actualProcessed = $thisBatchSize * $itemsToAdd; $actualListed = count($productsToList) * $itemsToAdd; // don't have any products to list for this batch (would be due to disallowed variations)? if (empty($productsToList)) { $this->_keystore->increment($this->_prefix . 'error_count', $errorCount); $this->_keystore->increment($this->_prefix . 'actual_processed', $actualProcessed); $this->_keystore->increment($this->_prefix . 'offset', $thisBatchSize); $this->_logDebug('processed 0 items'); $this->_repeatListing(); return; } $this->_logDebug($actualListed . ' items to list', '<pre>' . var_export($productsToList, true) . '</pre>'); try { // list the items on eBay $results = array(); for ($x = 0; $x < $itemsToAdd; $x++) { $results = array_merge($results, ISC_ADMIN_EBAY_LIST_PRODUCTS::listItems($productsToList, $template)); } foreach ($results as /** @var ISC_ADMIN_EBAY_LIST_ITEM_RESULT */$result) { if (!$result->isValid()) { // log error $error = array( 'prodname' => $result->getProductName(), 'time' => time(), 'message' => implode('<br />', $result->getErrors()), ); $this->_keystore->set($this->_prefix . 'error:' . md5($result->getProductId() . uniqid('', true)), ISC_JSON::encode($error)); $errorCount++; continue; } // valid listing, but has errors if ($result->hasErrors()) { // log warning $error = array( 'prodname' => $result->getProductName(), 'time' => time(), 'message' => implode('<br />', $result->getErrors()), ); $this->_keystore->set($this->_prefix . 'warning:' . md5($result->getProductId() . uniqid('', true)), ISC_JSON::encode($error)); $warningCount++; } // ensure template has correct data set so we can calculate prices for the DB $template->setProductData($result->getProductData()); // add the new item to our local database $insertItem = array( 'product_id' => $result->getProductId(), 'ebay_item_id' => $result->getItemId(), 'title' => $result->getProductName(), 'start_time' => $result->getStartTimeISO(), 'end_time' => $result->getEndTimeISO(), 'datetime_listed' => time(), 'listing_type' => $template->getSellingMethod(), 'listing_status' => 'pending', // this will be updated to 'Active' when we receive ItemListed notification 'current_price_currency' => $template->getCurrencyCode(), 'current_price' => $template->getStartPrice(), 'buyitnow_price' => $template->getBuyItNowPrice(), 'buyitnow_price_currency' => $template->getCurrencyCode(), 'bid_count' => 0, 'quantity_remaining' => $template->getTrueQuantityToSell(), 'site_id' => $template->getSiteId(), ); $dbItemId = $this->_db->InsertQuery('ebay_items', $insertItem); // process the listing fees foreach ($result->getFees() as $fee) { $insertFee = array( 'item_id' => $dbItemId, 'name' => $fee['name'], 'amount' => $fee['fee'], 'currency_code' => $fee['currency'] ); $this->_db->InsertQuery('ebay_item_fees', $insertFee); } $successCount++; } } catch (ISC_EBAY_API_CONNECTION_EXCEPTION $ex) { // connection failed $connectFailCount++; // more than one connection failure? abort the listing if ($connectFailCount > 1) { $this->_abortListing(); } // did the entire request fail? $this->logBatchException($productsToList, $ex); $errorCount += $actualListed; } catch (ISC_EBAY_API_REQUEST_EXCEPTION $ex) { // did the entire request fail? $this->logBatchException($productsToList, $ex); $errorCount += $actualListed; } $this->_keystore->increment($this->_prefix . 'success_count', $successCount); $this->_keystore->increment($this->_prefix . 'warning_count', $warningCount); $this->_keystore->increment($this->_prefix . 'error_count', $errorCount); $this->_keystore->increment($this->_prefix . 'actual_processed', $actualProcessed); $this->_keystore->increment($this->_prefix . 'actual_listed', $actualListed); $this->_keystore->increment($this->_prefix . 'offset', $thisBatchSize); $this->_logDebug('processed ' . $actualListed . ' items'); $this->_repeatListing(); }