lib/msip/concerns/models/persona.rb in msip-2.2.0.alfa3 vs lib/msip/concerns/models/persona.rb in msip-2.2.0.beta1

- old
+ new

@@ -1,215 +1,248 @@ +# frozen_string_literal: true module Msip module Concerns module Models module Persona extend ActiveSupport::Concern - include Msip::Modelo + include Msip::Modelo include Msip::Localizacion included do + self.table_name = "msip_persona" - self.table_name = 'msip_persona' - CONVENCIONES_SEXO = { - 'FMS' => { + "FMS" => { sexo_femenino: :F, - nombre_femenino: 'FEMENINO', + nombre_femenino: "FEMENINO", sexo_masculino: :M, - nombre_masculino: 'MASCULINO', + nombre_masculino: "MASCULINO", sexo_sininformacion: :S, - nombre_sininformacion: 'SIN INFORMACIÓN', + nombre_sininformacion: "SIN INFORMACIÓN", }, - 'MHS' => { + "MHS" => { sexo_femenino: :M, - nombre_femenino: 'MUJER', + nombre_femenino: "MUJER", sexo_masculino: :H, - nombre_masculino: 'HOMBRE', + nombre_masculino: "HOMBRE", sexo_sininformacion: :S, - nombre_sininformacion: 'SIN INFORMACIÓN' - } + nombre_sininformacion: "SIN INFORMACIÓN", + }, } + # Retorna cadena con convención para sexo en base + # Bien FMS o bien MHS def self.convencion_sexo_abreviada # La convención se almacena en base de datos en la constraint # persona_sexo_check de tabla msip_persona - r=Msip::Persona.connection.execute( + r = Msip::Persona.connection.execute( "SELECT "\ - "substring(pg_get_constraintdef(oid, TRUE) FROM 'AND ''(...)''') "\ - " FROM pg_constraint "\ - " WHERE conrelid='msip_persona'::regclass "\ - " AND conname='persona_sexo_check'; " - )[0]['substring'] + "substring(pg_get_constraintdef(oid, TRUE) FROM 'AND ''(...)''') "\ + " FROM pg_constraint "\ + " WHERE conrelid='msip_persona'::regclass "\ + " AND conname='persona_sexo_check'; ", + )[0]["substring"] - if !CONVENCIONES_SEXO.keys.include?(r) - puts "** Convención en base para sexo desconocida: #{r}, usando FMS" - r = 'FMS' + unless CONVENCIONES_SEXO.keys.include?(r) + $stderr.puts "** Convención en base para sexo desconocida: #{r}, usando FMS" + r = "FMS" end - return r + r end def self.convencion_sexo - r = self.convencion_sexo_abreviada - return CONVENCIONES_SEXO[r] + r = convencion_sexo_abreviada + CONVENCIONES_SEXO[r] end # Retorna arreglo con convenciones es de la forma # [ # ['SIN INFORMACIÓN', :S] # ['FEMENINO', :F] # ['MASCULINO', :M] # ] def self.sexo_opciones dc = convencion_sexo - return [ + [ [dc[:nombre_sininformacion], dc[:sexo_sininformacion].to_sym], [dc[:nombre_femenino], dc[:sexo_femenino].to_sym], - [dc[:nombre_masculino], dc[:sexo_masculino].to_sym] + [dc[:nombre_masculino], dc[:sexo_masculino].to_sym], ] end def self.sexo_opciones_cortas dc = convencion_sexo - return [ + [ [dc[:sexo_sininformacion].to_s, dc[:sexo_sininformacion].to_sym], [dc[:sexo_femenino].to_s, dc[:sexo_femenino].to_sym], - [dc[:sexo_masculino].to_s, dc[:sexo_masculino].to_sym] + [dc[:sexo_masculino].to_s, dc[:sexo_masculino].to_sym], ] end - # Retorna diccionario con convenciones sobre sexo de la forma # { # :S => 'SIN INFORMACIÓN', # :F => 'FEMENINO', # :M => 'MASCULINO' # } def self.sexo_opciones_diccionario dc = convencion_sexo - return [ + [ [dc[:sexo_sininformacion].to_sym, dc[:nombre_sininformacion]], [dc[:sexo_femenino].to_sym, dc[:nombre_femenino]], - [dc[:sexo_masculino].to_sym, dc[:nombre_masculino]] + [dc[:sexo_masculino].to_sym, dc[:nombre_masculino]], ].to_h end - ORIENTACION_OPCIONES = [ - ['SIN INFORMACIÓN', :S], - ['HETEROSEXUAL', :H], - ['LESBIANA', :L], - ['GAY', :G], - ['BISEXUAL', :B], - ['TRANSEXUAL', :T], - ['LGBTQ+', :O] + ["SIN INFORMACIÓN", :S], + ["HETEROSEXUAL", :H], + ["LESBIANA", :L], + ["GAY", :G], + ["BISEXUAL", :B], + ["TRANSEXUAL", :T], + ["LGBTQ+", :O], ] def self.orientacion_opciones_diccionario - Msip::Persona::ORIENTACION_OPCIONES.map {|e| [e[1], e[0]]}.to_h + Msip::Persona::ORIENTACION_OPCIONES.map { |e| [e[1], e[0]] }.to_h end - # Bien sea o no con inverse_of aqui y/o en orgsocial_persona - has_many :orgsocial_persona, foreign_key: "persona_id", - class_name: "Msip::OrgsocialPersona", validate: true - #inverse_of: :persona - belongs_to :clase, class_name: 'Msip::Clase', - foreign_key: "id_clase", validate: true, optional: true - belongs_to :nacional, class_name: "Msip::Pais", - foreign_key: "nacionalde", validate: true, optional: true - belongs_to :departamento, foreign_key: "id_departamento", - validate: true, class_name: "Msip::Departamento", optional: true - belongs_to :municipio, foreign_key: "id_municipio", validate: true, - class_name: "Msip::Municipio", optional: true - belongs_to :pais, class_name: "Msip::Pais", foreign_key: "id_pais", - validate: true, optional: true - belongs_to :tdocumento, class_name: "Msip::Tdocumento", - foreign_key: "tdocumento_id", validate: true, optional: true + has_many :orgsocial_persona, + foreign_key: "persona_id", + class_name: "Msip::OrgsocialPersona", + validate: true + # inverse_of: :persona + belongs_to :clase, + class_name: "Msip::Clase", + foreign_key: "id_clase", + validate: true, + optional: true + belongs_to :nacional, + class_name: "Msip::Pais", + foreign_key: "nacionalde", + validate: true, + optional: true + belongs_to :departamento, + foreign_key: "id_departamento", + validate: true, + class_name: "Msip::Departamento", + optional: true + belongs_to :municipio, + foreign_key: "id_municipio", + validate: true, + class_name: "Msip::Municipio", + optional: true + belongs_to :pais, + class_name: "Msip::Pais", + foreign_key: "id_pais", + validate: true, + optional: true + belongs_to :tdocumento, + class_name: "Msip::Tdocumento", + validate: true, + optional: true - has_many :persona_trelacion1, foreign_key: "persona1", - dependent: :delete_all, + has_many :persona_trelacion1, + foreign_key: "persona1", + dependent: :delete_all, class_name: "Msip::PersonaTrelacion" - has_many :persona_trelacion2, foreign_key: "persona2", - dependent: :delete_all, + has_many :persona_trelacion2, + foreign_key: "persona2", + dependent: :delete_all, class_name: "Msip::PersonaTrelacion" - has_many :personados, through: :persona_trelacion1, - class_name: 'Msip::Persona' + has_many :personados, + through: :persona_trelacion1, + class_name: "Msip::Persona" accepts_nested_attributes_for :personados, reject_if: :all_blank accepts_nested_attributes_for :persona_trelacion1, - reject_if: :all_blank, allow_destroy: true + reject_if: :all_blank, + allow_destroy: true # identificación autogenerada en este y demás modelos (excepto los de # información geográfica). - validates :nombres, presence: true, allow_blank: false, + validates :nombres, + presence: true, + allow_blank: false, length: { maximum: 100 } - validates :apellidos, presence: true, allow_blank: false, + validates :apellidos, + presence: true, + allow_blank: false, length: { maximum: 100 } validates :numerodocumento, length: { maximum: 100 } validates :sexo, presence: true - validates :anionac, :numericality => {:allow_blank => true} - validates :mesnac, :numericality => {:allow_blank => true} - validates :dianac, :numericality => {:allow_blank => true} + validates :anionac, numericality: { allow_blank: true } + validates :mesnac, numericality: { allow_blank: true } + validates :dianac, numericality: { allow_blank: true } validate :vfechanac validate :vformatonumdoc def vformatonumdoc - if (tdocumento && tdocumento.formatoregex != '' && - !(numerodocumento =~ Regexp.new("^#{tdocumento.formatoregex}$"))) - errors.add(:numerodocumento, - "No cumple exp. regular: #{tdocumento.formatoregex}") + if tdocumento && tdocumento.formatoregex != "" && + !(numerodocumento =~ Regexp.new("^#{tdocumento.formatoregex}$")) + menserr = "Número de documento con formato errado." + if tdocumento.ayuda + menserr += " #{tdocumento.ayuda}" + end + errors.add(:numerodocumento, menserr) end end def vfechanac - anioactual= Time.now.strftime("%Y").to_i - if (anionac && anionac>anioactual) - errors.add(:anionac, "Año debe ser menor al actual") + anioactual = Time.now.strftime("%Y").to_i + if anionac && anionac > anioactual + errors.add(:anionac, "Año debe ser menor al actual") end - if (anionac && anionac<1900) + if anionac && anionac < 1900 errors.add(:anionac, "Año debe ser mayor o igual a 1900") end - if (mesnac && (mesnac < 1 || mesnac > 12)) + if mesnac && (mesnac < 1 || mesnac > 12) errors.add(:mesnac, "Mes debe estar entre 1 y 12") end - if (dianac && dianac < 1) + if dianac && dianac < 1 errors.add(:dianac, "Dia debe ser positivo") end - if (dianac && mesnac && mesnac == 2 && dianac > 29) + if dianac && mesnac && mesnac == 2 && dianac > 29 errors.add(:dianac, "Dia debe ser menor o igual a 29") - elsif (dianac && mesnac && (mesnac == 4 || mesnac == 6 || - mesnac == 9 || mesnac == 11) && - dianac > 30) + elsif anionac && mesnac && dianac && mesnac == 2 && dianac == 29 + ud = Date.civil(anionac, mesnac, -1) + if dianac > ud.day + errors.add(:dianac, "Dia debe ser menor o igual a #{ud.day}") + end + elsif dianac && mesnac && (mesnac == 4 || mesnac == 6 || + mesnac == 9 || mesnac == 11) && + dianac > 30 errors.add(:dianac, "Dia debe ser menor o igual a 30") - elsif (dianac && dianac > 31) + elsif dianac && dianac > 31 errors.add(:dianac, "Dia debe ser menor o igual a 31") end end def fechanac r = "" r += anionac.to_s if anionac r += "-" - r += FormatoFechaHelper::ABMESES[mesnac] if mesnac && - mesnac>=1 && mesnac<=12 + r += FormatoFechaHelper::ABMESES[mesnac] if mesnac && + mesnac >= 1 && mesnac <= 12 r += "-" r += dianac.to_s if dianac - return r - + r end def presenta_fechanac r = "" r += dianac.to_s if dianac r += "/" - r += FormatoFechaHelper::ABMESES[mesnac] if mesnac && - mesnac>=1 && mesnac<=12 + r += FormatoFechaHelper::ABMESES[mesnac] if mesnac && + mesnac >= 1 && mesnac <= 12 r += "/" r += anionac.to_s if anionac - return r + r end def fechanac_localizada presenta_fechanac end @@ -219,31 +252,31 @@ r.strip end def msip_presenta(atr) case atr.to_s - when 'centro_poblado' - self.clase ? self.clase.nombre : '' - when 'nacionalde' - nacionalde ? nacional.nombre : '' - when 'sexo' - ds = Msip::Persona::sexo_opciones_diccionario - ds[self.sexo.to_sym] || 'Sexo desconocido' - when 'tdoc' - self.tdocumento.sigla if self.tdocumento + when "centro_poblado" + clase ? clase.nombre : "" + when "nacionalde" + nacionalde ? nacional.nombre : "" + when "sexo" + ds = Msip::Persona.sexo_opciones_diccionario + ds[sexo.to_sym] || "Sexo desconocido" + when "tdoc" + tdocumento&.sigla else presenta_gen(atr) end end def presenta(atr) msip_presenta(atr) end def importa_msip(datosent, datossal, menserror, opciones = {}) - if !datosent.key?(:sexo) - self.sexo = 'S' + unless datosent.key?(:sexo) + self.sexo = "S" end if datosent[:fechanac] r = datosent[:fechanac] # suponemos yyyy-mm-dd @@ -251,11 +284,11 @@ if d self.dianac = d.day self.mesnac = d.month self.anionac = d.year end - datosent.delete :fechanac + datosent.delete(:fechanac) end if datosent[:fechanac_localizada] r = datosent[:fechanac_localizada] # suponemos dd/M/yyy @@ -263,127 +296,128 @@ if d self.dianac = d.day self.mesnac = d.month self.anionac = d.year end - datosent.delete :fechanac_localizada + datosent.delete(:fechanac_localizada) end if datosent[:tdocumento] d = Msip::ImportaHelper.nombre_en_tabla_basica( - Msip::Tdocumento, datosent[:tdocumento], menserror) - if !d.nil? + Msip::Tdocumento, datosent[:tdocumento], menserror + ) + unless d.nil? self.tdocumento_id = d.id end - datosent.delete :tdocumento + datosent.delete(:tdocumento) end if datosent[:pais] pais = Msip::ImportaHelper.nombre_en_tabla_basica( - Msip::Pais, datosent[:pais].upcase, menserror) + Msip::Pais, datosent[:pais].upcase, menserror + ) self.id_pais = pais ? pais.id : nil - datosent.delete :pais + datosent.delete(:pais) end if datosent[:departamento] - if datosent[:departamento] != '' - if self.id_pais.nil? - self.id_pais = Msip::Pais.where(nombre: 'COLOMBIA').take.id + if datosent[:departamento] != "" + if id_pais.nil? + self.id_pais = Msip::Pais.where(nombre: "COLOMBIA").take.id end - d = Msip::Departamento.where( id_pais: self.id_pais).where( - 'upper(unaccent(nombre)) = upper(unaccent(?))', - datosent[:departamento].upcase + d = Msip::Departamento.where(id_pais: id_pais).where( + "upper(unaccent(nombre)) = upper(unaccent(?))", + datosent[:departamento].upcase, ) if d.count == 0 - menserror << " No se encontró departamento '#{datosent[:departamento]}' en el pais '#{Msip::Pais.find(self.id_pais).nombre}'." - else + menserror << " No se encontró departamento '#{datosent[:departamento]}' en el pais '#{Msip::Pais.find(id_pais).nombre}'." + else self.id_departamento = d.take.id end end - datosent.delete :departamento + datosent.delete(:departamento) end - if datosent[:municipio] - if datosent[:municipio] != '' - if self.id_departamento.nil? + if datosent[:municipio] + if datosent[:municipio] != "" + if id_departamento.nil? menserror << " No se puede ubicar municipio #{datosent[:municipio]} sin departamento." else m = Msip::Municipio.where( - id_departamento: self.id_departamento).where( - 'upper(unaccent(nombre)) = upper(unaccent(?))', - datosent[:municipio].upcase + id_departamento: id_departamento, + ).where( + "upper(unaccent(nombre)) = upper(unaccent(?))", + datosent[:municipio].upcase, ) if m.count == 0 - menserror << " No se encontró municipio #{datosent[:municipio]} en el departamento #{Msip::Departamento.find(self.id_departamento).nombre}." - else + menserror << " No se encontró municipio #{datosent[:municipio]} en el departamento #{Msip::Departamento.find(id_departamento).nombre}." + else self.id_municipio = m.take.id end end end - datosent.delete :municipio + datosent.delete(:municipio) end if datosent.keys.include?(:centro_poblado) - if datosent[:centro_poblado] && datosent[:centro_poblado] != '' - if self.id_municipio.nil? + if datosent[:centro_poblado] && datosent[:centro_poblado] != "" + if id_municipio.nil? menserror << " No puede ubicarse centro_poblado #{datosent[:centro_poblado]} sin municipio." else cp = Msip::Clase.where( - id_municipio: self.id_municipio).where( - 'upper(unaccent(nombre))=upper(unaccent(?))', - datosent[:centro_poblado].upcase + id_municipio: id_municipio, + ).where( + "upper(unaccent(nombre))=upper(unaccent(?))", + datosent[:centro_poblado].upcase, ) if cp.count == 0 - menserror << " No se encontró centro poblado #{datosent[:centro_poblado]} en el municipio #{Msip::Municipio.find(self.id_municipio).nombre}." - else - self.id_clase= cp.take.id + menserror << " No se encontró centro poblado #{datosent[:centro_poblado]} en el municipio #{Msip::Municipio.find(id_municipio).nombre}." + else + self.id_clase = cp.take.id end end end - datosent.delete :centro_poblado + datosent.delete(:centro_poblado) end - if datosent[:nacionalde] + if datosent[:nacionalde] self.nacionalde = Msip::ImportaHelper.nombre_en_tabla_basica( - Msip::Pais, datosent[:nacionalde].upcase, menserror) - datosent.delete :nacionalde + Msip::Pais, datosent[:nacionalde].upcase, menserror + ) + datosent.delete(:nacionalde) end importa_gen(datosent, datossal, menserror, opciones) end - def importa(datosent, datossal, menserror, opciones = {}) importa_msip(datosent, datossal, menserror, opciones) end - scope :filtro_nombres, lambda { |n| where("unaccent(nombres) ILIKE '%' || unaccent(?) || '%'", n) } scope :filtro_apellidos, lambda { |a| where("unaccent(apellidos) ILIKE '%' || unaccent(?) || '%'", a) } scope :filtro_numerodocumento, lambda { |n| - where("unaccent(numerodocumento) ILIKE '%' || " + - "unaccent(?) || '%'", n) + where( + "unaccent(numerodocumento) ILIKE '%' || " \ + "unaccent(?) || '%'", + n, + ) } - scope :filtro_tdocumento, lambda {|tid| + scope :filtro_tdocumento, lambda { |tid| where(tdocumento_id: tid.to_i) } scope :filtro_sexo, lambda { |s| where(sexo: s) } - - end # include class_methods do - end - end # Persona end # Models end # Concerns end # Msip -