cats_core 1.4.41 → 1.4.44
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.
- checksums.yaml +4 -4
- data/app/controllers/cats/core/cash_donations_controller.rb +19 -0
- data/app/controllers/cats/core/commodity_donations_controller.rb +22 -0
- data/app/controllers/cats/core/dispatch_plans_controller.rb +24 -0
- data/app/controllers/cats/core/loans_controller.rb +20 -0
- data/app/controllers/cats/core/purchase_orders_controller.rb +24 -0
- data/app/controllers/cats/core/round_beneficiaries_controller.rb +49 -0
- data/app/controllers/cats/core/swaps_controller.rb +21 -0
- data/app/models/cats/core/beneficiary.rb +9 -0
- data/app/models/cats/core/cash_donation.rb +11 -0
- data/app/models/cats/core/commodity_donation.rb +15 -0
- data/app/models/cats/core/dispatch_plan.rb +1 -1
- data/app/models/cats/core/donation.rb +2 -16
- data/app/models/cats/core/gift_certificate.rb +3 -23
- data/app/models/cats/core/loan.rb +15 -0
- data/app/models/cats/core/plan.rb +4 -0
- data/app/models/cats/core/purchase_order.rb +5 -13
- data/app/models/cats/core/rhn_request.rb +4 -4
- data/app/models/cats/core/round_beneficiary.rb +16 -0
- data/app/models/cats/core/round_plan.rb +2 -4
- data/app/models/cats/core/round_plan_item.rb +1 -0
- data/app/models/cats/core/swap.rb +19 -0
- data/app/models/concerns/cats/core/dispatchable.rb +8 -0
- data/app/serializers/cats/core/cash_donation_serializer.rb +8 -0
- data/app/serializers/cats/core/commodity_donation_serializer.rb +9 -0
- data/app/serializers/cats/core/loan_serializer.rb +8 -0
- data/app/serializers/cats/core/purchase_order_serializer.rb +9 -0
- data/app/serializers/cats/core/round_beneficiary_serializer.rb +8 -0
- data/app/serializers/cats/core/swap_serializer.rb +9 -0
- data/app/services/cats/core/beneficiary_service.rb +87 -0
- data/app/services/cats/core/dispatch_plan_service.rb +79 -0
- data/config/routes.rb +19 -0
- data/db/migrate/20210717032330_create_cats_core_commodity_donations.rb +29 -0
- data/db/migrate/20210717032408_create_cats_core_cash_donations.rb +20 -0
- data/db/migrate/20210717032602_create_cats_core_gift_certificates.rb +2 -8
- data/db/migrate/20210717032855_create_cats_core_purchase_orders.rb +9 -5
- data/db/migrate/20220511082354_create_cats_core_beneficiaries.rb +4 -0
- data/db/migrate/20220626063501_create_cats_core_loans.rb +21 -0
- data/db/migrate/20220626063757_create_cats_core_swaps.rb +29 -0
- data/db/migrate/20220626132050_create_cats_core_round_beneficiaries.rb +26 -0
- data/lib/cats/core/version.rb +1 -1
- data/spec/factories/cats/core/beneficiaries.rb +1 -0
- data/spec/factories/cats/core/cash_donations.rb +10 -0
- data/spec/factories/cats/core/{donations.rb → commodity_donations.rb} +3 -6
- data/spec/factories/cats/core/gift_certificates.rb +5 -6
- data/spec/factories/cats/core/loans.rb +11 -0
- data/spec/factories/cats/core/projects.rb +1 -1
- data/spec/factories/cats/core/purchase_orders.rb +3 -1
- data/spec/factories/cats/core/round_beneficiaries.rb +10 -0
- data/spec/factories/cats/core/swaps.rb +13 -0
- metadata +33 -7
- data/db/migrate/20210717032330_create_cats_core_donations.rb +0 -35
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fba88be856ad7a27b81c7eca20c2867775d1bd9963b84d6fa4b48ddaa688008f
         | 
| 4 | 
            +
              data.tar.gz: 50ed67dd7ae4dca66b27205764d13c9a72b53d4088158c09b0165c45f4bd12e2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2ed1ee00dbfc76d8bee529ac9e2788b83183159c8f27059b5c14fafab2129ba60b04d83bf503e5efd1e45581391f9a033d18c00ba24bdc6ca15aee3155f5706e
         | 
| 7 | 
            +
              data.tar.gz: 2ed989fb152cf0488ce958c373b66b0e1dca324453d82d1ffe3139e4abca362c9926373bc6eb60e85ddb9a7901b466f07711766b682f90de3f020f01df2764df
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class CashDonationsController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    super do
         | 
| 8 | 
            +
                      CashDonation.includes(:donor, :currency).all
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def model_params
         | 
| 15 | 
            +
                    params.require(:payload).permit(:reference_no, :description, :donated_on, :donor_id, :amount, :currency_id)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class CommodityDonationsController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    super do
         | 
| 8 | 
            +
                      CommodityDonation.includes(:donor, :plan, :unit, :commodity_category).all
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def model_params
         | 
| 15 | 
            +
                    params.require(:payload).permit(
         | 
| 16 | 
            +
                      :reference_no, :description, :shipping_reference, :donated_on, :donor_id, :plan_id, :quantity,
         | 
| 17 | 
            +
                      :commodity_category_id, :unit_id
         | 
| 18 | 
            +
                    )
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -27,6 +27,18 @@ module Cats | |
| 27 27 | 
             
                    render json: { success: false, error: e.message }, status: :unprocessable_entity
         | 
| 28 28 | 
             
                  end
         | 
| 29 29 |  | 
| 30 | 
            +
                  def generate
         | 
| 31 | 
            +
                    service = DispatchPlanService.new
         | 
| 32 | 
            +
                    items = service.generate(params[:id])
         | 
| 33 | 
            +
                    render json: { success: true, data: serialize(items) }
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def bulk_create
         | 
| 37 | 
            +
                    service = DispatchPlanService.new
         | 
| 38 | 
            +
                    plan = service.bulk_create(bulk_create_params, current_user)
         | 
| 39 | 
            +
                    render json: { success: true, data: serialize(plan) }
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 30 42 | 
             
                  def approve
         | 
| 31 43 | 
             
                    service = DispatchPlanService.new
         | 
| 32 44 | 
             
                    plan = DispatchPlan.find(params[:id])
         | 
| @@ -41,6 +53,18 @@ module Cats | |
| 41 53 | 
             
                  def model_params
         | 
| 42 54 | 
             
                    params.require(:payload).permit(:reference_no, :dispatchable_id, :dispatchable_type)
         | 
| 43 55 | 
             
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  def bulk_create_params
         | 
| 58 | 
            +
                    params.require(:payload).permit(
         | 
| 59 | 
            +
                      :reference_no,
         | 
| 60 | 
            +
                      :dispatchable_id,
         | 
| 61 | 
            +
                      :dispatchable_type,
         | 
| 62 | 
            +
                      items: %i[
         | 
| 63 | 
            +
                        reference_no region zone woreda fdp commodity_category unit_id unit quantity source_id destination_id
         | 
| 64 | 
            +
                        commodity_id
         | 
| 65 | 
            +
                      ]
         | 
| 66 | 
            +
                    )
         | 
| 67 | 
            +
                  end
         | 
| 44 68 | 
             
                end
         | 
| 45 69 | 
             
              end
         | 
| 46 70 | 
             
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class LoansController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    super do
         | 
| 8 | 
            +
                      Loan.includes(:commodity_category, :unit).all
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def model_params
         | 
| 15 | 
            +
                    params.require(:payload).permit(:reference_no, :lender, :agreement_date, :repayment_date, :quantity, :unit_id,
         | 
| 16 | 
            +
                                                    :commodity_category_id)
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class PurchaseOrdersController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    purchase_orders = Cats::Core::PurchaseOrder.where(cash_donation_id: params[:id]).includes(
         | 
| 8 | 
            +
                      :commodity_category,
         | 
| 9 | 
            +
                      :unit,
         | 
| 10 | 
            +
                      :currency
         | 
| 11 | 
            +
                    )
         | 
| 12 | 
            +
                    render json: { success: true, data: serialize(purchase_orders) }
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  private
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def model_params
         | 
| 18 | 
            +
                    params.require(:payload).permit(:reference_no, :order_date, :requisition_no, :supplier, :cash_donation_id,
         | 
| 19 | 
            +
                                                    :commodity_category_id, :quantity, :purchase_type, :unit_id, :price,
         | 
| 20 | 
            +
                                                    :currency_id)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class RoundBeneficiariesController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    beneficiaries = RoundBeneficiary.joins(:round_plan_item)
         | 
| 8 | 
            +
                                                    .where(round_plan_item: { round_plan_id: params[:id] })
         | 
| 9 | 
            +
                                                    .includes(:beneficiary, :commodity_category, :unit)
         | 
| 10 | 
            +
                    render json: { success: true, data: serialize(beneficiaries) }
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def generate
         | 
| 14 | 
            +
                    service = BeneficiaryService.new
         | 
| 15 | 
            +
                    result = service.generate_distribution_list(params[:id])
         | 
| 16 | 
            +
                    render json: { success: result }
         | 
| 17 | 
            +
                  rescue StandardError => e
         | 
| 18 | 
            +
                    render json: { success: false, error: e.message }
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def filter
         | 
| 22 | 
            +
                    query = RoundBeneficiary.includes(:beneficiary, :commodity_category, :unit).ransack(params[:q])
         | 
| 23 | 
            +
                    render json: { success: true, data: serialize(query.result) }
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def remove_beneficiaries
         | 
| 27 | 
            +
                    service = BeneficiaryService.new
         | 
| 28 | 
            +
                    result = service.remove_items(params[:id], common_params[:ids])
         | 
| 29 | 
            +
                    render json: { success: result }
         | 
| 30 | 
            +
                  rescue StandardError => e
         | 
| 31 | 
            +
                    render json: { success: false, error: e.message }
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def confirm_receipt
         | 
| 35 | 
            +
                    service = BeneficiaryService.new
         | 
| 36 | 
            +
                    result = service.confirm_receipt(params[:id], common_params[:ids])
         | 
| 37 | 
            +
                    render json: { success: result }
         | 
| 38 | 
            +
                  rescue StandardError => e
         | 
| 39 | 
            +
                    render json: { success: false, error: e.message }
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  private
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def common_params
         | 
| 45 | 
            +
                    params.permit(ids: [])
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class SwapsController < ApplicationController
         | 
| 4 | 
            +
                  include Common
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def index
         | 
| 7 | 
            +
                    super do
         | 
| 8 | 
            +
                      Swap.includes(:issued_commodity, :issued_unit, :received_commodity, :received_unit).all
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def model_params
         | 
| 15 | 
            +
                    params.require(:payload).permit(:reference_no, :swapper, :agreement_date, :issued_commodity_id,
         | 
| 16 | 
            +
                                                    :issued_quantity, :received_commodity_id, :received_quantity,
         | 
| 17 | 
            +
                                                    :issued_unit_id, :received_unit_id)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -6,12 +6,21 @@ module Cats | |
| 6 6 | 
             
                  GENDERS = [MALE, FEMALE].freeze
         | 
| 7 7 |  | 
| 8 8 | 
             
                  belongs_to :beneficiary_category
         | 
| 9 | 
            +
                  belongs_to :fdp, class_name: 'Location'
         | 
| 9 10 |  | 
| 10 11 | 
             
                  validates :full_name, :age, :gender, presence: true
         | 
| 11 12 | 
             
                  validates :gender, inclusion: { in: GENDERS }
         | 
| 12 13 | 
             
                  validates :age, numericality: { greater_than: 0, less_than: 100 }
         | 
| 14 | 
            +
                  validate :validate_fdp
         | 
| 13 15 |  | 
| 14 16 | 
             
                  delegate(:name, to: :beneficiary_category, prefix: true)
         | 
| 17 | 
            +
                  delegate(:name, to: :fdp, prefix: true)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def validate_fdp
         | 
| 20 | 
            +
                    return unless fdp
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    errors.add(:fdp, 'should be a valid distribution point.') unless fdp.location_type == Location::FDP
         | 
| 23 | 
            +
                  end
         | 
| 15 24 | 
             
                end
         | 
| 16 25 | 
             
              end
         | 
| 17 26 | 
             
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class CommodityDonation < Donation
         | 
| 4 | 
            +
                  belongs_to :plan, optional: true
         | 
| 5 | 
            +
                  belongs_to :commodity_category
         | 
| 6 | 
            +
                  belongs_to :unit, class_name: 'UnitOfMeasure'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  validates :quantity, presence: true, numericality: { greater_than: 0 }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  delegate(:reference_no, to: :plan, prefix: true, allow_nil: true)
         | 
| 11 | 
            +
                  delegate(:name, to: :commodity_category, prefix: true)
         | 
| 12 | 
            +
                  delegate(:abbreviation, to: :unit, prefix: true)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -32,7 +32,7 @@ module Cats | |
| 32 32 |  | 
| 33 33 | 
             
                    return if dispatchable.status == RhnRequest::APPROVED
         | 
| 34 34 |  | 
| 35 | 
            -
                    errors.add(:dispatchable, 'is already reserved.') if id.nil?
         | 
| 35 | 
            +
                    errors.add(:dispatchable, 'is already reserved.') if id.nil? && dispatchable.status == Dispatchable::RESERVED
         | 
| 36 36 | 
             
                  end
         | 
| 37 37 |  | 
| 38 38 | 
             
                  def approve
         | 
| @@ -1,28 +1,14 @@ | |
| 1 1 | 
             
            module Cats
         | 
| 2 2 | 
             
              module Core
         | 
| 3 3 | 
             
                class Donation < ApplicationRecord
         | 
| 4 | 
            -
                   | 
| 5 | 
            -
                  KIND = 'Kind'.freeze
         | 
| 6 | 
            -
                  DONATION_TYPES = [CASH, KIND].freeze
         | 
| 4 | 
            +
                  self.abstract_class = true
         | 
| 7 5 |  | 
| 8 6 | 
             
                  belongs_to :donor
         | 
| 9 | 
            -
                  belongs_to :plan, optional: true
         | 
| 10 | 
            -
                  belongs_to :currency, optional: true
         | 
| 11 | 
            -
                  belongs_to :commodity_category, optional: true
         | 
| 12 | 
            -
                  belongs_to :unit_of_measure, optional: true
         | 
| 13 7 |  | 
| 14 | 
            -
                  validates :reference_no, : | 
| 8 | 
            +
                  validates :reference_no, :donated_on, presence: true
         | 
| 15 9 | 
             
                  validates :reference_no, uniqueness: true
         | 
| 16 | 
            -
                  validates :donation_type, inclusion: { in: DONATION_TYPES }
         | 
| 17 | 
            -
                  validates :currency, presence: true, if: -> { donation_type == CASH }
         | 
| 18 | 
            -
                  validates :commodity_category, presence: true, if: -> { donation_type == KIND }
         | 
| 19 | 
            -
                  validates :unit_of_measure, presence: true, if: -> { donation_type == KIND }
         | 
| 20 10 |  | 
| 21 11 | 
             
                  delegate(:name, to: :donor, prefix: true)
         | 
| 22 | 
            -
                  delegate(:reference_no, to: :plan, prefix: true, allow_nil: true)
         | 
| 23 | 
            -
                  delegate(:name, to: :commodity_category, prefix: true, allow_nil: true)
         | 
| 24 | 
            -
                  delegate(:code, to: :currency, prefix: true, allow_nil: true)
         | 
| 25 | 
            -
                  delegate(:abbreviation, to: :unit_of_measure, prefix: true, allow_nil: true)
         | 
| 26 12 | 
             
                end
         | 
| 27 13 | 
             
              end
         | 
| 28 14 | 
             
            end
         | 
| @@ -3,9 +3,9 @@ module Cats | |
| 3 3 | 
             
                class GiftCertificate < ApplicationRecord
         | 
| 4 4 | 
             
                  belongs_to :donation, optional: true
         | 
| 5 5 | 
             
                  belongs_to :commodity_category
         | 
| 6 | 
            -
                  belongs_to : | 
| 6 | 
            +
                  belongs_to :unit, class_name: 'UnitOfMeasure'
         | 
| 7 7 | 
             
                  belongs_to :currency
         | 
| 8 | 
            -
                  belongs_to :destination_warehouse, class_name: ' | 
| 8 | 
            +
                  belongs_to :destination_warehouse, class_name: 'Location'
         | 
| 9 9 |  | 
| 10 10 | 
             
                  validates :reference_no, presence: true, uniqueness: true
         | 
| 11 11 | 
             
                  validates :gift_date, :quantity, :requested_by, :customs_office, presence: true
         | 
| @@ -13,28 +13,8 @@ module Cats | |
| 13 13 |  | 
| 14 14 | 
             
                  delegate(:name, to: :commodity_category, prefix: true)
         | 
| 15 15 | 
             
                  delegate(:name, to: :destination_warehouse, prefix: true)
         | 
| 16 | 
            -
                  delegate(:abbreviation, to: : | 
| 16 | 
            +
                  delegate(:abbreviation, to: :unit, prefix: true)
         | 
| 17 17 | 
             
                  delegate(:code, to: :currency, prefix: true)
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                  before_validation :set_commodity_category
         | 
| 20 | 
            -
                  after_create :update_donation
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def update_donation
         | 
| 23 | 
            -
                    return unless donation
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                    return if donation.active
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    donation.active = true
         | 
| 28 | 
            -
                    donation.save!
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def set_commodity_category
         | 
| 32 | 
            -
                    return unless donation
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                    return if commodity_category == donation.commodity_category
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                    self.commodity_category = donation.commodity_category
         | 
| 37 | 
            -
                  end
         | 
| 38 18 | 
             
                end
         | 
| 39 19 | 
             
              end
         | 
| 40 20 | 
             
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class Loan < ApplicationRecord
         | 
| 4 | 
            +
                  belongs_to :commodity_category
         | 
| 5 | 
            +
                  belongs_to :unit, class_name: 'UnitOfMeasure'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  validates :reference_no, presence: true, uniqueness: true
         | 
| 8 | 
            +
                  validates :lender, :agreement_date, presence: true
         | 
| 9 | 
            +
                  validates :quantity, presence: true, numericality: { greater_than: 0 }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  delegate(:name, to: :commodity_category, prefix: true)
         | 
| 12 | 
            +
                  delegate(:abbreviation, to: :unit, prefix: true)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -5,27 +5,19 @@ module Cats | |
| 5 5 | 
             
                  FOREIGN = 'Foreign'.freeze
         | 
| 6 6 | 
             
                  PURCHASE_TYPES = [LOCAL, FOREIGN].freeze
         | 
| 7 7 |  | 
| 8 | 
            -
                  belongs_to : | 
| 8 | 
            +
                  belongs_to :cash_donation
         | 
| 9 9 | 
             
                  belongs_to :commodity_category
         | 
| 10 | 
            +
                  belongs_to :currency
         | 
| 10 11 | 
             
                  belongs_to :unit, class_name: 'Cats::Core::UnitOfMeasure'
         | 
| 11 12 |  | 
| 12 | 
            -
                  validates :reference_no, :order_date, :supplier, : | 
| 13 | 
            +
                  validates :reference_no, :order_date, :supplier, :purchase_type, presence: true
         | 
| 13 14 | 
             
                  validates :reference_no, uniqueness: true
         | 
| 14 15 | 
             
                  validates :purchase_type, inclusion: { in: PURCHASE_TYPES }
         | 
| 15 | 
            -
                  validates :quantity, numericality: { greater_than: 0 }
         | 
| 16 | 
            +
                  validates :quantity, :price, presence: true, numericality: { greater_than: 0 }
         | 
| 16 17 |  | 
| 17 18 | 
             
                  delegate(:name, to: :commodity_category, prefix: true)
         | 
| 18 19 | 
             
                  delegate(:name, to: :unit, prefix: true)
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  after_create :update_donation
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def update_donation
         | 
| 23 | 
            -
                    donation = self.donation
         | 
| 24 | 
            -
                    return if donation.active
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                    donation.active = true
         | 
| 27 | 
            -
                    donation.save!
         | 
| 28 | 
            -
                  end
         | 
| 20 | 
            +
                  delegate(:code, to: :currency, prefix: true)
         | 
| 29 21 | 
             
                end
         | 
| 30 22 | 
             
              end
         | 
| 31 23 | 
             
            end
         | 
| @@ -3,11 +3,11 @@ module Cats | |
| 3 3 | 
             
                class RhnRequest < ApplicationRecord
         | 
| 4 4 | 
             
                  include Dispatchable
         | 
| 5 5 |  | 
| 6 | 
            -
                  DRAFT = 'Draft'.freeze
         | 
| 7 | 
            -
                  APPROVED = 'Approved'.freeze
         | 
| 8 | 
            -
                  RESERVED = 'Reserved'.freeze
         | 
| 6 | 
            +
                  # DRAFT = 'Draft'.freeze
         | 
| 7 | 
            +
                  # APPROVED = 'Approved'.freeze
         | 
| 8 | 
            +
                  # RESERVED = 'Reserved'.freeze
         | 
| 9 9 | 
             
                  ALLOCATED = 'Allocated'.freeze
         | 
| 10 | 
            -
                  STATUSES  | 
| 10 | 
            +
                  STATUSES << ALLOCATED
         | 
| 11 11 |  | 
| 12 12 | 
             
                  belongs_to :commodity
         | 
| 13 13 |  | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class RoundBeneficiary < ApplicationRecord
         | 
| 4 | 
            +
                  belongs_to :beneficiary
         | 
| 5 | 
            +
                  belongs_to :round_plan_item
         | 
| 6 | 
            +
                  belongs_to :commodity_category
         | 
| 7 | 
            +
                  belongs_to :unit, class_name: 'UnitOfMeasure'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  validates :quantity, presence: true, numericality: { greater_than: 0 }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  delegate(:full_name, to: :beneficiary, prefix: true)
         | 
| 12 | 
            +
                  delegate(:name, to: :commodity_category, prefix: true)
         | 
| 13 | 
            +
                  delegate(:abbreviation, to: :unit, prefix: true)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -3,12 +3,9 @@ module Cats | |
| 3 3 | 
             
                class RoundPlan < ApplicationRecord
         | 
| 4 4 | 
             
                  include Dispatchable
         | 
| 5 5 |  | 
| 6 | 
            -
                  DRAFT = 'Draft'.freeze
         | 
| 7 | 
            -
                  APPROVED = 'Approved'.freeze
         | 
| 8 | 
            -
                  RESERVED = 'Reserved'.freeze
         | 
| 9 6 | 
             
                  NEEDS_APPROVED = 'Needs Approved'.freeze
         | 
| 10 7 |  | 
| 11 | 
            -
                  STATUSES  | 
| 8 | 
            +
                  STATUSES << NEEDS_APPROVED
         | 
| 12 9 |  | 
| 13 10 | 
             
                  belongs_to :plan
         | 
| 14 11 | 
             
                  belongs_to :region, class_name: 'Cats::Core::Location'
         | 
| @@ -17,6 +14,7 @@ module Cats | |
| 17 14 | 
             
                  has_many :round_rations
         | 
| 18 15 | 
             
                  has_many :beneficiary_round_plan_items, through: :round_plan_items
         | 
| 19 16 | 
             
                  has_many :round_plan_item_details, through: :beneficiary_round_plan_items
         | 
| 17 | 
            +
                  has_many :round_beneficiaries, through: :round_plan_items
         | 
| 20 18 |  | 
| 21 19 | 
             
                  validates :rounds, presence: true
         | 
| 22 20 | 
             
                  validates :reference_no, presence: true, uniqueness: true
         | 
| @@ -10,6 +10,7 @@ module Cats | |
| 10 10 |  | 
| 11 11 | 
             
                  has_many :beneficiary_round_plan_items
         | 
| 12 12 | 
             
                  has_many :round_plan_item_details, through: :beneficiary_round_plan_items
         | 
| 13 | 
            +
                  has_many :round_beneficiaries
         | 
| 13 14 |  | 
| 14 15 | 
             
                  validates :plan_item_id, presence: true
         | 
| 15 16 | 
             
                  validates :round_plan_id, uniqueness: { scope: :fdp_id }
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class Swap < ApplicationRecord
         | 
| 4 | 
            +
                  belongs_to :issued_commodity, class_name: 'CommodityCategory'
         | 
| 5 | 
            +
                  belongs_to :issued_unit, class_name: 'UnitOfMeasure'
         | 
| 6 | 
            +
                  belongs_to :received_commodity, class_name: 'CommodityCategory'
         | 
| 7 | 
            +
                  belongs_to :received_unit, class_name: 'UnitOfMeasure'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  validates :reference_no, presence: true, uniqueness: true
         | 
| 10 | 
            +
                  validates :swapper, :agreement_date, :issued_quantity, :received_quantity, presence: true
         | 
| 11 | 
            +
                  validates :issued_quantity, :received_quantity, presence: true, numericality: { greater_than: 0 }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  delegate(:name, to: :issued_commodity, prefix: true)
         | 
| 14 | 
            +
                  delegate(:name, to: :received_commodity, prefix: true)
         | 
| 15 | 
            +
                  delegate(:abbreviation, to: :issued_unit, prefix: true)
         | 
| 16 | 
            +
                  delegate(:abbreviation, to: :received_unit, prefix: true)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -7,6 +7,14 @@ module Cats | |
| 7 7 | 
             
                module Dispatchable
         | 
| 8 8 | 
             
                  extend ActiveSupport::Concern
         | 
| 9 9 |  | 
| 10 | 
            +
                  DRAFT = 'Draft'.freeze
         | 
| 11 | 
            +
                  APPROVED = 'Approved'.freeze
         | 
| 12 | 
            +
                  RESERVED = 'Reserved'.freeze
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  # rubocop:disable Style/MutableConstant
         | 
| 15 | 
            +
                  STATUSES = [DRAFT, APPROVED, RESERVED]
         | 
| 16 | 
            +
                  # rubocop:enable Style/MutableConstant
         | 
| 17 | 
            +
             | 
| 10 18 | 
             
                  included do
         | 
| 11 19 | 
             
                    has_many :dispatch_plans, as: :dispatchable
         | 
| 12 20 | 
             
                  end
         | 
| @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class CommodityDonationSerializer < ActiveModel::Serializer
         | 
| 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
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class PurchaseOrderSerializer < ActiveModel::Serializer
         | 
| 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
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class RoundBeneficiarySerializer < ActiveModel::Serializer
         | 
| 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
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class SwapSerializer < ActiveModel::Serializer
         | 
| 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
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| @@ -0,0 +1,87 @@ | |
| 1 | 
            +
            module Cats
         | 
| 2 | 
            +
              module Core
         | 
| 3 | 
            +
                class BeneficiaryService
         | 
| 4 | 
            +
                  def clear_distribution_list(id)
         | 
| 5 | 
            +
                    round_plan = RoundPlan.find(id)
         | 
| 6 | 
            +
                    raise(StandardError, 'Round plan is not in draft state.') unless round_plan.status == RoundPlan::DRAFT
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    RoundBeneficiary.joins(:round_plan_item).where(round_plan_item: { round_plan_id: id }).delete_all
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def generate_distribution_list(id)
         | 
| 12 | 
            +
                    clear_distribution_list(id)
         | 
| 13 | 
            +
                    round_plan = RoundPlan.find(id)
         | 
| 14 | 
            +
                    plan_days = round_plan.plan.no_of_round_days
         | 
| 15 | 
            +
                    rounds = round_plan.rounds.count
         | 
| 16 | 
            +
                    beneficiaries = Beneficiary.joins(:beneficiary_category).where(
         | 
| 17 | 
            +
                      beneficiary_category: { plan_id: round_plan.plan_id }
         | 
| 18 | 
            +
                    ).group_by(&:fdp_id)
         | 
| 19 | 
            +
                    beneficiaries.each_key do |key|
         | 
| 20 | 
            +
                      beneficiaries[key] = beneficiaries[key].group_by(&:beneficiary_category_id)
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                    rations = round_plan.round_rations
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    round_beneficiaries = []
         | 
| 25 | 
            +
                    round_plan.round_plan_items.each do |rpi|
         | 
| 26 | 
            +
                      fdp_beneficiaries = beneficiaries[rpi.fdp_id]
         | 
| 27 | 
            +
                      fdp_beneficiaries.each_key do |key|
         | 
| 28 | 
            +
                        category_rations = rations.select { |r| r.beneficiary_category_id == key }
         | 
| 29 | 
            +
                        category_rations.each do |ration|
         | 
| 30 | 
            +
                          fdp_beneficiaries[key].each do |beneficiary|
         | 
| 31 | 
            +
                            round_beneficiaries << {
         | 
| 32 | 
            +
                              beneficiary_id: beneficiary.id,
         | 
| 33 | 
            +
                              round_plan_item_id: rpi.id,
         | 
| 34 | 
            +
                              commodity_category_id: ration.commodity_category_id,
         | 
| 35 | 
            +
                              quantity: plan_days / ration.no_of_days * ration.quantity * rounds,
         | 
| 36 | 
            +
                              unit_id: ration.unit_of_measure_id,
         | 
| 37 | 
            +
                              received: false
         | 
| 38 | 
            +
                            }
         | 
| 39 | 
            +
                          end
         | 
| 40 | 
            +
                        end
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    RoundBeneficiary.insert_all!(round_beneficiaries, record_timestamps: true)
         | 
| 45 | 
            +
                    true
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  def remove_items(plan_id, ids)
         | 
| 49 | 
            +
                    raise(StandardError, 'No beneficiaries specified.') if ids.count.zero?
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    begin
         | 
| 52 | 
            +
                      plan = RoundPlan.find(plan_id)
         | 
| 53 | 
            +
                    rescue ActiveRecord::RecordNotFound
         | 
| 54 | 
            +
                      raise(StandardError, 'Round plan not found.') unless plan
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    beneficiaries = RoundBeneficiary.joins(:round_plan_item)
         | 
| 58 | 
            +
                                                    .where(round_plan_item: { round_plan_id: plan_id })
         | 
| 59 | 
            +
                    to_delete = RoundBeneficiary.where(id: ids)
         | 
| 60 | 
            +
                    diff = to_delete - beneficiaries
         | 
| 61 | 
            +
                    raise(StandardError, 'Round plan beneficiaries should be from the same plan.') if diff.count.positive?
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    to_delete.delete_all
         | 
| 64 | 
            +
                    true
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  def confirm_receipt(plan_id, ids)
         | 
| 68 | 
            +
                    raise(StandardError, 'No beneficiaries specified.') if ids.count.zero?
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    begin
         | 
| 71 | 
            +
                      plan = RoundPlan.find(plan_id)
         | 
| 72 | 
            +
                    rescue ActiveRecord::RecordNotFound
         | 
| 73 | 
            +
                      raise(StandardError, 'Round plan not found.') unless plan
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    beneficiaries = RoundBeneficiary.joins(:round_plan_item)
         | 
| 77 | 
            +
                                                    .where(round_plan_item: { round_plan_id: plan_id })
         | 
| 78 | 
            +
                    to_confirm = RoundBeneficiary.where(id: ids)
         | 
| 79 | 
            +
                    diff = to_confirm - beneficiaries
         | 
| 80 | 
            +
                    raise(StandardError, 'Round plan beneficiaries should be from the same plan.') if diff.count.positive?
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    to_confirm.update_all(received: true)
         | 
| 83 | 
            +
                    true
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
            end
         |