OSDN Git Service

CSV処理がテストに通るよう修正
[elecoma/elecoma.git] / app / models / order.rb
1 # -*- coding: utf-8 -*-
2 class Order < ActiveRecord::Base
3   acts_as_paranoid
4   belongs_to :customer
5   belongs_to :retailer
6   has_many :order_deliveries
7
8   def subtotal
9     sum_deliveries :subtotal
10   end
11
12   def total
13     sum_deliveries :total
14   end
15
16   def payment_total
17     sum_deliveries :payment_total
18   end
19
20   def proceeds
21     sum_deliveries :proceeds
22   end
23
24   def self.find_sum conditions=''
25     OrderDelivery.find_sum conditions
26   end
27
28   def after_create
29     generate_code
30   end
31
32   def self.get_conditions(search, params)
33     search_list = []
34     search && search.each do |k, v|
35       if (k =~ /^order_code/)
36         search[k.sub(pattern, 'orders.code')] = v
37       end
38     end
39     sex = params[:sex] || []
40     payment_id = params[:payment_id] || []
41
42     if search
43       unless search.customer_name.blank?
44         search_list << [MergeAdapterUtil.concat("order_deliveries.family_name", "order_deliveries.first_name") + " like ?", "%#{search.customer_name}%"]
45       end
46       unless search.customer_name_kana.blank?
47         search_list << [MergeAdapterUtil.concat("order_deliveries.family_name_kana", "order_deliveries.first_name_kana") + " like ?", "%#{search.customer_name_kana}%"]
48       end
49       unless search.order_code_from.blank?
50         search_list << ["orders.code >= ?", search.order_code_from]
51       end
52       unless search.order_code_to.blank?
53         search_list << ["orders.code <= ?", search.order_code_to ]
54       end
55       unless search.status.blank?
56         search_list << ["order_deliveries.status = ? ", search.status.to_i]
57       end
58       unless search.email.blank?
59         search_list << ["order_deliveries.email like ?", "%#{search.email}%"]
60       end
61       unless search.tel.blank?
62         search_list << [MergeAdapterUtil.concat("order_deliveries.tel01", "order_deliveries.tel02", "order_deliveries.tel03") + " like ?", "%#{search.tel}%"]
63       end
64       unless search.search_birth_from.blank?
65         search_list << ["order_deliveries.birthday >= ?", search.search_birth_from]
66       end
67
68       unless search.search_birth_to.blank?
69         search_list << ["order_deliveries.birthday < ?", search.search_birth_to + 1 * 60 * 60 * 24 ]
70       end
71       unless search.search_updated_at_from.blank?
72         search_list << ["order_deliveries.created_at >= ?", search.search_updated_at_from]
73       end
74       unless search.search_updated_at_to.blank?
75         search_list << ["order_deliveries.created_at < ?", search.search_updated_at_to + 1 * 60 * 60 * 24 ]
76       end
77       unless search.search_updated_at_from.blank?
78         search_list << ["order_deliveries.updated_at >= ?", search.search_updated_at_from]
79       end
80       unless search.search_updated_at_to.blank?
81         search_list << ["order_deliveries.updated_at < ?", search.search_updated_at_to + 1 * 60 * 60 * 24 ]
82       end
83       unless search.total_from.blank?
84         if search.total_from.to_s =~ /^\d*$/
85           search_list << ["order_deliveries.total >= ?", search.total_from]
86         else
87           search.errors.add "購入金額は数字で入力してください。", ""
88         end
89       end
90       unless search.total_to.blank?
91         if search.total_to.to_s =~ /^\d*$/
92           search_list << ["order_deliveries.total <= ?", search.total_to]
93         else
94           search.errors.add "購入金額は数字で入力してください。", ""
95         end
96       end
97       unless search.product_code.blank?
98         search_list << ["order_details.product_code like ? ", "%#{search.product_code}%"]
99       end
100       unless search.shipped_at_from.blank?
101         search_list << ["order_deliveries.shipped_at >= ?", search.shipped_at_from]
102       end
103       unless search.shipped_at_to.blank?
104         search_list << ["order_deliveries.shipped_at < ?", search.shipped_at_to + 1 * 60 * 60 * 24 ]
105       end
106       unless search.retailer_id.blank?
107         search_list << ["orders.retailer_id = ? ", search.retailer_id]
108       end
109     end
110     search_list << ['order_deliveries.sex in (?)', sex] unless sex.empty?
111     search_list << ['order_deliveries.payment_id in (?)', payment_id] unless payment_id.empty?
112     [search, search_list, sex, payment_id]
113   end
114
115   def self.csv(search_list)
116     columns = OrderDelivery.csv_columns_name
117     order_deliveries = OrderDelivery.find(:all,
118                          :conditions => flatten_conditions(search_list),
119                          :include => OrderDelivery::DEFAULT_INCLUDE,
120                          :order => "order_deliveries.id desc")
121     str = CSV.generate("") do | writer |
122       writer<< columns.map{|name| OrderDelivery.set_field_names[name]}
123       order_deliveries and order_deliveries.each do | od |
124         writer << columns.map do | column |
125           if ![:order_code,:prefecture_name,:occupation_name,:sex_name,:payment_name,:deliv_pref_name,:delivery_trader_name,:delivery_time_name,:status_view,:ticket_code].include?(column) && OrderDelivery.columns_hash[column.to_s].type == :datetime
126             (od[column] + (60*60*9)).strftime("%Y-%m-%d %H:%M") if od[column]
127           else
128             od[column] || od.send(column)
129           end
130         end
131       end
132     end
133     filename = "order_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv"
134     [str, filename]
135   end
136
137   private
138
139   def generate_code
140     id_code = ("%04d" % self.id).slice(-4..-1) # レコード ID の下 4 桁
141     self.code = created_at.strftime("%Y%m%d%H%M") + id_code
142     self.save_without_validation
143   end
144
145   def sum_deliveries message
146     order_deliveries.map(&message).map(&:to_i).sum
147   end
148
149 end