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
@@ -1,12 +1,12 @@
1
1
  module Cats
2
2
  module Core
3
3
  class Location < ApplicationRecord
4
- REGION = 'Region'.freeze
5
- ZONE = 'Zone'.freeze
6
- WOREDA = 'Woreda'.freeze
7
- FDP = 'Fdp'.freeze
8
- HUB = 'Hub'.freeze
9
- WAREHOUSE = 'Warehouse'.freeze
4
+ REGION = "Region".freeze
5
+ ZONE = "Zone".freeze
6
+ WOREDA = "Woreda".freeze
7
+ FDP = "Fdp".freeze
8
+ HUB = "Hub".freeze
9
+ WAREHOUSE = "Warehouse".freeze
10
10
 
11
11
  LOCATION_TYPES = [REGION, ZONE, WOREDA, FDP, HUB, WAREHOUSE].freeze
12
12
 
@@ -14,7 +14,7 @@ module Cats
14
14
 
15
15
  validates :code, :name, :location_type, presence: true
16
16
  validates :code, uniqueness: true
17
- validates :location_type, inclusion: { in: LOCATION_TYPES }
17
+ validates :location_type, inclusion: {in: LOCATION_TYPES}
18
18
  validate :validate_location_parent
19
19
 
20
20
  delegate(:code, to: :parent, prefix: true, allow_nil: true)
@@ -35,7 +35,7 @@ module Cats
35
35
  return if location_type == REGION && parent.nil?
36
36
 
37
37
  # Check that parent is not nil for locations other than region
38
- errors.add(:location, 'parent cannot be empty') if location_type != REGION && parent.nil?
38
+ errors.add(:location, "parent cannot be empty") if location_type != REGION && parent.nil?
39
39
 
40
40
  # At this point, we may return if parent.nil? is true
41
41
  # because the above statement already took care of that.
@@ -53,6 +53,10 @@ module Cats
53
53
 
54
54
  Store.find_by(code: "FDP-ST-#{code}")
55
55
  end
56
+
57
+ def self.ransackable_attributes(auth_object = nil)
58
+ ["code", "location_type", "name"]
59
+ end
56
60
  end
57
61
  end
58
62
  end
@@ -4,9 +4,9 @@ module Cats
4
4
  before_validation :set_unit
5
5
 
6
6
  belongs_to :receipt_authorization
7
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
7
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
8
8
 
9
- validates :quantity, presence: true, numericality: { greater_than: 0 }
9
+ validates :quantity, presence: true, numericality: {greater_than: 0}
10
10
  validate :validate_quantity
11
11
 
12
12
  delegate(:abbreviation, to: :unit, prefix: true)
@@ -6,11 +6,11 @@ module Cats
6
6
  belongs_to :recipient, polymorphic: true
7
7
 
8
8
  def message
9
- { id: id, read: !read_at.nil?, created_at: created_at }.merge(to_notification.message)
9
+ {id: id, read: !read_at.nil?, created_at: created_at}.merge(to_notification.message)
10
10
  end
11
11
 
12
12
  def self.messages(notifications)
13
- notifications.includes(:recipient).map(&:message)
13
+ notifications.map(&:message)
14
14
  end
15
15
  end
16
16
  end
@@ -4,14 +4,14 @@ module Cats
4
4
  belongs_to :transport_offer
5
5
  belongs_to :transport_bid_item
6
6
 
7
- validates :price, presence: true, numericality: { greater_than_or_equal_to: 0 }
8
- validates :rank, numericality: { greater_than: 0 }, allow_nil: true
7
+ validates :price, presence: true, numericality: {greater_than_or_equal_to: 0}
8
+ validates :rank, numericality: {greater_than: 0}, allow_nil: true
9
9
  validate :validate_rank_is_set_for_winner
10
10
 
11
11
  delegate(:route, to: :transport_bid_item)
12
12
 
13
13
  def mark_as_winner(rank)
14
- raise(StandardError, 'Offer item already marked as winner.') if winner
14
+ raise(StandardError, "Offer item already marked as winner.") if winner
15
15
 
16
16
  self.rank = rank
17
17
  self.winner = true
@@ -21,7 +21,7 @@ module Cats
21
21
  def validate_rank_is_set_for_winner
22
22
  return if rank
23
23
 
24
- errors.add(:winner, 'cannot be set for a non-ranked offer item.') if winner
24
+ errors.add(:winner, "cannot be set for a non-ranked offer item.") if winner
25
25
  end
26
26
  end
27
27
  end
@@ -1,15 +1,15 @@
1
1
  module Cats
2
2
  module Core
3
3
  class Plan < ApplicationRecord
4
- DRAFT = 'Draft'.freeze
5
- APPROVED = 'Approved'.freeze
6
- NEEDS_APPROVED = 'Needs Approved'.freeze
4
+ DRAFT = "Draft".freeze
5
+ APPROVED = "Approved".freeze
6
+ NEEDS_APPROVED = "Needs Approved".freeze
7
7
 
8
8
  STATUSES = [DRAFT, APPROVED, NEEDS_APPROVED].freeze
9
9
 
10
- BELG = 'Belg'.freeze
11
- MEHER = 'Meher'.freeze
12
- ANNUAL = 'Annual'.freeze
10
+ BELG = "Belg".freeze
11
+ MEHER = "Meher".freeze
12
+ ANNUAL = "Annual".freeze
13
13
  SEASONS = [BELG, MEHER, ANNUAL].freeze
14
14
 
15
15
  belongs_to :program
@@ -23,10 +23,10 @@ module Cats
23
23
  delegate(:code, to: :program, prefix: true)
24
24
 
25
25
  validates :reference_no, :year, :status, presence: true
26
- validates :total_days, :rounds, presence: true, numericality: { greater_than: 0 }
27
- validates :season, presence: true, inclusion: { in: SEASONS }
26
+ validates :total_days, :rounds, presence: true, numericality: {greater_than: 0}
27
+ validates :season, presence: true, inclusion: {in: SEASONS}
28
28
  validates :reference_no, uniqueness: true
29
- validates :status, inclusion: { in: STATUSES }
29
+ validates :status, inclusion: {in: STATUSES}
30
30
 
31
31
  def no_of_round_days
32
32
  total_days / rounds
@@ -3,16 +3,16 @@ module Cats
3
3
  class PlanItem < ApplicationRecord
4
4
  belongs_to :plan
5
5
 
6
- belongs_to :region, -> { where(location_type: Cats::Core::Location::REGION) }, class_name: 'Cats::Core::Location'
7
- belongs_to :zone, -> { where(location_type: Cats::Core::Location::ZONE) }, class_name: 'Cats::Core::Location'
8
- belongs_to :woreda, -> { where(location_type: Cats::Core::Location::WOREDA) }, class_name: 'Cats::Core::Location'
9
- belongs_to :fdp, -> { where(location_type: Cats::Core::Location::FDP) }, class_name: 'Cats::Core::Location'
6
+ belongs_to :region, -> { where(location_type: Cats::Core::Location::REGION) }, class_name: "Cats::Core::Location"
7
+ belongs_to :zone, -> { where(location_type: Cats::Core::Location::ZONE) }, class_name: "Cats::Core::Location"
8
+ belongs_to :woreda, -> { where(location_type: Cats::Core::Location::WOREDA) }, class_name: "Cats::Core::Location"
9
+ belongs_to :fdp, -> { where(location_type: Cats::Core::Location::FDP) }, class_name: "Cats::Core::Location"
10
10
  belongs_to :operator
11
11
 
12
12
  has_many :beneficiary_plan_items
13
13
  has_many :plan_item_details, through: :beneficiary_plan_items
14
14
 
15
- validates :plan_id, uniqueness: { scope: :fdp_id }
15
+ validates :plan_id, uniqueness: {scope: :fdp_id}
16
16
 
17
17
  delegate(:name, to: :region, prefix: true)
18
18
  delegate(:name, to: :zone, prefix: true)
@@ -4,8 +4,8 @@ module Cats
4
4
  belongs_to :beneficiary_plan_item
5
5
  belongs_to :ration
6
6
 
7
- validates :quantity, presence: true, numericality: { greater_than: 0 }
8
- validates :beneficiary_plan_item_id, uniqueness: { scope: :ration_id }
7
+ validates :quantity, presence: true, numericality: {greater_than: 0}
8
+ validates :beneficiary_plan_item_id, uniqueness: {scope: :ration_id}
9
9
  end
10
10
  end
11
11
  end
@@ -6,7 +6,7 @@ module Cats
6
6
 
7
7
  validates :code, presence: true, uniqueness: true
8
8
  validates :year, :implementing_agency, presence: true
9
- validates :year, numericality: { greater_than: 2000 }
9
+ validates :year, numericality: {greater_than: 2000}
10
10
 
11
11
  delegate(:code, to: :program, prefix: true)
12
12
  delegate(:reference_no, to: :source, prefix: true)
@@ -1,19 +1,19 @@
1
1
  module Cats
2
2
  module Core
3
3
  class PurchaseOrder < ApplicationRecord
4
- LOCAL = 'Local'.freeze
5
- FOREIGN = 'Foreign'.freeze
4
+ LOCAL = "Local".freeze
5
+ FOREIGN = "Foreign".freeze
6
6
  PURCHASE_TYPES = [LOCAL, FOREIGN].freeze
7
7
 
8
8
  belongs_to :cash_donation
9
9
  belongs_to :commodity_category
10
10
  belongs_to :currency
11
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
11
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
12
12
 
13
13
  validates :reference_no, :order_date, :supplier, :purchase_type, presence: true
14
14
  validates :reference_no, uniqueness: true
15
- validates :purchase_type, inclusion: { in: PURCHASE_TYPES }
16
- validates :quantity, :price, presence: true, numericality: { greater_than: 0 }
15
+ validates :purchase_type, inclusion: {in: PURCHASE_TYPES}
16
+ validates :quantity, :price, presence: true, numericality: {greater_than: 0}
17
17
 
18
18
  delegate(:name, to: :commodity_category, prefix: true)
19
19
  delegate(:name, to: :unit, prefix: true)
@@ -6,7 +6,7 @@ module Cats
6
6
  belongs_to :unit_of_measure
7
7
 
8
8
  validates :reference_no, presence: true, uniqueness: true
9
- validates :quantity, :no_of_days, presence: true, numericality: { greater_than: 0 }
9
+ validates :quantity, :no_of_days, presence: true, numericality: {greater_than: 0}
10
10
 
11
11
  delegate(:name, to: :commodity_category, prefix: true)
12
12
  delegate(:name, to: :beneficiary_category, prefix: true)
@@ -4,11 +4,11 @@ module Cats
4
4
  before_validation :set_unit
5
5
 
6
6
  belongs_to :receipt_authorization
7
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
7
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
8
8
 
9
- validates :commodity_status, presence: true, inclusion: { in: Commodity::COMMODITY_STATUSES }
10
- validates :commodity_grade, inclusion: { in: Commodity::COMMODITY_GRADES }, allow_nil: true
11
- validates :quantity, presence: true, numericality: { greater_than: 0 }
9
+ validates :commodity_status, presence: true, inclusion: {in: Commodity::COMMODITY_STATUSES}
10
+ validates :commodity_grade, inclusion: {in: Commodity::COMMODITY_GRADES}, allow_nil: true
11
+ validates :quantity, presence: true, numericality: {greater_than: 0}
12
12
  # validates :reference_no, presence: true
13
13
  validate :validate_quantity
14
14
 
@@ -27,7 +27,7 @@ module Cats
27
27
 
28
28
  receipts = Receipt.where(receipt_authorization: receipt_authorization)
29
29
  losses = LostCommodity.where(receipt_authorization: receipt_authorization)
30
- ValidationUtil.validate_quantity(self, 'receipt_authorization', receipts + losses, 'authorized')
30
+ ValidationUtil.validate_quantity(self, "receipt_authorization", receipts + losses, "authorized")
31
31
  end
32
32
  end
33
33
  end
@@ -5,14 +5,18 @@ module Cats
5
5
  has_many :lost_commodities
6
6
  has_many :receipt_transactions
7
7
 
8
- validates :received_quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
8
+ validates :received_quantity, presence: true, numericality: {greater_than_or_equal_to: 0}
9
9
  validate :validate_quantity
10
10
 
11
11
  def validate_quantity
12
12
  return unless dispatch && quantity && unit
13
13
 
14
14
  authorizations = ReceiptAuthorization.where(dispatch: dispatch)
15
- ValidationUtil.validate_quantity(self, 'dispatch', authorizations, 'dispatch')
15
+ ValidationUtil.validate_quantity(self, "dispatch", authorizations, "dispatch")
16
+ end
17
+
18
+ def self.ransackable_attributes(auth_object = nil)
19
+ ["authorized_by_id", "dispatch_id", "received_quantity", "quantity", "status", "store_id", "unit_id"]
16
20
  end
17
21
  end
18
22
  end
@@ -4,10 +4,10 @@ module Cats
4
4
  before_validation :set_unit
5
5
 
6
6
  belongs_to :receipt_authorization
7
- belongs_to :destination, class_name: 'Cats::Core::Stack'
7
+ belongs_to :destination, class_name: "Cats::Core::Stack"
8
8
 
9
9
  validates :transaction_date, presence: true
10
- validates :quantity, presence: true, numericality: { greater_than: 0 }
10
+ validates :quantity, presence: true, numericality: {greater_than: 0}
11
11
  validates :receipt_number, presence: true
12
12
  validate :validate_receipt, :validate_quantity
13
13
 
@@ -26,14 +26,14 @@ module Cats
26
26
  return unless receipt_authorization
27
27
 
28
28
  status = receipt_authorization.status
29
- errors.add(:receipt_authorization, 'must be confirmed.') if status == ReceiptAuthorization::AUTHORIZED
29
+ errors.add(:receipt_authorization, "must be confirmed.") if status == ReceiptAuthorization::AUTHORIZED
30
30
  end
31
31
 
32
32
  def validate_quantity
33
33
  return unless quantity && destination && receipt_authorization
34
34
 
35
35
  transactions = ReceiptTransaction.where(receipt_authorization: receipt_authorization)
36
- ValidationUtil.validate_quantity(self, 'receipt_authorization', transactions, 'authorized')
36
+ ValidationUtil.validate_quantity(self, "receipt_authorization", transactions, "authorized")
37
37
  end
38
38
 
39
39
  def commit
@@ -45,6 +45,10 @@ module Cats
45
45
  save!
46
46
  end
47
47
  end
48
+
49
+ def self.ransackable_attributes(auth_object = nil)
50
+ ["destination_id", "quantity", "receipt_authorization_id", "receipt_number", "status", "transaction_date", "unit_id"]
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -5,16 +5,16 @@ module Cats
5
5
 
6
6
  before_validation :set_unit
7
7
 
8
- ALLOCATED = 'Allocated'.freeze
8
+ ALLOCATED = "Allocated".freeze
9
9
  STATUSES << ALLOCATED
10
10
 
11
11
  belongs_to :commodity
12
- belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
12
+ belongs_to :unit, class_name: "Cats::Core::UnitOfMeasure"
13
13
 
14
14
  validates :reference_no, :request_date, :quantity, presence: true
15
15
  validates :reference_no, uniqueness: true
16
- validates :quantity, numericality: { greater_than_or_equal_to: 0 }
17
- validates :status, presence: true, inclusion: { in: STATUSES }
16
+ validates :quantity, numericality: {greater_than_or_equal_to: 0}
17
+ validates :status, presence: true, inclusion: {in: STATUSES}
18
18
  validate :validate_commodity_status, :validate_quantity
19
19
 
20
20
  delegate(:batch_no, to: :commodity, prefix: true)
@@ -39,7 +39,7 @@ module Cats
39
39
  def validate_commodity_status
40
40
  return unless commodity
41
41
 
42
- errors.add(:commodity, 'should be approved first.') unless commodity.status == Commodity::APPROVED
42
+ errors.add(:commodity, "should be approved first.") unless commodity.status == Commodity::APPROVED
43
43
  end
44
44
 
45
45
  def validate_quantity
@@ -61,21 +61,21 @@ module Cats
61
61
  end
62
62
 
63
63
  def approve
64
- raise(StandardError, 'Request is not in draft state.') unless status == DRAFT
64
+ raise(StandardError, "Request is not in draft state.") unless status == DRAFT
65
65
 
66
66
  self.status = APPROVED
67
67
  save!
68
68
  end
69
69
 
70
70
  def complete
71
- raise(StandardError, 'Request is not approved.') unless status == APPROVED
71
+ raise(StandardError, "Request is not approved.") unless status == APPROVED
72
72
 
73
73
  self.status = COMPLETED
74
74
  save!
75
75
  end
76
76
 
77
77
  def allocate
78
- raise(StandardError, 'Request is not completed.') unless status == COMPLETED
78
+ raise(StandardError, "Request is not completed.") unless status == COMPLETED
79
79
 
80
80
  self.status = ALLOCATED
81
81
  save!
@@ -12,7 +12,7 @@ module Cats
12
12
 
13
13
  return if role.application_module_id == menu.application_module.id
14
14
 
15
- errors.add(:base, 'Application module does not match for role and menu')
15
+ errors.add(:base, "Application module does not match for role and menu")
16
16
  end
17
17
 
18
18
  delegate(:label, to: :menu, prefix: false)
@@ -4,13 +4,21 @@ module Cats
4
4
  belongs_to :beneficiary
5
5
  belongs_to :round_plan_item
6
6
  belongs_to :commodity_category
7
- belongs_to :unit, class_name: 'UnitOfMeasure'
7
+ belongs_to :unit, class_name: "UnitOfMeasure"
8
8
 
9
- validates :quantity, presence: true, numericality: { greater_than: 0 }
9
+ validates :quantity, presence: true, numericality: {greater_than: 0}
10
10
 
11
11
  delegate(:full_name, to: :beneficiary, prefix: true)
12
12
  delegate(:name, to: :commodity_category, prefix: true)
13
13
  delegate(:abbreviation, to: :unit, prefix: true)
14
+
15
+ def self.ransackable_attributes(auth_object = nil)
16
+ ["beneficiary_id", "commodity_category_id", "quantity", "received", "round_plan_item_id", "unit_id"]
17
+ end
18
+
19
+ def self.ransackable_associations(auth_object = nil)
20
+ ["beneficiary", "commodity_category", "round_plan_item", "unit"]
21
+ end
14
22
  end
15
23
  end
16
24
  end
@@ -3,14 +3,14 @@ module Cats
3
3
  class RoundPlan < ApplicationRecord
4
4
  include Dispatchable
5
5
 
6
- NEEDS_APPROVED = 'Needs Approved'.freeze
7
- IN_PROGRESS = 'In Progress'.freeze
6
+ NEEDS_APPROVED = "Needs Approved".freeze
7
+ IN_PROGRESS = "In Progress".freeze
8
8
 
9
9
  STATUSES << NEEDS_APPROVED
10
10
  STATUSES << IN_PROGRESS
11
11
 
12
12
  belongs_to :plan
13
- belongs_to :region, class_name: 'Cats::Core::Location'
13
+ belongs_to :region, class_name: "Cats::Core::Location"
14
14
 
15
15
  has_many :round_plan_items
16
16
  has_many :round_rations
@@ -20,7 +20,7 @@ module Cats
20
20
 
21
21
  validates :rounds, presence: true
22
22
  validates :reference_no, presence: true, uniqueness: true
23
- validates :status, presence: true, inclusion: { in: RoundPlan::STATUSES }
23
+ validates :status, presence: true, inclusion: {in: RoundPlan::STATUSES}
24
24
  validate :validate_region
25
25
  validate :validate_rounds, on: :create
26
26
 
@@ -37,15 +37,15 @@ module Cats
37
37
  end
38
38
 
39
39
  def approve
40
- raise(StandardError, 'Plan is not in draft state.') unless status == DRAFT
40
+ raise(StandardError, "Plan is not in draft state.") unless status == DRAFT
41
41
 
42
- raise(StandardError, 'Empty plan cannot be approved.') if round_plan_items.count.zero?
42
+ raise(StandardError, "Empty plan cannot be approved.") if round_plan_items.count.zero?
43
43
 
44
44
  update!(status: APPROVED)
45
45
  end
46
46
 
47
47
  def in_progress
48
- raise(StandardError, 'Plan is not approved.') unless status == APPROVED
48
+ raise(StandardError, "Plan is not approved.") unless status == APPROVED || status == IN_PROGRESS
49
49
 
50
50
  self.status = IN_PROGRESS
51
51
  save!
@@ -54,22 +54,26 @@ module Cats
54
54
  def validate_rounds
55
55
  return unless rounds && plan
56
56
 
57
- errors.add(:rounds, 'cannot be an empty list') if rounds.empty?
57
+ errors.add(:rounds, "cannot be an empty list") if rounds.empty?
58
58
 
59
59
  existing_rounds = plan.round_plans.where(region: region).map(&:rounds).sum([])
60
60
  rounds.each do |round|
61
61
  if round > plan.rounds
62
- errors.add(:rounds, 'cannot exceed the total number of rounds specified in the plan.')
62
+ errors.add(:rounds, "cannot exceed the total number of rounds specified in the plan.")
63
63
  break
64
64
  end
65
65
  end
66
- errors.add(:rounds, 'cannot be repeated.') unless existing_rounds - rounds == existing_rounds
66
+ errors.add(:rounds, "cannot be repeated.") unless existing_rounds - rounds == existing_rounds
67
67
  end
68
68
 
69
69
  def validate_region
70
70
  return unless region
71
71
 
72
- errors.add(:region, 'is not valid.') unless region.location_type == Location::REGION
72
+ errors.add(:region, "is not valid.") unless region.location_type == Location::REGION
73
+ end
74
+
75
+ def self.ransackable_attributes(auth_object = nil)
76
+ ["plan_id", "reference_no", "region_id", "rounds", "status"]
73
77
  end
74
78
  end
75
79
  end
@@ -2,10 +2,10 @@ module Cats
2
2
  module Core
3
3
  class RoundPlanItem < ApplicationRecord
4
4
  belongs_to :round_plan
5
- belongs_to :region, -> { where(location_type: Cats::Core::Location::REGION) }, class_name: 'Cats::Core::Location'
6
- belongs_to :zone, -> { where(location_type: Cats::Core::Location::ZONE) }, class_name: 'Cats::Core::Location'
7
- belongs_to :woreda, -> { where(location_type: Cats::Core::Location::WOREDA) }, class_name: 'Cats::Core::Location'
8
- belongs_to :fdp, -> { where(location_type: Cats::Core::Location::FDP) }, class_name: 'Cats::Core::Location'
5
+ belongs_to :region, -> { where(location_type: Cats::Core::Location::REGION) }, class_name: "Cats::Core::Location"
6
+ belongs_to :zone, -> { where(location_type: Cats::Core::Location::ZONE) }, class_name: "Cats::Core::Location"
7
+ belongs_to :woreda, -> { where(location_type: Cats::Core::Location::WOREDA) }, class_name: "Cats::Core::Location"
8
+ belongs_to :fdp, -> { where(location_type: Cats::Core::Location::FDP) }, class_name: "Cats::Core::Location"
9
9
  belongs_to :operator
10
10
 
11
11
  has_many :beneficiary_round_plan_items
@@ -13,7 +13,7 @@ module Cats
13
13
  has_many :round_beneficiaries
14
14
 
15
15
  validates :plan_item_id, presence: true
16
- validates :round_plan_id, uniqueness: { scope: :fdp_id }
16
+ validates :round_plan_id, uniqueness: {scope: :fdp_id}
17
17
 
18
18
  delegate(:reference_no, to: :round_plan, prefix: true)
19
19
  delegate(:name, to: :region, prefix: true)
@@ -21,6 +21,10 @@ module Cats
21
21
  delegate(:name, to: :woreda, prefix: true)
22
22
  delegate(:name, to: :fdp, prefix: true)
23
23
  delegate(:name, to: :operator, prefix: true)
24
+
25
+ def self.ransackable_attributes(auth_object = nil)
26
+ ["fdp_id", "operator_id", "plan_item_id", "region_id", "round_plan_id", "woreda_id", "zone_id"]
27
+ end
24
28
  end
25
29
  end
26
30
  end
@@ -3,10 +3,10 @@ module Cats
3
3
  class RoundPlanItemDetail < ApplicationRecord
4
4
  belongs_to :beneficiary_round_plan_item
5
5
  belongs_to :round_ration
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 }
9
- validates :beneficiary_round_plan_item_id, uniqueness: { scope: :round_ration_id }
8
+ validates :quantity, presence: true, numericality: {greater_than: 0}
9
+ validates :beneficiary_round_plan_item_id, uniqueness: {scope: :round_ration_id}
10
10
 
11
11
  delegate(:abbreviation, to: :unit, prefix: true)
12
12
  delegate(:commodity_category_name, to: :round_ration, prefix: false)
@@ -6,8 +6,8 @@ module Cats
6
6
  belongs_to :unit_of_measure
7
7
  belongs_to :round_plan
8
8
 
9
- validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
10
- validates :no_of_days, presence: true, numericality: { greater_than: 0 }
9
+ validates :quantity, presence: true, numericality: {greater_than_or_equal_to: 0}
10
+ validates :no_of_days, presence: true, numericality: {greater_than: 0}
11
11
 
12
12
  delegate(:name, to: :commodity_category, prefix: true)
13
13
  delegate(:name, to: :beneficiary_category, prefix: true)
@@ -3,11 +3,11 @@ module Cats
3
3
  class Route < ApplicationRecord
4
4
  before_validation :set_name, on: %i[create update]
5
5
 
6
- belongs_to :region, class_name: 'Cats::Core::Location'
7
- belongs_to :source, class_name: 'Cats::Core::Location'
8
- belongs_to :destination, class_name: 'Cats::Core::Location'
6
+ belongs_to :region, class_name: "Cats::Core::Location"
7
+ belongs_to :source, class_name: "Cats::Core::Location"
8
+ belongs_to :destination, class_name: "Cats::Core::Location"
9
9
 
10
- validates :source_id, uniqueness: { scope: :destination_id }
10
+ validates :source_id, uniqueness: {scope: :destination_id}
11
11
  validate :validate_region, :validate_source, :validate_destination, :validate_route
12
12
 
13
13
  delegate(:name, to: :region, prefix: true)
@@ -21,19 +21,19 @@ module Cats
21
21
  def validate_region
22
22
  return unless region
23
23
 
24
- errors.add(:region, 'should be a valid region.') unless region.location_type == Location::REGION
24
+ errors.add(:region, "should be a valid region.") unless region.location_type == Location::REGION
25
25
  end
26
26
 
27
27
  def validate_source
28
28
  return unless source
29
29
 
30
- errors.add(:source, 'cannot be a region.') if source.location_type == Location::REGION
30
+ errors.add(:source, "cannot be a region.") if source.location_type == Location::REGION
31
31
  end
32
32
 
33
33
  def validate_destination
34
34
  return unless destination
35
35
 
36
- errors.add(:destination, 'cannot be a region.') if destination.location_type == Location::REGION
36
+ errors.add(:destination, "cannot be a region.") if destination.location_type == Location::REGION
37
37
  end
38
38
 
39
39
  def validate_route
@@ -41,7 +41,11 @@ module Cats
41
41
 
42
42
  return unless destination
43
43
 
44
- errors.add(:base, 'Source and destination cannot be the same') if source == destination
44
+ errors.add(:base, "Source and destination cannot be the same") if source == destination
45
+ end
46
+
47
+ def self.ransackable_attributes(auth_object = nil)
48
+ ["destination_id", "name", "region_id", "source_id"]
45
49
  end
46
50
  end
47
51
  end