Esempio n. 1
0
 public function buildVariations($id, $item, $profile_details, $listing, $session)
 {
     // build variations
     $item->Variations = new VariationsType();
     // get product variations
     // $listing = ListingsModel::getItem( $id );
     $variations = ProductWrapper::getVariations($listing['post_id']);
     // get max_quantity from profile
     $max_quantity = isset($profile_details['max_quantity']) && intval($profile_details['max_quantity']) > 0 ? $profile_details['max_quantity'] : PHP_INT_MAX;
     // get variation attributes / item specifics map according to profile
     $specifics_map = $profile_details['item_specifics'];
     $collectedMPNs = array();
     // loop each combination
     foreach ($variations as $var) {
         $newvar = new VariationType();
         // handle price
         $newvar->StartPrice = self::dbSafeFloatval(ListingsModel::applyProfilePrice($var['price'], $profile_details['start_price']));
         // handle StartPrice on parent product level
         if ($product_start_price = get_post_meta($listing['post_id'], '_ebay_start_price', true)) {
             $newvar->StartPrice = self::dbSafeFloatval($product_start_price);
         }
         // handle StartPrice on variation level
         if ($product_start_price = get_post_meta($var['post_id'], '_ebay_start_price', true)) {
             $newvar->StartPrice = self::dbSafeFloatval($product_start_price);
         }
         // handle variation quantity - if no quantity set in profile
         // if ( intval( $item->Quantity ) == 0 ) {
         if (intval($profile_details['quantity']) == 0) {
             $newvar->Quantity = min($max_quantity, intval($var['stock']));
         } else {
             $newvar->Quantity = min($max_quantity, $item->Quantity);
             // should be removed in future versions
         }
         if ($newvar->Quantity < 0) {
             $newvar->Quantity = 0;
         }
         // prevent error for negative qty
         // handle sku
         if ($var['sku'] != '') {
             $newvar->SKU = $var['sku'];
         }
         // // add VariationSpecifics (v2)
         // $VariationSpecifics = new NameValueListArrayType();
         // foreach ($var['variation_attributes'] as $name => $value) {
         //     $NameValueList = new NameValueListType();
         // 	$NameValueList->setName ( $name  );
         // 	$NameValueList->setValue( $value );
         // 	$VariationSpecifics->addNameValueList( $NameValueList );
         // }
         // $newvar->setVariationSpecifics( $VariationSpecifics );
         // add VariationSpecifics (v3 - regard profile mapping)
         $VariationSpecifics = new NameValueListArrayType();
         foreach ($var['variation_attributes'] as $name => $value) {
             // check for matching attribute name - replace woo attribute name with eBay attribute name
             foreach ($specifics_map as $spec) {
                 if ($name == $spec['attribute']) {
                     $name = $spec['name'];
                 }
             }
             $NameValueList = new NameValueListType();
             $NameValueList->setName($name);
             $NameValueList->setValue($value);
             $VariationSpecifics->addNameValueList($NameValueList);
         }
         $newvar->setVariationSpecifics($VariationSpecifics);
         // optional Variation.DiscountPriceInfo.OriginalRetailPrice
         $post_id = $var['post_id'];
         $start_price = $newvar->StartPrice;
         if (intval($profile_details['strikethrough_pricing']) != 0) {
             // mode 1 - use sale price
             if (1 == $profile_details['strikethrough_pricing']) {
                 $original_price = ProductWrapper::getOriginalPrice($post_id);
                 if ($original_price && $start_price != $original_price) {
                     $newvar->DiscountPriceInfo = new DiscountPriceInfoType();
                     $newvar->DiscountPriceInfo->OriginalRetailPrice = new AmountType();
                     $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeValue($original_price);
                     $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeAttribute('currencyID', $profile_details['currency']);
                 }
             }
             // mode 2 - use MSRP
             if (2 == $profile_details['strikethrough_pricing']) {
                 $msrp_price = get_post_meta($post_id, '_msrp', true);
                 // variation
                 if ($msrp_price && $start_price != $msrp_price) {
                     $newvar->DiscountPriceInfo = new DiscountPriceInfoType();
                     $newvar->DiscountPriceInfo->OriginalRetailPrice = new AmountType();
                     $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeValue($msrp_price);
                     $newvar->DiscountPriceInfo->OriginalRetailPrice->setTypeAttribute('currencyID', $profile_details['currency']);
                 }
             }
         }
         // OriginalRetailPrice / STP
         // handle variation level Product ID (UPC/EAN)
         $autofill_missing_gtin = get_option('wplister_autofill_missing_gtin');
         $DoesNotApplyText = WPLE_eBaySite::getSiteObj($this->site_id)->DoesNotApplyText;
         $DoesNotApplyText = empty($DoesNotApplyText) ? 'Does not apply' : $DoesNotApplyText;
         // set UPC from SKU - if enabled
         if ($var['sku'] && $profile_details['use_sku_as_upc'] == '1') {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setUPC($var['sku']);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         } elseif ($product_upc = get_post_meta($post_id, '_ebay_upc', true)) {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setUPC($product_upc);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         } elseif ($autofill_missing_gtin == 'upc') {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setUPC($DoesNotApplyText);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         }
         // set EAN
         if ($product_ean = get_post_meta($post_id, '_ebay_ean', true)) {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setEAN($product_ean);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         } elseif ($autofill_missing_gtin == 'ean') {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setEAN($DoesNotApplyText);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         }
         // set ISBN
         if ($product_isbn = get_post_meta($post_id, '_ebay_isbn', true)) {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setISBN($product_isbn);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         } elseif ($autofill_missing_gtin == 'isbn') {
             $VariationProductListingDetails = new VariationProductListingDetailsType();
             $VariationProductListingDetails->setISBN($DoesNotApplyText);
             $newvar->setVariationProductListingDetails($VariationProductListingDetails);
         }
         // set MPN
         // Note: If Brand and MPN are being used to identify product variations in a multiple-variation listing,
         // the Brand must be specified at the item level (ItemSpecifics container)
         // and the MPN for each product variation must be specified at the variation level (VariationSpecifics container).
         // The Brand name must be the same for all variations within a single listing.
         if ($product_mpn = get_post_meta($post_id, '_ebay_mpn', true)) {
             $NameValueList = new NameValueListType();
             $NameValueList->setName('MPN');
             $NameValueList->setValue($product_mpn);
             $VariationSpecifics->addNameValueList($NameValueList);
             $newvar->setVariationSpecifics($VariationSpecifics);
             $collectedMPNs[] = $product_mpn;
         }
         $item->Variations->addVariation($newvar);
     }
     // each variation
     // build temporary array for VariationSpecificsSet
     $this->tmpVariationSpecificsSet = array();
     foreach ($variations as $var) {
         foreach ($var['variation_attributes'] as $name => $value) {
             // check for matching attribute name - replace woo attribute name with eBay attribute name
             foreach ($specifics_map as $spec) {
                 if ($name == $spec['attribute']) {
                     $this->variationAttributes[] = $name;
                     // remember original name to exclude in builtItemSpecifics()
                     $name = $spec['name'];
                 }
             }
             if (!is_array($this->tmpVariationSpecificsSet[$name])) {
                 $this->tmpVariationSpecificsSet[$name] = array();
             }
             if (!in_array($value, $this->tmpVariationSpecificsSet[$name], true)) {
                 $this->tmpVariationSpecificsSet[$name][] = $value;
             }
         }
     }
     // add collected MPNs to tmp array
     foreach ($collectedMPNs as $value) {
         $name = 'MPN';
         if (!is_array($this->tmpVariationSpecificsSet[$name])) {
             $this->tmpVariationSpecificsSet[$name] = array();
         }
         if (!in_array($value, $this->tmpVariationSpecificsSet[$name], true)) {
             $this->tmpVariationSpecificsSet[$name][] = $value;
         }
     }
     // build VariationSpecificsSet
     $VariationSpecificsSet = new NameValueListArrayType();
     foreach ($this->tmpVariationSpecificsSet as $name => $values) {
         $NameValueList = new NameValueListType();
         $NameValueList->setName($name);
         foreach ($values as $value) {
             $NameValueList->addValue($value);
         }
         $VariationSpecificsSet->addNameValueList($NameValueList);
     }
     $item->Variations->setVariationSpecificsSet($VariationSpecificsSet);
     // build array of variation attributes, which will be needed in builtItemSpecifics()
     // $this->variationAttributes = array();
     foreach ($this->tmpVariationSpecificsSet as $key => $value) {
         $this->variationAttributes[] = $key;
     }
     WPLE()->logger->debug('set variationAttributes: ' . print_r($this->variationAttributes, 1));
     // select *one* VariationSpecificsSet for Pictures set
     // currently the first one is selected automatically, but there will be preferences for this later
     $VariationValuesForPictures = reset($this->tmpVariationSpecificsSet);
     $VariationNameForPictures = key($this->tmpVariationSpecificsSet);
     // apply variation image attribute from profile - if set
     $variation_image_attribute = isset($profile_details['variation_image_attribute']) ? $profile_details['variation_image_attribute'] : false;
     if ($variation_image_attribute && isset($this->tmpVariationSpecificsSet[$variation_image_attribute])) {
         $VariationValuesForPictures = $this->tmpVariationSpecificsSet[$variation_image_attribute];
         $VariationNameForPictures = $variation_image_attribute;
     }
     // build Pictures
     $Pictures = new PicturesType();
     $Pictures->setVariationSpecificName($VariationNameForPictures);
     foreach ($variations as $var) {
         $VariationValue = $var['variation_attributes'][$VariationNameForPictures];
         if (in_array($VariationValue, $VariationValuesForPictures)) {
             $image_url = $this->encodeUrl($var['image']);
             // $image_url = $this->removeHttpsFromUrl( $image_url );
             if (!$image_url) {
                 continue;
             }
             WPLE()->logger->info("using variation image: " . $image_url);
             $VariationSpecificPictureSet = new VariationSpecificPictureSetType();
             $VariationSpecificPictureSet->setVariationSpecificValue($VariationValue);
             $VariationSpecificPictureSet->addPictureURL($image_url);
             // check for additional variation images (WooCommerce Additional Variation Images Addon)
             if (class_exists('WC_Additional_Variation_Images')) {
                 $additional_var_images = get_post_meta($var['post_id'], '_wc_additional_variation_images', true);
                 $additional_var_images = empty($additional_var_images) ? false : explode(',', $additional_var_images);
                 if (is_array($additional_var_images)) {
                     foreach ($additional_var_images as $attachment_id) {
                         // get URL from attachment ID
                         $size = get_option('wplister_default_image_size', 'full');
                         $large_image_url = wp_get_attachment_image_src($attachment_id, $size);
                         $image_url = $this->encodeUrl($large_image_url[0]);
                         WPLE()->logger->info("found additional variation image: " . $image_url);
                         // upload variation images if enabled
                         if ($with_additional_images) {
                             $image_url = $this->lm->uploadPictureToEPS($image_url, $id, $session);
                         }
                         // add variation image to picture set
                         $VariationSpecificPictureSet->addPictureURL($image_url);
                         WPLE()->logger->info("added additional variation image: " . $image_url);
                     }
                 }
             }
             // only list variation images if enabled
             if (@$profile_details['with_variation_images'] != '0') {
                 $Pictures->addVariationSpecificPictureSet($VariationSpecificPictureSet);
             }
             // remove value from VariationValuesForPictures to avoid duplicates
             unset($VariationValuesForPictures[array_search($VariationValue, $VariationValuesForPictures)]);
         }
     }
     $item->Variations->setPictures($Pictures);
     // ebay doesn't allow different weight and dimensions for varations
     // so for calculated shipping services we just fetch those from the first variation
     // and overwrite
     // $isCalc = $profile_details['shipping_service_type'] == 'calc' ? true : false;
     $service_type = $profile_details['shipping_service_type'];
     $isCalc = in_array($service_type, array('calc', 'FlatDomesticCalculatedInternational', 'CalculatedDomesticFlatInternational')) ? true : false;
     if ($isCalc) {
         // get weight and dimensions from first variation
         $first_variation = reset($variations);
         $weight_major = $first_variation['weight_major'];
         $weight_minor = $first_variation['weight_minor'];
         $dimensions = $first_variation['dimensions'];
         $item->ShippingDetails->CalculatedShippingRate->setWeightMajor(self::dbSafeFloatval($weight_major));
         $item->ShippingDetails->CalculatedShippingRate->setWeightMinor(self::dbSafeFloatval($weight_minor));
         if (trim(@$dimensions['width']) != '') {
             $item->ShippingDetails->CalculatedShippingRate->setPackageWidth($dimensions['width']);
         }
         if (trim(@$dimensions['length']) != '') {
             $item->ShippingDetails->CalculatedShippingRate->setPackageLength($dimensions['length']);
         }
         if (trim(@$dimensions['height']) != '') {
             $item->ShippingDetails->CalculatedShippingRate->setPackageDepth($dimensions['height']);
         }
         // update ShippingPackageDetails with weight and dimensions of first variations
         $shippingPackageDetails = new ShipPackageDetailsType();
         $shippingPackageDetails->setWeightMajor(self::dbSafeFloatval($weight_major));
         $shippingPackageDetails->setWeightMinor(self::dbSafeFloatval($weight_minor));
         if (trim(@$dimensions['width']) != '') {
             $shippingPackageDetails->setPackageWidth($dimensions['width']);
         }
         if (trim(@$dimensions['length']) != '') {
             $shippingPackageDetails->setPackageLength($dimensions['length']);
         }
         if (trim(@$dimensions['height']) != '') {
             $shippingPackageDetails->setPackageDepth($dimensions['height']);
         }
         $item->setShippingPackageDetails($shippingPackageDetails);
         // debug
         WPLE()->logger->info('first variations weight: ' . print_r($weight, 1));
         WPLE()->logger->info('first variations dimensions: ' . print_r($dimensions, 1));
     }
     // remove some settings from single item
     $item->SKU = null;
     $item->Quantity = null;
     $item->StartPrice = null;
     $item->BuyItNowPrice = null;
     return $item;
     /* this we should get:
     		<Variations>
     		    <Variation>
     		        <SKU />
     		        <StartPrice>15</StartPrice>
     		        <Quantity>1</Quantity>
     		        <VariationSpecifics>
     		            <NameValueList>
     		                <Name>Size</Name>
     		                <Value>large</Value>
     		            </NameValueList>
     		        </VariationSpecifics>
     		    </Variation>
     		    <Variation>
     		        <SKU />
     		        <StartPrice>10</StartPrice>
     		        <Quantity>1</Quantity>
     		        <VariationSpecifics>
     		            <NameValueList>
     		                <Name>Size</Name>
     		                <Value>small</Value>
     		            </NameValueList>
     		        </VariationSpecifics>
     		    </Variation>
     		    <Pictures>
     		        <VariationSpecificName>Size</VariationSpecificName>
     		        <VariationSpecificPictureSet>
     		            <VariationSpecificValue>large</VariationSpecificValue>
     		            <PictureURL>http://www.example.com/wp-content/uploads/2011/09/grateful-dead.jpg</PictureURL>
     		        </VariationSpecificPictureSet>
     		        <VariationSpecificPictureSet>
     		            <VariationSpecificValue>small</VariationSpecificValue>
     		            <PictureURL>www.example.com/wp-content/uploads/2011/09/grateful-dead.jpg</PictureURL>
     		        </VariationSpecificPictureSet>
     		    </Pictures>
     		    <VariationSpecificsSet>
     		        <NameValueList>
     		            <Name>Size</Name>
     		            <Value>large</Value>
     		            <Value>small</Value>
     		        </NameValueList>
     		    </VariationSpecificsSet>
     		</Variations>
     		*/
 }