pasosdeJesus/sivel2_gen

View on GitHub
lib/sivel2_gen/concerns/models/conscaso.rb

Summary

Maintainability
C
7 hrs
Test Coverage
F
56%

module Sivel2Gen
  module Concerns
    module Models
      module Conscaso 
        extend ActiveSupport::Concern

        included do

          self.primary_key = 'caso_id'

          belongs_to :caso, class_name: 'Sivel2Gen::Caso', optional: false

          has_many :ubicacion, through: :caso,
            class_name: 'Msip::Ubicacion'

          has_many :caso_presponsable, through: :caso,
            class_name: 'Sivel2Gen::CasoPresponsable'

          has_many :acto, through: :caso,
            class_name: 'Sivel2Gen::Acto'

          has_many :victima, through: :caso,
            class_name: 'Sivel2Gen::Victima'

          has_many :persona, through: :victima,
            class_name: 'Msip::Persona'

          has_many :caso_etiqueta, through: :caso,
            class_name: 'Sivel2Gen::CasoEtiqueta'

          has_many :caso_usuario, through: :caso,
            class_name: 'Sivel2Gen::CasoUsuario'


          scope :ordenar_por, lambda { |campo|
            # extract the sort direction from the param value.
            # direction = (campo =~ /desc$/) ? 'desc' : 'asc'
            critord = self.interpreta_ordenar_por(campo.to_s)
            order(critord)
          }

          scope :filtro_pais_id, lambda { |id|
            where('caso_id IN (SELECT caso_id
                    FROM public.msip_ubicacion
                    WHERE msip_ubicacion.pais_id = ?)', id)
          }

          scope :filtro_departamento_id, lambda { |id|
            where('caso_id IN (SELECT caso_id
                    FROM public.msip_ubicacion
                    WHERE msip_ubicacion.departamento_id = ?)', id)
          }

          scope :filtro_municipio_id, lambda { |id|
            where('caso_id IN (SELECT caso_id
                    FROM public.msip_ubicacion
                    WHERE msip_ubicacion.municipio_id = ?)', id)
          }

          scope :filtro_centropoblado_id, lambda { |id|
            where('caso_id IN (SELECT caso_id
                    FROM public.msip_ubicacion
                    WHERE msip_ubicacion.centropoblado_id = ?)', id)
          }

          scope :filtro_fechaini, lambda { |fecha_ref|
            where('sivel2_gen_conscaso.fecha >= ?', 
                  fecha_ref
                 )
          }

          scope :filtro_fechafin, lambda { |fecha_ref|
            where('sivel2_gen_conscaso.fecha <= ?', 
                  fecha_ref
                 )
          }

          scope :filtro_presponsable_id, lambda { |id|
            id.delete("")
            if id.is_a? Array
              id = id.map {|item| item.to_i}
              where('caso_id IN (SELECT caso_id
                      FROM public.sivel2_gen_caso_presponsable
                      WHERE sivel2_gen_caso_presponsable.presponsable_id IN (?))',
                      id)
            else
              where('caso_id IN (SELECT caso_id
                      FROM public.sivel2_gen_caso_presponsable
                      WHERE sivel2_gen_caso_presponsable.presponsable_id = ?)',
                      id)
            end
          }

          scope :filtro_categoria_id, lambda { |ids|
            if !ids.is_a? Array
              ids = [ids]
            end
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id '\
                  '  FROM public.sivel2_gen_acto '\
                  '  WHERE sivel2_gen_acto.categoria_id IN (?) '\
                  ') OR sivel2_gen_conscaso.caso_id IN (SELECT caso_id '\
                  '  FROM public.sivel2_gen_actocolectivo '\
                  '  WHERE sivel2_gen_actocolectivo.categoria_id IN (?) '\
                  ') OR sivel2_gen_conscaso.caso_id IN ( '\
                  '  SELECT caso_id FROM public.sivel2_gen_caso_presponsable '\
                  '  INNER JOIN public.sivel2_gen_caso_categoria_presponsable ON '\
                  '  public.sivel2_gen_caso_presponsable.id = '\
                  '    public.sivel2_gen_caso_categoria_presponsable.caso_presponsable_id '\
                  '  WHERE '\
                  '    public.sivel2_gen_caso_categoria_presponsable.categoria_id IN (?) '\
                  ')',
                  ids, ids, ids)
          }

          scope :filtro_contexto_id, lambda { |idc|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                  FROM public.sivel2_gen_caso_contexto
                  WHERE sivel2_gen_caso_contexto.contexto_id IN (?))',
                  idc)
          }
          
          scope :filtro_contextovictima_id, lambda { |idc|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                  FROM public.sivel2_gen_victima INNER JOIN
                  public.sivel2_gen_contextovictima_victima ON
                  public.sivel2_gen_victima.id = public.sivel2_gen_contextovictima_victima.victima_id WHERE sivel2_gen_contextovictima_victima.contextovictima_id IN (?))',
                  idc)
          }

          scope :filtro_descripcion, lambda { |d|
            where("unaccent(sivel2_gen_conscaso.memo) ILIKE '%'
                  || unaccent(?) || '%'", d)
          }

          scope :filtro_apellidos, lambda { |d|
            where("sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima 
                    INNER JOIN public.msip_persona
                    ON sivel2_gen_victima.persona_id=msip_persona.id
                    WHERE unaccent(msip_persona.apellidos) ILIKE '%' ||
                      unaccent(?) || '%')", d)
          }

          scope :filtro_nombres, lambda { |d|
            where("sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima 
                    INNER JOIN public.msip_persona
                    ON sivel2_gen_victima.persona_id=msip_persona.id
                    WHERE unaccent(msip_persona.nombres) ILIKE '%' ||
                      unaccent(?) || '%')", d)
          }

          scope :filtro_victimacol, lambda { |d|
            where("sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victimacolectiva 
                    INNER JOIN public.msip_grupoper
                    ON sivel2_gen_victimacolectiva.grupoper_id=msip_grupoper.id
                    WHERE unaccent(msip_grupoper.nombre) ILIKE '%' ||
                      unaccent(?) || '%')", d)
          }

          scope :filtro_sexo, lambda { |s|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima 
                    INNER JOIN public.msip_persona
                    ON sivel2_gen_victima.persona_id=msip_persona.id
                    WHERE msip_persona.sexo=?)', s)
          }

          scope :filtro_orientacionsexual, lambda { |s|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima 
                    WHERE orientacionsexual=?)', s)
          }

          scope :filtro_rangoedad_id, lambda { |r|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima 
                    WHERE sivel2_gen_victima.rangoedad_id = ?)', r)
          }

          scope :filtro_sectorsocial_id, lambda { |r|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima
                    WHERE sivel2_gen_victima.sectorsocial_id = ? UNION 
                    SELECT caso_id FROM public.sivel2_gen_victima 
                    INNER JOIN public.sivel2_gen_sectorsocialsec_victima ON sivel2_gen_victima.id = sivel2_gen_sectorsocialsec_victima.victima_id 
                    WHERE sivel2_gen_sectorsocialsec_victima.sectorsocial_id = ?)', r, r)
          }

          scope :filtro_organizacion_id, lambda { |r|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima
                    WHERE sivel2_gen_victima.organizacion_id = ? UNION 
                    SELECT caso_id FROM public.sivel2_gen_victima 
                    INNER JOIN public.sivel2_gen_otraorga_victima ON sivel2_gen_victima.id = sivel2_gen_otraorga_victima.victima_id 
                    WHERE sivel2_gen_otraorga_victima.organizacion_id = ?)', r, r)
          }

          scope :filtro_profesion_id, lambda { |r|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima
                    WHERE sivel2_gen_victima.profesion_id IN (?))', r)
          }


          scope :filtro_filiacion_id, lambda { |r|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_victima
                    WHERE sivel2_gen_victima.filiacion_id IN (?))', r)
          }

          scope :filtro_etiqueta, lambda { |c, e|
            if c 
              where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id 
                FROM public.sivel2_gen_caso_etiqueta
                WHERE etiqueta_id = ?)', e)
            else
              where('sivel2_gen_conscaso.caso_id NOT IN (SELECT caso_id 
                FROM public.sivel2_gen_caso_etiqueta
                WHERE etiqueta_id = ?)', e)
            end
          }


          scope :filtro_estadosol_id, lambda { |e|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_caso_solicitud AS cs
                    JOIN public.msip_solicitud AS s ON cs.solicitud_id=s.id
                    WHERE s.estadosol_id=?)', e)
          }


          scope :filtro_usuario_id, lambda { |u|
            where('sivel2_gen_conscaso.caso_id IN (SELECT caso_id
                    FROM public.sivel2_gen_caso_usuario
                    WHERE sivel2_gen_caso_usuario.usuario_id = ?)', u)
          }

          scope :filtro_fechaingini, lambda { |f|
            where('sivel2_gen_conscaso.caso_id IN (SELECT id
                    FROM public.sivel2_gen_caso
                    WHERE created_at >= ?)', 
                  Msip::FormatoFechaHelper.fecha_local_estandar(f)
                 )
          }

          scope :filtro_fechaingfin, lambda { |f|
            where('sivel2_gen_conscaso.caso_id IN (SELECT id FROM public.sivel2_gen_caso
              WHERE created_at <= ?)',
              Msip::FormatoFechaHelper.fecha_local_estandar(f)
                 )

          }

          scope :filtro_codigo, lambda { |c|
            where('sivel2_gen_conscaso.caso_id' => c.split(' '))
          }

        end

        module ClassMethods

          def consulta_base_sivel2_gen
            r = "SELECT caso.id as caso_id, caso.fecha, caso.memo, 
        ARRAY_TO_STRING(ARRAY(SELECT COALESCE(departamento.nombre, '') ||  
        ' / ' || COALESCE(municipio.nombre, '')
        FROM public.msip_ubicacion AS ubicacion 
          LEFT JOIN public.msip_departamento AS departamento 
            ON (ubicacion.departamento_id = departamento.id)
          LEFT JOIN public.msip_municipio AS municipio 
            ON (ubicacion.municipio_id=municipio.id)
          WHERE ubicacion.caso_id=caso.id), ', ')
        AS ubicaciones, 
        ARRAY_TO_STRING(ARRAY(SELECT nombres || ' ' || apellidos 
          FROM public.msip_persona AS persona, 
          public.sivel2_gen_victima AS victima 
          WHERE persona.id=victima.persona_id 
          AND victima.caso_id=caso.id), ', ')
        AS victimas, 
        ARRAY_TO_STRING(ARRAY(SELECT nombre 
          FROM public.sivel2_gen_presponsable AS presponsable, 
          public.sivel2_gen_caso_presponsable AS caso_presponsable
          WHERE presponsable.id=caso_presponsable.presponsable_id
          AND caso_presponsable.caso_id=caso.id), ', ')
        AS presponsables, 
        ARRAY_TO_STRING(ARRAY(SELECT supracategoria.tviolencia_id || ':' || 
          categoria.supracategoria_id || ':' || categoria.id || ' ' ||
          categoria.nombre FROM public.sivel2_gen_categoria AS categoria, 
          public.sivel2_gen_supracategoria AS supracategoria,
          public.sivel2_gen_acto
          WHERE categoria.id=sivel2_gen_acto.categoria_id
          AND supracategoria.id=categoria.supracategoria_id
          AND sivel2_gen_acto.caso_id=caso.id), ', ')
        AS tipificacion
        FROM public.sivel2_gen_caso AS caso"
          #Rails.logger.info r
          return r
          end
          
          def consulta_base
            consulta_base_sivel2_gen
          end

          # Retorna '' sii puede refrescar o crear sivel2_gen_conscaso
          # en otro caso retorna cadena con problema o razón por la que
          # no refresca
          def refresca_conscaso
            if ARGV.include?("db:migrate")
              return 'Ejecutando migración'
            end
            if !ActiveRecord::Base.connection.data_source_exists? 'sivel2_gen_conscaso'
              ActiveRecord::Base.connection.execute("CREATE OR REPLACE 
        VIEW sivel2_gen_conscaso1 AS #{consulta_base};")
              ActiveRecord::Base.connection.execute(
                "CREATE MATERIALIZED VIEW sivel2_gen_conscaso AS
        SELECT caso_id, fecha, memo, ubicaciones, victimas, 
        presponsables, tipificacion, now() AS ultimo_refresco,
        to_tsvector('spanish', unaccent(caso_id || ' ' || 
        replace(cast(fecha AS varchar), '-', ' ') 
        || ' ' || memo || ' ' || ubicaciones || ' ' || 
         victimas || ' ' || presponsables || ' ' || tipificacion)) as q
        FROM public.sivel2_gen_conscaso1");
        ActiveRecord::Base.connection.execute(
          "CREATE INDEX busca_sivel2_gen_conscaso 
              ON sivel2_gen_conscaso USING gin(q);"
        )
            else
              p = Msip::ProcesosHelper.procesos_OpenBSD
              r = p.select {|u| u[:command] =~ /REFRESH/ }
              if r.count > 0
                return "Ejecución de otro(s) REFRESH en curso (#{r.map {|x| x[:command]}})"
              else
                ActiveRecord::Base.connection.execute(
                  'REFRESH MATERIALIZED VIEW sivel2_gen_conscaso'
                )
              end
            end
            return ''
          end # def refresca_conscaso

          def interpreta_ordenar_por(campo)
            critord = ""
            case campo.to_s
            when /^fechadesc/
              critord = "sivel2_gen_conscaso.fecha desc"
            when /^fecha/
              critord = "sivel2_gen_conscaso.fecha asc"
            when /^ubicaciondesc/
              critord = "sivel2_gen_conscaso.ubicaciones desc"
            when /^ubicacion/
              critord = "sivel2_gen_conscaso.ubicaciones asc"
            when /^codigodesc/
              critord = "sivel2_gen_conscaso.caso_id desc"
            when /^codigo/
              critord = "sivel2_gen_conscaso.caso_id asc"
            else
              raise(ArgumentError, "Ordenamiento invalido: #{ campo.inspect }")
            end
            critord += ", sivel2_gen_conscaso.caso_id"
            return critord
          end

        end # module ClassMethods

      end
    end
  end
end