L. Carpeta « php »

Versión para imprimir.

A. php / Bd.php

1
<?php
2
3
require_once __DIR__ . "/ventaEnCapturaAgrega.php";
4
5
class Bd
6
{
7
8
 private static ?PDO $pdo = null;
9
10
 public static function pdo(): PDO
11
 {
12
  if (self::$pdo === null) {
13
   self::$pdo = new PDO(
14
    // cadena de conexión
15
    "sqlite:" . __DIR__ . "/srvcompras.db",
16
    // usuario
17
    null,
18
    // contraseña
19
    null,
20
    // Opciones: pdos no persistentes y lanza excepciones.
21
    [PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
22
   );
23
24
   self::$pdo->exec(
25
    'CREATE TABLE IF NOT EXISTS VENTA (
26
      VENT_ID INTEGER,
27
      VENT_EN_CAPTURA INTEGER NOT NULL,
28
      CONSTRAINT VENT_PK
29
       PRIMARY KEY(VENT_ID)
30
     )'
31
   );
32
   self::$pdo->exec(
33
    'CREATE TABLE IF NOT EXISTS PRODUCTO (
34
      PROD_ID INTEGER,
35
      PROD_NOMBRE TEXT NOT NULL,
36
      PROD_EXISTENCIAS REAL NOT NULL,
37
      PROD_PRECIO REAL NOT NULL,
38
      CONSTRAINT PROD_PK
39
       PRIMARY KEY(PROD_ID),
40
      CONSTRAINT PROD_NOM_UNQ
41
       UNIQUE(PROD_NOMBRE),
42
      CONSTRAINT PROD_NOM_NV
43
       CHECK(LENGTH(PROD_NOMBRE) > 0)
44
     )'
45
   );
46
   self::$pdo->exec(
47
    'CREATE TABLE IF NOT EXISTS DET_VENTA (
48
      VENT_ID INTEGER NOT NULL,
49
      PROD_ID INTEGER NOT NULL,
50
      DTV_CANTIDAD REAL NOT NULL,
51
      DTV_PRECIO REAL NOT NULL,
52
      CONSTRAINT DTV_PK
53
       PRIMARY KEY (VENT_ID, PROD_ID),
54
      CONSTRAINT DTV_VENT_FK
55
       FOREIGN KEY (VENT_ID) REFERENCES VENTA(VENT_ID),
56
      CONSTRAINT DTV_PROD_FK
57
       FOREIGN KEY (PROD_ID) REFERENCES PRODUCTO(PROD_ID)
58
      )'
59
   );
60
61
   $cantidadDeProductos =
62
    self::$pdo->query("SELECT COUNT(PROD_ID) FROM PRODUCTO")->fetchColumn(0);
63
64
   if ($cantidadDeProductos === 0) {
65
    self::$pdo->exec(
66
     "INSERT INTO PRODUCTO
67
       (PROD_NOMBRE, PROD_EXISTENCIAS, PROD_PRECIO)
68
      VALUES
69
       ('Sandwich', 50, 15),
70
       ('Hot dog', 40, 30),
71
       ('Hamburguesa', 30, 40)"
72
    );
73
   }
74
75
   $cantidadDeVentas =
76
    self::$pdo->query("SELECT COUNT(VENT_ID) FROM VENTA")->fetchColumn(0);
77
78
   if ($cantidadDeVentas === 0) {
79
    ventaEnCapturaAgrega(self::$pdo);
80
   }
81
  }
82
83
  return self::$pdo;
84
 }
85
}
86

B. php / det-venta-agrega.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/lib/recibeFlotanteObligatorio.php";
6
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
7
require_once __DIR__ . "/lib/devuelveCreated.php";
8
require_once __DIR__ . "/Bd.php";
9
require_once __DIR__ . "/productoBusca.php";
10
require_once __DIR__ . "/ventaEnCapturaBusca.php";
11
12
13
$prodId = recibeEnteroObligatorio("id");
14
$cantidad = recibeFlotanteObligatorio("cantidad");
15
16
$bd = Bd::pdo();
17
18
$producto = productoBusca($bd, $prodId);
19
$producto = validaEntidadObligatoria("Producto",  $producto);
20
21
$venta = ventaEnCapturaBusca($bd);
22
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
23
24
$stmt = $bd->prepare(
25
 "INSERT INTO DET_VENTA (
26
    VENT_ID, PROD_ID, DTV_CANTIDAD, DTV_PRECIO
27
   ) values (
28
    :VENT_ID, :PROD_ID, :DTV_CANTIDAD, :DTV_PRECIO
29
   )"
30
);
31
$stmt->execute([
32
 ":VENT_ID" => $venta["VENT_ID"],
33
 ":PROD_ID" => $prodId,
34
 ":DTV_CANTIDAD" => $cantidad,
35
 ":DTV_PRECIO" => $producto["PROD_PRECIO"],
36
]);
37
38
$encodeProdId = urlencode($prodId);
39
devuelveCreated("/php/vista-modifica.php?id=$encodeProdId", [
40
 "prodId" => ["value" => $prodId],
41
 "prodNombre" => ["value" => $producto["PROD_NOMBRE"]],
42
 "precio" => ["value" => "$" . number_format($producto["PROD_PRECIO"], 2)],
43
 "cantidad" => ["valueAsNumber" => $cantidad],
44
]);
45

C. php / det-venta-elimina.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/lib/devuelveNoContent.php";
6
require_once __DIR__ . "/Bd.php";
7
require_once __DIR__ . "/ventaEnCapturaBusca.php";
8
9
$prodId = recibeEnteroObligatorio("prodId");
10
11
$bd = Bd::pdo();
12
13
$venta = ventaEnCapturaBusca($bd);
14
if ($venta !== false) {
15
 $stmt = $bd->prepare(
16
  "DELETE FROM DET_VENTA WHERE VENT_ID = :VENT_ID AND PROD_ID = :PROD_ID"
17
 );
18
 $stmt->execute([":VENT_ID" => $venta["VENT_ID"], ":PROD_ID" => $prodId]);
19
}
20
devuelveNoContent();
21

D. php / det-venta-modifica.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/lib/recibeFlotanteObligatorio.php";
6
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
7
require_once __DIR__ . "/lib/devuelveJson.php";
8
require_once __DIR__ . "/Bd.php";
9
require_once __DIR__ . "/productoBusca.php";
10
require_once __DIR__ . "/ventaEnCapturaBusca.php";
11
12
$prodId = recibeEnteroObligatorio("prodId");
13
$cantidad = recibeFlotanteObligatorio("cantidad");
14
15
$bd = Bd::pdo();
16
17
$producto = productoBusca($bd, $prodId);
18
$producto = validaEntidadObligatoria("Producto",  $producto);
19
20
$venta = ventaEnCapturaBusca($bd);
21
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
22
23
$stmt = $bd->prepare(
24
 "UPDATE DET_VENTA
25
   SET
26
    DTV_CANTIDAD = :DTV_CANTIDAD,
27
    DTV_PRECIO = :DTV_PRECIO
28
   WHERE
29
    VENT_ID = :VENT_ID
30
    AND PROD_ID = :PROD_ID"
31
);
32
$stmt->execute([
33
 ":DTV_CANTIDAD" => $cantidad,
34
 ":DTV_PRECIO" => $producto["PROD_PRECIO"],
35
 ":VENT_ID" => $venta["VENT_ID"],
36
 ":PROD_ID" => $prodId
37
]);
38
39
devuelveJson([
40
 "prodId" => ["value" => $prodId],
41
 "prodNombre" => ["value" => $producto["PROD_NOMBRE"]],
42
 "precio" => ["value" => "$" . number_format($producto["PROD_PRECIO"], 2)],
43
 "cantidad" => ["valueAsNumber" => $cantidad],
44
]);
45

E. php / detVentaConsulta.php

1
<?php
2
3
function detVentaConsulta(\PDO $bd, int $ventaId)
4
{
5
 $stmt = $bd->prepare(
6
  "SELECT
7
    DV.PROD_ID,
8
    P.PROD_NOMBRE,
9
    P.PROD_EXISTENCIAS,
10
    P.PROD_PRECIO,
11
    DV.DTV_CANTIDAD,
12
    DV.DTV_PRECIO
13
   FROM DET_VENTA DV, PRODUCTO P
14
   WHERE
15
    DV.PROD_ID = P.PROD_ID
16
    AND DV.VENT_ID = :VENT_ID
17
   ORDER BY P.PROD_NOMBRE"
18
 );
19
 $stmt->execute([":VENT_ID" => $ventaId]);
20
 $lista = $stmt->fetchAll(PDO::FETCH_ASSOC);
21
 return $lista;
22
}
23

F. php / productoBusca.php

1
<?php
2
3
function productoBusca(\PDO $bd, int $prodId)
4
{
5
$stmt = $bd->prepare("SELECT * FROM PRODUCTO WHERE PROD_ID = :PROD_ID");
6
$stmt->execute([":PROD_ID" => $prodId]);
7
$modelo = $stmt->fetch(PDO::FETCH_ASSOC);
8
 return $modelo;
9
}
10

G. php / srvcompras.db

1
SQLite format 3@  .�*
O�W
��
{�,�'tableDET_VENTADET_VENTACREATE TABLE DET_VENTA (
2
      VENT_ID INTEGER NOT NULL,
3
      PROD_ID INTEGER NOT NULL,
4
      DTV_CANTIDAD REAL NOT NULL,
5
      DTV_PRECIO REAL NOT NULL,
6
      CONSTRAINT DTV_PK
7
       PRIMARY KEY (VENT_ID, PROD_ID),
8
      CONSTRAINT DTV_VENT_FK
9
       FOREIGN KEY (VENT_ID) REFERENCES VENTA(VENT_ID),
10
      CONSTRAINT DTV_PROD_FK
11
       FOREIGN KEY (PROD_ID) REFERENCES PRODUCTO(PROD_ID)
12
      )1Eindexsqlite_autoindex_DET_VENTA_1DET_VENTA�m�-tablePRODUCTOPRODUCTOCREATE TABLE PRODUCTO (
13
      PROD_ID INTEGER,
14
      PROD_NOMBRE TEXT NOT NULL,
15
      PROD_EXISTENCIAS REAL NOT NULL,
16
      PROD_PRECIO REAL NOT NULL,
17
      CONSTRAINT PROD_PK
18
       PRIMARY KEY(PROD_ID),
19
      CONSTRAINT PROD_NOM_UNQ
20
       UNIQUE(PROD_NOMBRE),
21
      CONSTRAINT PROD_NOM_NV
22
       CHECK(LENGTH(PROD_NOMBRE) > 0)
23
     )/Cindexsqlite_autoindex_PRODUCTO_1PRODUCTO�&�+tableVENTAVENTACREATE TABLE VENTA (
24
      VENT_ID INTEGER,
25
      VENT_EN_CAPTURA INTEGER NOT NULL,
26
      CONSTRAINT VENT_PK
27
       PRIMARY KEY(VENT_ID)
28
     )
���	
����#Hamburguesa(Hot dog$Sandwich0
29
����#HamburguesaHot dog	Sandwich
���			
30
���				

H. php / venta-en-captura-procesa.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/devuelveCreated.php";
5
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
6
require_once __DIR__ . "/Bd.php";
7
require_once __DIR__ . "/ventaEnCapturaBusca.php";
8
require_once __DIR__ . "/detVentaConsulta.php";
9
require_once __DIR__ . "/ventaEnCapturaAgrega.php";
10
11
$bd = Bd::pdo();
12
$bd->beginTransaction();
13
14
$venta = ventaEnCapturaBusca($bd);
15
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
16
17
$detalles = detVentaConsulta($bd, $venta["VENT_ID"]);
18
19
// Actualiza las existencias de los productos vendidos.
20
$update = $bd->prepare(
21
 "UPDATE PRODUCTO
22
   SET PROD_EXISTENCIAS = :PROD_EXISTENCIAS
23
   WHERE PROD_ID = :PROD_ID"
24
);
25
foreach ($detalles as $detVenta) {
26
 $update->execute([
27
  ":PROD_ID" => $detVenta["PROD_ID"],
28
  ":PROD_EXISTENCIAS" =>
29
  $detVenta["PROD_EXISTENCIAS"] - $detVenta["DTV_CANTIDAD"]
30
 ]);
31
}
32
33
$update = $bd->prepare(
34
 "UPDATE VENTA
35
   SET VENT_EN_CAPTURA = 0
36
   WHERE VENT_ID = :VENT_ID"
37
);
38
$update->execute([":VENT_ID" => $venta["VENT_ID"]]);
39
40
ventaEnCapturaAgrega($bd);
41
$folio = $bd->lastInsertId();
42
43
$bd->commit();
44
45
devuelveCreated("/srv/venta-en-captura.php", [
46
 "folio" => ["value" => $folio],
47
 "detalles" => ["innerHTML" => ""]
48
]);
49

I. php / ventaEnCapturaAgrega.php

1
<?php
2
3
function ventaEnCapturaAgrega(\PDO $bd)
4
{
5
 $bd->exec("INSERT INTO VENTA (VENT_EN_CAPTURA) VALUES (1)");
6
}
7

J. php / ventaEnCapturaBusca.php

1
<?php
2
3
function ventaEnCapturaBusca(\PDO $bd)
4
{
5
 $stmt = $bd->query("SELECT * FROM VENTA WHERE VENT_EN_CAPTURA = 1");
6
 $venta = $stmt->fetch(PDO::FETCH_ASSOC);
7
 return $venta;
8
}
9

K. php / vista-agrega.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
6
require_once __DIR__ . "/lib/devuelveJson.php";
7
require_once __DIR__ . "/Bd.php";
8
require_once __DIR__ . "/productoBusca.php";
9
10
$id = recibeEnteroObligatorio("id");
11
12
$producto = productoBusca(Bd::pdo(), $id);
13
$producto = validaEntidadObligatoria("Producto",  $producto);
14
15
devuelveJson([
16
 "id" => ["value" => $id],
17
 "producto" => ["value" => $producto["PROD_NOMBRE"]],
18
 "precio" => ["value" => "$" . number_format($producto["PROD_PRECIO"], 2)],
19
]);
20

L. php / vista-carrito.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/devuelveJson.php";
5
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
6
require_once __DIR__ . "/Bd.php";
7
require_once __DIR__ . "/ventaEnCapturaBusca.php";
8
require_once __DIR__ . "/detVentaConsulta.php";
9
require_once __DIR__ . "/Bd.php";
10
11
$bd = Bd::pdo();
12
13
$venta = ventaEnCapturaBusca($bd);
14
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
15
16
$detalles = detVentaConsulta($bd, $venta["VENT_ID"]);
17
18
$renderDetalles = "";
19
foreach ($detalles as $detVenta) {
20
 $encodeProdId = urlencode($detVenta["PROD_ID"]);
21
 $prodId = htmlentities($encodeProdId);
22
 $prodNombre = htmlentities($detVenta["PROD_NOMBRE"]);
23
 $precio = htmlentities("$" . number_format($detVenta["PROD_PRECIO"], 2));
24
 $cantidad = htmlentities(number_format($detVenta["DTV_CANTIDAD"], 2));
25
 $renderDetalles .=
26
  "<dt>$prodNombre</dt>
27
    <dd>
28
     <a href= 'modifica.html?prodId=$prodId'>Modificar o eliminar</a>
29
    </dd>
30
    <dd>
31
     <dl>
32
      <dt>Cantidad</dt>
33
      <dd>$cantidad</dd>
34
      <dt>Precio</dt>
35
      <dd>$precio</dd>
36
     </dl>
37
    </dd>";
38
}
39
40
devuelveJson([
41
 "folio" => ["value" => $venta["VENT_ID"]],
42
 "detalles" => ["innerHTML" => $renderDetalles]
43
]);
44

M. php / vista-index.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/devuelveJson.php";
5
require_once __DIR__ . "/Bd.php";
6
7
$bd = Bd::pdo();
8
$stmt = $bd->query("SELECT * FROM PRODUCTO ORDER BY PROD_NOMBRE");
9
$lista = $stmt->fetchAll(PDO::FETCH_ASSOC);
10
11
$render = "";
12
foreach ($lista as $modelo) {
13
 $encodeId = urlencode($modelo["PROD_ID"]);
14
 $id = htmlentities($encodeId);
15
 $nombre = htmlentities($modelo["PROD_NOMBRE"]);
16
 $precio = htmlentities("$" . number_format($modelo["PROD_PRECIO"], 2));
17
 $existencias = htmlentities(number_format($modelo["PROD_EXISTENCIAS"], 2));
18
 $render .=
19
  "<dt>$nombre</dt>
20
    <dd>
21
     <a href='agrega.html?id=$id'>Agregar al carrito</a>
22
    </dd>
23
    <dd>
24
     <dl>
25
      <dt>Precio</dt>
26
      <dd>$precio</dd>
27
      <dt>Existencias</dt>
28
      <dd>$existencias</dd>
29
     </dl>
30
    </dd>";
31
}
32
devuelveJson(["lista" => ["innerHTML" => $render]]);
33

N. php / vista-modifica.php

1
<?php
2
3
require_once __DIR__ . "/lib/manejaErrores.php";
4
require_once __DIR__ . "/lib/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/lib/validaEntidadObligatoria.php";
6
require_once __DIR__ . "/lib/devuelveJson.php";
7
require_once __DIR__ . "/Bd.php";
8
require_once __DIR__ . "/productoBusca.php";
9
require_once __DIR__ . "/ventaEnCapturaBusca.php";
10
11
$prodId = recibeEnteroObligatorio("prodId");
12
13
$bd = Bd::pdo();
14
15
$venta = ventaEnCapturaBusca($bd);
16
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
17
18
$producto = productoBusca($bd, $prodId);
19
$producto = validaEntidadObligatoria("Producto",  $producto);
20
21
$stmt = $bd->prepare(
22
 "SELECT * FROM DET_VENTA WHERE VENT_ID = :VENT_ID AND PROD_ID = :PROD_ID"
23
);
24
$stmt->execute([":VENT_ID" => $venta["VENT_ID"], ":PROD_ID" => $prodId]);
25
$detVenta = $stmt->fetch(PDO::FETCH_ASSOC);
26
$detVenta = validaEntidadObligatoria("Detalle de venta",  $detVenta);
27
28
devuelveJson([
29
 "prodId" => ["value" => $prodId],
30
 "prodNombre" => ["value" => $producto["PROD_NOMBRE"]],
31
 "precio" => ["value" => "$" . number_format($detVenta["DTV_PRECIO"], 2)],
32
 "cantidad" => ["valueAsNumber" => $detVenta["DTV_CANTIDAD"]],
33
]);
34

O. Carpeta « php / lib »

Versión para imprimir.

1. php / lib / BAD_REQUEST.php

1
<?php
2
3
const BAD_REQUEST = 400;
4

2. php / lib / devuelveCreated.php

1
<?php
2
3
require_once __DIR__ . "/devuelveResultadoNoJson.php";
4
5
function devuelveCreated($urlDelNuevo, $resultado)
6
{
7
 $json = json_encode($resultado);
8
 if ($json === false) {
9
  devuelveResultadoNoJson();
10
 } else {
11
  http_response_code(201);
12
  header("Location: $urlDelNuevo");
13
  header("Content-Type: application/json; charset=utf-8");
14
  echo $json;
15
 }
16
}
17

3. php / lib / devuelveJson.php

1
<?php
2
3
require_once __DIR__ . "/devuelveResultadoNoJson.php";
4
5
function devuelveJson($resultado)
6
{
7
 $json = json_encode($resultado);
8
 if ($json === false) {
9
  devuelveResultadoNoJson();
10
 } else {
11
  header("Content-Type: application/json; charset=utf-8");
12
  echo $json;
13
 }
14
 exit();
15
}
16

4. php / lib / devuelveNoContent.php

1
<?php
2
3
function devuelveNoContent()
4
{
5
 http_response_code(204);
6
}
7

5. php / lib / devuelveResultadoNoJson.php

1
<?php
2
3
require_once __DIR__ . "/INTERNAL_SERVER_ERROR.php";
4
5
function devuelveResultadoNoJson()
6
{
7
 http_response_code(INTERNAL_SERVER_ERROR);
8
 header("Content-Type: application/problem+json; charset=utf-8");
9
10
 echo '{' .
11
  "status: " . INTERNAL_SERVER_ERROR .
12
  '"title": "El resultado no puede representarse como JSON."' .
13
  '"type": "/errors/resultadonojson.html"' .
14
  '}';
15
}
16

6. php / lib / INTERNAL_SERVER_ERROR.php

1
<?php
2
3
const INTERNAL_SERVER_ERROR = 500;

7. php / lib / manejaErrores.php

1
<?php
2
3
require_once __DIR__ . "/INTERNAL_SERVER_ERROR.php";
4
require_once __DIR__ . "/ProblemDetailsException.php";
5
6
// Hace que se lance una excepción automáticamente cuando se genere un error.
7
set_error_handler(function ($severity, $message, $file, $line) {
8
 throw new ErrorException($message, 0, $severity, $file, $line);
9
});
10
11
// Código cuando una excepción no es atrapada.
12
set_exception_handler(function (Throwable $excepcion) {
13
 if ($excepcion instanceof ProblemDetailsException) {
14
  devuelveProblemDetails($excepcion->problemDetails);
15
 } else {
16
  devuelveProblemDetails([
17
   "status" => INTERNAL_SERVER_ERROR,
18
   "title" => "Error interno del servidor",
19
   "detail" => $excepcion->getMessage(),
20
   "type" => "/errors/errorinterno.html",
21
  ]);
22
 }
23
 exit();
24
});
25
26
function devuelveProblemDetails(array $array)
27
{
28
 $json = json_encode($array);
29
 if ($json === false) {
30
  devuelveResultadoNoJson();
31
 } else {
32
  http_response_code(isset($array["status"]) ? $array["status"] : 500);
33
  header("Content-Type: application/problem+json; charset=utf-8");
34
  echo $json;
35
 }
36
}
37

8. php / lib / NOT_FOUND.php

1
<?php
2
3
const NOT_FOUND = 404;
4

9. php / lib / ProblemDetailsException.php

1
<?php
2
3
require_once __DIR__ . "/INTERNAL_SERVER_ERROR.php";
4
5
/**
6
 * Detalle de los errores devueltos por un servicio.
7
 */
8
class ProblemDetailsException extends Exception
9
{
10
11
 public array $problemDetails;
12
13
 public function __construct(
14
  array $problemDetails,
15
 ) {
16
  
17
  parent::__construct(
18
   isset($problemDetails["detail"])
19
    ? $problemDetails["detail"]
20
    : (isset($problemDetails["title"])
21
     ? $problemDetails["title"]
22
     : "Error"),
23
   $problemDetails["status"]
24
    ? $problemDetails["status"]
25
    : INTERNAL_SERVER_ERROR
26
  );
27
28
  $this->problemDetails = $problemDetails;
29
 }
30
}
31

10. php / lib / recibeArray.php

1
<?php
2
3
/**
4
 * Devuelve los valores asociados a un
5
 * parámetro multivaluado; por ejemplo, un
6
 * grupo de checkbox, recibido en el servidor
7
 * por medio de GET, POST o cookie.
8
 * 
9
 * Si no se recibe el parámetro, devuelve [].
10
 * 
11
 * Si el valor recibido no es un arreglo, lo
12
 * coloca dentro de uno.
13
 */
14
function recibeArray(string $parametro)
15
{
16
 if (isset($_REQUEST[$parametro])) {
17
  $valor = $_REQUEST[$parametro];
18
  return is_array($valor)
19
   ? $valor
20
   : [$valor];
21
 } else {
22
  return [];
23
 }
24
}
25

11. php / lib / recibeEntero.php

1
<?php
2
3
require_once __DIR__ . "/recibeTexto.php";
4
5
/**
6
 * Devuelve el valor entero de un parámetro recibido en el
7
 * servidor por medio de GET, POST o cookie.
8
 * 
9
 * Si el parámetro no se recibe, devuelve false
10
 *
11
 * Si se recibe una cadena vacía, se devuelve null.
12
 * 
13
 * Si parámetro no se puede convertir a entero, se genera
14
 * un error.
15
 */
16
function recibeEntero(string $parametro): false|null|int
17
{
18
 $valor = recibeTexto($parametro);
19
 if ($valor === false) {
20
  return false;
21
 } else {
22
  $valor = trim($valor);
23
  if ($valor === "") {
24
   return null;
25
  } else {
26
   return (int) $valor;
27
  }
28
 }
29
}
30

12. php / lib / recibeEnteroObligatorio.php

1
<?php
2
3
require_once __DIR__ . "/BAD_REQUEST.php";
4
require_once __DIR__ . "/recibeEntero.php";
5
require_once __DIR__ . "/ProblemDetailsException.php";
6
7
function recibeEnteroObligatorio(string $parametro)
8
{
9
 $entero = recibeEntero($parametro);
10
11
 if ($entero === false)
12
  throw new ProblemDetailsException([
13
   "status" => BAD_REQUEST,
14
   "title" => "Falta el valor $parametro.",
15
   "type" => "/errors/faltavalor.html",
16
   "detail" => "La solicitud no tiene el valor de $parametro."
17
  ]);
18
19
 if ($entero === null)
20
  throw new ProblemDetailsException([
21
   "status" => BAD_REQUEST,
22
   "title" => "Campo $parametro en blanco.",
23
   "type" => "/errors/campoenteroenblanco.html",
24
   "detail" => "Pon un número entero en el campo $parametro."
25
  ]);
26
27
 return $entero;
28
}
29

13. php / lib / recibeFlotante.php

1
<?php
2
3
require_once __DIR__ . "/recibeTexto.php";
4
5
/**
6
 * Devuelve el valor decimal de un parámetro (que
7
 * puede tener fracciones) enviado al servidor por
8
 * medio de GET, POST o cookie.
9
 * 
10
 * Si el parámetro no se recibe, devuekve false
11
 * 
12
 * Si se recibe una cadena vacía, se devuelve null.
13
 * 
14
 * Si parámetro no se puede convertir a decimal, se genera
15
 * un error.
16
 */
17
function recibeFlotante(string $parametro): false|null|float
18
{
19
 $valor = recibeTexto($parametro);
20
 if ($valor === false) {
21
  return false;
22
 } else {
23
  $valor = trim($valor);
24
  if ($valor === "") {
25
   return null;
26
  } else {
27
   return (float) $valor;
28
  }
29
 }
30
}
31

14. php / lib / recibeFlotanteObligatorio.php

1
<?php
2
3
require_once __DIR__ . "/BAD_REQUEST.php";
4
require_once __DIR__ . "/recibeFlotante.php";
5
require_once __DIR__ . "/ProblemDetailsException.php";
6
7
function recibeFlotanteObligatorio(string $parametro)
8
{
9
 $flotante = recibeFlotante($parametro);
10
11
 if ($flotante === false)
12
  throw new ProblemDetailsException([
13
   "status" => BAD_REQUEST,
14
   "title" => "Falta el valor $parametro.",
15
   "type" => "/error/faltavalor.html",
16
   "detail" => "La solicitud no tiene el valor de $parametro."
17
  ]);
18
19
 if ($flotante === null)
20
  throw new ProblemDetailsException([
21
   "status" => BAD_REQUEST,
22
   "title" => "Campo $parametro en blanco.",
23
   "type" => "/error/camponumericoenblanco.html",
24
   "detail" => "Pon un número en el campo $parametro."
25
  ]);
26
27
 return $flotante;
28
}
29

15. php / lib / recibeTexto.php

1
<?php
2
3
/**
4
 * Devuelve el texto de un parámetro enviado al
5
 * servidor por medio de GET, POST o cookie.
6
 * 
7
 * Si el parámetro no se recibe, devuelve false.
8
 */
9
function recibeTexto(string $parametro): false|string
10
{
11
 /* Si el parámetro está asignado en $_REQUEST,
12
  * devuelve su valor; de lo contrario, devuelve false.
13
  */
14
 $valor = isset($_REQUEST[$parametro])
15
  ? $_REQUEST[$parametro]
16
  : false;
17
 return $valor;
18
}
19

16. php / lib / recibeTextoObligatorio.php

1
<?php
2
3
require_once __DIR__ . "/BAD_REQUEST.php";
4
require_once __DIR__ . "/recibeTexto.php";
5
require_once __DIR__ . "/ProblemDetailsException.php";
6
7
function recibeTextoObligatorio(string $parametro)
8
{
9
 $texto = recibeTexto($parametro);
10
11
 if ($texto === false)
12
  throw new ProblemDetailsException([
13
   "status" => BAD_REQUEST,
14
   "title" => "Falta el valor $parametro.",
15
   "type" => "/errors/faltavalor.html",
16
   "detail" => "La solicitud no tiene el valor de $parametro."
17
  ]);
18
19
 $trimTexto = trim($texto);
20
21
 if ($trimTexto === "")
22
  throw new ProblemDetailsException([
23
   "status" => BAD_REQUEST,
24
   "title" => "Campo $parametro en blanco.",
25
   "type" => "/errors/campoenblanco.html",
26
   "detail" => "Pon texto en el campo $parametro."
27
  ]);
28
29
 return $trimTexto;
30
}
31

17. php / lib / validaEntidadObligatoria.php

1
<?php
2
3
require_once __DIR__ . "/NOT_FOUND.php";
4
require_once __DIR__ . "/ProblemDetailsException.php";
5
6
function validaEntidadObligatoria(string $nombre,  $entidad)
7
{
8
9
 if ($entidad === false)
10
  throw new ProblemDetailsException([
11
  "status" => NOT_FOUND,
12
  "title" => "Registro de $nombre no encontrado.",
13
  "type" => "/errors/entidadnoencontrada.html",
14
  "detail" => "No se encontró ningún registro de $nombre con el id solicitado.",
15
  ]);
16
17
 return $entidad;
18
}
19