Files
redmine/plugins/redmine_contacts/app/helpers/deals_helper.rb
T
2026-04-24 22:01:18 +00:00

186 lines
7.0 KiB
Ruby

# encoding: utf-8
#
# 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/>.
module DealsHelper
include ContactsHelper
def collection_for_status_select
deal_statuses.collect{|s| [s.name, s.id.to_s]}
end
def deal_status_options_for_select(select="")
options_for_select(collection_for_status_select, select)
end
def deal_statuses
(!@project.blank? ? @project.deal_statuses : DealStatus.order("#{DealStatus.table_name}.status_type, #{DealStatus.table_name}.position")) || []
end
def deal_status_url(status_id, options={})
{:controller => 'deals',
:action => 'index',
:set_filter => 1,
:project_id => @project,
:fields => [:status_id],
:values => {:status_id => [status_id]},
:operators => {:status_id => '='}}.merge(options)
end
def pipeline_status_tag(deal_status, count, index)
total = @processor.scope.count
width ||= 20 if deal_status.is_won?
width ||= 40 if deal_status.is_lost?
width ||= (100 - 20) * (count.to_f / total.to_f) + 20
width_style = index == 0 ? "" : "width: #{width}%"
status_tag = content_tag(:span, deal_status.name)
content_tag(:span, status_tag, :class => "tag-label-color", :style => "background-color:#{deal_status.color_name};color:white; #{width_style}")
end
def remove_contractor_link(contact)
link_to(image_tag('delete.png'),
{:controller => "deal_contacts", :action => 'delete', :project_id => @project, :deal_id => @deal, :contact_id => contact},
:remote => true,
:method => :delete,
:data => {:confirm => l(:text_are_you_sure)},
:class => "delete", :title => l(:button_delete)) if User.current.allowed_to?(:edit_deals, @project)
end
def link_to_deal(deal)
link_to deal.name, deal_path(deal)
end
def deal_list_styles_for_select
[[l(:label_crm_list_excerpt), "list_excerpt"],
[l(:label_crm_list_list), "list"],
[l(:label_crm_list_board), "list_board"],
[l(:label_calendar), "crm_calendars/crm_calendar"],
[l(:label_crm_pipeline), "list_pipeline"]]
end
def deals_list_style
list_styles = deal_list_styles_for_select.map(&:last)
if params[:deals_list_style].blank?
list_style = list_styles.include?(session[:deals_list_style]) ? session[:deals_list_style] : RedmineContacts.default_list_style.gsub("list_cards", "list_board")
else
list_style = list_styles.include?(params[:deals_list_style]) ? params[:deals_list_style] : RedmineContacts.default_list_style.gsub("list_cards", "list_board")
end
session[:deals_list_style] = list_style
end
def retrieve_deals_query
if params[:status_id] || !params[:period].blank? || !params[:category_id].blank? || !params[:assigned_to_id].blank?
session[:deals_query] = {:project_id => (@project ? @project.id : nil),
:status_id => params[:status_id],
:category_id => params[:category_id],
:period => params[:period],
:assigned_to_id => params[:assigned_to_id]}
else
if api_request? || params[:set_filter] || session[:deals_query].nil? || session[:deals_query][:project_id] != (@project ? @project.id : nil)
session[:deals_query] = {}
else
params.merge!(session[:deals_query])
end
end
end
def pipeline_prices(scope)
prices_collection_by_currency(scope.group_by(&:currency).map{|k,v| [k, v.inject(0) { |sum, x| sum + x.price.to_f } ] }).join(' / ').html_safe
end
def deals_to_csv(deals)
return "" unless User.current.allowed_to?(:export_contacts, @project, :global => true)
decimal_separator = l(:general_csv_decimal_separator)
encoding = 'utf-8'
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
# csv header fields
headers = [ "#",
l(:field_name, :locale => :en),
l(:field_background, :locale => :en),
l(:field_currency, :locale => :en),
l(:field_price, :locale => :en),
l(:label_crm_probability, :locale => :en),
l(:label_crm_expected_revenue, :locale => :en),
l(:field_due_date, :locale => :en),
l(:field_author, :locale => :en),
l(:field_assigned_to, :locale => :en),
l(:field_status, :locale => :en),
l(:field_contact, :locale => :en),
l(:field_category, :locale => :en),
l(:field_created_on, :locale => :en),
l(:field_updated_on, :locale => :en)
]
custom_fields = DealCustomField.order(:name)
custom_fields.each {|f| headers << f.name}
csv << headers.collect {|c| Redmine::CodesetUtil.from_utf8(c.to_s, encoding) }
# csv lines
deals.each do |deal|
fields = [deal.id,
deal.name,
deal.background,
deal.currency,
deal.price,
deal.probability,
deal.expected_revenue,
format_date(deal.due_date),
deal.author,
deal.assigned_to,
deal.status,
deal.contact,
deal.category,
format_date(deal.created_on),
format_date(deal.updated_on)
]
deal.custom_field_values.sort_by{|v| v.custom_field.name}.each {|custom_value| fields << RedmineContacts::CSVUtils.csv_custom_value(custom_value) }
csv << fields.collect {|c| Redmine::CodesetUtil.from_utf8(c.to_s, encoding) }
end
end
export
end
def importer_link
project_deal_imports_path
end
def importer_show_link(importer, project)
project_deal_import_path(:id => importer, :project_id => project)
end
def importer_settings_link(importer, project)
settings_project_deal_import_path(:id => importer, :project => project)
end
def importer_run_link(importer, project)
run_project_deal_import_path(:id => importer, :project_id => project, :format => 'js')
end
def importer_link_to_object(deal)
link_to deal.name, deal_path(deal)
end
def _project_deals_path(project, *args)
if project
project_deals_path(project, *args)
else
deals_path(*args)
end
end
end