Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(SPARCRequest) Email Logic Refactor and Scenarios #189

Merged
merged 3 commits into from
Apr 6, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 5 additions & 28 deletions app/controllers/service_requests_controller.rb
Expand Up @@ -170,7 +170,7 @@ def obtain_research_pricing
@protocol = @service_request.protocol
@service_request.previous_submitted_at = @service_request.submitted_at

NotifierLogic.new(@service_request, @sub_service_request, current_user).send_confirmation_notifications_get_a_cost_estimate
NotifierLogic.new(@service_request, @sub_service_request, current_user).update_status_and_send_get_a_cost_estimate_email
render formats: [:html]
end

Expand Down Expand Up @@ -202,7 +202,7 @@ def save_and_exit
if @sub_service_request #if editing a sub service request, update status
@sub_service_request.update_attribute(:status, 'draft')
else
update_service_request_status(@service_request, 'draft', false)
@service_request.update_status('draft')
@service_request.ensure_ssr_ids
end
redirect_to dashboard_root_path, sub_service_request_id: @sub_service_request.try(:id)
Expand Down Expand Up @@ -278,13 +278,10 @@ def remove_service
@service_request.previous_submitted_at = @service_request.submitted_at
@protocol = @service_request.protocol

# notify service providers and admin of a destroyed ssr upon deletion of ssr
if ssr.line_items.empty?
if !ssr.submitted_at.nil?
# notify service providers and admin of a destroyed ssr upon deletion of ssr
notifier_logic = NotifierLogic.new(@service_request, nil, current_user)
notifier_logic.send_ssr_service_provider_notifications(ssr, ssr_destroyed: true, request_amendment: false)
notifier_logic.send_admin_notifications([ssr], request_amendment: false, ssr_destroyed: true)
end
notifier_logic = NotifierLogic.new(@service_request, nil, current_user)
notifier_logic.ssr_deletion_emails(ssr, ssr_destroyed: true, request_amendment: false)
ssr.destroy
end

Expand Down Expand Up @@ -490,26 +487,6 @@ def send_epic_notification_for_user_approval(protocol)
Notifier.notify_for_epic_user_approval(protocol).deliver unless QUEUE_EPIC
end

def update_service_request_status(service_request, status, validate=true, submit=false)
requests = []

service_request.sub_service_requests.each do |ssr|
if UPDATABLE_STATUSES.include?(ssr.status) || !submit
requests << ssr
end
end

to_notify = service_request.update_status(status, validate, submit)

if (status == 'submitted')
service_request.previous_submitted_at = service_request.submitted_at
service_request.update_attribute(:submitted_at, Time.now)
requests.each { |ssr| ssr.update_attributes(submitted_at: Time.now) }
end

to_notify
end

def authorize_protocol_edit_request
if current_user
authorized = if @sub_service_request
Expand Down
2 changes: 1 addition & 1 deletion app/helpers/notifier_helper.rb
Expand Up @@ -63,7 +63,7 @@ def determine_ssr(last_change, action_name)
if last_change.action == 'destroy'
# This condition signifies a deleted SSR
if SubServiceRequest.where(id: ssr_id).empty? && action_name == 'notify_user'
deleted_ssrs = @service_request.deleted_ssrs_since_previous_submission
deleted_ssrs = @service_request.deleted_ssrs_since_previous_submission(true)
ssr = deleted_ssrs.select{ |ssr| ssr.auditable_id == ssr_id }.first
else
ssr = SubServiceRequest.find(ssr_id)
Expand Down
44 changes: 16 additions & 28 deletions app/models/service_request.rb
Expand Up @@ -310,12 +310,19 @@ def service_list(is_one_time_fee=nil, service_provider=nil, admin_ssr=nil)
groupings
end

def deleted_ssrs_since_previous_submission
AuditRecovery.where("audited_changes LIKE '%service_request_id: #{id}%' AND auditable_type = 'SubServiceRequest' AND action = 'destroy' AND created_at BETWEEN '#{previous_submitted_at.utc}' AND '#{Time.now.utc}'")
def deleted_ssrs_since_previous_submission(start_time_at_previous_sub_time=false)
### start_time varies depending on if the submitted_at has been updated or not
if start_time_at_previous_sub_time
start_time = previous_submitted_at.nil? ? Time.now.utc : previous_submitted_at.utc
else
start_time = submitted_at.nil? ? Time.now.utc : submitted_at.utc
end
AuditRecovery.where("audited_changes LIKE '%service_request_id: #{id}%' AND auditable_type = 'SubServiceRequest' AND action = 'destroy' AND created_at BETWEEN '#{start_time}' AND '#{Time.now.utc}'")
end

def created_ssrs_since_previous_submission
AuditRecovery.where("audited_changes LIKE '%service_request_id: #{id}%' AND auditable_type = 'SubServiceRequest' AND action = 'create' AND created_at BETWEEN '#{previous_submitted_at.utc}' AND '#{Time.now.utc}'")
start_time = submitted_at.nil? ? Time.now.utc : submitted_at.utc
AuditRecovery.where("audited_changes LIKE '%service_request_id: #{id}%' AND auditable_type = 'SubServiceRequest' AND action = 'create' AND created_at BETWEEN '#{start_time}' AND '#{Time.now.utc}'")
end

def previously_submitted_ssrs
Expand Down Expand Up @@ -424,34 +431,15 @@ def additional_detail_services
services.joins(:questionnaires).where(questionnaires: { active: true })
end

# Change the status of the service request and all the sub service
# requests to the given status.
def update_status(new_status, use_validation=true, submit=false)
# Returns the SSR ids that need an initial submission email, updates the SR status,
# and updates the SSR status to new status if appropriate
def update_status(new_status)
to_notify = []
self.assign_attributes(status: new_status)

update_attribute(:status, new_status)
sub_service_requests.each do |ssr|
next unless ssr.can_be_edited?
available = AVAILABLE_STATUSES.keys
editable = EDITABLE_STATUSES[ssr.organization_id] || available
changeable = available & editable

if changeable.include?(new_status)
if (ssr.status != new_status) && (UPDATABLE_STATUSES.include?(ssr.status) || !submit)
ssr.update_attribute(:status, new_status)
# Do not notify (initial submit email) if ssr has been previously submitted
if new_status == 'submitted'
to_notify << ssr.id unless ssr.previously_submitted?
else
to_notify << ssr.id
end
end
end
to_notify << ssr.update_status_and_notify(new_status)
end

self.save(validate: use_validation)

to_notify
to_notify.flatten
end

# Make sure that all the sub service requests have an ssr id
Expand Down
65 changes: 59 additions & 6 deletions app/models/sub_service_request.rb
Expand Up @@ -282,20 +282,35 @@ def ready_for_fulfillment?
########################
## SSR STATUS METHODS ##
########################
def update_status(new_status, submit=false)

# Returns the SSR id that need an initial submission email and updates
# the SSR status to new status if appropriate
def update_status_and_notify(new_status)
to_notify = []
if can_be_edited?
available = AVAILABLE_STATUSES.keys
editable = EDITABLE_STATUSES[organization_id] || available
changeable = available & editable
if changeable.include?(new_status)
if (status != new_status) && (UPDATABLE_STATUSES.include?(status) || !submit)
update_attribute(:status, new_status)
# See Pivotal Stories: #133049647 & #135639799
if (status != new_status) && ((new_status == 'submitted' && UPDATABLE_STATUSES.include?(status)) || new_status != 'submitted')
### For 'submitted' status ONLY:
# Since adding/removing services changes a SSR status to 'draft', we have to look at the past status to see if we should notify users of a status change
# We do NOT notify if updating from an un-updatable status or we're updating to a status that we already were previously
if new_status == 'submitted'
to_notify << id unless previously_submitted?
past_status = PastStatus.where(sub_service_request_id: id).last
past_status = past_status.nil? ? nil : past_status.status

if status == 'draft' && ((UPDATABLE_STATUSES.include?(past_status) && past_status != new_status) || past_status == nil) # past_status == nil indicates a newly created SSR
to_notify << id
elsif status != 'draft'
to_notify << id
end
else
to_notify << id
to_notify << id
end

new_status == 'submitted' ? update_attributes(status: new_status, submitted_at: Time.now, nursing_nutrition_approved: false, lab_approved: false, imaging_approved: false, committee_approved: false) : update_attribute(:status, new_status)
end
end
end
Expand Down Expand Up @@ -455,7 +470,45 @@ def distribute_surveys
end
end

### audit reporting methods ###
###############################
### AUDIT REPORTING METHODS ###
###############################

# Collects all the added/deleted line_items that need to be displayed in the audit report for emails
def audit_line_items(identity)
filtered_audit_trail = {:line_items => []}

ssr_submitted_at_audit = AuditRecovery.where("audited_changes LIKE '%submitted_at%' AND auditable_id = #{id} AND auditable_type = 'SubServiceRequest' AND action IN ('update') AND user_id = #{identity.id}").order(created_at: :desc).first

### start_date = last time SSR was submitted
start_date = !ssr_submitted_at_audit.nil? ? ssr_submitted_at_audit.audited_changes['submitted_at'].first : Time.now.utc
end_date = Time.now.utc

deleted_line_item_audits = AuditRecovery.where("audited_changes LIKE '%sub_service_request_id: #{id}%' AND auditable_type = 'LineItem' AND user_id = #{identity.id} AND action IN ('destroy') AND created_at BETWEEN '#{start_date}' AND '#{end_date}'")

added_line_item_audits = AuditRecovery.where("audited_changes LIKE '%service_request_id: #{service_request.id}%' AND auditable_type = 'LineItem' AND user_id = #{identity.id} AND action IN ('create') AND created_at BETWEEN '#{start_date}' AND '#{end_date}'")

### Takes all the added LIs and filters them down to the ones specific to this SSR ###
added_li_ids = !added_line_item_audits.empty? ? added_line_item_audits.map(&:auditable_id) : []
li_ids_added_to_this_ssr = !line_items.empty? ? line_items.map(&:id) : []
added_lis = added_li_ids & li_ids_added_to_this_ssr

if !added_lis.empty?
added_lis.each do |li_id|
filtered_audit_trail[:line_items] << added_line_item_audits.where(auditable_id: li_id).first
end
end

if !deleted_line_item_audits.empty?
deleted_line_item_audits.each do |deleted_li|
filtered_audit_trail[:line_items] << deleted_li
end
end

filtered_audit_trail[:sub_service_request_id] = self.id
filtered_audit_trail
end


def audit_label audit
"Service Request #{display_id}"
Expand Down