bsc_plugin_myprofile_controller.rb 7.86 KB
class BscPluginMyprofileController < MyProfileController

  include BscPlugin::BscHelper

  def manage_associated_enterprises
    @associated_enterprises = profile.enterprises
    @pending_enterprises = profile.enterprise_requests.pending.map(&:enterprise)
  end

  def search_enterprise
    render :text => environment.enterprises.find(:all, :conditions => ["type <> 'BscPlugin::Bsc' AND (LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?) AND (identifier NOT LIKE ?)", "%#{params[:q]}%", "%#{params[:q]}%", "%_template"]).
      select { |enterprise| enterprise.bsc.nil? && !profile.already_requested?(enterprise)}.
      map {|enterprise| {:id => enterprise.id, :name => enterprise.name} }.
      to_json
  end

  def save_associations
      enterprises = [Enterprise.find(params[:q].split(','))].flatten
      to_remove = profile.enterprises - enterprises
      to_add = enterprises - profile.enterprises

      to_remove.each do |enterprise|
        enterprise.bsc = nil
        enterprise.save!
        profile.enterprises.delete(enterprise)
      end

      to_add.each do |enterprise|
        if enterprise.enabled
          BscPlugin::AssociateEnterprise.create!(:requestor => user, :target => enterprise, :bsc => profile)
        else
          enterprise.bsc = profile
          enterprise.save!
          profile.enterprises << enterprise
        end
      end

      session[:notice] = _('This Bsc associations were saved successfully.')
    begin
      redirect_to :controller => 'profile_editor'
    rescue Exception => ex
      session[:notice] = _('This Bsc associations couldn\'t be saved.')
      logger.info ex
      redirect_to :action => 'manage_associated_enterprises'
    end
  end

  def similar_enterprises
    name = params[:name]
    city = params[:city]

    result = []
    if !name.blank?
      enterprises = (profile.environment.enterprises - profile.enterprises).select { |enterprise| enterprise.bsc_id.nil? && enterprise.city == city && enterprise.name.downcase.include?(name.downcase)}
      result = enterprises.inject(result) {|result, enterprise| result << [enterprise.id, enterprise.name]}
    end
    render :text => result.to_json
  end

  def transfer_ownership
    role = Profile::Roles.admin(profile.environment.id)
    @roles = [role]
    if request.post?
      person = Person.find(params['q_'+role.key])

      profile.admins.map { |admin| profile.remove_admin(admin) }
      profile.add_admin(person)

      BscPlugin::Mailer.deliver_admin_notification(person, profile)

      session[:notice] = _('Enterprise ownership transferred.')
      redirect_to :controller => 'profile_editor'
    end
  end

  def create_enterprise
    @create_enterprise = CreateEnterprise.new(params[:create_enterprise])
    @create_enterprise.requestor = user
    @create_enterprise.target = environment
    @create_enterprise.bsc_id = profile.id
    @create_enterprise.enabled = true
    @create_enterprise.validated = false
    if request.post? && @create_enterprise.valid?
      @create_enterprise.perform
      session[:notice] = _('Enterprise was created in association with %s.') % profile.name
      redirect_to :controller => 'profile_editor', :profile => @create_enterprise.identifier
    end
  end

  def manage_contracts
    self.class.no_design_blocks
    @sorting = params[:sorting] || 'created_at asc'
    sorted_by = @sorting.split(' ').first
    sort_direction = @sorting.split(' ').last
    @status = params[:status] || BscPlugin::Contract::Status.types.map { |s| s.to_s }
    @contracts =  profile.contracts.
      status(@status).
      sorted_by(sorted_by, sort_direction).
      paginate(:per_page => contracts_per_page, :page => params[:page])
  end

  def new_contract
    if !request.post?
      @contract = BscPlugin::Contract.new
    else
      @contract = BscPlugin::Contract.new(params[:contract])
      @contract.bsc = profile
      sales = params[:sales] ? params[:sales].map {|key, value| value} : []
      sales.reject! {|sale| sale[:product_id].blank?}

      if @contract.save!
        enterprises_ids = params[:enterprises] || ''
        enterprises_ids.split(',').each { |id| @contract.enterprises << Enterprise.find(id) }
        @failed_sales = @contract.save_sales(sales)

        if @failed_sales.blank?
          session[:notice] = _('Contract created.')
          redirect_to :action => 'manage_contracts'
        else
          session[:notice] = _('Contract created but some products could not be added.')
          redirect_to :action => 'edit_contract', :contract_id => @contract.id
        end
      end
    end
  end

  def view_contract
    begin
      @contract = BscPlugin::Contract.find(params[:contract_id])
    rescue
      session[:notice] = _('Contract doesn\'t exists! Maybe it was already removed.')
      redirect_to :action => 'manage_contracts'
    end
  end

  def edit_contract
    begin
      @contract = BscPlugin::Contract.find(params[:contract_id])
    rescue
      session[:notice] = _('Could not edit such contract.')
      redirect_to :action => 'manage_contracts'
    end
    if request.post? && @contract.update_attributes(params[:contract])

      # updating associated enterprises
      enterprises_ids = params[:enterprises] || ''
      enterprises = [Enterprise.find(enterprises_ids.split(','))].flatten
      to_remove = @contract.enterprises - enterprises
      to_add = enterprises - @contract.enterprises
      to_remove.each { |enterprise| @contract.enterprises.delete(enterprise)}
      to_add.each { |enterprise| @contract.enterprises << enterprise }

      # updating sales
      sales = params[:sales] ? params[:sales].map {|key, value| value} : []
      sales.reject! {|sale| sale[:product_id].blank?}
      products = [Product.find(sales.map { |sale| sale[:product_id] })].flatten
      to_remove = @contract.products - products
      to_keep = sales.select { |sale| @contract.products.include?(Product.find(sale[:product_id])) }

      to_keep.each do |sale_attrs|
        sale = @contract.sales.find_by_product_id(sale_attrs[:product_id])
        sale.update_attributes!(sale_attrs)
        sales.delete(sale_attrs)
      end

      to_remove.each { |product| @contract.sales.find_by_product_id(product.id).destroy }
      @failed_sales = @contract.save_sales(sales)

      if @failed_sales.blank?
        session[:notice] = _('Contract edited.')
        redirect_to :action => 'manage_contracts'
      else
        session[:notice] = _('Contract edited but some products could not be added.')
        redirect_to :action => 'edit_contract', :contract_id => @contract.id
      end
    end
  end

  def destroy_contract
    begin
      contract = BscPlugin::Contract.find(params[:contract_id])
      contract.destroy
      session[:notice] = _('Contract removed.')
    rescue
      session[:notice] = _('Contract could not be removed. Sorry! ^^')
    end
    redirect_to :action => 'manage_contracts'
  end

  def search_contract_enterprises
    render :text => profile.enterprises.find(:all, :conditions => ["(LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?)", "%#{params[:enterprises]}%", "%#{params[:enterprises]}%"]).
      map {|enterprise| {:id => enterprise.id, :name => enterprise.short_name(60)} }.
      to_json
  end

  def search_sale_product
    query = params[:sales].map {|key, value| value}[0][:product_id]
    enterprises = (params[:enterprises] || []).split(',')
    enterprises = enterprises.blank? ? -1 : enterprises
    added_products = (params[:added_products] || []).split(',')
    added_products = added_products.blank? ? -1 : added_products
    render :text => Product.find(:all, :conditions => ["LOWER(name) LIKE ? AND profile_id IN (?) AND id NOT IN (?)", "%#{query}%", enterprises, added_products]).
      map {|product| { :id => product.id,
                       :name => short_text(product_display_name(product), 60),
                       :sale_id => params[:sale_id],
                       :product_price => product.price || 0 }}.
      to_json
  end

  private

  def contracts_per_page
    15
  end
end