1. Go to this page and download the library: Download homlity/sdk-simi library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
homlity / sdk-simi example snippets
use Homlity\SIMI\SDK\Domain\Providers\TokenServiceProviderRespository;
class TokenSimiProvider implements TokenServiceProviderRespository
{
public function getToken(): string
{
return getenv('SIMI_TOKEN');
}
}
omlity\SIMI\SDK\Domain\Providers\ApiServiceProvider;
$provider = ApiServiceProvider::build();
$provider->setTokenProvider(new TokenSimiProvider()); // valida el token aquí
$api = $provider->getAPi(); // instancia de ApiFachada
> $api = new \Homlity\SIMI\SDK\InfraStructure\API\ApiFachada(getenv('SIMI_TOKEN'));
>
$resultado = $api->getInmuebles([
'ciudad' => 5,
'tipOper' => 1, // gestión: venta/arriendo según la inmobiliaria
'total' => 12, // registros por página
'limite' => 1, // página
]);
/** @var \Homlity\SIMI\SDK\InfraStructure\Modelos\InmueblePreview[] $inmuebles */
$inmuebles = $resultado['inmuebles'];
/** @var \Homlity\SIMI\SDK\InfraStructure\Modelos\PaginadorInmueblePreview|null $paginador */
$paginador = $resultado['paginador'];
foreach ($inmuebles as $inmueble) {
echo $inmueble->nombre(), PHP_EOL; // "Apartamento - El Poblado, Medellín"
echo $inmueble->identificacion(), PHP_EOL; // "503-4848"
echo $inmueble->valorVenta(), PHP_EOL; // "350.000.000"
echo $inmueble->fotoPortada(), PHP_EOL; // URL de la foto principal
}
$c->id(); // id de la característica
$c->descripcion(); // "Cocina integral"
$c->cantidad(); // "1"
$c->observacion(); // texto libre
$asesor->id(); // string
$asesor->nombre();
$asesor->celular();
$asesor->email();
$asesor->foto(); // URL
$asesor->raw(); // array crudo, por si necesitas un campo no mapeado
use Homlity\SIMI\SDK\Application\ObtenedorInmueblesSimilaresService;
$servicio = new ObtenedorInmueblesSimilaresService($api);
// A partir del código:
$similares = $servicio->obtenerConCodigo('503-4848'); // array (vacío si no existe)
// O si ya tienes el detalle cargado (evita una petición extra):
$similares = $servicio->obtener($detalle, 5); // hasta 4 resultados
use Homlity\SIMI\SDK\Application\ObtenedorUrlFichaInmuebleService;
$url = (new ObtenedorUrlFichaInmuebleService())->getUrl($inmueblePreview);
// https://simicrm.app/mcomercialweb/fichas_tecnicas/fichatec3.php?reg=503-4848
use Homlity\SIMI\SDK\Application\Models\PaginatorHTML;
$paginador = $resultado['paginador'];
$html = new PaginatorHTML(
$paginador->totalInmuebles(), // total de registros
$paginador->totalPorPagina(), // registros por página
$paginador->paginaActual(), // página actual
'/inmuebles?page=__PAGENUMBER__' // patrón de URL
);
$html->setMaxPagesToShow(7);
echo $html->toHtml();
// o si prefieres maquetar tú:
foreach ($html->getPages() as $page) {
// ['num' => 3, 'url' => '/inmuebles?page=3', 'isCurrent' => false]
}
$p = $resultado['paginador'];
$p->paginaActual(); // int — página actual
$p->totalInmuebles(); // int — total de registros del filtro
$p->totalPorPagina(); // int — registros por página
$p->numeroPaginaInicio(); // int
$p->numeroPaginaFin(); // int
$pagina = 1;
$porPagina = 50;
do {
$r = $api->getInmuebles(['total' => $porPagina, 'limite' => $pagina]);
foreach ($r['inmuebles'] as $inmueble) {
fputcsv($salida, [
$inmueble->identificacion(),
$inmueble->tipoInmueble(),
$inmueble->ciudad(),
$inmueble->barrio(),
$inmueble->valorVenta(false),
$inmueble->areaConstruida(),
]);
}
$hayMas = $r['paginador'] !== null
&& ($pagina * $porPagina) < $r['paginador']->totalInmuebles();
$pagina++;
usleep(200000); // sé amable con el API
} while ($hayMas);
return [
'token' => env('SIMI_TOKEN'),
];
namespace App\Services\Simi;
use Homlity\SIMI\SDK\Domain\Providers\TokenServiceProviderRespository;
class TokenSimiProvider implements TokenServiceProviderRespository
{
public function getToken(): string
{
return (string) config('simi.token');
}
}
namespace App\Providers;
use App\Services\Simi\TokenSimiProvider;
use Illuminate\Support\ServiceProvider;
use Homlity\SIMI\SDK\Domain\API\ApiFachadaRepository;
use Homlity\SIMI\SDK\InfraStructure\API\ApiFachada;
class SimiServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(ApiFachadaRepository::class, function () {
return new ApiFachada((new TokenSimiProvider())->getToken());
});
}
}
namespace App\Http\Controllers;
use Homlity\SIMI\SDK\Domain\API\ApiFachadaRepository;
use Illuminate\Http\Request;
class InmuebleController extends Controller
{
public function __construct(private ApiFachadaRepository $simi) {}
public function index(Request $request)
{
$filtros = $request->only([
'ciudad', 'barrio', 'tipoInm', 'tipOper', 'valmin', 'valmax', 'alcobas',
]);
$filtros = array_filter($filtros);
$filtros['total'] = 12;
$filtros['limite'] = max(1, (int) $request->query('page', 1));
$resultado = cache()->remember(
'simi:inmuebles:' . md5(serialize($filtros)),
now()->addMinutes(10),
fn () => $this->simi->getInmuebles($filtros)
);
return view('inmuebles.index', $resultado);
}
public function show(string $codigo)
{
$detalle = $this->simi->getDetalleInmueble($codigo);
abort_if($detalle === null, 404);
return view('inmuebles.show', ['inmueble' => $detalle]);
}
}
use Homlity\SIMI\SDK\Domain\API\ApiFachadaRepository;
class ApiSimiCacheado extends ApiFachadaRepository
{
public function __construct(
private ApiFachadaRepository $inner,
private \Psr\SimpleCache\CacheInterface $cache,
private int $ttl = 600
) {
parent::__construct($inner->getToken());
}
private function recordar(string $key, callable $fn)
{
$key = 'simi.' . md5($key);
$hit = $this->cache->get($key);
if ($hit !== null) {
return $hit;
}
$valor = $fn();
$this->cache->set($key, $valor, $this->ttl);
return $valor;
}
public function getInmuebles(array $filters = [])
{
return $this->recordar('inmuebles' . serialize($filters),
fn () => $this->inner->getInmuebles($filters));
}
public function getDetalleInmueble($codigoInmueble)
{
return $this->recordar('detalle' . $codigoInmueble,
fn () => $this->inner->getDetalleInmueble($codigoInmueble));
}
public function getDepartamentos() { return $this->recordar('deptos', fn () => $this->inner->getDepartamentos()); }
public function getCiudades($id) { return $this->recordar('ciudades'.$id, fn () => $this->inner->getCiudades($id)); }
public function getBarrios($id) { return $this->recordar('barrios'.$id, fn () => $this->inner->getBarrios($id)); }
public function getInmueblesDestacados(array $f = []) { return $this->recordar('destacados'.serialize($f), fn () => $this->inner->getInmueblesDestacados($f)); }
public function getAsesores(array $f = []) { return $this->recordar('asesores'.serialize($f), fn () => $this->inner->getAsesores($f)); }
public function getTiposInmueble() { return $this->recordar('tipos', fn () => $this->inner->getTiposInmueble()); }
public function getGestionesInmueble() { return $this->recordar('gestiones', fn () => $this->inner->getGestionesInmueble()); }
}
$r = $api->getInmuebles($filtros);
if (empty($r['inmuebles'])) {
// Puede ser "sin resultados" O una caída del API. Trátalo como estado vacío.
}
$detalle = $api->getDetalleInmueble($codigo);
if ($detalle === null) {
// 404 o API caído
}