function buildProductUploadXML($id, $inc_image = true) { global $db, $currencies, $messageStack; $result = $db->Execute("select * from " . TABLE_INVENTORY . " where id = " . $id); if ($result->RecordCount() != 1) { $messageStack->add(OSCOMMERCE_INVALID_SKU, 'error'); return false; } $this->sku = $result->fields['sku']; if (OSCOMMERCE_USE_PRICE_SHEETS == '1') { $sql = "select id, default_levels from " . TABLE_PRICE_SHEETS . " \r\n\t\twhere '" . date('Y-m-d', time()) . "' >= effective_date \r\n\t\tand sheet_name = '" . OSCOMMERCE_PRICE_SHEET . "' and inactive = '0'"; $default_levels = $db->Execute($sql); if ($default_levels->RecordCount() == 0) { $messageStack->add(OSCOMMERCE_ERROR_NO_PRICE_SHEET . OSCOMMERCE_PRICE_SHEET, 'error'); return false; } $sql = "select price_levels from " . TABLE_INVENTORY_SPECIAL_PRICES . " \r\n\t\twhere inventory_id = " . $id . " and price_sheet_id = " . $default_levels->fields['id']; $special_levels = $db->Execute($sql); if ($special_levels->RecordCount() > 0) { $price_levels = $special_levels->fields['price_levels']; } else { $price_levels = $default_levels->fields['default_levels']; } } // prepare some information before assembling string if ($inc_image && $result->fields['image_with_path']) { // image file $filename = DIR_FS_MY_FILES . $_SESSION['company'] . '/inventory/images/' . $result->fields['image_with_path']; if (file_exists($filename)) { if ($handle = fopen($filename, "rb")) { $contents = fread($handle, filesize($filename)); fclose($handle); // osCommerce only support one level, so we'll use the first path dir and filename only $temp = explode('/', $result->fields['image_with_path']); if (sizeof($temp) > 1) { $image_path = $temp[0]; $image_filename = array_pop($temp); } else { $image_path = ''; $image_filename = $temp[0]; } $image_data = base64_encode($contents); } } else { unset($image_data); } } // url encode all of the values to avoid upload bugs foreach ($result->fields as $key => $value) { $result->fields[$key] = urlencode($result->fields[$key]); } $this->strXML = '<?xml version="1.0" encoding="iso-8859-1" ?>' . chr(10); $this->strXML .= '<AccessRequest>' . chr(10); $this->strXML .= '<AccessUserID>' . OSCOMMERCE_USERNAME . '</AccessUserID>' . chr(10); $this->strXML .= '<AccessPassword>' . OSCOMMERCE_PASSWORD . '</AccessPassword>' . chr(10); $this->strXML .= '<AccessFunction>ProductUpload</AccessFunction>' . chr(10); $this->strXML .= '<Version>1.00</Version>' . chr(10); $this->strXML .= '<ProductUpload>' . chr(10); $this->strXML .= '<RequestHeader>' . chr(10); $this->strXML .= '<RequestAction>InsertUpdate</RequestAction>' . chr(10); $this->strXML .= '<ReferenceName>Product Upload sku: ' . $result->fields['sku'] . '</ReferenceName>' . chr(10); $this->strXML .= '<Originator>' . chr(10); // $this->strXML .= '<StoreID>' . OSCOMMERCE_STORE_ID . '</StoreID>' . chr(10); // $this->strXML .= '<SalesRepID>' . OSCOMMERCE_SALES_REP_ID . '</SalesRepID>' . chr(10); $this->strXML .= '<Language>' . $_SESSION['language'] . '</Language>' . chr(10); $this->strXML .= '</Originator>' . chr(10); $this->strXML .= '</RequestHeader>' . chr(10); $this->strXML .= '<ProductInformation>' . chr(10); $this->strXML .= '<SKU>' . $result->fields['sku'] . '</SKU>' . chr(10); // Specific to osCommerce $this->strXML .= '<ProductVirtual>0</ProductVirtual>' . chr(10); $this->strXML .= '<ProductStatus>' . ($result->fields['inactive'] ? '0' : '1') . '</ProductStatus>' . chr(10); $this->strXML .= '<ProductFreeShipping>0</ProductFreeShipping>' . chr(10); $this->strXML .= '<ProductHidePrice>0</ProductHidePrice>' . chr(10); $this->strXML .= '<ProductCategory>' . $result->fields['category_id'] . '</ProductCategory>' . chr(10); $this->strXML .= '<ProductSortOrder>' . $result->fields['id'] . '</ProductSortOrder>' . chr(10); // End specific to osCommerce // TBD need to map ProductType $this->strXML .= '<ProductType>Product - General</ProductType>' . chr(10); $this->strXML .= '<ProductName>' . $result->fields['description_short'] . '</ProductName>' . chr(10); $this->strXML .= '<ProductModel>' . $result->fields['description_short'] . '</ProductModel>' . chr(10); $this->strXML .= '<ProductDescription>' . $result->fields['description_sales'] . '</ProductDescription>' . chr(10); $this->strXML .= '<ProductURL>' . $result->fields['spec_file'] . '</ProductURL>' . chr(10); if (isset($image_data)) { $this->strXML .= '<ProductImageDirectory>' . $image_path . '</ProductImageDirectory>' . chr(10); $this->strXML .= '<ProductImageFileName>' . $image_filename . '</ProductImageFileName>' . chr(10); $this->strXML .= '<ProductImageData>' . $image_data . '</ProductImageData>' . chr(10); } // TBD need mappping for TaxClassType $this->strXML .= '<ProductTaxable>' . ($result->fields['item_taxable'] ? 'True' : 'False') . '</ProductTaxable>' . chr(10); $this->strXML .= '<TaxClassType>' . OSCOMMERCE_PRODUCT_TAX_CLASS . '</TaxClassType>' . chr(10); // Price Levels $this->strXML .= '<ProductPrice>' . chr(10); $this->strXML .= '<MSRPrice>' . $result->fields['full_price'] . '</MSRPrice>' . chr(10); $this->strXML .= '<RetailPrice>' . $result->fields['full_price'] . '</RetailPrice>' . chr(10); if (OSCOMMERCE_USE_PRICE_SHEETS) { $this->strXML .= '<PriceDiscounts>' . chr(10); $this->strXML .= '<PriceDiscountType>2</PriceDiscountType>' . chr(10); // set to actual price type $prices = inv_calculate_prices($result->fields['item_cost'], $result->fields['full_price'], $price_levels); foreach ($prices as $level => $amount) { $this->strXML .= '<PriceLevel>' . chr(10); $this->strXML .= '<DiscountLevel>' . ($level + 1) . '</DiscountLevel>' . chr(10); $this->strXML .= '<Quantity>' . $amount['qty'] . '</Quantity>' . chr(10); $this->strXML .= '<Amount>' . $currencies->clean_value($amount['price']) . '</Amount>' . chr(10); $this->strXML .= '</PriceLevel>' . chr(10); } $this->strXML .= '</PriceDiscounts>' . chr(10); } else { $this->strXML .= '<PriceDiscounts>' . chr(10); $this->strXML .= '<PriceDiscountType>0</PriceDiscountType>' . chr(10); // clear qty discount flag $this->strXML .= '</PriceDiscounts>' . chr(10); } $this->strXML .= '</ProductPrice>' . chr(10); $this->strXML .= '<ProductWeight>' . $result->fields['item_weight'] . '</ProductWeight>' . chr(10); $this->strXML .= '<DateAdded>' . $result->fields['creation_date'] . '</DateAdded>' . chr(10); $this->strXML .= '<DateUpdated>' . $result->fields['last_update'] . '</DateUpdated>' . chr(10); // $this->strXML .= '<DateAvailable>' . $result->fields['creation_date'] . '</DateAvailable>' . chr(10); $this->strXML .= '<StockLevel>' . $result->fields['quantity_on_hand'] . '</StockLevel>' . chr(10); $this->strXML .= '<Manufacturer>' . $result->fields['manufacturer'] . '</Manufacturer>' . chr(10); // Hook for including customiation of product attributes if (file_exists(DIR_FS_MY_FILES . 'custom/oscommerce/extra_actions/extra_product_attrs.php')) { include DIR_FS_MY_FILES . 'custom/oscommerce/extra_actions/extra_product_attrs.php'; } // EOF _ Hook for customization $this->strXML .= '</ProductInformation>' . chr(10); $this->strXML .= '</ProductUpload>' . chr(10); $this->strXML .= '</AccessRequest>'; return true; }
function buildProductUploadXML($id, $inc_image = true) { global $db, $currencies, $messageStack; $result = $db->Execute("select * from " . TABLE_INVENTORY . " where id = " . $id); if ($result->RecordCount() != 1) { $messageStack->add(ZENCART_INVALID_SKU, 'error'); return false; } $this->sku = $result->fields['sku']; if (ZENCART_USE_PRICE_SHEETS == '1') { $sql = "select id, default_levels from " . TABLE_PRICE_SHEETS . " \n\t\twhere '" . date('Y-m-d', time()) . "' >= effective_date \n\t\tand sheet_name = '" . ZENCART_PRICE_SHEET . "' and inactive = '0'"; $default_levels = $db->Execute($sql); if ($default_levels->RecordCount() == 0) { $messageStack->add(ZENCART_ERROR_NO_PRICE_SHEET . ZENCART_PRICE_SHEET, 'error'); return false; } $sql = "select price_levels from " . TABLE_INVENTORY_SPECIAL_PRICES . " \n\t\twhere inventory_id = " . $id . " and price_sheet_id = " . $default_levels->fields['id']; $special_levels = $db->Execute($sql); if ($special_levels->RecordCount() > 0) { $price_levels = $special_levels->fields['price_levels']; } else { $price_levels = $default_levels->fields['default_levels']; } } // prepare some information before assembling string if ($result->fields['image_with_path']) { // image file // Zencart only support one level, so we'll use the first path dir and filename only $temp = explode('/', $result->fields['image_with_path']); if (sizeof($temp) > 1) { $image_path = $temp[0]; $image_filename = array_pop($temp); } else { $image_path = ''; $image_filename = $temp[0]; } } if ($inc_image && $result->fields['image_with_path']) { // image file $filename = DIR_FS_MY_FILES . $_SESSION['company'] . '/inventory/images/' . $result->fields['image_with_path']; if (file_exists($filename)) { if ($handle = fopen($filename, "rb")) { $contents = fread($handle, filesize($filename)); fclose($handle); $image_data = base64_encode($contents); } } else { unset($image_data); } } // url encode all of the values to avoid upload bugs foreach ($result->fields as $key => $value) { $result->fields[$key] = urlencode($result->fields[$key]); } $this->strXML = '<?xml version="1.0" encoding="UTF-8" ?>' . chr(10); $this->strXML .= '<Request>' . chr(10); $this->strXML .= xmlEntry('Version', '2.00'); $this->strXML .= xmlEntry('UserName', ZENCART_USERNAME); $this->strXML .= xmlEntry('UserPassword', ZENCART_PASSWORD); $this->strXML .= xmlEntry('Language', $_SESSION['language']); $this->strXML .= xmlEntry('Operation', 'ProductUpload'); $this->strXML .= xmlEntry('Action', 'InsertUpdate'); $this->strXML .= xmlEntry('Reference', 'Product Upload SKU: ' . $result->fields['sku']); $this->strXML .= '<Product>' . chr(10); $this->strXML .= xmlEntry('SKU', $result->fields['sku']); // Specific to Zencart $this->strXML .= xmlEntry('ProductVirtual', '0'); $this->strXML .= xmlEntry('ProductStatus', $result->fields['inactive'] ? '0' : '1'); $this->strXML .= xmlEntry('ProductFreeShipping', '0'); $this->strXML .= xmlEntry('ProductHidePrice', '0'); $this->strXML .= xmlEntry('ProductCategory', $result->fields['category_id']); $this->strXML .= xmlEntry('ProductSortOrder', $result->fields['id']); // End specific to Zencart // TBD need to map ProductType $this->strXML .= xmlEntry('ProductType', 'Product - General'); $this->strXML .= xmlEntry('ProductName', $result->fields['description_short']); $this->strXML .= xmlEntry('ProductDescription', $result->fields['description_sales']); if (isset($result->fields['ProductURL'])) { $this->strXML .= xmlEntry('ProductURL', $result->fields['ProductURL']); } if (isset($result->fields['ProductModel'])) { $this->strXML .= xmlEntry('ProductModel', $result->fields['ProductModel']); } if (isset($image_data)) { $this->strXML .= xmlEntry('ProductImageDirectory', $image_path); $this->strXML .= xmlEntry('ProductImageFileName', $image_filename); $this->strXML .= xmlEntry('ProductImageData', $image_data); } // TBD need mappping for TaxClassType $this->strXML .= xmlEntry('ProductTaxable', $result->fields['item_taxable'] ? 'True' : 'False'); $this->strXML .= xmlEntry('TaxClassType', ZENCART_PRODUCT_TAX_CLASS); // Price Levels $this->strXML .= ' <ProductPrice>' . chr(10); $this->strXML .= xmlEntry('MSRPrice', $result->fields['full_price']); $this->strXML .= xmlEntry('RetailPrice', $result->fields['full_price']); if (ZENCART_USE_PRICE_SHEETS) { $this->strXML .= ' <PriceDiscounts>' . chr(10); $this->strXML .= xmlEntry('PriceDiscountType', '2'); // set to actual price type $prices = inv_calculate_prices($result->fields['item_cost'], $result->fields['full_price'], $price_levels); foreach ($prices as $level => $amount) { $this->strXML .= ' <PriceLevel>' . chr(10); $this->strXML .= xmlEntry('DiscountLevel', $level + 1); $this->strXML .= xmlEntry('Quantity', $amount['qty']); $this->strXML .= xmlEntry('Amount', $currencies->clean_value($amount['price'])); $this->strXML .= ' </PriceLevel>' . chr(10); } $this->strXML .= ' </PriceDiscounts>' . chr(10); } else { $this->strXML .= ' <PriceDiscounts>' . chr(10); $this->strXML .= xmlEntry('PriceDiscountType', '0'); // clear qty discount flag $this->strXML .= ' </PriceDiscounts>' . chr(10); } $this->strXML .= ' </ProductPrice>' . chr(10); $this->strXML .= xmlEntry('ProductWeight', $result->fields['item_weight']); $this->strXML .= xmlEntry('DateAdded', $result->fields['creation_date']); if ($result->fields['last_update'] < $result->fields['last_journal_date']) { $this->strXML .= xmlEntry('DateUpdated', $result->fields['last_journal_date']); } else { $this->strXML .= xmlEntry('DateUpdated', $result->fields['last_update']); } $this->strXML .= xmlEntry('StockLevel', $result->fields['quantity_on_hand']); $this->strXML .= xmlEntry('Manufacturer', $result->fields['manufacturer']); // Hook for including customiation of product attributes if (file_exists(DIR_FS_MODULES . 'zencart/custom/extra_product_attrs.php')) { include DIR_FS_MODULES . 'zencart/custom/extra_product_attrs.php'; } // EOF _ Hook for customization $this->strXML .= '</Product>' . chr(10); $this->strXML .= '</Request>' . chr(10); return true; }
if (is_object($price_sheets)) { if ($price_sheets->RecordCount() > 0) { $cnt = 0; while (!$price_sheets->EOF) { echo '<table class="ui-widget" style="border-collapse:collapse;width:300px">'; echo '<thead class="ui-widget-header">'; echo '<tr><th colspan="2">' . PRICE_SHEETS_LOG . $price_sheets->fields['sheet_name'] . '</th></tr>'; echo '<tr><th>' . TEXT_QUANTITY . '</th><th align="center">' . TEXT_PRICE . '</th></tr>'; echo ' </thead><tbody class="ui-widget-content">' . chr(10); // remove the first and last element from the price level source array (not used and Level 1 price source) $first_source_list = $price_mgr_sources; array_shift($first_source_list); array_pop($first_source_list); // extract the pricing information $levels = isset($special_prices[$price_sheets->fields['id']]) ? $special_prices[$price_sheets->fields['id']] : $price_sheets->fields['default_levels']; $prices = inv_calculate_prices($inventory_details->fields['item_cost'], $inventory_details->fields['full_price'], $levels); foreach ($prices as $price_level) { echo '<tr onclick="setReturnPrice(\'' . $rowId . '\', \'price_' . $cnt . '\')">'; echo '<td style="cursor:pointer" align="center">' . $price_level['qty'] . '</td>'; echo '<td style="cursor:pointer" align="right">' . html_input_field('price_' . $cnt, $price_level['price'], 'style="cursor:pointer" readonly="readonly" size="10" style="text-align:right"') . '</td></tr>'; $cnt++; } $price_sheets->MoveNext(); echo '</tbody></table>'; } echo html_hidden_field('num_prices', $cnt); } } else { echo '<div align="center"><p>' . INV_NO_PRICE_SHEETS . '</p></div>'; } // end if ($price_sheets->RecordCount() > 0)
function inv_calculate_sales_price($qty, $sku_id, $contact_id = '') { global $db, $currencies; // get the inventory prices $inventory = $db->Execute("select item_cost, full_price, price_sheet from " . TABLE_INVENTORY . " where id = '" . $sku_id . "'"); // determine what price to charge based on customer and sku information if ($inventory->fields['price_sheet'] != '') { // if inventory price sheet is defined, it has priority $sheet_name = $inventory->fields['price_sheet']; } else { $customer = $db->Execute("select price_sheet from " . TABLE_CONTACTS . " where id = '" . $contact_id . "'"); if ($customer->fields['price_sheet'] != '') { // no price sheet used for this customer, check for default $sheet_name = $customer->fields['price_sheet']; } else { $customer = $db->Execute("select sheet_name from " . TABLE_PRICE_SHEETS . " where default_sheet = '1'"); $sheet_name = $customer->RecordCount() == 0 ? '' : $customer->fields['sheet_name']; } } // determine the sku price ranges from the price sheet in effect $sql = "select id, default_levels from " . TABLE_PRICE_SHEETS . " \r\n\t\twhere inactive = '0' and \r\n\t\t(expiration_date is null or expiration_date = '0000-00-00' or expiration_date >= '" . date('Y-m-d', time()) . "') \r\n\t\tand sheet_name = '" . $sheet_name . "'"; $price_sheets = $db->Execute($sql); // retrieve special pricing for this inventory item $sql = "select price_sheet_id, price_levels from " . TABLE_INVENTORY_SPECIAL_PRICES . " \r\n\t\twhere price_sheet_id = '" . $price_sheets->fields['id'] . "' and inventory_id = " . $sku_id; $result = $db->Execute($sql); $special_prices = array(); while (!$result->EOF) { $special_prices[$result->fields['price_sheet_id']] = $result->fields['price_levels']; $result->MoveNext(); } $levels = isset($special_prices[$price_sheets->fields['id']]) ? $special_prices[$price_sheets->fields['id']] : $price_sheets->fields['default_levels']; $prices = inv_calculate_prices($inventory->fields['item_cost'], $inventory->fields['full_price'], $levels); $price = '0.0'; foreach ($prices as $value) { if ($qty >= $value['qty']) { $price = $currencies->clean_value($value['price']); } } return $price; }
function dumpAmazon() { global $db, $messageStack; $separator = "\t"; $file_name = "amazon_upload.txt"; // $separator = ","; // $file_name = "amazon_upload.csv"; $result = $db->Execute("SELECT * FROM " . TABLE_INVENTORY . " WHERE amazon='1' AND inactive='0'"); $line = array(); // $output = "TemplateType=ConsumerElectronics,Version=1.01,This row for Amazon.com use only. Do not modify or delete.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Rebates,,,,,,,,PC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,PDA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Misc Consumer Electronics"; $output = "TemplateType=ConsumerElectronics,Version=1.01,This row for Amazon.com use only. Do not modify or delete."; $line[] = str_replace(",", $separator, $output); // $output = "sku,standard-product-id,product-id-type,title,manufacturer,brand,mfr-part-number,merchant-catalog-number,bullet-point1,bullet-point2,bullet-point3,bullet-point4,bullet-point5,description,product_type,legal-disclaimer,prop-65,item-type,used-for1,used-for2,used-for3,used-for4,used-for5,other-item-attributes1,other-item-attributes2,other-item-attributes3,other-item-attributes4,other-item-attributes5,subject-content1,subject-content2,subject-content3,subject-content4,subject-content5,search-terms1,search-terms2,search-terms3,search-terms4,search-terms5,platinum-keywords1,platinum-keywords2,platinum-keywords3,platinum-keywords4,platinum-keywords5,main-image-url,other-image-url1,other-image-url2,other-image-url3,other-image-url4,other-image-url5,other-image-url6,other-image-url7,other-image-url8,item-weight-unit-of-measure,item-weight,item-length-unit-of-measure,item-length,item-height,item-width,package-weight-unit-of-measure,package-weight,package-length-unit-of-measure,package-length,package-height,package-width,product-tax-code,launch-date,map,msrp,item-price,sale-price,sale-from-date,sale-through-date,quantity,leadtime-to-ship,is-gift-message-available,is-giftwrap-available,update-delete,target-audience-keywords1,target-audience-keywords2,target-audience-keywords3,item-condition,PC_AdditionalDrives1,PC_AdditionalDrives2,PC_AdditionalDrives3,PC_AdditionalDrives4,PC_AdditionalDrives5,PC_AdditionalDrives6,PC_AdditionalDrives7,PC_AdditionalDrives8,PC_AdditionalDrives9,PC_AdditionalDrives10,PC_HardDriveSize1,PC_HardDriveSize2,PC_HardDriveSize3,PC_HardDriveSize4,PC_HardDriveSize5,PC_HardDriveSize6,PC_HardDriveSize7,PC_HardDriveSize8,PC_HardDriveSizeUnitOfMeasure,PC_HardDriveInterface1,PC_HardDriveInterface2,PC_HardDriveInterface3,PC_HardDriveInterface4,PC_SoftwareIncluded,PC_ComputerMemoryType1,PC_ComputerMemoryType2,PC_ComputerMemoryType3,PC_ComputerMemoryType4,PC_ComputerMemoryType5,PC_ComputerMemoryType6,PC_ComputerMemoryType7,PC_ComputerMemoryType8,PC_ComputerMemoryType9,PC_ComputerMemoryType10,PC_RAMSize,PC_RAMSizeUnitOfMeasure,PC_MemorySlotsAvailable,PC_ProcessorBrand,PC_ProcessorSpeed,PC_ProcessorSpeedUnitOfMeasure,PC_ProcessorType,PC_ProcessorCount,PC_ScreenResolution,PC_ScreenSize,PC_ScreenSizeUnitOfMeasure,PC_OperatingSystem1,PC_OperatingSystem2,PC_HardwarePlatform,PC_U-RackSize,PC_WirelessType1,PC_WirelessType2,PC_WirelessType3,PC_GraphicsDescription1,PC_GraphicsRAMSize1,PC_GraphicsCardInterface1,PC_GraphicsDescription2,PC_GraphicsRAMSize2,PC_GraphicsCardInterface2,PC_GraphicsRAMSizeUnitOfMeasure,PC_AdditionalFeatures,rebate-start-date1,rebate-end-date1,rebate-message1,rebate-name1,rebate-start-date2,rebate-end-date2,rebate-message2,rebate-name2,PDA_HardDriveSize,PDA_HardDriveSizeUnitOfMeasure,PDA_SoftwareIncluded,PDA_ComputerMemoryType1,PDA_ComputerMemoryType2,PDA_ComputerMemoryType3,PDA_ComputerMemoryType4,PDA_ComputerMemoryType5,PDA_ComputerMemoryType6,PDA_ComputerMemoryType7,PDA_ComputerMemoryType8,PDA_ComputerMemoryType9,PDA_ComputerMemoryType10,PDA_MemorySlotsAvailable,PDA_RAMSize,PDA_RAMSizeUnitOfMeasure,PDA_ProcessorSpeed,PDA_ProcessorSpeedUnitOfMeasure,PDA_ProcessorType,PDA_ROMSize,PDA_ROMSizeUnitOfMeasure,PDA_ScreenResolution,PDA_ColorScreen,PDA_ScreenSize,PDA_ScreenSizeUnitOfMeasure,PDA_OperatingSystem1,PDA_OperatingSystem2,PDA_OperatingSystem3,PDA_OperatingSystem4,PDA_OperatingSystem5,PDA_WirelessType1,PDA_WirelessType2,PDA_WirelessType3,PDA_AdditionalFeatures,PDA_PDABaseModel1,PDA_PDABaseModel2,PDA_PDABaseModel3,PDA_PDABaseModel4,PDA_PDABaseModel5,CE_Color,CE_SpeakerDiameter,CE_SpeakerDiameterUnitOfMeasure,CE_ColorMap,CE_Voltage,CE_Wattage,CE_PowerSource,CE_AdditionalFeatures,CE_VehicleSpeakerSize,CE_TelephoneType1,CE_TelephoneType2,CE_TelephoneType3,CE_TelephoneType4,CE_PDABaseModel1,CE_PDABaseModel2,CE_PDABaseModel3,CE_PDABaseModel4,CE_PDABaseModel5,CE_DigitalMediaFormat,CE_HomeAutomationCommunicationDevice,CE_DigitalAudioCapacity,CE_HolderCapacity,CE_MemorySlotsAvailable,CE_RAMSize,CE_RAMSizeUnitOfMeasure,CE_ScreenResolution,CE_ColorScreen,CE_ScreenSize,CE_ScreenSizeUnitOfMeasure,CE_WirelessType1,CE_WirelessType2,CE_WirelessType3,CE_HardDriveSize1,CE_HardDriveSize2,CE_HardDriveSize3,CE_HardDriveSize4,CE_HardDriveSize5,CE_HardDriveSize6,CE_HardDriveSize7,CE_HardDriveSize8,CE_HardDriveSizeUnitOfMeasure,CE_HardDriveInterface1,CE_HardDriveInterface2,CE_HardDriveInterface3,CE_HardDriveInterface4,CE_OperatingSystem1,CE_OperatingSystem2,CE_OperatingSystem3,CE_OperatingSystem4,CE_OperatingSystem5,CE_HardwarePlatform,CE_ComputerMemoryType1,CE_ComputerMemoryType2,CE_ComputerMemoryType3,CE_ComputerMemoryType4,CE_ComputerMemoryType5,CE_ComputerMemoryType6,CE_ComputerMemoryType7,CE_ComputerMemoryType8,CE_ComputerMemoryType9,CE_ComputerMemoryType10,CE_ItemPackageQuantity,id"; // $line[] = $output; // $line[] = str_replace(",","\t",$output); $first_run = true; while (!$result->EOF) { // fetch the price levels if (ZENCART_USE_PRICE_SHEETS) { $sql = "SELECT id, default_levels FROM " . TABLE_PRICE_SHEETS . "\n\t\t\t\t\tWHERE '" . date('Y-m-d', time()) . "'>=effective_date AND sheet_name = '" . MODULE_AMAZON_DEFAULT_PRICE_SHEET . "' AND inactive='0'"; $default_levels = $db->Execute($sql); if ($default_levels->RecordCount() == 0) { $messageStack->add('Couldn\'t find a default price level for price sheet: ' . MODULE_AMAZON_DEFAULT_PRICE_SHEET, 'error'); return false; } $sql = "SELECT price_levels FROM " . TABLE_INVENTORY_SPECIAL_PRICES . "\n\t\t\t\t\tWHERE inventory_id={$result->fields['id']} AND price_sheet_id={$default_levels->fields['id']}"; $special_levels = $db->Execute($sql); if ($special_levels->RecordCount() > 0) { $price_levels = $special_levels->fields['price_levels']; } else { $price_levels = $default_levels->fields['default_levels']; } } //build the uplink array sequenced properly $output = array(); $output['sku'] = $result->fields['sku']; // test for duplicate upc's if (!$result->fields['upc_code'] && !$result->fields['amazon_asin']) { // find the dup $messageStack->add('Missing UPC code and Amazon ASIN ID for SKU: ' . $result->fields['sku'], 'error'); } $output['standard-product-id'] = $result->fields['amazon_asin'] ? $result->fields['amazon_asin'] : $result->fields['upc_code']; $output['product-id-type'] = $result->fields['amazon_asin'] ? 'ASIN' : 'UPC'; $output['title'] = $result->fields['description_sales']; $output['manufacturer'] = $result->fields['manufacturer']; $output['brand'] = $result->fields['brand']; $output['mfr-part-number'] = $result->fields['oem_sku']; $output['merchant-catalog-number'] = $result->fields['merchant_catalog_number']; $output['bullet-point1'] = $result->fields['bullet_point_1']; $output['bullet-point2'] = $result->fields['bullet_point_2']; $output['bullet-point3'] = $result->fields['bullet_point_3']; $output['bullet-point4'] = $result->fields['bullet_point_4']; $output['bullet-point5'] = $result->fields['bullet_point_5']; $output['description'] = $result->fields['description']; $output['product_type'] = 'ConsumerElectronics'; // $result->fields['product_type']; $output['legal-disclaimer'] = $result->fields['legal_disclaimer']; $output['prop-65'] = $result->fields['prop_65'] ? 'true' : 'false'; $output['item-type'] = $result->fields['item_type']; // item_type_keyword ??? // $output['used-for1'] = ''; // $result->fields['used-for1']; // $output['used-for2'] = ''; // $result->fields['used-for2']; // $output['used-for3'] = ''; // $result->fields['used-for3']; // $output['used-for4'] = ''; // $result->fields['used-for4']; // $output['used-for5'] = ''; // $result->fields['used-for5']; $output['other-item-attributes1'] = $result->fields['other_item_attributes_1']; $output['other-item-attributes2'] = $result->fields['other_item_attributes_2']; $output['other-item-attributes3'] = $result->fields['other_item_attributes_3']; $output['other-item-attributes4'] = $result->fields['other_item_attributes_4']; $output['other-item-attributes5'] = $result->fields['other_item_attributes_5']; // $output['subject-content1'] = ''; // $result->fields['subject-content1']; // $output['subject-content2'] = ''; // $result->fields['subject-content2']; // $output['subject-content3'] = ''; // $result->fields['subject-content3']; // $output['subject-content4'] = ''; // $result->fields['subject-content4']; // $output['subject-content5'] = ''; // $result->fields['subject-content5']; $output['search-terms1'] = $result->fields['search_terms_1']; $output['search-terms2'] = $result->fields['search_terms_2']; $output['search-terms3'] = $result->fields['search_terms_3']; $output['search-terms4'] = $result->fields['search_terms_4']; $output['search-terms5'] = $result->fields['search_terms_5']; // $output['platinum-keywords1'] = $result->fields['platinum-keywords1']; // $output['platinum-keywords2'] = $result->fields['platinum-keywords2']; // $output['platinum-keywords3'] = $result->fields['platinum-keywords3']; // $output['platinum-keywords4'] = $result->fields['platinum-keywords4']; // $output['platinum-keywords5'] = $result->fields['platinum-keywords5']; // Amazon only supports one level, so we'll use the first path dir and filename only $imageType = substr($result->fields['image_with_path'], -3); if (in_array($imageType, array('jpg', 'JPG', 'peg', 'PEG', 'gif', 'GIF'))) { $output['main-image-url'] = PPS_FULL_URL . $result->fields['image_with_path']; } else { $output['main-image-url'] = ''; $messageStack->add_session('Image at path: ' . $result->fields['image_with_path'] . ' for sku ' . $output['sku'] . ' must be of type jpg or gif for amazon!', 'error'); } // $output['other-image-url1'] = $result->fields['other-image-url1']; // $output['other-image-url2'] = $result->fields['other-image-url2']; // $output['other-image-url3'] = $result->fields['other-image-url3']; // $output['other-image-url4'] = $result->fields['other-image-url4']; // $output['other-image-url5'] = $result->fields['other-image-url5']; // $output['other-image-url6'] = $result->fields['other-image-url6']; // $output['other-image-url7'] = $result->fields['other-image-url7']; // $output['other-image-url8'] = $result->fields['other-image-url8']; $output['item-weight-unit-of-measure'] = 'LB'; // $result->fields['item_weight_unit_of_measure']; $output['item-weight'] = $result->fields['item_weight']; $output['item-length-unit-of-measure'] = 'IN'; // $result->fields['item_length_unit_of_measure']; $output['item-length'] = $result->fields['dim_length']; $output['item-height'] = $result->fields['dim_height']; $output['item-width'] = $result->fields['dim_width']; $output['package-weight-unit-of-measure'] = 'LB'; // $result->fields['package_weight_unit_of_measure']; if ($result->fields['item_weight'] == 0) { $messageStack->add_session('Item ' . $result->fields['sku'] . ' has no weight. Please edit the inventory record and add a weight.', 'error'); } $output['package-weight'] = $result->fields['package_weight'] > 0 ? $result->fields['package_weight'] : ceil($result->fields['item_weight']); $output['package-length-unit-of-measure'] = 'IN'; // $result->fields['package_length_unit_of_measure']; $output['package-length'] = $result->fields['package_length'] > 0 ? $result->fields['package_length'] : ceil($result->fields['dim_length']); $output['package-height'] = $result->fields['package_height'] > 0 ? $result->fields['package_height'] : ceil($result->fields['dim_height']); $output['package-width'] = $result->fields['package_width'] > 0 ? $result->fields['package_width'] : ceil($result->fields['dim_width']); // $output['product-tax-code'] = $result->fields['product_tax_code']; // ***************************** $output['launch-date'] = substr($result->fields['creation_date'], 0, 10); // $output['release-date'] = $result->fields['creation_date']; $output['msrp'] = $result->fields['full_price']; $prices = inv_calculate_prices($result->fields['item_cost'], $result->fields['full_price'], $price_levels); $output['currency'] = 'USD'; // if ($result->fields['map_price'] > 0) $output['map-price'] = $result->fields['map_price']; $output['item-price'] = $prices[0]['price']; // $output['sale-price'] = ''; // $result->fields['sale-price']; // $output['sale-from-date'] = ''; // $result->fields['sale-from-date']; // $output['sale-through-date']= ''; // $result->fields['sale-through-date']; // for assemblies, we need to determine if we have enough product to assemble a unit and adjust qty accordingly if ($result->fields['inventory_type'] == 'as') { $sql = "SELECT a.qty, i.quantity_on_hand\n\t\t\t\t FROM " . TABLE_INVENTORY_ASSY_LIST . " a JOIN " . TABLE_INVENTORY . " i on a.sku = i.sku\n\t\t\t\t where a.ref_id = " . $result->fields['id']; $bom_list = $db->Execute($sql); $min_qty = 9999; while (!$bom_list->EOF) { $qty = $bom_list->fields['quantity_on_hand'] / $bom_list->fields['qty']; $min_qty = min($min_qty, floor($qty)); $bom_list->MoveNext(); } $result->fields['quantity_on_hand'] = $min_qty; } $available = $result->fields['quantity_on_hand'] - $result->fields['quantity_on_sales_order'] - $result->fields['quantity_on_allocation']; $output['quantity'] = max(0, $available); // no negative numbers $output['leadtime-to-ship'] = $result->fields['leadtime_to_ship']; // $output['is-discontinued-by-manufacturer'] = ''; // $output['update-delete'] = $result->fields['update_delete']; $output['target-audience-keywords1'] = 'people'; $output['target-audience-keywords2'] = 'professional-audience'; // $output['target-audience-keywords3'] = ''; $output['item-condition'] = 'New'; // $result->fields['item_condition']; // $output['condition_note'] = $result->fields['condition_note']; /* $output[] = ''; // $result->fields['rebate-start-date1']; $output[] = ''; // $result->fields['rebate-end-date1']; $output[] = ''; // $result->fields['rebate-message1']; $output[] = ''; // $result->fields['rebate-name1']; $output[] = ''; // $result->fields['rebate-start-date2']; $output[] = ''; // $result->fields['rebate-end-date2']; $output[] = ''; // $result->fields['rebate-message2']; $output[] = ''; // $result->fields['rebate-name2']; */ $output['CE_Voltage'] = substr($result->fields['cat_attrib_01'], 0, strpos($result->fields['cat_attrib_01'], ' ')); /* $output[] = ''; // $result->fields['CE_Color']; $output[] = ''; // $result->fields['CE_ColorMap']; $output[] = ''; // $result->fields['CE_Wattage']; $output[] = ''; // $result->fields['CE_PowerSource']; $output[] = ''; // $result->fields['CE_AdditionalFeatures']; $output[] = ''; // $result->fields['CE_ItemPackageQuantity']; */ // implode it and download to user if ($first_run) { // save the keys for the first pass $headings = array_keys($output); $line[] = implode($separator, $headings); $first_run = false; } // if it's comma separated delimit if ($separator == ",") { foreach ($output as $key => $value) { if (strpos($value, ',') !== false) { $output[$key] = '"' . $value . '"'; } } } $line[] = implode($separator, $output); $result->MoveNext(); } // BOF - Special section for upload of free shipping override if (false) { $result = $db->Execute("SELECT sku, amazon_freeship FROM " . TABLE_INVENTORY . " WHERE amazon='1' AND inactive='0'"); $line = array(); $output = "TemplateType=Overrides,Version=1.01,This row for Amazon.com use only. Do not modify or delete."; $line[] = str_replace(",", $separator, $output); $first_run = true; while (!$result->EOF) { if ($result->fields['amazon_freeship']) { $output = array(); $output['sku'] = $result->fields['sku']; $output['Locale1'] = 'ContinentalUS'; $output['FulfillmentServiceLevel1'] = 'Standard'; $output['ShippingAmt1'] = '0.00'; $output['Type1'] = 'Exclusive'; // $output['DoNotShip1'] = ''; // possible values are true and false // more fields allowed Locale2 through DoNotShip5 // There is no way to delete this directly on Amazon, send feed with all SKUs set to // delete to remove the Free Shipping Override flag $output['UpdateDelete'] = 'Update'; // implode it and download to user if ($first_run) { // save the keys for the first pass $headings = array_keys($output); $line[] = implode($separator, $headings); $first_run = false; } // if it's comma separated delimit if ($separator == ",") { foreach ($output as $key => $value) { if (strpos($value, ',') !== false) { $output[$key] = '"' . $value . '"'; } } } $line[] = implode($separator, $output); } $result->MoveNext(); } } // EOF - Special section for upload of free shipping overrride $contents = implode("\n", $line); $contents .= "\n"; if ($messageStack->size == 0) { header('Content-type: text/plain'); header('Content-Length: ' . strlen($contents)); header('Content-Disposition: attachment; filename=' . $file_name); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); echo $contents; exit; } }
function calulate_special_fields($id) { global $db, $currencies; $new_data = array(); // get the inventory prices $inventory = $db->Execute("select item_cost, full_price, price_sheet from " . TABLE_INVENTORY . " where id = '{$id}'"); // determine what price sheet to use, priority: inventory, default if ($inventory->fields['price_sheet'] != '') { $sheet_name = $inventory->fields['price_sheet']; } else { $default_sheet = $db->Execute("select sheet_name from " . TABLE_PRICE_SHEETS . "\n\t\t\twhere type = 'c' and default_sheet = '1'"); $sheet_name = $default_sheet->RecordCount() == 0 ? '' : $default_sheet->fields['sheet_name']; } // determine the sku price ranges from the price sheet in effect $levels = false; if ($sheet_name != '') { $sql = "select id, default_levels from " . TABLE_PRICE_SHEETS . "\n\t\t where inactive = '0' and type = 'c' and sheet_name = '{$sheet_name}' and \n\t\t (expiration_date is null or expiration_date = '0000-00-00' or expiration_date >= '" . date('Y-m-d') . "')"; $price_sheets = $db->Execute($sql); // retrieve special pricing for this inventory item $result = $db->Execute("select price_sheet_id, price_levels from " . TABLE_INVENTORY_SPECIAL_PRICES . "\n\t\t\twhere price_sheet_id = '{$price_sheets->fields['id']}' and inventory_id = " . $id); $special_prices = array(); while (!$result->EOF) { $special_prices[$result->fields['price_sheet_id']] = $result->fields['price_levels']; $result->MoveNext(); } $levels = isset($special_prices[$price_sheets->fields['id']]) ? $special_prices[$price_sheets->fields['id']] : $price_sheets->fields['default_levels']; } $new_data = array('price_level_1' => '', 'price_qty_1' => '', 'price_level_2' => '', 'price_qty_2' => '', 'price_level_3' => '', 'price_qty_3' => '', 'price_level_4' => '', 'price_qty_4' => '', 'price_level_5' => '', 'price_qty_5' => ''); if ($levels) { $prices = inv_calculate_prices($inventory->fields['item_cost'], $inventory->fields['full_price'], $levels); if (is_array($prices)) { foreach ($prices as $key => $value) { $new_data['price_level_' . ($key + 1)] = $currencies->clean_value($value['price']); $new_data['price_qty_' . ($key + 1)] = $value['qty']; } } } return $new_data; }
function inv_calculate_sales_price($qty, $sku_id, $contact_id = 0, $type = 'c') { global $db, $currencies; $price_sheet = ''; $contact_tax = 1; if ($contact_id) { $contact = $db->Execute("select type, price_sheet, tax_id from " . TABLE_CONTACTS . " where id = '{$contact_id}'"); $type = $contact->fields['type']; $price_sheet = $contact->fields['price_sheet']; $contact_tax = $contact->fields['tax_id']; } // get the inventory prices if ($type == 'v') { if ($contact_id) { $inventory = $db->Execute("select p.item_cost, a.full_price, a.price_sheet, p.price_sheet_v, a.item_taxable, p.purch_taxable from " . TABLE_INVENTORY . " a join " . TABLE_INVENTORY_PURCHASE . " p on a.sku = p.sku where a.id = '{$sku_id}' and p.vendor_id = '{$contact_id}'"); } else { $inventory = $db->Execute("select MAX(p.item_cost) as item_cost, a.full_price, a.price_sheet, p.price_sheet_v, a.item_taxable, p.purch_taxable from " . TABLE_INVENTORY . " a join " . TABLE_INVENTORY_PURCHASE . " p on a.sku = p.sku where a.id = '{$sku_id}'"); } $inv_price_sheet = $inventory->fields['price_sheet_v']; } else { $inventory = $db->Execute("select MAX(p.item_cost) as item_cost, a.full_price, a.price_sheet, p.price_sheet_v, a.item_taxable, p.purch_taxable from " . TABLE_INVENTORY . " a join " . TABLE_INVENTORY_PURCHASE . " p on a.sku = p.sku where a.id = '{$sku_id}'"); $inv_price_sheet = $inventory->fields['price_sheet']; } // set the default tax rates $purch_tax = $contact_tax == 0 && $type == 'v' ? 0 : $inventory->fields['purch_taxable']; $sales_tax = $contact_tax == 0 && $type == 'c' ? 0 : $inventory->fields['item_taxable']; // determine what price sheet to use, priority: customer, inventory, default if ($price_sheet != '') { $sheet_name = $price_sheet; } elseif ($inv_price_sheet != '') { $sheet_name = $inv_price_sheet; } else { $default_sheet = $db->Execute("select sheet_name from " . TABLE_PRICE_SHEETS . " where type = '{$type}' and default_sheet = '1'"); $sheet_name = $default_sheet->RecordCount() == 0 ? '' : $default_sheet->fields['sheet_name']; } // determine the sku price ranges from the price sheet in effect $price = $type == 'v' ? $inventory->fields['item_cost'] : $inventory->fields['full_price']; if ($price == '' || $price == null) { $price = 0.0; } if ($sheet_name != '') { $sql = "select id, default_levels from " . TABLE_PRICE_SHEETS . "\n\t\t\t where inactive = '0' and type = '{$type}' and sheet_name = '{$sheet_name}' and\n\t\t\t (expiration_date is null or expiration_date = '0000-00-00' or expiration_date >= '" . date('Y-m-d') . "')"; $price_sheets = $db->Execute($sql); // retrieve special pricing for this inventory item $sql = "select price_sheet_id, price_levels from " . TABLE_INVENTORY_SPECIAL_PRICES . " where price_sheet_id = '{$price_sheets->fields['id']}' and inventory_id = {$sku_id}"; $result = $db->Execute($sql); $special_prices = array(); while (!$result->EOF) { $special_prices[$result->fields['price_sheet_id']] = $result->fields['price_levels']; $result->MoveNext(); } $levels = isset($special_prices[$price_sheets->fields['id']]) ? $special_prices[$price_sheets->fields['id']] : $price_sheets->fields['default_levels']; $prices = inv_calculate_prices($inventory->fields['item_cost'], $inventory->fields['full_price'], $levels); if (is_array($prices)) { foreach ($prices as $value) { if ($qty >= $value['qty']) { $price = $currencies->clean_value($value['price']); } } } } return array('price' => $price, 'sales_tax' => $sales_tax, 'purch_tax' => $purch_tax); }