/**
  * Sets the variant details
  */
 protected function setVariants()
 {
     // No variants
     if (is_null($this->ItemBase->AttributeValueSets)) {
         return;
     }
     // Internal number cache
     $numbersUsed = array();
     $detailBase = $this->details + $this->data;
     unset($detailBase['id']);
     unset($detailBase['attribute']);
     /** @var PlentySoapObject_ItemAttributeValueSet $AttributeValueSet */
     foreach ($this->ItemBase->AttributeValueSets->item as $AttributeValueSet) {
         // Copy the base details
         $details = $detailBase;
         // SKU
         $sku = sprintf('%s-%s-%s', $this->ItemBase->ItemID, $AttributeValueSet->PriceID, $AttributeValueSet->AttributeValueSetID);
         // Strip whitespaces
         $number = trim($AttributeValueSet->ColliNo);
         try {
             // Set the details id
             $details['id'] = PlentymarketsMappingController::getItemVariantByPlentyID($sku);
             if (PlentymarketsConfig::getInstance()->getItemNumberImportActionID(IMPORT_ITEM_NUMBER) == IMPORT_ITEM_NUMBER) {
                 // If this number does not belong to this item
                 if (!PlentymarketsImportItemHelper::isNumberExistantVariant($number, $details['id'])) {
                     // and check if the number is valid
                     if (!PlentymarketsImportItemHelper::isNumberValid($number)) {
                         throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is invalid', 3110);
                     }
                     // check if the number is available anyway
                     if (PlentymarketsImportItemHelper::isNumberExistant($number)) {
                         throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is already in use', 3111);
                     }
                     // check if the number is in the internal cache
                     if (isset($numbersUsed[$number])) {
                         throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« would be assigned twice', 3112);
                     }
                     // Use this number
                     $details['number'] = $number;
                     // Cache the number
                     $numbersUsed[$number] = true;
                 }
             }
         } catch (PlentymarketsMappingExceptionNotExistant $e) {
             // Numbers should be synced
             if (PlentymarketsConfig::getInstance()->getItemNumberImportActionID(IMPORT_ITEM_NUMBER) == IMPORT_ITEM_NUMBER) {
                 // Nummer ist ungültig oder in Benutzung
                 if (!PlentymarketsImportItemHelper::isNumberValid($number)) {
                     throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is invalid', 3110);
                 }
                 // check if the number is available
                 if (PlentymarketsImportItemHelper::isNumberExistant($number)) {
                     throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is already in use', 3111);
                 }
                 // check if the number is in the internal cache
                 if (isset($numbersUsed[$number])) {
                     throw new PlentymarketsImportItemNumberException('The item variation number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« would be assigned twice', 3112);
                 }
                 // Use this number
                 $details['number'] = $number;
                 // Cache the number
                 $numbersUsed[$number] = true;
             } else {
                 // A new number is generated
                 $details['number'] = PlentymarketsImportItemHelper::getItemNumber();
             }
         }
         $shippingTime = PlentymarketsUtils::getShippingTimeByAvailabilityId($AttributeValueSet->Availability);
         if ($shippingTime) {
             $details['shippingtime'] = $shippingTime;
         }
         $details['additionaltext'] = $AttributeValueSet->AttributeValueSetName;
         $details['ean'] = $AttributeValueSet->EAN;
         $details['X_plentySku'] = $sku;
         $this->variants[$AttributeValueSet->AttributeValueSetID] = $details;
     }
 }