Files
eminuxCRM/app/controllers/organizations_controller.rb
T
eminuxandCursor c4e5f289cf
CI / scan_ruby (push) Failing after 11m20s
CI / scan_js (push) Successful in 10m35s
CI / lint (push) Has been cancelled
Commit iniziale di eminuxCRM: CRM Rails con pipeline, campagne email e Docker.
Include autenticazione, progetti isolati, mail marketing HTML con SMTP, test A/B e editor WYSIWYG.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-17 23:01:48 +02:00

145 lines
5.3 KiB
Ruby

class OrganizationsController < ApplicationController
before_action :require_current_project!
before_action :set_organization, only: %i[show edit update destroy]
before_action :load_form_collections, only: %i[new create edit update]
def index
@page_title = "Organizzazioni"
scope = organizations_for_current_project.includes(:assigned_user, :contacts, :opportunities, :tasks, :projects)
scope = scope.search(params[:q]) if params[:q].present?
scope = apply_filters(scope)
scope = apply_sort(scope)
@pagy, @organizations = pagy(scope, items: 50)
respond_to do |format|
format.html
format.csv { send_data CsvExport.organizations(scope), filename: "organizations-#{Date.current}.csv" }
end
end
def show
authorize_organization!(@organization)
@page_title = @organization.name
@contacts = @organization.contacts.primary_first
@opportunities = @organization.opportunities.for_project(current_project).includes(:assigned_user, :project).order(updated_at: :desc)
@pending_tasks = @organization.tasks.pending.ordered
@completed_tasks = @organization.tasks.completed.order(completed_at: :desc).limit(10)
@activities = @organization.activities.includes(:user, :contact, :opportunity).recent_first
@next_task = @organization.next_pending_task
@activity = @organization.activities.build(happened_at: Time.current, user: current_user)
@users = User.active.order(:first_name)
end
def new
@page_title = "Nuova organizzazione"
@organization = Organization.new(assigned_user: current_user, country: "Italia", status: "prospect")
@organization.project_ids = [current_project.id] if current_project
end
def create
@organization = Organization.new(organization_params)
if @organization.save
redirect_to @organization, notice: "Organizzazione creata."
else
render :new, status: :unprocessable_entity
end
end
def edit
authorize_organization!(@organization)
@page_title = "Modifica #{@organization.name}"
end
def update
authorize_organization!(@organization)
if @organization.update(organization_params)
redirect_to @organization, notice: "Organizzazione aggiornata."
else
render :edit, status: :unprocessable_entity
end
end
def destroy
authorize_organization!(@organization)
@organization.destroy!
redirect_to organizations_path, notice: "Organizzazione eliminata."
end
private
def set_organization
@organization = Organization.find(params[:id])
end
def authorize_organization!(org)
return if current_user.admin?
return if org.projects.merge(available_projects).exists?
redirect_to organizations_path, alert: "Organizzazione non disponibile per i tuoi progetti." and return
end
def load_form_collections
@users = User.active.order(:first_name)
@projects = available_projects
end
def organization_params
params.require(:organization).permit(
:name, :legal_name, :organization_type, :sport, :country, :region, :province, :city,
:address, :website, :source_url, :phone, :email, :vat_number, :notes, :status, :lead_source,
:assigned_user_id, :list_position, :team_gender, :streaming_status, :commercial_fit, :verified_at,
project_ids: []
)
end
def apply_filters(scope)
scope = scope.where(status: params[:status]) if params[:status].present?
scope = scope.where(lead_source: params[:lead_source]) if params[:lead_source].present?
scope = scope.where(organization_type: params[:organization_type]) if params[:organization_type].present?
scope = scope.where(sport: params[:sport]) if params[:sport].present?
scope = scope.where(country: params[:country]) if params[:country].present?
scope = scope.where(region: params[:region]) if params[:region].present?
scope = scope.where(assigned_user_id: params[:owner]) if params[:owner].present?
scope = scope.where(team_gender: params[:team_gender]) if params[:team_gender].present?
scope = scope.where(streaming_status: params[:streaming_status]) if params[:streaming_status].present?
if params[:customer] == "yes"
scope = scope.customers
elsif params[:customer] == "no"
scope = scope.where.not(status: %w[active_customer inactive_customer])
end
if params[:pipeline_stage].present?
scope = scope.joins(:opportunities).where(opportunities: { pipeline_stage: params[:pipeline_stage], project_id: current_project.id }).distinct
end
if params[:ab_variant].present?
scope = scope.joins(:opportunities).where(opportunities: { ab_variant: params[:ab_variant], project_id: current_project.id }).distinct
end
if params[:overdue_tasks] == "1"
scope = scope.joins(:tasks).merge(Task.overdue).distinct
end
scope
end
def apply_sort(scope)
case params[:sort]
when "name"
scope.order(:name)
when "updated"
scope.order(updated_at: :desc)
when "created"
scope.order(created_at: :desc)
when "lista"
scope.order(Arel.sql("organizations.list_position ASC NULLS LAST, organizations.name ASC"))
else
if current_project&.code == "matchlivetv"
scope.order(Arel.sql("organizations.list_position ASC NULLS LAST, organizations.name ASC"))
else
scope.order(updated_at: :desc)
end
end
end
end