module Skr

    class PoLine < Skr::Model

        acts_as_uom
        is_sku_loc_line parent: 'purchase_order'

        belongs_to :purchase_order, :inverse_of=>:lines
        belongs_to :sku_loc,    export: true
        belongs_to :sku_vendor, export: true

        has_one :sku, :through => :sku_loc, export: true

        has_many :receipts, class_name: 'Skr::PorLine',
                 :inverse_of=>:po_line, listen: { create: :update_qty_received! }

        validates :purchase_order, :sku_loc,  set: true
        validates :description,    :sku_code, presence: true
        validates :qty, :price,    numericality: true, allow_nil: false

        locked_fields :qty, :qty_received

        scope :incomplete, ->{ where('qty - qty_received - qty_canceled != 0' ) }

        before_validation :set_defaults, :on=>:create

        def qty_unreceived
            qty - qty_received - qty_canceled
        end

        def complete?
            qty_unreceived.zero?
        end

        def update_qty_received!( receipt=nil )
            unlock_fields :qty_received do
                self.qty_received = receipts.sum(:qty)
                self.save( :validate => false )
                if self.complete?
                    self.purchase_order.set_maybe_completed!
                end
            end
        end

        private

        def set_defaults
            if sku_loc && sku_vendor.nil?
                self.sku_vendor = sku_loc.sku.sku_vendors.for_vendor( purchase_order.vendor )
            elsif sku_vendor && sku_loc.nil?
                self.sku_loc = sku_vendor.sku.sku_locs.find_or_create_for( purchase_order.location )
            end
            if sku_loc
                self.sku_code    ||= sku_loc.sku.code
                self.description ||= sku_loc.sku.description
            end
            if sku_vendor
                self.part_code  ||= sku_vendor.part_code
                self.price      ||= sku_vendor.cost
                self.uom_code   ||= sku_vendor.uom_code
                self.uom_size   ||= sku_vendor.uom_size
            end
            true
        end


    end

end # Skr module