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,33 +2,33 @@ module Cats
2
2
  module Core
3
3
  class User < ApplicationRecord
4
4
  has_secure_password
5
- rolify role_cname: 'Cats::Core::Role'
5
+ rolify role_cname: "Cats::Core::Role"
6
6
 
7
7
  belongs_to :application_module
8
8
  has_many :notifications, as: :recipient
9
9
 
10
- validates :password, length: { minimum: 6 }, if: proc { |u| u.password.present? }, on: :update
10
+ validates :password, length: {minimum: 6}, if: proc { |u| u.password.present? }, on: :update
11
11
  validates :first_name, :last_name, :email, presence: true
12
- validates :password, presence: true, length: { minimum: 6 }, on: :create
13
- validates :email, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
12
+ validates :password, presence: true, length: {minimum: 6}, on: :create
13
+ validates :email, uniqueness: true, format: {with: URI::MailTo::EMAIL_REGEXP}
14
14
  validate :validate_phone_number
15
15
 
16
16
  def warehouse
17
- return unless details.key?('warehouse')
17
+ return unless details.key?("warehouse")
18
18
 
19
- Cats::Core::Location.find_by(id: details['warehouse'], location_type: Cats::Core::Location::WAREHOUSE)
19
+ Cats::Core::Location.find_by(id: details["warehouse"], location_type: Cats::Core::Location::WAREHOUSE)
20
20
  end
21
21
 
22
22
  def stores
23
- return unless details.key?('stores')
23
+ return unless details.key?("stores")
24
24
 
25
- Cats::Core::Store.where(id: details['stores'])
25
+ Cats::Core::Store.where(id: details["stores"])
26
26
  end
27
27
 
28
28
  def hub
29
- return unless details.key?('hub')
29
+ return unless details.key?("hub")
30
30
 
31
- Cats::Core::Location.find_by(id: details['hub'], location_type: Cats::Core::Location::HUB)
31
+ Cats::Core::Location.find_by(id: details["hub"], location_type: Cats::Core::Location::HUB)
32
32
  end
33
33
 
34
34
  def add_detail(key, value)
@@ -48,7 +48,7 @@ module Cats
48
48
 
49
49
  return if phone_number.length == 12 && /251\d{9}/.match(phone_number)
50
50
 
51
- errors.add(:phone_number, 'must be 10 or 12 digits and should match with local phone pattern')
51
+ errors.add(:phone_number, "must be 10 or 12 digits and should match with local phone pattern")
52
52
  end
53
53
 
54
54
  def full_name
@@ -7,9 +7,9 @@ module Cats
7
7
  module Dispatchable
8
8
  extend ActiveSupport::Concern
9
9
 
10
- DRAFT = 'Draft'.freeze
11
- APPROVED = 'Approved'.freeze
12
- COMPLETED = 'Completed'.freeze
10
+ DRAFT = "Draft".freeze
11
+ APPROVED = "Approved".freeze
12
+ COMPLETED = "Completed".freeze
13
13
 
14
14
  # rubocop:disable Style/MutableConstant
15
15
  STATUSES = [DRAFT, APPROVED, COMPLETED]
@@ -24,7 +24,7 @@ module Cats
24
24
  Quantity = #{allocation_item.quantity}
25
25
  The commodity is expected to be delivered from #{source} to #{destination}
26
26
  BODY
27
- { title: title, date: date, body: body }
27
+ {title: title, date: date, body: body}
28
28
  end
29
29
  end
30
30
  end
@@ -0,0 +1,35 @@
1
+ module Cats
2
+ module Core
3
+ class DispatchAuthorizationNotification < Noticed::Base
4
+ deliver_by :database
5
+
6
+ param :dispatch_authorization
7
+
8
+ def message
9
+ authorization = params[:dispatch_authorization]
10
+ dispatch = authorization.dispatch
11
+ plan_item_ref = dispatch.dispatch_plan_item.reference_no
12
+ plan_ref = dispatch.dispatch_plan_item.dispatch_plan.reference_no
13
+ commodity = dispatch.dispatch_plan_item.commodity
14
+ title = "Dispatch Authorization Notification - #{commodity.name}"
15
+ date = Date.today
16
+
17
+ body = <<~BODY
18
+ Commodity with the following details is ordered to be dispatched from your store:
19
+ Authorization no. = #{dispatch.dispatch_plan_item.reference_no}
20
+ Dispatch Ref. = #{dispatch.reference_no}
21
+ Dispatch Plan Ref. = #{plan_ref}
22
+ Dispatch Plan Item Ref. = #{plan_item_ref}
23
+ Batch No. = #{commodity.batch_no}
24
+ Commodity = #{commodity.name}
25
+ Quantity = #{authorization.quantity}
26
+ Unit = #{authorization.unit.abbreviation}
27
+ Truck Plate No. = #{dispatch.plate_no}
28
+ Driver Name = #{dispatch.driver_name}
29
+ Driver Phone = #{dispatch.driver_phone}
30
+ BODY
31
+ {title: title, date: date, body: body}
32
+ end
33
+ end
34
+ end
35
+ end
@@ -23,7 +23,7 @@ module Cats
23
23
  Driver Name = #{dispatch.driver_name}
24
24
  Driver Phone = #{dispatch.driver_phone}
25
25
  BODY
26
- { title: title, date: date, body: body }
26
+ {title: title, date: date, body: body}
27
27
  end
28
28
  end
29
29
  end
@@ -24,7 +24,7 @@ module Cats
24
24
  Driver Name = #{dispatch.driver_name}
25
25
  Driver Phone = #{dispatch.driver_phone}
26
26
  BODY
27
- { title: title, date: date, body: body }
27
+ {title: title, date: date, body: body}
28
28
  end
29
29
  end
30
30
  end
@@ -20,7 +20,7 @@ module Cats
20
20
  Year = #{plan.year}
21
21
  Season = #{plan.season}
22
22
  BODY
23
- { title: title, date: date, body: body }
23
+ {title: title, date: date, body: body}
24
24
  end
25
25
  end
26
26
  end
@@ -13,7 +13,7 @@ module Cats
13
13
  def message
14
14
  title = params[:title]
15
15
  body = params[:body]
16
- { title: title, body: body }
16
+ {title: title, body: body}
17
17
  end
18
18
  end
19
19
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class CashDonationSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :description, :donated_on, :donor_id, :donor_name, :amount, :currency_id,
5
- :currency_code
5
+ :currency_code
6
6
  end
7
7
  end
8
8
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class CommodityDonationSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :donated_on, :donor_id, :donor_name, :plan_id, :plan_reference_no,
5
- :quantity, :unit_id, :unit_abbreviation, :description, :commodity_category_id,
6
- :commodity_category_name, :shipping_reference
5
+ :quantity, :unit_id, :unit_abbreviation, :description, :commodity_category_id,
6
+ :commodity_category_name, :shipping_reference
7
7
  end
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class CommoditySerializer < ActiveModel::Serializer
4
4
  attributes :id, :name, :batch_no, :description, :unit_of_measure_id, :unit_abbreviation, :project_id,
5
- :project_code, :quantity, :best_use_before, :volume_per_metric_ton, :arrival_status, :status,
6
- :shipping_reference, :commodity_grade, :package_unit_id, :package_unit_abbreviation
5
+ :project_code, :quantity, :best_use_before, :volume_per_metric_ton, :arrival_status, :status,
6
+ :shipping_reference, :commodity_grade, :package_unit_id, :package_unit_abbreviation
7
7
  end
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class DispatchAuthorizationSerializer < ActiveModel::Serializer
4
4
  attributes :id, :dispatch_id, :dispatch_reference_no, :store_id, :store_name, :quantity, :authorized_by_id,
5
- :authorizer_full_name, :dispatch_status, :plate_no, :driver_name, :status, :unit_id,
6
- :unit_abbreviation
5
+ :authorizer_full_name, :dispatch_status, :plate_no, :driver_name, :status, :unit_id,
6
+ :unit_abbreviation
7
7
  end
8
8
  end
9
9
  end
@@ -2,9 +2,9 @@ module Cats
2
2
  module Core
3
3
  class DispatchPlanItemSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :dispatch_plan_id, :plan_reference_no, :source_id, :source_name, :destination_id,
5
- :destination_name, :quantity, :source_location_type, :destination_location_type, :commodity_status,
6
- :status, :commodity_id, :commodity_name, :commodity_batch_no, :unit_abbreviation,
7
- :commodity_shipping_reference, :unit_id
5
+ :destination_name, :quantity, :source_location_type, :destination_location_type, :commodity_status,
6
+ :status, :commodity_id, :commodity_name, :commodity_batch_no, :unit_abbreviation,
7
+ :commodity_shipping_reference, :unit_id
8
8
  end
9
9
  end
10
10
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class DispatchPlanSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :status, :dispatchable_id, :dispatchable_type, :request_reference,
5
- :request_quantity, :upstream
5
+ :request_quantity, :upstream
6
6
  end
7
7
  end
8
8
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class DispatchSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :dispatch_plan_item_id, :transporter_id, :transporter_name, :plate_no,
5
- :driver_name, :driver_phone, :quantity, :remark, :prepared_by_id, :prepared_by_email,
6
- :dispatch_status, :destination, :auth_details, :unit_id, :unit_abbreviation, :commodity_status
5
+ :driver_name, :driver_phone, :quantity, :remark, :prepared_by_id, :prepared_by_email,
6
+ :dispatch_status, :destination, :auth_details, :unit_id, :unit_abbreviation, :commodity_status
7
7
  end
8
8
  end
9
9
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class DispatchTransactionSerializer < ActiveModel::Serializer
4
4
  attributes :id, :source_id, :source_code, :dispatch_authorization_id, :quantity, :transaction_date, :status,
5
- :unit_id, :unit_abbreviation, :reference_no
5
+ :unit_id, :unit_abbreviation, :reference_no
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class LoanSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :lender, :agreement_date, :repayment_date, :commodity_category_id,
5
- :commodity_category_name, :quantity, :unit_id, :unit_abbreviation
5
+ :commodity_category_name, :quantity, :unit_id, :unit_abbreviation
6
6
  end
7
7
  end
8
8
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class PurchaseOrderSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :order_date, :requisition_no, :supplier, :cash_donation_id, :purchase_type,
5
- :commodity_category_id, :commodity_category_name, :quantity, :unit_id, :unit_name, :currency_id,
6
- :currency_code, :price
5
+ :commodity_category_id, :commodity_category_name, :quantity, :unit_id, :unit_name, :currency_id,
6
+ :currency_code, :price
7
7
  end
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class ReceiptAuthorizationSerializer < ActiveModel::Serializer
4
4
  attributes :id, :dispatch_id, :dispatch_reference_no, :store_id, :store_name, :quantity, :received_quantity,
5
- :remark, :status, :authorized_by_id, :authorizer_full_name, :auth_details, :plate_no, :driver_name,
6
- :dispatch_status, :unit_id, :unit_abbreviation, :driver_confirmed
5
+ :remark, :status, :authorized_by_id, :authorizer_full_name, :auth_details, :plate_no, :driver_name,
6
+ :dispatch_status, :unit_id, :unit_abbreviation, :driver_confirmed
7
7
  end
8
8
  end
9
9
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class ReceiptSerializer < ActiveModel::Serializer
4
4
  attributes :id, :receipt_authorization_id, :commodity_status, :commodity_grade, :quantity, :remark,
5
- :unit_id, :unit_abbreviation, :reference_no
5
+ :unit_id, :unit_abbreviation, :reference_no
6
6
  end
7
7
  end
8
8
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class ReceiptTransactionSerializer < ActiveModel::Serializer
4
4
  attributes :id, :receipt_authorization_id, :receipt_number,
5
- :dispatch_reference_no, :destination_id, :destination_code, :quantity,
6
- :transaction_date, :status, :unit_id, :unit_abbreviation
5
+ :dispatch_reference_no, :destination_id, :destination_code, :quantity,
6
+ :transaction_date, :status, :unit_id, :unit_abbreviation
7
7
  end
8
8
  end
9
9
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class RoundBeneficiarySerializer < ActiveModel::Serializer
4
4
  attributes :id, :beneficiary_id, :beneficiary_full_name, :round_plan_item_id, :commodity_category_id,
5
- :commodity_category_name, :quantity, :unit_id, :unit_abbreviation, :received
5
+ :commodity_category_name, :quantity, :unit_id, :unit_abbreviation, :received
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class RoundPlanSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :status, :plan_id, :plan_reference_no, :region_id, :region_name, :rounds,
5
- :program_code
5
+ :program_code
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class StackSerializer < ActiveModel::Serializer
4
4
  attributes :id, :code, :length, :width, :height, :start_x, :start_y, :commodity_id, :store_id, :commodity_status,
5
- :stack_status, :quantity, :commodity_batch_no, :unit_id, :unit_abbreviation
5
+ :stack_status, :quantity, :commodity_batch_no, :unit_id, :unit_abbreviation
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module Cats
2
2
  module Core
3
3
  class StoreSerializer < ActiveModel::Serializer
4
4
  attributes :id, :code, :name, :length, :width, :height, :temporary, :has_gangway, :gangway_length,
5
- :gangway_width, :gangway_corner_dist, :warehouse_id
5
+ :gangway_width, :gangway_corner_dist, :warehouse_id
6
6
 
7
7
  has_many :stacks
8
8
  end
@@ -2,8 +2,8 @@ module Cats
2
2
  module Core
3
3
  class SwapSerializer < ActiveModel::Serializer
4
4
  attributes :id, :reference_no, :swapper, :agreement_date, :issued_commodity_id, :issued_commodity_name,
5
- :issued_quantity, :received_commodity_id, :received_commodity_name, :received_quantity,
6
- :issued_unit_id, :issued_unit_abbreviation, :received_unit_id, :received_unit_abbreviation
5
+ :issued_quantity, :received_commodity_id, :received_commodity_name, :received_quantity,
6
+ :issued_unit_id, :issued_unit_abbreviation, :received_unit_id, :received_unit_abbreviation
7
7
  end
8
8
  end
9
9
  end
@@ -1,22 +1,22 @@
1
1
  module Cats
2
2
  module Core
3
3
  class AuthorizationService
4
- def driver_confirm(authorization_id, pin)
4
+ def driver_confirm(authorization_id, pin, receipt_number)
5
5
  authorization = ReceiptAuthorization.find(authorization_id)
6
6
  if authorization.status == Authorization::AUTHORIZED
7
- raise(StandardError, 'Authorization not confirmed by storekeeper.')
7
+ raise(StandardError, "Authorization not confirmed by storekeeper.")
8
8
  end
9
9
 
10
- raise(StandardError, 'No pin has been generated for receipt.') if authorization.auth_details.nil?
10
+ raise(StandardError, "No pin has been generated for receipt.") if authorization.auth_details.nil?
11
11
 
12
- raise(StandardError, 'Incorrect pin.') unless pin == authorization.auth_details['pin']
12
+ raise(StandardError, "Incorrect pin.") unless pin == authorization.auth_details["pin"]
13
13
 
14
- raise(StandardError, 'Pin is not active.') unless authorization.auth_details['active']
14
+ raise(StandardError, "Pin is not active.") unless authorization.auth_details["active"]
15
15
 
16
- if DateTime.now > authorization.auth_details['expires_at']
16
+ if DateTime.now > authorization.auth_details["expires_at"]
17
17
  authorization.auth_details[:active] = false
18
18
  authorization.save!
19
- raise(StandardError, 'Pin has expired.')
19
+ raise(StandardError, "Pin has expired.")
20
20
  end
21
21
 
22
22
  authorization.driver_confirmed = true
@@ -27,7 +27,7 @@ module Cats
27
27
  # Create destination stack and transaction for FDP
28
28
  location = authorization.dispatch.dispatch_plan_item.destination
29
29
  if location.location_type == Location::FDP
30
- create_stack(authorization_id)
30
+ create_stack(authorization_id, receipt_number)
31
31
  stack(authorization_id)
32
32
  end
33
33
 
@@ -35,7 +35,7 @@ module Cats
35
35
  end
36
36
 
37
37
  # A method to create stack and stack transactions for FDP
38
- def create_stack(authorization_id)
38
+ def create_stack(authorization_id, receipt_number)
39
39
  authorization = ReceiptAuthorization.find(authorization_id)
40
40
  commodity = authorization.dispatch.dispatch_plan_item.commodity
41
41
  stack = Stack.create!(
@@ -57,7 +57,8 @@ module Cats
57
57
  quantity: authorization.received_quantity,
58
58
  unit: authorization.unit,
59
59
  status: Transaction::DRAFT,
60
- transaction_date: Date.today
60
+ transaction_date: Date.today,
61
+ receipt_number: receipt_number
61
62
  )
62
63
  stack
63
64
  end
@@ -65,12 +66,12 @@ module Cats
65
66
  def stack(authorization_id)
66
67
  authorization = ReceiptAuthorization.find(authorization_id)
67
68
  unless authorization.dispatch.dispatch_status == Dispatch::RECEIVED
68
- raise(StandardError, 'Dispatch is not received.')
69
+ raise(StandardError, "Dispatch is not received.")
69
70
  end
70
71
 
71
72
  total = authorization.transactions.sum(:quantity)
72
73
  if total != authorization.received_quantity
73
- raise(StandardError, 'Received quantity is not the same as quantity to be stacked.')
74
+ raise(StandardError, "Received quantity is not the same as quantity to be stacked.")
74
75
  end
75
76
 
76
77
  authorization.transactions.each(&:commit)
@@ -83,7 +84,7 @@ module Cats
83
84
  item = DispatchPlanItem.find(id).includes(
84
85
  :destination,
85
86
  :unit,
86
- commodity: { project: :source }
87
+ commodity: {project: :source}
87
88
  )
88
89
  {
89
90
  date: Date.today,
@@ -96,22 +97,39 @@ module Cats
96
97
  }
97
98
  end
98
99
 
99
- def send_notification(authorization)
100
- notification_rule = NotificationRule.find_by(code: 'receipt_authorization')
101
- error = 'Notification rule not found for receipt authorization notification.'
100
+ def send_receipt_notification(authorization)
101
+ notification_rule = NotificationRule.find_by(code: "receipt_authorization")
102
+ error = "Notification rule not found for receipt authorization notification."
102
103
  raise(StandardError, error) unless notification_rule
103
104
 
104
- users = User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
105
+ users = User.joins(:roles).where(cats_core_roles: {name: notification_rule.roles})
105
106
  recipients = users.map do |user|
106
107
  details = user.details
107
108
 
108
- user if details.key?('stores') && details['stores'].include?(authorization.store_id)
109
+ user if details.key?("stores") && details["stores"].include?(authorization.store_id)
109
110
  end.compact
110
111
  return if recipients.empty?
111
112
 
112
113
  notification = ReceiptAuthorizationNotification.with(receipt_authorization: authorization)
113
114
  notification.deliver(recipients)
114
115
  end
116
+
117
+ def send_dispatch_notification(authorization)
118
+ notification_rule = NotificationRule.find_by(code: "dispatch_authorization")
119
+ error = "Notification rule not found for dispatch authorization notification."
120
+ raise(StandardError, error) unless notification_rule
121
+
122
+ users = User.joins(:roles).where(cats_core_roles: {name: notification_rule.roles})
123
+ recipients = users.map do |user|
124
+ details = user.details
125
+
126
+ user if details.key?("stores") && details["stores"].include?(authorization.store_id)
127
+ end.compact
128
+ return if recipients.empty?
129
+
130
+ notification = DispatchAuthorizationNotification.with(dispatch_authorization: authorization)
131
+ notification.deliver(recipients)
132
+ end
115
133
  end
116
134
  end
117
135
  end
@@ -3,9 +3,9 @@ module Cats
3
3
  class BeneficiaryService
4
4
  def clear_distribution_list(id)
5
5
  round_plan = RoundPlan.find(id)
6
- raise(StandardError, 'Round plan is not in draft state.') unless round_plan.status == RoundPlan::DRAFT
6
+ raise(StandardError, "Round plan is not in draft state.") unless round_plan.status == RoundPlan::DRAFT
7
7
 
8
- RoundBeneficiary.joins(:round_plan_item).where(round_plan_item: { round_plan_id: id }).delete_all
8
+ RoundBeneficiary.joins(:round_plan_item).where(round_plan_item: {round_plan_id: id}).delete_all
9
9
  end
10
10
 
11
11
  def generate_distribution_list(id)
@@ -14,7 +14,7 @@ module Cats
14
14
  plan_days = round_plan.plan.no_of_round_days
15
15
  rounds = round_plan.rounds.count
16
16
  beneficiaries = Beneficiary.joins(:beneficiary_category).where(
17
- beneficiary_category: { plan_id: round_plan.plan_id }
17
+ beneficiary_category: {plan_id: round_plan.plan_id}
18
18
  ).group_by(&:fdp_id)
19
19
  beneficiaries.each_key do |key|
20
20
  beneficiaries[key] = beneficiaries[key].group_by(&:beneficiary_category_id)
@@ -48,38 +48,38 @@ module Cats
48
48
  end
49
49
 
50
50
  def remove_items(plan_id, ids)
51
- raise(StandardError, 'No beneficiaries specified.') if ids.count.zero?
51
+ raise(StandardError, "No beneficiaries specified.") if ids.count.zero?
52
52
 
53
53
  begin
54
54
  plan = RoundPlan.find(plan_id)
55
55
  rescue ActiveRecord::RecordNotFound
56
- raise(StandardError, 'Round plan not found.') unless plan
56
+ raise(StandardError, "Round plan not found.") unless plan
57
57
  end
58
58
 
59
59
  beneficiaries = RoundBeneficiary.joins(:round_plan_item)
60
- .where(round_plan_item: { round_plan_id: plan_id })
60
+ .where(round_plan_item: {round_plan_id: plan_id})
61
61
  to_delete = RoundBeneficiary.where(id: ids)
62
62
  diff = to_delete - beneficiaries
63
- raise(StandardError, 'Round plan beneficiaries should be from the same plan.') if diff.count.positive?
63
+ raise(StandardError, "Round plan beneficiaries should be from the same plan.") if diff.count.positive?
64
64
 
65
65
  to_delete.delete_all
66
66
  true
67
67
  end
68
68
 
69
69
  def confirm_receipt(plan_id, ids)
70
- raise(StandardError, 'No beneficiaries specified.') if ids.count.zero?
70
+ raise(StandardError, "No beneficiaries specified.") if ids.count.zero?
71
71
 
72
72
  begin
73
73
  plan = RoundPlan.find(plan_id)
74
74
  rescue ActiveRecord::RecordNotFound
75
- raise(StandardError, 'Round plan not found.') unless plan
75
+ raise(StandardError, "Round plan not found.") unless plan
76
76
  end
77
77
 
78
78
  beneficiaries = RoundBeneficiary.joins(:round_plan_item)
79
- .where(round_plan_item: { round_plan_id: plan_id })
79
+ .where(round_plan_item: {round_plan_id: plan_id})
80
80
  to_confirm = RoundBeneficiary.where(id: ids)
81
81
  diff = to_confirm - beneficiaries
82
- raise(StandardError, 'Round plan beneficiaries should be from the same plan.') if diff.count.positive?
82
+ raise(StandardError, "Round plan beneficiaries should be from the same plan.") if diff.count.positive?
83
83
 
84
84
  to_confirm.update_all(received: true)
85
85
  true
@@ -7,8 +7,8 @@ module Cats
7
7
  if plan.upstream
8
8
  # Create source hub authorizations for each item and
9
9
  # put them in a `Source Authorized` state
10
- store = Store.find_by(code: 'SUP-STORE')
11
- keeper = User.find_by(first_name: 'SUP-Storekeeper')
10
+ store = Store.find_by(code: "SUP-STORE")
11
+ keeper = User.find_by(first_name: "SUP-Storekeeper")
12
12
  authorizations = []
13
13
  plan.dispatch_plan_items.each do |item|
14
14
  authorizations << {
@@ -40,17 +40,17 @@ module Cats
40
40
  end
41
41
 
42
42
  def send_notification(allocation)
43
- notification_rule = Cats::Core::NotificationRule.find_by(code: 'allocation')
44
- raise(StandardError, 'Notification rule not found for allocation notification.') unless notification_rule
43
+ notification_rule = Cats::Core::NotificationRule.find_by(code: "allocation")
44
+ raise(StandardError, "Notification rule not found for allocation notification.") unless notification_rule
45
45
 
46
- users = Cats::Core::User.joins(:roles).where(cats_core_roles: { name: notification_rule.roles })
46
+ users = Cats::Core::User.joins(:roles).where(cats_core_roles: {name: notification_rule.roles})
47
47
  allocation.dispatch_plan_items.each do |item|
48
48
  location_id = item.destination_id
49
49
 
50
50
  recipients = users.map do |user|
51
51
  details = user.details
52
- if (details.key?('warehouse') && details['warehouse'] == location_id) ||
53
- (details.key?('hub') && details['hub'] == location_id)
52
+ if (details.key?("warehouse") && details["warehouse"] == location_id) ||
53
+ (details.key?("hub") && details["hub"] == location_id)
54
54
  user
55
55
  end
56
56
  end.compact
@@ -69,9 +69,9 @@ module Cats
69
69
  #
70
70
  def generate(id)
71
71
  details = RoundPlanItemDetail.joins(
72
- beneficiary_round_plan_item: { round_plan_item: :round_plan }
72
+ beneficiary_round_plan_item: {round_plan_item: :round_plan}
73
73
  ).where(
74
- beneficiary_round_plan_item: { cats_core_round_plan_items: { round_plan_id: id } }
74
+ beneficiary_round_plan_item: {cats_core_round_plan_items: {round_plan_id: id}}
75
75
  ).includes(
76
76
  beneficiary_round_plan_item: {
77
77
  round_plan_item: %i[round_plan region zone woreda fdp]
@@ -99,7 +99,7 @@ module Cats
99
99
  {
100
100
  reference_no: nil,
101
101
  dispatchable_id: id,
102
- dispatchable_type: 'Cats::Core::RoundPlan',
102
+ dispatchable_type: "Cats::Core::RoundPlan",
103
103
  items: items
104
104
  }
105
105
  end