Sha256: 57568c55e9719f26aa980e43212e9dd687a5462e3334a50177ca6129712a5a34

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

module Stockman
  module Logic
    class Summary
      attr_reader :data

      def self.from_hash(hash)
        data = transform_values(hash, &Utils.method(:deserialize_amount))

        new(data)
      end

      def self.from_object(object)
        data = {
          physical_amount: object.total_physical_amount,
          allocated_amount: object.total_allocated_amount,
          available_amount: object.total_available_amount,

          warehouses: object.stock_levels.inject({}) do |memo, stock_level|
            memo.merge(
              stock_level.warehouse_id => {
                physical_amount: stock_level.physical_amount,
                allocated_amount: stock_level.allocated_amount,
                available_amount: stock_level.available_amount
              }
            )
          end
        }

        new(data)
      end

      def initialize(data)
        @data = data
      end

      def total_physical_amount
        data[:physical_amount]
      end

      def total_allocated_amount
        data[:allocated_amount]
      end

      def total_available_amount
        data[:available_amount]
      end

      def warehouses
        data[:warehouses]
      end

      def to_hash
        self.class.transform_values(data, &Utils.method(:serialize_amount))
      end

      def to_json(_ = nil)
        JSON.generate(to_hash)
      end

      private

      def self.transform_values(hash, &block)
        method = lambda do |memo, data|
          memo.merge data[0] => yield(data[1])
        end

        totals = hash.symbolize_keys.slice(:physical_amount, :allocated_amount, :available_amount)
          .inject({}, &method)

        warehouses = hash.symbolize_keys[:warehouses].inject({}) do |memo, data|
          memo.merge data[0].to_i => data[1].inject({}, &method).symbolize_keys
        end

        totals.merge(warehouses: warehouses)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
stockman-logic-0.1.1 lib/stockman/logic/summary.rb
stockman-logic-0.1.0 lib/stockman/logic/summary.rb