123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class FormUpdater::Updater::Ticket::Edit < FormUpdater::Updater
- include FormUpdater::Concerns::AppliesTaskbarState
- include FormUpdater::Concerns::AppliesTicketSharedDraft
- include FormUpdater::Concerns::ChecksCoreWorkflow
- include FormUpdater::Concerns::HasSecurityOptions
- include FormUpdater::Concerns::StoresTaskbarState
- include FormUpdater::Updater::Ticket::Concerns::HasOwnerId
- core_workflow_screen 'edit'
- apply_shared_draft_group_keys %i[article ticket]
- apply_state_group_keys %w[ticket article]
- store_state_collect_group_key 'ticket'
- store_state_group_keys ['article']
- def resolve
- set_default_follow_up_state if !meta[:initial]
- super
- end
- def object_type
- ::Ticket
- end
- def handle_updater_flags
- flags[:newArticlePresent] = result['articleType'].present? || (!meta.dig(:additional_data, 'applyTaskbarState') && data.dig('article', 'articleType').present?)
- flags[:hasSharedDraft] = check_shared_draft
- end
- def after_store_taskbar_preperation(state)
- # Remove owner_id when it's the system user and this is also the current ticket value.
- if object && state['ticket']&.key?('owner_id') && state.dig('ticket', 'owner_id').nil? && object.owner_id == 1
- state['ticket'].delete('owner_id')
- end
- return if state.dig('article', 'articleType').nil?
- state['article']['type'] = state['article'].delete('articleType')
- end
- private
- def article_body_empty?
- !data.dig('article', 'body') || data['article']['body'].empty?
- end
- def state_changed?
- data['state_id'] != object.state.id
- end
- def customer?
- return false if current_user.permissions?('ticket.agent') && current_user.groups.access(:read).include?(object.group)
- return true if current_user.permissions?('ticket.customer')
- false
- end
- def set_resultant_field_values
- # Prevent multiple changes to the default follow-up state.
- result['isDefaultFollowUpStateSet'][:value] = true
- result['state_id'][:value] = ::Ticket::State.find_by(default_follow_up: true)&.id
- end
- # Hanlding for customer to change the closed state to open, when a new article will be started.
- # Additional handling of reseting state when body will be removed again.
- def set_default_follow_up_state
- result_initialize_field('state_id')
- result_initialize_field('isDefaultFollowUpStateSet')
- # Set default state if body is present.
- return if article_body_empty?
- # And the state was not changed.
- return if state_changed?
- # And we are in the customer context.
- return if !customer?
- # And the default state was not set before.
- return if data['isDefaultFollowUpStateSet']
- # And only if the ticket is not in the default create state (e.g. "new").
- return if object.state.default_create
- set_resultant_field_values
- end
- def check_shared_draft
- current_group_id = data['group_id']
- return false if current_group_id.nil?
- current_group = ::Group.find_by(id: current_group_id)
- return false if current_group.nil? || !current_group.shared_drafts
- current_user.group_access?(current_group, 'change')
- end
- end
|