/**
* Generates variations based on selected attributes.
*
* @param ProductAttributeType $attributetype
* @param array $values
*/
public function generateVariationsFromAttributes(ProductAttributeType $attributetype, array $values)
{
//TODO: introduce transactions here, in case objects get half made etc
//if product has variation attribute types
if (is_array($values)) {
//TODO: get values dataobject set
$avalues = $attributetype->convertArrayToValues($values);
$existingvariations = $this->owner->Variations();
if ($existingvariations->exists()) {
//delete old variation, and create new ones - to prevent modification of exising variations
foreach ($existingvariations as $oldvariation) {
$oldvalues = $oldvariation->AttributeValues();
foreach ($avalues as $value) {
$newvariation = $oldvariation->duplicate();
$newvariation->InternalItemID = $this->owner->InternalItemID . '-' . $newvariation->ID;
$newvariation->AttributeValues()->addMany($oldvalues);
$newvariation->AttributeValues()->add($value);
$newvariation->write();
$existingvariations->add($newvariation);
}
$existingvariations->remove($oldvariation);
$oldvariation->AttributeValues()->removeAll();
$oldvariation->delete();
$oldvariation->destroy();
//TODO: check that old variations actually stick around, as they will be needed for past orders etc
}
} else {
foreach ($avalues as $value) {
$variation = new ProductVariation();
$variation->ProductID = $this->owner->ID;
$variation->Price = $this->owner->BasePrice;
$variation->write();
$variation->InternalItemID = $this->owner->InternalItemID . '-' . $variation->ID;
$variation->AttributeValues()->add($value);
//TODO: find or create actual value
$variation->write();
$existingvariations->add($variation);
}
}
}
}