Initial Redmine tooling and local plugin forks

This commit is contained in:
Jason Thistlethwaite
2026-04-24 22:01:18 +00:00
commit 9f682af0eb
683 changed files with 56878 additions and 0 deletions
@@ -0,0 +1,116 @@
# This file is a part of Redmine CRM (redmine_contacts) plugin,
# customer relationship management plugin for Redmine
#
# Copyright (C) 2010-2018 RedmineUP
# http://www.redmineup.com/
#
# redmine_contacts is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# redmine_contacts is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with redmine_contacts. If not, see <http://www.gnu.org/licenses/>.
class DealStatus < ActiveRecord::Base
unloadable
include Redmine::SafeAttributes
OPEN_STATUS = 0
WON_STATUS = 1
LOST_STATUS = 2
before_destroy :check_integrity
attr_protected :id if ActiveRecord::VERSION::MAJOR <= 4
safe_attributes 'name', 'is_default', 'status_type', 'move_to', 'color_name', 'position'
has_and_belongs_to_many :projects
has_many :deals, :foreign_key => 'status_id', :dependent => :nullify
has_many :deal_processes_from, :class_name => 'DealProcess',:foreign_key => 'old_value', :dependent => :delete_all
has_many :deal_processes_to, :class_name => 'DealProcess', :foreign_key => 'value', :dependent => :delete_all
rcrm_acts_as_list :scope => 'status_type = #{status_type}'
scope :open, lambda { where(:status_type => DealStatus::OPEN_STATUS) }
scope :won, lambda { where(:status_type => DealStatus::WON_STATUS) }
scope :lost, lambda { where(:status_type => DealStatus::LOST_STATUS) }
scope :closed, lambda { where("#{DealStatus.table_name}.status_type <> #{DealStatus::OPEN_STATUS}") }
after_save :update_default
validates_presence_of :name
validates_uniqueness_of :name
validates_length_of :name, :maximum => 30
def update_default
DealStatus.where('id <> ?', id).update_all(:is_default => false) if is_default?
end
# Returns the default status for new Deals
def self.default
where(:is_default => true).first
end
def is_open?
status_type == OPEN_STATUS
end
def is_won?
status_type == WON_STATUS
end
def is_lost?
status_type == LOST_STATUS
end
def is_closed?
!is_open?
end
def status_type_name
case status_type
when OPEN_STATUS then l(:label_open_issues)
when WON_STATUS then l(:label_crm_deal_status_won)
when LOST_STATUS then l(:label_crm_deal_status_lost)
else ''
end
end
def new_status_allowed_to?(status, roles, tracker)
if status && roles && tracker
!workflows.where(:new_status_id => status.id).where(:role_id => roles.collect(&:id)).where(:tracker_id => tracker.id).first.nil?
else
false
end
end
def color_name
return '#' + "%06x" % color unless color.nil?
end
def color_name=(clr)
self.color = clr.from(1).hex
end
def <=>(status)
position <=> status.position
end
def to_s; name end
private
def check_integrity
raise "Can't delete status" if Deal.where(:status_id => id).any?
end
# Deletes associated workflows
def delete_workflows
Workflow.delete_all(['old_status_id = :id OR new_status_id = :id', { :id => id }])
end
end