139 lines
4.2 KiB
Ruby
139 lines
4.2 KiB
Ruby
class Item < ActiveRecord::Base
|
|
|
|
CSV_COL = {
|
|
:code => 0,
|
|
:input_price => 1,
|
|
:list_price => 2,
|
|
:decoration => 3
|
|
}
|
|
|
|
belongs_to :unit
|
|
has_many :multi_media_descriptions
|
|
belongs_to :sub_category
|
|
belongs_to :supplier
|
|
belongs_to :brand
|
|
belongs_to :delivery_time_estimation
|
|
|
|
|
|
validates_presence_of :name, :description, :list_price, :current_input_price, :tags, :unit_id, :code, :sub_category_id, :weight, :supplier_id
|
|
validate :we_must_earn_money
|
|
|
|
def self.items_to_order
|
|
items_raw = Item.find_by_sql(%Q{
|
|
select s.id as supplier_id, i.code as code, i.name as name, sum(iic.count) amount, i.current_input_price
|
|
from carts c
|
|
left join item_in_carts iic on iic.cart_id = c.id
|
|
left join items i on i.id = iic.item_id
|
|
left join suppliers s on i.supplier_id = s.id
|
|
where c.confirmed and not (c.packed or c.delivered)
|
|
group by s.id, i.name, i.code, i.current_input_price
|
|
order by s.name, amount desc;
|
|
})
|
|
|
|
items_sorted = {}
|
|
suppliers_sorted = {}
|
|
|
|
items_raw.each do |item|
|
|
items_sorted[item.supplier_id] ||= []
|
|
suppliers_sorted[item.supplier_id] ||= item.supplier
|
|
items_sorted[item.supplier_id] << item
|
|
end
|
|
|
|
report_items = []
|
|
|
|
complete_sum = 0
|
|
|
|
suppliers_sorted.each_pair do |key, value|
|
|
|
|
rep_sec = OpenStruct.new # report section
|
|
rep_sec.supplier = value
|
|
rep_sec.items = items_sorted[key]
|
|
rep_sec.sum_amount = rep_sec.items.reduce(0) do |sum, item|
|
|
sum + (item.current_input_price * item.amount)
|
|
end
|
|
complete_sum += rep_sec.sum_amount
|
|
|
|
report_items << rep_sec
|
|
end
|
|
|
|
full_report = OpenStruct.new
|
|
full_report.sections = report_items
|
|
full_report.full_sum = complete_sum
|
|
|
|
return full_report
|
|
end
|
|
|
|
|
|
def self.orders_to_confirm
|
|
items_raw = Item.find_by_sql(%Q{
|
|
select dd.*, c.id as order_id,i.code as code, i.name as item, iic.count as amount , i.list_price, iic.count * i.list_price as sum_price
|
|
from carts c
|
|
left join delivery_destinations dd on c.delivery_destination_id = dd.id
|
|
left join item_in_carts iic on iic.cart_id = c.id
|
|
left join items i on i.id = iic.item_id
|
|
|
|
where c.ordered and not(c.canceled_on_check or c.canceled_on_delivery or c.confirmed or c.packed or c.delivered)
|
|
order by
|
|
c.created_at, iic.created_at;
|
|
})
|
|
|
|
items_sorted = {}
|
|
|
|
items_raw.each do |item|
|
|
items_sorted[item.phone] ||= []
|
|
items_sorted[item.phone] << item
|
|
end
|
|
|
|
sections = []
|
|
complete_sum = 0
|
|
|
|
items_sorted.each_pair do |key,values|
|
|
section = OpenStruct.new
|
|
section.delivery_destination = values.first
|
|
section.sum_amount = 0
|
|
section.items = []
|
|
values.each do |item|
|
|
section.sum_amount += item.sum_price
|
|
complete_sum += item.sum_price
|
|
section.items << item
|
|
end
|
|
sections << section
|
|
end
|
|
full_report = OpenStruct.new
|
|
full_report.sections = sections
|
|
full_report.full_sum = complete_sum
|
|
|
|
return full_report
|
|
end
|
|
|
|
def self.update_prices(path)
|
|
nonexistent_codes = []
|
|
|
|
Item.transaction do
|
|
CSV.foreach(path) do |row|
|
|
code = row[CSV_COL[:code]].strip
|
|
item = Item.find_by_code(code)
|
|
if item.nil?
|
|
nonexistent_codes << code
|
|
else
|
|
item.current_input_price = row[CSV_COL[:input_price]]
|
|
item.list_price = row[CSV_COL[:list_price]]
|
|
item.decoration = row[CSV_COL[:decoration]]
|
|
item.save!
|
|
end
|
|
end
|
|
end
|
|
puts "Nonexistent codes: "
|
|
puts "#{nonexistent_codes.join("\n")}"
|
|
end
|
|
|
|
def we_must_earn_money
|
|
if list_price.to_f <= current_input_price.to_f
|
|
errors[:list_price] << "#{code} Ulazna cijena veca od izlazne"
|
|
puts "#{code} Ulazna cijena veca od izlazne"
|
|
end
|
|
end
|
|
|
|
|
|
end
|