ciudadanointeligente/partidopublico

View on GitHub
app/controllers/partidos_controller.rb

Summary

Maintainability
F
3 days
Test Coverage
class PartidosController < ApplicationController
  before_action :authenticate_admin!, only: [:new, :edit, :create, :update, :destroy, :admin]
  before_filter :authenticate_superadmin, only: [:new, :edit, :create, :update, :destroy]
  before_action :set_partido, except: [:index, :new, :create, :admin]
  before_action :get_partidos, except: [:index, :new, :create, :admin]
  before_action :set_menu
  layout "frontend", only: [:normas_internas, :regiones, :sedes_partido, :autoridades,
                            :vinculos_intereses, :pactos, :sanciones,
                            :finanzas_1, :finanzas_2, :finanzas_5,
                            :afiliacion_desafiliacion, :eleccion_popular, :organos_internos, :elecciones_internas,
                            :representantes, :acuerdos_organos, :estructura_organica, :actividades_publicas,
                            :intereses_patrimonios, :publicacion_candidatos, :resultado_elecciones_internas
                          ]


  # GET /partidos
  # GET /partidos.json
  def index
    @partidos = Partido.all
  end

  def admin
    # if admin_signed_in?
    @partidos = current_admin.partidos
    if current_admin.is_superadmin?
      @login_data = []

      Admin.order(last_sign_in_at: :desc).each do |admin|
        admin_logins = AdminLogin.where admin: admin
        logins = []
        admin_logins.order(fecha: :desc).limit(3).each do |login|
          logins << {fecha: login.fecha, ip: login.ip}
        end
        last_actions = PaperTrail::Version.where(:whodunnit => admin.email).last(3)
        @login_data << {email: admin.email, is_superadmin: admin.is_superadmin, login_count: admin_logins.count, logins: logins, last_actions: last_actions}
      end

      ###puts @login_data
    end

    # else
    #   redirect_to new_admin_session_path
    # end
  end

  # GET /partidos/1
  # GET /partidos/1.json
  def show

    @datos_region = []
    @datos_sedes = []
    @datos_cargos = []
    region = {}

    @partido.regions.each do |r|
      afiliados = Afiliacion.where(partido_id: @partido, region_id: r)

      h = 0
      m = 0
      ph = 0
      pm = 0
      afiliados.each do |a|
        h = h + a.hombres
        m = m + a.mujeres
        total = h+m
        ph = (h*100)/total
        pm = (m*100)/total
      end
      region = { 'region' => r.nombre, 'ordinal' => r.ordinal, 'hombres' => h, 'porcentaje_hombres' => ph, 'mujeres' => m, 'porcentaje_mujeres' => pm }
      @datos_region.push region

      sedes = @partido.sedes.where(region_id: r)
      all_sedes = []
      sedes.each do |s|
        all_sedes.push( { 'direccion' => s.direccion, 'contacto' => s.contacto, 'comuna' => s.comuna.nombre } )
      end
      @datos_sedes.push( {'region' => r.nombre, 'sedes' => all_sedes} )

      cargos = @partido.cargos.where(region_id: r)
      all_cargos = []
      cargos.each do |c|
        all_cargos.push( { 'persona' => c.persona.nombre, 'cargo' => c.tipo_cargo.titulo, 'comuna' => c.comuna.nombre } )
      end
      @datos_cargos.push( {'region' => r.nombre, 'cargos' => all_cargos} )
    end


  end

  # GET /partidos/new
  def new
    @partido = Partido.new
  end

  # GET /partidos/1/edit
  def edit
    @partido = Partido.find_by id: params[:id]
    # unless @partido.user == current_user
    #   flash[:notice] = "Not allowed to update partido " + @partido.nombre
    #   redirect_to root_path
    # end
  end

  # POST /partidos
  # POST /partidos.json
  def create
    PaperTrail.whodunnit = current_admin.email
    @partido = Partido.new(partido_params)
    # @partido.user = current_user

    respond_to do |format|
      if @partido.save
        # format.html { redirect_to @partido, notice: 'Partido was successfully created.' }
        format.html { redirect_to partido_steps_path(@partido),  notice: 'Partido was successfully created.' }
        format.json { render :show, status: :created, location: @partido }
      else
        format.html { render :new }
        format.json { render json: @partido.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /partidos/1
  # PATCH/PUT /partidos/1.json
  def update
    PaperTrail.whodunnit = current_admin.email
    respond_to do |format|
      if @partido.update(partido_params)
        format.html { redirect_to @partido, notice: 'Partido was successfully updated.' }
        format.json { render :show, status: :ok, location: @partido }
      else
        format.html { render :edit }
        format.json { render json: @partido.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /partidos/1
  # DELETE /partidos/1.json
  def destroy
    PaperTrail.whodunnit = current_admin.email
    @partido.destroy
    respond_to do |format|
      format.html { redirect_to partidos_url, notice: 'Partido was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def normas_internas
    @normas_internas = []
    @partido.marco_interno.documentos.each do |d|
      if !d.archivo_file_name.nil?
        @normas_internas.push d
      end
    end
  end

  def regiones
    rangos = [[14,17],[18,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,59],[60,64],[65,69],[70,100]]
    @datos_region = []
    @datos_nacional = []
    @rangos_edad = []

    nh = 0 #nacional hombres
    nm = 0 #nacional mujeres
    no = 0
    rh = 0 #regional hombres
    rm = 0 #regional mujeres
    ro = 0
    pnh = 0 #promedio nacional hombres
    pnm = 0 #promedio nacional mujeres
    pno = 0

    nacional = { "region" => "nacional", "ordinal" => "nacional", "hombres" => 0, "mujeres" => 0, "otros" => 0, "porcentaje_hombres" => 0, "porcentaje_mujeres" => 0, "porcentaje_otros" => 0, "total" => 0, "desgloce" => [] }

    last_date = Afiliacion.where(partido_id: @partido).uniq.pluck(:fecha_datos).sort.last

    autoridad = @partido.tipo_cargos.where(:autoridad => true)
    cargo_interno = @partido.tipo_cargos.where(:cargo_interno => true)
    representante = @partido.tipo_cargos.where(:representante => true)

    @partido.regions.each do |r|
      afiliados = Afiliacion.where(partido_id: @partido, region_id: r, fecha_datos: last_date)
      # if afiliados.any?
        h = 0 #hombres
        m = 0 #mujeres
        o = 0
        rh = 0 #hombres
        rm = 0 #mujeres
        ro = 0
        ph = 0 #promedio hombres
        pm = 0 #promedio mujeres
        po = 0
        afiliados.each do |a|
          h = h + a.hombres
          m = m + a.mujeres
          o = o + a.otros
          total = a.total
          if(total>0)
            ph = (h*100)/total
            pm = (m*100)/total
            po = (o*100)/total
          end
        end
        if(h>0 || m>0 || o>0)
          nh = nh + h #nacional hombres
          nm = nm + m #nacional mujeres
          no = no + o #nacional otros
          rh = rh + h #regional hombres
          rm = rm + m #regional mujeres
          ro = ro + o #regional otros
          total_n = nh + nm + no #total nacional
          total_r = rh + rm + ro #total regional
          pnh = (nh*100)/total_n #promedio nacional hombres
          pnm = (nm*100)/total_n #promedio nacional mujeres
          pno = (no*100)/total_n #promedio nacional otros

          region = { "region" => r.nombre, "ordinal" => r.ordinal, "hombres" => h + 0.000001, "porcentaje_hombres" => ph, "mujeres" => m + 0.000001, "porcentaje_mujeres" => pm, "otros" => o + 0.000001, "porcentaje_otros" => po, "total" => total_r, "desgloce" => [], "cargos" => [] }

          region["cargos"] << {"type" => "autoridad", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => autoridad, :region_id => r).count}
          region["cargos"] << {"type" => "cargo_interno", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => cargo_interno, :region_id => r).count}
          region["cargos"] << {"type" => "representante", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => representante, :region_id => r).count}

          participantes = 0
          rangos.each do |rango|
            participantes = @partido.afiliacions.where(:ano_nacimiento => Date.today.year-rango[1]..Date.today.year-rango[0], :region_id => r, fecha_datos: last_date)
            ph = 0.0001 #participantes hombres
            pm = 0.0001 #participantes mujeres
            po = 0.0001
            participantes.each do |np|
              ph = ph + np.hombres
              pm = pm + np.mujeres
              po = po + np.otros
            end
            region["desgloce"].push( rango[0].to_s+'-'+rango[1].to_s => ph + pm + po )
          end
          @datos_region.push region
        end
      # end

    end

    nacional = { "region" => "nacional", "ordinal" => "nacional", "hombres" => nh + 0.000001, "mujeres" => nm + 0.000001, "otros" => no + 0.000001, "porcentaje_hombres" => pnh, "porcentaje_mujeres" => pnm, "porcentaje_otros" => pno, "total" => nh + nm + no, "desgloce" => [], "cargos" => [] }
    a = []
    if @datos_region.any?

      @datos_region.each do |dr|
        dr["desgloce"].each do |d|
          a << d
        end
      end
      nacional["desgloce"] << a.inject{ |x,y| x.merge(y) { |k,old_v, new_v| old_v+new_v } }
    end

    nacional["cargos"] << {"type" => "autoridad", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => autoridad).count}
    nacional["cargos"] << {"type" => "cargo_interno", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => cargo_interno).count}
    nacional["cargos"] << {"type" => "representante", "nro_cargos" => @partido.cargos.where(:tipo_cargo_id => representante).count}

    @datos_nacional.push nacional

    @datos_total_nacional = @datos_nacional + @datos_region
  end

  def sedes_partido
    @datos_sedes = []
    region_ids_with_sede = @partido.sedes.select(:region_id).uniq.map(&:region_id)
    region_ids_with_sede.each do |r|
      sedes = @partido.sedes.where(region_id: r)
      all_sedes = []
      sedes.each do |s|
        all_sedes.push( { 'direccion' => s.direccion, 'contacto' => s.contacto, 'comuna' => s.comuna.nombre } )
      end
      region = Region.find r
      @datos_sedes.push( {'region' => region.nombre, 'sedes' => all_sedes} )
    end
  end

  def autoridades
    @autoridades = []
    t_cargos = @partido.tipo_cargos.where(autoridad: true)
    t_cargos.each do |tc|
      cargos = @partido.cargos.where(tipo_cargo_id: tc)
      if !params["region"].blank?
        cargos = cargos.where(region_id: params["region"])
      end
      if !params["genero"].blank?
        personas_id = @partido.personas.where(genero: params["genero"])
        cargos = cargos.where(persona_id: personas_id)
      end
      if !params["q"].blank?
        n = params[:q].split(" ")[0]
        a = params[:q].split(" ")[1] || params[:q].split(" ")[0]
        personas_id = Persona.where("lower(personas.nombre) like ? OR lower(personas.apellidos) like ?", n.downcase, a.downcase)
        cargos = cargos.where(persona_id: personas_id)
      end
      @autoridades << {"type" => tc.titulo, "cargos" => cargos}
    end
  end

  def vinculos_intereses
    @entidades = []
    @partido.participacion_entidads.each do |p|
      @entidades.push p
    end
  end

  def pactos
    @pactos = []
    @partido.pacto_electorals.each do |p|
      @pactos.push p
    end
  end

  def sanciones
    @sanciones = []
    @partido.sancions.each do |s|
      @sanciones.push s
    end
  end

  def finanzas_1
    @fechas_datos = IngresoOrdinario.where(partido: @partido).uniq.pluck(:fecha_datos).sort
    if params[:fecha_datos]
      @fecha = Date.new(params[:fecha_datos].split("-")[0].to_i, params[:fecha_datos].split("-")[1].to_i, params[:fecha_datos].split("-")[2].to_i)
    else
      @fecha = @fechas_datos.last
    end
    ingresos_ordinarios = IngresoOrdinario.where(:partido => @partido, :fecha_datos => @fecha )
    max_value = ingresos_ordinarios.maximum(:importe)
    @datos_ingresos_ordinarios = []
    ingresos_ordinarios.each do |io|
      val = (100 * (io.importe.to_f / max_value.to_f).to_f rescue 0).to_s
      line ={ 'text'=> io.concepto, 'value' => ActiveSupport::NumberHelper::number_to_delimited(io.importe, delimiter: ""), 'percentage' => val }
      @datos_ingresos_ordinarios << line
    end
    total_publicos = ingresos_ordinarios.where(:concepto => "Aportes Estatales").first.importe rescue 0
    total_privados = ingresos_ordinarios.sum(:importe) - total_publicos
    @datos_ingresos_ordinarios_totals = { 'publicos'=> total_publicos, 'privados' => total_privados}
  end

  def finanzas_2
    @fechas_datos = EgresoOrdinario.where(partido: @partido).uniq.pluck(:fecha_datos).sort
    if params[:fecha_datos]
      @fecha = Date.new(params[:fecha_datos].split("-")[0].to_i, params[:fecha_datos].split("-")[1].to_i, params[:fecha_datos].split("-")[2].to_i)
    else
      @fecha = @fechas_datos.last
    end
    egresos_ordinarios = EgresoOrdinario.where(:partido => @partido, :fecha_datos => @fecha )
    max_value = egresos_ordinarios.maximum("privado + publico")
    @datos_egresos_ordinarios = []
    egresos_ordinarios.each do |eo|
      val = (100 * ((eo.publico.to_f + eo.privado.to_f)/ max_value.to_f).to_f rescue 0).to_s
      line ={ 'text'=> eo.concepto, 'value_publico' => eo.publico, 'value_privado' => eo.privado,
        'value' => ActiveSupport::NumberHelper::number_to_delimited(eo.privado + eo.publico, delimiter: ""), 'percentage' => val }
      @datos_egresos_ordinarios << line
    end
    total_publicos = egresos_ordinarios.sum(:publico)
    total_privados = egresos_ordinarios.sum(:privado)
    @datos_egresos_ordinarios_totals = { 'publicos'=> total_publicos, 'privados' => total_privados}
  end

  def finanzas_5
    @fechas_datos = Transferencia.where(partido: @partido).uniq.pluck(:fecha_datos).sort
    if params[:fecha_datos]
      @fecha = Date.new(params[:fecha_datos].split("-")[0].to_i, params[:fecha_datos].split("-")[1].to_i, params[:fecha_datos].split("-")[2].to_i)
    else
      @fecha = @fechas_datos.last
    end

    datos_eficientes_transferencias = Transferencia.where(partido: @partido, :fecha_datos => @fecha).group(:categoria).
    select("categoria, count(1) as count, sum(monto) as total").order(:categoria)

    max_value = Transferencia.where(partido: @partido, :fecha_datos => @fecha).group(:categoria).select("sum(monto) as total").order("total DESC").first.attributes.symbolize_keys![:total] rescue 0


    datos_eficientes_transferencias.each do |d|
      d.attributes.symbolize_keys!
    end
    total = 0
    @datos_transferencias = []
    datos_eficientes_transferencias.each do |t|
      total = total + t.total
      val = (100 * ((t.total.to_f)/ max_value.to_f).to_f rescue 0).to_s
      line ={ 'text'=> t.categoria,
        'value' => ActiveSupport::NumberHelper::number_to_delimited(t.total, delimiter: "."), 'percentage' => val }
      @datos_transferencias << line
    end
    @datos_transferencias_totals = { :total => total }
  end

  def afiliacion_desafiliacion
    @tramites = @partido.tramites
  end

  def eleccion_popular

    cargos = %w(Presidente Senador Diputado Consejero\ Regional Alcalde Concejal)
    e_popular = []
    cargos.each do |c|
      query = @partido.eleccion_populars.where(cargo: c)
      tmp = []
      query.each do |q|
        procedimiento = []
        q.procedimientos.each do |p|
          procedimiento << {"descripcion" => p.descripcion}
        end
        requisito = []
        q.requisitos.each do |r|
          requisito << {"descripcion" => r.descripcion}
        end
        tmp <<  {"fecha_eleccion" => q.fecha_eleccion, "dias" => q.dias, "procedimientos" => procedimiento, "requisitos" => requisito}
      end
      e_popular << { "type" => c, "dates" => tmp }
    end

    @e_popular = e_popular
  end

  def organos_internos
    @organos = @partido.organo_internos
  end

  def elecciones_internas
    @elecciones = []
    organos = @partido.organo_internos
    organos.each do |o|
      elecciones = o.eleccion_interna
      tmp_elecciones = []
      elecciones.each do |e|
        tmp_procedimientos = []
        e.procedimientos.each do |p|
          tmp_procedimientos << {"descripcion" => p.descripcion}
        end
        tmp_requisitos = []
        e.requisitos.each do |r|
          tmp_requisitos << {"descripcion" => r.descripcion}
        end
        tmp_elecciones << {"cargo" => e.cargo, "fecha_eleccion" => e.fecha_eleccion, "fecha_limite_inscripcion" => e.fecha_limite_inscripcion, "procedimientos" => tmp_procedimientos, "requisitos" => tmp_requisitos}
      end
      @elecciones << {"organo" => o.nombre, "elecciones_internas" => tmp_elecciones}
    end
  end

  def representantes
    @representantes = []
    t_cargos = @partido.tipo_cargos.where(representante: true)
    by_gender = []
    t_cargos.each do |tc|
      filter_by = @partido.cargos.where(:tipo_cargo_id => tc.id)
      if !params[:q].blank?
        n = params[:q].split(" ")[0]
        a = params[:q].split(" ")[1] || params[:q].split(" ")[0]
        personas = Persona.where("lower(personas.nombre) like ? OR lower(personas.apellidos) like ?", n.downcase, a.downcase)
        filter_by = filter_by.where(:persona_id => personas)
      end
      if !params[:genero].blank?
        by_gender = @partido.personas.where(:genero => params[:genero])
        filter_by = filter_by.where(:persona_id => by_gender)
      end
      if !params[:region].blank?
        filter_by = filter_by.where(:region_id => params[:region])
      end
      @representantes << {"type" => tc.titulo, "representatives" => filter_by}
    end

  end

  def acuerdos_organos
    @acuerdos = []
    tipos = %w(Acta Programatico Electoral Funcionamiento\ Interno)

    tipos.each do |t|
      acuerdos = []
      @partido.acuerdos.where(tipo: t).each do |a|
        ##puts a.region.to_i
        region = a.region.to_i == 0 ? "" : Region.find(a.region.to_i).nombre
        organo_interno  = a.organo_interno.nil? ? "" :  a.organo_interno.nombre
        documento_file_name = a.documento_file_name.nil? ? "" : a.documento_file_name
        documento_url = a.documento.url.nil? ? "" : a.documento.url
        acuerdos << {"numero" => a.numero, "tema" => a.tema, "fecha" => a.fecha, "region" => region, "organo_interno" => organo_interno, "documento" => documento_file_name, "documento_url" => documento_url}
      end
      @acuerdos << { "type" => t, "agreements" => acuerdos }
    end

  end

  def estructura_organica
    organos_internos = @partido.organo_internos
    @datos = []

    organos_internos.each do |o|
      members = []
      data = o.cargos
      if !params[:region].blank?
        data = data.where(region_id: params[:region])
      end

      if !params[:genero].blank?
        by_gender = @partido.personas.where(:genero => params[:genero])
        data = data.where(persona_id: by_gender)
      end

      data.each do |m|
        if !params[:q].blank?
          n = params[:q].split(" ")[0]
          a = params[:q].split(" ")[1] || params[:q].split(" ")[0]
          if m.persona.nombre.downcase.include?(n.downcase) || m.persona.apellidos.downcase.include?(a.downcase)
            members << {:cargo => m, :persona => m.persona, :tipo_cargo => m.tipo_cargo}
          end
        else
          members << {:cargo => m, :persona => m.persona, :tipo_cargo => m.tipo_cargo}
        end

      end
      @datos << {:organo_interno => o, :miembros => members}
    end

  end

  def actividades_publicas
  end

  def intereses_patrimonios
    @intereses_patrimonios = []
    tc_candidatos = @partido.tipo_cargos#.where(candidato:true)
    tc_candidatos.each do |tc|
      filter_by = @partido.cargos.where(tipo_cargo_id:tc)
      if !params[:q].blank?
        n = params[:q].split(" ")[0]
        a = params[:q].split(" ")[1] || params[:q].split(" ")[0]
        personas = Persona.where("lower(personas.nombre) like ? OR lower(personas.apellidos) like ?", n.downcase, a.downcase)
        filter_by = filter_by.where(:persona_id => personas)
      end
      if !params[:region].blank?
        filter_by = filter_by.where(:region_id => params["region"])
      end
      if !params[:genero].blank?
        by_gender = @partido.personas.where(:genero => params[:genero])
        filter_by = filter_by.where(:persona_id => by_gender)
      end
      @intereses_patrimonios << {"type" => tc.titulo, "cargos" => filter_by} unless filter_by.empty?


    end
  end

  def publicacion_candidatos
    @publicacion_candidatos = []
    tc_candidatos = @partido.tipo_cargos.where(candidato:true)
    tc_candidatos.each do |tc|
      filter_by = @partido.cargos.where(tipo_cargo_id:tc)
      if !params[:q].blank?
        n = params[:q].split(" ")[0]
        a = params[:q].split(" ")[1] || params[:q].split(" ")[0]
        personas = Persona.where("lower(personas.nombre) like ? OR lower(personas.apellidos) like ?", n.downcase, a.downcase)
        filter_by = filter_by.where(:persona_id => personas)
      end
      if !params[:region].blank?
        filter_by = filter_by.where(:region_id => params["region"])
      end
      if !params[:genero].blank?
        by_gender = @partido.personas.where(:genero => params[:genero])
        filter_by = filter_by.where(:persona_id => by_gender)
      end
      @publicacion_candidatos << {"type" => tc.titulo, "cargos" => filter_by}
    end
  end

  def resultado_elecciones_internas
  end

  private
    def authenticate_superadmin
      ##puts "validating superadmin capabilities"
      unless current_admin.is_superadmin?
        redirect_to admin_path
      end
    end

    # Use callbacks to share common setup or constraints between actions.
    def set_partido
      partido_id = params[:id] || params[:partido_id]
      @partido = Partido.find(partido_id)
    end

    def set_menu
      ###puts params
        @menu = params[:menu].nil? ? 0 : params[:menu].to_i

    end

    def get_partidos
      partidos = Partido.all
      @partidos = []
      partidos.each do |p|
        @partidos << { "nombre" => p.nombre, "id" => p.id }
      end
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def partido_params
      # params.fetch(:partido, {:nombre, :sigla, :lema})
      params.require(:partido).permit(:nombre, :sigla, :lema, :fecha_fundacion, :texto, :logo)
    end

end