DefaultVariantBehavior.php 2.02 KB
<?php
namespace common\behaviors;

use yii\base\Behavior;
use common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;
use common\modules\product\models\ProductUnit;
use common\modules\product\models\ProductStock;
use common\modules\product\models\Stock;

/**
 * Class DefaultVariantBehavior
 * @package common/behaviors
 * @property Product $owner
 * @see ProductVariant
 */
class DefaultVariantBehavior extends Behavior
{

    /**
     * Catches product's insert event
     *
     * @return array
     */
    public function events()
    {
        return [
            Product::EVENT_AFTER_INSERT => 'addDefaultVariant',
            ];
    }

    /**
     * Creates new default product's variant and sets it's to stock
     * marked as default and sets to it unit also marked as default
     */
    public function addDefaultVariant()
    {
        /**
         * @var Stock $stock
         * @var ProductUnit $defaultUnit
         */
        $defaultVariant = new ProductVariant();
        $defaultVariant->product_id = $this->owner->product_id;

        /**
         * Gets default unit for variant
         */
        $defaultUnit = ProductUnit::find()
            ->where([
                'is_default' => true,
            ])->one();
        $defaultVariant->product_unit_id = $defaultUnit->product_unit_id;
        $defaultVariant->stock = 1;
        $defaultVariant->name = 'default';
        $defaultVariant->sku = 'default';
        $defaultVariant->save();

        /**
         * Gets default stock
         */
        $stock = Stock::find()
            ->where([
                'is_default' => true,
            ])->one();

        /**
         * Add a new stock record
         */
        $defaultStock = new ProductStock();
        $defaultStock->product_id = $this->owner->product_id;
        $defaultStock->stock_id = $stock->stock_id;
        $defaultStock->quantity = $defaultVariant->stock;
        $defaultStock->product_variant_id = $defaultVariant->product_variant_id;
        $defaultStock->save();

    }

}