1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Ticket::TimeAccounting < ApplicationModel
- validates :time_unit, presence: true
- belongs_to :type, class_name: 'Ticket::TimeAccounting::Type', optional: true
- belongs_to :ticket
- belongs_to :ticket_article, class_name: 'Ticket::Article', inverse_of: :ticket_time_accounting, optional: true
- after_destroy :update_time_units
- after_save :update_time_units
- # This is a model-only constraint.
- # When this was introduced, there was no check for uniqueness of ticket_article_id for a long time.
- # It would be very difficult to safely migrate existing systems.
- # If somebody has added time accounting entry for the same article twice, we can't neither remove it nor move elsewhere it safely.
- # This may throw a rubocop warning locally. But it does nothing in CI because db/schema.rb doesn't exist and cop is skipped.
- validates :ticket_article_id, uniqueness: { allow_nil: true } # rubocop:disable Rails/UniqueValidationWithoutIndex, Lint/RedundantCopDisableDirective
- validate :verify_ticket_article, on: :create
- def self.update_ticket(ticket)
- time_units = total(ticket)
- return if ticket.time_unit.to_d == time_units
- ticket.time_unit = time_units
- ticket.save!
- end
- def self.total(ticket)
- ticket.ticket_time_accounting.sum(:time_unit)
- end
- private_class_method :total
- private
- def update_time_units
- self.class.update_ticket(ticket)
- end
- def verify_ticket_article
- return if ticket_article.blank?
- return if ticket_article.ticket_id == ticket_id
- errors.add :ticket_article, __('This article is not part of the ticket.')
- end
- end
|