ecom_core 1.2.34 → 1.2.35

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/ecom/core/{project_crews_controller.rb → site_crews_controller.rb} +5 -4
  3. data/app/models/ecom/core/attendance_sheet.rb +19 -19
  4. data/app/models/ecom/core/available_unit_of_measurement.rb +10 -0
  5. data/app/models/ecom/core/crew.rb +3 -2
  6. data/app/models/ecom/core/crew_contract.rb +41 -1
  7. data/app/models/ecom/core/crew_contract_transaction.rb +29 -0
  8. data/app/models/ecom/core/crew_id_card.rb +36 -0
  9. data/app/models/ecom/core/inspection_checklist.rb +6 -0
  10. data/app/models/ecom/core/material.rb +6 -0
  11. data/app/models/ecom/core/material_identity.rb +21 -0
  12. data/app/models/ecom/core/material_item.rb +18 -0
  13. data/app/models/ecom/core/material_sub_type.rb +20 -0
  14. data/app/models/ecom/core/overtime_sheet.rb +13 -15
  15. data/app/models/ecom/core/payroll.rb +3 -3
  16. data/app/models/ecom/core/project.rb +0 -3
  17. data/app/models/ecom/core/project_template.rb +11 -0
  18. data/app/models/ecom/core/project_work_item_template.rb +9 -0
  19. data/app/models/ecom/core/{project_crew.rb → site.rb} +8 -4
  20. data/app/models/ecom/core/site_crew.rb +27 -0
  21. data/app/models/ecom/core/task.rb +22 -5
  22. data/app/models/ecom/core/task_inspection_checklist.rb +18 -0
  23. data/app/models/ecom/core/task_template.rb +18 -90
  24. data/app/models/ecom/core/task_template_inspection_checklist.rb +8 -0
  25. data/app/models/ecom/core/work_package.rb +3 -0
  26. data/app/models/ecom/core/work_product.rb +2 -18
  27. data/app/models/ecom/core/work_product_template.rb +2 -2
  28. data/app/services/ecom/core/crew_contract_transaction_service.rb +89 -0
  29. data/app/services/ecom/core/site_crew_service.rb +44 -0
  30. data/config/routes.rb +2 -2
  31. data/db/migrate/20191119012030_create_ecom_core_task_templates.rb +6 -8
  32. data/db/migrate/20191119013236_create_ecom_core_work_product_templates.rb +0 -15
  33. data/db/migrate/20191119021405_create_ecom_core_project_templates.rb +15 -0
  34. data/db/migrate/20191119034319_create_ecom_core_project_work_item_templates.rb +20 -0
  35. data/db/migrate/20191201145849_create_ecom_core_sites.rb +16 -0
  36. data/db/migrate/20191202222210_create_ecom_core_work_packages.rb +12 -0
  37. data/db/migrate/20191202235434_create_ecom_core_work_products.rb +2 -17
  38. data/db/migrate/20191207103735_create_ecom_core_tasks.rb +14 -6
  39. data/db/migrate/20191225140433_create_ecom_core_attendance_sheets.rb +4 -4
  40. data/db/migrate/20200126081005_create_ecom_core_payrolls.rb +3 -3
  41. data/db/migrate/20200410090701_create_ecom_core_overtime_sheets.rb +4 -4
  42. data/db/migrate/20200616044231_create_ecom_core_material_sub_types.rb +14 -0
  43. data/db/migrate/20200616051902_create_ecom_core_material_identities.rb +17 -0
  44. data/db/migrate/20200618105233_create_ecom_core_material_items.rb +16 -0
  45. data/db/migrate/20200813165555_create_ecom_core_available_unit_of_measurements.rb +16 -0
  46. data/db/migrate/20200901085227_create_ecom_core_crew_contracts.rb +7 -1
  47. data/db/migrate/20201013072924_create_ecom_core_crew_contract_transactions.rb +16 -0
  48. data/db/migrate/20201013090609_create_ecom_core_site_crews.rb.rb +22 -0
  49. data/db/migrate/20201013094100_create_ecom_core_crew_id_cards.rb +16 -0
  50. data/db/migrate/20201113050953_create_ecom_core_task_inspection_checklists.rb +22 -0
  51. data/db/migrate/20201113094302_create_ecom_core_task_template_inspection_checklists.rb +17 -0
  52. data/lib/ecom/core/version.rb +1 -1
  53. data/spec/factories/ecom/core/attendance_sheets.rb +1 -1
  54. data/spec/factories/ecom/core/available_unit_of_measurements.rb +6 -0
  55. data/spec/factories/ecom/core/crew_contract_transactions.rb +8 -0
  56. data/spec/factories/ecom/core/crew_contracts.rb +12 -0
  57. data/spec/factories/ecom/core/crew_id_cards.rb +8 -0
  58. data/spec/factories/{dimension_elements.rb → ecom/core/dimension_elements.rb} +0 -0
  59. data/spec/factories/ecom/core/inspection_checklists.rb +5 -0
  60. data/spec/factories/ecom/core/material_identities.rb +6 -0
  61. data/spec/factories/ecom/core/material_items.rb +6 -0
  62. data/spec/factories/ecom/core/material_sub_types.rb +6 -0
  63. data/spec/factories/ecom/core/materials.rb +5 -0
  64. data/spec/factories/{measurement_units.rb → ecom/core/measurement_units.rb} +6 -0
  65. data/spec/factories/ecom/core/overtime_sheets.rb +1 -1
  66. data/spec/factories/ecom/core/payrolls.rb +1 -1
  67. data/spec/factories/ecom/core/project_templates.rb +8 -0
  68. data/spec/factories/ecom/core/project_work_item_templates.rb +7 -0
  69. data/spec/factories/ecom/core/site_crews.rb +10 -0
  70. data/spec/factories/ecom/core/sites.rb +8 -0
  71. data/spec/factories/ecom/core/task_inspection_checklists.rb +11 -0
  72. data/spec/factories/ecom/core/task_template_inspection_checklists.rb +7 -0
  73. data/spec/factories/ecom/core/task_templates.rb +10 -6
  74. data/spec/factories/ecom/core/tasks.rb +8 -3
  75. data/spec/factories/ecom/core/work_packages.rb +6 -0
  76. data/spec/factories/ecom/core/work_product_templates.rb +0 -1
  77. data/spec/factories/ecom/core/work_products.rb +1 -7
  78. metadata +48 -20
  79. data/app/controllers/concerns/ecom/core/filterable.rb +0 -14
  80. data/app/models/ecom/core/takeoff_calculator.rb +0 -115
  81. data/app/models/ecom/core/task_step.rb +0 -85
  82. data/app/models/ecom/core/task_step_dependency.rb +0 -10
  83. data/app/services/ecom/core/project_crew_service.rb +0 -39
  84. data/db/migrate/20191119012027_create_ecom_core_takeoff_calculators.rb +0 -11
  85. data/db/migrate/20191225121850_create_ecom_core_project_crews.rb +0 -19
  86. data/db/migrate/20200820123719_create_ecom_core_task_steps.rb +0 -17
  87. data/db/migrate/20200821130934_create_ecom_core_task_step_dependencies.rb +0 -16
  88. data/spec/factories/ecom/core/project_crews.rb +0 -9
  89. data/spec/factories/ecom/core/takeoff_calculators.rb +0 -18
  90. data/spec/factories/ecom/core/task_step_dependencies.rb +0 -6
  91. data/spec/factories/ecom/core/task_steps.rb +0 -8
@@ -9,9 +9,6 @@ module Ecom
9
9
  belongs_to :currency
10
10
  belongs_to :company
11
11
 
12
- has_many :project_crews
13
- has_many :crews, through: :project_crews
14
-
15
12
  validates :name, :location, :contract_number, :date_contract_signed, :commencement_date, :completion_date,
16
13
  :contract_amount, :advance_payment, :retention, presence: true
17
14
  end
@@ -0,0 +1,11 @@
1
+ module Ecom
2
+ module Core
3
+ class ProjectTemplate < ApplicationRecord
4
+ belongs_to :task_template_type
5
+ has_many :project_work_item_templates
6
+
7
+ validates :code, :name, presence: true
8
+ validates_uniqueness_of :code
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Ecom
2
+ module Core
3
+ class ProjectWorkItemTemplate < ApplicationRecord
4
+ belongs_to :task_template
5
+ belongs_to :work_product_template
6
+ belongs_to :project_template
7
+ end
8
+ end
9
+ end
@@ -1,15 +1,19 @@
1
1
  module Ecom
2
2
  module Core
3
- class ProjectCrew < ApplicationRecord
3
+ class Site < ApplicationRecord
4
4
  ACTIVE = 'Active'.freeze
5
5
  INACTIVE = 'Inactive'.freeze
6
+
6
7
  STATUSES = [ACTIVE, INACTIVE].freeze
7
8
 
8
- belongs_to :project
9
- belongs_to :crew
9
+ validates :name, :project_id, :project, :address, :status, presence: true
10
10
 
11
- validates :start_date, :status, presence: true
12
11
  validates :status, inclusion: STATUSES
12
+
13
+ belongs_to :project
14
+
15
+ has_many :site_crews
16
+ has_many :crews, through: :site_crews
13
17
  end
14
18
  end
15
19
  end
@@ -0,0 +1,27 @@
1
+ module Ecom
2
+ module Core
3
+ class SiteCrew < ApplicationRecord
4
+ TEMPORARY_SITE_CREW = 'Temporary site crew'.freeze
5
+ PERMANENT_SITE_CREW = 'Permanent site crew'.freeze
6
+
7
+ SITE_CREW_TYPES = [TEMPORARY_SITE_CREW, PERMANENT_SITE_CREW].freeze
8
+
9
+ ACTIVE = 'Active'.freeze
10
+ INACTIVE = 'Inactive'.freeze
11
+ STATUSES = [ACTIVE, INACTIVE].freeze
12
+
13
+ validates :crew_id, :crew, :site_id, :site, :start_date, :site_crew_type, :status, presence: true
14
+
15
+ validates_uniqueness_of :site_id,
16
+ scope: :crew_id,
17
+ conditions: -> { where(status: 'Active') },
18
+ message: 'There can only be one record with status `Active` for a given site and crew'
19
+
20
+ validates :site_crew_type, inclusion: SITE_CREW_TYPES
21
+ validates :status, inclusion: STATUSES
22
+
23
+ belongs_to :crew
24
+ belongs_to :site
25
+ end
26
+ end
27
+ end
@@ -5,26 +5,43 @@ module Ecom
5
5
 
6
6
  has_ancestry
7
7
 
8
+ NOT_INSPECTED = 'Not Inspected'.freeze
9
+ IN_PROGRESS = 'In Progress'.freeze
10
+ PASS = 'Pass'.freeze
11
+ FAIL = 'Fail'.freeze
12
+
13
+ INSPECTION_STATUSES = [NOT_INSPECTED, IN_PROGRESS, PASS, FAIL].freeze
14
+
8
15
  belongs_to :work_product
9
16
  belongs_to :task_template
10
17
  belongs_to :work_package, optional: true
11
18
  belongs_to :work_order, optional: true
12
19
  belongs_to :plan, optional: true
13
20
  belongs_to :performer, class_name: 'Ecom::Core::User', optional: true
14
- belongs_to :approver, class_name: 'Ecom::Core::User', optional: true
15
- belongs_to :supervisor, class_name: 'Ecom::Core::User', optional: true
16
- belongs_to :quality_controller, class_name: 'Ecom::Core::User', optional: true
21
+ belongs_to :client_consultant, class_name: 'Ecom::Core::User', optional: true
22
+ belongs_to :foreman, class_name: 'Ecom::Core::User', optional: true
23
+ belongs_to :inspector, class_name: 'Ecom::Core::User', optional: true
24
+ belongs_to :change_order_for, class_name: 'Ecom::Core::User', optional: true
17
25
 
18
- has_many :task_steps
19
26
  has_many :task_resources
20
27
  has_one :takeoff
28
+ has_one :change_order, foreign_key: :change_order_for_id, class_name: 'Ecom::Core::Task'
21
29
 
22
30
  validates_with DateRangeValidator
23
- validates :code, :name, :status, :percent_completed, presence: true
31
+ validates :code, :name, :status, :inspection_status, :percent_completed, presence: true
24
32
  validates_numericality_of :percent_completed,
25
33
  only_integer: true,
26
34
  greater_than_or_equal_to: 0,
27
35
  less_than_or_equal_to: 100
36
+ validates :percentage_contribution,
37
+ numericality: {
38
+ greater_than_or_equal_to: 0,
39
+ less_than_or_equal_to: 100,
40
+ only_integer: true
41
+ },
42
+ allow_nil: true
43
+
44
+ validates_inclusion_of :inspection_status, in: INSPECTION_STATUSES
28
45
 
29
46
  scope :by_status, ->(status) { where(status: status) }
30
47
 
@@ -0,0 +1,18 @@
1
+ module Ecom
2
+ module Core
3
+ class TaskInspectionChecklist < ApplicationRecord
4
+ NOT_INSPECTED = 'Not Inspected'.freeze
5
+ IN_PROGRESS = 'In Progress'.freeze
6
+ PASS = 'Pass'.freeze
7
+ FAIL = 'Fail'.freeze
8
+
9
+ INSPECTION_STATUSES = [NOT_INSPECTED, IN_PROGRESS, PASS, FAIL].freeze
10
+
11
+ belongs_to :inspected_by, class_name: 'Ecom::Core::User'
12
+ belongs_to :task
13
+
14
+ validates :name, :status, presence: true
15
+ validates :status, inclusion: INSPECTION_STATUSES
16
+ end
17
+ end
18
+ end
@@ -1,57 +1,28 @@
1
- require 'json-schema'
2
1
  module Ecom
3
2
  module Core
4
3
  class TaskTemplate < ApplicationRecord
5
- TASK_STEP_SCHEMA = {
6
- 'type' => 'object',
7
- 'required' => %w[name total_contribution_percentage_to_task],
8
- 'additionalProperties' => false,
9
- 'properties' => {
10
- 'name' => { 'type' => 'string' },
11
- 'total_contribution_percentage_to_task' => {
12
- 'type' => 'integer',
13
- 'minimum' => 1,
14
- 'maximum' => 100
15
- }
16
- }
17
- }.freeze
18
-
19
- # here the json schema has a bug ( including all properties as required)
20
- # and because task_step_name is required on a condition ( only if the
21
- # milestone is after a task step ), we can solve this with a workaround
22
- # by specifying task_step_name in patternProperties.
23
- MILESTONE_SCHEMA = {
24
- 'type' => 'object',
25
- 'required' => %w[name is_after_task_step],
26
- 'additionalProperties' => false,
27
- 'properties' => {
28
- 'name' => { 'type' => 'string' },
29
- 'is_after_task_step' => {
30
- 'type' => 'boolean'
31
- }
32
- },
33
- "patternProperties": {
34
- "task_step_name": {
35
- 'type' => 'string'
36
- }
37
- }
38
- }.freeze
39
-
40
4
  has_ancestry
41
5
 
42
6
  belongs_to :task_template_type
43
- has_and_belongs_to_many :work_product_templates, join_table: 'ecom_core_task_templates_work_product_templates'
7
+ has_many :task_template_inspection_checklists
8
+ has_many :inspection_checklists, through: :task_template_inspection_checklists
9
+ has_many :project_work_item_templates
10
+ has_many :work_product_templates, through: :project_work_item_templates
44
11
  has_and_belongs_to_many :resource_types, join_table: 'ecom_core_task_templates_resource_types'
45
- belongs_to :takeoff_calculator, optional: true
46
12
 
47
- validates :name, :code, presence: true
13
+ validates :name, :code, :takeoff_fields, :task_completion_detail, presence: true
48
14
  validates :code, uniqueness: true
15
+ validates :percentage_contribution,
16
+ numericality: {
17
+ greater_than_or_equal_to: 0,
18
+ less_than_or_equal_to: 100,
19
+ only_integer: true
20
+ },
21
+ allow_nil: true
22
+
49
23
  delegate(:name, to: :task_template_type, prefix: true)
50
24
 
51
- validate :task_steps_schema_validator
52
- validate :milestones_schema_validator
53
- validate :validate_sum_of_task_step_contribution
54
- validate :validate_milestone_task_step_association
25
+ validate :percentage_contribution_sum_validator
55
26
 
56
27
  def full_name
57
28
  parent_name = parent&.name
@@ -72,54 +43,11 @@ module Ecom
72
43
  resource_types.where(type: 'Ecom::Core::EquipmentType')
73
44
  end
74
45
 
75
- def task_steps_schema_validator
76
- return if task_steps.nil?
77
-
78
- validation_errors = JSON::Validator.fully_validate(TASK_STEP_SCHEMA,
79
- task_steps, strict: true,
80
- list: true, clear_cache: true)
81
-
82
- errors.add(:task_steps, validation_errors) unless validation_errors.empty?
83
- end
84
-
85
- def milestones_schema_validator
86
- return if milestones.nil?
87
-
88
- validation_errors = JSON::Validator.fully_validate(MILESTONE_SCHEMA,
89
- milestones, strict: true,
90
- list: true, clear_cache: true)
91
-
92
- errors.add(:milestones, validation_errors) unless validation_errors.empty?
93
- end
94
-
95
- def validate_sum_of_task_step_contribution
96
- return if task_steps.nil?
97
-
98
- filtered_task_steps = task_steps.select { |task_step| task_step['total_contribution_percentage_to_task'] }
99
-
100
- sum_of_task_step_contribution =
101
- filtered_task_steps.sum { |task_step| task_step['total_contribution_percentage_to_task'] }
102
-
103
- errors.add(:task_steps, 'Sum of task step contributions has to be 100') if sum_of_task_step_contribution != 100
104
- end
105
-
106
- def validate_milestone_task_step_association
107
- return if milestones.nil?
108
-
109
- task_step_names = task_steps&.map { |task_step| task_step['name'] }
110
-
111
- milestones_associated_with_task_step = milestones.select { |milestone| milestone['is_after_task_step'] }
112
-
113
- milestones_associated_with_task_step.each do |milestone|
114
- if milestone['task_step_name'].nil?
115
- errors.add(:milestones, 'if the milestone is after a task step, please specify the task step name')
116
- next
117
- end
46
+ def percentage_contribution_sum_validator
47
+ return if percentage_contribution.nil?
118
48
 
119
- unless task_step_names.include? milestone['task_step_name']
120
- errors.add(:milestone, 'task step for the given milestone does not exist in list of task steps')
121
- end
122
- end
49
+ sum = siblings.sum(:percentage_contribution)
50
+ errors.add(:task, 'Sum of percentage contributions has to be 100') if sum > 100
123
51
  end
124
52
  end
125
53
  end
@@ -0,0 +1,8 @@
1
+ module Ecom
2
+ module Core
3
+ class TaskTemplateInspectionChecklist < ApplicationRecord
4
+ belongs_to :task_template
5
+ belongs_to :inspection_checklist
6
+ end
7
+ end
8
+ end
@@ -2,9 +2,12 @@ module Ecom
2
2
  module Core
3
3
  class WorkPackage < ApplicationRecord
4
4
  belongs_to :project
5
+ belongs_to :site_engineer, class_name: 'Ecom::Core::User', optional: true
6
+ belongs_to :project_manager, class_name: 'Ecom::Core::User', optional: true
5
7
 
6
8
  validates :code, :name, presence: true
7
9
  validates :code, uniqueness: true
10
+ validates :budget, numericality: true, unless: proc { budget.nil? }
8
11
 
9
12
  has_many :tasks
10
13
  end
@@ -15,30 +15,14 @@
15
15
  module Ecom
16
16
  module Core
17
17
  class WorkProduct < ApplicationRecord
18
- include AASM
19
-
20
- NEW = 'New'.freeze
21
- UNDER_CONSTRUCTION = 'Under Construction'.freeze
22
- COMPLETED = 'Completed'.freeze
23
-
24
- STATUSES = [NEW, UNDER_CONSTRUCTION, COMPLETED].freeze
25
-
26
18
  belongs_to :work_product_template
27
19
  belongs_to :project
28
20
  belongs_to :product_group, optional: true
29
- belongs_to :approver, class_name: 'Ecom::Core::User', optional: true
30
- belongs_to :supervisor, class_name: 'Ecom::Core::User', optional: true
31
- belongs_to :quality_controller, class_name: 'Ecom::Core::User', optional: true
32
21
  has_many :tasks
33
22
  has_many :dimension_elements
34
23
 
35
- validates :name, :design_reference_no, :status, :percent_completed, presence: true
36
- validates :design_reference_no, uniqueness: { scope: :project_id }
37
- validates :status, inclusion: STATUSES
38
- validates_numericality_of :percent_completed,
39
- only_integer: true,
40
- greater_than_or_equal_to: 0,
41
- less_than_or_equal_to: 100
24
+ validates :name, :design_reference, presence: true
25
+ validates :design_reference, uniqueness: { scope: :project_id }
42
26
  end
43
27
  end
44
28
  end
@@ -2,8 +2,8 @@ module Ecom
2
2
  module Core
3
3
  class WorkProductTemplate < ApplicationRecord
4
4
  validates :code, :name, presence: true, uniqueness: true
5
- belongs_to :task_template_type
6
- has_and_belongs_to_many :task_templates
5
+ has_many :project_work_item_templates
6
+ has_many :task_templates, through: :project_work_item_templates
7
7
  has_many :product_types
8
8
  end
9
9
  end
@@ -0,0 +1,89 @@
1
+ module Ecom
2
+ module Core
3
+ class CrewContractTransactionService
4
+ def execute(transaction_type, crew_contract)
5
+ Ecom::Core::CrewContractTransaction.transaction do
6
+ case transaction_type
7
+ when Ecom::Core::CrewContractTransaction::TXN_UPDATE_CREW_TYPE
8
+
9
+ create_new_id_card(crew_contract.crew, crew_contract.to)
10
+ # update crew type
11
+ crew = crew_contract.crew
12
+ crew.update(crew_type_id: crew_contract.crew_type_id)
13
+
14
+ when Ecom::Core::CrewContractTransaction::TXN_UPDATE_PLACE_OF_WORK
15
+
16
+ create_new_id_card(crew_contract.crew, crew_contract.to)
17
+
18
+ when Ecom::Core::CrewContractTransaction::TXN_UPDATE_WAGE
19
+
20
+ crew = crew_contract.crew
21
+ # update wage
22
+ crew.update(wage: crew_contract.wage, wage_in_words: crew_contract.wage_in_words)
23
+
24
+ when Ecom::Core::CrewContractTransaction::TXN_UPDATE_VALIDITY
25
+
26
+ # make crew active
27
+ create_new_id_card(crew_contract.crew, crew_contract.to)
28
+ make_crew_active(crew_contract.crew)
29
+ activate_contract(crew_contract)
30
+
31
+ when Ecom::Core::CrewContractTransaction::TXN_TERMINATE_CONTRACT
32
+
33
+ # make crew inactive
34
+ make_crew_inactive(crew_contract.crew)
35
+
36
+ # make ID card invalid
37
+ invalidate_id_card(crew_contract.crew)
38
+
39
+ # make the contract void
40
+ deactivate_contract(crew_contract)
41
+
42
+ end
43
+ end
44
+ end
45
+
46
+ def activate_contract(crew_contract)
47
+ crew_contract.update(status: :in_effect)
48
+ end
49
+
50
+ def deactivate_contract(crew_contract)
51
+ crew_contract.update(status: :void)
52
+ end
53
+
54
+ def make_crew_active(crew)
55
+ return if crew.active
56
+
57
+ crew.update(active: true)
58
+ end
59
+
60
+ def make_crew_inactive(crew)
61
+ return unless crew.active
62
+
63
+ crew.update(active: false)
64
+ end
65
+
66
+ # invalidate other Id cards and creates a new ID card
67
+ def create_new_id_card(crew, valid_until)
68
+ issued_on = Time.now
69
+
70
+ previous_id_card = Ecom::Core::CrewIdCard.where(crew_id: crew.id).last
71
+
72
+ previous_id_card&.update(status: 'Invalid')
73
+
74
+ new_id_card = Ecom::Core::CrewIdCard.new(
75
+ crew_id: crew.id,
76
+ issued_on: issued_on,
77
+ valid_until: valid_until,
78
+ status: 'Valid'
79
+ )
80
+ raise StandardError, new_id_card.errors.messages unless new_id_card.save
81
+ end
82
+
83
+ def invalidate_id_card(crew)
84
+ current_id_card = Ecom::Core::CrewIdCard.where(crew_id: crew.id).last
85
+ current_id_card.update(status: 'Invalid')
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,44 @@
1
+ module Ecom
2
+ module Core
3
+ class SiteCrewService
4
+ def update(params)
5
+ id = params[:site_id]
6
+ crew = params[:crew]
7
+
8
+ # Process new additions
9
+ new_crew = crew.select { |c| c[:status] == 'checked' }
10
+ removed = crew.select { |c| c[:status] == 'unchecked' }
11
+
12
+ crew_ids = new_crew.map { |c| c[:crew_id] }
13
+
14
+ site_crew = Ecom::Core::Crew.where(id: crew_ids)
15
+
16
+ new_entries = []
17
+ new_crew.each do |nc|
18
+ new_entries << Ecom::Core::SiteCrew.new(
19
+ site_id: id, crew_id: nc[:crew_id], start_date: Date.today,
20
+ site_crew_type: 'Temporary site crew',
21
+ status: 'Active'
22
+ )
23
+ end
24
+
25
+ Ecom::Core::SiteCrew.transaction do
26
+ new_entries.each(&:save)
27
+ end
28
+
29
+ removed_ids = removed.map { |r| r[:crew_id] }
30
+ if removed_ids.count.positive?
31
+ removed_crews = Ecom::Core::SiteCrew.where(site_id: id, crew_id: removed_ids, status: 'Active')
32
+ Ecom::Core::SiteCrew.transaction do
33
+ # removed_crew.map(&:delete)
34
+ removed_crews.each do |removed_crew|
35
+ removed_crew.update(status: 'Inactive')
36
+ end
37
+ end
38
+ end
39
+
40
+ { success: true, data: site_crew }
41
+ end
42
+ end
43
+ end
44
+ end