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
@@ -4,33 +4,33 @@ module Cats
4
4
  def search(user, status, authorized: false)
5
5
  details = user.details
6
6
 
7
- unless details['stores'] || details['warehouse'] || details['hub']
8
- raise(StandardError, 'User does not have associated location.')
7
+ unless details["stores"] || details["warehouse"] || details["hub"]
8
+ raise(StandardError, "User does not have associated location.")
9
9
  end
10
10
 
11
11
  # Get user's hub
12
- hub = if details['stores']
13
- Store.find(details['stores'][0]).warehouse.parent
14
- elsif details['warehouse']
15
- Location.find(details['warehouse']).parent
16
- else
17
- Location.find(details['hub'])
18
- end
12
+ hub = if details["stores"]
13
+ Store.find(details["stores"][0]).warehouse.parent
14
+ elsif details["warehouse"]
15
+ Location.find(details["warehouse"]).parent
16
+ else
17
+ Location.find(details["hub"])
18
+ end
19
19
 
20
20
  if authorized
21
21
  return Dispatch.joins(:dispatch_plan_item)
22
- .includes({ dispatch_plan_item: :destination }, :transporter, :prepared_by, :unit)
23
- .where(
24
- dispatch_plan_item: { destination: hub, status: DispatchPlanItem::AUTHORIZED },
25
- dispatch_status: status
26
- )
22
+ .includes({dispatch_plan_item: :destination}, :transporter, :prepared_by, :unit)
23
+ .where(
24
+ dispatch_plan_item: {destination: hub, status: DispatchPlanItem::AUTHORIZED},
25
+ dispatch_status: status
26
+ )
27
27
  end
28
28
  Dispatch.joins(:dispatch_plan_item)
29
- .includes({ dispatch_plan_item: :destination }, :transporter, :prepared_by, :unit)
30
- .where(
31
- dispatch_plan_item: { destination: hub },
32
- dispatch_status: status
33
- )
29
+ .includes({dispatch_plan_item: :destination}, :transporter, :prepared_by, :unit)
30
+ .where(
31
+ dispatch_plan_item: {destination: hub},
32
+ dispatch_status: status
33
+ )
34
34
  end
35
35
 
36
36
  def start(dispatch)
@@ -41,23 +41,23 @@ module Cats
41
41
 
42
42
  def start_with_pin(dispatch_id, pin)
43
43
  dispatch = Dispatch.includes(
44
- { dispatch_plan_item: :destination },
44
+ {dispatch_plan_item: :destination},
45
45
  :transporter,
46
46
  :prepared_by,
47
47
  :unit
48
48
  ).find(dispatch_id)
49
- raise(StandardError, 'Dispatch is already started.') if dispatch.dispatch_status == Dispatch::STARTED
49
+ raise(StandardError, "Dispatch is already started.") if dispatch.dispatch_status == Dispatch::STARTED
50
50
 
51
- raise(StandardError, 'No pin has been generated for dispatch.') if dispatch.auth_details.nil?
51
+ raise(StandardError, "No pin has been generated for dispatch.") if dispatch.auth_details.nil?
52
52
 
53
- raise(StandardError, 'Incorrect pin.') unless pin == dispatch.auth_details['pin']
53
+ raise(StandardError, "Incorrect pin.") unless pin == dispatch.auth_details["pin"]
54
54
 
55
- raise(StandardError, 'Pin is not active.') unless dispatch.auth_details['active']
55
+ raise(StandardError, "Pin is not active.") unless dispatch.auth_details["active"]
56
56
 
57
- if DateTime.now > dispatch.auth_details['expires_at']
57
+ if DateTime.now > dispatch.auth_details["expires_at"]
58
58
  dispatch.auth_details[:active] = false
59
59
  dispatch.save!
60
- raise(StandardError, 'Pin has expired.')
60
+ raise(StandardError, "Pin has expired.")
61
61
  end
62
62
  dispatch.start
63
63
  send_notification(dispatch)
@@ -67,17 +67,17 @@ module Cats
67
67
  end
68
68
 
69
69
  def send_notification(dispatch)
70
- notification_rule = NotificationRule.find_by(code: 'dispatch')
71
- raise(StandardError, 'Notification rule not found for dispatch notification.') unless notification_rule
70
+ notification_rule = NotificationRule.find_by(code: "dispatch")
71
+ raise(StandardError, "Notification rule not found for dispatch notification.") unless notification_rule
72
72
 
73
- users = User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
73
+ users = User.joins(:roles).where(cats_core_roles: {name: notification_rule.roles})
74
74
  location_id = dispatch.dispatch_plan_item.destination_id
75
75
  hub = Location.find(location_id)
76
76
  recipients = users.map do |user|
77
77
  details = user.details
78
78
 
79
- if (details.key?('warehouse') && hub.child_ids.include?(details['warehouse'])) ||
80
- (details.key?('hub') && details['hub'] == location_id)
79
+ if (details.key?("warehouse") && hub.child_ids.include?(details["warehouse"])) ||
80
+ (details.key?("hub") && details["hub"] == location_id)
81
81
  user
82
82
  end
83
83
  end.compact
@@ -3,14 +3,14 @@ module Cats
3
3
  class NotificationService
4
4
  NOTIFICATION_RULES = {
5
5
  dispatch_plan: {
6
- application: 'CATS-WH',
7
- notification: 'DispatchPlanNotification',
6
+ application: "CATS-WH",
7
+ notification: "DispatchPlanNotification",
8
8
  params: [:way_bill],
9
9
  recipients: [:warehouse_manager]
10
10
  },
11
11
  receipt_plan: {
12
- application: 'CATS-WH',
13
- notification: 'ReceiptPlanNotification',
12
+ application: "CATS-WH",
13
+ notification: "ReceiptPlanNotification",
14
14
  params: [:receipt_plan],
15
15
  recipients: [:store_keeper]
16
16
  }
@@ -34,7 +34,7 @@ module Cats
34
34
  roles = rule[:recipients]
35
35
 
36
36
  users = Cats::Core::User.joins(:application_module)
37
- .where(application_module: { prefix: app_code }).with_all_roles(*roles)
37
+ .where(application_module: {prefix: app_code}).with_all_roles(*roles)
38
38
  notifier.deliver(users)
39
39
  end
40
40
  end
@@ -3,9 +3,9 @@ module Cats
3
3
  class RoundPlanService
4
4
  def generate_round_needs(plan_id)
5
5
  round_plan = Cats::Core::RoundPlan.find(plan_id)
6
- raise(StandardError, 'Plan has no rations.') if round_plan.round_rations.count.zero?
6
+ raise(StandardError, "Plan has no rations.") if round_plan.round_rations.count.zero?
7
7
 
8
- raise(StandardError, 'Plan has no plan items.') if round_plan.round_plan_items.count.zero?
8
+ raise(StandardError, "Plan has no plan items.") if round_plan.round_plan_items.count.zero?
9
9
 
10
10
  clear_needs(round_plan.id)
11
11
 
@@ -13,15 +13,15 @@ module Cats
13
13
  rations = round_plan.round_rations
14
14
  plan = round_plan.plan
15
15
  no_of_days = plan.total_days / plan.rounds
16
- mt = UnitOfMeasure.find_by(abbreviation: 'mt')
16
+ mt = UnitOfMeasure.find_by(abbreviation: "mt")
17
17
  round_plan.beneficiary_round_plan_items.each do |plan_item|
18
18
  round_rations = rations.select { |r| r.beneficiary_category_id == plan_item.beneficiary_category_id }
19
19
  round_rations.each do |ration|
20
20
  quantity = (no_of_days / ration.no_of_days * ration.quantity) * plan_item.beneficiaries *
21
- round_plan.rounds.count
21
+ round_plan.rounds.count
22
22
  quantity = quantity.truncate(2)
23
23
  unit = ration.unit
24
- if ration.unit.abbreviation.downcase != 'pc'
24
+ if ration.unit.abbreviation.downcase != "pc"
25
25
  quantity = UnitConversion.convert(unit, mt, quantity).truncate(2)
26
26
  unit = mt
27
27
  end
@@ -42,7 +42,7 @@ module Cats
42
42
  def clear_needs(plan_id)
43
43
  Cats::Core::RoundPlanItemDetail
44
44
  .joins(beneficiary_round_plan_item: :round_plan_item)
45
- .where(cats_core_beneficiary_round_plan_items: { cats_core_round_plan_items: { round_plan_id: plan_id } })
45
+ .where(cats_core_beneficiary_round_plan_items: {cats_core_round_plan_items: {round_plan_id: plan_id}})
46
46
  .delete_all
47
47
  end
48
48
 
@@ -54,7 +54,7 @@ module Cats
54
54
  status: Cats::Core::Plan::DRAFT,
55
55
  rounds: rounds
56
56
  )
57
- rations = Cats::Core::Ration.joins(:beneficiary_category).where(beneficiary_category: { plan_id: plan_id })
57
+ rations = Cats::Core::Ration.joins(:beneficiary_category).where(beneficiary_category: {plan_id: plan_id})
58
58
  round_rations = rations.map do |ration|
59
59
  {
60
60
  beneficiary_category_id: ration.beneficiary_category_id,
@@ -111,27 +111,27 @@ module Cats
111
111
  # round plan item becomes empty, then it too should be deleted.
112
112
  #
113
113
  def remove_items(plan_id, ids)
114
- raise(StandardError, 'No beneficiary plan items specified.') if ids.count.zero?
114
+ raise(StandardError, "No beneficiary plan items specified.") if ids.count.zero?
115
115
 
116
116
  begin
117
117
  plan = Cats::Core::RoundPlan.find(plan_id)
118
118
  rescue ActiveRecord::RecordNotFound
119
- raise(StandardError, 'Round plan not found.') unless plan
119
+ raise(StandardError, "Round plan not found.") unless plan
120
120
  end
121
121
 
122
122
  plans = Cats::Core::RoundPlan.includes(:beneficiary_round_plan_items)
123
- .where(beneficiary_round_plan_items: { id: ids })
124
- raise(StandardError, 'Round plan items should be from the same plan.') if plans.count > 1
123
+ .where(beneficiary_round_plan_items: {id: ids})
124
+ raise(StandardError, "Round plan items should be from the same plan.") if plans.count > 1
125
125
 
126
126
  unless plans.count.positive? && plan.id == plans[0].id
127
- raise(StandardError, 'Round plan items are not from the given round plan.')
127
+ raise(StandardError, "Round plan items are not from the given round plan.")
128
128
  end
129
129
 
130
130
  to_delete = Cats::Core::BeneficiaryRoundPlanItem.where(id: ids)
131
131
  keys = to_delete.map(&:round_plan_item_id).uniq
132
132
 
133
133
  item_counts = Cats::Core::BeneficiaryRoundPlanItem.where(round_plan_item_id: keys)
134
- .group(:round_plan_item_id).count
134
+ .group(:round_plan_item_id).count
135
135
 
136
136
  delete_hash = {}
137
137
  keys.each { |k| delete_hash[k] = [] }
@@ -151,16 +151,16 @@ module Cats
151
151
 
152
152
  def approve(plan_id)
153
153
  plan = RoundPlan.find(plan_id)
154
- if plan.plan.program.code == 'PSNP'
154
+ if plan.plan.program.code == "PSNP"
155
155
  rounds = plan.rounds.count
156
- item_ids = plan.beneficiary_round_plan_items.pluck('beneficiary_plan_item_id').flatten
156
+ item_ids = plan.beneficiary_round_plan_items.pluck("beneficiary_plan_item_id").flatten
157
157
  plan_items = BeneficiaryPlanItem.includes(plan_item: :fdp).where(id: item_ids)
158
158
  invalid = plan_items.select { |pi| pi.rounds - (pi.rounds_served || 0) < rounds }.map do |pi|
159
159
  pi.plan_item.fdp.name
160
160
  end
161
161
 
162
162
  if invalid.count.positive?
163
- msg = invalid.join(', ')
163
+ msg = invalid.join(", ")
164
164
  error = "The FDPs [#{msg}] exceeded their allowed number of rounds."
165
165
  raise(StandardError, error)
166
166
  end
@@ -169,7 +169,7 @@ module Cats
169
169
  rounds_served = plan_item.rounds_served || 0
170
170
  res << "(#{plan_item.id}, #{rounds + rounds_served})"
171
171
  end
172
- values = items.join(',')
172
+ values = items.join(",")
173
173
  sql = <<-SQL
174
174
  UPDATE cats_core_beneficiary_plan_items AS bpi
175
175
  SET
@@ -192,11 +192,11 @@ module Cats
192
192
  end
193
193
 
194
194
  def send_approval_notification(round_plan)
195
- notification_rule = NotificationRule.find_by(code: 'round_plan_approval')
196
- error = 'Notification rule not found for round plan approval notification.'
195
+ notification_rule = NotificationRule.find_by(code: "round_plan_approval")
196
+ error = "Notification rule not found for round plan approval notification."
197
197
  raise(StandardError, error) unless notification_rule
198
198
 
199
- users = User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
199
+ users = User.joins(:roles).where(cats_core_roles: {name: notification_rule.roles})
200
200
  return if users.empty?
201
201
 
202
202
  notification = RoundPlanNotification.with(round_plan: round_plan)
@@ -204,14 +204,14 @@ module Cats
204
204
  end
205
205
 
206
206
  def send_approved_notification(round_plan)
207
- notification_rule = NotificationRule.find_by(code: 'round_plan_approved')
208
- error = 'Notification rule not found for round plan approved notification.'
207
+ notification_rule = NotificationRule.find_by(code: "round_plan_approved")
208
+ error = "Notification rule not found for round plan approved notification."
209
209
  raise(StandardError, error) unless notification_rule
210
210
 
211
211
  users = User.joins(roles: :application_module).where(
212
212
  cats_core_roles: {
213
213
  name: notification_rule.roles,
214
- cats_core_application_modules: { prefix: 'CATS-TMS' }
214
+ cats_core_application_modules: {prefix: "CATS-TMS"}
215
215
  }
216
216
  )
217
217
  return if users.empty?
@@ -1,9 +1,9 @@
1
1
  module Cats
2
2
  module Core
3
3
  class SpaceService
4
- HUB = 'Hub'.freeze
5
- WAREHOUSE = 'Warehouse'.freeze
6
- STORE = 'Store'.freeze
4
+ HUB = "Hub".freeze
5
+ WAREHOUSE = "Warehouse".freeze
6
+ STORE = "Store".freeze
7
7
 
8
8
  def available_space(id, level)
9
9
  case level
@@ -12,17 +12,17 @@ module Cats
12
12
  warehouses = hub.children
13
13
  warehouse_ids = warehouses.map(&:id)
14
14
  stores = Cats::Core::Store.joins(:warehouse)
15
- .where(
16
- cats_core_locations: {
17
- location_type: Cats::Core::Location::WAREHOUSE,
18
- id: warehouse_ids
19
- }
20
- ).group_by(&:warehouse_id)
15
+ .where(
16
+ cats_core_locations: {
17
+ location_type: Cats::Core::Location::WAREHOUSE,
18
+ id: warehouse_ids
19
+ }
20
+ ).group_by(&:warehouse_id)
21
21
  wh_details = []
22
22
  stores.each do |key, value|
23
23
  total_space = value.inject(0) { |sum, val| sum + val.available_space }
24
24
  details = value.map do |val|
25
- { store_id: val.id, code: val.code, name: val.name, total_space: val.available_space }
25
+ {store_id: val.id, code: val.code, name: val.name, total_space: val.available_space}
26
26
  end
27
27
  warehouse = warehouses.find(key)
28
28
  wh_details << {
@@ -45,7 +45,7 @@ module Cats
45
45
  warehouse = Cats::Core::Location.find(id)
46
46
  stores = Cats::Core::Store.where(warehouse_id: id)
47
47
  details = stores.map do |store|
48
- { store_id: store.id, code: store.code, name: store.name, total_space: store.available_space }
48
+ {store_id: store.id, code: store.code, name: store.name, total_space: store.available_space}
49
49
  end
50
50
  total_space = stores.inject(0) { |sum, val| sum + val.available_space }
51
51
  space = {
@@ -5,20 +5,20 @@ module Cats
5
5
  details = user.details
6
6
 
7
7
  key_available = details.keys.any? { |key| %w[stores warehouse hub].include?(key) }
8
- raise(StandardError, 'User does not have associated location.') unless key_available
8
+ raise(StandardError, "User does not have associated location.") unless key_available
9
9
 
10
- hub = if details['hub']
11
- Location.find(details['hub'])
12
- elsif details['warehouse']
13
- Location.find(details['warehouse']).parent
14
- else
15
- Store.find(details['stores'][0]).warehouse.parent
16
- end
10
+ hub = if details["hub"]
11
+ Location.find(details["hub"])
12
+ elsif details["warehouse"]
13
+ Location.find(details["warehouse"]).parent
14
+ else
15
+ Store.find(details["stores"][0]).warehouse.parent
16
+ end
17
17
 
18
18
  allocation_items =
19
19
  DispatchPlanItem
20
- .joins(:dispatch_plan)
21
- .where(destination: hub, dispatch_plan: { status: DispatchPlan::APPROVED })
20
+ .joins(:dispatch_plan)
21
+ .where(destination: hub, dispatch_plan: {status: DispatchPlan::APPROVED})
22
22
 
23
23
  allocation_items.map do |item|
24
24
  {
@@ -1,15 +1,15 @@
1
1
  module Cats
2
2
  module Core
3
3
  class TokenAuthService
4
- AUTH_SECRET = '592fac227e8ee4ff985e376d554604f36c974b4f4605eb8d7ebe4dd1cf8fd8aa8e0cb85df1b48a8ec60cac7bb4117d854'\
5
- '5c359123e14f6784dcd88e6e6a1ea8c'.freeze
4
+ AUTH_SECRET = "592fac227e8ee4ff985e376d554604f36c974b4f4605eb8d7ebe4dd1cf8fd8aa8e0cb85df1b48a8ec60cac7bb4117d854" \
5
+ "5c359123e14f6784dcd88e6e6a1ea8c".freeze
6
6
 
7
7
  def self.issue(payload)
8
- JWT.encode(payload, auth_secret, 'HS256')
8
+ JWT.encode(payload, auth_secret, "HS256")
9
9
  end
10
10
 
11
11
  def self.decode(token)
12
- JWT.decode(token, auth_secret, true, algorithm: 'HS256').first
12
+ JWT.decode(token, auth_secret, true, algorithm: "HS256").first
13
13
  end
14
14
 
15
15
  def self.auth_secret
@@ -0,0 +1,19 @@
1
+ module Cats
2
+ module Core
3
+ class UserService
4
+ def change_password(email, old_password, new_password, password_confirmation)
5
+ raise(StandardError, "Password and confirmation do not match.") unless new_password == password_confirmation
6
+
7
+ user = User.find_by(email:)
8
+ raise(StandardError, "User with email '#{email}' could not be found.") unless user
9
+
10
+ raise(StandardError, "Old password for user '#{email}' is not correct.") unless user.authenticate(old_password)
11
+
12
+ user.password = new_password
13
+ user.password_confirmation = password_confirmation
14
+ user.save!
15
+ user
16
+ end
17
+ end
18
+ end
19
+ end
@@ -7,7 +7,7 @@ module Cats
7
7
 
8
8
  def self.generate_pin(obj)
9
9
  pin = SecureRandom.hex(10)
10
- obj.auth_details = { pin: pin, active: true, expires_at: DateTime.now + 24.hour }
10
+ obj.auth_details = {pin: pin, active: true, expires_at: DateTime.now + 24.hour}
11
11
  obj.save!
12
12
  end
13
13
  end