Guest User

Untitled

a guest
Oct 16th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.34 KB | None | 0 0
  1. class AssetsController < ApplicationController
  2. before_action :require_system_admin_role, only: [:edit]
  3. before_action :set_asset, only: [:show, :edit, :relatives, :update, :destroy]
  4. before_action :set_client_schedule_rates, only: [:new, :edit]
  5. before_action :set_variant, only: [:edit, :update, :edit_multiple, :edit_multiple_asset_load]
  6. before_action :set_sam_id, only: [:create, :update, :nearby, :edit_multiple, :edit_multiple_asset_load]
  7. before_action :set_schedules, only: [:show, :edit]
  8. before_action :set_paper_trail_whodunnit
  9. after_filter { flash.discard if request.xhr? }
  10.  
  11. def index
  12. if current_user.is_subcontractor?
  13. @assets = Asset.assigned_to_subcontractor(current_user)
  14. else
  15. @assets = Asset.all
  16. end
  17. end
  18.  
  19. def show
  20. end
  21.  
  22. def edit
  23. set_schedule_rates
  24. end
  25.  
  26. def relatives
  27. end
  28.  
  29. def create
  30. @asset = Asset.new(asset_params)
  31.  
  32. if @asset.save
  33. @client_schedule_rates = ClientScheduleRate.by_project(@asset.project.id)
  34. @subcontractor_schedule_rates = SubcontractorScheduleRate.by_project(@asset.project.id)
  35. set_schedules
  36.  
  37. flash[:success] = "Asset was created successfully"
  38. else
  39. @client_schedule_rates = ClientScheduleRate.all
  40. @subcontractor_schedule_rates = SubcontractorScheduleRate.all
  41.  
  42. flash[:alert] = "Asset failed to create"
  43. end
  44.  
  45. respond_to do |format|
  46. format.html {
  47. if params[:multiple] == "true"
  48. @assets = [@asset]
  49. @multiple = true
  50. render partial: 'form'
  51. else
  52. render :edit
  53. end
  54. }
  55. end
  56. end
  57.  
  58. def update
  59. @asset.update_from_params(update_params, variation_permitted: policy('maps_progress').manage?)
  60. @asset.reload
  61. @client_schedule_rates = ClientScheduleRate.by_project(@asset.project)
  62. @subcontractor_schedule_rates = SubcontractorScheduleRate.by_project(@asset.project)
  63. set_schedules
  64.  
  65. if @asset.errors.empty?
  66. flash[:success] = "Asset was successfully saved"
  67. @unassigned = set_unassigned(@asset)
  68. else
  69. flash[:alert] = "Asset failed to save"
  70. end
  71.  
  72. respond_to do |format|
  73. format.html do
  74. if params[:multiple] == "true"
  75. @assets = [@asset]
  76. @multiple = true
  77. render partial: 'form'
  78. else
  79. render :show
  80. end
  81. end
  82. end
  83. end
  84.  
  85. def destroy
  86. @asset.destroy
  87. respond_to do |format|
  88. format.html { redirect_to assets_url, notice: 'Asset was successfully destroyed.' }
  89. format.json { head :no_content }
  90. end
  91. end
  92.  
  93. def nearby
  94. @multiple = true
  95. codes = params[:asset_codes]
  96. @assets = Asset.where(code: codes)
  97. @non_assets = build_new_assets_from(codes)
  98. @num_assets = @assets.count
  99. @num_non_assets = @non_assets.count
  100. @asset = first_asset_from(codes) if asset_entities.present?
  101.  
  102. respond_to do |format|
  103. format.html { render partial: 'nearby' }
  104. format.js { render partial: 'nearby' }
  105. end
  106. end
  107.  
  108. def edit_multiple
  109. @multiple = true
  110. codes = params[:asset_codes]
  111.  
  112. @assets = Asset.includes(asset_client_schedules: [:client_schedule_rate, :asset_subcontractor_schedules]).where(code: codes).to_a
  113.  
  114. @non_assets = build_new_assets_from(codes)
  115.  
  116. @num_assets = @assets.count
  117. @num_non_assets = @non_assets.count
  118.  
  119. # move first asset to the top of the list
  120. to_delete = @assets.select {|a| a["code"] == codes[0] }.first()
  121. if (to_delete)
  122. @assets.delete_if { |a| a["code"] == codes[0] }
  123. @assets.unshift(to_delete) if (to_delete)
  124. end
  125.  
  126. @asset = first_asset_from(codes) if asset_entities.present?
  127. @unassigned = set_unassigned(@asset)
  128. set_schedule_rates
  129.  
  130. set_schedules
  131.  
  132. respond_to do |format|
  133. format.html { render partial: 'edit_multiple' }
  134. format.js { render partial: 'edit_multiple' }
  135. end
  136. end
  137.  
  138. def edit_multiple_asset_load
  139. #TODO there
  140. @multiple = true
  141. if params[:is_new] == 'false'
  142. @asset = Asset.all
  143. .includes(progress_entries: [:progress_line_items, :images, :progress_resource_items])
  144. .includes(asset_client_schedules: [:progress_line_items, :variation_line_items])
  145. .includes(asset_subcontractor_schedules: [:progress_line_items, :defects, :variation_line_items])
  146. .includes(:asset_notes)
  147. .includes(:asset_access)
  148. .includes(defects: :images)
  149. .includes(variations: [:variation_line_items, :images])
  150. .includes(:ifdvs).where(code: params[:asset_code]).first
  151. else
  152. @asset = Asset.new
  153. @asset.code = params[:asset_code]
  154. end
  155.  
  156. @unassigned = set_unassigned(@asset)
  157. set_schedule_rates
  158. set_schedules
  159.  
  160. respond_to do |format|
  161. format.js { render partial: 'form' }
  162. end
  163. end
  164.  
  165. def filter_assets
  166. unassigned_select = params[:unassigned_select]
  167. if (params[:fda_id] && !params[:fda_id].empty?)
  168. @assets = Asset.where(fda_id: params[:fda_id]).includes(:asset_client_schedules)
  169. elsif (params[:sam_id] && !params[:sam_id].empty?)
  170. @assets = Asset.joins(:fda).where(fdas: { sam_id: params[:sam_id]}).includes(:asset_client_schedules)
  171. else
  172. @assets = Asset.all.includes(:asset_client_schedules)
  173. end
  174.  
  175. case unassigned_select
  176. # all - 0 - do nothing
  177. # unassigned
  178. when '1'
  179. @assets = @assets.reject {|a| a.asset_client_schedules.any?}
  180. #@assets = @assets.joins("LEFT OUTER JOIN asset_client_schedules ON assets.id = asset_client_schedules.asset_id")
  181. # .where("asset_client_schedules.asset_id is null")
  182. # assigned
  183. when '2'
  184. @assets = @assets.reject {|a| !a.asset_client_schedules.any?}
  185. #@assets = @assets.joins("LEFT OUTER JOIN asset_client_schedules ON assets.id = asset_client_schedules.asset_id")
  186. # .where("asset_client_schedules.asset_id is not null")
  187. end
  188. respond_to do |format|
  189. format.js
  190. end
  191. end
  192.  
  193. def paginated_assets
  194. if params[:sam_id].present?
  195. query = Asset.joins(:fda).where(fdas: { sam_id: params[:sam_id] })
  196. else
  197. query = Asset.joins(:fda)
  198. end
  199. query = query.where("lower(assets.code) like ?", "%#{params[:term].downcase}%") if params[:term].present?
  200. query = query.where(fda_id: params[:fda_id]) if params[:fda_id].present?
  201.  
  202. if params[:unassigned_select].present?
  203. query = query.joins("LEFT OUTER JOIN asset_client_schedules ON assets.id = asset_client_schedules.asset_id")
  204. case params[:unassigned_select]
  205. when '1'
  206. query = query.where(asset_client_schedules: { asset_id: nil })
  207. when '2'
  208. query = query.where.not(asset_client_schedules: { asset_id: nil })
  209. query = query.assigned_to_subcontractor(current_user) if current_user.is_a_subcontractor?
  210. end
  211. end
  212. query = query.uniq
  213. total_count = query.size
  214. query = query.page(params[:page]).per(50)
  215.  
  216. render json: { total_count: total_count, items: query.map{ |a| { id: a.code, code: a.code } } }
  217. end
  218.  
  219. private
  220.  
  221. def set_asset
  222. @asset = Asset.find(params[:id])
  223. end
  224.  
  225. def set_asset_by_asset_id_param
  226. @asset = Asset.find(params[:asset_id])
  227. end
  228.  
  229. def set_client_schedule_rates
  230. @client_schedule_rates = ClientScheduleRate.all
  231. end
  232.  
  233. def set_variant
  234. request.variant = :subcontractor if current_user.is_a_subcontractor?
  235. end
  236.  
  237. def asset_params
  238. params.require(:asset).permit(:code, :description, :fda_id, :parent_id, :asset_class_id, :asset_configuration_id, :asset_status_id,
  239. :asset_client_schedules_attributes => [:id, :client_schedule_rate_id, :quantity, :_destroy],
  240. :asset_subcontractor_schedules_attributes => [:id, :subcontractor_schedule_rate_id, :quantity, :subcontractor_id, :start_coord, :end_coord, :discard, :changed_from, :_destroy],
  241. notes_attributes: [:id, :note, :note_type_id, :_destroy,
  242. images_attributes: [:id, :file, :description, :_destroy]],
  243. progress_entries_attributes: [:id, :date, :note, :_destroy, progress_line_items_attributes: [:id, :progressable_id, :progressable_type, :quantity, :actual_quantity, :_destroy],
  244. images_attributes: [:id, :file, :description, :_destroy], progress_resource_items_attributes: [:id, :resource_id, :quantity, :number_of, :_destroy]],
  245. defects_attributes: [:id, :defect_date, :asset_subcontractor_schedule_id, :defect_type_id, :defect_code_id, :defect_severity_id, :description, :rectification_required, :captured_by, :supporting_info, :comments, :target_rectification_date, :defect_status_id, :completion_date, :_destroy,
  246. images_attributes: [:id, :file, :description, :_destroy]],
  247. variations_attributes: [:id, :_destroy],
  248. ifdvs_attributes: [:id, :_destroy],
  249. asset_access_attributes: [:id, :asset_id, :requested_at, :approved_at, :on_hold, :spec_instructions, :_destroy],
  250. parameters_attributes: [:id, :key, :value, :_destroy],
  251. children_attributes: [:id, :asset_status_id]
  252. )
  253. end
  254.  
  255. def update_params
  256. sam_status = @asset.sam.sam_status
  257.  
  258. a = []
  259.  
  260. if policy('maps_asset_details').manage?
  261. a += [
  262. :code, :description, :fda_id, :parent_id, :asset_class_id,
  263. :asset_configuration_id
  264. ]
  265. end
  266.  
  267. if policy('maps_asset_status').manage?
  268. a += [
  269. :asset_status_id,
  270. children_attributes: [:id, :asset_status_id]
  271. ]
  272. end
  273.  
  274. if policy('maps_parameters').manage?
  275. a += [
  276. parameters_attributes: [:id, :key, :value, :_destroy]
  277. ]
  278. end
  279.  
  280. if policy('maps_client_schedule_of_rates').manage? or policy('maps_subcontractor_schedule_of_rates').manage? or (sam_status.present? and sam_status.lock_schedules?)
  281. a += [asset_client_schedules_attributes: [:id, :client_schedule_rate_id, :quantity, :_destroy, asset_subcontractor_schedules_attributes:
  282. [:id, :subcontractor_schedule_rate_id, :quantity, :subcontractor_id, :start_coord, :end_coord, :created_by_variation, :variation_id, :asset_id, :discard, :changed_from, :_destroy]],
  283. asset_subcontractor_schedules_attributes: [:id, :subcontractor_schedule_rate_id, :quantity, :subcontractor_id, :start_coord, :end_coord, :created_by_variation, :variation_id, :asset_id, :discard, :changed_from, :_destroy]]
  284. end
  285.  
  286. if policy('maps_progress').manage? or (sam_status.present? and sam_status.lock_progress?)
  287. a += [
  288. progress_entries_attributes: [
  289. :id, :date, :note, :_destroy, progress_line_items_attributes: [
  290. :id, :progressable_id, :progressable_type, :quantity, :actual_quantity,
  291. :finished_type, :variation_reason, :_destroy], images_attributes: [
  292. :id, :file, :description, :_destroy],
  293. progress_resource_items_attributes: [
  294. :id, :resource_id, :quantity, :resource_type_id, :_destroy
  295. ]
  296. ]
  297. ]
  298. end
  299.  
  300. if policy('maps_quality_checks').manage?
  301. a += [
  302. defects_attributes: [:id, :defect_date, :asset_subcontractor_schedule_id,
  303. :defect_type_id, :defect_code_id, :defect_severity_id, :description,
  304. :rectification_required, :captured_by, :supporting_info, :comments,
  305. :target_rectification_date, :defect_status_id, :completion_date,
  306. :_destroy, images_attributes: [:id, :file, :description, :_destroy]
  307. ]
  308. ]
  309. end
  310.  
  311. if policy('maps_variations').manage? or (sam_status.nil? and sam_status.lock_variations?)
  312. a += [variations_attributes: [:id, :_destroy]]
  313. end
  314.  
  315. if policy('maps_ifdvs').manage?
  316. a += [ifdvs_attributes: [:id, :_destroy]]
  317. end
  318.  
  319. if policy('maps_notes').manage?
  320. a += [
  321. notes_attributes: [
  322. :id, :note, :note_type_id, :_destroy,
  323. images_attributes: [:id, :file, :description, :_destroy]]
  324. ]
  325. end
  326.  
  327. if policy('maps_land_access').manage?
  328. a += [
  329. asset_access_attributes: [
  330. :id, :requested_at, :approved_at, :on_hold, :spec_instructions, :_destroy
  331. ]
  332. ]
  333. end
  334. params.require(:asset).permit(a)
  335. end
  336.  
  337. def asset_multiple_params
  338. params.require(:asset_codes[])
  339. end
  340.  
  341. def set_unassigned(asset)
  342. return if !asset || asset.new_record?
  343. asset.asset_subcontractor_schedules.where(subcontractor_id: nil)
  344. end
  345.  
  346. def build_new_assets_from codes
  347. (codes - @assets.map(&:code)).map { |code| Asset.new(code: code) }
  348. end
  349.  
  350. def first_asset_from codes
  351. asset_entities.find { |asset| asset.code == codes.first }
  352. end
  353.  
  354. def asset_entities
  355. @assets + @non_assets
  356. end
  357.  
  358. def set_schedule_rates
  359. if @asset.persisted? || @sam_id.present?
  360. project = @asset.project || Sam.find(@sam_id).project
  361. @client_schedule_rates = ClientScheduleRate.by_project(project.id)
  362. @subcontractor_schedule_rates = SubcontractorScheduleRate.by_project(project.id)
  363. else
  364. @client_schedule_rates = ClientScheduleRate.all
  365. @subcontractor_schedule_rates = SubcontractorScheduleRate.all
  366. end
  367. end
  368.  
  369. def set_sam_id
  370. @sam_id = params[:sam_id]
  371. end
  372.  
  373. def set_schedules
  374. @asset_client_schedules = policy_scope @asset.asset_client_schedules
  375. @unassociated_subcontractor_schedules = policy_scope @asset.subcontractor_schedules_unassociated
  376. end
  377.  
  378. def require_system_admin_role
  379. permission_denied unless request.xhr? || current_user.is_system_admin?
  380. end
  381. end
Add Comment
Please, Sign In to add comment