JairoDanielMT commited on
Commit
bccba0d
1 Parent(s): 65fc9a2

eliminado de t.gama, t.montura quitar id_gama y agregar marca,color, material

Browse files
Files changed (6) hide show
  1. .gitignore +1 -0
  2. Dockerfile +15 -0
  3. app.py +1280 -0
  4. optica.db +0 -0
  5. requirements.txt +3 -0
  6. tablas.py +148 -0
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ __pycache__
Dockerfile ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Usa una imagen base de Python
2
+ FROM python:3.9
3
+ # Establece el directorio de trabajo
4
+ WORKDIR /code
5
+
6
+ # Copia los archivos necesarios al contenedor
7
+ COPY ./requirements.txt /code/requirements.txt
8
+ RUN pip install --no-cache-dir -r /code/requirements.txt
9
+
10
+ COPY . .
11
+
12
+ RUN chmod -R 777 /code
13
+
14
+ # Comando para ejecutar la aplicaci贸n
15
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,1280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+ import threading
3
+ from queue import Queue
4
+ from pydantic import BaseModel
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+ from fastapi import FastAPI, HTTPException
7
+
8
+
9
+ app = FastAPI()
10
+
11
+
12
+ app.add_middleware(
13
+ CORSMiddleware,
14
+ allow_origins=["*"],
15
+ allow_credentials=True,
16
+ allow_methods=["*"],
17
+ allow_headers=["*"],
18
+ )
19
+
20
+
21
+ class DatabaseConnection:
22
+ """
23
+ Clase para gestionar las conexiones a la base de datos con un pool.
24
+ """
25
+
26
+ _instance = None
27
+ _lock = threading.Lock()
28
+ _connection_pool = Queue(maxsize=5)
29
+
30
+ def __new__(cls):
31
+ """
32
+ Crea una nueva instancia de la clase si no existe.
33
+ """
34
+ with cls._lock:
35
+ if cls._instance is None:
36
+ cls._instance = super().__new__(cls)
37
+ cls._instance.conn = cls._instance._create_connection()
38
+ return cls._instance
39
+
40
+ def _create_connection(self):
41
+ """
42
+ Crea una conexi贸n a la base de datos.
43
+ """
44
+ if not self._connection_pool.empty():
45
+ return self._connection_pool.get()
46
+ else:
47
+ connection = sqlite3.connect("optica.db")
48
+ connection.row_factory = sqlite3.Row
49
+ return connection
50
+
51
+ def get_connection(self):
52
+ """
53
+ Obtener el objeto de conexi贸n de la base de datos.
54
+ """
55
+ return self._instance._create_connection()
56
+
57
+ def release_connection(self):
58
+ """
59
+ Liberar la conexi贸n de nuevo al pool.
60
+ """
61
+ if self._instance is not None:
62
+ self._connection_pool.put(self._instance.conn)
63
+ self._instance.conn = None # Marcar la instancia como sin conexi贸n
64
+
65
+
66
+ # saludo
67
+ @app.get("/")
68
+ def read_root():
69
+ return {"mensaje": "API de la 贸ptica del curso de ADS"}
70
+
71
+
72
+ """
73
+ CREATE TABLE Roles (
74
+ id_rol INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ rol VARCHAR
76
+ )
77
+ """
78
+
79
+
80
+ # get/roles -> obtener todos los roles con with connection as conn, manejo de errores
81
+ @app.get("/roles")
82
+ def get_roles():
83
+ try:
84
+ with DatabaseConnection().get_connection() as conn:
85
+ cursor = conn.cursor()
86
+ cursor.execute("SELECT * FROM Roles")
87
+ roles = cursor.fetchall()
88
+ return roles
89
+ except Exception as e:
90
+ raise HTTPException(status_code=500, detail=str(e))
91
+
92
+
93
+ @app.get("/roles/{id_rol}")
94
+ def get_rol(id_rol: int):
95
+ try:
96
+ with DatabaseConnection().get_connection() as conn:
97
+ cursor = conn.cursor()
98
+ cursor.execute("SELECT * FROM Roles WHERE id_rol = ?", (id_rol,))
99
+ rol = cursor.fetchone()
100
+ return rol
101
+ except Exception as e:
102
+ raise HTTPException(status_code=500, detail=str(e))
103
+
104
+
105
+ # clase y metodo post para buscar rol por nombre
106
+ class RolNombre(BaseModel):
107
+ rol: str
108
+
109
+
110
+ @app.post("/roles/busqueda")
111
+ def buscar_rol(rol: RolNombre):
112
+ try:
113
+ with DatabaseConnection().get_connection() as conn:
114
+ cursor = conn.cursor()
115
+ cursor.execute("SELECT * FROM Roles WHERE rol = ?", (rol.rol,))
116
+ rol = cursor.fetchone()
117
+ return rol
118
+ except Exception as e:
119
+ raise HTTPException(status_code=500, detail=str(e))
120
+
121
+
122
+ # post/roles -> crear un rol con una clase pydantic
123
+ class Rol(BaseModel):
124
+ rol: str
125
+
126
+
127
+ # post/roles -> crear un rol con una clase pydantic
128
+ @app.post("/roles")
129
+ def create_rol(rol: Rol):
130
+ try:
131
+ with DatabaseConnection().get_connection() as conn:
132
+ cursor = conn.cursor()
133
+ cursor.execute("INSERT INTO Roles (rol) VALUES (?)", (rol.rol,))
134
+ conn.commit()
135
+ return {"mensaje": "Rol creado exitosamente"}
136
+ except Exception as e:
137
+ raise HTTPException(status_code=500, detail=str(e))
138
+
139
+
140
+ # put/roles -> actualizar un rol con una clase pydantic
141
+ class RolUpdate(BaseModel):
142
+ id_rol: int
143
+ rol: str
144
+
145
+
146
+ @app.put("/roles")
147
+ def update_rol(rol: RolUpdate):
148
+ try:
149
+ with DatabaseConnection().get_connection() as conn:
150
+ cursor = conn.cursor()
151
+ cursor.execute(
152
+ "UPDATE Roles SET rol = ? WHERE id_rol = ?", (rol.rol, rol.id_rol)
153
+ )
154
+ conn.commit()
155
+ return {"mensaje": "Rol actualizado exitosamente"}
156
+ except Exception as e:
157
+ raise HTTPException(status_code=500, detail=str(e))
158
+
159
+
160
+ # delete/roles -> eliminar un rol con una clase pydantic
161
+ class RolDelete(BaseModel):
162
+ id_rol: int
163
+
164
+
165
+ @app.delete("/roles")
166
+ def delete_rol(rol: RolDelete):
167
+ try:
168
+ with DatabaseConnection().get_connection() as conn:
169
+ cursor = conn.cursor()
170
+ cursor.execute("DELETE FROM Roles WHERE id_rol = ?", (rol.id_rol,))
171
+ conn.commit()
172
+ return {"mensaje": "Rol eliminado exitosamente"}
173
+ except Exception as e:
174
+ raise HTTPException(status_code=500, detail=str(e))
175
+
176
+
177
+ """
178
+ CREATE TABLE Usuario (
179
+ id_usuario INTEGER PRIMARY KEY AUTOINCREMENT,
180
+ nombre_usuario VARCHAR,
181
+ dni VARCHAR,
182
+ clave VARCHAR,
183
+ id_rol INTEGER REFERENCES Roles(id_rol),
184
+ estado VARCHAR
185
+ )
186
+ """
187
+
188
+
189
+ # get/usuarios -> obtener todos los usuarios con with connection as conn, manejo de errores
190
+ @app.get("/usuarios")
191
+ def get_usuarios():
192
+ try:
193
+ with DatabaseConnection().get_connection() as conn:
194
+ cursor = conn.cursor()
195
+ cursor.execute("SELECT * FROM Usuario")
196
+ usuarios = cursor.fetchall()
197
+ return usuarios
198
+ except Exception as e:
199
+ raise HTTPException(status_code=500, detail=str(e))
200
+
201
+
202
+ # get/usuarios/{id_usuario} -> obtener un usuario por id
203
+ @app.get("/usuarios/{id_usuario}")
204
+ def get_usuario(id_usuario: int):
205
+ try:
206
+ with DatabaseConnection().get_connection() as conn:
207
+ cursor = conn.cursor()
208
+ cursor.execute("SELECT * FROM Usuario WHERE id_usuario = ?", (id_usuario,))
209
+ usuario = cursor.fetchone()
210
+ return usuario
211
+ except Exception as e:
212
+ raise HTTPException(status_code=500, detail=str(e))
213
+
214
+
215
+ # metodo de busqueda de usuario por nombre con like, manejo de errores y clase pydantic
216
+ class UsuarioNombre(BaseModel):
217
+ nombre_usuario: str
218
+
219
+
220
+ # post/usuarios/busqueda -> buscar un usuario por nombre
221
+ @app.post("/usuarios/busqueda")
222
+ def buscar_usuario(usuario: UsuarioNombre):
223
+ try:
224
+ with DatabaseConnection().get_connection() as conn:
225
+ cursor = conn.cursor()
226
+ cursor.execute(
227
+ "SELECT * FROM Usuario WHERE nombre_usuario LIKE ?",
228
+ (usuario.nombre_usuario,),
229
+ )
230
+ usuario = cursor.fetchone()
231
+ return usuario
232
+ except Exception as e:
233
+ raise HTTPException(status_code=500, detail=str(e))
234
+
235
+
236
+ # post/usuarios -> crear un usuario con una clase pydantic
237
+ class Usuario(BaseModel):
238
+ nombre_usuario: str
239
+ dni: str
240
+ clave: str
241
+ id_rol: int
242
+ estado: str
243
+
244
+
245
+ @app.post("/usuarios")
246
+ def create_usuario(usuario: Usuario):
247
+ try:
248
+ with DatabaseConnection().get_connection() as conn:
249
+ cursor = conn.cursor()
250
+ cursor.execute(
251
+ "INSERT INTO Usuario (nombre_usuario, dni, clave, id_rol, estado) VALUES (?, ?, ?, ?, ?)",
252
+ (
253
+ usuario.nombre_usuario,
254
+ usuario.dni,
255
+ usuario.clave,
256
+ usuario.id_rol,
257
+ usuario.estado,
258
+ ),
259
+ )
260
+ conn.commit()
261
+ return {"mensaje": "Usuario creado exitosamente"}
262
+ except Exception as e:
263
+ raise HTTPException(status_code=500, detail=str(e))
264
+
265
+
266
+ # put/usuarios -> actualizar un usuario con una clase pydantic
267
+ class UsuarioUpdate(BaseModel):
268
+ id_usuario: int
269
+ nombre_usuario: str
270
+ dni: str
271
+ clave: str
272
+ id_rol: int
273
+ estado: str
274
+
275
+
276
+ @app.put("/usuarios")
277
+ def update_usuario(usuario: UsuarioUpdate):
278
+ try:
279
+ with DatabaseConnection().get_connection() as conn:
280
+ cursor = conn.cursor()
281
+ cursor.execute(
282
+ "UPDATE Usuario SET nombre_usuario = ?, dni = ?, clave = ?, id_rol = ?, estado = ? WHERE id_usuario = ?",
283
+ (
284
+ usuario.nombre_usuario,
285
+ usuario.dni,
286
+ usuario.clave,
287
+ usuario.id_rol,
288
+ usuario.estado,
289
+ usuario.id_usuario,
290
+ ),
291
+ )
292
+ conn.commit()
293
+ return {"mensaje": "Usuario actualizado exitosamente"}
294
+ except Exception as e:
295
+ raise HTTPException(status_code=500, detail=str(e))
296
+
297
+
298
+ # delete/usuarios -> eliminar un usuario con una clase pydantic
299
+ class UsuarioDelete(BaseModel):
300
+ id_usuario: int
301
+
302
+
303
+ @app.delete("/usuarios")
304
+ def delete_usuario(usuario: UsuarioDelete):
305
+ try:
306
+ with DatabaseConnection().get_connection() as conn:
307
+ cursor = conn.cursor()
308
+ cursor.execute(
309
+ "DELETE FROM Usuario WHERE id_usuario = ?", (usuario.id_usuario,)
310
+ )
311
+ conn.commit()
312
+ return {"mensaje": "Usuario eliminado exitosamente"}
313
+ except Exception as e:
314
+ raise HTTPException(status_code=500, detail=str(e))
315
+
316
+
317
+ """
318
+ CREATE TABLE Cliente (
319
+ id_cliente INTEGER PRIMARY KEY AUTOINCREMENT,
320
+ nombres_y_apellidos VARCHAR,
321
+ edad INTEGER,
322
+ telefono INTEGER,
323
+ direccion VARCHAR
324
+ )
325
+ """
326
+
327
+
328
+ # get/clientes -> obtener todos los clientes con with connection as conn, manejo de errores
329
+ @app.get("/clientes")
330
+ def get_clientes():
331
+ try:
332
+ with DatabaseConnection().get_connection() as conn:
333
+ cursor = conn.cursor()
334
+ cursor.execute("SELECT * FROM Cliente")
335
+ clientes = cursor.fetchall()
336
+ return clientes
337
+ except Exception as e:
338
+ raise HTTPException(status_code=500, detail=str(e))
339
+
340
+
341
+ @app.get("/clientes/{id_cliente}")
342
+ def get_cliente(id_cliente: int):
343
+ try:
344
+ with DatabaseConnection().get_connection() as conn:
345
+ cursor = conn.cursor()
346
+ cursor.execute("SELECT * FROM Cliente WHERE id_cliente = ?", (id_cliente,))
347
+ cliente = cursor.fetchone()
348
+ return cliente
349
+ except Exception as e:
350
+ raise HTTPException(status_code=500, detail=str(e))
351
+
352
+
353
+ # metodo de busqueda de cliente por nombre con like, manejo de errores y clase pydantic
354
+ class ClienteNombre(BaseModel):
355
+ nombres_y_apellidos: str
356
+
357
+
358
+ @app.post("/clientes/busqueda")
359
+ def buscar_cliente(cliente: ClienteNombre):
360
+ try:
361
+ with DatabaseConnection().get_connection() as conn:
362
+ cursor = conn.cursor()
363
+ cursor.execute(
364
+ "SELECT * FROM Cliente WHERE nombres_y_apellidos LIKE ?",
365
+ (cliente.nombres_y_apellidos,),
366
+ )
367
+ cliente = cursor.fetchone()
368
+ return cliente
369
+ except Exception as e:
370
+ raise HTTPException(status_code=500, detail=str(e))
371
+
372
+
373
+ # post/clientes -> crear un cliente con una clase pydantic
374
+ class Cliente(BaseModel):
375
+ nombres_y_apellidos: str
376
+ edad: int
377
+ telefono: int
378
+ direccion: str
379
+
380
+
381
+ @app.post("/clientes")
382
+ def create_cliente(cliente: Cliente):
383
+ try:
384
+ with DatabaseConnection().get_connection() as conn:
385
+ cursor = conn.cursor()
386
+ cursor.execute(
387
+ "INSERT INTO Cliente (nombres_y_apellidos, edad, telefono, direccion) VALUES (?, ?, ?, ?)",
388
+ (
389
+ cliente.nombres_y_apellidos,
390
+ cliente.edad,
391
+ cliente.telefono,
392
+ cliente.direccion,
393
+ ),
394
+ )
395
+ conn.commit()
396
+ return {"mensaje": "Cliente creado exitosamente"}
397
+ except Exception as e:
398
+ raise HTTPException(status_code=500, detail=str(e))
399
+
400
+
401
+ # put/clientes -> actualizar un cliente con una clase pydantic
402
+ class ClienteUpdate(BaseModel):
403
+ id_cliente: int
404
+ nombres_y_apellidos: str
405
+ edad: int
406
+ telefono: int
407
+ direccion: str
408
+
409
+
410
+ @app.put("/clientes")
411
+ def update_cliente(cliente: ClienteUpdate):
412
+ try:
413
+ with DatabaseConnection().get_connection() as conn:
414
+ cursor = conn.cursor()
415
+ cursor.execute(
416
+ "UPDATE Cliente SET nombres_y_apellidos = ?, edad = ?, telefono = ?, direccion = ? WHERE id_cliente = ?",
417
+ (
418
+ cliente.nombres_y_apellidos,
419
+ cliente.edad,
420
+ cliente.telefono,
421
+ cliente.direccion,
422
+ cliente.id_cliente,
423
+ ),
424
+ )
425
+ conn.commit()
426
+ return {"mensaje": "Cliente actualizado exitosamente"}
427
+ except Exception as e:
428
+ raise HTTPException(status_code=500, detail=str(e))
429
+
430
+
431
+ # delete/clientes -> eliminar un cliente con una clase pydantic
432
+ class ClienteDelete(BaseModel):
433
+ id_cliente: int
434
+
435
+
436
+ # delete/clientes -> eliminar un cliente con una clase pydantic
437
+ @app.delete("/clientes")
438
+ def delete_cliente(cliente: ClienteDelete):
439
+ try:
440
+ with DatabaseConnection().get_connection() as conn:
441
+ cursor = conn.cursor()
442
+ cursor.execute(
443
+ "DELETE FROM Cliente WHERE id_cliente = ?", (cliente.id_cliente,)
444
+ )
445
+ conn.commit()
446
+ return {"mensaje": "Cliente eliminado exitosamente"}
447
+ except Exception as e:
448
+ raise HTTPException(status_code=500, detail=str(e))
449
+
450
+
451
+ """
452
+ CREATE TABLE Medidas (
453
+ id_medidas INTEGER PRIMARY KEY AUTOINCREMENT,
454
+ Esfera_OD_lejos REAL,
455
+ Cilindro_OD_lejos REAL,
456
+ Eje_OD_lejos REAL,
457
+ Agudeza_visual_OD_lejos REAL,
458
+ Esfera_OI_lejos REAL,
459
+ Cilindro_OI_lejos REAL,
460
+ Eje_OI_lejos REAL,
461
+ Agudeza_visual_OI_lejos REAL,
462
+ Esfera_OD_cerca REAL,
463
+ Cilindro_OD_cerca REAL,
464
+ Eje_OD_cerca REAL,
465
+ Agudeza_visual_OD_cerca REAL,
466
+ Esfera_OI_cerca REAL,
467
+ Cilindro_OI_cerca REAL,
468
+ Eje_OI_cerca REAL,
469
+ Agudeza_visual_OI_cerca REAL,
470
+ id_cliente INTEGER REFERENCES Cliente(id_cliente)
471
+ )
472
+ """
473
+
474
+
475
+ # get/medidas -> obtener todas las medidas con with connection as conn, manejo de errores
476
+ @app.get("/medidas")
477
+ def get_medidas():
478
+ try:
479
+ with DatabaseConnection().get_connection() as conn:
480
+ cursor = conn.cursor()
481
+ cursor.execute("SELECT * FROM Medidas")
482
+ medidas = cursor.fetchall()
483
+ return medidas
484
+ except Exception as e:
485
+ raise HTTPException(status_code=500, detail=str(e))
486
+
487
+
488
+ # get/medidas/{id_medidas} -> obtener una medida por id
489
+ @app.get("/medidas/{id_medidas}")
490
+ def get_medida(id_medidas: int):
491
+ try:
492
+ with DatabaseConnection().get_connection() as conn:
493
+ cursor = conn.cursor()
494
+ cursor.execute("SELECT * FROM Medidas WHERE id_medidas = ?", (id_medidas,))
495
+ medida = cursor.fetchone()
496
+ return medida
497
+ except Exception as e:
498
+ raise HTTPException(status_code=500, detail=str(e))
499
+
500
+
501
+ # metodo de busqueda que sea por id_cliente y retorne las medidas asociadas a ese cliente con clase y metodo post
502
+ class MedidasCliente(BaseModel):
503
+ id_cliente: int
504
+
505
+
506
+ @app.post("/medidas/busqueda")
507
+ def buscar_medida(medida: MedidasCliente):
508
+ try:
509
+ with DatabaseConnection().get_connection() as conn:
510
+ cursor = conn.cursor()
511
+ cursor.execute(
512
+ "SELECT * FROM Medidas WHERE id_cliente = ?",
513
+ (medida.id_cliente,),
514
+ )
515
+ medida = cursor.fetchone()
516
+ return medida
517
+ except Exception as e:
518
+ raise HTTPException(status_code=500, detail=str(e))
519
+
520
+
521
+ # post/medidas -> crear una medida con una clase pydantic
522
+ class Medida(BaseModel):
523
+ Esfera_OD_lejos: float
524
+ Cilindro_OD_lejos: float
525
+ Eje_OD_lejos: float
526
+ Agudeza_visual_OD_lejos: float
527
+ Esfera_OI_lejos: float
528
+ Cilindro_OI_lejos: float
529
+ Eje_OI_lejos: float
530
+ Agudeza_visual_OI_lejos: float
531
+ Esfera_OD_cerca: float
532
+ Cilindro_OD_cerca: float
533
+ Eje_OD_cerca: float
534
+ Agudeza_visual_OD_cerca: float
535
+ Esfera_OI_cerca: float
536
+ Cilindro_OI_cerca: float
537
+ Eje_OI_cerca: float
538
+ Agudeza_visual_OI_cerca: float
539
+ id_cliente: int
540
+
541
+
542
+ @app.post("/medidas")
543
+ def create_medida(medida: Medida):
544
+ try:
545
+ with DatabaseConnection().get_connection() as conn:
546
+ cursor = conn.cursor()
547
+ cursor.execute(
548
+ "INSERT INTO Medidas (Esfera_OD_lejos, Cilindro_OD_lejos, Eje_OD_lejos, Agudeza_visual_OD_lejos, Esfera_OI_lejos, Cilindro_OI_lejos, Eje_OI_lejos, Agudeza_visual_OI_lejos, Esfera_OD_cerca, Cilindro_OD_cerca, Eje_OD_cerca, Agudeza_visual_OD_cerca, Esfera_OI_cerca, Cilindro_OI_cerca, Eje_OI_cerca, Agudeza_visual_OI_cerca, id_cliente) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
549
+ [
550
+ medida.Esfera_OD_lejos,
551
+ medida.Cilindro_OD_lejos,
552
+ medida.Eje_OD_lejos,
553
+ medida.Agudeza_visual_OD_lejos,
554
+ medida.Esfera_OI_lejos,
555
+ medida.Cilindro_OI_lejos,
556
+ medida.Eje_OI_lejos,
557
+ medida.Agudeza_visual_OI_lejos,
558
+ medida.Esfera_OD_cerca,
559
+ medida.Cilindro_OD_cerca,
560
+ medida.Eje_OD_cerca,
561
+ medida.Agudeza_visual_OD_cerca,
562
+ medida.Esfera_OI_cerca,
563
+ medida.Cilindro_OI_cerca,
564
+ medida.Eje_OI_cerca,
565
+ medida.Agudeza_visual_OI_cerca,
566
+ medida.id_cliente,
567
+ ],
568
+ )
569
+ conn.commit()
570
+ return {"mensaje": "Medida creada correctamente"}
571
+ except Exception as e:
572
+ print(e)
573
+ return {"mensaje": "Error al crear la medida"}
574
+
575
+
576
+ # put/medidas -> actualizar una medida con una clase pydantic
577
+ class MedidaUpdate(BaseModel):
578
+ id_medidas: int
579
+ Esfera_OD_lejos: float
580
+ Cilindro_OD_lejos: float
581
+ Eje_OD_lejos: float
582
+ Agudeza_visual_OD_lejos: float
583
+ Esfera_OI_lejos: float
584
+ Cilindro_OI_lejos: float
585
+ Eje_OI_lejos: float
586
+ Agudeza_visual_OI_lejos: float
587
+ Esfera_OD_cerca: float
588
+ Cilindro_OD_cerca: float
589
+ Eje_OD_cerca: float
590
+ Agudeza_visual_OD_cerca: float
591
+ Esfera_OI_cerca: float
592
+ Cilindro_OI_cerca: float
593
+ Eje_OI_cerca: float
594
+ Agudeza_visual_OI_cerca: float
595
+ id_cliente: int
596
+
597
+
598
+ # metodo put de medidas con manejo de errores
599
+ @app.put("/medidas")
600
+ def update_medida(medida: MedidaUpdate):
601
+ try:
602
+ with DatabaseConnection().get_connection() as conn:
603
+ cursor = conn.cursor()
604
+ cursor.execute(
605
+ "UPDATE Medidas SET Esfera_OD_lejos = ?, Cilindro_OD_lejos = ?, Eje_OD_lejos = ?, Agudeza_visual_OD_lejos = ?, Esfera_OI_lejos = ?, Cilindro_OI_lejos = ?, Eje_OI_lejos = ?, Agudeza_visual_OI_lejos = ?, Esfera_OD_cerca = ?, Cilindro_OD_cerca = ?, Eje_OD_cerca = ?, Agudeza_visual_OD_cerca = ?, Esfera_OI_cerca = ?, Cilindro_OI_cerca = ?, Eje_OI_cerca = ?, Agudeza_visual_OI_cerca = ?, id_cliente = ? WHERE id_medidas = ?",
606
+ [
607
+ medida.Esfera_OD_lejos,
608
+ medida.Cilindro_OD_lejos,
609
+ medida.Eje_OD_lejos,
610
+ medida.Agudeza_visual_OD_lejos,
611
+ medida.Esfera_OI_lejos,
612
+ medida.Cilindro_OI_lejos,
613
+ medida.Eje_OI_lejos,
614
+ medida.Agudeza_visual_OI_lejos,
615
+ medida.Esfera_OD_cerca,
616
+ medida.Cilindro_OD_cerca,
617
+ medida.Eje_OD_cerca,
618
+ medida.Agudeza_visual_OD_cerca,
619
+ medida.Esfera_OI_cerca,
620
+ medida.Cilindro_OI_cerca,
621
+ medida.Eje_OI_cerca,
622
+ medida.Agudeza_visual_OI_cerca,
623
+ medida.id_cliente,
624
+ medida.id_medidas,
625
+ ],
626
+ )
627
+ conn.commit()
628
+ return {"mensaje": "Medida actualizada correctamente"}
629
+ except Exception as e:
630
+ print(e)
631
+ return {"mensaje": "Error al actualizar la medida"}
632
+
633
+
634
+ # delete/medidas -> eliminar una medida con una clase pydantic
635
+ class MedidaDelete(BaseModel):
636
+ id_medidas: int
637
+
638
+
639
+ # metodo delete de medidas con manejo de errores
640
+ @app.delete("/medidas")
641
+ def delete_medida(medida: MedidaDelete):
642
+ try:
643
+ with DatabaseConnection().get_connection() as conn:
644
+ cursor = conn.cursor()
645
+ cursor.execute(
646
+ "DELETE FROM Medidas WHERE id_medidas = ?", (medida.id_medidas,)
647
+ )
648
+ conn.commit()
649
+ return {"mensaje": "Medida eliminada exitosamente"}
650
+ except Exception as e:
651
+ raise HTTPException(status_code=500, detail=str(e))
652
+
653
+
654
+ """
655
+ CREATE TABLE Prescripcion (
656
+ id_prescripcion INTEGER PRIMARY KEY AUTOINCREMENT,
657
+ id_medidas INTEGER REFERENCES Medidas(id_medidas),
658
+ detalle_lunas VARCHAR,
659
+ fecha VARCHAR
660
+ )
661
+ """
662
+
663
+
664
+ # get/prescripciones -> obtener todas las prescripciones con with connection as conn, manejo de errores
665
+ @app.get("/prescripciones")
666
+ def get_prescripciones():
667
+ try:
668
+ with DatabaseConnection().get_connection() as conn:
669
+ cursor = conn.cursor()
670
+ cursor.execute("SELECT * FROM Prescripcion")
671
+ prescripciones = cursor.fetchall()
672
+ return prescripciones
673
+ except Exception as e:
674
+ raise HTTPException(status_code=500, detail=str(e))
675
+
676
+
677
+ # get/prescripciones/{id_prescripcion} -> obtener una prescripcion por id
678
+ @app.get("/prescripciones/{id_prescripcion}")
679
+ def get_prescripcion(id_prescripcion: int):
680
+ try:
681
+ with DatabaseConnection().get_connection() as conn:
682
+ cursor = conn.cursor()
683
+ cursor.execute(
684
+ "SELECT * FROM Prescripcion WHERE id_prescripcion = ?",
685
+ (id_prescripcion,),
686
+ )
687
+ prescripcion = cursor.fetchone()
688
+ return prescripcion
689
+ except Exception as e:
690
+ raise HTTPException(status_code=500, detail=str(e))
691
+
692
+
693
+ # post/prescripciones -> crear una prescripcion con una clase pydantic
694
+ class Prescripcion(BaseModel):
695
+ id_medidas: int
696
+ detalle_lunas: str
697
+ fecha: str
698
+
699
+
700
+ # metodo post de prescripciones con manejo de errores
701
+ @app.post("/prescripciones")
702
+ def create_prescripcion(prescripcion: Prescripcion):
703
+ try:
704
+ with DatabaseConnection().get_connection() as conn:
705
+ cursor = conn.cursor()
706
+ cursor.execute(
707
+ "INSERT INTO Prescripcion (id_medidas, detalle_lunas, fecha) VALUES (?, ?, ?)",
708
+ (
709
+ prescripcion.id_medidas,
710
+ prescripcion.detalle_lunas,
711
+ prescripcion.fecha,
712
+ ),
713
+ )
714
+ conn.commit()
715
+ return {"mensaje": "Prescripcion creada exitosamente"}
716
+ except Exception as e:
717
+ raise HTTPException(status_code=500, detail=str(e))
718
+
719
+
720
+ # put/prescripciones -> actualizar una prescripcion con una clase pydantic
721
+ class PrescripcionUpdate(BaseModel):
722
+ id_prescripcion: int
723
+ id_medidas: int
724
+ detalle_lunas: str
725
+ fecha: str
726
+
727
+
728
+ # metodo put de prescripciones con manejo de errores
729
+ @app.put("/prescripciones")
730
+ def update_prescripcion(prescripcion: PrescripcionUpdate):
731
+ try:
732
+ with DatabaseConnection().get_connection() as conn:
733
+ cursor = conn.cursor()
734
+ cursor.execute(
735
+ "UPDATE Prescripcion SET id_medidas = ?, detalle_lunas = ?, fecha = ? WHERE id_prescripcion = ?",
736
+ (
737
+ prescripcion.id_medidas,
738
+ prescripcion.detalle_lunas,
739
+ prescripcion.fecha,
740
+ prescripcion.id_prescripcion,
741
+ ),
742
+ )
743
+ conn.commit()
744
+ return {"mensaje": "Prescripcion actualizada exitosamente"}
745
+ except Exception as e:
746
+ raise HTTPException(status_code=500, detail=str(e))
747
+
748
+
749
+ # delete/prescripciones -> eliminar una prescripcion con una clase pydantic
750
+ class PrescripcionDelete(BaseModel):
751
+ id_prescripcion: int
752
+
753
+
754
+ # metodo delete de prescripciones con manejo de errores
755
+ @app.delete("/prescripciones")
756
+ def delete_prescripcion(prescripcion: PrescripcionDelete):
757
+ try:
758
+ with DatabaseConnection().get_connection() as conn:
759
+ cursor = conn.cursor()
760
+ cursor.execute(
761
+ "DELETE FROM Prescripcion WHERE id_prescripcion = ?",
762
+ (prescripcion.id_prescripcion,),
763
+ )
764
+ conn.commit()
765
+ return {"mensaje": "Prescripcion eliminada exitosamente"}
766
+ except Exception as e:
767
+ raise HTTPException(status_code=500, detail=str(e))
768
+
769
+
770
+ """
771
+ CREATE TABLE Montura (
772
+ id_montura INTEGER PRIMARY KEY AUTOINCREMENT,
773
+ nombre_montura VARCHAR,
774
+ imagen VARCHAR,
775
+ marca VARCHAR,
776
+ color VARCHAR,
777
+ material VARCHAR
778
+ )
779
+ """
780
+
781
+
782
+ # get/monturas -> obtener todas las monturas con with connection as conn, manejo de errores
783
+ @app.get("/monturas")
784
+ def get_monturas():
785
+ try:
786
+ with DatabaseConnection().get_connection() as conn:
787
+ cursor = conn.cursor()
788
+ cursor.execute("SELECT * FROM Montura")
789
+ monturas = cursor.fetchall()
790
+ return monturas
791
+ except Exception as e:
792
+ raise HTTPException(status_code=500, detail=str(e))
793
+
794
+
795
+ # get/monturas/{id_montura} -> obtener una montura por id
796
+ @app.get("/monturas/{id_montura}")
797
+ def get_montura(id_montura: int):
798
+ try:
799
+ with DatabaseConnection().get_connection() as conn:
800
+ cursor = conn.cursor()
801
+ cursor.execute("SELECT * FROM Montura WHERE id_montura = ?", (id_montura,))
802
+ montura = cursor.fetchone()
803
+ return montura
804
+ except Exception as e:
805
+ raise HTTPException(status_code=500, detail=str(e))
806
+
807
+
808
+ # busqueda de montura por nombre con like, manejo de errores y clase pydantic
809
+ class MonturaNombre(BaseModel):
810
+ nombre_montura: str
811
+
812
+
813
+ # post/monturas/busqueda -> buscar una montura por nombre
814
+ @app.post("/monturas/busqueda")
815
+ def buscar_montura(montura: MonturaNombre):
816
+ try:
817
+ with DatabaseConnection().get_connection() as conn:
818
+ cursor = conn.cursor()
819
+ cursor.execute(
820
+ "SELECT * FROM Montura WHERE nombre_montura LIKE ?",
821
+ (montura.nombre_montura,),
822
+ )
823
+ montura = cursor.fetchone()
824
+ return montura
825
+ except Exception as e:
826
+ raise HTTPException(status_code=500, detail=str(e))
827
+
828
+
829
+ # post/monturas -> crear una montura con una clase pydantic
830
+ class Montura(BaseModel):
831
+ nombre_montura: str
832
+ imagen: str
833
+ marca: str
834
+ color: str
835
+ material: str
836
+
837
+
838
+ # metodo post de monturas con manejo de errores
839
+ @app.post("/monturas")
840
+ def create_montura(montura: Montura):
841
+ try:
842
+ with DatabaseConnection().get_connection() as conn:
843
+ cursor = conn.cursor()
844
+ cursor.execute(
845
+ "INSERT INTO Montura (nombre_montura, imagen, marca, color, material) VALUES (?, ?, ?, ?, ?)",
846
+ (
847
+ montura.nombre_montura,
848
+ montura.imagen,
849
+ montura.marca,
850
+ montura.color,
851
+ montura.material,
852
+ ),
853
+ )
854
+ conn.commit()
855
+ return {"mensaje": "Montura creada exitosamente"}
856
+ except Exception as e:
857
+ raise HTTPException(status_code=500, detail=str(e))
858
+
859
+
860
+ # put/monturas -> actualizar una montura con una clase pydantic
861
+ class MonturaUpdate(BaseModel):
862
+ id_montura: int
863
+ nombre_montura: str
864
+ imagen: str
865
+ marca: str
866
+ color: str
867
+ material: str
868
+
869
+
870
+ # metodo put de monturas con manejo de errores
871
+ @app.put("/monturas")
872
+ def update_montura(montura: MonturaUpdate):
873
+ try:
874
+ with DatabaseConnection().get_connection() as conn:
875
+ cursor = conn.cursor()
876
+ cursor.execute(
877
+ "UPDATE Montura SET nombre_montura = ?, imagen = ?, marca = ?, color = ?, material = ? WHERE id_montura = ?",
878
+ (
879
+ montura.nombre_montura,
880
+ montura.imagen,
881
+ montura.marca,
882
+ montura.color,
883
+ montura.material,
884
+ montura.id_montura,
885
+ ),
886
+ )
887
+ conn.commit()
888
+ return {"mensaje": "Montura actualizada exitosamente"}
889
+ except Exception as e:
890
+ raise HTTPException(status_code=500, detail=str(e))
891
+
892
+
893
+ # delete/monturas -> eliminar una montura con una clase pydantic
894
+ class MonturaDelete(BaseModel):
895
+ id_montura: int
896
+
897
+
898
+ # metodo delete de monturas con manejo de errores
899
+ @app.delete("/monturas")
900
+ def delete_montura(montura: MonturaDelete):
901
+ try:
902
+ with DatabaseConnection().get_connection() as conn:
903
+ cursor = conn.cursor()
904
+ cursor.execute(
905
+ "DELETE FROM Montura WHERE id_montura = ?", (montura.id_montura,)
906
+ )
907
+ conn.commit()
908
+ return {"mensaje": "Montura eliminada exitosamente"}
909
+ except Exception as e:
910
+ raise HTTPException(status_code=500, detail=str(e))
911
+
912
+
913
+ """
914
+ CREATE TABLE Montura_inventario (
915
+ id_montura_inventario INTEGER PRIMARY KEY AUTOINCREMENT,
916
+ id_montura INTEGER REFERENCES Montura(id_montura),
917
+ precio_unit REAL,
918
+ stock INTEGER,
919
+ codigo VARCHAR
920
+ )
921
+ """
922
+
923
+
924
+ # get/monturas_inventario -> obtener todas las monturas_inventario con with connection as conn, manejo de errores
925
+ @app.get("/monturas_inventario")
926
+ def get_monturas_inventario():
927
+ try:
928
+ with DatabaseConnection().get_connection() as conn:
929
+ cursor = conn.cursor()
930
+ cursor.execute("SELECT * FROM Montura_inventario")
931
+ monturas_inventario = cursor.fetchall()
932
+ return monturas_inventario
933
+ except Exception as e:
934
+ raise HTTPException(status_code=500, detail=str(e))
935
+
936
+
937
+ # get/monturas_inventario/{id_montura_inventario} -> obtener una montura_inventario por id
938
+ @app.get("/monturas_inventario/{id_montura_inventario}")
939
+ def get_montura_inventario(id_montura_inventario: int):
940
+ try:
941
+ with DatabaseConnection().get_connection() as conn:
942
+ cursor = conn.cursor()
943
+ cursor.execute(
944
+ "SELECT * FROM Montura_inventario WHERE id_montura_inventario = ?",
945
+ (id_montura_inventario,),
946
+ )
947
+ montura_inventario = cursor.fetchone()
948
+ return montura_inventario
949
+ except Exception as e:
950
+ raise HTTPException(status_code=500, detail=str(e))
951
+
952
+
953
+ # post/monturas_inventario -> crear una montura_inventario con una clase pydantic
954
+ class Montura_inventario(BaseModel):
955
+ id_montura: int
956
+ precio_unit: float
957
+ stock: int
958
+ codigo: str
959
+
960
+
961
+ # metodo post de monturas_inventario con manejo de errores
962
+ @app.post("/monturas_inventario")
963
+ def create_montura_inventario(montura_inventario: Montura_inventario):
964
+ try:
965
+ with DatabaseConnection().get_connection() as conn:
966
+ cursor = conn.cursor()
967
+ cursor.execute(
968
+ "INSERT INTO Montura_inventario (id_montura, precio_unit, stock, codigo) VALUES (?, ?, ?, ?)",
969
+ (
970
+ montura_inventario.id_montura,
971
+ montura_inventario.precio_unit,
972
+ montura_inventario.stock,
973
+ montura_inventario.codigo,
974
+ ),
975
+ )
976
+ conn.commit()
977
+ return {"mensaje": "Montura_inventario creada exitosamente"}
978
+ except Exception as e:
979
+ raise HTTPException(status_code=500, detail=str(e))
980
+
981
+
982
+ # busqueda de montura_inventario por codigo con like, manejo de errores y clase pydantic
983
+ class Montura_inventarioCodigo(BaseModel):
984
+ codigo: str
985
+
986
+
987
+ # post/monturas_inventario/busqueda -> buscar una montura_inventario por codigo
988
+ @app.post("/monturas_inventario/busqueda")
989
+ def buscar_montura_inventario(montura_inventario: Montura_inventarioCodigo):
990
+ try:
991
+ with DatabaseConnection().get_connection() as conn:
992
+ cursor = conn.cursor()
993
+ cursor.execute(
994
+ "SELECT * FROM Montura_inventario WHERE codigo LIKE ?",
995
+ (montura_inventario.codigo,),
996
+ )
997
+ montura_inventario = cursor.fetchone()
998
+ return montura_inventario
999
+ except Exception as e:
1000
+ raise HTTPException(status_code=500, detail=str(e))
1001
+
1002
+
1003
+ # put/monturas_inventario -> actualizar una montura_inventario con una clase pydantic
1004
+ class Montura_inventarioUpdate(BaseModel):
1005
+ id_montura_inventario: int
1006
+ id_montura: int
1007
+ precio_unit: float
1008
+ stock: int
1009
+ codigo: str
1010
+
1011
+
1012
+ # metodo put de monturas_inventario con manejo de errores
1013
+ @app.put("/monturas_inventario")
1014
+ def update_montura_inventario(montura_inventario: Montura_inventarioUpdate):
1015
+ try:
1016
+ with DatabaseConnection().get_connection() as conn:
1017
+ cursor = conn.cursor()
1018
+ cursor.execute(
1019
+ "UPDATE Montura_inventario SET id_montura = ?, precio_unit = ?, stock = ?, codigo = ? WHERE id_montura_inventario = ?",
1020
+ (
1021
+ montura_inventario.id_montura,
1022
+ montura_inventario.precio_unit,
1023
+ montura_inventario.stock,
1024
+ montura_inventario.codigo,
1025
+ montura_inventario.id_montura_inventario,
1026
+ ),
1027
+ )
1028
+ conn.commit()
1029
+ return {"mensaje": "Montura_inventario actualizada exitosamente"}
1030
+ except Exception as e:
1031
+ raise HTTPException(status_code=500, detail=str(e))
1032
+
1033
+
1034
+ # delete/monturas_inventario -> eliminar una montura_inventario con una clase pydantic
1035
+ class Montura_inventarioDelete(BaseModel):
1036
+ id_montura_inventario: int
1037
+
1038
+
1039
+ # metodo delete de monturas_inventario con manejo de errores
1040
+ @app.delete("/monturas_inventario")
1041
+ def delete_montura_inventario(montura_inventario: Montura_inventarioDelete):
1042
+ try:
1043
+ with DatabaseConnection().get_connection() as conn:
1044
+ cursor = conn.cursor()
1045
+ cursor.execute(
1046
+ "DELETE FROM Montura_inventario WHERE id_montura_inventario = ?",
1047
+ (montura_inventario.id_montura_inventario,),
1048
+ )
1049
+ conn.commit()
1050
+ return {"mensaje": "Montura_inventario eliminada exitosamente"}
1051
+ except Exception as e:
1052
+ raise HTTPException(status_code=500, detail=str(e))
1053
+
1054
+
1055
+ """
1056
+ CREATE TABLE boleta (
1057
+ id_boleta INTEGER PRIMARY KEY AUTOINCREMENT,
1058
+ precio_total REAL,
1059
+ estado_recojo VARCHAR
1060
+ )
1061
+ """
1062
+
1063
+
1064
+ # get/boletas -> obtener todas las boletas con with connection as conn, manejo de errores
1065
+ @app.get("/boletas")
1066
+ def get_boletas():
1067
+ try:
1068
+ with DatabaseConnection().get_connection() as conn:
1069
+ cursor = conn.cursor()
1070
+ cursor.execute("SELECT * FROM boleta")
1071
+ boletas = cursor.fetchall()
1072
+ return boletas
1073
+ except Exception as e:
1074
+ raise HTTPException(status_code=500, detail=str(e))
1075
+
1076
+
1077
+ # get/boletas/{id_boleta} -> obtener una boleta por id
1078
+ @app.get("/boletas/{id_boleta}")
1079
+ def get_boleta(id_boleta: int):
1080
+ try:
1081
+ with DatabaseConnection().get_connection() as conn:
1082
+ cursor = conn.cursor()
1083
+ cursor.execute("SELECT * FROM boleta WHERE id_boleta = ?", (id_boleta,))
1084
+ boleta = cursor.fetchone()
1085
+ return boleta
1086
+ except Exception as e:
1087
+ raise HTTPException(status_code=500, detail=str(e))
1088
+
1089
+
1090
+ # post/boletas -> crear una boleta con una clase pydantic
1091
+ class Boleta(BaseModel):
1092
+ precio_total: float
1093
+ estado_recojo: str
1094
+
1095
+
1096
+ # metodo post de boletas con manejo de errores
1097
+ @app.post("/boletas")
1098
+ def create_boleta(boleta: Boleta):
1099
+ try:
1100
+ with DatabaseConnection().get_connection() as conn:
1101
+ cursor = conn.cursor()
1102
+ cursor.execute(
1103
+ "INSERT INTO boleta (precio_total, estado_recojo) VALUES (?, ?)",
1104
+ (
1105
+ boleta.precio_total,
1106
+ boleta.estado_recojo,
1107
+ ),
1108
+ )
1109
+ conn.commit()
1110
+ return {"mensaje": "Boleta creada exitosamente"}
1111
+ except Exception as e:
1112
+ raise HTTPException(status_code=500, detail=str(e))
1113
+
1114
+
1115
+ # put/boletas -> actualizar una boleta con una clase pydantic
1116
+ class BoletaUpdate(BaseModel):
1117
+ id_boleta: int
1118
+ precio_total: float
1119
+ estado_recojo: str
1120
+
1121
+
1122
+ # metodo put de boletas con manejo de errores
1123
+ @app.put("/boletas")
1124
+ def update_boleta(boleta: BoletaUpdate):
1125
+ try:
1126
+ with DatabaseConnection().get_connection() as conn:
1127
+ cursor = conn.cursor()
1128
+ cursor.execute(
1129
+ "UPDATE boleta SET precio_total = ?, estado_recojo = ? WHERE id_boleta = ?",
1130
+ (
1131
+ boleta.precio_total,
1132
+ boleta.estado_recojo,
1133
+ boleta.id_boleta,
1134
+ ),
1135
+ )
1136
+ conn.commit()
1137
+ return {"mensaje": "Boleta actualizada exitosamente"}
1138
+ except Exception as e:
1139
+ raise HTTPException(status_code=500, detail=str(e))
1140
+
1141
+
1142
+ # delete/boletas -> eliminar una boleta con una clase pydantic
1143
+ class BoletaDelete(BaseModel):
1144
+ id_boleta: int
1145
+
1146
+
1147
+ # metodo delete de boletas con manejo de errores
1148
+ @app.delete("/boletas")
1149
+ def delete_boleta(boleta: BoletaDelete):
1150
+ try:
1151
+ with DatabaseConnection().get_connection() as conn:
1152
+ cursor = conn.cursor()
1153
+ cursor.execute(
1154
+ "DELETE FROM boleta WHERE id_boleta = ?", (boleta.id_boleta,)
1155
+ )
1156
+ conn.commit()
1157
+ return {"mensaje": "Boleta eliminada exitosamente"}
1158
+ except Exception as e:
1159
+ raise HTTPException(status_code=500, detail=str(e))
1160
+
1161
+
1162
+ """
1163
+ CREATE TABLE montura_pedido (
1164
+ id_montura_pedido INTEGER PRIMARY KEY AUTOINCREMENT,
1165
+ id_montura_inventario INTEGER REFERENCES Montura_inventario(id_montura_inventario),
1166
+ cantidad INTEGER,
1167
+ precio REAL,
1168
+ id_boleta INTEGER REFERENCES boleta(id_boleta)
1169
+ )
1170
+ """
1171
+
1172
+
1173
+ # get/monturas_pedidos -> obtener todas las monturas_pedidos con with connection as conn, manejo de errores
1174
+ @app.get("/monturas_pedidos")
1175
+ def get_monturas_pedidos():
1176
+ try:
1177
+ with DatabaseConnection().get_connection() as conn:
1178
+ cursor = conn.cursor()
1179
+ cursor.execute("SELECT * FROM montura_pedido")
1180
+ monturas_pedidos = cursor.fetchall()
1181
+ return monturas_pedidos
1182
+ except Exception as e:
1183
+ raise HTTPException(status_code=500, detail=str(e))
1184
+
1185
+
1186
+ # get/monturas_pedidos/{id_montura_pedido} -> obtener una montura_pedido por id
1187
+ @app.get("/monturas_pedidos/{id_montura_pedido}")
1188
+ def get_montura_pedido(id_montura_pedido: int):
1189
+ try:
1190
+ with DatabaseConnection().get_connection() as conn:
1191
+ cursor = conn.cursor()
1192
+ cursor.execute(
1193
+ "SELECT * FROM montura_pedido WHERE id_montura_pedido = ?",
1194
+ (id_montura_pedido,),
1195
+ )
1196
+ montura_pedido = cursor.fetchone()
1197
+ return montura_pedido
1198
+ except Exception as e:
1199
+ raise HTTPException(status_code=500, detail=str(e))
1200
+
1201
+
1202
+ # post/monturas_pedidos -> crear una montura_pedido con una clase pydantic
1203
+ class Montura_pedido(BaseModel):
1204
+ id_montura_inventario: int
1205
+ cantidad: int
1206
+ precio: float
1207
+ id_boleta: int
1208
+
1209
+
1210
+ # metodo post de monturas_pedidos con manejo de errores
1211
+ @app.post("/monturas_pedidos")
1212
+ def create_montura_pedido(montura_pedido: Montura_pedido):
1213
+ try:
1214
+ with DatabaseConnection().get_connection() as conn:
1215
+ cursor = conn.cursor()
1216
+ cursor.execute(
1217
+ "INSERT INTO montura_pedido (id_montura_inventario, cantidad, precio, id_boleta) VALUES (?, ?, ?, ?)",
1218
+ (
1219
+ montura_pedido.id_montura_inventario,
1220
+ montura_pedido.cantidad,
1221
+ montura_pedido.precio,
1222
+ montura_pedido.id_boleta,
1223
+ ),
1224
+ )
1225
+ conn.commit()
1226
+ return {"mensaje": "Montura_pedido creada exitosamente"}
1227
+ except Exception as e:
1228
+ raise HTTPException(status_code=500, detail=str(e))
1229
+
1230
+
1231
+ # put/monturas_pedidos -> actualizar una montura_pedido con una clase pydantic
1232
+ class Montura_pedidoUpdate(BaseModel):
1233
+ id_montura_pedido: int
1234
+ id_montura_inventario: int
1235
+ cantidad: int
1236
+ precio: float
1237
+ id_boleta: int
1238
+
1239
+
1240
+ # metodo put de monturas_pedidos con manejo de errores
1241
+ @app.put("/monturas_pedidos")
1242
+ def update_montura_pedido(montura_pedido: Montura_pedidoUpdate):
1243
+ try:
1244
+ with DatabaseConnection().get_connection() as conn:
1245
+ cursor = conn.cursor()
1246
+ cursor.execute(
1247
+ "UPDATE montura_pedido SET id_montura_inventario = ?, cantidad = ?, precio = ?, id_boleta = ? WHERE id_montura_pedido = ?",
1248
+ (
1249
+ montura_pedido.id_montura_inventario,
1250
+ montura_pedido.cantidad,
1251
+ montura_pedido.precio,
1252
+ montura_pedido.id_boleta,
1253
+ montura_pedido.id_montura_pedido,
1254
+ ),
1255
+ )
1256
+ conn.commit()
1257
+ return {"mensaje": "Montura_pedido actualizada exitosamente"}
1258
+ except Exception as e:
1259
+ raise HTTPException(status_code=500, detail=str(e))
1260
+
1261
+
1262
+ # delete/monturas_pedidos -> eliminar una montura_pedido con una clase pydantic
1263
+ class Montura_pedidoDelete(BaseModel):
1264
+ id_montura_pedido: int
1265
+
1266
+
1267
+ # metodo delete de monturas_pedidos con manejo de errores
1268
+ @app.delete("/monturas_pedidos")
1269
+ def delete_montura_pedido(montura_pedido: Montura_pedidoDelete):
1270
+ try:
1271
+ with DatabaseConnection().get_connection() as conn:
1272
+ cursor = conn.cursor()
1273
+ cursor.execute(
1274
+ "DELETE FROM montura_pedido WHERE id_montura_pedido = ?",
1275
+ (montura_pedido.id_montura_pedido,),
1276
+ )
1277
+ conn.commit()
1278
+ return {"mensaje": "Montura_pedido eliminada exitosamente"}
1279
+ except Exception as e:
1280
+ raise HTTPException(status_code=500, detail=str(e))
optica.db ADDED
Binary file (49.2 kB). View file
 
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ reportlab
tablas.py ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+
3
+ # Conectar a la base de datos (o crearla si no existe)
4
+ conn = sqlite3.connect("optica.db")
5
+ cursor = conn.cursor()
6
+
7
+ # Crear la tabla Roles
8
+ cursor.execute(
9
+ """
10
+ CREATE TABLE Roles (
11
+ id_rol INTEGER PRIMARY KEY AUTOINCREMENT,
12
+ rol VARCHAR
13
+ )
14
+ """
15
+ )
16
+
17
+ # Crear la tabla Boleta
18
+ cursor.execute(
19
+ """
20
+ CREATE TABLE boleta (
21
+ id_boleta INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ precio_total REAL,
23
+ estado_recojo VARCHAR
24
+ )
25
+ """
26
+ )
27
+
28
+ # Crear la tabla Cliente
29
+ cursor.execute(
30
+ """
31
+ CREATE TABLE Cliente (
32
+ id_cliente INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ nombres_y_apellidos VARCHAR,
34
+ edad INTEGER,
35
+ telefono INTEGER,
36
+ direccion VARCHAR
37
+ )
38
+ """
39
+ )
40
+
41
+ # Crear la tabla Usuario
42
+ cursor.execute(
43
+ """
44
+ CREATE TABLE Usuario (
45
+ id_usuario INTEGER PRIMARY KEY AUTOINCREMENT,
46
+ nombre_usuario VARCHAR,
47
+ dni VARCHAR,
48
+ clave VARCHAR,
49
+ id_rol INTEGER REFERENCES Roles(id_rol),
50
+ estado VARCHAR
51
+ )
52
+ """
53
+ )
54
+
55
+ # Crear la tabla Medidas
56
+ cursor.execute(
57
+ """
58
+ CREATE TABLE Medidas (
59
+ id_medidas INTEGER PRIMARY KEY AUTOINCREMENT,
60
+ Esfera_OD_lejos REAL,
61
+ Cilindro_OD_lejos REAL,
62
+ Eje_OD_lejos REAL,
63
+ Agudeza_visual_OD_lejos REAL,
64
+ Esfera_OI_lejos REAL,
65
+ Cilindro_OI_lejos REAL,
66
+ Eje_OI_lejos REAL,
67
+ Agudeza_visual_OI_lejos REAL,
68
+ Esfera_OD_cerca REAL,
69
+ Cilindro_OD_cerca REAL,
70
+ Eje_OD_cerca REAL,
71
+ Agudeza_visual_OD_cerca REAL,
72
+ Esfera_OI_cerca REAL,
73
+ Cilindro_OI_cerca REAL,
74
+ Eje_OI_cerca REAL,
75
+ Agudeza_visual_OI_cerca REAL,
76
+ id_cliente INTEGER REFERENCES Cliente(id_cliente)
77
+ )
78
+ """
79
+ )
80
+
81
+ # Crear la tabla Prescripcion
82
+ cursor.execute(
83
+ """
84
+ CREATE TABLE Prescripcion (
85
+ id_prescripcion INTEGER PRIMARY KEY AUTOINCREMENT,
86
+ id_medidas INTEGER REFERENCES Medidas(id_medidas),
87
+ detalle_lunas VARCHAR,
88
+ fecha VARCHAR
89
+ )
90
+ """
91
+ )
92
+
93
+ # Crear la tabla lunas_pedido
94
+ cursor.execute(
95
+ """
96
+ CREATE TABLE lunas_pedido (
97
+ id_lunas_pedido INTEGER PRIMARY KEY AUTOINCREMENT,
98
+ id_prescripcion INTEGER REFERENCES Prescripcion(id_prescripcion),
99
+ precio REAL,
100
+ id_boleta INTEGER REFERENCES boleta(id_boleta),
101
+ descripcion VARCHAR
102
+ )
103
+ """
104
+ )
105
+
106
+ # Crear la tabla Montura
107
+ cursor.execute(
108
+ """
109
+ CREATE TABLE Montura (
110
+ id_montura INTEGER PRIMARY KEY AUTOINCREMENT,
111
+ nombre_montura VARCHAR,
112
+ imagen VARCHAR,
113
+ marca VARCHAR,
114
+ color VARCHAR,
115
+ material VARCHAR
116
+ )
117
+ """
118
+ )
119
+
120
+ # Crear la tabla Montura_inventario
121
+ cursor.execute(
122
+ """
123
+ CREATE TABLE Montura_inventario (
124
+ id_montura_inventario INTEGER PRIMARY KEY AUTOINCREMENT,
125
+ id_montura INTEGER REFERENCES Montura(id_montura),
126
+ precio_unit REAL,
127
+ stock INTEGER,
128
+ codigo VARCHAR
129
+ )
130
+ """
131
+ )
132
+
133
+ # Crear la tabla montura_pedido
134
+ cursor.execute(
135
+ """
136
+ CREATE TABLE montura_pedido (
137
+ id_montura_pedido INTEGER PRIMARY KEY AUTOINCREMENT,
138
+ id_montura_inventario INTEGER REFERENCES Montura_inventario(id_montura_inventario),
139
+ cantidad INTEGER,
140
+ precio REAL,
141
+ id_boleta INTEGER REFERENCES boleta(id_boleta)
142
+ )
143
+ """
144
+ )
145
+
146
+ # Confirmar y cerrar la conexi贸n
147
+ conn.commit()
148
+ conn.close()