checks_core_workflow.rb 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. module ChecksCoreWorkflow
  3. extend ActiveSupport::Concern
  4. included do
  5. before_create :validate_workflows
  6. before_update :validate_workflows
  7. attr_accessor :screen
  8. end
  9. private
  10. class_methods do
  11. def core_workflow_screens(*screens)
  12. @core_workflow_screens ||= screens
  13. end
  14. end
  15. def validate_workflows
  16. return if !screen
  17. return if !UserInfo.current_user_id
  18. perform_result = CoreWorkflow.perform(payload: {
  19. 'event' => 'core_workflow',
  20. 'request_id' => 'ChecksCoreWorkflow.validate_workflows',
  21. 'class_name' => self.class.to_s,
  22. 'screen' => screen,
  23. 'params' => attributes
  24. }, user: User.find(UserInfo.current_user_id), assets: false)
  25. check_restrict_values(perform_result)
  26. check_mandatory(perform_result)
  27. end
  28. def check_restrict_values(perform_result)
  29. changes.each_key do |key|
  30. next if perform_result[:restrict_values][key].blank?
  31. next if self[key].blank?
  32. next if restricted_value?(perform_result, key)
  33. raise Exceptions::ApplicationModel.new(self, "Invalid value '#{self[key]}' for field '#{key}'!")
  34. end
  35. end
  36. def restricted_value?(perform_result, key)
  37. if self[key].is_a?(Array)
  38. (self[key].map(&:to_s) - perform_result[:restrict_values][key].map(&:to_s)).blank?
  39. else
  40. perform_result[:restrict_values][key].any? { |value| value.to_s == self[key].to_s }
  41. end
  42. end
  43. def check_mandatory(perform_result)
  44. perform_result[:mandatory].each_key do |key|
  45. next if field_visible?(perform_result, key)
  46. next if !field_mandatory?(perform_result, key)
  47. next if !column_empty?(key)
  48. next if !colum_default?(key)
  49. raise Exceptions::ApplicationModel.new(self, "Missing required value for field '#{key}'!")
  50. end
  51. end
  52. def field_visible?(perform_result, key)
  53. %w[hide remove].include?(perform_result[:visibility][key])
  54. end
  55. def field_mandatory?(perform_result, key)
  56. perform_result[:mandatory][key]
  57. end
  58. def column_empty?(key)
  59. self[key].nil? || ([true, false].exclude?(self[key]) && self[key].blank?)
  60. end
  61. def colum_default?(key)
  62. self.class.column_defaults[key].nil?
  63. end
  64. end