ecom_core 1.2.4 → 1.2.10

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 (102) 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 +37 -26
  5. data/app/models/ecom/core/attendance_sheet_entry.rb +1 -1
  6. data/app/models/ecom/core/company.rb +10 -0
  7. data/app/models/ecom/core/crew.rb +4 -4
  8. data/app/models/ecom/core/crew_overtime.rb +6 -1
  9. data/app/models/ecom/core/crew_time.rb +7 -2
  10. data/app/models/ecom/core/overtime_sheet.rb +18 -15
  11. data/app/models/ecom/core/payment_detail.rb +1 -1
  12. data/app/models/ecom/core/payroll.rb +5 -0
  13. data/app/models/ecom/core/project.rb +4 -0
  14. data/app/models/ecom/core/project_crew.rb +15 -0
  15. data/config/database.ci.yml +1 -0
  16. data/db/migrate/20190101085530_create_ecom_core_companies.rb +14 -0
  17. data/db/migrate/20191119012030_create_ecom_core_task_templates.rb +4 -3
  18. data/db/migrate/20191119013236_create_ecom_core_work_product_templates.rb +4 -3
  19. data/db/migrate/20191119144618_create_ecom_core_stakeholders.rb +4 -3
  20. data/db/migrate/20191201131341_create_ecom_core_product_types.rb +4 -2
  21. data/db/migrate/20191201134420_create_ecom_core_work_component_templates.rb +8 -6
  22. data/db/migrate/20191201145848_create_ecom_core_projects.rb +28 -13
  23. data/db/migrate/20191202103735_create_ecom_core_tasks.rb +8 -5
  24. data/db/migrate/20191202105355_create_task_templates_resource_types.rb +8 -7
  25. data/db/migrate/20191202220832_create_ecom_core_users.rb +9 -6
  26. data/db/migrate/20191202220953_create_ecom_core_user_roles.rb +13 -8
  27. data/db/migrate/20191202221423_create_ecom_core_menus.rb +16 -9
  28. data/db/migrate/20191202235434_create_ecom_core_work_products.rb +29 -15
  29. data/db/migrate/20191206104247_create_ecom_core_work_components.rb +24 -14
  30. data/db/migrate/20191225100054_create_ecom_core_crews.rb +8 -4
  31. data/db/migrate/20191225121850_create_ecom_core_project_crews.rb +19 -0
  32. data/db/migrate/{20200401040433_create_ecom_core_attendance_sheets.rb → 20191225140433_create_ecom_core_attendance_sheets.rb} +6 -1
  33. data/db/migrate/20191225162539_create_ecom_core_attendance_sheet_entries.rb +17 -0
  34. data/db/migrate/20191225211712_create_ecom_core_crew_times.rb +15 -9
  35. data/db/migrate/20200126081005_create_ecom_core_payrolls.rb +4 -0
  36. data/db/migrate/20200126082103_create_ecom_core_payments.rb +6 -3
  37. data/db/migrate/20200126183218_create_ecom_core_payment_details.rb +10 -5
  38. data/db/migrate/20200307112519_create_ecom_core_custom_payment_details.rb +4 -3
  39. data/db/migrate/20200315145215_create_ecom_core_equipment_locations.rb +4 -3
  40. data/db/migrate/20200315150500_create_ecom_core_equipment_categories.rb +4 -2
  41. data/db/migrate/20200315152143_create_ecom_core_equipment.rb +4 -2
  42. data/db/migrate/20200315153640_create_ecom_core_equipment_items.rb +8 -5
  43. data/db/migrate/20200315160810_create_ecom_core_equipment_valuations.rb +4 -3
  44. data/db/migrate/20200316125323_create_ecom_core_equipment_components.rb +4 -3
  45. data/db/migrate/20200410090701_create_ecom_core_overtime_sheets.rb +7 -1
  46. data/db/migrate/20200410100035_create_ecom_core_overtime_sheet_entries.rb +8 -5
  47. data/db/migrate/20200410111827_create_ecom_core_crew_overtimes.rb +17 -11
  48. data/lib/ecom/core/version.rb +1 -1
  49. data/spec/factories/ecom/core/application_modules.rb +1 -1
  50. data/spec/factories/ecom/core/attendance_sheet_entries.rb +1 -1
  51. data/spec/factories/ecom/core/attendance_sheets.rb +3 -2
  52. data/spec/factories/ecom/core/companies.rb +9 -0
  53. data/spec/factories/ecom/core/crew_overtimes.rb +1 -1
  54. data/spec/factories/ecom/core/crew_times.rb +1 -1
  55. data/spec/factories/ecom/core/crew_types.rb +1 -1
  56. data/spec/factories/ecom/core/crews.rb +3 -1
  57. data/spec/factories/ecom/core/currencies.rb +1 -1
  58. data/spec/factories/ecom/core/custom_payment_details.rb +1 -1
  59. data/spec/factories/ecom/core/equipment.rb +1 -1
  60. data/spec/factories/ecom/core/equipment_categories.rb +1 -1
  61. data/spec/factories/ecom/core/equipment_components.rb +1 -1
  62. data/spec/factories/ecom/core/equipment_items.rb +1 -1
  63. data/spec/factories/ecom/core/equipment_locations.rb +1 -1
  64. data/spec/factories/ecom/core/equipment_types.rb +1 -1
  65. data/spec/factories/ecom/core/equipment_valuations.rb +1 -1
  66. data/spec/factories/ecom/core/location_types.rb +1 -1
  67. data/spec/factories/ecom/core/lookups.rb +1 -1
  68. data/spec/factories/ecom/core/material_types.rb +1 -1
  69. data/spec/factories/ecom/core/menus.rb +1 -1
  70. data/spec/factories/ecom/core/overtime_sheet_entries.rb +1 -1
  71. data/spec/factories/ecom/core/overtime_sheets.rb +3 -2
  72. data/spec/factories/ecom/core/overtime_types.rb +1 -1
  73. data/spec/factories/ecom/core/payment_details.rb +1 -1
  74. data/spec/factories/ecom/core/payments.rb +1 -1
  75. data/spec/factories/ecom/core/payrolls.rb +2 -1
  76. data/spec/factories/ecom/core/product_types.rb +1 -1
  77. data/spec/factories/ecom/core/project_crews.rb +9 -0
  78. data/spec/factories/ecom/core/projects.rb +2 -1
  79. data/spec/factories/ecom/core/resource_types.rb +1 -1
  80. data/spec/factories/ecom/core/stakeholder_types.rb +1 -1
  81. data/spec/factories/ecom/core/stakeholders.rb +1 -1
  82. data/spec/factories/ecom/core/task_template_types.rb +1 -1
  83. data/spec/factories/ecom/core/task_templates.rb +1 -1
  84. data/spec/factories/ecom/core/tasks.rb +1 -1
  85. data/spec/factories/ecom/core/user_roles.rb +1 -1
  86. data/spec/factories/ecom/core/users.rb +2 -1
  87. data/spec/factories/ecom/core/work_component_templates.rb +1 -1
  88. data/spec/factories/ecom/core/work_components.rb +1 -1
  89. data/spec/factories/ecom/core/work_product_templates.rb +1 -1
  90. data/spec/factories/ecom/core/work_products.rb +2 -2
  91. metadata +15 -18
  92. data/db/migrate/20200207035823_add_additional_columns_to_payment.rb +0 -6
  93. data/db/migrate/20200207040844_add_net_pay_column_to_payment_details.rb +0 -5
  94. data/db/migrate/20200210095535_add_advance_column_to_payment_details.rb +0 -5
  95. data/db/migrate/20200221123207_add_employee_id_to_crew.rb +0 -5
  96. data/db/migrate/20200401071343_remove_date_column_from_crew_times.rb +0 -5
  97. data/db/migrate/20200401122539_create_ecom_core_attendance_sheet_entries.rb +0 -14
  98. data/db/migrate/20200401142959_relate_crew_time_with_attendance_sheet_entry.rb +0 -8
  99. data/db/migrate/20200401144137_remove_crew_time_id_from_crew.rb +0 -7
  100. data/db/migrate/20200413144023_fix_crew_time_columns.rb +0 -17
  101. data/db/migrate/20200414044144_adjust_crew_overtime_column_names.rb +0 -6
  102. data/db/migrate/20200414185248_change_time_columns_to_datetime.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09b8fa70ec63b31c289bacc382fb945336e8e6a3e6930e54d415ed6ba79ec5aa'
4
- data.tar.gz: d8cbbc31eb4718a6b4af1808810a3defa163b4b0743d235756e618e1bb37fb10
3
+ metadata.gz: 2de520c3c443ad4a66801803d93805335bc40375187899958bbb448c7e15d38e
4
+ data.tar.gz: b9f4f9977b97175fc0cb2ee3bc46e50a8b136ad9ace5410eb35d134a3da2f813
5
5
  SHA512:
6
- metadata.gz: 7ba2a9547ffcb1d3085b893e44bee505639abb61caa3cdc28df3cbf56f883910ac1bea7b9645d0577b0bb006dd81a4b5df661cac74f54323a224b8b1b3d7cbc8
7
- data.tar.gz: c0eb28eb93b466d7da5dcdf05876351c721e8a541e33cd0d23a26627cf5e0f1934e1e94283f35636111e949c8095e93c58c69f8a39f648c72f622898e15a5b19
6
+ metadata.gz: c331269793e3eb5ff70c2d0e7061ca5d8aa9c8260e26dbe28e854e518b3a6448845e587b9b5d85ea3f2c94cb5afe7a92e59feaa37fb1a7d87be882d6682b8f6d
7
+ data.tar.gz: 38912a987b162fa8739458f37d2161e33f0064cc3bf953028dae39bd478edd4df6d8fd5d332a9e078deaa87122d66b0a755a26b50e82d006a5a8024543220297
@@ -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,34 +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
4
+ validates :date, presence: true, uniqueness: { scope: :project_id }
5
+ validates :status, inclusion: StatusConstants::STATUSES
7
6
 
8
- validates :date, presence: true, uniqueness: true
9
- validates :status, inclusion: [OPEN, SUBMITTED, APPROVED]
7
+ belongs_to :project
10
8
 
11
9
  has_many :attendance_sheet_entries
12
10
  has_many :crew_times, through: :attendance_sheet_entries
13
11
 
14
- scope :open, -> { where(status: OPEN) }
15
- scope :current, -> { where(date: Date.today) }
16
- scope :current_open, -> { open.current }
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) }
17
16
 
18
- def self.open_for_date(date)
19
- AttendanceSheet.find_by(status: OPEN, date: date)
17
+ def self.open_for_date(date, project_id)
18
+ AttendanceSheet.find_by(status: StatusConstants::OPEN, date: date, project_id: project_id)
20
19
  end
21
20
 
22
- def self.open_exists?
23
- AttendanceSheet.open.exists?
21
+ def self.open_exists?(project_id)
22
+ AttendanceSheet
23
+ .by_project(project_id)
24
+ .by_status(StatusConstants::OPEN)
25
+ .exists?
24
26
  end
25
27
 
26
- def self.exists_for_today?
27
- AttendanceSheet.current.exists?
28
+ def self.exists_for_today?(project_id)
29
+ AttendanceSheet
30
+ .by_project(project_id)
31
+ .by_date(Date.today)
32
+ .exists?
28
33
  end
29
34
 
30
- def self.open_exists_for_today?
31
- AttendanceSheet.current_open.exists?
35
+ def self.open_exists_for_today?(project_id)
36
+ AttendanceSheet
37
+ .by_project(project_id)
38
+ .by_date(Date.today)
39
+ .by_status(StatusConstants::OPEN)
40
+ .exists?
32
41
  end
33
42
 
34
43
  # Attendance sheet should be created using the
@@ -36,21 +45,23 @@ module Ecom
36
45
  # check if there is an open attendance already,
37
46
  # and also that we have only one attendace sheet
38
47
  # per day.
39
- def self.create_current
40
- raise 'Attendance sheet already created for the day.' if AttendanceSheet.exists_for_today?
48
+ def self.create_current(project_id)
49
+ raise 'Attendance sheet already created for the day.' if AttendanceSheet.exists_for_today?(project_id)
41
50
 
42
- raise 'There is an open attendance sheet which needs to be submitted before creating a new one.' if AttendanceSheet.open_exists?
51
+ if AttendanceSheet.open_exists?(project_id)
52
+ raise 'There is an open attendance sheet which needs to be submitted before creating a new one.'
53
+ end
43
54
 
44
- AttendanceSheet.create(date: Date.today, opened_at: Time.now, status: OPEN)
55
+ AttendanceSheet.create(date: Date.today, opened_at: Time.now, status: StatusConstants::OPEN, project_id: project_id)
45
56
  end
46
57
 
47
- def self.submit_current
48
- sheet = AttendanceSheet.find_by(date: Date.today, status: OPEN)
58
+ def self.submit_current(project_id)
59
+ sheet = AttendanceSheet.find_by(date: Date.today, status: StatusConstants::OPEN, project_id: project_id)
49
60
 
50
61
  raise 'There is no open attendance sheet to submit.' if sheet.nil?
51
62
 
52
63
  sheet.closed_at = Time.now
53
- sheet.status = SUBMITTED
64
+ sheet.status = StatusConstants::SUBMITTED
54
65
  sheet.save
55
66
  sheet
56
67
  end
@@ -59,12 +70,12 @@ module Ecom
59
70
  # to submit the attendance sheet after the date has
60
71
  # passed. Normally, timekeepers need to open and close
61
72
  # an attendance sheet of a date on the specific date.
62
- def self.submit(date)
63
- sheet = AttendanceSheet.open_for_date(date)
73
+ def self.submit(date, project_id)
74
+ sheet = AttendanceSheet.open_for_date(date, project_id)
64
75
  raise 'There is no open attendance sheet to submit for the selected day.' unless sheet
65
76
 
66
77
  sheet.closed_at = Time.now
67
- sheet.status = SUBMITTED
78
+ sheet.status = StatusConstants::SUBMITTED
68
79
  sheet.save
69
80
  sheet
70
81
  end
@@ -6,4 +6,4 @@ module Ecom
6
6
  has_many :crew_times
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Ecom
2
+ module Core
3
+ class Company < ApplicationRecord
4
+ has_many :projects
5
+
6
+ validates :code, :name, :address, :telephone, presence: true
7
+ validates :code, :name, uniqueness: true
8
+ end
9
+ end
10
+ end
@@ -2,17 +2,17 @@ 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 :wage, presence: true, if: ->(o) { o.employment == PERMANENT }
15
- #validates :wage, absence: true, if: ->(o) { o.employment == TEMPORARY }
14
+ validates :name, :address, :qualification, :employment, :wage, :wage_in_words, presence: true
15
+ validates :employment, inclusion: EMPLOYMENT_TYPES
16
16
 
17
17
  def set_employment_date
18
18
  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
@@ -18,4 +23,4 @@ module Ecom
18
23
  end
19
24
  end
20
25
  end
21
- end
26
+ end
@@ -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
 
@@ -1,24 +1,27 @@
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
4
+ validates :date, :opened_at, presence: true, uniqueness: { scope: :project_id }
5
+ validates :status, inclusion: StatusConstants::STATUSES
7
6
 
8
- validates :date, :opened_at, presence: true, uniqueness: true
9
- validates :status, inclusion: [OPEN, SUBMITTED, APPROVED]
7
+ belongs_to :project
10
8
 
11
9
  has_many :overtime_sheet_entries
10
+ has_many :crew_overtimes, through: :overtime_sheet_entries
12
11
 
13
- scope :open, -> { where(status: OPEN) }
14
- scope :for_date, ->(date) { where(date: date) }
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) }
15
18
 
16
- def self.open_exists?
17
- OvertimeSheet.open.exists?
19
+ def self.open_exists?(project_id)
20
+ OvertimeSheet.open(project_id).exists?
18
21
  end
19
22
 
20
- def self.open_for_date_exists?(date)
21
- OvertimeSheet.open.for_date(date).exists?
23
+ def self.open_for_date_exists?(date, project_id)
24
+ OvertimeSheet.open(project_id).where(date: date).exists?
22
25
  end
23
26
 
24
27
  # Overtime sheet should be created using the
@@ -26,16 +29,16 @@ module Ecom
26
29
  # check if there is an open overtime already,
27
30
  # and also that we have only one open overtime
28
31
  # sheet at a time.
29
- def self.create_new(date)
30
- if OvertimeSheet.open_for_date_exists?(date)
32
+ def self.create_new(date, project_id)
33
+ if OvertimeSheet.open_for_date_exists?(date, project_id)
31
34
  raise 'There is already an open overtime sheet for the selected date.'
32
35
  end
33
36
 
34
- if OvertimeSheet.open_exists?
37
+ if OvertimeSheet.open_exists?(project_id)
35
38
  raise 'There is already an open overtime sheet. It has to be submitted before creating a new one.'
36
39
  end
37
40
 
38
- OvertimeSheet.create(date: date, opened_at: Time.now, status: OPEN)
41
+ OvertimeSheet.create(date: date, opened_at: Time.now, status: StatusConstants::OPEN, project_id: project_id)
39
42
  end
40
43
  end
41
44
  end
@@ -8,4 +8,4 @@ module Ecom
8
8
  :advance, presence: true
9
9
  end
10
10
  end
11
- end
11
+ end
@@ -4,6 +4,11 @@ module Ecom
4
4
  validates :month, :year, presence: true
5
5
 
6
6
  has_many :payments, class_name: 'Ecom::Core::Payment'
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) }
7
12
  end
8
13
  end
9
14
  end
@@ -7,6 +7,10 @@ module Ecom
7
7
  belongs_to :project_manager, class_name: 'Ecom::Core::Stakeholder'
8
8
  belongs_to :task_template
9
9
  belongs_to :currency
10
+ belongs_to :company
11
+
12
+ has_many :project_crews
13
+ has_many :crews, through: :project_crews
10
14
 
11
15
  validates :name, :location, :contract_number, :date_contract_signed, :commencement_date, :completion_date,
12
16
  :contract_amount, :advance_payment, :retention, presence: true
@@ -0,0 +1,15 @@
1
+ module Ecom
2
+ module Core
3
+ class ProjectCrew < ApplicationRecord
4
+ ACTIVE = 'Active'.freeze
5
+ INACTIVE = 'Inactive'.freeze
6
+ STATUSES = [ACTIVE, INACTIVE].freeze
7
+
8
+ belongs_to :project
9
+ belongs_to :crew
10
+
11
+ validates :start_date, :status, presence: true
12
+ validates :status, inclusion: STATUSES
13
+ end
14
+ end
15
+ 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'] %>
@@ -0,0 +1,14 @@
1
+ class CreateEcomCoreCompanies < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :ecom_core_companies do |t|
4
+ t.string :code, null: false, unique: true
5
+ t.string :name, null: false, unique: true
6
+ t.string :address, null: false
7
+ t.string :telephone, null: false
8
+ t.string :email
9
+ t.json :settings
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -4,12 +4,13 @@ class CreateEcomCoreTaskTemplates < ActiveRecord::Migration[6.0]
4
4
  t.string :code, null: false
5
5
  t.string :name, null: false
6
6
  t.string :description
7
- t.references :task_template_type, index: { name: 'ttt_on_tt_indx' }
7
+ t.references :task_template_type,
8
+ null: false,
9
+ index: { name: 'tt_on_ttt_indx' },
10
+ foreign_key: { to_table: :ecom_core_task_template_types }
8
11
  t.string :ancestry, index: true
9
12
 
10
13
  t.timestamps
11
14
  end
12
-
13
- add_foreign_key :ecom_core_task_templates, :ecom_core_task_template_types, column: :task_template_type_id
14
15
  end
15
16
  end
@@ -5,11 +5,12 @@ class CreateEcomCoreWorkProductTemplates < ActiveRecord::Migration[6.0]
5
5
  t.string :name, null: false, unique: true
6
6
  t.string :description
7
7
  t.string :remark
8
- t.references :task_template, index: { name: 'tt_on_wpt_indx' }
8
+ t.references :task_template,
9
+ null: false,
10
+ index: { name: 'tt_on_wpt_indx' },
11
+ foreign_key: { to_table: :ecom_core_task_templates }
9
12
 
10
13
  t.timestamps
11
14
  end
12
-
13
- add_foreign_key :ecom_core_work_product_templates, :ecom_core_task_templates, column: :task_template_id
14
15
  end
15
16
  end
@@ -9,11 +9,12 @@ class CreateEcomCoreStakeholders < ActiveRecord::Migration[6.0]
9
9
  t.string :contact_name, null: false
10
10
  t.string :contact_phone, null: false
11
11
  t.string :contact_email, null: false
12
- t.references :stakeholder_type, index: { name: 'em_stakeholders_on_type_indx' }
12
+ t.references :stakeholder_type,
13
+ null: false,
14
+ index: { name: 'stakeholders_on_st_indx' },
15
+ foreign_key: { to_table: :ecom_core_stakeholder_types }
13
16
 
14
17
  t.timestamps
15
18
  end
16
-
17
- add_foreign_key :ecom_core_stakeholders, :ecom_core_stakeholder_types, column: :stakeholder_type_id
18
19
  end
19
20
  end
@@ -2,13 +2,15 @@ class CreateEcomCoreProductTypes < ActiveRecord::Migration[6.0]
2
2
  def change
3
3
  create_table :ecom_core_product_types do |t|
4
4
  t.string :name, null: false
5
- t.references :work_product_template, index: { name: 'pt_on_wpt_indx' }
5
+ t.references :work_product_template,
6
+ null: false,
7
+ index: { name: 'pt_on_wpt_indx' },
8
+ foreign_key: { to_table: :ecom_core_work_product_templates }
6
9
  t.json :dimension
7
10
 
8
11
  t.timestamps
9
12
  end
10
13
 
11
14
  add_index :ecom_core_product_types, %i[name work_product_template_id], unique: true, name: 'wpt_on_pt_name_indx'
12
- add_foreign_key :ecom_core_product_types, :ecom_core_work_product_templates, column: :work_product_template_id
13
15
  end
14
16
  end
@@ -6,8 +6,14 @@ class CreateEcomCoreWorkComponentTemplates < ActiveRecord::Migration[6.0]
6
6
  t.string :description
7
7
  t.integer :relative_percentage
8
8
  t.json :dimension
9
- t.references :work_product_template, index: { name: 'wct_on_wpt_indx' }
10
- t.references :task_template, index: { name: 'wct_on_tt_indx' }
9
+ t.references :work_product_template,
10
+ null: false,
11
+ index: { name: 'wct_on_wpt_indx' },
12
+ foreign_key: { to_table: :ecom_core_work_product_templates }
13
+ t.references :task_template,
14
+ null: false,
15
+ index: { name: 'wct_on_tt_indx' },
16
+ foreign_key: { to_table: :ecom_core_task_templates }
11
17
 
12
18
  t.timestamps
13
19
  end
@@ -15,9 +21,5 @@ class CreateEcomCoreWorkComponentTemplates < ActiveRecord::Migration[6.0]
15
21
  add_index :ecom_core_work_component_templates, %i[code work_product_template_id task_template_id],
16
22
  unique: true,
17
23
  name: 'wct_on_code_wpt_id_tt_id_indx'
18
- add_foreign_key :ecom_core_work_component_templates, :ecom_core_work_product_templates,
19
- column: :work_product_template_id
20
- add_foreign_key :ecom_core_work_component_templates, :ecom_core_task_templates,
21
- column: :task_template_id
22
24
  end
23
25
  end