cats_core 1.5.16 → 1.5.18

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 (263) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +7 -7
  3. data/app/controllers/cats/core/access_controller.rb +4 -4
  4. data/app/controllers/cats/core/application_controller.rb +4 -4
  5. data/app/controllers/cats/core/commodities_controller.rb +7 -7
  6. data/app/controllers/cats/core/commodity_categories_controller.rb +4 -4
  7. data/app/controllers/cats/core/dispatch_authorizations_controller.rb +30 -7
  8. data/app/controllers/cats/core/dispatch_plan_items_controller.rb +4 -4
  9. data/app/controllers/cats/core/dispatch_plans_controller.rb +10 -10
  10. data/app/controllers/cats/core/dispatch_transactions_controller.rb +5 -5
  11. data/app/controllers/cats/core/dispatches_controller.rb +19 -19
  12. data/app/controllers/cats/core/loans_controller.rb +1 -1
  13. data/app/controllers/cats/core/locations_controller.rb +4 -4
  14. data/app/controllers/cats/core/menus_controller.rb +1 -1
  15. data/app/controllers/cats/core/notifications_controller.rb +5 -5
  16. data/app/controllers/cats/core/purchase_orders_controller.rb +3 -3
  17. data/app/controllers/cats/core/receipt_authorizations_controller.rb +30 -18
  18. data/app/controllers/cats/core/receipt_transactions_controller.rb +4 -4
  19. data/app/controllers/cats/core/receipts_controller.rb +1 -1
  20. data/app/controllers/cats/core/roles_controller.rb +3 -3
  21. data/app/controllers/cats/core/round_beneficiaries_controller.rb +13 -13
  22. data/app/controllers/cats/core/round_plans_controller.rb +13 -13
  23. data/app/controllers/cats/core/routes_controller.rb +2 -2
  24. data/app/controllers/cats/core/spaces_controller.rb +1 -1
  25. data/app/controllers/cats/core/stack_transactions_controller.rb +3 -3
  26. data/app/controllers/cats/core/stacks_controller.rb +15 -7
  27. data/app/controllers/cats/core/stores_controller.rb +14 -14
  28. data/app/controllers/cats/core/swaps_controller.rb +2 -2
  29. data/app/controllers/cats/core/transporters_controller.rb +1 -1
  30. data/app/controllers/cats/core/users_controller.rb +24 -12
  31. data/app/controllers/concerns/cats/core/common.rb +24 -23
  32. data/app/helpers/cats/core/document_helper.rb +1 -1
  33. data/app/models/cats/core/authorization.rb +9 -9
  34. data/app/models/cats/core/beneficiary.rb +6 -6
  35. data/app/models/cats/core/beneficiary_plan_item.rb +9 -9
  36. data/app/models/cats/core/beneficiary_round_plan_item.rb +2 -2
  37. data/app/models/cats/core/cash_donation.rb +1 -1
  38. data/app/models/cats/core/commodity.rb +47 -33
  39. data/app/models/cats/core/commodity_donation.rb +2 -2
  40. data/app/models/cats/core/commodity_substitution.rb +15 -7
  41. data/app/models/cats/core/contract_item.rb +2 -2
  42. data/app/models/cats/core/dispatch.rb +36 -21
  43. data/app/models/cats/core/dispatch_authorization.rb +31 -5
  44. data/app/models/cats/core/dispatch_plan.rb +19 -10
  45. data/app/models/cats/core/dispatch_plan_item.rb +27 -14
  46. data/app/models/cats/core/dispatch_transaction.rb +15 -5
  47. data/app/models/cats/core/gift_certificate.rb +3 -3
  48. data/app/models/cats/core/hub_authorization.rb +7 -7
  49. data/app/models/cats/core/loan.rb +2 -2
  50. data/app/models/cats/core/location.rb +12 -8
  51. data/app/models/cats/core/lost_commodity.rb +2 -2
  52. data/app/models/cats/core/notification.rb +2 -2
  53. data/app/models/cats/core/offer_item.rb +4 -4
  54. data/app/models/cats/core/plan.rb +9 -9
  55. data/app/models/cats/core/plan_item.rb +5 -5
  56. data/app/models/cats/core/plan_item_detail.rb +2 -2
  57. data/app/models/cats/core/project.rb +1 -1
  58. data/app/models/cats/core/purchase_order.rb +5 -5
  59. data/app/models/cats/core/ration.rb +1 -1
  60. data/app/models/cats/core/receipt.rb +5 -5
  61. data/app/models/cats/core/receipt_authorization.rb +6 -2
  62. data/app/models/cats/core/receipt_transaction.rb +8 -4
  63. data/app/models/cats/core/rhn_request.rb +8 -8
  64. data/app/models/cats/core/role_menu.rb +1 -1
  65. data/app/models/cats/core/round_beneficiary.rb +10 -2
  66. data/app/models/cats/core/round_plan.rb +15 -11
  67. data/app/models/cats/core/round_plan_item.rb +9 -5
  68. data/app/models/cats/core/round_plan_item_detail.rb +3 -3
  69. data/app/models/cats/core/round_ration.rb +2 -2
  70. data/app/models/cats/core/route.rb +12 -8
  71. data/app/models/cats/core/stack.rb +52 -34
  72. data/app/models/cats/core/stack_transaction.rb +3 -3
  73. data/app/models/cats/core/stacking_rule.rb +2 -2
  74. data/app/models/cats/core/store.rb +29 -7
  75. data/app/models/cats/core/swap.rb +5 -5
  76. data/app/models/cats/core/transaction.rb +6 -6
  77. data/app/models/cats/core/transport_bid.rb +13 -13
  78. data/app/models/cats/core/transport_bid_item.rb +2 -2
  79. data/app/models/cats/core/transport_offer.rb +3 -3
  80. data/app/models/cats/core/transport_order.rb +8 -8
  81. data/app/models/cats/core/transport_order_item.rb +2 -2
  82. data/app/models/cats/core/transport_plan.rb +7 -7
  83. data/app/models/cats/core/transport_plan_item.rb +2 -2
  84. data/app/models/cats/core/transport_requisition.rb +9 -9
  85. data/app/models/cats/core/transport_requisition_detail.rb +2 -2
  86. data/app/models/cats/core/transport_requisition_item.rb +3 -3
  87. data/app/models/cats/core/transporter.rb +4 -0
  88. data/app/models/cats/core/unit_conversion.rb +4 -4
  89. data/app/models/cats/core/unit_of_measure.rb +4 -4
  90. data/app/models/cats/core/user.rb +11 -11
  91. data/app/models/concerns/cats/core/dispatchable.rb +3 -3
  92. data/app/notifications/cats/core/allocation_notification.rb +1 -1
  93. data/app/notifications/cats/core/dispatch_authorization_notification.rb +35 -0
  94. data/app/notifications/cats/core/dispatch_notification.rb +1 -1
  95. data/app/notifications/cats/core/receipt_authorization_notification.rb +1 -1
  96. data/app/notifications/cats/core/round_plan_notification.rb +1 -1
  97. data/app/notifications/cats/core/simple_notification.rb +1 -1
  98. data/app/serializers/cats/core/cash_donation_serializer.rb +1 -1
  99. data/app/serializers/cats/core/commodity_donation_serializer.rb +2 -2
  100. data/app/serializers/cats/core/commodity_serializer.rb +2 -2
  101. data/app/serializers/cats/core/dispatch_authorization_serializer.rb +2 -2
  102. data/app/serializers/cats/core/dispatch_plan_item_serializer.rb +3 -3
  103. data/app/serializers/cats/core/dispatch_plan_serializer.rb +1 -1
  104. data/app/serializers/cats/core/dispatch_serializer.rb +2 -2
  105. data/app/serializers/cats/core/dispatch_transaction_serializer.rb +1 -1
  106. data/app/serializers/cats/core/loan_serializer.rb +1 -1
  107. data/app/serializers/cats/core/purchase_order_serializer.rb +2 -2
  108. data/app/serializers/cats/core/receipt_authorization_serializer.rb +2 -2
  109. data/app/serializers/cats/core/receipt_serializer.rb +1 -1
  110. data/app/serializers/cats/core/receipt_transaction_serializer.rb +2 -2
  111. data/app/serializers/cats/core/round_beneficiary_serializer.rb +1 -1
  112. data/app/serializers/cats/core/round_plan_serializer.rb +1 -1
  113. data/app/serializers/cats/core/stack_serializer.rb +1 -1
  114. data/app/serializers/cats/core/store_serializer.rb +1 -1
  115. data/app/serializers/cats/core/swap_serializer.rb +2 -2
  116. data/app/services/cats/core/authorization_service.rb +36 -18
  117. data/app/services/cats/core/beneficiary_service.rb +11 -11
  118. data/app/services/cats/core/dispatch_plan_service.rb +10 -10
  119. data/app/services/cats/core/dispatch_service.rb +31 -31
  120. data/app/services/cats/core/notification_service.rb +5 -5
  121. data/app/services/cats/core/round_plan_service.rb +23 -23
  122. data/app/services/cats/core/space_service.rb +11 -11
  123. data/app/services/cats/core/stack_service.rb +10 -10
  124. data/app/services/cats/core/token_auth_service.rb +4 -4
  125. data/app/services/cats/core/user_service.rb +19 -0
  126. data/app/utils/cats/core/util.rb +1 -1
  127. data/config/routes.rb +110 -105
  128. data/config/spring.rb +1 -0
  129. data/db/migrate/20210715114910_create_cats_core_users.rb +3 -3
  130. data/db/migrate/20210715120018_create_cats_core_roles.rb +14 -14
  131. data/db/migrate/20210715121244_create_cats_core_menus.rb +3 -3
  132. data/db/migrate/20210715122141_create_cats_core_menu_items.rb +3 -3
  133. data/db/migrate/20210715122423_create_cats_core_role_menus.rb +13 -13
  134. data/db/migrate/20210717031810_create_cats_core_plans.rb +4 -4
  135. data/db/migrate/20210717032024_create_cats_core_plan_items.rb +18 -18
  136. data/db/migrate/20210717032260_create_cats_core_beneficiary_categories.rb +3 -3
  137. data/db/migrate/20210717032270_create_cats_core_rations.rb +10 -10
  138. data/db/migrate/20210717032290_create_cats_core_beneficiary_plan_items.rb +7 -7
  139. data/db/migrate/20210717032295_create_cats_core_plan_item_details.rb +7 -7
  140. data/db/migrate/20210717032330_create_cats_core_commodity_donations.rb +12 -12
  141. data/db/migrate/20210717032408_create_cats_core_cash_donations.rb +6 -6
  142. data/db/migrate/20210717032602_create_cats_core_gift_certificates.rb +12 -12
  143. data/db/migrate/20210717032855_create_cats_core_purchase_orders.rb +12 -12
  144. data/db/migrate/20210717032927_create_cats_core_projects.rb +3 -3
  145. data/db/migrate/20210717033223_create_cats_core_commodities.rb +10 -10
  146. data/db/migrate/20210717140855_create_cats_core_stores.rb +3 -3
  147. data/db/migrate/20210717171101_create_cats_core_stacks.rb +11 -11
  148. data/db/migrate/20210718040129_create_cats_core_routes.rb +9 -9
  149. data/db/migrate/20210718042755_create_cats_core_rhn_requests.rb +6 -6
  150. data/db/migrate/20210718043328_create_cats_core_dispatch_plans.rb +7 -7
  151. data/db/migrate/20210718043401_create_cats_core_dispatch_plan_items.rb +17 -17
  152. data/db/migrate/20210718045516_create_cats_core_dispatches.rb +13 -13
  153. data/db/migrate/20210718055414_create_cats_core_dispatch_authorizations.rb +13 -13
  154. data/db/migrate/20210718202957_create_cats_core_dispatch_transactions.rb +11 -11
  155. data/db/migrate/20210727074646_create_cats_core_receipt_authorizations.rb +13 -13
  156. data/db/migrate/20210727105834_create_cats_core_receipts.rb +6 -6
  157. data/db/migrate/20210728041505_create_cats_core_lost_commodities.rb +6 -6
  158. data/db/migrate/20210814160628_create_cats_core_receipt_transactions.rb +10 -10
  159. data/db/migrate/20210814175406_create_cats_core_stack_transactions.rb +10 -10
  160. data/db/migrate/20211024063240_add_status_to_cats_core_rhn_requests.rb +1 -1
  161. data/db/migrate/20211030133752_add_status_to_cats_core_commodities.rb +1 -1
  162. data/db/migrate/20211215114737_create_cats_core_transport_plans.rb +4 -4
  163. data/db/migrate/20211215114835_create_cats_core_transport_plan_items.rb +9 -9
  164. data/db/migrate/20211215121151_create_cats_core_transport_bids.rb +4 -4
  165. data/db/migrate/20211215124452_create_cats_core_transport_bid_items.rb +10 -10
  166. data/db/migrate/20211229160125_create_cats_core_transport_offers.rb +7 -7
  167. data/db/migrate/20211229160126_create_cats_core_offer_items.rb +6 -6
  168. data/db/migrate/20211229160127_create_cats_core_transport_contracts.rb +6 -6
  169. data/db/migrate/20211229160128_create_cats_core_contract_items.rb +9 -9
  170. data/db/migrate/20211229160129_create_cats_core_commodity_substitutions.rb +10 -10
  171. data/db/migrate/20220103152802_create_cats_core_tenderers.rb +6 -6
  172. data/db/migrate/20220107121752_create_cats_core_round_plans.rb +7 -7
  173. data/db/migrate/20220107122280_create_cats_core_round_rations.rb +12 -12
  174. data/db/migrate/20220107125025_create_cats_core_round_plan_items.rb +19 -19
  175. data/db/migrate/20220107126025_create_cats_core_beneficiary_round_plan_items.rb +8 -8
  176. data/db/migrate/20220107132433_create_cats_core_round_plan_item_details.rb +9 -9
  177. data/db/migrate/20220209083928_create_cats_core_hub_authorizations.rb +12 -12
  178. data/db/migrate/20220416143416_create_cats_core_unit_conversions.rb +6 -6
  179. data/db/migrate/20220417105839_create_cats_core_transport_requisitions.rb +12 -12
  180. data/db/migrate/20220417123835_create_cats_core_transport_requisition_items.rb +9 -9
  181. data/db/migrate/20220417151821_create_cats_core_transport_requisition_details.rb +6 -6
  182. data/db/migrate/20220506082329_create_cats_core_transport_orders.rb +10 -10
  183. data/db/migrate/20220506083042_create_cats_core_transport_order_items.rb +13 -13
  184. data/db/migrate/20220511082354_create_cats_core_beneficiaries.rb +6 -6
  185. data/db/migrate/20220626063501_create_cats_core_loans.rb +6 -6
  186. data/db/migrate/20220626063757_create_cats_core_swaps.rb +12 -12
  187. data/db/migrate/20220626132050_create_cats_core_round_beneficiaries.rb +13 -13
  188. data/db/migrate/20220923190857_create_cats_core_application_settings.rb +3 -3
  189. data/lib/cats/core/engine.rb +4 -4
  190. data/lib/cats/core/version.rb +1 -1
  191. data/lib/cats_core.rb +8 -8
  192. data/spec/factories/cats/core/application_modules.rb +1 -1
  193. data/spec/factories/cats/core/application_settings.rb +1 -1
  194. data/spec/factories/cats/core/beneficiaries.rb +3 -3
  195. data/spec/factories/cats/core/beneficiary_categories.rb +1 -1
  196. data/spec/factories/cats/core/beneficiary_plan_items.rb +1 -1
  197. data/spec/factories/cats/core/beneficiary_round_plan_items.rb +1 -1
  198. data/spec/factories/cats/core/cash_donations.rb +1 -1
  199. data/spec/factories/cats/core/commodities.rb +1 -1
  200. data/spec/factories/cats/core/commodity_categories.rb +1 -1
  201. data/spec/factories/cats/core/commodity_donations.rb +1 -1
  202. data/spec/factories/cats/core/commodity_substitutions.rb +2 -2
  203. data/spec/factories/cats/core/contract_items.rb +1 -1
  204. data/spec/factories/cats/core/currencies.rb +1 -1
  205. data/spec/factories/cats/core/dispatch_authorizations.rb +7 -11
  206. data/spec/factories/cats/core/dispatch_plan_items.rb +16 -1
  207. data/spec/factories/cats/core/dispatch_plans.rb +1 -1
  208. data/spec/factories/cats/core/dispatch_transactions.rb +2 -4
  209. data/spec/factories/cats/core/dispatches.rb +16 -25
  210. data/spec/factories/cats/core/donors.rb +1 -1
  211. data/spec/factories/cats/core/gift_certificates.rb +1 -1
  212. data/spec/factories/cats/core/hub_authorizations.rb +1 -1
  213. data/spec/factories/cats/core/loans.rb +1 -1
  214. data/spec/factories/cats/core/locations.rb +6 -6
  215. data/spec/factories/cats/core/lost_commodities.rb +1 -1
  216. data/spec/factories/cats/core/menu_items.rb +1 -1
  217. data/spec/factories/cats/core/menus.rb +1 -1
  218. data/spec/factories/cats/core/notification_rules.rb +1 -1
  219. data/spec/factories/cats/core/notifications.rb +2 -2
  220. data/spec/factories/cats/core/offer_items.rb +1 -1
  221. data/spec/factories/cats/core/operators.rb +1 -1
  222. data/spec/factories/cats/core/plan_item_details.rb +1 -1
  223. data/spec/factories/cats/core/plan_items.rb +1 -1
  224. data/spec/factories/cats/core/plans.rb +1 -1
  225. data/spec/factories/cats/core/programs.rb +1 -1
  226. data/spec/factories/cats/core/projects.rb +1 -1
  227. data/spec/factories/cats/core/purchase_orders.rb +1 -1
  228. data/spec/factories/cats/core/rations.rb +1 -1
  229. data/spec/factories/cats/core/receipt_authorizations.rb +1 -1
  230. data/spec/factories/cats/core/receipt_transactions.rb +2 -2
  231. data/spec/factories/cats/core/receipts.rb +1 -1
  232. data/spec/factories/cats/core/rhn_requests.rb +1 -1
  233. data/spec/factories/cats/core/role_menus.rb +1 -1
  234. data/spec/factories/cats/core/roles.rb +1 -1
  235. data/spec/factories/cats/core/round_beneficiaries.rb +1 -1
  236. data/spec/factories/cats/core/round_plan_item_details.rb +3 -3
  237. data/spec/factories/cats/core/round_plan_items.rb +1 -1
  238. data/spec/factories/cats/core/round_plans.rb +1 -1
  239. data/spec/factories/cats/core/round_rations.rb +1 -1
  240. data/spec/factories/cats/core/routes.rb +1 -1
  241. data/spec/factories/cats/core/stack_transactions.rb +1 -1
  242. data/spec/factories/cats/core/stacking_rules.rb +1 -1
  243. data/spec/factories/cats/core/stacks.rb +1 -1
  244. data/spec/factories/cats/core/stores.rb +1 -1
  245. data/spec/factories/cats/core/suppliers.rb +1 -1
  246. data/spec/factories/cats/core/swaps.rb +1 -1
  247. data/spec/factories/cats/core/tenderers.rb +1 -1
  248. data/spec/factories/cats/core/transport_bid_items.rb +1 -1
  249. data/spec/factories/cats/core/transport_bids.rb +1 -1
  250. data/spec/factories/cats/core/transport_contracts.rb +1 -1
  251. data/spec/factories/cats/core/transport_offers.rb +1 -1
  252. data/spec/factories/cats/core/transport_order_items.rb +1 -1
  253. data/spec/factories/cats/core/transport_orders.rb +1 -1
  254. data/spec/factories/cats/core/transport_plan_items.rb +1 -1
  255. data/spec/factories/cats/core/transport_plans.rb +1 -1
  256. data/spec/factories/cats/core/transport_requisition_details.rb +1 -1
  257. data/spec/factories/cats/core/transport_requisition_items.rb +1 -1
  258. data/spec/factories/cats/core/transport_requisitions.rb +1 -1
  259. data/spec/factories/cats/core/transporters.rb +1 -1
  260. data/spec/factories/cats/core/unit_conversions.rb +1 -1
  261. data/spec/factories/cats/core/unit_of_measures.rb +1 -1
  262. data/spec/factories/cats/core/users.rb +2 -2
  263. metadata +19 -2
@@ -2,47 +2,47 @@ module Cats
2
2
  module Core
3
3
  class Stack < ApplicationRecord
4
4
  # Stack statuses
5
- RESERVED = 'Reserved'.freeze
6
- ALLOCATED = 'Allocated'.freeze
7
- DESTROYED = 'Destroyed'.freeze
5
+ RESERVED = "Reserved".freeze
6
+ ALLOCATED = "Allocated".freeze
7
+ DESTROYED = "Destroyed".freeze
8
8
  STACK_STATUSES = [RESERVED, ALLOCATED, DESTROYED].freeze
9
9
 
10
10
  belongs_to :commodity
11
11
  belongs_to :store
12
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
12
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
13
13
 
14
14
  has_many :dispatch_transactions, foreign_key: :source_id
15
15
  has_many :receipt_transactions, foreign_key: :destination_id
16
16
 
17
17
  validates :code, :length, :width, :height, :start_x, :start_y, :commodity_status, :stack_status,
18
- :quantity, presence: true
18
+ :quantity, presence: true
19
19
  validates :code, uniqueness: true
20
- validates :length, :width, :height, :start_x, :start_y, numericality: { greater_than: 0 }
21
- validates :quantity, numericality: { greater_than_or_equal_to: 0 }
22
- validates :commodity_status, inclusion: { in: Cats::Core::Commodity::COMMODITY_STATUSES }
23
- validates :stack_status, inclusion: { in: STACK_STATUSES }
20
+ validates :length, :width, :height, :start_x, :start_y, numericality: {greater_than: 0}
21
+ validates :quantity, numericality: {greater_than_or_equal_to: 0}
22
+ validates :commodity_status, inclusion: {in: Cats::Core::Commodity::COMMODITY_STATUSES}
23
+ validates :stack_status, inclusion: {in: STACK_STATUSES}
24
24
  validate :validate_coordinates, :validate_dimensions, :validate_distance_from_wall, :validate_overlap,
25
- :validate_space_between_stack, :validate_max_height, :validate_max_length, :validate_max_width,
26
- :validate_distance_from_ceiling,
27
- unless: -> { store && (store.code == 'SUP-STORE' || store.code.start_with?('FDP-ST')) }
25
+ :validate_space_between_stack, :validate_max_height, :validate_max_length, :validate_max_width,
26
+ :validate_distance_from_ceiling,
27
+ unless: -> { store && (store.code == "SUP-STORE" || store.code.start_with?("FDP-ST")) }
28
28
 
29
29
  delegate :batch_no, to: :commodity, prefix: true
30
30
  delegate :abbreviation, to: :unit, prefix: true
31
31
 
32
- after_save :update_store_space, :destroy_stack
32
+ after_save :update_store_space
33
33
 
34
34
  def validate_coordinates
35
35
  return unless store.present? && length.present? && width.present? && start_x.present? && start_y.present?
36
36
 
37
- errors.add(:start_x, 'cannot exceed length') if start_x.present? && start_x > store.length
38
- errors.add(:start_y, 'cannot exceed width') if start_y.present? && start_y > store.width
37
+ errors.add(:start_x, "cannot exceed length") if start_x.present? && start_x > store.length
38
+ errors.add(:start_y, "cannot exceed width") if start_y.present? && start_y > store.width
39
39
  end
40
40
 
41
41
  def validate_dimensions
42
42
  return unless store.present? && length.present? && width.present? && start_x.present? && start_y.present?
43
43
 
44
- errors.add(:length, 'cannot exceed store length') if start_x + length > store.length
45
- errors.add(:width, 'cannot exceed store width') if start_y + width > store.width
44
+ errors.add(:length, "cannot exceed store length") if start_x + length > store.length
45
+ errors.add(:width, "cannot exceed store width") if start_y + width > store.width
46
46
  end
47
47
 
48
48
  def stacking_rules
@@ -66,9 +66,9 @@ module Cats
66
66
 
67
67
  rule = stacking_rules
68
68
  if start_x < rule.distance_from_wall || store.length - (start_x + length) < rule.distance_from_wall ||
69
- store.width - (start_y + width) < rule.distance_from_wall || start_y < rule.distance_from_wall
69
+ store.width - (start_y + width) < rule.distance_from_wall || start_y < rule.distance_from_wall
70
70
  errors.add(:base,
71
- message: "The stack must be placed #{rule.distance_from_wall} meter away from a store wall")
71
+ message: "The stack must be placed #{rule.distance_from_wall} meter away from a store wall")
72
72
  end
73
73
  end
74
74
 
@@ -89,9 +89,9 @@ module Cats
89
89
  rule = stacking_rules
90
90
  new_stack = dup
91
91
  new_stack.assign_attributes(start_x: start_x - rule.space_between_stack,
92
- start_y: start_y - rule.space_between_stack,
93
- length: length + (2 * rule.space_between_stack),
94
- width: width + (2 * rule.space_between_stack))
92
+ start_y: start_y - rule.space_between_stack,
93
+ length: length + (2 * rule.space_between_stack),
94
+ width: width + (2 * rule.space_between_stack))
95
95
  stacks.each do |s|
96
96
  errors.add(:base, message: "#{code} overlaps with #{s.code}") if overlaps?(new_stack, s)
97
97
  end
@@ -100,19 +100,19 @@ module Cats
100
100
  def validate_max_height
101
101
  return unless height
102
102
 
103
- errors.add(:height, 'exceeds stacking rule height.') if height > stacking_rules.maximum_height
103
+ errors.add(:height, "exceeds stacking rule height.") if height > stacking_rules.maximum_height
104
104
  end
105
105
 
106
106
  def validate_max_length
107
107
  return unless length
108
108
 
109
- errors.add(:length, 'exceeds stacking rule length.') if length > stacking_rules.maximum_length
109
+ errors.add(:length, "exceeds stacking rule length.") if length > stacking_rules.maximum_length
110
110
  end
111
111
 
112
112
  def validate_max_width
113
113
  return unless width
114
114
 
115
- errors.add(:width, 'exceeds stacking rule width.') if width > stacking_rules.maximum_width
115
+ errors.add(:width, "exceeds stacking rule width.") if width > stacking_rules.maximum_width
116
116
  end
117
117
 
118
118
  def validate_distance_from_ceiling
@@ -120,7 +120,7 @@ module Cats
120
120
 
121
121
  return unless store.height - height < stacking_rules.distance_from_ceiling
122
122
 
123
- errors.add(:height, 'of stack is close to the ceiling.')
123
+ errors.add(:height, "of stack is close to the ceiling.")
124
124
  end
125
125
 
126
126
  # A method that checks if an overlap exists b/n two stacks.
@@ -140,10 +140,10 @@ module Cats
140
140
  return unless length_previously_changed? || width_previously_changed? || stack_status_previously_changed?
141
141
 
142
142
  old_area = if length_previously_was.nil? && width_previously_was.nil?
143
- 0
144
- else
145
- length_previously_was * width_previously_was
146
- end
143
+ 0
144
+ else
145
+ length_previously_was * width_previously_was
146
+ end
147
147
 
148
148
  store.available_space += old_area
149
149
  store.available_space -= length * width unless stack_status == DESTROYED
@@ -154,7 +154,7 @@ module Cats
154
154
  def self.search_commodity(batch_no)
155
155
  commodity = Commodity.find_by(batch_no: batch_no)
156
156
  stacks = Stack.joins(:commodity, store: :warehouse).where(
157
- commodity: { batch_no: batch_no },
157
+ commodity: {batch_no: batch_no},
158
158
  stack_status: Stack::ALLOCATED
159
159
  )
160
160
  stacks.map do |stack|
@@ -171,10 +171,28 @@ module Cats
171
171
  end
172
172
 
173
173
  def destroy_stack
174
- return unless stack_status == Cats::Core::Stack::ALLOCATED && quantity.zero?
174
+ if stack_status == Cats::Core::Stack::RESERVED || quantity.zero?
175
+ self.stack_status = Cats::Core::Stack::DESTROYED
176
+ save!
177
+ else
178
+ raise(StandardError, "Stack has to be either RESERVED or with zero quantity to be destroyed.")
179
+ end
180
+ end
175
181
 
176
- self.stack_status = Cats::Core::Stack::DESTROYED
177
- save!
182
+ def self.ransackable_attributes(auth_object = nil)
183
+ [
184
+ "commodity_id",
185
+ "commodity_status",
186
+ "height",
187
+ "length",
188
+ "quantity",
189
+ "stack_status",
190
+ "start_x",
191
+ "start_y",
192
+ "store_id",
193
+ "unit_id",
194
+ "width"
195
+ ]
178
196
  end
179
197
  end
180
198
  end
@@ -1,9 +1,9 @@
1
1
  module Cats
2
2
  module Core
3
3
  class StackTransaction < Transaction
4
- belongs_to :source, class_name: 'Cats::Core::Stack'
5
- belongs_to :destination, class_name: 'Cats::Core::Stack'
6
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
4
+ belongs_to :source, class_name: "Cats::Core::Stack"
5
+ belongs_to :destination, class_name: "Cats::Core::Stack"
6
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
7
7
 
8
8
  def validate_quantity
9
9
  return unless quantity.present? && source.present?
@@ -2,14 +2,14 @@ module Cats
2
2
  module Core
3
3
  class StackingRule < ApplicationRecord
4
4
  validates :distance_from_wall, :space_between_stack, :distance_from_ceiling, :maximum_height, :maximum_length,
5
- :maximum_width, :distance_from_gangway, presence: true, numericality: { greater_than: 0 }
5
+ :maximum_width, :distance_from_gangway, presence: true, numericality: {greater_than: 0}
6
6
  validate :validate_only_a_record_exist
7
7
 
8
8
  def validate_only_a_record_exist
9
9
  return unless StackingRule.count > 1
10
10
 
11
11
  errors.add(:base,
12
- 'There is already a stacking rule entry. A new rule can not be added')
12
+ "There is already a stacking rule entry. A new rule can not be added")
13
13
  end
14
14
  end
15
15
  end
@@ -1,18 +1,18 @@
1
1
  module Cats
2
2
  module Core
3
3
  class Store < ApplicationRecord
4
- belongs_to :warehouse, class_name: 'Cats::Core::Location'
4
+ belongs_to :warehouse, class_name: "Cats::Core::Location"
5
5
  has_many :stacks
6
6
 
7
7
  validates :code, :name, :length, :width, :height, presence: true
8
8
  validates :code, uniqueness: true
9
- validates :length, :width, :height, numericality: { greater_than: 0 }
9
+ validates :length, :width, :height, numericality: {greater_than: 0}
10
10
  validates :gangway_length, :gangway_width, :gangway_corner_dist, presence: true, if: :has_gangway?
11
11
  validates :gangway_length,
12
- :gangway_width,
13
- :gangway_corner_dist,
14
- numericality: { greater_than: 0 },
15
- allow_nil: true
12
+ :gangway_width,
13
+ :gangway_corner_dist,
14
+ numericality: {greater_than: 0},
15
+ allow_nil: true
16
16
  validate :validate_location
17
17
 
18
18
  before_create :update_usable_space
@@ -20,7 +20,7 @@ module Cats
20
20
  def validate_location
21
21
  return if warehouse.nil?
22
22
 
23
- errors.add(:warehouse, 'must be a valid warehouse') unless warehouse.location_type == Location::WAREHOUSE
23
+ errors.add(:warehouse, "must be a valid warehouse") unless warehouse.location_type == Location::WAREHOUSE
24
24
  end
25
25
 
26
26
  def update_usable_space
@@ -28,6 +28,28 @@ module Cats
28
28
  self.usable_space -= (gangway_length * gangway_width) if has_gangway
29
29
  self.available_space = self.usable_space
30
30
  end
31
+
32
+ def self.ransackable_attributes(auth_object = nil)
33
+ [
34
+ "available_space",
35
+ "code",
36
+ "gangway_corner_dist",
37
+ "gangway_length",
38
+ "gangway_width",
39
+ "has_gangway",
40
+ "height",
41
+ "length",
42
+ "name",
43
+ "temporary",
44
+ "usable_space",
45
+ "warehouse_id",
46
+ "width"
47
+ ]
48
+ end
49
+
50
+ def self.ransackable_associations(auth_object = nil)
51
+ ["stacks", "warehouse"]
52
+ end
31
53
  end
32
54
  end
33
55
  end
@@ -1,14 +1,14 @@
1
1
  module Cats
2
2
  module Core
3
3
  class Swap < ApplicationRecord
4
- belongs_to :issued_commodity, class_name: 'CommodityCategory'
5
- belongs_to :issued_unit, class_name: 'UnitOfMeasure'
6
- belongs_to :received_commodity, class_name: 'CommodityCategory'
7
- belongs_to :received_unit, class_name: 'UnitOfMeasure'
4
+ belongs_to :issued_commodity, class_name: "CommodityCategory"
5
+ belongs_to :issued_unit, class_name: "UnitOfMeasure"
6
+ belongs_to :received_commodity, class_name: "CommodityCategory"
7
+ belongs_to :received_unit, class_name: "UnitOfMeasure"
8
8
 
9
9
  validates :reference_no, presence: true, uniqueness: true
10
10
  validates :swapper, :agreement_date, :issued_quantity, :received_quantity, presence: true
11
- validates :issued_quantity, :received_quantity, presence: true, numericality: { greater_than: 0 }
11
+ validates :issued_quantity, :received_quantity, presence: true, numericality: {greater_than: 0}
12
12
 
13
13
  delegate(:name, to: :issued_commodity, prefix: true)
14
14
  delegate(:name, to: :received_commodity, prefix: true)
@@ -5,20 +5,20 @@ module Cats
5
5
  after_initialize :set_status
6
6
 
7
7
  # Transaction statuses
8
- DRAFT = 'Draft'.freeze
9
- COMMITTED = 'Committed'.freeze
8
+ DRAFT = "Draft".freeze
9
+ COMMITTED = "Committed".freeze
10
10
  STATUSES = [DRAFT, COMMITTED].freeze
11
11
 
12
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
12
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
13
13
 
14
14
  validates :transaction_date, :quantity, :status, presence: true
15
- validates :quantity, numericality: { greater_than: 0 }
16
- validates :status, inclusion: { in: STATUSES }
15
+ validates :quantity, numericality: {greater_than: 0}
16
+ validates :status, inclusion: {in: STATUSES}
17
17
 
18
18
  delegate(:abbreviation, to: :unit, prefix: true)
19
19
 
20
20
  def commit
21
- raise(NotImplementedError, 'Method should be implemented in child classes.')
21
+ raise(NotImplementedError, "Method should be implemented in child classes.")
22
22
  end
23
23
 
24
24
  def set_status
@@ -1,36 +1,36 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportBid < ApplicationRecord
4
- NEW = 'New'.freeze
5
- OPEN = 'Open'.freeze
6
- CLOSED = 'Closed'.freeze
7
- RANKED = 'Ranked'.freeze
8
- WINNERS_DECLARED = 'Winner Declared'.freeze
4
+ NEW = "New".freeze
5
+ OPEN = "Open".freeze
6
+ CLOSED = "Closed".freeze
7
+ RANKED = "Ranked".freeze
8
+ WINNERS_DECLARED = "Winner Declared".freeze
9
9
  STATUSES = [NEW, OPEN, CLOSED, RANKED, WINNERS_DECLARED].freeze
10
10
 
11
11
  has_many :transport_bid_items
12
12
  has_many :transport_offers
13
13
  has_many :offer_items, through: :transport_offers
14
14
  has_many :tenderers
15
- belongs_to :region, class_name: 'Cats::Core::Location', optional: true
15
+ belongs_to :region, class_name: "Cats::Core::Location", optional: true
16
16
  belongs_to :transport_plan
17
17
 
18
18
  validates :reference_no, presence: true, uniqueness: true
19
19
  validates :start_date, :end_date, :opening_date, :status, :bid_bond_amount, presence: true
20
- validates :bid_bond_amount, numericality: { greater_than_or_equal_to: 0 }
21
- validates :status, inclusion: { in: STATUSES }
20
+ validates :bid_bond_amount, numericality: {greater_than_or_equal_to: 0}
21
+ validates :status, inclusion: {in: STATUSES}
22
22
  validate :validate_start_date_against_end_date
23
23
 
24
24
  def validate_start_date_against_end_date
25
25
  return unless start_date && end_date
26
26
 
27
- errors.add(:start_date, 'should be before end date.') if start_date >= end_date
27
+ errors.add(:start_date, "should be before end date.") if start_date >= end_date
28
28
  end
29
29
 
30
30
  def open
31
- raise(StandardError, 'Bid is already open.') if status == OPEN
31
+ raise(StandardError, "Bid is already open.") if status == OPEN
32
32
 
33
- raise(StandardError, 'Bid is empty.') if transport_bid_items.count.zero?
33
+ raise(StandardError, "Bid is empty.") if transport_bid_items.count.zero?
34
34
 
35
35
  self.status = OPEN
36
36
  save!
@@ -38,9 +38,9 @@ module Cats
38
38
  end
39
39
 
40
40
  def close
41
- raise(StandardError, 'Bid is already closed.') if status == CLOSED
41
+ raise(StandardError, "Bid is already closed.") if status == CLOSED
42
42
 
43
- raise(StandardError, 'Bid should first be open.') if status == NEW
43
+ raise(StandardError, "Bid should first be open.") if status == NEW
44
44
 
45
45
  self.status = CLOSED
46
46
  save!
@@ -3,11 +3,11 @@ module Cats
3
3
  class TransportBidItem < ApplicationRecord
4
4
  belongs_to :transport_bid
5
5
  belongs_to :transport_plan_item
6
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
6
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
7
7
 
8
8
  has_many :offer_items
9
9
 
10
- validates :quantity, presence: true, numericality: { greater_than: 0 }
10
+ validates :quantity, presence: true, numericality: {greater_than: 0}
11
11
  validates :transport_plan_item_id, uniqueness: true
12
12
 
13
13
  delegate(:reference_no, to: :transport_bid, prefix: true)
@@ -6,11 +6,11 @@ module Cats
6
6
  has_many :offer_items
7
7
 
8
8
  validates :offer_date, :bid_bond_amount, presence: true
9
- validates :bid_bond_amount, numericality: { greater_than_or_equal_to: 0 }
10
- validates :transport_bid_id, uniqueness: { scope: :transporter_id }
9
+ validates :bid_bond_amount, numericality: {greater_than_or_equal_to: 0}
10
+ validates :transport_bid_id, uniqueness: {scope: :transporter_id}
11
11
 
12
12
  delegate(:name, to: :transporter, prefix: true)
13
- delegate(:reference_no, to: :transport_bid, prefix: 'bid')
13
+ delegate(:reference_no, to: :transport_bid, prefix: "bid")
14
14
  end
15
15
  end
16
16
  end
@@ -1,30 +1,30 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportOrder < ApplicationRecord
4
- DRAFT = 'Draft'.freeze
5
- APPROVED = 'Approved'.freeze
4
+ DRAFT = "Draft".freeze
5
+ APPROVED = "Approved".freeze
6
6
  STATUSES = [DRAFT, APPROVED].freeze
7
7
 
8
8
  belongs_to :transport_requisition
9
- belongs_to :prepared_by, class_name: 'Cats::Core::User'
10
- belongs_to :approved_by, class_name: 'Cats::Core::User', optional: true
9
+ belongs_to :prepared_by, class_name: "Cats::Core::User"
10
+ belongs_to :approved_by, class_name: "Cats::Core::User", optional: true
11
11
 
12
12
  has_many :transport_order_items
13
13
 
14
- validates :status, presence: true, inclusion: { in: STATUSES }
14
+ validates :status, presence: true, inclusion: {in: STATUSES}
15
15
  validates :order_date, presence: true
16
16
  validate :validate_against_requisition, :validate_status
17
17
 
18
18
  delegate(:full_name, to: :prepared_by, prefix: true)
19
19
  delegate(:full_name, to: :approved_by, prefix: true, allow_nil: true)
20
- delegate(:reference_no, to: :transport_requisition, prefix: 'requisition')
20
+ delegate(:reference_no, to: :transport_requisition, prefix: "requisition")
21
21
 
22
22
  def validate_against_requisition
23
23
  return unless transport_requisition
24
24
 
25
25
  return if transport_requisition.approved?
26
26
 
27
- errors.add(:transport_requisition, 'is not approved.')
27
+ errors.add(:transport_requisition, "is not approved.")
28
28
  end
29
29
 
30
30
  def validate_status
@@ -38,7 +38,7 @@ module Cats
38
38
  end
39
39
 
40
40
  def approve(user)
41
- raise(StandardError, 'Transport order is already approved.') if status == APPROVED
41
+ raise(StandardError, "Transport order is already approved.") if status == APPROVED
42
42
 
43
43
  begin
44
44
  self.status = APPROVED
@@ -7,7 +7,7 @@ module Cats
7
7
  belongs_to :transport_contract, optional: true
8
8
 
9
9
  validates :valid_for, presence: true
10
- validates :valid_for, numericality: { greater_than: 0 }
10
+ validates :valid_for, numericality: {greater_than: 0}
11
11
  validates :transport_requisition_item_id, uniqueness: true
12
12
  validate :validate_requisition
13
13
 
@@ -21,7 +21,7 @@ module Cats
21
21
 
22
22
  return if transport_order.transport_requisition_id == transport_requisition_item.transport_requisition_id
23
23
 
24
- errors.add(:transport_requisition_item, 'does not belong to the requisition of the order.')
24
+ errors.add(:transport_requisition_item, "does not belong to the requisition of the order.")
25
25
  end
26
26
  end
27
27
  end
@@ -2,15 +2,15 @@ module Cats
2
2
  module Core
3
3
  class TransportPlan < ApplicationRecord
4
4
  # Plan types
5
- REGIONAL = 'Regional'.freeze
6
- NON_REGIONAL = 'Non Regional'.freeze
5
+ REGIONAL = "Regional".freeze
6
+ NON_REGIONAL = "Non Regional".freeze
7
7
  PLAN_TYPES = [REGIONAL, NON_REGIONAL].freeze
8
8
 
9
- belongs_to :region, class_name: 'Cats::Core::Location', optional: true
9
+ belongs_to :region, class_name: "Cats::Core::Location", optional: true
10
10
  has_many :transport_plan_items
11
11
 
12
12
  validates :reference_no, presence: true, uniqueness: true
13
- validates :plan_type, presence: true, inclusion: { in: PLAN_TYPES }
13
+ validates :plan_type, presence: true, inclusion: {in: PLAN_TYPES}
14
14
  validate :validate_region
15
15
 
16
16
  delegate(:name, to: :region, prefix: true)
@@ -18,11 +18,11 @@ module Cats
18
18
  def validate_region
19
19
  return unless plan_type
20
20
 
21
- errors.add(:region, 'should be null.') if plan_type == NON_REGIONAL && region
21
+ errors.add(:region, "should be null.") if plan_type == NON_REGIONAL && region
22
22
 
23
- errors.add(:region, 'should not be null.') if plan_type == REGIONAL && !region
23
+ errors.add(:region, "should not be null.") if plan_type == REGIONAL && !region
24
24
 
25
- errors.add(:region, 'is not valid.') if region && region.location_type != Location::REGION
25
+ errors.add(:region, "is not valid.") if region && region.location_type != Location::REGION
26
26
  end
27
27
  end
28
28
  end
@@ -3,9 +3,9 @@ module Cats
3
3
  class TransportPlanItem < ApplicationRecord
4
4
  belongs_to :route
5
5
  belongs_to :transport_plan
6
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
6
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
7
7
 
8
- validates :quantity, presence: true, numericality: { greater_than: 0 }
8
+ validates :quantity, presence: true, numericality: {greater_than: 0}
9
9
 
10
10
  delegate(:name, to: :route, prefix: true)
11
11
  delegate(:name, to: :unit, prefix: true)
@@ -1,23 +1,23 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TransportRequisition < ApplicationRecord
4
- DRAFT = 'Draft'.freeze
5
- APPROVED = 'Approved'.freeze
4
+ DRAFT = "Draft".freeze
5
+ APPROVED = "Approved".freeze
6
6
  STATUSES = [DRAFT, APPROVED].freeze
7
7
 
8
8
  belongs_to :dispatch_plan
9
- belongs_to :requested_by, class_name: 'Cats::Core::User'
10
- belongs_to :approved_by, class_name: 'Cats::Core::User', optional: true
11
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
9
+ belongs_to :requested_by, class_name: "Cats::Core::User"
10
+ belongs_to :approved_by, class_name: "Cats::Core::User", optional: true
11
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
12
12
 
13
13
  has_many :transport_requisition_items
14
14
 
15
15
  validates :reference_no, presence: true, uniqueness: true
16
- validates :status, presence: true, inclusion: { in: STATUSES }
16
+ validates :status, presence: true, inclusion: {in: STATUSES}
17
17
  validate :validate_status
18
18
 
19
- delegate(:full_name, to: :requested_by, prefix: 'requestor')
20
- delegate(:full_name, to: :approved_by, prefix: 'approver', allow_nil: true)
19
+ delegate(:full_name, to: :requested_by, prefix: "requestor")
20
+ delegate(:full_name, to: :approved_by, prefix: "approver", allow_nil: true)
21
21
  delegate(:abbreviation, to: :unit, prefix: true)
22
22
  delegate(:reference_no, to: :dispatch_plan, prefix: true)
23
23
  delegate(:region, to: :dispatch_plan)
@@ -28,7 +28,7 @@ module Cats
28
28
  end
29
29
 
30
30
  def approve(user)
31
- raise(StandardError, 'Transport requisition is already approved.') if status == APPROVED
31
+ raise(StandardError, "Transport requisition is already approved.") if status == APPROVED
32
32
 
33
33
  begin
34
34
  self.status = APPROVED
@@ -2,9 +2,9 @@ module Cats
2
2
  module Core
3
3
  class TransportRequisitionDetail < ApplicationRecord
4
4
  belongs_to :transport_requisition_item
5
- belongs_to :fdp, class_name: 'Cats::Core::Location'
5
+ belongs_to :fdp, class_name: "Cats::Core::Location"
6
6
 
7
- validates :quantity, presence: true, numericality: { greater_than: 0 }
7
+ validates :quantity, presence: true, numericality: {greater_than: 0}
8
8
 
9
9
  delegate(:name, to: :fdp, prefix: true)
10
10
  end
@@ -3,11 +3,11 @@ module Cats
3
3
  class TransportRequisitionItem < ApplicationRecord
4
4
  belongs_to :transport_requisition
5
5
  belongs_to :dispatch_plan_item
6
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
6
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
7
7
 
8
- validates :quantity, presence: true, numericality: { greater_than: 0 }
8
+ validates :quantity, presence: true, numericality: {greater_than: 0}
9
9
 
10
- delegate(:reference_no, to: :transport_requisition, prefix: 'requisition')
10
+ delegate(:reference_no, to: :transport_requisition, prefix: "requisition")
11
11
  delegate(:abbreviation, to: :unit, prefix: true)
12
12
  delegate(:source_name, to: :dispatch_plan_item, prefix: false)
13
13
 
@@ -3,6 +3,10 @@ module Cats
3
3
  class Transporter < ApplicationRecord
4
4
  validates :code, :name, :address, :contact_phone, presence: true
5
5
  validates :code, uniqueness: true
6
+
7
+ def self.ransackable_attributes(auth_object = nil)
8
+ ["address", "code", "contact_phone", "name"]
9
+ end
6
10
  end
7
11
  end
8
12
  end
@@ -1,12 +1,12 @@
1
1
  module Cats
2
2
  module Core
3
3
  class UnitConversion < ApplicationRecord
4
- belongs_to :from, class_name: 'Cats::Core::UnitOfMeasure'
5
- belongs_to :to, class_name: 'Cats::Core::UnitOfMeasure'
4
+ belongs_to :from, class_name: "Cats::Core::UnitOfMeasure"
5
+ belongs_to :to, class_name: "Cats::Core::UnitOfMeasure"
6
6
 
7
7
  validates :factor, presence: true
8
- validates :from_id, uniqueness: { scope: :to_id }
9
- validates :factor, numericality: { greater_than: 0 }
8
+ validates :from_id, uniqueness: {scope: :to_id}
9
+ validates :factor, numericality: {greater_than: 0}
10
10
 
11
11
  delegate(:abbreviation, to: :from, prefix: true)
12
12
  delegate(:abbreviation, to: :to, prefix: true)
@@ -1,13 +1,13 @@
1
1
  module Cats
2
2
  module Core
3
3
  class UnitOfMeasure < ApplicationRecord
4
- WEIGHT = 'Weight'.freeze
5
- VOLUME = 'Volume'.freeze
6
- ITEM = 'Item'.freeze
4
+ WEIGHT = "Weight".freeze
5
+ VOLUME = "Volume".freeze
6
+ ITEM = "Item".freeze
7
7
  UNIT_TYPES = [WEIGHT, VOLUME, ITEM].freeze
8
8
 
9
9
  validates :name, :abbreviation, presence: true, uniqueness: true
10
- validates :unit_type, presence: true, inclusion: { in: UNIT_TYPES }
10
+ validates :unit_type, presence: true, inclusion: {in: UNIT_TYPES}
11
11
  end
12
12
  end
13
13
  end