~danielside/rptfront

705f253118c65ce874c7c45988bbe2177288b1f6 — Danielside 1 year, 2 months ago d4d726d + e2a7c7c
Merge branch 'fix/filtros' into 'develop'

Puestos sin grupo y sin nivel y ordenación básica

See merge request danielside/rpt-front!15
M lib/Db/Organismo.php => lib/Db/Organismo.php +4 -3
@@ 2,7 2,8 @@
namespace Rpt\Db;

use Rpt\Db\Entidad;
    
use \PDO;

class Organismo extends Entidad
{
    private function getRootQueryStart()


@@ 23,7 24,7 @@ class Organismo extends Entidad
    {
        $sth = $this->db->prepare("SELECT * FROM ministerio ORDER BY denominacion");
        $sth->execute();
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }

    public function find($id, $centroDirectivo = null)


@@ 38,7 39,7 @@ class Organismo extends Entidad

        $sth = $this->db->prepare($query);
        $sth->execute($parametros);
        $ministerio = $sth->fetchAll();
        $ministerio = $sth->fetchAll(PDO::FETCH_ASSOC);

        return $ministerio;
    }

M lib/Db/Pais.php => lib/Db/Pais.php +2 -1
@@ 2,6 2,7 @@
namespace Rpt\Db;

use Rpt\Db\Entidad;
use \PDO;
    
class Pais extends Entidad
{


@@ 9,6 10,6 @@ class Pais extends Entidad
    {
        $sth = $this->db->prepare("SELECT * FROM pais ORDER BY nombre");
        $sth->execute();
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }
}

M lib/Db/Provincia.php => lib/Db/Provincia.php +6 -5
@@ 2,20 2,21 @@
namespace Rpt\Db;

use Rpt\Db\Entidad;
    
use \PDO;

class Provincia extends Entidad
{
    public function all()
    {
        $sth = $this->db->prepare("SELECT * FROM provincia ORDER BY nombre");
        $sth->execute();
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }

    public function find($id) {
        $sth = $this->db->prepare("SELECT * FROM provincia WHERE codigo = :id_provincia");
        $sth->execute(['id_provincia' => $id]);
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }

    private function clausulaGrupo($grupo) {


@@ 44,7 45,7 @@ class Provincia extends Entidad

        $sth = $this->db->prepare($consulta);
        $sth->execute(['id_provincia' => $idProvincia]);
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }

    public function estructuraResumida($idProvincia, $grupo = null) {


@@ 57,7 58,7 @@ class Provincia extends Entidad

        $sth = $this->db->prepare($consulta);
	$sth->execute(['id_provincia' => $idProvincia]);
	return $sth->fetchAll();
	return $sth->fetchAll(PDO::FETCH_ASSOC);
    }
    
}

M lib/Db/Puesto.php => lib/Db/Puesto.php +55 -13
@@ 3,13 3,15 @@ namespace Rpt\Db;

use Rpt\Db\Entidad;
use Rpt\Db\Retribucion;


use \PDO;
use Rpt\SearchCriteria\ISearchPuestoCriteria;
use Rpt\OrderCriteria\IOrderPuestoCriteria;

class Puesto extends Entidad
{
    private $criteria;
    private $orderCriteria;
    public $orderByNormalizado;
    private $pageSize;
    private $totalPages;
    private $totalEncontrados;


@@ 24,7 26,6 @@ class Puesto extends Entidad
        $this->pageSize = 50;
        $this->totalEncontrados = 0;


        $this->retribuciones = new Retribucion($db);
    }



@@ 62,6 63,11 @@ class Puesto extends Entidad
        $this->criteria[] = $criteria;
    }

    public function addOrderCriteria(IOrderPuestoCriteria $criteria)
    {
        $this->orderCriteria[] = $criteria;
    }

    public function search($page = 1)
    {
        $query = $this->getRootQueryStart();


@@ 78,11 84,40 @@ class Puesto extends Entidad
            $substitutions = array_merge($substitutions, $criteria->getSubstitutions());
        }

        $query .= " ORDER BY puesto.nivel, puesto.ministerio_id, puesto.centrodirectivo_id, puesto.unidad_id";
        $queryDefaultOrderBy = " ORDER BY puesto.nivel asc, puesto.ministerio_id asc, puesto.centrodirectivo_id asc, puesto.unidad_id asc";

        $queryOrderBy = " ORDER BY ";
        $orderByNormalizado = [];
        if (count($this->orderCriteria) == 0) {
            $queryOrderBy = $queryDefaultOrderBy;
        } else {
            foreach ($this->orderCriteria as $oc) {
                if (!isset($orderByNormalizado[$oc->getCampo()])) {
                    $orderByNormalizado[$oc->getCampo()] = $oc;
                }
            }
        }

        $this->orderByNormalizado = $orderByNormalizado;

        if (empty($orderByNormalizado)) {
            $queryOrderBy = $queryDefaultOrderBy;
        } else {
            $firstOrderBy = true;
            foreach ($orderByNormalizado as $oc) {
                if (!$firstOrderBy) {
                    $queryOrderBy .= ", ";
                }
                $queryOrderBy .= $oc->getSQLFragment();
                $firstOrderBy = false;
            }
        }

        $query = $query .= $queryOrderBy;

        $sth = $this->db->prepare($query);
        $sth->execute($substitutions);
        $allRecords = $sth->fetchAll();
        $allRecords = $sth->fetchAll(PDO::FETCH_ASSOC);

        $totalRecords = count($allRecords);
        $this->setTotalEncontrados($totalRecords);


@@ 102,15 137,18 @@ class Puesto extends Entidad
        return $recordsSlice;
    }

    public function getTotalEncontrados() {
    public function getTotalEncontrados()
    {
      return $this->totalEncontrados;
    } 

    public function setTotalEncontrados($t) {
    public function setTotalEncontrados($t)
    {
      $this->totalEncontrados = $t;
    }

    private function calculateSingleSalary($especifico, $grupo, $nivel, $sueldosGrupo, $complementosDestino) {
    private function calculateSingleSalary($especifico, $grupo, $nivel, $sueldosGrupo, $complementosDestino)
    {
      $total = 0;

      if (key_exists($grupo, $sueldosGrupo) && key_exists($nivel, $complementosDestino)) {


@@ 122,7 160,8 @@ class Puesto extends Entidad
      return $total;
    }

    private function calculateSalary($especifico, $grupo, $nivel, $sueldosGrupo, $complementosDestino) {
    private function calculateSalary($especifico, $grupo, $nivel, $sueldosGrupo, $complementosDestino)
    {
      $salaries = [];

      $isA1Group = (FALSE !== strpos($grupo, 'A1'));


@@ 154,7 193,8 @@ class Puesto extends Entidad
     * Recorre el array de todos los registros de la tabla de salarios creando
     * arrays separados de sueldos y de complementos de destino
     */
    private function filterSueldosComplementos($tablas) {
    private function filterSueldosComplementos($tablas)
    {
      $sueldos = [];
      $complementos = [];



@@ 170,7 210,8 @@ class Puesto extends Entidad
      return [$sueldos, $complementos];
    }
 
    private function updateResultsWithSalaries($records) {
    private function updateResultsWithSalaries($records)
    {
      $sliceWithSalaries = [];

      $tablasSalariales = $this->retribuciones->all();


@@ 190,7 231,8 @@ class Puesto extends Entidad
      return $sliceWithSalaries;
    }

    private function updateSingleResultWithSalary($record) {
    private function updateSingleResultWithSalary($record)
    {
      $records = [];
      $records[0] = $record;
      $records = $this->updateResultsWithSalaries($records);


@@ 239,6 281,6 @@ class Puesto extends Entidad
    {
        $sth = $this->db->prepare("select distinct(grupo) from puesto order by grupo");
        $sth->execute();
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }
}

M lib/Db/Retribucion.php => lib/Db/Retribucion.php +3 -2
@@ 2,13 2,14 @@
namespace Rpt\Db;

use Rpt\Db\Entidad;
    
use \PDO;

class Retribucion extends Entidad
{
    public function all()
    {
        $sth = $this->db->prepare("SELECT * FROM retribuciones");
        $sth->execute();
        return $sth->fetchAll();
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }
}

A lib/OrderCriteria/IOrderPuestoCriteria.php => lib/OrderCriteria/IOrderPuestoCriteria.php +15 -0
@@ 0,0 1,15 @@
<?php
namespace Rpt\OrderCriteria;

interface IOrderPuestoCriteria
{
    public function getSQLFragment();

    public function getCampo(): string;
    
    /**
     * The criteria returns the clause with parameter markers
     * so it requires further subst. in execution
     */
    public function getSubstitutions();
}

A lib/OrderCriteria/OrderPuestoCriteria.php => lib/OrderCriteria/OrderPuestoCriteria.php +31 -0
@@ 0,0 1,31 @@
<?php
namespace Rpt\OrderCriteria;

use Rpt\OrderCriteria\IOrderPuestoCriteria as IOrderPuestoCriteria;

class OrderPuestoCriteria implements IOrderPuestoCriteria
{
    private $campo;
    private $direccion;

    public function __construct($campo, $direccion = 'asc')
    {
        $this->campo = $campo;
        $this->direccion = $direccion;
    }

    public function getCampo(): string
    {
        return $this->campo;
    }

    public function getSQLFragment()
    {
        return $this->campo . " " . $this->direccion;
    }

    public function getSubstitutions()
    {
        return [];
    }
}

M lib/SearchCriteria/GrupoPuestoCriteria.php => lib/SearchCriteria/GrupoPuestoCriteria.php +4 -2
@@ 21,8 21,11 @@ class GrupoPuestoCriteria implements ISearchPuestoCriteria
    {
        $cl = "";
        $numItems = count($arrayItems);
        for($i = 0; $i < $numItems; $i++) {
        for ($i = 0; $i < $numItems; $i++) {
            $item = $arrayItems[$i];
            if ('Sin grupo' == $item) {
                $item = '';
            }
            $cl .= "\"" . $item . "\"";
            if ($i < $numItems - 1) {
                $cl .= ",";


@@ 36,4 39,3 @@ class GrupoPuestoCriteria implements ISearchPuestoCriteria
        return [];
    }
}


M lib/Validator/ValidatorBuscarPuesto.php => lib/Validator/ValidatorBuscarPuesto.php +57 -5
@@ 7,7 7,20 @@ class ValidatorBuscarPuesto
{
    public $messages;

    private function validateLevels(Request $request, array &$parametros) {
    protected array $validOrdenacion;

    public function setValidOrdenacion(array $ordenacion)
    {
        $this->validOrdenacion = $ordenacion;
    }

    protected function getValidOrdenacion(): array
    {
        return $this->validOrdenacion;
    }

    private function validateLevels(Request $request, array &$parametros)
    {
        $okNivelMin = true;
        $okNivelMax = true;



@@ 31,7 44,8 @@ class ValidatorBuscarPuesto
        return [$okNivelMin, $okNivelMax, $nivelMinimo, $nivelMaximo];
    }

    private function validateGroup(Request $request, &$parametros) {
    private function validateGroup(Request $request, &$parametros)
    {
        $name = 'grupo';
        $thereIsGroup = false;
        $parametros[$name] = [];


@@ 48,7 62,8 @@ class ValidatorBuscarPuesto
        return $thereIsGroup;
    }

    private function validateOrganismo(Request $request, &$parametros) {
    private function validateOrganismo(Request $request, &$parametros)
    {
        $name = 'organismo';
        $thereIsOrg = false;
        $parametros[$name] = [];


@@ 65,7 80,8 @@ class ValidatorBuscarPuesto
        return $thereIsOrg;
    }

    private function validateEstado(Request $request, &$parametros) {
    private function validateEstado(Request $request, &$parametros)
    {
        $name = 'estado';
        $estado = trim($request->getParsedBody()[$name]);
        $estados = ['vacante', 'ocupada', 'ambos'];


@@ 75,7 91,8 @@ class ValidatorBuscarPuesto
        }
    }

    private function validateProvision(Request $request, &$parametros) {
    private function validateProvision(Request $request, &$parametros)
    {
        $name = 'provision';
        $provision = trim($request->getParsedBody()[$name]);
        $provisiones = ['C', 'I', 'L'];


@@ 84,6 101,39 @@ class ValidatorBuscarPuesto
            $parametros[$name] = "";
        }
    }

    private function validateOrdenacion(Request $request, &$parametros)
    {
        $ordenacion1 = trim($request->getParsedBody()['ordenacion_1']);
        $parametros['ordenacion_1'] = "";
        if (key_exists($ordenacion1, $this->getValidOrdenacion())) {
            $parametros['ordenacion_1'] = $ordenacion1;
        }

        $ordenacion2 = trim($request->getParsedBody()['ordenacion_2']);
        $parametros['ordenacion_2'] = "";
        if (key_exists($ordenacion2, $this->getValidOrdenacion())) {
            $parametros['ordenacion_2'] = $ordenacion2;
        }

        $ordenacion3 = trim($request->getParsedBody()['ordenacion_3']);
        $parametros['ordenacion_3'] = "";
        if (key_exists($ordenacion3, $this->getValidOrdenacion())) {
            $parametros['ordenacion_3'] = $ordenacion3;
        }
        
        $ordenacion4 = trim($request->getParsedBody()['ordenacion_4']);
        $parametros['ordenacion_4'] = "";
        if (key_exists($ordenacion4, $this->getValidOrdenacion())) {
            $parametros['ordenacion_4'] = $ordenacion4;
        }

        $ordenacion_abierto = trim($request->getParsedBody()['ordenacion_abierto']);
        $parametros['ordenacion_abierto'] = 0;
        if (intval($ordenacion_abierto) == 1) {
            $parametros['ordenacion_abierto'] = 1;
        }
    }
    
    public function validate(Request $request)
    {


@@ 108,6 158,8 @@ class ValidatorBuscarPuesto
            $parametros[$name] = trim($request->getParsedBody()[$name]);    
        }

        $this->validateOrdenacion($request, $parametros);

        return $parametros;
    }


M public_html/assets/css/danielside.css => public_html/assets/css/danielside.css +16 -0
@@ 132,3 132,19 @@ li.contenedor-ministerio-nivel2 ul {
.form-group i {
    color: gray;
}

.celda-centro div {
    margin-bottom: 5px;
}

#grupo-ordenacion {
    margin-top: 10px;
}

#ordenacion-menu-d {
    cursor: pointer;
}

#ordenacion-menu-u {
    cursor: pointer;
}

M public_html/index.php => public_html/index.php +100 -11
@@ 18,6 18,7 @@ use Rpt\SearchCriteria\PaisPuestoCriteria;
use Rpt\SearchCriteria\ProvinciaPuestoCriteria;
use Rpt\SearchCriteria\ProvisionPuestoCriteria;
use Rpt\SearchCriteria\TextoLibreCriteria;
use Rpt\OrderCriteria\OrderPuestoCriteria;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;



@@ 87,8 88,32 @@ function dataForIndex($app, $isWebview)

    $organismos = $organismo->all();
    $grupos = $puesto->gruposAll();
    $grupos = array_map(
        fn ($g) => '' === ($g['grupo']) ? ['grupo' => 'Sin grupo'] : $g,
        $grupos
    );
    $ordenacion = [
        'nivel' => [
            'nombre' => 'Nivel',
        ],
        'puesto.ministerio_id' => [
            'nombre' => 'Ministerio',
        ],
        'puesto.centrodirectivo_id' => [
            'nombre' => 'Centro Directivo',
        ],
        'puesto.unidad_id' => [
            'nombre' => 'Unidad',
        ],
        'especifico' => [
            'nombre' => 'Complemento específico',
        ],
        'grupo' => [
            'nombre' => 'Grupo',
        ],
    ];

    return [$grupos, $organismos, $paises, $provincias];
    return [$grupos, $organismos, $paises, $provincias, $ordenacion];
}

$app->get('/', function (Request $request, Response $response, $args) use ($app) {


@@ 101,7 126,15 @@ $app->get('/', function (Request $request, Response $response, $args) use ($app)
        'pais' => 0,
        'provincia' => 0,
        'provision' => '',
        'textolibre' => ''
        'textolibre' => '',
        'ordenacion_1' => 'nivel',
        'ordenacion_2' => 'puesto.ministerio_id',
        'ordenacion_3' => 'puesto.centrodirectivo_id',
        'ordenacion_4' => 'puesto.unidad_id',
        'ordenacion_abierto' => 0,
        'ordenacion_menu_d_class' => '',
        'ordenacion_menu_u_class' => 'hidden',
        'ordenacion_grupo_class' => 'hidden',
    ];

    $configuracion = $app->getContainer()['configuracion'];


@@ 112,6 145,7 @@ $app->get('/', function (Request $request, Response $response, $args) use ($app)
        $organismos,
        $paises,
        $provincias,
        $ordenacion
    ) = dataForIndex($app, $isWebview);

    return $this->view->render(


@@ 125,6 159,7 @@ $app->get('/', function (Request $request, Response $response, $args) use ($app)
            'organismos' => $organismos,
            'paises' => $paises,
            'provincias' => $provincias,
            'ordenacion' => $ordenacion,
            'is_webview' => $isWebview,
            'flash' => $flash
        ]


@@ 133,7 168,18 @@ $app->get('/', function (Request $request, Response $response, $args) use ($app)

$app->post('/buscapuesto', function (Request $request, Response $response, $args) use ($app) {
    $configuracion = $app->getContainer()['configuracion'];

    $isWebview = is_requested_by_webview($configuracion);
    list(
        $grupos,
        $organismos,
        $paises,
        $provincias,
        $ordenacion
    ) = dataForIndex($app, $isWebview);
    
    $validator = new ValidatorBuscarPuesto();
    $validator->setValidOrdenacion($ordenacion);
    $parametros = $validator->validate($request);

    $formDefaultValues = [


@@ 145,17 191,13 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
        'textolibre' => $parametros['textolibre'],
        'pais' => $parametros['pais'],
        'provincia' => $parametros['provincia'],
        'provision' => $parametros['provision']
        'provision' => $parametros['provision'],
        'ordenacion_1' => $parametros['ordenacion_1'],
        'ordenacion_2' => $parametros['ordenacion_2'],
        'ordenacion_3' => $parametros['ordenacion_3'],
        'ordenacion_4' => $parametros['ordenacion_4'],
    ];

    $isWebview = is_requested_by_webview($configuracion);
    list(
        $grupos,
        $organismos,
        $paises,
        $provincias,
    ) = dataForIndex($app, $isWebview);

    $flash = [];
    $flash['defaults'] = $formDefaultValues;



@@ 175,6 217,7 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
                'organismos' => $organismos,
                'paises' => $paises,
                'provincias' => $provincias,
                'ordenacion' => $ordenacion,
                'is_webview' => $isWebview,
                'flash' => $flash
            ]


@@ 190,8 233,29 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
    $codigoProvincia = $parametros['provincia'];
    $provision = $parametros['provision'];
    $textoLibre = $parametros['textolibre'];
    $ordenacion1 = $parametros['ordenacion_1'];
    $ordenacion2 = $parametros['ordenacion_2'];
    $ordenacion3 = $parametros['ordenacion_3'];
    $ordenacion4 = $parametros['ordenacion_4'];

    $puesto = $app->getContainer()['puesto'];

    //En este punto los valores de los campos de ordenación están validados pero
    //pueden estar repetidos, más tarde la función de búsqueda tiene
    //la responsabilidad de normalizar el conjunto
    if (!empty($ordenacion1)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion1));
    }
    if (!empty($ordenacion2)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion2));
    }
    if (!empty($ordenacion3)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion3));
    }
    if (!empty($ordenacion4)) {
        $puesto->addOrderCriteria(new OrderPuestoCriteria($ordenacion4));
    }
    
    $puesto->addSearchCriteria(new NivelPuestoCriteria((int)$nivelMinimo, (int)$nivelMaximo));
    $puesto->addSearchCriteria(new OrganismoCriteria($organismo));
    if (!($estado == 'ambos')) {


@@ 231,6 295,30 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
    //$puestos solo trae el slice que vamos a mostrar en cada página
    $puestos = $puesto->search($pagina);

    //Esta sección deja disponible para la próxima consulta las opciones
    //de ordenación normalizadas y ordenadas
    $orderNormalizado = $puesto->orderByNormalizado;

    for ($i=1; $i<=4; $i++) {
        $valor = array_shift($orderNormalizado);
        $valorStr = '';
        if (null !== $valor) {
            $valorStr = $valor->getCampo();
        }
        $flash['defaults']['ordenacion_' . strval($i)] = $valorStr;
    }

    $flash['defaults']['ordenacion_abierto'] = $parametros['ordenacion_abierto'];
    if (1 == $parametros['ordenacion_abierto']) {
        $flash['defaults']['ordenacion_menu_d_class'] = 'hidden';
        $flash['defaults']['ordenacion_menu_u_class'] = '';
        $flash['defaults']['ordenacion_grupo_class'] = '';
    } else {
        $flash['defaults']['ordenacion_menu_d_class'] = '';
        $flash['defaults']['ordenacion_menu_u_class'] = 'hidden';
        $flash['defaults']['ordenacion_grupo_class'] = 'hidden';
    }

    //Aquí estará el total de puestos encontrados
    $totalEncontrados = $puesto->getTotalEncontrados();
    $totalPages = $puesto->getTotalPages();


@@ 249,6 337,7 @@ $app->post('/buscapuesto', function (Request $request, Response $response, $args
            'grupos' => $grupos,
            'paises' => $paises,
            'provincias' => $provincias,
            'ordenacion' => $ordenacion,
            'is_webview' => $isWebview,
            'flash' => $flash,
            'paginaActual' => $pagina,

M templates/buscarpt.php => templates/buscarpt.php +43 -3
@@ 113,6 113,7 @@

    <div class="form-group">
      <label>Forma de provisión</label>
      <p><i>La opción "Cualquiera" incluirá aquéllos puestos que no tienen informada la forma de provisión.</i></p>
      <select id="select_provision" name="provision" class="form-control">
        <option value="">Cualquiera</option>
	<option


@@ 123,7 124,7 @@
	  Libre designación</option>
	<option
	  value="I" <?= (isset($flash['defaults']['provision']) && 'I' == $flash['defaults']['provision']) ? 'selected' : '' ?>>
	  Indistintamente personal eventual o funcionario</option>
	    Indistintamente personal eventual o funcionario</option>
      </select>
    </div>



@@ 167,7 168,6 @@
    <div class="form-group">
        <label for="textolibre">Texto libre</label>
        <p><i>Aquí puedes buscar sobre centro directivo, unidad, nombre del puesto y localidad. Puedes usar las " para indicar búsquedas exactas. Ejemplo: "Roquetas de Mar" en lugar de Roquetas de Mar.</i></p>

        <input type="text"
               class="form-control"
               name="textolibre"


@@ 175,8 175,32 @@
               placeholder="Ejemplos: 'informática', 'presupuestario', 'sanidad', 'sevilla', etc."
               value="<?= htmlspecialchars($flash['defaults']['textolibre']) ?>">
    </div>
    <div class="form-group" id="titulo-grupo-ordenacion" style="padding-top: 25px">
        <input type="hidden" name="ordenacion_abierto" value="<?= isset($flash['defaults']['ordenacion_abierto']) ? $flash['defaults']['ordenacion_abierto'] : '0' ?>" />
        <label><span class="glyphicon glyphicon-sort"></span> Ordenación</label>
        <a id="ordenacion-menu-d" class="<?= isset($flash['defaults']['ordenacion_menu_d_class']) ? $flash['defaults']['ordenacion_menu_d_class'] : '' ?>" href="#"><span class="glyphicon glyphicon-menu-down"></span></a>
        <a id="ordenacion-menu-u" class="<?= isset($flash['defaults']['ordenacion_menu_u_class']) ? $flash['defaults']['ordenacion_menu_u_class'] : 'hidden' ?>" href="#"><span class="glyphicon glyphicon-menu-up"></span></a>
    </div>
    <div id="grupo-ordenacion" class="<?= isset($flash['defaults']['ordenacion_grupo_class']) ? $flash['defaults']['ordenacion_grupo_class'] : 'hidden' ?>">
        <?php
        for ($i = 1; $i <= 4; $i++) {
            echo "<div class='form-group'><label for='criterio-$i'>Criterio de ordenación $i</label>";
            echo "<select id='select_ordenacion_$i' name='ordenacion_$i' class='form-control'>";
            echo "<option value=''></option>";            
            foreach($ordenacion as $campobd => $descripcion) {
                $etiqueta = $descripcion['nombre'];
                $selected = "";
                $campo = 'ordenacion_' . strval($i);
                if (isset($flash['defaults'][$campo]) && $campobd == $flash['defaults'][$campo]) {
                    $selected = "selected";
                }
                echo "<option value='$campobd' $selected>$etiqueta</option>";
            }
            echo "</select></div>";
        }
        ?>
    <?php } ?>

    </div>
    <?php if (!$is_webview) { ?>
    <div class="form-group">
    <label for="textolibre">Texto libre</label><br />Disponible en la <a style="text-decoration:underline" href="https://play.google.com/store/apps/details?id=es.nom.danielside.buscarptfuncionarios">aplicación de Android</a>


@@ 235,5 259,21 @@
     $('#buscar').click(function(e) {
         $(this).toggleClass('active');
     });
     $('#ordenacion-menu-d').click(function(e) {
         e.preventDefault();
         $('#grupo-ordenacion').removeClass('hidden');
         $('#ordenacion-menu-u').removeClass('hidden');
         $(this).addClass('hidden');
         $('input[name="ordenacion_abierto"]').val(1);
         return false;
     });
     $('#ordenacion-menu-u').click(function(e) {
         e.preventDefault();
         $('#grupo-ordenacion').addClass('hidden');
         $('#ordenacion-menu-d').removeClass('hidden');
         $(this).addClass('hidden');
         $('input[name="ordenacion_abierto"]').val(0);
         return false;
     });
 });
</script>

M templates/puestos.php => templates/puestos.php +43 -30
@@ 6,10 6,11 @@
  </div>

  <div class="tabla-resultados table-responsive <?= empty($puestos) ? 'hidden' : '' ?>">
    <table class="table">
    <table class="table table-striped table-responsive">
        <tr>
            <th>Nivel</th>
            <th>Puesto</th>
            <th>C. Específico</th>
            <th>
             Salario bruto anual 
             <a class="salario-tooltip" href="#" data-toggle="tooltip" title="Considerado como la suma del sueldo, complemento de destino y complemento específico">?</a>


@@ 20,28 21,33 @@
	      <a class="provision-tooltip" href="#" data-toggle="tooltip" title="C - Concurso de méritos, L - Libre Designación, I - Indistintamente personal eventual o funcionario. Nota: también puede venir sin indicar">?</a>
	    </th>
            <th>Estado</th>
            <th>Unidad</th>
            <th>Centro Directivo</th>
            <th>Organismo</th>
            <th>Centro de trabajo</th>
            <th>Localidad y Provincia</th>
        </tr>
        <?php foreach($puestos as $puesto) { 
          $salarioBrutoAnual = '';
          if (is_array($puesto['salario'])) {
            if (count($puesto['salario']) == 1) {
              $salario = array_shift($puesto['salario']);
              $salarioBrutoAnual = str_replace('.', ',', $salario) . " €";
            } elseif (count($puesto['salario']) == 2) {
              $grupo1 = array_keys($puesto['salario'])[0];
              $salario1 = array_shift($puesto['salario']);
              $salarioBrutoAnual = str_replace('.', ',', $salario1) . " € (como $grupo1) <br />";
            $salarioBrutoAnual = '';
            if (is_array($puesto['salario'])) {
                if (count($puesto['salario']) == 1) {
                    $salario = array_shift($puesto['salario']);
                    $salarioBrutoAnual = str_replace('.', ',', $salario) . " €";
                } elseif (count($puesto['salario']) == 2) {
                    $grupo1 = array_keys($puesto['salario'])[0];
                    $salario1 = array_shift($puesto['salario']);
                    $salarioBrutoAnual = str_replace('.', ',', $salario1) . " € (como $grupo1) <br />";

              $grupo2 = array_keys($puesto['salario'])[0];
              $salario2 = array_shift($puesto['salario']);
              $salarioBrutoAnual .= str_replace('.', ',', $salario2) . "€ (como $grupo2)";
                    $grupo2 = array_keys($puesto['salario'])[0];
                    $salario2 = array_shift($puesto['salario']);
                    $salarioBrutoAnual .= str_replace('.', ',', $salario2) . "€ (como $grupo2)";
                }
            }
          }

          ?>
            $unidad = $puesto['unidad'];
            $centroDirectivo = $puesto['centrodirectivo'];
            $elementosDelCentro = 3;
            if (strcmp($unidad, $centroDirectivo) == 0) {
                $elementosDelCentro = 2;
            }
        ?>
            <tr>
                <td>
                    <?= $puesto['nivel']; ?>


@@ 71,6 77,9 @@
                    </div>
                </td>
                <td>
                    <?= str_replace('.', ',', $puesto['especifico']) ?> €
                </td>
                <td>
                <?= $salarioBrutoAnual ?>
                </td>
                <td>


@@ 86,22 95,26 @@
                        No vacante
                    <?php } ?>
                </td>
                <td>
                    <?= $puesto['unidad']; ?>
                </td>
                <td>
                    <a class="link-centrodirectivo" data-id="<?= $puesto['ministerio_id'] ?>" data-centroid="<?= $puesto['centrodirectivo_id'] ?>"
                <td class="celda-centro">
                    <?php
                    if (3 == $elementosDelCentro) {
                        echo "<div>" . $puesto['unidad'] . "</div>";
                    }
                    ?>
                    <div><a class="link-centrodirectivo" data-id="<?= $puesto['ministerio_id'] ?>" data-centroid="<?= $puesto['centrodirectivo_id'] ?>"
                       data-toggle="modal" data-target="#modal-organismo">
           
                       <?= $puesto['centrodirectivo'] ?>
                    </a>
                        
                        <?= $puesto['centrodirectivo'] ?>
                    </a></div>
                    <div><a class="link-ministerio" data-id="<?= $puesto['ministerio_id'] ?>"
                       data-toggle="modal" data-target="#modal-organismo">
                        <?= $puesto['ministerio']; ?>
		    </a></div>
                </td>
                <td>
                    <a class="link-ministerio" data-id="<?= $puesto['ministerio_id'] ?>"
                       data-toggle="modal" data-target="#modal-organismo">
                       <?= $puesto['ministerio']; ?>
		    </a>
                    <?= $puesto['localidad'] ?> (<?= $puesto['provincia'] ?>)
                </td>

            </tr>
        <?php }  ?>
    </table>