PHP code example of homlity / sdk-simi

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
}

$detalle = $api->getDetalleInmueble('503-4848');

if ($detalle === null) {
    http_response_code(404);
    exit('Inmueble no disponible');
}

echo $detalle->tipoInmueble();     // "APARTAMENTO"
echo $detalle->areaConstruida();   // "85"
echo $detalle->descripcion();

foreach ($detalle->fotos() as $foto) {
    echo '<img src="' . htmlspecialchars($foto['foto']) . '">';
}

$asesor = $detalle->asesor();
if ($asesor !== null) {
    echo $asesor->nombre(), ' - ', $asesor->celular();
}

$r = $api->getInmuebles([
    'departamento' => 5,
    'ciudad'       => 1,
    'barrio'       => 320,
    'tipoInm'      => 1,
    'tipOper'      => 2,
    'valmin'       => 200000000,
    'valmax'       => 600000000,
    'alcobas'      => 3,
    'total'        => 12,
    'limite'       => 2,
]);

$detalle = $api->getDetalleInmueble('503-4848');
if ($detalle === null) { /* 404 */ }

$destacados = $api->getInmueblesDestacados(['total' => 6])['inmuebles'];

header('Content-Type: application/json');
echo json_encode($api->getCiudades(5));   // [{"id":"1","nombre":"MEDELLIN"}, ...]

foreach ($api->getTiposInmueble() as $tipo) {
    printf("%s (%d)\n", $tipo->nombre(), $tipo->totalInmuebles());
}

$r = $api->getAsesores(['cantidad' => 12, 'limite' => 1]);
foreach ($r['asesores'] as $asesor) {
    echo $asesor->nombre(), ' · ', $asesor->email(), ' · ', $asesor->celular();
}
echo 'Total: ' . $r['paginador']->total();

$disponibles = $api->getEstadoInmueble(1, 2);

$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

$totalPaginas = 0;
if ($p !== null && $p->totalPorPagina() > 0) {
    $totalPaginas = (int) ceil($p->totalInmuebles() / $p->totalPorPagina());
}


er('Content-Type: application/json; charset=utf-8');

$api = (new ApiFactory())->make();     // tu propia fábrica, ver §13

switch ($_GET['recurso'] ?? '') {
    case 'departamentos':
        echo json_encode($api->getDepartamentos());
        break;
    case 'ciudades':
        echo json_encode($api->getCiudades((int) $_GET['idDepartamento']));
        break;
    case 'barrios':
        echo json_encode($api->getBarrios((int) $_GET['idCiudad']));
        break;
    case 'tipos':
        echo json_encode($api->getTiposInmueble());
        break;
    case 'gestiones':
        echo json_encode($api->getGestionesInmueble());
        break;
    default:
        http_response_code(400);
        echo json_encode(['error' => 'recurso no válido']);
}

$permitidos = ['departamento','ciudad','zona','barrio','tipoInm','tipOper',
               'areamin','areamax','valmin','valmax','banios','garajes','alcobas'];

$filtros = array_intersect_key($_GET, array_flip($permitidos));
$filtros = array_filter($filtros, fn($v) => $v !== '' && $v !== null);

$filtros['total']  = 12;
$filtros['limite'] = max(1, (int) ($_GET['page'] ?? 1));

try {
    $resultado = $api->getInmuebles($filtros);
} catch (\Exception $e) {
    error_log('[SIMI] ' . $e->getMessage());
    $resultado = ['inmuebles' => [], 'paginador' => null];
}

$detalle = $api->getDetalleInmueble($_GET['codigo'] ?? '');

if ($detalle === null) {
    http_response_code(404);
    similares = (new ObtenedorInmueblesSimilaresService($api))->obtener($detalle, 5);
$columnas  = $detalle->caracteristicasPorColumnas(3);

$inmueble->valorVenta();        // "350.000.000"  → para mostrar
$inmueble->valorVenta(false);   // "350000000"    → para comparar, ordenar o JSON-LD

$schema = [
    '@context' => 'https://schema.org',
    '@type'    => 'RealEstateListing',
    'name'     => $detalle->nombre(),
    'url'      => 'https://tusitio.com/inmueble/' . $detalle->identificacion(),
    'image'    => array_column($detalle->fotos() ?: [], 'foto'),
    'offers'   => [
        '@type'         => 'Offer',
        'price'         => $detalle->valorVenta(false),
        'priceCurrency' => 'COP',
    ],
];
echo '<script type="application/ld+json">' . json_encode($schema) . '</script>';

$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]);
    }
}


// wp-content/plugins/simi-inmuebles/simi-inmuebles.php
n simi_api() {
    static $api = null;
    if ($api === null) {
        $api = new ApiFachada(defined('SIMI_TOKEN') ? SIMI_TOKEN : getenv('SIMI_TOKEN'));
    }
    return $api;
}

function simi_destacados_shortcode($atts) {
    $atts = shortcode_atts(['total' => 6], $atts);
    $key  = 'simi_destacados_' . (int) $atts['total'];

    $inmuebles = get_transient($key);
    if ($inmuebles === false) {
        try {
            $inmuebles = simi_api()->getInmueblesDestacados(['total' => (int) $atts['total']])['inmuebles'];
        } catch (\Exception $e) {
            error_log('[SIMI] ' . $e->getMessage());
            return '';
        }
        set_transient($key, $inmuebles, 15 * MINUTE_IN_SECONDS);
    }

    ob_start(); 

define('SIMI_TOKEN', 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0-503');



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
}

try {
    $resultado = $api->getInmuebles($filtros);
} catch (\Exception $e) {
    error_log('[SIMI] ' . $e->getMessage());
    $resultado = ['inmuebles' => [], 'paginador' => null];
}

$api      = new \Homlity\SIMI\SDK\InfraStructure\API\ApiFachada($token);
$apiModel = new \Homlity\SIMI\SDK\Domain\API\ApiModelRepositoryFachada($token);

$fotos = $detalle->fotos() ?: [];
$portada = $fotos ? $fotos[0]['foto'] : '/img/placeholder.jpg';


return [
    "token-simi"            => "TU_TOKEN_REAL-503",
    "property-detail-code"  => "503-4848",
];

use Homlity\SIMI\SDK\Domain\API\ApiFachadaRepository;
use Homlity\SIMI\SDK\InfraStructure\Modelos\InmueblePreview;

class ApiSimiFake extends ApiFachadaRepository
{
    public function getInmuebles(array $filters = [])
    {
        return [
            'inmuebles' => [new InmueblePreview([
                'Codigo_Inmueble' => '503-1',
                'Tipo_Inmueble'   => 'APARTAMENTO',
                'Barrio'          => 'LAURELES',
                'Ciudad'          => 'MEDELLIN',
                'Venta'           => '$ 350.000.000',
                'Canon'           => '0',
                'Alcobas'         => '3',
                'banios'          => '2',
            ])],
            'paginador' => null,
        ];
    }

    public function getDetalleInmueble($codigoInmueble)      { return null; }
    public function getDepartamentos()                        { return []; }
    public function getCiudades($idDepartamento)              { return []; }
    public function getBarrios($idCiudad)                     { return []; }
    public function getInmueblesDestacados(array $f = [])     { return ['inmuebles' => [], 'paginador' => null]; }
    public function getAsesores(array $f = [])                { return ['asesores' => [], 'paginador' => null]; }
    public function getTiposInmueble()                        { return []; }
    public function getGestionesInmueble()                    { return []; }
}
bash
composer install
cp tests/testing.env.php.example tests/testing.env.php