Commit 2c634ef5 authored by Jaime Ortiz's avatar Jaime Ortiz
Browse files

3521 Separar los resúmenes de proyecto (por tipologías) en varios controladores

parent e5c46732
Loading
Loading
Loading
Loading
+0 −159
Original line number Diff line number Diff line
# encoding: UTF-8
#--
#
#################################################################################
# Copyright 2010-2013 Free Software's Seed, CENATIC y IEPALA
#
# Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto sean aprobadas por la Comisión Europea–
# versiones posteriores de la EUPL (la «Licencia»);
# Solo podrá usarse esta obra si se respeta la Licencia.
# Puede obtenerse una copia de la Licencia en:
#
# http://www.osor.eu/eupl/european-union-public-licence-eupl-v.1.1
#
# Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
# el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
# SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
# Véase la Licencia en el idioma concreto que rige los permisos y limitaciones que establece la Licencia.
#################################################################################
#
#++
# Controlador encargado de los resumenes de proyecto. Este controlador es utilizado desde las secciones:
# * Sección proyectos: se utiliza para presentar un resumen de proyecto según diversos parámetros

class ResumenProyectoDetalleController < ApplicationController

  # en proyectos: selecciona la caja para sacar el informe de arqueo
  def arqueo_caja
    @listado_libros = eval( "@" + singularizar_seccion ).libro.select{|l| @usuario_identificado.libro.include? l}.collect {|a|[a.nombre, a.id]}
    @listado_etapa = [[_("Todas"), "todas"]] + @proyecto.etapa.collect{|e| [e.nombre, e.id]} unless @proyecto.convenio?
    @listado_pac = [[_("Todos"), "todos"]] + @proyecto.pacs.collect{|p| [p.nombre, p.id]} if @proyecto.convenio?
    # Si el proyecto tiene visibilidad limitada y no somos admins
    # mostramos solo los libros o agentes asignados
    if @proyecto.ocultar_gastos_otras_delegaciones && !@proyecto.usuario_admin?(@usuario_identificado)
      agentes_permitidos = @proyecto.implementadores_autorizados(@usuario_identificado)
    else
      agentes_permitidos = @proyecto.implementador
    end
    @listado_agentes = agentes_permitidos.collect{|e| [e.nombre, e.id]}
    @listado_monedas = @proyecto.moneda.collect{|e| [e.nombre, e.id]}
    # Si hemos especificado un libro para ver el informe
    if params[:selector] && (params[:selector][:tipo] == "agente" || params[:selector][:tipo] == "cuenta")
      @libro = Libro.where(agente_id: agentes_permitidos).find_by_id(params[:selector][:libro]) if params[:selector][:tipo] == "cuenta"
      @agente = agentes_permitidos.find_by_id(params[:selector][:agente]) if params[:selector][:tipo] == "agente"
      @moneda = Moneda.find_by_id(params[:selector][:moneda]) if params[:selector][:tipo] == "agente"
      @moneda = @libro.moneda if @libro

      # Proyectos de los que obtener informacion
      if @proyecto.convenio?
        @pac = Proyecto.find_by_id(params[:selector][:pac])
        proyectos = @pac ? [ @pac ] : @proyecto.pacs
      else
        @etapa = Etapa.find_by_id(params[:selector][:etapa])
        proyectos = [ @proyecto ]
      end

      fecha_inicio = @etapa ? @etapa.fecha_inicio : nil
      fecha_fin = @etapa ? @etapa.fecha_fin : nil
      # Si es arqueo de un solo libro, lo invocamos tal cual
      if @libro
        arqueo = @libro.arqueo( proyectos, fecha_inicio, fecha_fin )
      # Si es arqueo de un agente, recorremos todos sus libros en la moneda indicada
      elsif @agente && @moneda
        arqueo = { :filas => [], :totales => {}, :entrante => 0, :saliente => 0 }
        @agente.libro.where(moneda_id: @moneda.id).each do |libro|
          arqueo_libro = libro.arqueo( proyectos, fecha_inicio, fecha_fin )
          arqueo[:filas] += arqueo_libro[:filas]
          #arqueo[:totales] = arqueo_libro[:totales]
          arqueo[:entrante] += arqueo_libro[:entrante]
          arqueo[:saliente] += arqueo_libro[:saliente]
          # Sumamos los totales por conceptos
          arqueo_libro[:totales].each do |tipo,parcial|
            arqueo[:totales][tipo] ||= {}
            parcial.each do |dir,valor|
              arqueo[:totales][tipo][dir] ||= 0
              arqueo[:totales][tipo][dir] += valor
            end
          end
        end
        # Ordenamos por fecha las filas
        arqueo[:filas].sort! { |x,y| x[:contenido][0] <=> y[:contenido][0] }
      else
        arqueo = { :filas => [], :totales => {}, :entrante => 0, :saliente => 0 }
      end

      # Incluye los saldos linea a linea
      saldo = 0.0
      arqueo[:filas].each do |fila|
        saldo += fila[:contenido][3].to_f - fila[:contenido][4].to_f
        fila[:contenido].push saldo
      end

      # Prepara la salida de datos
      lineas = Array.new
      lineas.push( :cabecera => [ [_("Fecha"),"1_2"], [_("Tipo"),"1_2"], [_("Concepto"),"3_2"], [_("Entradas"),"1_2_td"], [_("Salidas"),"1_2_td"], [_("Saldo"),"1_2_td"] ])
      lineas += arqueo[:filas]
      lineas.push( :contenido => [ '','','','','' ] )
      lineas.push( :cabecera => [ [_("Totales"),"1_2"], ["","1_2"], ["","3_2"], [arqueo[:entrante],"1_2_td"], [arqueo[:saliente],"1_2_td"], [arqueo[:entrante] - arqueo[:saliente],"1_2_td"] ])
      arqueo[:totales].each do |k,v|
        lineas.push( :contenido => [ '',_(k),'',v["Entrante"]||'',v["Saliente"]||'','' ] )
      end

      @resumen = Array.new
      nombre = "arqueo_caja"
      titulo = @proyecto.nombre + " / " + _("Arqueo") + " "
      titulo += _("Cuenta/Caja %{nombre_cuenta}")%{nombre_cuenta: @libro.nombre} if @libro
      titulo += _("Cuentas/Cajas de %{nombre_agente} (%{mon})")%{nombre_agente: @agente.nombre, mon: @moneda.nombre} if @libro.nil? && @agente && @moneda
      titulo += " / "
      if @proyecto.convenio?
        titulo += _("PAC") + ": " + (@pac ? @pac.nombre : _("Todas") )
      else
	titulo += _("Etapa") + ": " + (@etapa ? @etapa.nombre + " " + _("(desde %{fecha_inicio} hasta %{fecha_fin})") % {:fecha_inicio => @etapa.fecha_inicio.strftime('%d/%m/%Y'), :fecha_fin => @etapa.fecha_fin.strftime('%d/%m/%Y')} : _("Todas") )
      end
      @resumen.push(:listado => {:nombre => nombre, :titulo => titulo, :lineas => lineas})

      respond_to do |format|
        format.html do
          render :template => 'comunes/arqueo_caja', :layout => (params[:sin_layout] ? false : true)
        end
        format.xls do
          nom_fich = "arqueo_" + @proyecto.nombre.gsub(' ','_') + "_" + Time.now.strftime("%Y-%m-%d")
          render 'comunes_xls/resumen', :xls => nom_fich, :layout => false
        end
      end
    else
      render :template => "comunes/arqueo_caja", :layout => (params[:sin_layout] ? false : true)
    end
  end

	# en agentes: desglosa las lineas de gasto para una determinada subpartida
  def detalle_gasto_subpartida
    # Por si a alguien le da por toquetear los filtros, usamos el id de agente saneado por application_controller
    params[:filtro][:proyecto] = @proyecto.id if params[:filtro]
    listado_gastos_vista = VGasto.listado_gastos params[:filtro]
    listado_gastos = Gasto.find(listado_gastos_vista.collect{|g| g.gasto_id})
    listado_gastos.each do |g|
      g.importe_x_financiador = (listado_gastos_vista.find{|gv| gv.gasto_id == g.id }).importe
      # ponemos la moneda que le corresponde segun el tipo de listado que estemos mostrando.
      g.moneda_id =  @proyecto.moneda_principal.id if params[:filtro][:moneda] == "todas" or  params[:filtro][:tasa_cambio] == "1"

    end
    @formato_xls = 1
    respond_to do |format|
      format.html do
        render(:update) { |page|  page.replace_html(params[:update], :partial => "resumen_proyecto/detalle_gasto_subpartida", :locals => {:listado_gastos => listado_gastos}) }
      end
      format.xls do
        if params[:filtro][:agente_rol] == "financiador" and params[:filtro][:agente] != "todos"
      	  @tipo = "gasto_x_financiador"
        else
          @tipo = "gasto"
        end
        @objetos = listado_gastos
        nom_fich = "Gastos_de_subpartida_" + (@proyecto).nombre.gsub(' ','_') + "_" + Time.now.strftime("%Y-%m-%d")
        render 'comunes_xls/listado', :xls => nom_fich, :layout => false
      end
    end
  end

end
+427 −0

File added.

Preview size limit exceeded, changes collapsed.

+479 −0

File added.

Preview size limit exceeded, changes collapsed.

+4 −4
Original line number Diff line number Diff line
@@ -66,9 +66,9 @@ module CronogramaHelper
      subupdate = update + '_mes_' + mes.to_s

      if @proyecto.definicion_estado && params[:menu] == "ejecucion_tecnica"
        cadena << render(:partial => "mes_cronograma", :locals => { :update => subupdate, :seguimiento => true, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'actividad', :objeto_id => actividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_ejecucion })
        cadena << render(:partial => "comunes_resumen_proyecto/mes_cronograma", :locals => { :update => subupdate, :seguimiento => true, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'actividad', :objeto_id => actividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_ejecucion })
      else
        cadena << render(:partial => "mes_cronograma", :locals => { :update => subupdate, :seguimiento => false, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'actividad', :objeto_id => actividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_formulacion })
        cadena << render(:partial => "comunes_resumen_proyecto/mes_cronograma", :locals => { :update => subupdate, :seguimiento => false, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'actividad', :objeto_id => actividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_formulacion })
      end
    end

@@ -111,9 +111,9 @@ module CronogramaHelper
      formulado = SubactividadDetallada.where(mes: mes, etapa_id: etapa.id, subactividad_id: subactividad.id, seguimiento: false).any?
      ejecutado = SubactividadDetallada.where(mes: mes, etapa_id: etapa.id, subactividad_id: subactividad.id, seguimiento: true).any?
      if @proyecto.definicion_estado && params[:menu] == "ejecucion_tecnica"
        cadena << render(:partial => "mes_cronograma", :locals => { :update => subupdate, :seguimiento => true, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'subactividad', :objeto_id => subactividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_ejecucion })
        cadena << render(:partial => "comunes_resumen_proyecto/mes_cronograma", :locals => { :update => subupdate, :seguimiento => true, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'subactividad', :objeto_id => subactividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_ejecucion })
      else
        cadena << render(:partial => "mes_cronograma", :locals => { :update => subupdate, :seguimiento => false, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'subactividad', :objeto_id => subactividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_formulacion })
        cadena << render(:partial => "comunes_resumen_proyecto/mes_cronograma", :locals => { :update => subupdate, :seguimiento => false, :formulado => formulado, :ejecutado => ejecutado, :mes => mes, :tipo => 'subactividad', :objeto_id => subactividad.id.to_s, :etapa_id => etapa.id.to_s, :clickable => @permitir_formulacion })
      end
    end

Loading