'decimal:6', 'lng' => 'decimal:6', 'preference_level' => 'integer', ]; /** * Relación polimórfica con cualquier modelo (User, Empresa, etc.) */ public function contactable() { return $this->morphTo(); } /** * Obtiene el país de la dirección basado en el catálogo SAT */ public function country() { return $this->belongsTo(SatPais::class, 'c_pais', 'c_pais'); } /** * Obtiene el estado basado en el catálogo SAT */ public function state() { return $this->belongsTo(SatEstado::class, ['c_estado', 'c_pais'], ['c_estado', 'c_pais']); } /** * Obtiene el municipio basado en el catálogo SAT */ public function municipality() { return $this->belongsTo(SatMunicipio::class, ['c_municipio', 'c_estado'], ['c_municipio', 'c_estado']); } /** * Obtiene la localidad basada en el catálogo SAT */ public function locality() { return $this->belongsTo(SatLocalidad::class, ['c_localidad', 'c_estado'], ['c_localidad', 'c_estado']); } /** * Obtiene la colonia basada en el catálogo SAT */ public function neighborhood() { return $this->belongsTo(SatColonia::class, ['c_colonia', 'c_codigo_postal'], ['c_colonia', 'c_codigo_postal']); } /** * Define si la dirección es preferida */ public function isPreferred() { return $this->preference_level === 1; } /** * Devuelve la dirección en formato legible */ public function getFullAddressAttribute() { return "{$this->direccion}, {$this->num_ext}" . ($this->num_int ? " Int. {$this->num_int}" : '') . ", {$this->neighborhood->nombre ?? ''}, {$this->municipality->nombre ?? ''}, {$this->state->nombre ?? ''}, {$this->country->nombre ?? ''}"; } }