cats_core 1.0.12 → 1.0.16
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/models/cats/core/commodity.rb +2 -3
- data/app/models/cats/core/commodity_allocation.rb +19 -0
- data/app/models/cats/core/currency.rb +8 -0
- data/app/models/cats/core/dispatch.rb +14 -0
- data/app/models/cats/core/dispatch_transaction.rb +8 -0
- data/app/models/cats/core/donation.rb +18 -0
- data/app/models/cats/core/gift_certificate.rb +11 -0
- data/app/models/cats/core/hrp.rb +16 -0
- data/app/models/cats/core/hrp_item.rb +12 -0
- data/app/models/cats/core/operator.rb +8 -0
- data/app/models/cats/core/purchase_order.rb +11 -0
- data/app/models/cats/core/ration.rb +12 -0
- data/app/models/cats/core/receipt.rb +19 -0
- data/app/models/cats/core/receipt_transaction.rb +8 -0
- data/app/models/cats/core/stack.rb +2 -2
- data/app/models/cats/core/stack_transaction.rb +8 -0
- data/app/models/cats/core/store.rb +26 -2
- data/app/models/cats/core/supplier.rb +8 -0
- data/app/models/cats/core/transaction.rb +32 -0
- data/app/models/cats/core/user.rb +13 -1
- data/app/services/cats/core/notification_service.rb +3 -6
- data/db/migrate/20210715114910_create_cats_core_users.rb +1 -0
- data/db/migrate/{20210717043620_create_cats_core_locations.rb → 20210716183620_create_cats_core_locations.rb} +0 -0
- data/db/migrate/20210716185529_create_cats_core_currencies.rb +10 -0
- data/db/migrate/20210716210635_create_cats_core_operators.rb +13 -0
- data/db/migrate/20210716210905_create_cats_core_suppliers.rb +14 -0
- data/db/migrate/20210717031216_create_cats_core_rations.rb +19 -0
- data/db/migrate/20210717031810_create_cats_core_hrps.rb +20 -0
- data/db/migrate/20210717032024_create_cats_core_hrp_items.rb +22 -0
- data/db/migrate/20210717032330_create_cats_core_donations.rb +24 -0
- data/db/migrate/20210717032602_create_cats_core_gift_certificates.rb +29 -0
- data/db/migrate/20210717032855_create_cats_core_purchase_orders.rb +21 -0
- data/db/migrate/20210717033223_create_cats_core_commodities.rb +2 -14
- data/db/migrate/20210717140855_create_cats_core_stores.rb +4 -3
- data/db/migrate/20210718042823_create_cats_core_commodity_allocations.rb +23 -0
- data/db/migrate/20210718045516_create_cats_core_dispatches.rb +27 -0
- data/db/migrate/20210718202957_create_cats_core_dispatch_transactions.rb +19 -0
- data/db/migrate/20210727074646_create_cats_core_receipts.rb +20 -0
- data/db/migrate/20210814160628_create_cats_core_receipt_transactions.rb +19 -0
- data/db/migrate/20210814175406_create_cats_core_stack_transactions.rb +19 -0
- data/lib/cats/core/version.rb +1 -1
- data/spec/factories/cats/core/commodities.rb +2 -5
- data/spec/factories/cats/core/commodity_allocations.rb +10 -0
- data/spec/factories/cats/core/currencies.rb +6 -0
- data/spec/factories/cats/core/dispatch_transactions.rb +9 -0
- data/spec/factories/cats/core/dispatches.rb +13 -0
- data/spec/factories/cats/core/donations.rb +11 -0
- data/spec/factories/cats/core/gift_certificates.rb +17 -0
- data/spec/factories/cats/core/hrp_items.rb +9 -0
- data/spec/factories/cats/core/hrps.rb +10 -0
- data/spec/factories/cats/core/locations.rb +5 -0
- data/spec/factories/cats/core/operators.rb +9 -0
- data/spec/factories/cats/core/purchase_orders.rb +10 -0
- data/spec/factories/cats/core/rations.rb +8 -0
- data/spec/factories/cats/core/receipt_transactions.rb +9 -0
- data/spec/factories/cats/core/receipts.rb +10 -0
- data/spec/factories/cats/core/stack_transactions.rb +9 -0
- data/spec/factories/cats/core/stores.rb +2 -2
- data/spec/factories/cats/core/suppliers.rb +10 -0
- data/spec/factories/cats/core/users.rb +1 -0
- metadata +49 -15
- data/app/models/cats/core/commodity_transaction.rb +0 -55
- data/app/models/cats/core/receipt_plan.rb +0 -24
- data/app/models/cats/core/way_bill.rb +0 -12
- data/app/models/cats/core/way_bill_item.rb +0 -15
- data/db/migrate/20210718045516_create_cats_core_way_bills.rb +0 -25
- data/db/migrate/20210718050751_create_cats_core_way_bill_items.rb +0 -18
- data/db/migrate/20210718202957_create_cats_core_commodity_transactions.rb +0 -14
- data/db/migrate/20210727074646_create_cats_core_receipt_plans.rb +0 -16
- data/spec/factories/cats/core/commodity_transactions.rb +0 -10
- data/spec/factories/cats/core/receipt_plans.rb +0 -9
- data/spec/factories/cats/core/way_bill_items.rb +0 -8
- data/spec/factories/cats/core/way_bills.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38525dbc996619fc301d108816acab2e97b65362a5feca9251a6c112b53dc3c6
|
4
|
+
data.tar.gz: 465da29b3725b9f51bd9b9b34857e5b4edfefeaaf24f7d8b7b3cffbd485067c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02b4f3b1693f0eb5a1e4108861a65f0a27a8852682a80a9ee62060cdc58d28849258e9c518909a850157eec2bd963a50bd7cedd6a6439ffbb9dc3e62c175b761
|
7
|
+
data.tar.gz: e6a6d7d6d7af63671e28ae6f48d8128811e5bc04125a70c2027aae0d5604478ff3c0ea056cb33a12b8c0e6105b7db1eea762f2fbd187365c55e3be0738c60b7c
|
@@ -6,11 +6,10 @@ module Cats
|
|
6
6
|
DAMAGED = 'Damaged'.freeze
|
7
7
|
COMMODITY_STATUSES = [GOOD, DAMAGED].freeze
|
8
8
|
|
9
|
-
belongs_to :commodity_category
|
10
|
-
belongs_to :donor
|
11
|
-
belongs_to :program
|
12
9
|
belongs_to :unit_of_measure
|
10
|
+
belongs_to :source, polymorphic: true
|
13
11
|
|
12
|
+
validates :best_use_before, presence: true
|
14
13
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
15
14
|
validates :volume_per_metric_ton, numericality: { greater_than: 0, allow_nil: true }
|
16
15
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class CommodityAllocation < ApplicationRecord
|
4
|
+
belongs_to :commodity
|
5
|
+
belongs_to :source, class_name: 'Cats::Core::Location'
|
6
|
+
belongs_to :destination, class_name: 'Cats::Core::Location'
|
7
|
+
|
8
|
+
validates :quantity, :commodity_status, presence: true
|
9
|
+
validates :commodity_status, inclusion: { in: Cats::Core::Commodity::COMMODITY_STATUSES }
|
10
|
+
validate :validate_source_and_destination
|
11
|
+
|
12
|
+
def validate_source_and_destination
|
13
|
+
return unless source.present? && destination.present?
|
14
|
+
|
15
|
+
errors.add(:base, 'source and destination cannot be the same') if source == destination
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Dispatch < ApplicationRecord
|
4
|
+
belongs_to :prepared_by, class_name: 'Cats::Core::User'
|
5
|
+
belongs_to :transporter
|
6
|
+
belongs_to :commodity_allocation
|
7
|
+
|
8
|
+
validates :reference_no, :plate_no, :driver_name, :driver_phone, :quantity, :commodity_status, presence: true
|
9
|
+
validates :reference_no, uniqueness: true
|
10
|
+
validates :quantity, numericality: { greater_than: 0 }
|
11
|
+
validates :commodity_status, inclusion: { in: Cats::Core::Commodity::COMMODITY_STATUSES }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Donation < ApplicationRecord
|
4
|
+
FUND = 'Fund'.freeze
|
5
|
+
KIND = 'Kind'.freeze
|
6
|
+
DONATION_TYPES = [FUND, KIND].freeze
|
7
|
+
|
8
|
+
belongs_to :donor
|
9
|
+
belongs_to :hrp
|
10
|
+
belongs_to :currency, optional: true
|
11
|
+
|
12
|
+
validates :reference_no, :donation_type, :donated_on, presence: true
|
13
|
+
validates :reference_no, uniqueness: true
|
14
|
+
validates :donation_type, inclusion: { in: DONATION_TYPES }
|
15
|
+
validates :currency, :amount, presence: true, if: -> { donation_type == FUND }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Hrp < ApplicationRecord
|
4
|
+
DRAFT = 'Draft'.freeze
|
5
|
+
APPROVED = 'Approved'.freeze
|
6
|
+
STATUSES = [DRAFT, APPROVED].freeze
|
7
|
+
|
8
|
+
belongs_to :program
|
9
|
+
belongs_to :ration
|
10
|
+
|
11
|
+
validates :reference_no, :year, :season, :status, presence: true
|
12
|
+
validates :reference_no, uniqueness: true
|
13
|
+
validates :status, inclusion: { in: STATUSES }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class HrpItem < ApplicationRecord
|
4
|
+
belongs_to :hrp
|
5
|
+
belongs_to :woreda, -> { where(location_type: Cats::Core::Location::WOREDA) }, class_name: 'Cats::Core::Location'
|
6
|
+
belongs_to :operator
|
7
|
+
|
8
|
+
validates :beneficiaries, presence: true, numericality: { greater_than: 0 }
|
9
|
+
validates :commodity_amount, presence: true, numericality: { greater_than: 0 }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Ration < ApplicationRecord
|
4
|
+
belongs_to :program
|
5
|
+
belongs_to :commodity_category
|
6
|
+
|
7
|
+
validates :reference_no, :amount, presence: true
|
8
|
+
validates :reference_no, uniqueness: true
|
9
|
+
validates :amount, numericality: { greater_than: 0 }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Receipt < ApplicationRecord
|
4
|
+
# Receipt status
|
5
|
+
DRAFT = 'Draft'.freeze
|
6
|
+
ACCEPTED = 'Accepted'.freeze
|
7
|
+
DECLINED = 'Declined'.freeze
|
8
|
+
RECEIPT_STATUSES = [DRAFT, ACCEPTED, DECLINED].freeze
|
9
|
+
|
10
|
+
belongs_to :dispatch
|
11
|
+
belongs_to :prepared_by, class_name: 'Cats::Core::User'
|
12
|
+
|
13
|
+
validates :quantity, :commodity_status, :status, presence: true
|
14
|
+
validates :quantity, numericality: { greater_than: 0 }
|
15
|
+
validates :status, inclusion: { in: RECEIPT_STATUSES }
|
16
|
+
validates :commodity_status, inclusion: { in: Cats::Core::Commodity::COMMODITY_STATUSES }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -9,8 +9,8 @@ module Cats
|
|
9
9
|
|
10
10
|
belongs_to :commodity
|
11
11
|
belongs_to :store
|
12
|
-
has_many :
|
13
|
-
has_many :
|
12
|
+
has_many :dispatch_transactions, foreign_key: :source_id
|
13
|
+
has_many :receipt_transactions, foreign_key: :destination_id
|
14
14
|
|
15
15
|
validates :code, :length, :width, :height, :start_x, :start_y, :commodity_status, :stack_status,
|
16
16
|
:quantity, presence: true
|
@@ -2,10 +2,10 @@ module Cats
|
|
2
2
|
module Core
|
3
3
|
class Store < ApplicationRecord
|
4
4
|
belongs_to :warehouse, class_name: 'Cats::Core::Location'
|
5
|
+
belongs_to :store_keeper, class_name: 'Cats::Core::User'
|
5
6
|
has_many :stacks
|
6
|
-
has_many :receipt_plans, as: :receivable
|
7
7
|
|
8
|
-
validates :name, :
|
8
|
+
validates :name, :length, :width, :height, presence: true
|
9
9
|
validates :length, :width, :height, numericality: { greater_than: 0 }
|
10
10
|
validates :gangway_length, :gangway_width, :gangway_corner_dist, presence: true, if: :has_gangway?
|
11
11
|
validates :gangway_length,
|
@@ -15,11 +15,35 @@ module Cats
|
|
15
15
|
allow_nil: true
|
16
16
|
validate :validate_location
|
17
17
|
|
18
|
+
after_save :update_store_keeper
|
19
|
+
|
18
20
|
def validate_location
|
19
21
|
return if warehouse.nil?
|
20
22
|
|
21
23
|
errors.add(:warehouse, 'must be a valid warehouse') unless warehouse.location_type == Location::WAREHOUSE
|
22
24
|
end
|
25
|
+
|
26
|
+
def store_keeper_name
|
27
|
+
"#{store_keeper.first_name} #{store_keeper.last_name}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def update_store_keeper
|
31
|
+
return unless store_keeper_id_previously_changed?
|
32
|
+
|
33
|
+
unless id_previously_changed?
|
34
|
+
old_storekeeper = Cats::Core::User.find(store_keeper_id_previously_was)
|
35
|
+
old_storekeeper.details['stores'].delete(id)
|
36
|
+
old_storekeeper.save
|
37
|
+
end
|
38
|
+
if store_keeper.details.key?('stores')
|
39
|
+
store_keeper.details['stores'] << id
|
40
|
+
else
|
41
|
+
store_keeper.details['stores'] = [id]
|
42
|
+
end
|
43
|
+
store_keeper.save
|
44
|
+
end
|
45
|
+
|
46
|
+
delegate(:phone_number, to: :store_keeper, prefix: true)
|
23
47
|
end
|
24
48
|
end
|
25
49
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Cats
|
2
|
+
module Core
|
3
|
+
class Transaction < ApplicationRecord
|
4
|
+
self.abstract_class = true
|
5
|
+
|
6
|
+
# Transaction statuses
|
7
|
+
DRAFT = 'Draft'.freeze
|
8
|
+
COMMITTED = 'Committed'.freeze
|
9
|
+
STATUSES = [DRAFT, COMMITTED].freeze
|
10
|
+
|
11
|
+
validates :transaction_date, :quantity, :status, presence: true
|
12
|
+
validates :quantity, numericality: { greater_than: 0 }
|
13
|
+
validates :status, inclusion: { in: STATUSES }
|
14
|
+
validate :validate_quantity
|
15
|
+
|
16
|
+
def validate_quantity
|
17
|
+
return unless quantity.present? && source.present?
|
18
|
+
|
19
|
+
errors.add(:quantity, 'cannot be more than source quantity') if quantity > source.quantity
|
20
|
+
end
|
21
|
+
|
22
|
+
def commit
|
23
|
+
Transaction.transaction do
|
24
|
+
source.quantity -= quantity
|
25
|
+
destination.quantity += quantity
|
26
|
+
source.save
|
27
|
+
destination.save
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -8,9 +8,11 @@ module Cats
|
|
8
8
|
has_and_belongs_to_many :roles, join_table: :cats_core_users_cats_core_roles
|
9
9
|
has_many :notifications, as: :recipient
|
10
10
|
|
11
|
+
validates :password, length: { minimum: 6 }, if: proc { |u| u.password.present? }, on: :update
|
11
12
|
validates :first_name, :last_name, :email, presence: true
|
12
|
-
validates :password, length: { minimum: 6 }
|
13
|
+
validates :password, presence: true, length: { minimum: 6 }, on: :create
|
13
14
|
validates :email, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
|
15
|
+
validate :validate_phone_number
|
14
16
|
|
15
17
|
def warehouses
|
16
18
|
return unless details.key?('warehouses')
|
@@ -23,6 +25,16 @@ module Cats
|
|
23
25
|
|
24
26
|
Cats::Core::Store.where(id: details['stores'])
|
25
27
|
end
|
28
|
+
|
29
|
+
def validate_phone_number
|
30
|
+
return unless phone_number.present?
|
31
|
+
|
32
|
+
return if phone_number.length == 10 && /0\d{9}/.match(phone_number)
|
33
|
+
|
34
|
+
return if phone_number.length == 12 && /251\d{9}/.match(phone_number)
|
35
|
+
|
36
|
+
errors.add(:phone_number, 'must be 10 or 12 digits and should match with local phone pattern')
|
37
|
+
end
|
26
38
|
end
|
27
39
|
end
|
28
40
|
end
|
@@ -16,22 +16,19 @@ module Cats
|
|
16
16
|
}
|
17
17
|
}.freeze
|
18
18
|
|
19
|
-
def initialize(code, params)
|
19
|
+
def initialize(rules, code, params)
|
20
|
+
@rules = rules
|
20
21
|
@code = code
|
21
22
|
@params = params
|
22
23
|
end
|
23
24
|
|
24
|
-
def notification_rules
|
25
|
-
NOTIFICATION_RULES
|
26
|
-
end
|
27
|
-
|
28
25
|
def create_notifier(rule)
|
29
26
|
clazz = rule[:notification].constantize
|
30
27
|
clazz.with(**@params)
|
31
28
|
end
|
32
29
|
|
33
30
|
def notify
|
34
|
-
rule =
|
31
|
+
rule = @rules[@code]
|
35
32
|
notifier = create_notifier(rule)
|
36
33
|
app_code = rule[:application]
|
37
34
|
roles = rule[:recipients]
|
@@ -7,6 +7,7 @@ class CreateCatsCoreUsers < ActiveRecord::Migration[6.1]
|
|
7
7
|
t.boolean :active, null: false, default: true
|
8
8
|
t.string :password_digest
|
9
9
|
t.jsonb :details
|
10
|
+
t.string :phone_number
|
10
11
|
t.references :application_module,
|
11
12
|
null: false,
|
12
13
|
index: { name: 'am_on_users_indx' },
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateCatsCoreOperators < ActiveRecord::Migration[6.1]
|
2
|
+
def change
|
3
|
+
create_table :cats_core_operators do |t|
|
4
|
+
t.string :code, unique: true
|
5
|
+
t.string :name, null: false
|
6
|
+
t.string :description
|
7
|
+
t.string :contact_name, null: false
|
8
|
+
t.string :contact_phone, null: false
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateCatsCoreSuppliers < ActiveRecord::Migration[6.1]
|
2
|
+
def change
|
3
|
+
create_table :cats_core_suppliers do |t|
|
4
|
+
t.string :code, unique: true
|
5
|
+
t.string :name, null: false
|
6
|
+
t.string :description
|
7
|
+
t.string :address
|
8
|
+
t.string :contact_name, null: false
|
9
|
+
t.string :contact_phone, null: false
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|