Skip to content

Instantly share code, notes, and snippets.

@jusk02
Created April 3, 2017 23:37
Show Gist options
  • Save jusk02/62b80205e8b41153487dc2f443f23cb1 to your computer and use it in GitHub Desktop.
Save jusk02/62b80205e8b41153487dc2f443f23cb1 to your computer and use it in GitHub Desktop.
class Profile
include ActiveModel::Model
# include ActiveModel::Serializers::JSON
include ActiveModel::AttributeMethods
include ActiveModel::Dirty
# include ActiveModel::Validations
def initialize(params= {})
@avatar = params['avatar']
@id = params['id']
@usuarioId = params['usuarioId']
@nombres = apply_object(params['nombres'], "Nombre")
@nombres_id_ant = @nombres.id
@estadosCiviles = apply_object(params['estadosCiviles'], "EstadoCivil")
@estadosCiviles_id_ant = @estadosCiviles.id
@datosGenerales = apply_object(params['datosGenerales'], "DatoGeneral")
@datosGenerales_id_ant = @datosGenerales.id
@datosNacimiento = apply_object(params['datosNacimiento'], "DatoNacimiento")
@datosNacimiento_id_ant = @datosNacimiento.id
@nacionalidades = apply_object(params['nacionalidades'], "Nacionalidad")
@nacionalidades_id_ant = @nacionalidades.id
@direcciones = apply_object(params['direcciones'], "Direccion")
@direcciones_id_ant = @direcciones.id
@identificaciones = apply_object(params['identificaciones'], "Identificacion")
@identificaciones_id_ant = @identificaciones.id
@entidadesPrestadorasSalud = apply_object(params['entidadesPrestadorasSalud'], "EntidadPrestadoraSalud")
@entidadesPrestadorasSalud_id_ant = @entidadesPrestadorasSalud.id
# @errors = ActiveModel::Errors.new(self)
end
define_attribute_methods :avatar, :id, :usuarioId, :nombres, :estadosCiviles,:datosGenerales, :datosNacimiento, :nacionalidades, :direcciones,
:identificaciones, :entidadesPrestadorasSalud
# #for :Serializers:JSON
# def attributes
# {'id' => id, 'nombres' => nombres}
# end
#asigna los atributos tipo objeto de la clase profile que envian en la instancia (initialize)
#recibe la clase del objeto y el hash de datos de los atributos del objeto
def apply_object(array, klass)
#se convierte el string con el nombre de la clase a la constante clase para que pueda llamar los métodos
klass = Object.const_get(klass)
return klass.new if array.empty?
hash = array.last
klass.new(hash)
end
#inicio set y get attributes -necesarios para ActiveModel:Dirty self.changed-
def avatar=(val)
avatar_will_change! unless val == @avatar
@avatar = val
end
def nombres=(val)
val.each do |k,v|
#si alguno de los valores de nombres cambia ejecuta nombres_will_change! que identifica que ese atributo cambio de valor
if @nombres.send("#{k}") != val[k]
nombres_will_change! unless @nombres.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@nombres = @nombres.assign_params(val)
end
def estadosCiviles=(val)
val.each do |k,v|
#si alguno de los valores de estadosCiviles cambia ejecuta estadosCiviles_will_change! que identifica que ese atributo cambio de valor
if @estadosCiviles.send("#{k}") != val[k]
estadosCiviles_will_change! unless @estadosCiviles.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@estadosCiviles = @estadosCiviles.assign_params(val)
end
def datosGenerales=(val)
val.each do |k,v|
#si alguno de los valores de datosGenerales cambia ejecuta datosGenerales_will_change! que identifica que ese atributo cambio de valor
if @datosGenerales.send("#{k}") != val[k]
datosGenerales_will_change! unless @datosGenerales.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@datosGenerales = @datosGenerales.assign_params(val)
end
def datosNacimiento=(val)
val.each do |k,v|
#si alguno de los valores de datosNacimiento cambia ejecuta datosNacimiento_will_change! que identifica que ese atributo cambio de valor
if @datosNacimiento.send("#{k}") != val[k]
datosNacimiento_will_change! unless @datosNacimiento.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@datosNacimiento = @datosNacimiento.assign_params(val)
end
def nacionalidades=(val)
val.each do |k,v|
#si alguno de los valores de nacionalidades cambia ejecuta nacionalidades_will_change! que identifica que ese atributo cambio de valor
if @nacionalidades.send("#{k}") != val[k]
nacionalidades_will_change! unless @nacionalidades.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@nacionalidades = @nacionalidades.assign_params(val)
end
def direcciones=(val)
val.each do |k,v|
#si alguno de los valores de direcciones cambia ejecuta direcciones_will_change! que identifica que ese atributo cambio de valor
if @direcciones.send("#{k}") != val[k]
direcciones_will_change! unless @direcciones.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@direcciones = @direcciones.assign_params(val)
end
def identificaciones=(val)
val.each do |k,v|
#si alguno de los valores de identificaciones cambia ejecuta identificaciones_will_change! que identifica que ese atributo cambio de valor
if @identificaciones.send("#{k}") != val[k]
identificaciones_will_change! unless @identificaciones.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@identificaciones = @identificaciones.assign_params(val)
end
def entidadesPrestadorasSalud=(val)
val.each do |k,v|
#si alguno de los valores de entidadesPrestadorasSalud cambia ejecuta entidadesPrestadorasSalud_will_change! que identifica que ese atributo cambio de valor
if @entidadesPrestadorasSalud.send("#{k}") != val[k]
entidadesPrestadorasSalud_will_change! unless @entidadesPrestadorasSalud.send("#{k}").nil? && val[k].empty?
break
end
end
val[:perfilId] = @id
@entidadesPrestadorasSalud = @entidadesPrestadorasSalud.assign_params(val)
end
def id
@id
end
def avatar
@avatar
end
def nombres
@nombres
end
def estadosCiviles
@estadosCiviles
end
def datosNacimiento
@datosNacimiento
end
def datosGenerales
@datosGenerales
end
def nacionalidades
@nacionalidades
end
def direcciones
@direcciones
end
def identificaciones
@identificaciones
end
def entidadesPrestadorasSalud
@entidadesPrestadorasSalud
end
#fin -necesarios para ActiveModel:Dirty self.changed-
def nombrescompletos
"#{self.nombres.primerNombre} #{self.nombres.segundoNombre} #{self.nombres.primerApellido} #{self.nombres.segundoApellido}"
end
#calculo de edad del perfil
def age
now = Time.now.utc.to_date
date_born = self.datosNacimiento.fechaNacimiento
return 0 unless date_born.present?
date_born = DateTime.parse date_born
now.year - date_born.year - ((now.month > date_born.month || (now.month == date_born.month && now.day >= date_born.day)) ? 0 : 1)
end
#inicio -necesarios para nested form-
def nombres_attributes=(attributes)
@nombres ||= {}
@nombres = Nombre.new(attribute)
end
def estadosCiviles_attributes=(attributes)
@estadosCiviles ||= {}
@estadosCiviles =EstadosCivil.new(attributes)
end
def datosGenerales_attributes=(attributes)
@datosGenerales ||= {}
attributes[:perfilId] = @id
@datosGenerales =DatoGeneral.new(attributes)
end
def datosNacimiento_attributes=(attributes)
@datosNacimiento ||= {}
@datosNacimiento =DatoNacimiento.new(attributes)
end
def nacionalidades_attributes=(attributes)
@nacionalidades ||= {}
@nacionalidades =Nacionalidad.new(attributes)
end
def direcciones_attributes=(attributes)
@direcciones ||= {}
@direcciones =Direccion.new(attributes)
end
def identificaciones_attributes=(attributes)
@identificaciones ||= {}
@identificaciones =Identificacion.new(attributes)
end
def entidadesPrestadorasSalud_attributes=(attributes)
@entidadesPrestadorasSalud ||= {}
@entidadesPrestadorasSalud =EntidadPrestadoraSalud.new(attributes)
end
#fin -necesarios para nested form-
def self.find(id_perfil,access_token)
response = ApiConecction.get("/Perfiles/getUltimoPerfil",access_token,{idUsuario: id_perfil})
data_or_error = response.extract_data_or_message_error_from_response_api
@profile = Profile.new(data_or_error['perfil']) if response.successful?
@profile
end
def update(params = {}, access_token)
self.nombres = params[:nombres_attributes]
self.estadosCiviles = params[:estadosCiviles_attributes]
self.datosGenerales = params[:datosGenerales_attributes]
self.datosNacimiento = params[:datosNacimiento_attributes]
self.nacionalidades = params[:nacionalidades_attributes]
self.direcciones = params[:direcciones_attributes]
self.identificaciones = params[:identificaciones_attributes]
self.entidadesPrestadorasSalud = params[:entidadesPrestadorasSalud_attributes]
p self.changed
p self.changes
send_endpoint(self.changed,access_token)
changes_applied
end
def send_endpoint(endpoints,access_token)
endpoints.each do |endpoint|
case endpoint
when 'nombres'
Nombre.new(self.nombres).create(access_token,@nombres_id_ant)
when 'estadosCiviles'
EstadoCivil.new(self.estadosCiviles).create(access_token,@estadosCiviles_id_ant)
when 'datosGenerales'
DatoGeneral.new(self.datosGenerales).create(access_token,@datosGenerales_id_ant)
when 'datosNacimiento'
DatoNacimiento.new(self.datosNacimiento).create(access_token,@datosNacimiento_id_ant)
when 'nacionalidades'
Nacionalidad.new(self.nacionalidades).create(access_token,@nacionalidades_id_ant)
when 'direcciones'
Direccion.new(self.direcciones).create(access_token,@direcciones_id_ant)
when 'identificaciones'
Identificacion.new(self.identificaciones).create(access_token,@identificaciones_id_ant)
when 'entidadesPrestadorasSalud'
EntidadPrestadoraSalud.new(self.entidadesPrestadorasSalud).create(access_token,@entidadesPrestadorasSalud_id_ant)
end
end
end
#para saber si el objeto no es nuevo , lo utiliza el form_for para elegir la ruta del sumbit
def persisted?
self.id.present?
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment