/**
  * @todo use delta/absolute price
  * @param shopProduct $product
  * @param array $selected
  * @param array $data
  * @return array
  */
 private function generateSku(shopProduct $product, $selected, &$data)
 {
     $skus = $product->skus;
     if (empty($skus)) {
         $skus = array();
     }
     #build features map for exists SKUs
     $sku_map = array();
     $product_features_model = new shopProductFeaturesModel();
     foreach ($z = $product_features_model->getSkuFeatures($product->id) as $sku_id => $f) {
         $key = "";
         foreach ($f as $feature_id => $value_id) {
             $key .= $feature_id . ":" . $value_id . ";";
         }
         $sku_map[$key] = $sku_id;
     }
     $map = array();
     foreach ($data as $code => $d) {
         $map[$d['feature_id']] = $code;
     }
     $default_sku = array('sku' => '', 'virtual' => 1, 'available' => 1, 'count' => null);
     $i = 0;
     foreach ($this->arrayCartesian($selected) as $features) {
         $sku = array('name' => array(), 'features' => array(), 'price' => $product->base_price_selectable, 'compare_price' => $product->compare_price_selectable, 'purchase_price' => $product->purchase_price_selectable);
         $sku_key = "";
         $last_value_id = end($features);
         foreach ($features as $feature_id => $value_id) {
             $code = $map[$feature_id];
             $value = $data[$code]['values'][$value_id];
             $sku['features'][$code] = $value;
             $sku['name'][] = ifset($value['value'], $value['id']);
             #correct price
             if (isset($data[$feature_id]['values'][$value_id]['price'])) {
                 self::parseSkuPrice($sku, $data[$feature_id]['values'][$value_id]['price']);
             }
             #set counts per stock
             if (isset($data[$feature_id]['stock'])) {
                 self::parseSkuStock($sku, $data[$feature_id]['stock'], $value_id == $last_value_id ? count($f) : null);
             }
             $sku_key .= $feature_id . ":" . $value_id . ";";
             $sku['key'] = $sku_key;
         }
         #concat name from feature values
         $sku['name'] = implode(', ', $sku['name']);
         if (isset($sku_map[$sku_key])) {
             // already exists
             $sku_id = $sku_map[$sku_key];
             if (!empty($skus[$sku_id]['virtual'])) {
                 //update SKU if still virtual
                 $skus[$sku_id] = array_merge($skus[$sku_id], $sku);
             }
             $sku_map[$sku_key] = false;
         } else {
             # get free sku_id
             do {
                 --$i;
             } while (isset($skus[$i]));
             $skus[$i] = array_merge($default_sku, $sku);
         }
     }
     if ($product->id) {
         // remove old virtual skus
         $sku_map = array_filter($sku_map);
         foreach ($sku_map as $key => $sku_id) {
             if (isset($skus[$sku_id])) {
                 if (empty($skus[$sku_id]['virtual'])) {
                     unset($sku_map[$key]);
                 } else {
                     unset($skus[$sku_id]);
                 }
             }
         }
         if ($sku_map && false) {
             $product_skus_model = new shopProductSkusModel();
             $product_skus_model->deleteJoin('shop_product_features', $product->id, array('virtual' => 1, 'id' => $sku_map));
             $product_skus_model->deleteByField(array('product_id' => $product->id, 'virtual' => 1, 'id' => $sku_map));
         }
     }
     $product->skus = $skus;
     return $sku_map;
 }