vyapari 0.1.5dev10 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/vyapari/admin/base_controller.rb +0 -9
  3. data/app/controllers/vyapari/admin/countries_controller.rb +2 -2
  4. data/app/controllers/vyapari/admin/dashboard_controller.rb +1 -3
  5. data/app/controllers/vyapari/admin/exchange_rates_controller.rb +2 -2
  6. data/app/controllers/vyapari/admin/regions_controller.rb +1 -1
  7. data/app/controllers/vyapari/admin/resource_controller.rb +0 -1
  8. data/app/controllers/vyapari/admin/users_controller.rb +130 -0
  9. data/app/controllers/vyapari/application_controller.rb +0 -11
  10. data/app/models/brand.rb +19 -67
  11. data/app/models/category.rb +19 -63
  12. data/app/models/country.rb +7 -31
  13. data/app/models/exchange_rate.rb +7 -32
  14. data/app/models/product.rb +20 -75
  15. data/app/models/region.rb +20 -37
  16. data/app/models/vyapari/application_record.rb +0 -3
  17. data/app/views/layouts/kuppayam/_footer.html.erb +1 -1
  18. data/app/views/layouts/kuppayam/_sidebar.html.erb +44 -45
  19. data/app/views/vyapari/admin/countries/_index.html.erb +1 -1
  20. data/app/views/vyapari/admin/countries/index.html.erb +3 -19
  21. data/app/views/vyapari/admin/exchange_rates/_form.html.erb +4 -3
  22. data/app/views/vyapari/admin/exchange_rates/_index.html.erb +7 -7
  23. data/app/views/vyapari/admin/exchange_rates/_row.html.erb +3 -3
  24. data/app/views/vyapari/admin/exchange_rates/_show.html.erb +0 -1
  25. data/app/views/vyapari/admin/exchange_rates/index.html.erb +3 -19
  26. data/app/views/vyapari/admin/regions/_index.html.erb +1 -1
  27. data/app/views/vyapari/admin/regions/index.html.erb +3 -19
  28. data/app/views/vyapari/admin/users/_form.html.erb +39 -0
  29. data/app/views/vyapari/admin/users/_index.html.erb +101 -0
  30. data/app/views/vyapari/admin/users/_row.html.erb +72 -0
  31. data/app/views/vyapari/admin/users/_show.html.erb +199 -0
  32. data/app/views/vyapari/admin/{categories → users}/index.html.erb +24 -8
  33. data/config/routes.rb +5 -66
  34. data/db/migrate/20170000000200_create_exchange_rates.rb +2 -3
  35. data/lib/tasks/vyapari_tasks.rake +4 -0
  36. data/lib/vyapari/version.rb +1 -1
  37. metadata +15 -167
  38. data/app/assets/images/vyapari/sample_stock_bundle.csv +0 -1
  39. data/app/controllers/vyapari/admin/brands_controller.rb +0 -99
  40. data/app/controllers/vyapari/admin/categories_controller.rb +0 -115
  41. data/app/controllers/vyapari/admin/products_controller.rb +0 -79
  42. data/app/controllers/vyapari/admin/stores_controller.rb +0 -67
  43. data/app/controllers/vyapari/admin/suppliers_controller.rb +0 -67
  44. data/app/controllers/vyapari/admin/terminals_controller.rb +0 -150
  45. data/app/controllers/vyapari/store_manager/base_controller.rb +0 -33
  46. data/app/controllers/vyapari/store_manager/dashboard_controller.rb +0 -31
  47. data/app/controllers/vyapari/store_manager/reports/invoices_controller.rb +0 -249
  48. data/app/controllers/vyapari/store_manager/reports/sales_controller.rb +0 -299
  49. data/app/controllers/vyapari/store_manager/reports/stock_controller.rb +0 -132
  50. data/app/controllers/vyapari/store_manager/resource_controller.rb +0 -17
  51. data/app/controllers/vyapari/store_manager/stock_bundles_controller.rb +0 -206
  52. data/app/controllers/vyapari/store_manager/stock_entries_controller.rb +0 -161
  53. data/app/controllers/vyapari/terminal_staff/base_controller.rb +0 -38
  54. data/app/controllers/vyapari/terminal_staff/dashboard_controller.rb +0 -35
  55. data/app/controllers/vyapari/terminal_staff/invoices_controller.rb +0 -147
  56. data/app/controllers/vyapari/terminal_staff/line_items_controller.rb +0 -139
  57. data/app/controllers/vyapari/terminal_staff/resource_controller.rb +0 -17
  58. data/app/controllers/vyapari/user_dashboard_controller.rb +0 -31
  59. data/app/models/bank_account.rb +0 -44
  60. data/app/models/contact.rb +0 -72
  61. data/app/models/image/brand_image.rb +0 -3
  62. data/app/models/image/category_image.rb +0 -3
  63. data/app/models/image/product_image.rb +0 -3
  64. data/app/models/invoice.rb +0 -256
  65. data/app/models/line_item.rb +0 -207
  66. data/app/models/stock_bundle.rb +0 -249
  67. data/app/models/stock_entry.rb +0 -275
  68. data/app/models/store.rb +0 -302
  69. data/app/models/supplier.rb +0 -79
  70. data/app/models/terminal.rb +0 -158
  71. data/app/uploaders/brand_image_uploader.rb +0 -14
  72. data/app/uploaders/category_image_uploader.rb +0 -14
  73. data/app/uploaders/product_image_uploader.rb +0 -14
  74. data/app/uploaders/stock_bundle_uploader.rb +0 -10
  75. data/app/views/layouts/vyapari/_store_manager_menu.html.erb +0 -126
  76. data/app/views/layouts/vyapari/_terminal_staff_menu.html.erb +0 -106
  77. data/app/views/layouts/vyapari/store_manager.html.erb +0 -112
  78. data/app/views/layouts/vyapari/terminal_staff.html.erb +0 -116
  79. data/app/views/vyapari/admin/brands/_form.html.erb +0 -23
  80. data/app/views/vyapari/admin/brands/_index.html.erb +0 -89
  81. data/app/views/vyapari/admin/brands/_row.html.erb +0 -63
  82. data/app/views/vyapari/admin/brands/_show.html.erb +0 -104
  83. data/app/views/vyapari/admin/brands/index.html.erb +0 -48
  84. data/app/views/vyapari/admin/categories/_form.html.erb +0 -28
  85. data/app/views/vyapari/admin/categories/_index.html.erb +0 -101
  86. data/app/views/vyapari/admin/categories/_row.html.erb +0 -69
  87. data/app/views/vyapari/admin/categories/_show.html.erb +0 -115
  88. data/app/views/vyapari/admin/products/_form.html.erb +0 -32
  89. data/app/views/vyapari/admin/products/_index.html.erb +0 -58
  90. data/app/views/vyapari/admin/products/_row.html.erb +0 -30
  91. data/app/views/vyapari/admin/products/_show.html.erb +0 -81
  92. data/app/views/vyapari/admin/products/index.html.erb +0 -48
  93. data/app/views/vyapari/admin/stores/_form.html.erb +0 -37
  94. data/app/views/vyapari/admin/stores/_index.html.erb +0 -84
  95. data/app/views/vyapari/admin/stores/_row.html.erb +0 -55
  96. data/app/views/vyapari/admin/stores/_show.html.erb +0 -110
  97. data/app/views/vyapari/admin/stores/index.html.erb +0 -48
  98. data/app/views/vyapari/admin/suppliers/_form.html.erb +0 -32
  99. data/app/views/vyapari/admin/suppliers/_index.html.erb +0 -58
  100. data/app/views/vyapari/admin/suppliers/_row.html.erb +0 -30
  101. data/app/views/vyapari/admin/suppliers/_show.html.erb +0 -81
  102. data/app/views/vyapari/admin/suppliers/index.html.erb +0 -48
  103. data/app/views/vyapari/admin/terminals/_form.html.erb +0 -24
  104. data/app/views/vyapari/admin/terminals/_index.html.erb +0 -75
  105. data/app/views/vyapari/admin/terminals/_row.html.erb +0 -49
  106. data/app/views/vyapari/admin/terminals/_show.html.erb +0 -74
  107. data/app/views/vyapari/store_manager/dashboard/_sales_counts.html.erb +0 -90
  108. data/app/views/vyapari/store_manager/dashboard/_stock_counts.html.erb +0 -63
  109. data/app/views/vyapari/store_manager/dashboard/_terminals.html.erb +0 -23
  110. data/app/views/vyapari/store_manager/dashboard/index.html.erb +0 -64
  111. data/app/views/vyapari/store_manager/reports/invoices/_index.html.erb +0 -65
  112. data/app/views/vyapari/store_manager/reports/invoices/index.html.erb +0 -105
  113. data/app/views/vyapari/store_manager/reports/sales/_index.html.erb +0 -64
  114. data/app/views/vyapari/store_manager/reports/sales/index.html.erb +0 -105
  115. data/app/views/vyapari/store_manager/reports/stock/_index.html.erb +0 -72
  116. data/app/views/vyapari/store_manager/reports/stock/index.html.erb +0 -32
  117. data/app/views/vyapari/store_manager/stock_bundles/_form.html.erb +0 -99
  118. data/app/views/vyapari/store_manager/stock_bundles/_index.html.erb +0 -74
  119. data/app/views/vyapari/store_manager/stock_bundles/_row.html.erb +0 -44
  120. data/app/views/vyapari/store_manager/stock_bundles/_show.html.erb +0 -110
  121. data/app/views/vyapari/store_manager/stock_bundles/create.html.erb +0 -57
  122. data/app/views/vyapari/store_manager/stock_bundles/index.html.erb +0 -36
  123. data/app/views/vyapari/store_manager/stock_bundles/update.html.erb +0 -57
  124. data/app/views/vyapari/store_manager/stock_entries/_form.html.erb +0 -50
  125. data/app/views/vyapari/store_manager/stock_entries/_index.html.erb +0 -80
  126. data/app/views/vyapari/store_manager/stock_entries/_row.html.erb +0 -33
  127. data/app/views/vyapari/store_manager/stock_entries/_show.html.erb +0 -110
  128. data/app/views/vyapari/store_manager/stock_entries/_stock_bundle.html.erb +0 -61
  129. data/app/views/vyapari/store_manager/stock_entries/index.html.erb +0 -45
  130. data/app/views/vyapari/terminal_staff/dashboard/_counts.html.erb +0 -131
  131. data/app/views/vyapari/terminal_staff/dashboard/_invoices.html.erb +0 -44
  132. data/app/views/vyapari/terminal_staff/dashboard/_search_form.html.erb +0 -6
  133. data/app/views/vyapari/terminal_staff/dashboard/_search_results.html.erb +0 -24
  134. data/app/views/vyapari/terminal_staff/dashboard/index.html.erb +0 -56
  135. data/app/views/vyapari/terminal_staff/dashboard/search.js.erb +0 -12
  136. data/app/views/vyapari/terminal_staff/invoices/_draft.html.erb +0 -62
  137. data/app/views/vyapari/terminal_staff/invoices/_form.html.erb +0 -134
  138. data/app/views/vyapari/terminal_staff/invoices/_index.html.erb +0 -70
  139. data/app/views/vyapari/terminal_staff/invoices/_row.html.erb +0 -33
  140. data/app/views/vyapari/terminal_staff/invoices/_show.html.erb +0 -204
  141. data/app/views/vyapari/terminal_staff/invoices/index.html.erb +0 -35
  142. data/app/views/vyapari/terminal_staff/invoices/new.js.erb +0 -18
  143. data/app/views/vyapari/terminal_staff/invoices/show.html.erb +0 -1
  144. data/app/views/vyapari/terminal_staff/invoices/show.js.erb +0 -13
  145. data/app/views/vyapari/terminal_staff/line_items/_form.html.erb +0 -40
  146. data/app/views/vyapari/terminal_staff/line_items/_index.html.erb +0 -96
  147. data/app/views/vyapari/terminal_staff/line_items/create.js.erb +0 -34
  148. data/app/views/vyapari/terminal_staff/line_items/destroy.js.erb +0 -25
  149. data/app/views/vyapari/user_dashboard/index.html.erb +0 -51
  150. data/db/import_data/brands.csv +0 -7
  151. data/db/import_data/categories.csv +0 -12
  152. data/db/import_data/countries.csv +0 -1
  153. data/db/import_data/dummy/brands.csv +0 -7
  154. data/db/import_data/dummy/categories.csv +0 -12
  155. data/db/import_data/dummy/countries.csv +0 -1
  156. data/db/import_data/dummy/exchange_rates.csv +0 -5
  157. data/db/import_data/dummy/products-copy.csv +0 -1
  158. data/db/import_data/dummy/products.csv +0 -1
  159. data/db/import_data/dummy/products.xlsx +0 -0
  160. data/db/import_data/dummy/regions.csv +0 -13
  161. data/db/import_data/dummy/stores.csv +0 -10
  162. data/db/import_data/dummy/suppliers.csv +0 -14
  163. data/db/import_data/dummy/terminals.csv +0 -11
  164. data/db/import_data/exchange_rates.csv +0 -5
  165. data/db/import_data/regions.csv +0 -13
  166. data/db/import_data/stores.csv +0 -3
  167. data/db/import_data/suppliers.csv +0 -14
  168. data/db/import_data/terminals.csv +0 -3
  169. data/db/migrate/20170000000203_create_contacts.rb +0 -22
  170. data/db/migrate/20170000000204_create_bank_accounts.rb +0 -21
  171. data/db/migrate/20170000000205_create_suppliers.rb +0 -18
  172. data/db/migrate/20170000000206_create_stores.rb +0 -21
  173. data/db/migrate/20170000000207_create_terminals.rb +0 -18
  174. data/db/migrate/20170000000210_create_brands.rb +0 -14
  175. data/db/migrate/20170000000211_create_categories.rb +0 -22
  176. data/db/migrate/20170000000212_create_products.rb +0 -29
  177. data/db/migrate/20170000000213_create_invoices.rb +0 -61
  178. data/db/migrate/20170000000215_create_stock_bundles.rb +0 -17
  179. data/db/migrate/20170000000216_create_stock_entries.rb +0 -20
  180. data/db/sample_reports/products.xlsx +0 -0
  181. data/lib/tasks/vyapari/all.rake +0 -73
@@ -1,249 +0,0 @@
1
- require 'csv'
2
-
3
- class StockBundle < ActiveRecord::Base
4
-
5
- # Constants
6
- PENDING = "pending" # Default Status
7
- ERRORED = "errored"
8
- APPROVED = "approved"
9
-
10
- STATUS = {"Pending" => PENDING, "Approved" => APPROVED, "Errored" => ERRORED}
11
- STATUS_REVERSE = {PENDING => "Pending", APPROVED => "Approved", ERRORED => "Errored"}
12
-
13
- # Validations
14
- validates :name, :presence=> true, uniqueness: true
15
- validates :uploaded_date, presence: true
16
- validates :status, :presence=> true, :inclusion => {:in => STATUS_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
17
- # validates :file, :presence=> true
18
-
19
- # Associations
20
- has_many :stock_entries
21
- belongs_to :uploader, class_name: 'User'
22
- belongs_to :supplier, optional: true
23
- belongs_to :store
24
-
25
- # Uploader
26
- mount_uploader :file, File::StockBundleUploader
27
- mount_uploader :error_file, File::StockBundleUploader
28
-
29
- # ------------------
30
- # Class Methods
31
- # ------------------
32
-
33
- # return an active record relation object with the search query in its where clause
34
- # Return the ActiveRecord::Relation object
35
- # == Examples
36
- # >>> obj.search(query)
37
- # => ActiveRecord::Relation object
38
- scope :search, lambda {|query| joins(:supplier, :store).where("LOWER(suppliers.name) LIKE LOWER('%#{query}%') OR LOWER(stores.name) LIKE LOWER('%#{query}%')")}
39
-
40
- scope :status, lambda { |status| where ("LOWER(stock_bundles.status)='#{status}'") }
41
-
42
- scope :pending, -> { where(status: PENDING) }
43
- scope :approved, -> { where(status: APPROVED) }
44
-
45
- # ------------------
46
- # Class Methods
47
- # ------------------
48
-
49
- def parse_stocks
50
-
51
- # For some reasn it throws error for self.error_details unless we reload
52
- self.reload
53
-
54
- path = "#{Rails.root}/public#{self.file.url}"
55
- begin
56
- csv_table = CSV.table(path, {headers: true, converters: nil, header_converters: :symbol})
57
- rescue CSV::MalformedCSVError => e
58
- self.error_summary = "The Uploaded File is corrupted."
59
- self.error_details = "#{e.class}: #{e.message}"
60
- self.save
61
- puts self.error_summary.red
62
- puts self.error_details.red
63
- return false
64
- rescue Exception => e
65
- self.error_summary = "The Uploaded File format is not supported."
66
- self.error_details = "#{e.class}: #{e.message}"
67
- puts self.error_summary.red
68
- puts self.error_details.red
69
- self.save
70
- return false
71
- end
72
-
73
- headers = csv_table.headers
74
-
75
- StockEntry.where(stock_bundle: self.id).destroy_all
76
-
77
- # We need a collection of all the column headings to pass to error hander to reproduce the errors in same format
78
- columns = [:env_sku, :name, :reference_number, :one_liner, :description, :purchased_price, :landed_price, :selling_price, :retail_price, :brand, :category, :quantity]
79
-
80
- # Initializing the Data Error to store errors for each column
81
- data_error = Kuppayam::Importer::DataError.new
82
- data_error.columns = columns
83
-
84
- csv_table.each_with_index do |row, i|
85
-
86
- row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
87
-
88
- if row[:ean_sku].blank?
89
- data_error.add_column_error(:ean_sku, "", "ENV / SKU number is blank", i)
90
- next
91
- end
92
-
93
- if row[:quantity].blank?
94
- data_error.add_column_error(:quantity, "", "Quantity is blank", i)
95
- next
96
- end
97
-
98
- product = Product.where("ean_sku = ?", row[:ean_sku]).first || Product.new
99
-
100
- product.ean_sku = row[:ean_sku]
101
- product.name = row[:name]
102
- product.reference_number = row[:reference_number]
103
- product.one_liner = row[:one_liner]
104
- product.description = row[:description]
105
-
106
- product.purchased_price = row[:purchased_price]
107
- product.landed_price = row[:landed_price]
108
- product.selling_price = row[:selling_price]
109
- product.retail_price = row[:retail_price]
110
-
111
- product.purchased_price = 0.00 if product.purchased_price.blank?
112
- product.landed_price = 0.00 if product.landed_price.blank?
113
- product.selling_price = 0.00 if product.selling_price.blank?
114
- product.retail_price = 0.00 if product.retail_price.blank?
115
-
116
- product.brand = Brand.where("name = ?", row[:brand]).first || product.build_brand(name: row[:brand]) if row[:brand]
117
- product.category = Category.where("name = ?", row[:category]).first || product.build_category(name: row[:category]) if row[:category]
118
-
119
- stock_entry = StockEntry.new()
120
-
121
- stock_entry.store = self.store
122
- stock_entry.product = product
123
- stock_entry.supplier = self.supplier
124
- stock_entry.quantity = row[:quantity]
125
- stock_entry.stock_bundle = self
126
- stock_entry.status = :pending
127
-
128
- if product.valid? && stock_entry.valid?
129
- product.save!
130
- stock_entry.save!
131
- else
132
- unless product.valid?
133
- columns.each do |col_name|
134
- data_error.add_column_error(col_name, row[col_name], product.errors[col_name], i) if product.errors.has_key?(col_name)
135
- end
136
- end
137
- unless stock_entry.valid?
138
- columns.each do |col_name|
139
- data_error.add_column_error(col_name, row[col_name], stock_entry.errors[col_name], i) if stock_entry.errors.has_key?(col_name)
140
- end
141
- end
142
- end
143
-
144
- end
145
-
146
- if data_error.errors.any?
147
- self.error_summary = "There are few errors in some of the rows in the CSV file. Open the error file to know more."
148
- # self.error_file = data_error.generate_error_file
149
- end
150
-
151
- self.save!
152
- self.stock_entries.update_all(status: :active) if data_error.errors.blank?
153
-
154
- return data_error.errors.blank?
155
- end
156
-
157
- # ------------------
158
- # Instance Methods
159
- # ------------------
160
-
161
- def display_name
162
- "Stock Bundle - #{self.id} from #{supplier.try(:name)}"
163
- end
164
-
165
- def display_status
166
- STATUS_REVERSE[self.status]
167
- end
168
-
169
- def display_file_name
170
- if self.file && self.file.file
171
- self.file.file.filename
172
- else
173
- self.display_name
174
- end
175
- end
176
-
177
- def original_file_path
178
- self.file && self.file.file ? self.file.file.path : nil
179
- end
180
-
181
- def original_error_file_path
182
- self.error_file && self.error_file.file ? self.error_file.file.path : nil
183
- end
184
-
185
- # * Return true if the stock_entry is approved, else false.
186
- # == Examples
187
- # >>> stock_entry.pending?
188
- # => true
189
- def pending?
190
- (status == PENDING)
191
- end
192
-
193
- # change the status of the stock_entry to :pending
194
- # Return the status
195
- # == Examples
196
- # >>> stock_entry.mark_as_pending!
197
- # => "pending"
198
- def mark_as_pending!
199
- self.update_attribute(:status, PENDING)
200
- self.stock_entries.update_all(status: StockEntry::PENDING)
201
- end
202
-
203
- # * Return true if the stock_entry is approved, else false.
204
- # == Examples
205
- # >>> stock_entry.approved?
206
- # => true
207
- def approved?
208
- (status == APPROVED)
209
- end
210
-
211
- # change the status to :approved
212
- # Return the status
213
- # == Examples
214
- # >>> stock_entry.approve!
215
- # => "approve"
216
- def approve!
217
- self.update_attribute(:status, APPROVED)
218
- self.stock_entries.update_all(status: StockEntry::ACTIVE)
219
- true
220
- end
221
-
222
- # * Return true if the stock_entry is errored, else false.
223
- # == Examples
224
- # >>> stock_entry.mark_as_errored?
225
- # => true
226
- def mark_as_errored?
227
- (status == ERRORED)
228
- end
229
-
230
- # change the status to :errored
231
- # Return the status
232
- # == Examples
233
- # >>> stock_entry.mark_as_errored!
234
- # => "approve"
235
- def mark_as_errored!
236
- self.update_attribute(:status, ERRORED)
237
- self.stock_entries.update_all(status: StockEntry::PENDING)
238
- true
239
- end
240
-
241
- def can_be_deleted?
242
- true
243
- end
244
-
245
- def can_be_edited?
246
- true
247
- end
248
-
249
- end
@@ -1,275 +0,0 @@
1
- class StockEntry < Vyapari::ApplicationRecord
2
-
3
- # Constants
4
- ACTIVE = "active"
5
- SOLD = "sold"
6
- DAMAGED = "damaged"
7
- RECEIVED = "received"
8
- RETURNED = "returned"
9
- RESERVED = "reserved"
10
- PENDING = "pending"
11
-
12
- STATUS = {"Active" => ACTIVE, "Sold" => SOLD, "Damaged" => DAMAGED, "Received" => RECEIVED, "Reserved" => RESERVED, "Pending" => PENDING, "Returned" => RETURNED}
13
- STATUS_REVERSE = {ACTIVE => "Active", SOLD => "Sold", DAMAGED => "Damaged", RECEIVED => "Received", RESERVED => "Reserved", PENDING => "Pending", RETURNED => "Returned"}
14
-
15
- # Validations
16
- validates :store, presence: true
17
- validates :product, presence: true
18
- validates :quantity, presence: true, numericality: true
19
- validates :status, :presence=> true, :inclusion => {:in => STATUS_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
20
-
21
- # Associations
22
- belongs_to :store
23
- belongs_to :product
24
- belongs_to :supplier, optional: true
25
- belongs_to :stock_bundle, optional: true
26
- belongs_to :invoice, optional: true
27
-
28
- # ------------------
29
- # Class Methods
30
- # ------------------
31
-
32
- # return an active record relation object with the search query in its where clause
33
- # Return the ActiveRecord::Relation object
34
- # == Examples
35
- # >>> obj.search(query)
36
- # => ActiveRecord::Relation object
37
- scope :search, lambda {|query| joins("LEFT JOIN `stores` ON `stores`.`id` = `stock_entries`.`store_id` LEFT JOIN `products` ON `products`.`id` = `stock_entries`.`product_id` LEFT JOIN `suppliers` ON `suppliers`.`id` = `stock_entries`.`supplier_id`").where("LOWER(products.name) LIKE LOWER('%#{query}%') OR
38
- LOWER(suppliers.name) LIKE LOWER('%#{query}%') OR
39
- LOWER(products.ean_sku) LIKE LOWER('%#{query}%') OR
40
- LOWER(products.one_liner) LIKE LOWER('%#{query}%') OR
41
- LOWER(products.description) LIKE LOWER('%#{query}%') OR
42
- LOWER(stores.name) LIKE LOWER('%#{query}%')")}
43
-
44
-
45
- scope :active, -> { where(status: ACTIVE) }
46
- scope :sold, -> { where(status: SOLD) }
47
- scope :damaged, -> { where(status: DAMAGED) }
48
- scope :returned, -> { where(status: RETURNED) }
49
- scope :received, -> { where(status: RECEIVED) }
50
- scope :reserved, -> { where(status: RESERVED) }
51
- scope :in_stock, -> { where(status: [ACTIVE, RECEIVED, RETURNED]) }
52
-
53
- scope :this_month, lambda { joins(:invoice).where("invoices.invoice_date >= ? AND invoices.invoice_date <= ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) }
54
- scope :today, lambda { joins(:invoice).where('DATE(invoices.invoice_date) = ?', Date.current.in_time_zone)}
55
- scope :dated, lambda { |d| joins(:invoice).where('DATE(invoices.invoice_date) = ?', d)}
56
-
57
- def self.save_row_data(row)
58
-
59
- row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
60
-
61
- return if row[:ean_sku].blank?
62
-
63
- # Initializing error hash for displaying all errors altogether
64
- error_object = Kuppayam::Importer::ErrorHash.new
65
-
66
- store = Store.find_by_code(row[:stock])
67
- unless store
68
- summary = "Store doesn't exist."
69
- details = "Error! The store with code #{row[:store]} doesn't exists in the database"
70
- error_object.errors << { summary: summary, details: details }
71
- return
72
- end
73
-
74
- product = Product.find_by_ean_sku(row[:ean_sku]) || Product.new
75
-
76
- product.name = row[:name]
77
- product.code = row[:code]
78
-
79
- if product.valid?
80
- product.save!
81
- else
82
- summary = "Error while saving product: #{product.name}"
83
- details = "Error! #{product.errors.full_messages.to_sentence}"
84
- error_object.errors << { summary: summary, details: details }
85
- end
86
-
87
-
88
- stock_entry.store = store
89
- stock_entry.product = product
90
- stock_entry.quantity = row[:quantity]
91
-
92
- stock_entry.set_stock_entry_type(row[:stock_entry_type])
93
-
94
- stock_entry.region = Region.find_by_code(row[:region]) || Country.find_by_name(row[:country])
95
- stock_entry.country = Country.find_by_code(row[:country]) || Country.find_by_name(row[:country])
96
-
97
- if stock_entry.valid?
98
- stock_entry.save!
99
- else
100
- summary = "Error while saving stock_entry: #{stock_entry.name}"
101
- details = "Error! #{stock_entry.errors.full_messages.to_sentence}"
102
- error_object.errors << { summary: summary, details: details }
103
- end
104
- return error_object
105
- end
106
-
107
- # ------------------
108
- # Instance Methods
109
- # ------------------
110
-
111
- def display_name
112
- "Stock from #{self.supplier.try(:name)}"
113
- end
114
-
115
- def display_store_type
116
- STATUS[self.status]
117
- end
118
-
119
- def display_status
120
- STATUS_REVERSE[self.status]
121
- end
122
-
123
- def slug
124
- if self.product
125
- self.product.name.parameterize
126
- else
127
- self.id
128
- end
129
- end
130
-
131
- def to_param
132
- "#{id}-#{slug}"
133
- end
134
-
135
- # change the status to :active
136
- # Return the status
137
- # == Examples
138
- # >>> stock_entry.activate!
139
- # => "active"
140
- def activate!
141
- self.update_attribute(:status, ACTIVE)
142
- end
143
-
144
- # change the status to :sold
145
- # Return the status
146
- # == Examples
147
- # >>> stock_entry.sell!
148
- # => "sold"
149
- def sell!
150
- self.update_attribute(:status, SOLD)
151
- end
152
-
153
- # change the status to :damaged
154
- # Return the status
155
- # == Examples
156
- # >>> stock_entry.mark_as_damaged!
157
- # => "damaged"
158
- def mark_as_damaged!
159
- self.update_attribute(:status, DAMAGED)
160
- end
161
-
162
- # change the status to :received
163
- # Return the status
164
- # == Examples
165
- # >>> stock_entry.mark_as_received!
166
- # => "received"
167
- def mark_as_received!
168
- self.update_attribute(:status, RECEIVED)
169
- end
170
-
171
- # change the status to :reserved
172
- # Return the status
173
- # == Examples
174
- # >>> stock_entry.reserve!
175
- # => "reserved"
176
- def reserve!
177
- self.update_attribute(:status, RESERVED)
178
- end
179
-
180
- # change the status to :returned
181
- # Return the status
182
- # == Examples
183
- # >>> stock_entry.reserve!
184
- # => "returned"
185
- def return!
186
- self.update_attribute(:status, RETURN)
187
- end
188
-
189
- # change the status to :pending
190
- # Return the status
191
- # == Examples
192
- # >>> stock_entry.mark_as_pending!
193
- # => "pending"
194
- def mark_as_pending!
195
- self.update_attribute(:status, PENDING)
196
- end
197
-
198
- # * Return true if the stock_entry is active, else false.
199
- # == Examples
200
- # >>> stock_entry.active?
201
- # => true
202
- def active?
203
- (status == ACTIVE)
204
- end
205
-
206
- # * Return true if the stock_entry is sold, else false.
207
- # == Examples
208
- # >>> stock_entry.sold?
209
- # => true
210
- def sold?
211
- (status == SOLD)
212
- end
213
-
214
- # * Return true if the stock_entry is damaged, else false.
215
- # == Examples
216
- # >>> stock_entry.damaged?
217
- # => true
218
- def damaged?
219
- (status == DAMAGED)
220
- end
221
-
222
- # * Return true if the stock_entry is received, else false.
223
- # == Examples
224
- # >>> stock_entry.received?
225
- # => true
226
- def received?
227
- (status == RECEIVED)
228
- end
229
-
230
- # * Return true if the stock_entry is returned, else false.
231
- # == Examples
232
- # >>> stock_entry.returned?
233
- # => true
234
- def returned?
235
- (status == RETURNED)
236
- end
237
-
238
- # * Return true if the stock_entry is reserved, else false.
239
- # == Examples
240
- # >>> stock_entry.reserved?
241
- # => true
242
- def reserved?
243
- (status == RESERVED)
244
- end
245
-
246
- # * Return true if the stock_entry is pending, else false.
247
- # == Examples
248
- # >>> stock_entry.pending?
249
- # => true
250
- def pending?
251
- (status == PENDING)
252
- end
253
-
254
- def can_be_edited?
255
- true
256
- end
257
-
258
- def can_be_deleted?
259
- # if self.products.any?
260
- # #self.errors.add(:base, DELETE_MESSAGE)
261
- # return false
262
- # else
263
- # return true
264
- # end
265
- return true
266
- end
267
-
268
- def report_heading
269
- rh = []
270
- rh << self.company.try(:name) if self.company.name
271
- rh << self.display_name
272
- rh.join(", ")
273
- end
274
-
275
- end