werein/prestashop

View on GitHub
lib/prestashop/mapper/models/product.rb

Summary

Maintainability
B
4 hrs
Test Coverage
using Prestashop::Mapper::Refinement
module Prestashop
  module Mapper
    class Product < Model
      resource :products
      model    :product

      attr_accessor :id_manufacturer, :id_supplier, :id_category_default, :new, :cache_default_attribute, :id_tax_rules_group, :position_in_category,
                    :manufacturer_name, :quantity, :type, :id_shop_default, :supplier_reference, :location, :width, :height, :depth,
                    :weight, :quantity_discount, :ean13, :upc, :cache_is_pack, :cache_has_attachment, :is_virtual, :on_sale, :online_only, :ecotax, :minimal_quantity,
                    :price, :wholesale_price, :unity, :unit_price_ratio, :additional_shipping_cost, :customizable, :text_fields, :uploadable_files, :active,
                    :redirect_type, :id_product_redirect, :available_for_order, :available_date, :condition, :show_price, :indexed, :visibility, :advanced_stock_management, :description
      attr_accessor :id_lang, :id_categories, :id_features
      attr_writer   :id, :name, :description_short, :link_rewrite, :reference, :price, :available_now, :available_later, :meta_description, :meta_keywords, :meta_title

      def initialize args = {}
        @id                         = args[:id]
        @id_manufacturer            = args[:id_manufacturer]
        @id_supplier                = args.fetch(:id_supplier)
        @id_category_default        = args[:id_category_default]
        @new                        = args[:new]
        @cache_default_attribute    = args.fetch(:cache_default_attribute, 0)
        @id_tax_rules_group         = args[:id_tax_rules_group]
        @position_in_category       = args.fetch(:position_in_category, 0)
        @manufacturer_name          = args[:manufacturer_name]
        @quantity                   = args[:quantity]
        @type                       = args.fetch(:type, 'simple')
        @id_shop_default            = args.fetch(:id_shop_default, 1)
        @reference                  = args.fetch(:reference)
        @supplier_reference         = args[:supplier_reference]
        @location                   = args[:location]
        @width                      = args[:width]
        @height                     = args[:height]
        @depth                      = args[:depth]
        @weight                     = args[:weight]
        @quantity_discount          = args.fetch(:quantity_discount, 0)
        @ean13                      = args[:ean13]
        @upc                        = args[:upc]
        @cache_is_pack              = args.fetch(:cache_is_pack, 0)
        @cache_has_attachment       = args.fetch(:cache_has_attachment, 0)
        @is_virtual                 = args.fetch(:is_virtual, 0)
        @on_sale                    = args.fetch(:on_sale, 0)
        @online_only                = args.fetch(:online_only, 0)
        @ecotax                     = args.fetch(:ecotax, 0)
        @minimal_quantity           = args.fetch(:minimal_quantity, 1)
        @price                      = args[:price]
        @wholesale_price            = args[:wholesale_price]
        @unity                      = args[:unity]
        @unit_price_ratio           = args[:unit_price_ratio]
        @additional_shipping_cost   = args[:additional_shipping_cost]
        @customizable               = args[:customizable]
        @text_fields                = args[:text_fields]
        @uploadable_files           = args[:uploadable_files]
        @active                     = args[:active]
        @redirect_type              = args[:redirect_type]
        @id_product_redirect        = args[:id_product_redirect]
        @available_for_order        = args[:available_for_order]
        @available_date             = args.fetch(:available_date, Date.today.strftime("%F"))
        @condition                  = args.fetch(:condition, 'new')
        @show_price                 = args[:show_price]
        @indexed                    = 0
        @visibility                 = args.fetch(:visibility, 'both')
        @advanced_stock_management  = args[:advanced_stock_management]
        # date_add
        # date_upd
        @meta_description           = args[:meta_description]
        @meta_keywords              = args[:meta_keywords]
        @meta_title                 = args[:meta_title]
        @link_rewrite               = args[:link_rewrite]
        @name                       = args.fetch(:name)
        @description                = args[:description]
        @description_short          = args[:description_short]
        @available_now              = args[:available_now]
        @available_later            = args[:available_later]

        @id_lang                    = args.fetch(:id_lang)
        @id_categories              = args[:id_categories]
        @id_features                = args[:id_features]
      end

      def name
        @name.plain.truncate(125)
      end

      def description_short
        @description_short ? @description_short.restricted.truncate(252) : (description.truncate(252) if description)
      end

      def link_rewrite
        @link_rewrite ? @link_rewrite.parameterize : name.parameterize
      end

      def reference
        if @reference and not @reference.to_s.empty?
          @reference.to_s.length > 32 ? Digest::MD5.hexdigest(@reference) : @reference
        else
          Digest::MD5.hexdigest(name)
        end
      end

      def available_now
        @available_now.plain.truncate(125)
      end

      def available_later
        @available_later.plain.truncate(125)
      end

      def hash
        product = {
          id_supplier:          id_supplier,
          id_manufacturer:      id_manufacturer,
          id_category_default:  id_category_default,
          id_shop_default:      id_shop_default,
          id_tax_rules_group:   id_tax_rules_group,
          on_sale:              on_sale,
          online_only:          online_only,
          ean13:                ean13,
          upc:                  upc,
          ecotax:               ecotax,
          minimal_quantity:     minimal_quantity,
          price:                price,
          wholesale_price:      wholesale_price,
          reference:            reference,
          active:               active,
          redirect_type:        '404',
          available_for_order:  available_for_order,
          condition:            condition,
          show_price:           show_price,
          name:                 hash_lang(name, id_lang),
          description:          hash_lang(description, id_lang),
          description_short:    hash_lang(description_short, id_lang),
          link_rewrite:         hash_lang(link_rewrite, id_lang),
          meta_title:           hash_lang(meta_title, id_lang),
          meta_description:     hash_lang(meta_description, id_lang),
          meta_keywords:        hash_lang(meta_keywords, id_lang),
          available_now:        hash_lang(available_now, id_lang),
          available_later:      hash_lang(available_later, id_lang),
          associations: {} }
        unless id_categories_all.empty?
          product[:associations][:categories] = {}
          product[:associations][:categories][:category] = hash_ids(id_categories_all)
        end
        if features_hash
          product[:associations][:product_features] = {}
          product[:associations][:product_features][:product_feature] = features_hash
        end
        product
      end

      # Find product by +reference+ and +id_supplier+, returns +id+
      def id
        @id ||= self.class.find_by 'filter[reference]' => reference, 'filter[id_supplier]' => id_supplier
      end
      alias :find? :id

      # Update product with given options
      def update options = {}
        self.class.update(id, options)
      end

      # Generate hash of single feature
      def feature_hash id_feature, id_feature_value
        { id: id_feature, id_feature_value: id_feature_value } if id_feature and id_feature_value
      end

      # Generate hash of features
      def features_hash
        id_features.map{|f| feature_hash(f[:id_feature], f[:id_feature_value])} if id_features
      end

      def id_categories_all
        [id_category_default, id_categories].flatten.uniq
      end

      class << self
        def fixed_hash id
          product = find id
          product.delete(:position_in_category)
          product.delete(:manufacturer_name)
          product.delete(:quantity)
          product.delete(:type)
          product.delete(:associations)
          product.delete(:id_default_image)
          product
        end

        def deactivate id_supplier
          first = (Date.today-365).strftime("%F")
          last = (Date.today-1).strftime("%F")
          products = where 'filter[date_upd]' => "[#{first},#{last}]", date: 1, 'filter[id_supplier]' => id_supplier, 'filter[active]' => 1, limit: 1000
          if products and !products.empty?
            products.map{|p| update(p, active: 0)}
          end
        end
      end
    end
  end
end