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,72 +0,0 @@
1
- class Contact < Vyapari::ApplicationRecord
2
-
3
- # Validations
4
- validates :name, presence: true, length: {minimum: 2, maximum: 250}, allow_blank: false
5
- validates :email, length: {maximum: 128}, allow_blank: true
6
- validates :phone, length: {maximum: 128}, allow_blank: true
7
-
8
- # Associations
9
- belongs_to :contactable, :polymorphic => true
10
-
11
- # ------------------
12
- # Class Methods
13
- # ------------------
14
-
15
- # return an active record relation object with the search query in its where clause
16
- # Return the ActiveRecord::Relation object
17
- # == Examples
18
- # >>> obj.search(query)
19
- # => ActiveRecord::Relation object
20
- scope :search, lambda {|query| where("LOWER(contacts.name) LIKE LOWER('%#{query}%') OR
21
- LOWER(contacts.email) LIKE LOWER('%#{query}%') OR
22
- LOWER(contacts.phone) LIKE LOWER('%#{query}%') OR
23
- LOWER(contacts.landline) LIKE LOWER('%#{query}%') OR
24
- LOWER(contacts.fax) LIKE LOWER('%#{query}%') OR
25
- LOWER(contacts.designation) LIKE LOWER('%#{query}%')
26
- ")}
27
-
28
- # Import Methods
29
- # --------------
30
-
31
- # TODO - this is yet to be done
32
- def self.save_row_data(row)
33
-
34
- row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
35
-
36
- return if row[:name].blank?
37
-
38
- country = Contact.find_by_code(row[:code]) || Contact.new
39
- country.name = row[:name]
40
- country.code = row[:code]
41
-
42
- # Initializing error hash for displaying all errors altogether
43
- error_object = Kuppayam::Importer::ErrorHash.new
44
-
45
- if country.valid?
46
- country.save!
47
- else
48
- summary = "Error while saving country: #{country.name}"
49
- details = "Error! #{country.errors.full_messages.to_sentence}"
50
- error_object.errors << { summary: summary, details: details }
51
- end
52
-
53
- return error_object
54
- end
55
-
56
- # ------------------
57
- # Instance Methods
58
- # ------------------
59
-
60
- def display_name
61
- self.name_was
62
- end
63
-
64
- def can_be_edited?
65
- true
66
- end
67
-
68
- def can_be_deleted?
69
- false
70
- end
71
-
72
- end
@@ -1,3 +0,0 @@
1
- class Image::BrandImage < Image::Base
2
- mount_uploader :image, BrandImageUploader
3
- end
@@ -1,3 +0,0 @@
1
- class Image::CategoryImage < Image::Base
2
- mount_uploader :image, CategoryImageUploader
3
- end
@@ -1,3 +0,0 @@
1
- class Image::ProductImage < Image::Base
2
- mount_uploader :image, ProductImageUploader
3
- end
@@ -1,256 +0,0 @@
1
- class Invoice < Vyapari::ApplicationRecord
2
-
3
- # Constants
4
- DRAFT = "draft"
5
- ACTIVE = "active"
6
- CANCELLED = "cancelled"
7
-
8
- CASH = "cash"
9
- CREDIT = "credit"
10
- CREDIT_CARD = "credit_card"
11
- CHEQUE = "cheque"
12
-
13
- STATUS = {"Draft" => DRAFT, "Active" => ACTIVE, "Cancelled" => CANCELLED}
14
- STATUS_REVERSE = {DRAFT => "Draft", ACTIVE => "Active", CANCELLED => "Cancelled"}
15
-
16
- PAYMENT_METHOD = {"Cash" => CASH, "Credit" => CREDIT, "Credit Card" => CREDIT_CARD, "Cheque" => CHEQUE}
17
- PAYMENT_METHOD_REVERSE = {CASH => "Cash", CREDIT => "Credid", CREDIT_CARD => "Credit Card", CHEQUE => "Cheque"}
18
-
19
- # Call backs
20
- before_save :calculate_gross_total_amount
21
-
22
- # Validations
23
- validates :invoice_number, :presence=> true
24
- validates :invoice_date, :presence=> true
25
-
26
- validates :status, :presence=> true, :inclusion => {:in => STATUS_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
27
-
28
- # Associations
29
- belongs_to :terminal
30
- belongs_to :store
31
- belongs_to :user
32
- has_many :line_items
33
- has_many :stock_entries
34
-
35
- # ------------------
36
- # Class Methods
37
- # ------------------
38
-
39
- # Scopes
40
-
41
- # return an active record relation object with the search query in its where clause
42
- # Return the ActiveRecord::Relation object
43
- # == Examples
44
- # >>> invoice.search(query)
45
- # => ActiveRecord::Relation object
46
- scope :search, lambda { |query| where("LOWER(invoice_number) LIKE LOWER('%#{query}%') OR LOWER(notes) LIKE LOWER('%#{query}%') OR LOWER(credit_card_number) LIKE LOWER('%#{query}%') OR LOWER(cheque_number) LIKE LOWER('%#{query}%') OR LOWER(customer_name) LIKE LOWER('%#{query}%') OR LOWER(customer_address) LIKE LOWER('%#{query}%') OR LOWER(net_total_amount) LIKE LOWER('%#{query}%')")
47
- }
48
-
49
- scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
50
-
51
- scope :draft, -> { where(status: DRAFT) }
52
- scope :active, -> { where(status: ACTIVE) }
53
- scope :cancelled, -> { where(status: CANCELLED) }
54
-
55
- scope :cash_invoices, -> { where(payment_method: CASH) }
56
- scope :credit_invoices, -> { where(payment_method: CREDIT) }
57
- scope :credit_card_invoices, -> { where(payment_method: CREDIT_CARD) }
58
- scope :cheque_invoices, -> { where(payment_method: CHEQUE) }
59
-
60
- scope :payment_method, lambda { |pm| where("LOWER(payment_method)=?", ) }
61
-
62
- scope :this_month, lambda { where("invoice_date >= ? AND invoice_date <= ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) }
63
- scope :today, lambda { where('DATE(invoice_date) = ?', Date.current.in_time_zone)}
64
- scope :dated, lambda { |d| where('DATE(invoice_date) = ?', d)}
65
-
66
- # ------------------
67
- # Instance Methods
68
- # ------------------
69
-
70
- def initialize
71
- super
72
- self.discount = 0.00
73
- self.tax = 0.00
74
- self.adjustment = 0.00
75
- self.money_taken = 0.00
76
- self.gross_total_amount = 0.00
77
- self.net_total_amount = 0.00
78
- end
79
-
80
- def display_name
81
- self.invoice_number
82
- end
83
-
84
- def display_status
85
- STATUS_REVERSE[self.status]
86
- end
87
-
88
- def display_payment_method
89
- self.payment_method.titleize
90
- end
91
-
92
- def slug
93
- self.invoice_number.parameterize
94
- end
95
-
96
- def generate_temporary_invoice_number
97
- self.invoice_number = "#{Time.now.to_i}"
98
- end
99
-
100
- def reset_invoice_number
101
- self.update_attribute(:invoice_number, "#{INV}-#{self.terminal.code}-#{self.id}") if self.draft?
102
- end
103
-
104
- def to_param
105
- "#{id}-#{slug}"
106
- end
107
-
108
- # * Return true if the invoice is draft, else false.
109
- # == Examples
110
- # >>> invoice.draft?
111
- # => true
112
- def draft?
113
- (status == DRAFT)
114
- end
115
-
116
- # change the status to :draft
117
- # Return the status
118
- # == Examples
119
- # >>> invoice.publish!
120
- # => "draft"
121
- def draft!
122
- self.update_attribute(:status, DRAFT)
123
- end
124
-
125
- # * Return true if the invoice is active, else false.
126
- # == Examples
127
- # >>> invoice.active?
128
- # => true
129
- def active?
130
- (status == ACTIVE)
131
- end
132
-
133
- # change the status to :active
134
- # Return the status
135
- # == Examples
136
- # >>> invoice.unpublish!
137
- # => "active"
138
- def activate!
139
- self.update_attributes(status: ACTIVE)
140
- #self.line_items.update_attributes(status: LineItem::SOLD)
141
- end
142
-
143
- # * Return true if the invoice is cancelled, else false.
144
- # == Examples
145
- # >>> invoice.cancelled?
146
- # => true
147
- def cancelled?
148
- (status == CANCELLED)
149
- end
150
-
151
- # change the status to :cancelled
152
- # Return the status
153
- # == Examples
154
- # >>> invoice.remove!
155
- # => "cancelled"
156
- def cancel!
157
- self.update_attributes(status: CANCELLED)
158
- #self.line_items.update_attributes(status: LineItem::CANCELLED)
159
- end
160
-
161
- # * Return true if the invoice is cash, else false.
162
- # == Examples
163
- # >>> invoice.cash?
164
- # => true
165
- def cash?
166
- (payment_method == CASH)
167
- end
168
-
169
- # * Return true if the invoice is credit, else false.
170
- # == Examples
171
- # >>> invoice.credit?
172
- # => true
173
- def credit?
174
- (payment_method == CREDIT)
175
- end
176
-
177
- # * Return true if the invoice is credit_card, else false.
178
- # == Examples
179
- # >>> invoice.credit_card?
180
- # => true
181
- def credit_card?
182
- (payment_method == CREDIT_CARD)
183
- end
184
-
185
- # * Return true if the invoice is cheque, else false.
186
- # == Examples
187
- # >>> invoice.cheque?
188
- # => true
189
- def cheque?
190
- (payment_method == CHEQUE)
191
- end
192
-
193
- def can_be_draft?
194
- active? or cancelled?
195
- end
196
-
197
- def can_be_active?
198
- draft? or cancelled?
199
- end
200
-
201
- def can_be_cancelled?
202
- draft? or active?
203
- end
204
-
205
- # TODO
206
-
207
- def can_be_edited?
208
- true
209
- end
210
-
211
- def can_be_deleted?
212
- cancelled? && self.line_items.blank?
213
- #if self.jobs.any?
214
- # self.errors.add(:base, DELETE_MESSAGE)
215
- # return false
216
- #else
217
- # return true
218
- #end
219
- #return true
220
- end
221
-
222
- def update_stock_register!
223
- return unless self.active?
224
- self.stock_entries.destroy_all
225
- self.line_items.each do |li|
226
- stock_entry = StockEntry.new
227
- stock_entry.store = self.store
228
- stock_entry.product = li.product
229
- stock_entry.invoice_id = self.id
230
- stock_entry.quantity = li.quantity
231
- stock_entry.status = LineItem::SOLD
232
- stock_entry.save
233
- end
234
- end
235
-
236
- def generate_real_invoice_number!
237
- self.invoice_number = "INV-#{self.terminal.code}-#{self.id}"
238
- self.save
239
- end
240
-
241
- def discount_amount
242
- self.gross_total_amount * (self.discount / 100.00)
243
- end
244
-
245
- def balance_to_give
246
- self.money_taken - self.net_total_amount
247
- end
248
-
249
- def calculate_gross_total_amount
250
- self.gross_total_amount = self.line_items.sum("rate * quantity") || 0.0
251
- total_after_discount_and_tax = self.gross_total_amount - ( self.discount / 100.00 * self.gross_total_amount) + ( self.tax / 100.00 * self.gross_total_amount)
252
- self.net_total_amount = total_after_discount_and_tax.round(2)
253
- self.adjustment = self.net_total_amount - total_after_discount_and_tax
254
- end
255
-
256
- end
@@ -1,207 +0,0 @@
1
- class LineItem < Vyapari::ApplicationRecord
2
-
3
- # Constants
4
- DRAFT = "draft"
5
- SOLD = "sold"
6
- DAMAGED = "damaged"
7
- RETURNED = "returned"
8
- CANCELLED = "cancelled"
9
-
10
- STATUS = {"Draft" => DRAFT, "Sold" => SOLD, "Damaged" => DAMAGED, "Returned" => RETURNED, "Cancelled" => CANCELLED}
11
- STATUS_REVERSE = {DRAFT => "Draft", SOLD => "Sold", DAMAGED => "Damaged", RETURNED => "Returned", CANCELLED => "Cancelled"}
12
-
13
- # Call backs
14
- before_save :calculate_total_amount
15
-
16
- # Validations
17
- validates :product, :presence=> true
18
- validates :quantity, :presence=> true
19
- validates :rate, :presence=> true
20
-
21
- validates :status, :presence=> true, :inclusion => {:in => STATUS_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
22
-
23
- # Associations
24
- belongs_to :product, optional: true
25
-
26
-
27
- # ------------------
28
- # Class Methods
29
- # ------------------
30
-
31
- # Scopes
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
- # >>> invoice.search(query)
37
- # => ActiveRecord::Relation object
38
- scope :search, lambda { |query| joins(:product).where("LOWER(products.name) LIKE LOWER('%#{query}%')")}
39
- scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
40
-
41
- scope :draft, -> { where(status: DRAFT) }
42
- scope :sold, -> { where(status: SOLD) }
43
- scope :damaged, -> { where(status: DAMAGED) }
44
- scope :returned, -> { where(status: RETURNED) }
45
-
46
- scope :this_month, lambda { where("created_at >= ? AND created_at <= ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) }
47
-
48
- # ------------------
49
- # Instance Methods
50
- # ------------------
51
-
52
- def display_name
53
- if product
54
- self.product.display_name
55
- else
56
- "#{self.id} - No Product"
57
- end
58
- end
59
-
60
- # * Return true if the invoice is sold, else false.
61
- # == Examples
62
- # >>> invoice.sold?
63
- # => true
64
- def sold?
65
- (status == SOLD)
66
- end
67
-
68
- # change the status to :sold
69
- # Return the status
70
- # == Examples
71
- # >>> invoice.publish!
72
- # => "sold"
73
- def sold!
74
- self.update_attribute(:status, SOLD)
75
- end
76
-
77
- # * Return true if the invoice is active, else false.
78
- # == Examples
79
- # >>> invoice.active?
80
- # => true
81
- def active?
82
- (status == ACTIVE)
83
- end
84
-
85
- # change the status to :active
86
- # Return the status
87
- # == Examples
88
- # >>> invoice.unpublish!
89
- # => "active"
90
- def activate!
91
- self.update_attributes(status: ACTIVE, featured: false)
92
- end
93
-
94
- # * Return true if the invoice is cancelled, else false.
95
- # == Examples
96
- # >>> invoice.cancelled?
97
- # => true
98
- def cancelled?
99
- (status == CANCELLED)
100
- end
101
-
102
- # change the status to :cancelled
103
- # Return the status
104
- # == Examples
105
- # >>> invoice.remove!
106
- # => "cancelled"
107
- def cancel!
108
- self.update_attributes(status: CANCELLED, featured: false)
109
- end
110
-
111
- def can_be_sold?
112
- active? or cancelled?
113
- end
114
-
115
- def can_be_active?
116
- sold? or cancelled?
117
- end
118
-
119
- def can_be_cancelled?
120
- sold? or active?
121
- end
122
-
123
- # change the status to :sold
124
- # Return the status
125
- # == Examples
126
- # >>> stock_entry.sell!
127
- # => "sold"
128
- def sell!
129
- self.update_attribute(:status, SOLD)
130
- end
131
-
132
- # change the status to :damaged
133
- # Return the status
134
- # == Examples
135
- # >>> stock_entry.mark_as_damaged!
136
- # => "damaged"
137
- def mark_as_damaged!
138
- self.update_attribute(:status, DAMAGED)
139
- end
140
-
141
- # change the status to :returned
142
- # Return the status
143
- # == Examples
144
- # >>> stock_entry.reserve!
145
- # => "returned"
146
- def return!
147
- self.update_attribute(:status, RETURN)
148
- end
149
-
150
- # change the status to :draft
151
- # Return the status
152
- # == Examples
153
- # >>> stock_entry.draft!
154
- # => "draft"
155
- def draft!
156
- self.update_attribute(:status, DRAFT)
157
- end
158
-
159
- # * Return true if the stock_entry is sold, else false.
160
- # == Examples
161
- # >>> stock_entry.sold?
162
- # => true
163
- def sold?
164
- (status == SOLD)
165
- end
166
-
167
- # * Return true if the stock_entry is damaged, else false.
168
- # == Examples
169
- # >>> stock_entry.damaged?
170
- # => true
171
- def damaged?
172
- (status == DAMAGED)
173
- end
174
-
175
- # * Return true if the stock_entry is returned, else false.
176
- # == Examples
177
- # >>> stock_entry.returned?
178
- # => true
179
- def returned?
180
- (status == RETURNED)
181
- end
182
-
183
- def calculate_total_amount
184
- if self.quantity * self.rate
185
- self.total_amount = self.quantity * self.rate
186
- else
187
- self.total_amount = 0.00
188
- end
189
- end
190
-
191
- # TODO
192
- def can_be_edited?
193
- true
194
- end
195
-
196
- def can_be_deleted?
197
- true
198
- #if self.jobs.any?
199
- # self.errors.add(:base, DELETE_MESSAGE)
200
- # return false
201
- #else
202
- # return true
203
- #end
204
- #return true
205
- end
206
-
207
- end