L. Carpeta « api »

Versión para imprimir.

A. api / 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 conexion(): 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
      VNT_ID INTEGER,
27
      VNT_EN_CAPTURA INTEGER NOT NULL,
28
      CONSTRAINT PK_VNT PRIMARY KEY(VNT_ID)
29
     )'
30
   );
31
   self::$pdo->exec(
32
    'CREATE TABLE IF NOT EXISTS PRODUCTO (
33
      PRD_ID INTEGER,
34
      PRD_NOMBRE TEXT NOT NULL,
35
      PRD_EXISTENCIAS REAL NOT NULL,
36
      PRD_PRECIO REAL NOT NULL,
37
      CONSTRAINT PK_PRD PRIMARY KEY(PRD_ID),
38
      CONSTRAINT UQ_PRD_NOM UNIQUE(PRD_NOMBRE),
39
      CONSTRAINT CHK_PRD_NOM CHECK(LENGTH(PRD_NOMBRE) > 0)
40
     )'
41
   );
42
   self::$pdo->exec(
43
    'CREATE TABLE IF NOT EXISTS DET_VENTA (
44
      DTV_VNT_ID INTEGER NOT NULL,
45
      DTV_PRD_ID INTEGER NOT NULL,
46
      DTV_CANTIDAD REAL NOT NULL,
47
      DTV_PRECIO REAL NOT NULL,
48
      CONSTRAINT PK_DTV PRIMARY KEY (DTV_VNT_ID, DTV_PRD_ID),
49
      CONSTRAINT FK_DTV_VNT FOREIGN KEY (DTV_VNT_ID) REFERENCES VENTA(VNT_ID),
50
      CONSTRAINT FK_DTV_PRD FOREIGN KEY (DTV_PRD_ID) REFERENCES PRODUCTO(PRD_ID)
51
      )'
52
   );
53
54
   $cantidadDeProductos =
55
    self::$pdo->query("SELECT COUNT(PRD_ID) FROM PRODUCTO")->fetchColumn(0);
56
57
   if ($cantidadDeProductos === 0) {
58
    self::$pdo->exec(
59
     "INSERT INTO PRODUCTO
60
       (PRD_NOMBRE, PRD_EXISTENCIAS, PRD_PRECIO)
61
      VALUES
62
       ('Sandwich', 50, 15),
63
       ('Hot dog', 40, 30),
64
       ('Hamburguesa', 30, 40)"
65
    );
66
   }
67
68
   $cantidadDeVentas =
69
    self::$pdo->query("SELECT COUNT(VNT_ID) FROM VENTA")->fetchColumn(0);
70
71
   if ($cantidadDeVentas === 0) {
72
    ventaEnCapturaAgrega(self::$pdo);
73
   }
74
  }
75
76
  return self::$pdo;
77
 }
78
}
79

B. api / det-venta-agrega.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/../libservidorphp/recibeFlotanteObligatorio.php";
6
require_once __DIR__ . "/../libservidorphp/validaEntidadObligatoria.php";
7
require_once __DIR__ . "/../libservidorphp/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::conexion();
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
    DTV_VNT_ID, DTV_PRD_ID, DTV_CANTIDAD, DTV_PRECIO
27
   ) values (
28
    :DTV_VNT_ID, :DTV_PRD_ID, :DTV_CANTIDAD, :DTV_PRECIO
29
   )"
30
);
31
$stmt->execute([
32
 ":DTV_VNT_ID" => $venta["VNT_ID"],
33
 ":DTV_PRD_ID" => $prodId,
34
 ":DTV_CANTIDAD" => $cantidad,
35
 ":DTV_PRECIO" => $producto["PRD_PRECIO"],
36
]);
37
38
$encodeProdId = urlencode($prodId);
39
devuelveCreated("/api/vista-modifica.php?id=$encodeProdId", [
40
 "prodId" => ["value" => $prodId],
41
 "prodNombre" => ["value" => $producto["PRD_NOMBRE"]],
42
 "precio" => ["value" => "$" . number_format($producto["PRD_PRECIO"], 2)],
43
 "cantidad" => ["valueAsNumber" => $cantidad],
44
]);
45

C. api / det-venta-elimina.php

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

D. api / det-venta-modifica.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/../libservidorphp/recibeFlotanteObligatorio.php";
6
require_once __DIR__ . "/../libservidorphp/validaEntidadObligatoria.php";
7
require_once __DIR__ . "/../libservidorphp/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::conexion();
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
   DTV_VNT_ID = :DTV_VNT_ID
30
    AND DTV_PRD_ID = :DTV_PRD_ID"
31
);
32
$stmt->execute([
33
 ":DTV_CANTIDAD" => $cantidad,
34
 ":DTV_PRECIO" => $producto["PRD_PRECIO"],
35
 ":DTV_VNT_ID" => $venta["VNT_ID"],
36
 ":DTV_PRD_ID" => $prodId
37
]);
38
39
devuelveJson([
40
 "prodId" => ["value" => $prodId],
41
 "prodNombre" => ["value" => $producto["PRD_NOMBRE"]],
42
 "precio" => ["value" => "$" . number_format($producto["PRD_PRECIO"], 2)],
43
 "cantidad" => ["valueAsNumber" => $cantidad],
44
]);
45

E. api / detVentaConsulta.php

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

F. api / productoBusca.php

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

G. api / venta-en-captura-procesa.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/devuelveCreated.php";
5
require_once __DIR__ . "/../libservidorphp/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::conexion();
12
$bd->beginTransaction();
13
14
$venta = ventaEnCapturaBusca($bd);
15
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
16
17
$detalles = detVentaConsulta($bd, $venta["VNT_ID"]);
18
19
// Actualiza las existencias de los productos vendidos.
20
$update = $bd->prepare(
21
 "UPDATE PRODUCTO
22
   SET PRD_EXISTENCIAS = :PRD_EXISTENCIAS
23
   WHERE PRD_ID = :PRD_ID"
24
);
25
foreach ($detalles as $detVenta) {
26
 $update->execute([
27
  ":PRD_ID" => $detVenta["DTV_PRD_ID"],
28
  ":PRD_EXISTENCIAS" =>
29
  $detVenta["PRD_EXISTENCIAS"] - $detVenta["DTV_CANTIDAD"]
30
 ]);
31
}
32
33
$update = $bd->prepare(
34
 "UPDATE VENTA
35
   SET VNT_EN_CAPTURA = 0
36
   WHERE VNT_ID = :VNT_ID"
37
);
38
$update->execute([":VNT_ID" => $venta["VNT_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

H. api / ventaEnCapturaAgrega.php

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

I. api / ventaEnCapturaBusca.php

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

J. api / vista-agrega.php

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

K. api / vista-carrito.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
5
require_once __DIR__ . "/../libservidorphp/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::conexion();
12
13
$venta = ventaEnCapturaBusca($bd);
14
$venta = validaEntidadObligatoria("Venta en captura",  $venta);
15
16
$detalles = detVentaConsulta($bd, $venta["VNT_ID"]);
17
18
$renderDetalles = "";
19
foreach ($detalles as $detVenta) {
20
 $prodId = $detVenta["DTV_PRD_ID"];
21
 $query = htmlentities(http_build_query(["prodId" => $prodId]));
22
 $urlModifica = "modifica.html?$query";
23
 $prodNombre = htmlentities($detVenta["PRD_NOMBRE"]);
24
 $precio = htmlentities("$" . number_format($detVenta["PRD_PRECIO"], 2));
25
 $cantidad = htmlentities(number_format($detVenta["DTV_CANTIDAD"], 2));
26
 $renderDetalles .=
27
  "<dt>$prodNombre</dt>
28
    <dd>
29
     <a href= '$urlModifica'>Modificar o eliminar</a>
30
    </dd>
31
    <dd>
32
     <dl>
33
      <dt>Cantidad</dt>
34
      <dd>$cantidad</dd>
35
      <dt>Precio</dt>
36
      <dd>$precio</dd>
37
     </dl>
38
    </dd>";
39
}
40
41
devuelveJson([
42
 "folio" => ["value" => $venta["VNT_ID"]],
43
 "detalles" => ["innerHTML" => $renderDetalles]
44
]);
45

L. api / vista-index.php

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

M. api / vista-modifica.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/recibeEnteroObligatorio.php";
5
require_once __DIR__ . "/../libservidorphp/validaEntidadObligatoria.php";
6
require_once __DIR__ . "/../libservidorphp/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::conexion();
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 *
23
   FROM DET_VENTA
24
   WHERE DTV_VNT_ID = :DTV_VNT_ID AND DTV_PRD_ID = :DTV_PRD_ID"
25
);
26
$stmt->execute([":DTV_VNT_ID" => $venta["VNT_ID"], ":DTV_PRD_ID" => $prodId]);
27
$detVenta = $stmt->fetch(PDO::FETCH_ASSOC);
28
$detVenta = validaEntidadObligatoria("Detalle de venta",  $detVenta);
29
30
devuelveJson([
31
 "prodId" => ["value" => $prodId],
32
 "prodNombre" => ["value" => $producto["PRD_NOMBRE"]],
33
 "precio" => ["value" => "$" . number_format($detVenta["DTV_PRECIO"], 2)],
34
 "cantidad" => ["valueAsNumber" => $detVenta["DTV_CANTIDAD"]],
35
]);
36