unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion === 'departamento';})); } public function estacionamientos(): array { return array_values(array_filter($this->unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion === 'estacionamiento';})); } public function bodegas(): array { return array_values(array_filter($this->unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion === 'bodega';})); } protected float $vendible; public function vendible(): float { return array_reduce($this->departamentos(), function(float $sum, Unidad $unidad) { return $sum + $unidad->proyectoTipoUnidad->vendible(); }, 0); } public function summary(): string { return implode(' - ', array_merge( array_map(function(Unidad $unidad) { return $unidad->descripcion; }, $this->departamentos()), array_map(function(Unidad $unidad) { return "E{$unidad->descripcion}"; }, $this->estacionamientos()), array_map(function(Unidad $unidad) { return "B{$unidad->descripcion}"; }, $this->bodegas()) )); } public function jsonSerialize(): mixed { return [ 'departamentos' => $this->departamentos(), 'estacionamientos' => $this->estacionamientos(), 'bodegas' => $this->bodegas(), 'summary' => $this->summary() ]; } }