ecom_core 1.2.32 → 1.3.0

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 (135) 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/controllers/ecom/core/unit_costs_controller.rb +29 -0
  4. data/app/models/ecom/core/attendance_sheet.rb +19 -19
  5. data/app/models/ecom/core/available_unit_of_measurement.rb +10 -0
  6. data/app/models/ecom/core/crew.rb +6 -3
  7. data/app/models/ecom/core/crew_contract.rb +41 -1
  8. data/app/models/ecom/core/crew_contract_transaction.rb +29 -0
  9. data/app/models/ecom/core/crew_id_card.rb +36 -0
  10. data/app/models/ecom/core/crew_time.rb +1 -1
  11. data/app/models/ecom/core/inspection_checklist.rb +6 -0
  12. data/app/models/ecom/core/lookahead_plan.rb +41 -0
  13. data/app/models/ecom/core/lookahead_plan_history.rb +16 -0
  14. data/app/models/ecom/core/lookahead_plan_review_time.rb +29 -0
  15. data/app/models/ecom/core/lookahead_plan_task_progress.rb +22 -0
  16. data/app/models/ecom/core/material.rb +6 -0
  17. data/app/models/ecom/core/material_identity.rb +21 -0
  18. data/app/models/ecom/core/material_item.rb +18 -0
  19. data/app/models/ecom/core/material_sub_type.rb +20 -0
  20. data/app/models/ecom/core/measurement_unit.rb +4 -14
  21. data/app/models/ecom/core/overtime_sheet.rb +16 -16
  22. data/app/models/ecom/core/payroll.rb +3 -3
  23. data/app/models/ecom/core/project.rb +0 -3
  24. data/app/models/ecom/core/project_template.rb +13 -0
  25. data/app/models/ecom/core/project_work_item_template.rb +9 -0
  26. data/app/models/ecom/core/resource_requisition.rb +21 -0
  27. data/app/models/ecom/core/resource_requisition_item.rb +45 -0
  28. data/app/models/ecom/core/{project_crew.rb → site.rb} +8 -4
  29. data/app/models/ecom/core/site_crew.rb +27 -0
  30. data/app/models/ecom/core/stakeholder.rb +1 -1
  31. data/app/models/ecom/core/task.rb +22 -9
  32. data/app/models/ecom/core/task_attachment.rb +11 -0
  33. data/app/models/ecom/core/task_inspection_checklist.rb +18 -0
  34. data/app/models/ecom/core/task_template.rb +20 -90
  35. data/app/models/ecom/core/task_template_inspection_checklist.rb +8 -0
  36. data/app/models/ecom/core/unit_cost.rb +27 -0
  37. data/app/models/ecom/core/unit_of_measure.rb +8 -0
  38. data/app/models/ecom/core/work_item_resource_requirement_template.rb +18 -0
  39. data/app/models/ecom/core/work_package.rb +3 -0
  40. data/app/models/ecom/core/work_product.rb +2 -18
  41. data/app/models/ecom/core/work_product_template.rb +2 -2
  42. data/app/serializers/ecom/core/unit_cost_serializer.rb +21 -0
  43. data/app/services/ecom/core/crew_contract_transaction_service.rb +89 -0
  44. data/app/services/ecom/core/site_crew_service.rb +44 -0
  45. data/app/uploaders/ecom/core/photo_uploader.rb +13 -2
  46. data/app/uploaders/ecom/core/task_attachment_uploader.rb +11 -0
  47. data/config/initializers/carrierwave.rb +9 -0
  48. data/config/routes.rb +4 -2
  49. data/db/migrate/20191118052213_create_ecom_core_unit_of_measures.rb +11 -0
  50. data/db/migrate/20191119012030_create_ecom_core_task_templates.rb +10 -8
  51. data/db/migrate/20191119013236_create_ecom_core_work_product_templates.rb +0 -15
  52. data/db/migrate/20191119021405_create_ecom_core_project_templates.rb +15 -0
  53. data/db/migrate/20191119034319_create_ecom_core_project_work_item_templates.rb +20 -0
  54. data/db/migrate/20191201145849_create_ecom_core_sites.rb +16 -0
  55. data/db/migrate/20191202222210_create_ecom_core_work_packages.rb +12 -0
  56. data/db/migrate/20191202235434_create_ecom_core_work_products.rb +2 -17
  57. data/db/migrate/20191207103730_create_ecom_core_lookahead_plans.rb +19 -0
  58. data/db/migrate/20191207103735_create_ecom_core_tasks.rb +15 -10
  59. data/db/migrate/20191225140433_create_ecom_core_attendance_sheets.rb +4 -4
  60. data/db/migrate/20200126081005_create_ecom_core_payrolls.rb +3 -3
  61. data/db/migrate/20200410090701_create_ecom_core_overtime_sheets.rb +4 -4
  62. data/db/migrate/20200616044231_create_ecom_core_material_sub_types.rb +14 -0
  63. data/db/migrate/20200616051902_create_ecom_core_material_identities.rb +17 -0
  64. data/db/migrate/20200618105233_create_ecom_core_material_items.rb +16 -0
  65. data/db/migrate/20200813165555_create_ecom_core_available_unit_of_measurements.rb +16 -0
  66. data/db/migrate/20200901085227_create_ecom_core_crew_contracts.rb +7 -1
  67. data/db/migrate/20200919085613_create_ecom_core_job_cards.rb +1 -0
  68. data/db/migrate/20201013072924_create_ecom_core_crew_contract_transactions.rb +16 -0
  69. data/db/migrate/20201013090609_create_ecom_core_site_crews.rb.rb +22 -0
  70. data/db/migrate/20201013094100_create_ecom_core_crew_id_cards.rb +16 -0
  71. data/db/migrate/20201113050953_create_ecom_core_task_inspection_checklists.rb +22 -0
  72. data/db/migrate/20201113094302_create_ecom_core_task_template_inspection_checklists.rb +17 -0
  73. data/db/migrate/20201121064916_create_ecom_core_unit_costs.rb +30 -0
  74. data/db/migrate/20201122123227_create_ecom_core_lookahead_plan_backlogs.rb +18 -0
  75. data/db/migrate/20201122170645_create_ecom_core_lookahead_plan_histories.rb +21 -0
  76. data/db/migrate/20201122170724_create_ecom_core_lookahead_plan_task_progresses.rb +21 -0
  77. data/db/migrate/20201123134917_create_ecom_core_task_attachments.rb +15 -0
  78. data/db/migrate/20201124171642_create_ecom_core_lookahead_plan_review_times.rb +17 -0
  79. data/db/migrate/20201125191158_create_ecom_core_work_item_resource_requirement_templates.rb +31 -0
  80. data/db/migrate/20201126191334_create_ecom_core_resource_requisitions.rb +23 -0
  81. data/db/migrate/20201126191349_create_ecom_core_resource_requisition_items.rb +33 -0
  82. data/lib/ecom/core/version.rb +1 -1
  83. data/spec/factories/ecom/core/attendance_sheets.rb +1 -1
  84. data/spec/factories/ecom/core/available_unit_of_measurements.rb +6 -0
  85. data/spec/factories/ecom/core/crew_contract_transactions.rb +8 -0
  86. data/spec/factories/ecom/core/crew_contracts.rb +12 -0
  87. data/spec/factories/ecom/core/crew_id_cards.rb +8 -0
  88. data/spec/factories/{dimension_elements.rb → ecom/core/dimension_elements.rb} +0 -0
  89. data/spec/factories/ecom/core/inspection_checklists.rb +5 -0
  90. data/spec/factories/ecom/core/lookahead_plan_histories.rb +9 -0
  91. data/spec/factories/ecom/core/lookahead_plan_review_times.rb +8 -0
  92. data/spec/factories/ecom/core/lookahead_plan_task_progresses.rb +9 -0
  93. data/spec/factories/ecom/core/lookahead_plans.rb +10 -0
  94. data/spec/factories/ecom/core/material_identities.rb +6 -0
  95. data/spec/factories/ecom/core/material_items.rb +6 -0
  96. data/spec/factories/ecom/core/material_sub_types.rb +6 -0
  97. data/spec/factories/ecom/core/materials.rb +5 -0
  98. data/spec/factories/{measurement_units.rb → ecom/core/measurement_units.rb} +6 -0
  99. data/spec/factories/ecom/core/overtime_sheets.rb +1 -1
  100. data/spec/factories/ecom/core/payrolls.rb +1 -1
  101. data/spec/factories/ecom/core/project_templates.rb +8 -0
  102. data/spec/factories/ecom/core/project_work_item_templates.rb +7 -0
  103. data/spec/factories/ecom/core/resource_requisition_items.rb +12 -0
  104. data/spec/factories/ecom/core/resource_requisitions.rb +9 -0
  105. data/spec/factories/ecom/core/site_crews.rb +10 -0
  106. data/spec/factories/ecom/core/sites.rb +8 -0
  107. data/spec/factories/ecom/core/task_attachments.rb +8 -0
  108. data/spec/factories/ecom/core/task_inspection_checklists.rb +11 -0
  109. data/spec/factories/ecom/core/task_template_inspection_checklists.rb +7 -0
  110. data/spec/factories/ecom/core/task_templates.rb +11 -6
  111. data/spec/factories/ecom/core/tasks.rb +9 -3
  112. data/spec/factories/ecom/core/unit_costs.rb +13 -0
  113. data/spec/factories/ecom/core/unit_of_measures.rb +7 -0
  114. data/spec/factories/ecom/core/work_item_resource_requirement_templates.rb +10 -0
  115. data/spec/factories/ecom/core/work_packages.rb +6 -0
  116. data/spec/factories/ecom/core/work_product_templates.rb +0 -1
  117. data/spec/factories/ecom/core/work_products.rb +1 -7
  118. metadata +130 -23
  119. data/app/controllers/concerns/ecom/core/filterable.rb +0 -14
  120. data/app/models/ecom/core/plan.rb +0 -18
  121. data/app/models/ecom/core/takeoff_calculator.rb +0 -115
  122. data/app/models/ecom/core/task_step.rb +0 -85
  123. data/app/models/ecom/core/task_step_dependency.rb +0 -10
  124. data/app/services/ecom/core/project_crew_service.rb +0 -39
  125. data/db/migrate/20191119012027_create_ecom_core_takeoff_calculators.rb +0 -11
  126. data/db/migrate/20191207103730_create_ecom_core_plans.rb +0 -12
  127. data/db/migrate/20191225121850_create_ecom_core_project_crews.rb +0 -19
  128. data/db/migrate/20200820123719_create_ecom_core_task_steps.rb +0 -17
  129. data/db/migrate/20200821130934_create_ecom_core_task_step_dependencies.rb +0 -16
  130. data/db/migrate/20200922044959_add_costs_approved_to_job_card.rb +0 -5
  131. data/spec/factories/ecom/core/plans.rb +0 -8
  132. data/spec/factories/ecom/core/project_crews.rb +0 -9
  133. data/spec/factories/ecom/core/takeoff_calculators.rb +0 -18
  134. data/spec/factories/ecom/core/task_step_dependencies.rb +0 -6
  135. data/spec/factories/ecom/core/task_steps.rb +0 -8
@@ -1,57 +1,30 @@
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
+ belongs_to :unit_of_measure
8
+
9
+ has_many :task_template_inspection_checklists
10
+ has_many :inspection_checklists, through: :task_template_inspection_checklists
11
+ has_many :project_work_item_templates
12
+ has_many :work_product_templates, through: :project_work_item_templates
44
13
  has_and_belongs_to_many :resource_types, join_table: 'ecom_core_task_templates_resource_types'
45
- belongs_to :takeoff_calculator, optional: true
46
14
 
47
- validates :name, :code, presence: true
15
+ validates :name, :code, :takeoff_fields, :task_completion_detail, presence: true
48
16
  validates :code, uniqueness: true
17
+ validates :percentage_contribution,
18
+ numericality: {
19
+ greater_than_or_equal_to: 0,
20
+ less_than_or_equal_to: 100,
21
+ only_integer: true
22
+ },
23
+ allow_nil: true
24
+
49
25
  delegate(:name, to: :task_template_type, prefix: true)
50
26
 
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
27
+ validate :percentage_contribution_sum_validator
55
28
 
56
29
  def full_name
57
30
  parent_name = parent&.name
@@ -72,54 +45,11 @@ module Ecom
72
45
  resource_types.where(type: 'Ecom::Core::EquipmentType')
73
46
  end
74
47
 
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
48
+ def percentage_contribution_sum_validator
49
+ return if percentage_contribution.nil?
118
50
 
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
51
+ sum = siblings.sum(:percentage_contribution)
52
+ errors.add(:task, 'Sum of percentage contributions has to be 100') if sum > 100
123
53
  end
124
54
  end
125
55
  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
@@ -0,0 +1,27 @@
1
+ module Ecom
2
+ module Core
3
+ class UnitCost < ApplicationRecord
4
+ before_save :update_previous_unit_cost
5
+
6
+ belongs_to :resource_type
7
+ belongs_to :measurement_unit
8
+ belongs_to :currency
9
+ belongs_to :set_by, class_name: 'Ecom::Core::User'
10
+
11
+ validates :quantity, :effective_date, :utilization_factor, :set_by_id, :set_by, presence: true
12
+
13
+ validates :price, presence: true, numericality: { greater_than: 0 }
14
+ validates :utilization_factor, presence: true, numericality: { greater_than: 0, less_than_or_equal_to: 1 }
15
+
16
+ def update_previous_unit_cost
17
+ return if resource_type_id.nil?
18
+
19
+ return if active_changed?(from: true, to: false)
20
+
21
+ Ecom::Core::UnitCost
22
+ .where(resource_type_id: resource_type_id, active: true)
23
+ .update(active: false)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module Ecom
2
+ module Core
3
+ class UnitOfMeasure < ApplicationRecord
4
+ validates :code, :name, presence: true
5
+ validates :code, uniqueness: true
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ module Ecom
2
+ module Core
3
+ class WorkItemResourceRequirementTemplate < ApplicationRecord
4
+ belongs_to :project_work_item_template
5
+ belongs_to :resource_type
6
+ belongs_to :work_item_quantity_measurement_unit, class_name: 'Ecom::Core::MeasurementUnit'
7
+ belongs_to :resource_quantity_measurement_unit, class_name: 'Ecom::Core::MeasurementUnit'
8
+
9
+ validates :project_work_item_template_id, :project_work_item_template,
10
+ :resource_type_id, :resource_type, :work_item_quantity_measurement_unit_id,
11
+ :work_item_quantity_measurement_unit, :resource_quantity_measurement_unit_id,
12
+ :resource_quantity_measurement_unit, presence: true
13
+
14
+ validates :work_item_quantity, presence: true, numericality: { greater_than: 0 }
15
+ validates :resource_quantity, presence: true, numericality: { greater_than: 0 }
16
+ end
17
+ end
18
+ 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,21 @@
1
+ module Ecom
2
+ module Core
3
+ class UnitCostSerializer < ActiveModel::Serializer
4
+ attributes :id, :resource_type_id, :quantity, :measurement_unit_id,
5
+ :price, :currency_id, :utilization_factor, :effective_date, :set_by_id,
6
+ :resource_type, :measurement_unit, :currency
7
+
8
+ def resource_type
9
+ object.resource_type
10
+ end
11
+
12
+ def measurement_unit
13
+ object.measurement_unit
14
+ end
15
+
16
+ def currency
17
+ object.currency.name
18
+ end
19
+ end
20
+ end
21
+ 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
@@ -1,7 +1,11 @@
1
1
  module Ecom
2
2
  module Core
3
3
  class PhotoUploader < CarrierWave::Uploader::Base
4
- storage :file
4
+ if Rails.env.production?
5
+ storage :fog
6
+ else
7
+ storage :file
8
+ end
5
9
 
6
10
  def store_dir
7
11
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
@@ -12,7 +16,14 @@ module Ecom
12
16
  end
13
17
 
14
18
  def filename
15
- original_filename
19
+ "#{secure_token}.#{file.extension}" if original_filename.present?
20
+ end
21
+
22
+ protected
23
+
24
+ def secure_token
25
+ var = :"@#{mounted_as}_secure_token"
26
+ model.instance_variable_get(var) || model.instance_variable_set(var, SecureRandom.uuid)
16
27
  end
17
28
  end
18
29
  end
@@ -0,0 +1,11 @@
1
+ module Ecom
2
+ module Core
3
+ class TaskAttachmentUploader < CarrierWave::Uploader::Base
4
+ storage :file
5
+
6
+ def store_dir
7
+ "#{ENV.fetch('UPLOAD_PREFIX')}uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
8
+ end
9
+ end
10
+ end
11
+ end