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
-