ecom_core 1.2.6 → 1.2.12

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/constants/ecom/core/status_constants.rb +11 -0
  3. data/app/controllers/ecom/core/access_controller.rb +1 -1
  4. data/app/models/ecom/core/attendance_sheet.rb +24 -18
  5. data/app/models/ecom/core/booked_equipment.rb +19 -0
  6. data/app/models/ecom/core/booking_request.rb +26 -0
  7. data/app/models/ecom/core/component_type.rb +6 -0
  8. data/app/models/ecom/core/country.rb +6 -0
  9. data/app/models/ecom/core/crew.rb +8 -2
  10. data/app/models/ecom/core/crew_overtime.rb +5 -0
  11. data/app/models/ecom/core/crew_time.rb +7 -2
  12. data/app/models/ecom/core/equipment_component.rb +1 -0
  13. data/app/models/ecom/core/equipment_item.rb +14 -2
  14. data/app/models/ecom/core/overtime_sheet.rb +9 -9
  15. data/app/models/ecom/core/payroll.rb +4 -0
  16. data/app/validators/ecom/core/date_range_validator.rb +11 -0
  17. data/config/database.ci.yml +1 -0
  18. data/db/migrate/20191225100054_create_ecom_core_crews.rb +3 -1
  19. data/db/migrate/20191225140433_create_ecom_core_attendance_sheets.rb +2 -1
  20. data/db/migrate/20200315152143_create_ecom_core_equipment.rb +2 -0
  21. data/db/migrate/20200315153640_create_ecom_core_equipment_items.rb +6 -1
  22. data/db/migrate/20200316125323_create_ecom_core_equipment_components.rb +5 -0
  23. data/db/migrate/20200410090701_create_ecom_core_overtime_sheets.rb +3 -1
  24. data/db/migrate/20200602130247_create_ecom_core_booking_requests.rb +31 -0
  25. data/db/migrate/20200603115317_create_ecom_core_booked_equipments.rb +24 -0
  26. data/lib/ecom/core/version.rb +1 -1
  27. data/spec/factories/ecom/core/attendance_sheets.rb +1 -1
  28. data/spec/factories/ecom/core/booked_equipments.rb +10 -0
  29. data/spec/factories/ecom/core/booking_requests.rb +15 -0
  30. data/spec/factories/ecom/core/component_types.rb +5 -0
  31. data/spec/factories/ecom/core/countries.rb +5 -0
  32. data/spec/factories/ecom/core/crews.rb +2 -0
  33. data/spec/factories/ecom/core/equipment.rb +2 -0
  34. data/spec/factories/ecom/core/equipment_components.rb +2 -0
  35. data/spec/factories/ecom/core/equipment_items.rb +3 -1
  36. data/spec/factories/ecom/core/overtime_sheets.rb +1 -1
  37. data/spec/factories/ecom/core/users.rb +1 -0
  38. data/spec/factories/ecom/core/work_products.rb +1 -1
  39. metadata +14 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa793b02a7d9a24882708250c891541910d0f2d4d97c8e713f0226a03da2c7b9
4
- data.tar.gz: 102319f9e9313bac6294441dbb4218dc3ed61fd527b4e5fdc81fbf6e3f70032e
3
+ metadata.gz: 53e6b8c84820dca6b1121f9f33ffdffc3f421c2a7aced743a21bac89c25b7580
4
+ data.tar.gz: 557e5da2ed61cca47e0e80002469f9798d9eb96f26a8357f897beea42c4a0062
5
5
  SHA512:
6
- metadata.gz: a80e478986df2a080fc9573565fcbe99bb75313c95a54946d74b731633c2f67877dc9371ddd014c9cbd6b358edeef1319b2e8c00b632a2c404b03479eb4e7c97
7
- data.tar.gz: 3bcfcd09666b8847e6d61ae03908a799eb7ce02322fa97f42a78a2d4dbdac81a40aa22d4cf44967a0bd52ecea8587b8120f71248aaf7feb55e0ad6c0b5a5f809
6
+ metadata.gz: 23b9c88cb223aa6afec885e5937089695952810e383121f9511a94b58fa5c8fe86787aad5573a61d382511d31bb643a40ba1fe0b50dafe1ea9e4ba7bbf82060f
7
+ data.tar.gz: d35a3ede79f6735372668c8812e2b49f3b6653bdd577f6b95b936f2a23177c2f8467c3d307a42b07363d6d36189e0374e351305c8908bcdc20ccc3ce1453d666
@@ -0,0 +1,11 @@
1
+ module Ecom
2
+ module Core
3
+ class StatusConstants
4
+ OPEN = 'Open'.freeze
5
+ SUBMITTED = 'Submitted'.freeze
6
+ APPROVED = 'Approved'.freeze
7
+
8
+ STATUSES = [OPEN, SUBMITTED, APPROVED].freeze
9
+ end
10
+ end
11
+ end
@@ -18,7 +18,7 @@ module Ecom
18
18
  return
19
19
  end
20
20
 
21
- payload = { id: user.id, email: user.email, name: user.full_name, roles: roles }
21
+ payload = { id: user.id, email: user.email, name: user.full_name, roles: roles, projects: user.projects }
22
22
  jwt = TokenAuthService.issue(payload)
23
23
  render json: { token: jwt, user: payload, error: nil }
24
24
  else
@@ -1,37 +1,43 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class AttendanceSheet < ApplicationRecord
4
- OPEN = 'Open'.freeze
5
- SUBMITTED = 'Submitted'.freeze
6
- APPROVED = 'Approved'.freeze
7
-
8
- validates :date, presence: true, uniqueness: true
9
- validates :status, inclusion: [OPEN, SUBMITTED, APPROVED]
4
+ validates :date, presence: true, uniqueness: { scope: :project_id }
5
+ validates :status, inclusion: StatusConstants::STATUSES
10
6
 
11
7
  belongs_to :project
12
8
 
13
9
  has_many :attendance_sheet_entries
14
10
  has_many :crew_times, through: :attendance_sheet_entries
15
11
 
16
- scope :open, ->(id) { where(status: OPEN, project_id: id) }
17
- scope :submitted, ->(id) { where(status: SUBMITTED, project_id: id) }
18
- scope :current, ->(id) { where(date: Date.today, project_id: id) }
19
- scope :current_open, ->(id) { where(date: Date.today, project_id: id, status: OPEN) }
12
+ scope :by_project, ->(id) { where(project_id: id) }
13
+ scope :by_date, ->(date) { where(date: date) }
14
+ scope :by_status, ->(status) { where(status: status) }
15
+ scope :by_date_between, ->(from, to) { where('date BETWEEN ? AND ?', from, to) }
20
16
 
21
17
  def self.open_for_date(date, project_id)
22
- AttendanceSheet.find_by(status: OPEN, date: date, project_id: project_id)
18
+ AttendanceSheet.find_by(status: StatusConstants::OPEN, date: date, project_id: project_id)
23
19
  end
24
20
 
25
21
  def self.open_exists?(project_id)
26
- AttendanceSheet.open(project_id).exists?
22
+ AttendanceSheet
23
+ .by_project(project_id)
24
+ .by_status(StatusConstants::OPEN)
25
+ .exists?
27
26
  end
28
27
 
29
28
  def self.exists_for_today?(project_id)
30
- AttendanceSheet.current(project_id).exists?
29
+ AttendanceSheet
30
+ .by_project(project_id)
31
+ .by_date(Date.today)
32
+ .exists?
31
33
  end
32
34
 
33
35
  def self.open_exists_for_today?(project_id)
34
- AttendanceSheet.current_open(project_id).exists?
36
+ AttendanceSheet
37
+ .by_project(project_id)
38
+ .by_date(Date.today)
39
+ .by_status(StatusConstants::OPEN)
40
+ .exists?
35
41
  end
36
42
 
37
43
  # Attendance sheet should be created using the
@@ -46,16 +52,16 @@ module Ecom
46
52
  raise 'There is an open attendance sheet which needs to be submitted before creating a new one.'
47
53
  end
48
54
 
49
- AttendanceSheet.create(date: Date.today, opened_at: Time.now, status: OPEN, project_id: project_id)
55
+ AttendanceSheet.create(date: Date.today, opened_at: Time.now, status: StatusConstants::OPEN, project_id: project_id)
50
56
  end
51
57
 
52
58
  def self.submit_current(project_id)
53
- sheet = AttendanceSheet.find_by(date: Date.today, status: OPEN, project_id: project_id)
59
+ sheet = AttendanceSheet.find_by(date: Date.today, status: StatusConstants::OPEN, project_id: project_id)
54
60
 
55
61
  raise 'There is no open attendance sheet to submit.' if sheet.nil?
56
62
 
57
63
  sheet.closed_at = Time.now
58
- sheet.status = SUBMITTED
64
+ sheet.status = StatusConstants::SUBMITTED
59
65
  sheet.save
60
66
  sheet
61
67
  end
@@ -69,7 +75,7 @@ module Ecom
69
75
  raise 'There is no open attendance sheet to submit for the selected day.' unless sheet
70
76
 
71
77
  sheet.closed_at = Time.now
72
- sheet.status = SUBMITTED
78
+ sheet.status = StatusConstants::SUBMITTED
73
79
  sheet.save
74
80
  sheet
75
81
  end
@@ -0,0 +1,19 @@
1
+ module Ecom
2
+ module Core
3
+ class BookedEquipment < ApplicationRecord
4
+ BOOKED = 'Booked'.freeze
5
+ ON_SITE = 'On Site'.freeze
6
+ RETURNED = 'Returned'.freeze
7
+
8
+ STATUSES = [BOOKED, ON_SITE, RETURNED].freeze
9
+
10
+ belongs_to :booking_request
11
+ belongs_to :equipment_item
12
+ belongs_to :booked_to, class_name: 'Ecom::Core::User'
13
+
14
+ validates :start_date, :end_date, :status, presence: true
15
+ validates :status, inclusion: STATUSES
16
+ validates_with DateRangeValidator
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ module Ecom
2
+ module Core
3
+ class BookingRequest < ApplicationRecord
4
+ DRAFT = 'Draft'.freeze
5
+ UNDER_REVIEW = 'Under Review'.freeze
6
+ APPROVED = 'Approved'.freeze
7
+ REJECTED = 'Rejected'.freeze
8
+
9
+ STATUSES = [DRAFT, UNDER_REVIEW, APPROVED, REJECTED].freeze
10
+ belongs_to :equipment
11
+ belongs_to :country, optional: true
12
+ belongs_to :requested_by, class_name: 'Ecom::Core::User'
13
+ belongs_to :approved_by, class_name: 'Ecom::Core::User', optional: true
14
+
15
+ validates :start_date, :end_date, :quantity, :status, presence: true
16
+ validates :status, inclusion: STATUSES
17
+ validates_with DateRangeValidator
18
+
19
+ scope :by_status, ->(status) { where(status: status) }
20
+
21
+ def validate_date_range
22
+ errors.add(:end_date, 'cannot be before start date') if start_date && end_date && start_date > end_date
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ module Ecom
2
+ module Core
3
+ class ComponentType < Lookup
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Ecom
2
+ module Core
3
+ class Country < Lookup
4
+ end
5
+ end
6
+ end
@@ -2,15 +2,21 @@ module Ecom
2
2
  module Core
3
3
  class Crew < ApplicationRecord
4
4
  PERMANENT = 'Permanent'.freeze
5
+ SUPERVISOR = 'Supervisor'.freeze
5
6
  TEMPORARY = 'Temporary'.freeze
7
+ EMPLOYMENT_TYPES = [PERMANENT, SUPERVISOR, TEMPORARY].freeze
6
8
 
7
9
  before_save :set_employment_date,
8
10
  if: proc { |c| c.employment_date.nil? }
9
11
 
10
12
  belongs_to :crew_type
11
13
 
12
- validates :name, :qualification, presence: true
13
- validates :employment, inclusion: [PERMANENT, TEMPORARY]
14
+ validates :name, :address, :qualification, :employment, :wage, :wage_in_words, presence: true
15
+ validates :employment, inclusion: EMPLOYMENT_TYPES
16
+
17
+ scope :by_active, ->(active) { where(active: active) }
18
+ scope :by_qualification, ->(qualification) { where(qualification: qualification) }
19
+ scope :by_sub_contracted, ->(sub_contracted) { where(sub_contracted: sub_contracted) }
14
20
 
15
21
  def set_employment_date
16
22
  self.employment_date = Date.today
@@ -10,6 +10,11 @@ module Ecom
10
10
 
11
11
  validates :hours, :raw_hours, presence: true
12
12
 
13
+ scope :by_overtime, lambda { |id|
14
+ joins(:overtime_sheet_entry).where(ecom_core_overtime_sheet_entries: { overtime_sheet_id: id })
15
+ }
16
+ scope :revised, ->(revised) { where(revised: revised) }
17
+
13
18
  before_save :calculate_hours
14
19
 
15
20
  def calculate_hours
@@ -7,8 +7,8 @@ module Ecom
7
7
  BOTH = 'Both'.freeze
8
8
 
9
9
  TIME_RANGE = {
10
- MORNING => {start: Time.zone.parse('5:00 AM'), end: Time.zone.parse('9:00 AM')},
11
- AFTERNOON => {start: Time.zone.parse('10:00 AM'), end: Time.zone.parse('2:00 PM')},
10
+ MORNING => { start: Time.zone.parse('5:00 AM'), end: Time.zone.parse('9:00 AM') },
11
+ AFTERNOON => { start: Time.zone.parse('10:00 AM'), end: Time.zone.parse('2:00 PM') },
12
12
  BOTH => {start: Time.zone.parse('5:00 AM'), end: Time.zone.parse('2:00 PM')}
13
13
  }.freeze
14
14
 
@@ -19,6 +19,11 @@ module Ecom
19
19
 
20
20
  validates :checkin_time, presence: true, if: :checkout_time
21
21
 
22
+ scope :by_attendance, lambda { |id|
23
+ joins(:attendance_sheet_entry).where(ecom_core_attendance_sheet_entries: { attendance_sheet_id: id })
24
+ }
25
+ scope :revised, ->(revised) { where(revised: revised) }
26
+
22
27
  before_save :calculate_hours
23
28
  after_save :calculate_total
24
29
 
@@ -2,6 +2,7 @@ module Ecom
2
2
  module Core
3
3
  class EquipmentComponent < ApplicationRecord
4
4
  belongs_to :equipment_item
5
+ belongs_to :component_type
5
6
 
6
7
  validates :name, presence: true
7
8
  end
@@ -1,13 +1,25 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class EquipmentItem < ApplicationRecord
4
- READY = 'Ready'
5
- UNDER_MAINTENANCE = 'Under Maintenance'
4
+ # Equipment Statuses
5
+ READY = 'Ready'.freeze
6
+ UNDER_MAINTENANCE = 'Under Maintenance'.freeze
7
+ EQUIPMENT_STATUSES = [READY, UNDER_MAINTENANCE].freeze
8
+
9
+ # Duty Statuses
10
+ AVAILABLE = 'Available'.freeze
11
+ BOOKED = 'Booked'.freeze
12
+ ON_DUTY = 'On Duty'.freeze
13
+ DUTY_STATUSES = [AVAILABLE, BOOKED, ON_DUTY].freeze
6
14
 
7
15
  belongs_to :equipment
16
+ belongs_to :country
8
17
  belongs_to :current_location, class_name: 'Ecom::Core::EquipmentLocation'
9
18
 
10
19
  validates :name, :status, :serial_number, :purchase_date, :purchase_price, presence: true
20
+ validates :status, inclusion: EQUIPMENT_STATUSES
21
+ validates :duty_status, inclusion: DUTY_STATUSES
22
+
11
23
  validates :serial_number, uniqueness: true
12
24
 
13
25
  def self.search(param)
@@ -1,20 +1,20 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class OvertimeSheet < ApplicationRecord
4
- OPEN = 'Open'.freeze
5
- SUBMITTED = 'Submitted'.freeze
6
- APPROVED = 'Approved'.freeze
7
-
8
- validates :date, :opened_at, presence: true, uniqueness: true
9
- validates :status, inclusion: [OPEN, SUBMITTED, APPROVED]
4
+ validates :date, :opened_at, presence: true, uniqueness: { scope: :project_id }
5
+ validates :status, inclusion: StatusConstants::STATUSES
10
6
 
11
7
  belongs_to :project
12
8
 
13
9
  has_many :overtime_sheet_entries
14
10
  has_many :crew_overtimes, through: :overtime_sheet_entries
15
11
 
16
- scope :open, ->(id) { where(status: OPEN, project_id: id) }
17
- scope :submitted, ->(id) { where(status: SUBMITTED, project_id: id) }
12
+ scope :by_project, ->(id) { where(project_id: id) }
13
+ scope :by_date, ->(date) { where(date: date) }
14
+ scope :by_status, ->(status) { where(status: status) }
15
+ scope :by_date_between, ->(from, to) { where('date BETWEEN ? AND ?', from, to) }
16
+ scope :open, ->(id) { where(status: StatusConstants::OPEN, project_id: id) }
17
+ scope :submitted, ->(id) { where(status: StatusConstants::SUBMITTED, project_id: id) }
18
18
 
19
19
  def self.open_exists?(project_id)
20
20
  OvertimeSheet.open(project_id).exists?
@@ -38,7 +38,7 @@ module Ecom
38
38
  raise 'There is already an open overtime sheet. It has to be submitted before creating a new one.'
39
39
  end
40
40
 
41
- OvertimeSheet.create(date: date, opened_at: Time.now, status: OPEN, project_id: project_id)
41
+ OvertimeSheet.create(date: date, opened_at: Time.now, status: StatusConstants::OPEN, project_id: project_id)
42
42
  end
43
43
  end
44
44
  end
@@ -5,6 +5,10 @@ module Ecom
5
5
 
6
6
  has_many :payments, class_name: 'Ecom::Core::Payment'
7
7
  belongs_to :project
8
+
9
+ scope :by_project, ->(id) { where(project_id: id) }
10
+ scope :by_month, ->(month) { where(month: month) }
11
+ scope :by_year, ->(year) { where(year: year) }
8
12
  end
9
13
  end
10
14
  end
@@ -0,0 +1,11 @@
1
+ module Ecom
2
+ module Core
3
+ class DateRangeValidator < ActiveModel::Validator
4
+ def validate(record)
5
+ return unless record.start_date && record.end_date && record.start_date > record.end_date
6
+
7
+ record.errors.add(:base, 'End date cannot be before start date')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -4,6 +4,7 @@ default: &default
4
4
  pool: 5
5
5
  timeout: 5000
6
6
  host: <%= ENV['DB_HOST'] %>
7
+ port: <%= ENV['DB_PORT'] %>
7
8
  username: <%= ENV['POSTGRES_USER'] %>
8
9
  password: <%= ENV['POSTGRES_PASSWORD'] %>
9
10
  database: <%= ENV['POSTGRES_DB'] %>
@@ -3,11 +3,13 @@ class CreateEcomCoreCrews < ActiveRecord::Migration[6.0]
3
3
  create_table :ecom_core_crews do |t|
4
4
  t.string :employee_id
5
5
  t.string :name, null: false
6
+ t.string :address, null: false
6
7
  t.string :phone
7
8
  t.string :email
8
9
  t.string :qualification, null: false
9
10
  t.string :employment, null: false
10
- t.float :wage
11
+ t.float :wage, null: false
12
+ t.string :wage_in_words, null: false
11
13
  t.date :employment_date
12
14
  t.boolean :sub_contracted, null: false, default: false
13
15
  t.string :guarantor_name
@@ -1,7 +1,7 @@
1
1
  class CreateEcomCoreAttendanceSheets < ActiveRecord::Migration[6.0]
2
2
  def change
3
3
  create_table :ecom_core_attendance_sheets do |t|
4
- t.date :date, null: false, unique: true
4
+ t.date :date, null: false
5
5
  t.time :opened_at, null: false
6
6
  t.time :closed_at
7
7
  t.string :remark
@@ -13,5 +13,6 @@ class CreateEcomCoreAttendanceSheets < ActiveRecord::Migration[6.0]
13
13
 
14
14
  t.timestamps
15
15
  end
16
+ add_index :ecom_core_attendance_sheets, %i[date project_id], unique: true
16
17
  end
17
18
  end
@@ -4,6 +4,8 @@ class CreateEcomCoreEquipment < ActiveRecord::Migration[6.0]
4
4
  t.string :name, null: false
5
5
  t.string :description
6
6
  t.float :minimum_acquisition_time, null: false, default: 0
7
+ t.string :brands, array: true, default: []
8
+ t.string :components, array: true, default: []
7
9
  t.references :equipment_category,
8
10
  null: false,
9
11
  index: { name: 'ec_on_ece_indx' },
@@ -3,7 +3,8 @@ class CreateEcomCoreEquipmentItems < ActiveRecord::Migration[6.0]
3
3
  create_table :ecom_core_equipment_items do |t|
4
4
  t.string :name, null: false
5
5
  t.string :description
6
- t.string :status, null: false
6
+ t.string :status, null: false, default: 'Ready'
7
+ t.string :duty_status, null: false, default: 'Available'
7
8
  t.string :serial_number, unique: true
8
9
  t.string :brand
9
10
  t.string :item_model
@@ -11,6 +12,10 @@ class CreateEcomCoreEquipmentItems < ActiveRecord::Migration[6.0]
11
12
  t.date :purchase_date, null: false
12
13
  t.float :license_fee
13
14
  t.float :tax
15
+ t.references :country,
16
+ null: false,
17
+ index: { name: 'equipment_on_country_indx' },
18
+ foreign_key: { to_table: :ecom_core_lookups }
14
19
  t.references :equipment,
15
20
  null: false,
16
21
  index: { name: 'equipment_on_ei_indx' },
@@ -3,10 +3,15 @@ class CreateEcomCoreEquipmentComponents < ActiveRecord::Migration[6.0]
3
3
  create_table :ecom_core_equipment_components do |t|
4
4
  t.string :serial_number
5
5
  t.string :name, null: false
6
+ t.references :component_type,
7
+ null: false,
8
+ index: { name: 'ei_on_ct_indx' },
9
+ foreign_key: { to_table: :ecom_core_lookups }
6
10
  t.references :equipment_item,
7
11
  null: false,
8
12
  index: { name: 'ei_on_ec_indx' },
9
13
  foreign_key: { to_table: :ecom_core_equipment_items }
14
+ t.string :remark
10
15
 
11
16
  t.timestamps
12
17
  end
@@ -1,9 +1,10 @@
1
1
  class CreateEcomCoreOvertimeSheets < ActiveRecord::Migration[6.0]
2
2
  def change
3
3
  create_table :ecom_core_overtime_sheets do |t|
4
- t.date :date, null: false, unique: true
4
+ t.date :date, null: false
5
5
  t.time :opened_at, null: false
6
6
  t.time :submitted_at
7
+ t.string :remark
7
8
  t.string :status, null: false, default: 'Open'
8
9
  t.references :project,
9
10
  null: false,
@@ -12,5 +13,6 @@ class CreateEcomCoreOvertimeSheets < ActiveRecord::Migration[6.0]
12
13
 
13
14
  t.timestamps
14
15
  end
16
+ add_index :ecom_core_overtime_sheets, %i[date project_id], unique: true
15
17
  end
16
18
  end
@@ -0,0 +1,31 @@
1
+ class CreateEcomCoreBookingRequests < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :ecom_core_booking_requests do |t|
4
+ t.date :start_date, null: false
5
+ t.date :end_date, null: false
6
+ t.references :equipment,
7
+ null: false,
8
+ index: { name: 'br_on_equipment_indx' },
9
+ foreign_key: { to_table: :ecom_core_equipment }
10
+ t.integer :quantity, null: false
11
+ t.string :brand
12
+ t.references :country,
13
+ null: true,
14
+ index: { name: 'br_on_country_indx' },
15
+ foreign_key: { to_table: :ecom_core_lookups }
16
+ t.string :components, array: true, default: []
17
+ t.string :status, null: false
18
+ t.references :requested_by,
19
+ null: false,
20
+ index: { name: 'br_on_rb_indx' },
21
+ foreign_key: { to_table: :ecom_core_users }
22
+ t.references :approved_by,
23
+ null: true,
24
+ index: { name: 'br_on_ab_indx' },
25
+ foreign_key: { to_table: :ecom_core_users }
26
+ t.string :remark
27
+
28
+ t.timestamps
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ class CreateEcomCoreBookedEquipments < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :ecom_core_booked_equipments do |t|
4
+ t.references :booking_request,
5
+ null: false,
6
+ index: { name: 'be_on_br_indx' },
7
+ foreign_key: { to_table: :ecom_core_booking_requests }
8
+ t.references :equipment_item,
9
+ null: false,
10
+ index: { name: 'be_on_ei_indx' },
11
+ foreign_key: { to_table: :ecom_core_equipment_items }
12
+ t.date :start_date, null: false
13
+ t.date :end_date, null: false
14
+ t.string :status, null: false, default: 'Booked'
15
+ t.references :booked_to,
16
+ null: false,
17
+ index: { name: 'be_on_bt_indx' },
18
+ foreign_key: { to_table: :ecom_core_users }
19
+ t.string :remark
20
+
21
+ t.timestamps
22
+ end
23
+ end
24
+ end
@@ -1,5 +1,5 @@
1
1
  module Ecom
2
2
  module Core
3
- VERSION = '1.2.6'.freeze
3
+ VERSION = '1.2.12'.freeze
4
4
  end
5
5
  end
@@ -4,7 +4,7 @@ FactoryBot.define do
4
4
  opened_at { Time.now }
5
5
  closed_at { nil }
6
6
  remark { FFaker::Name.name }
7
- status { Ecom::Core::AttendanceSheet::OPEN }
7
+ status { Ecom::Core::StatusConstants::OPEN }
8
8
  association :project
9
9
  end
10
10
  end
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+ factory :booked_equipment, class: Ecom::Core::BookedEquipment do
3
+ association :booking_request
4
+ association :equipment_item
5
+ start_date { Date.yesterday }
6
+ end_date { Date.today }
7
+ association :booked_to, factory: :user
8
+ remark { FFaker::Name.name }
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ FactoryBot.define do
2
+ factory :booking_request, class: Ecom::Core::BookingRequest do
3
+ start_date { Date.yesterday }
4
+ end_date { Date.today }
5
+ association :equipment
6
+ quantity { 1 }
7
+ brand { FFaker::Name.name }
8
+ association :country
9
+ association :requested_by, factory: :user
10
+ association :approved_by, factory: :user
11
+ components { [FFaker::Name.name, FFaker::Name.name] }
12
+ status { Ecom::Core::BookingRequest::DRAFT }
13
+ remark { FFaker::Name.name }
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :component_type, class: Ecom::Core::ComponentType, parent: :lookup do
3
+ type { 'Ecom::Core::ComponentType' }
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :country, class: Ecom::Core::Country, parent: :lookup do
3
+ type { 'Ecom::Core::Country' }
4
+ end
5
+ end
@@ -1,11 +1,13 @@
1
1
  FactoryBot.define do
2
2
  factory :crew, class: Ecom::Core::Crew do
3
3
  name { FFaker::Name.name }
4
+ address { FFaker::Name.name }
4
5
  phone { FFaker::Name.name }
5
6
  email { FFaker::Name.name }
6
7
  qualification { FFaker::Name.name }
7
8
  employment { Ecom::Core::Crew::PERMANENT }
8
9
  wage { FFaker::Random.rand(1000..5000) }
10
+ wage_in_words { FFaker::Name.name }
9
11
  employment_date { Date.today - 1 }
10
12
  sub_contracted { false }
11
13
  guarantor_name { FFaker::Name.name }
@@ -3,6 +3,8 @@ FactoryBot.define do
3
3
  name { FFaker::Name.name }
4
4
  description { FFaker::Name.name }
5
5
  minimum_acquisition_time { 10 }
6
+ brands { ['Brand I', 'Brand II', 'Brand III'] }
7
+ components { ['Component I', 'Component II', 'Component III'] }
6
8
  association :equipment_category
7
9
  end
8
10
  end
@@ -2,6 +2,8 @@ FactoryBot.define do
2
2
  factory :equipment_component, class: Ecom::Core::EquipmentComponent do
3
3
  serial_number { FFaker::Name.name }
4
4
  name { FFaker::Name.name }
5
+ remark { FFaker::Name.name }
5
6
  association :equipment_item
7
+ association :component_type
6
8
  end
7
9
  end
@@ -2,7 +2,8 @@ FactoryBot.define do
2
2
  factory :equipment_item, class: Ecom::Core::EquipmentItem do
3
3
  name { FFaker::Name.name }
4
4
  description { FFaker::Name.name }
5
- status { FFaker::Name.name }
5
+ status { Ecom::Core::EquipmentItem::READY }
6
+ duty_status { Ecom::Core::EquipmentItem::AVAILABLE }
6
7
  serial_number { FFaker::Name.name }
7
8
  brand { FFaker::Name.name }
8
9
  item_model { FFaker::Name.name }
@@ -11,6 +12,7 @@ FactoryBot.define do
11
12
  license_fee { 200 }
12
13
  tax { 500 }
13
14
  association :equipment
15
+ association :country
14
16
  association :current_location, factory: :equipment_location
15
17
  end
16
18
  end
@@ -3,7 +3,7 @@ FactoryBot.define do
3
3
  date { Date.today }
4
4
  opened_at { Time.now }
5
5
  submitted_at { Time.now + 1.day }
6
- status { Ecom::Core::OvertimeSheet::OPEN }
6
+ status { Ecom::Core::StatusConstants::OPEN }
7
7
  association :project
8
8
  end
9
9
  end
@@ -5,5 +5,6 @@ FactoryBot.define do
5
5
  email { FFaker::Internet.email }
6
6
  active { true }
7
7
  password { FFaker::Internet.password }
8
+ projects { [{ id: 1, name: 'Sample Project'}] }
8
9
  end
9
10
  end
@@ -1,6 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :work_product, class: Ecom::Core::WorkProduct do
3
- code { FFaker::Name.unique.name }
3
+ code { FFaker::Name.name }
4
4
  name { FFaker::Name.unique.name }
5
5
  description { FFaker::Name.name }
6
6
  design_reference_no { FFaker::Name.name }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecom_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henock L.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-19 00:00:00.000000000 Z
11
+ date: 2020-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -178,20 +178,6 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: solargraph
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
181
  description: An engine which contains the core of a construction management app as
196
182
  a layer.
197
183
  email:
@@ -203,6 +189,7 @@ files:
203
189
  - MIT-LICENSE
204
190
  - README.md
205
191
  - Rakefile
192
+ - app/constants/ecom/core/status_constants.rb
206
193
  - app/controllers/concerns/ecom/core/lookupable.rb
207
194
  - app/controllers/concerns/ecom/core/resource_typeable.rb
208
195
  - app/controllers/ecom/core/access_controller.rb
@@ -218,7 +205,11 @@ files:
218
205
  - app/models/ecom/core/application_record.rb
219
206
  - app/models/ecom/core/attendance_sheet.rb
220
207
  - app/models/ecom/core/attendance_sheet_entry.rb
208
+ - app/models/ecom/core/booked_equipment.rb
209
+ - app/models/ecom/core/booking_request.rb
221
210
  - app/models/ecom/core/company.rb
211
+ - app/models/ecom/core/component_type.rb
212
+ - app/models/ecom/core/country.rb
222
213
  - app/models/ecom/core/crew.rb
223
214
  - app/models/ecom/core/crew_overtime.rb
224
215
  - app/models/ecom/core/crew_time.rb
@@ -264,6 +255,7 @@ files:
264
255
  - app/serializers/ecom/core/user_serializer.rb
265
256
  - app/services/ecom/core/menu_service.rb
266
257
  - app/services/ecom/core/token_auth_service.rb
258
+ - app/validators/ecom/core/date_range_validator.rb
267
259
  - config/database.ci.yml
268
260
  - config/routes.rb
269
261
  - db/migrate/20190101085530_create_ecom_core_companies.rb
@@ -305,6 +297,8 @@ files:
305
297
  - db/migrate/20200410090701_create_ecom_core_overtime_sheets.rb
306
298
  - db/migrate/20200410100035_create_ecom_core_overtime_sheet_entries.rb
307
299
  - db/migrate/20200410111827_create_ecom_core_crew_overtimes.rb
300
+ - db/migrate/20200602130247_create_ecom_core_booking_requests.rb
301
+ - db/migrate/20200603115317_create_ecom_core_booked_equipments.rb
308
302
  - lib/ecom/core.rb
309
303
  - lib/ecom/core/engine.rb
310
304
  - lib/ecom/core/version.rb
@@ -313,7 +307,11 @@ files:
313
307
  - spec/factories/ecom/core/application_modules.rb
314
308
  - spec/factories/ecom/core/attendance_sheet_entries.rb
315
309
  - spec/factories/ecom/core/attendance_sheets.rb
310
+ - spec/factories/ecom/core/booked_equipments.rb
311
+ - spec/factories/ecom/core/booking_requests.rb
316
312
  - spec/factories/ecom/core/companies.rb
313
+ - spec/factories/ecom/core/component_types.rb
314
+ - spec/factories/ecom/core/countries.rb
317
315
  - spec/factories/ecom/core/crew_overtimes.rb
318
316
  - spec/factories/ecom/core/crew_times.rb
319
317
  - spec/factories/ecom/core/crew_types.rb