K. Carpeta « srv »

Versión para imprimir.

A. srv / Bd.php

1<?php
2
3require_once __DIR__ . "/ventaEnCapturaAgrega.php";
4
5class 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: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();
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();
77
78 if ($cantidadDeVentas === 0) {
79 ventaEnCapturaAgrega(self::$pdo);
80 }
81 }
82
83 return self::$pdo;
84 }
85}
86

B. srv / det-venta-agrega.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/recuperaDecimal.php";
6require_once __DIR__ . "/../lib/php/insert.php";
7require_once __DIR__ . "/../lib/php/devuelveCreated.php";
8require_once __DIR__ . "/Bd.php";
9require_once __DIR__ . "/TABLA_VENTA.php";
10require_once __DIR__ . "/TABLA_PRODUCTO.php";
11require_once __DIR__ . "/TABLA_DET_VENTA.php";
12require_once __DIR__ . "/validaCantidad.php";
13require_once __DIR__ . "/productoBusca.php";
14require_once __DIR__ . "/validaProducto.php";
15require_once __DIR__ . "/ventaEnCapturaBusca.php";
16require_once __DIR__ . "/validaVenta.php";
17
18ejecutaServicio(function () {
19
20 $prodId = recuperaIdEntero("id");
21 $cantidad = recuperaDecimal("cantidad");
22
23 $cantidad = validaCantidad($cantidad);
24
25 $pdo = Bd::pdo();
26
27 $producto = productoBusca($pdo, $prodId);
28 validaProducto($producto, $prodId);
29
30 $venta = ventaEnCapturaBusca($pdo);
31 validaVenta($venta);
32
33 insert(
34 pdo: Bd::pdo(),
35 into: DET_VENTA,
36 values: [
37 VENT_ID => $venta[VENT_ID],
38 PROD_ID => $prodId,
39 DTV_CANTIDAD => $cantidad,
40 DTV_PRECIO => $producto[PROD_PRECIO],
41 ]
42 );
43
44 $encodeProdId = urlencode($prodId);
45 devuelveCreated("/srv/det-venta.php?id=$encodeProdId", [
46 "prodId" => ["value" => $prodId],
47 "prodNombre" => ["value" => $producto[PROD_NOMBRE]],
48 "precio" => ["value" => "$" . number_format($producto[PROD_PRECIO], 2)],
49 "cantidad" => ["valueAsNumber" => $cantidad],
50 ]);
51});
52

C. srv / det-venta-elimina.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/devuelveNoContent.php";
6require_once __DIR__ . "/../lib/php/delete.php";
7require_once __DIR__ . "/Bd.php";
8require_once __DIR__ . "/TABLA_VENTA.php";
9require_once __DIR__ . "/TABLA_PRODUCTO.php";
10require_once __DIR__ . "/TABLA_DET_VENTA.php";
11require_once __DIR__ . "/ventaEnCapturaBusca.php";
12
13ejecutaServicio(function () {
14
15 $prodId = recuperaIdEntero("prodId");
16
17 $pdo = Bd::pdo();
18
19 $venta = ventaEnCapturaBusca($pdo);
20 if ($venta !== false) {
21 delete(
22 pdo: $pdo,
23 from: DET_VENTA,
24 where: [VENT_ID => $venta[VENT_ID], PROD_ID => $prodId]
25 );
26 }
27 devuelveNoContent();
28});
29

D. srv / det-venta-modifica.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/recuperaDecimal.php";
6require_once __DIR__ . "/../lib/php/update.php";
7require_once __DIR__ . "/../lib/php/devuelveJson.php";
8require_once __DIR__ . "/Bd.php";
9require_once __DIR__ . "/TABLA_VENTA.php";
10require_once __DIR__ . "/TABLA_PRODUCTO.php";
11require_once __DIR__ . "/TABLA_DET_VENTA.php";
12require_once __DIR__ . "/validaCantidad.php";
13require_once __DIR__ . "/productoBusca.php";
14require_once __DIR__ . "/validaProducto.php";
15require_once __DIR__ . "/ventaEnCapturaBusca.php";
16require_once __DIR__ . "/validaVenta.php";
17
18ejecutaServicio(function () {
19
20 $prodId = recuperaIdEntero("prodId");
21 $cantidad = recuperaDecimal("cantidad");
22
23 $cantidad = validaCantidad($cantidad);
24
25 $pdo = Bd::pdo();
26
27 $producto = productoBusca($pdo, $prodId);
28 validaProducto($producto, $prodId);
29
30 $venta = ventaEnCapturaBusca($pdo);
31 validaVenta($venta);
32
33 update(
34 pdo: Bd::pdo(),
35 table: DET_VENTA,
36 set: [DTV_CANTIDAD => $cantidad, DTV_PRECIO => $producto[PROD_PRECIO]],
37 where: [VENT_ID => $venta[VENT_ID], PROD_ID => $prodId]
38 );
39
40 devuelveJson([
41 "prodId" => ["value" => $prodId],
42 "prodNombre" => ["value" => $producto[PROD_NOMBRE]],
43 "precio" => ["value" => "$" . number_format($producto[PROD_PRECIO], 2)],
44 "cantidad" => ["valueAsNumber" => $cantidad],
45 ]);
46});
47

E. srv / det-venta.php

1<?php
2
3require_once __DIR__ . "/../lib/php/NOT_FOUND.php";
4require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
5require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
6require_once __DIR__ . "/../lib/php/selectFirst.php";
7require_once __DIR__ . "/../lib/php/devuelveJson.php";
8require_once __DIR__ . "/../lib/php/ProblemDetails.php";
9require_once __DIR__ . "/Bd.php";
10require_once __DIR__ . "/TABLA_VENTA.php";
11require_once __DIR__ . "/TABLA_PRODUCTO.php";
12require_once __DIR__ . "/TABLA_DET_VENTA.php";
13require_once __DIR__ . "/productoBusca.php";
14require_once __DIR__ . "/validaProducto.php";
15require_once __DIR__ . "/ventaEnCapturaBusca.php";
16require_once __DIR__ . "/validaVenta.php";
17
18ejecutaServicio(function () {
19
20 $prodId = recuperaIdEntero("prodId");
21
22 $pdo = Bd::pdo();
23
24 $venta = ventaEnCapturaBusca($pdo);
25 validaVenta($venta);
26
27 $producto = productoBusca($pdo, $prodId);
28 validaProducto($producto, $prodId);
29
30 $detVenta = selectFirst(
31 pdo: $pdo,
32 from: DET_VENTA,
33 where: [
34 VENT_ID => $venta[VENT_ID],
35 PROD_ID => $prodId
36 ]
37 );
38
39 if ($detVenta === false) {
40 $htmlId = htmlentities($prodId);
41 throw new ProblemDetails(
42 status: NOT_FOUND,
43 type: "/error/detalledeventanoencontrado.html",
44 title: "Detalle de venta no encontrado.",
45 detail: "No se encontró ningún detalle de venta con el id de producto "
46 . $htmlId . ".",
47 );
48 }
49
50 devuelveJson([
51 "prodId" => ["value" => $prodId],
52 "prodNombre" => ["value" => $producto[PROD_NOMBRE]],
53 "precio" => ["value" => "$" . number_format($detVenta[DTV_PRECIO], 2)],
54 "cantidad" => ["valueAsNumber" => $detVenta[DTV_CANTIDAD]],
55 ]);
56});
57

F. srv / detVentaConsulta.php

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

G. srv / producto.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/devuelveJson.php";
6require_once __DIR__ . "/Bd.php";
7require_once __DIR__ . "/productoBusca.php";
8require_once __DIR__ . "/validaProducto.php";
9
10ejecutaServicio(function () {
11
12 $id = recuperaIdEntero("id");
13
14 $producto = productoBusca(Bd::pdo(), $id);
15 validaProducto($producto, $id);
16
17 devuelveJson([
18 "id" => ["value" => $id],
19 "producto" => ["value" => $producto[PROD_NOMBRE]],
20 "precio" => ["value" => "$" . number_format($producto[PROD_PRECIO], 2)],
21 ]);
22});
23

H. srv / productoBusca.php

1<?php
2
3require_once __DIR__ . "/../lib/php/selectFirst.php";
4require_once __DIR__ . "/Bd.php";
5require_once __DIR__ . "/TABLA_PRODUCTO.php";
6
7function productoBusca(PDO $pdo, int $id)
8{
9 return selectFirst(pdo: $pdo, from: PRODUCTO, where: [PROD_ID => $id]);
10}
11

I. srv / productos.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/select.php";
5require_once __DIR__ . "/../lib/php/devuelveJson.php";
6require_once __DIR__ . "/Bd.php";
7require_once __DIR__ . "/TABLA_PRODUCTO.php";
8
9ejecutaServicio(function () {
10
11 $pdo = Bd::pdo();
12
13 $lista = select(pdo: $pdo, from: PRODUCTO, orderBy: PROD_NOMBRE);
14
15 $render = "";
16 foreach ($lista as $modelo) {
17 $encodeId = urlencode($modelo[PROD_ID]);
18 $id = htmlentities($encodeId);
19 $nombre = htmlentities($modelo[PROD_NOMBRE]);
20 $precio = htmlentities("$" . number_format($modelo[PROD_PRECIO], 2));
21 $existencias = htmlentities(number_format($modelo[PROD_EXISTENCIAS], 2));
22 $render .=
23 "<dt>$nombre</dt>
24 <dd>
25 <a href='agrega.html?id=$id'>Agregar al carrito</a>
26 </dd>
27 <dd>
28 <dl>
29 <dt>Precio</dt>
30 <dd>$precio</dd>
31 <dt>Existencias</dt>
32 <dd>$existencias</dd>
33 </dl>
34 </dd>";
35 }
36 devuelveJson(["lista" => ["innerHTML" => $render]]);
37});
38

J. srv / TABLA_DET_VENTA.php

1<?php
2
3const DET_VENTA = "DET_VENTA";
4const DTV_CANTIDAD = "DTV_CANTIDAD";
5const DTV_PRECIO = "DTV_PRECIO";
6

K. srv / TABLA_PRODUCTO.php

1<?php
2
3const PRODUCTO = "PRODUCTO";
4const PROD_ID = "PROD_ID";
5const PROD_NOMBRE = "PROD_NOMBRE";
6const PROD_EXISTENCIAS = "PROD_EXISTENCIAS";
7const PROD_PRECIO = "PROD_PRECIO";
8

L. srv / TABLA_VENTA.php

1<?php
2
3const VENTA = "VENTA";
4const VENT_ID = "VENT_ID";
5const VENT_EN_CAPTURA = "VENT_EN_CAPTURA";
6

M. srv / validaCantidad.php

1<?php
2
3require_once __DIR__ . "/../lib/php/BAD_REQUEST.php";
4require_once __DIR__ . "/../lib/php/ProblemDetails.php";
5
6function validaCantidad(false|null|float $cantidad)
7{
8 if ($cantidad === false)
9 throw new ProblemDetails(
10 status: BAD_REQUEST,
11 title: "Falta la cantidad.",
12 type: "/error/faltacantidad.html",
13 detail: "La solicitud no tiene el valor de cantidad."
14 );
15
16 if ($cantidad === null)
17 throw new ProblemDetails(
18 status: BAD_REQUEST,
19 title: "Falta la cantidad.",
20 type: "/error/cantidadenblanco.html",
21 detail: "Pon un número en el campo cantidad."
22 );
23
24 return $cantidad;
25}
26

N. srv / validaProducto.php

1<?php
2
3require_once __DIR__ . "/../lib/php/NOT_FOUND.php";
4
5function validaProducto($producto, $prodId)
6{
7 if ($producto === false) {
8 $htmlId = htmlentities($prodId);
9 throw new ProblemDetails(
10 status: NOT_FOUND,
11 title: "Producto no encontrado.",
12 type: "/error/productonoencontrado.html",
13 detail: "No se encontró ningún producto con el id $htmlId.",
14 );
15 }
16}
17

O. srv / validaVenta.php

1<?php
2
3require_once __DIR__ . "/../lib/php/BAD_REQUEST.php";
4
5function validaVenta($venta)
6{
7 if ($venta === false)
8 throw new ProblemDetails(
9 status: BAD_REQUEST,
10 title: "Venta en captura no encontrada.",
11 type: "/error/ventaencapturanoencontrada.html",
12 detail: "No se encontró ninguna venta en captura.",
13 );
14}
15

P. srv / venta-en-captura-procesa.php

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

Q. srv / venta-en-captura.php

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

R. srv / ventaEnCapturaAgrega.php

1<?php
2
3require_once __DIR__ . "/../lib/php/selectFirst.php";
4
5function ventaEnCapturaAgrega(PDO $pdo)
6{
7 $pdo->exec("INSERT INTO VENTA (VENT_EN_CAPTURA) VALUES (1)");
8}
9

S. srv / ventaEnCapturaBusca.php

1<?php
2
3require_once __DIR__ . "/../lib/php/fetch.php";
4
5function ventaEnCapturaBusca(PDO $pdo)
6{
7 return fetch($pdo->query("SELECT * FROM VENTA WHERE VENT_EN_CAPTURA = 1"));
8}
9