DemacMedia/Magento-Multi-Location-Inventory

View on GitHub
app/code/community/Demac/MultiLocationInventory/Model/Stock/Api.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

/**
 * Class Demac_MultiLocationInventory_Model_Stock_Api
 */
class Demac_MultiLocationInventory_Model_Stock_Api extends Mage_Catalog_Model_Api_Resource
{

    /**
     * Create stock item.
     *
     * @param $data
     *
     * @return mixed
     */
    public function create($data)
    {
        try {
            $data = (array) $data;

            $product = $this->_getProduct($data['product_id']);

            if(!$product->getId()) {
                $this->_fault('not_exists');
            }

            if($product->getTypeId() != Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
                $this->_fault('data_invalid', 'Invalid Product Type: Only Simple Allowed');
            }

            $stockData = array();

            $stockData['location_id'] = $data['location_id'];
            $stockData['product_id']  = $data['product_id'];

            $fieldArray = array(
                'qty', 'is_in_stock', 'manage_stock', 'use_config_manage_stock', 'use_config_backorders', 'backorders'
            );

            foreach ($fieldArray as $field) {
                if(isset($data[$field])) {
                    $stockItem[$field] = $data[$field];
                }
            }

            $stockItem = Mage::getModel('demac_multilocationinventory/stock')
                ->addData($stockData)
                ->save();
            $id        = $stockItem->getId();
            $stockItem->clearInstance();


        } catch (Exception $e) {
            $this->_fault('data_invalid', $e->getMessage());
        }

        return $id;
    }

    /**
     * Bulk create stock items.
     *
     * @param $productData
     *
     * @return bool
     */
    public function multiCreate($productData)
    {

        $productData = (array) $productData;

        foreach ($productData as $data) {
            $this->create($data);
        }

        return true;
    }

    /**
     * Get info on stock item(s)
     *
     * @param $ids
     *
     * @return array
     */
    public function info($ids)
    {
        $ids       = (array) $ids;
        $stockItem = Mage::getModel('demac_multilocationinventory/stock')->loadByProduct($ids['location_id'], $ids['product_id']);

        if(!$stockItem->getId()) {
            $this->_fault('not_exists');
            // No item found
        }

        return $stockItem->toArray();
        // We can use only simple PHP data types in webservices.
    }

    /**
     * Get items within a certain criteria
     *
     * @param $locationId
     * @param $filters
     *
     * @return array
     */
    public function items($locationId, $filters)
    {
        $collection = Mage::getResourceModel('demac_multilocationinventory/stock_collection');
        if(isset($locationId) && !is_null($locationId)) {
            $collection->addFieldToFilter('location_id', $locationId);
        }
        $collection->addProductData();

        if(is_array($filters)) {
            try {
                foreach ($filters as $field => $value) {
                    $collection->addFieldToFilter($field, $value);
                }
            } catch (Mage_Core_Exception $e) {
                $this->_fault('filters_invalid', $e->getMessage());
                // If we are adding filter on non-existent attribute
            }
        }

        $result = $this->getResults($collection);

        return $result;
    }

    /**
     * Update stock item
     *
     * @param $data
     *
     * @return mixed
     */
    public function update($data)
    {
        try {
            $data = (array) $data;

            $stockItem = Mage::getModel('demac_multilocationinventory/stock')->loadByProduct($data['location_id'], $data['product_id']);

            if(!$stockItem->getId()) {
                return $this->create($data);
                // No item found
            }

            $fieldArray = array(
                'qty', 'is_in_stock', 'manage_stock', 'use_config_manage_stock', 'use_config_backorders', 'backorders'
            );

            $stockData = array();

            foreach ($fieldArray as $field) {
                if(isset($data[$field])) {
                    $stockItem[$field] = $data[$field];
                }
            }

            $stockItem->addData($stockData)
                ->save();
            $id = $stockItem->getId();
            $stockItem->clearInstance();

        } catch (Exception $e) {
            $this->_fault('data_invalid', $e->getMessage());
        }

        return $id;
    }

    /**
     * Update multiple stock items.
     *
     * @param $stockDataArray
     *
     * @return bool
     */
    public function multiUpdate($stockDataArray)
    {

        $stockDataArray = (array) $stockDataArray;

        foreach ($stockDataArray as $stockData) {
            $this->update($stockData);
        }

        return true;
    }

    /**
     * Remove stock item
     *
     * @param $ids
     *
     * @return bool
     */
    public function remove($ids)
    {
        $ids       = (array) $ids;
        $stockItem = Mage::getModel('demac_multilocationinventory/stock')->loadByProduct($ids['location_id'], $ids['product_id']);

        if(!$stockItem->getId()) {
            $this->_fault('not_exists');
            // No item found
        }

        try {
            $stockItem->delete();
        } catch (Mage_Core_Exception $e) {
            $this->_fault('not_deleted', $e->getMessage());
            // Some errors while deleting.
        }

        return true;
    }

    /**
     * Remove multiple stock items
     *
     * @param $idArray
     *
     * @return bool
     */
    public function multiRemove($idArray)
    {

        $idArray = (array) $idArray;

        foreach ($idArray as $ids) {
            $this->remove($ids);
        }

        return true;
    }

    /**
     * Get stock item collection as array.
     *
     * @param Demac_MultiLocationInventory_Model_Resource_Stock_Collection $collection
     *
     * @return array
     */
    public function getResults($collection)
    {
        $result = array();
        foreach ($collection as $stockItem) {
            $result[] = $stockItem->toArray();
        }

        return $result;
    }

}