JairoDanielMT commited on
Commit
90ba16c
1 Parent(s): 2ae5049

generar PDF como tambien trae los datos de la prescripcion en JSON y PDF

Browse files
Files changed (4) hide show
  1. .gitignore +3 -1
  2. app.py +240 -0
  3. optica.db +0 -0
  4. prescripcion.pdf +74 -0
.gitignore CHANGED
@@ -1,3 +1,5 @@
1
  __pycache__
2
  .vscode
3
- Optica.session.sql
 
 
 
1
  __pycache__
2
  .vscode
3
+ Optica.session.sql
4
+ test.py
5
+ test2.py
app.py CHANGED
@@ -4,6 +4,8 @@ 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()
@@ -828,6 +830,244 @@ def delete_prescripcion(prescripcion: PrescripcionDelete):
828
  return []
829
 
830
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
831
  """
832
  CREATE TABLE Montura (
833
  id_montura INTEGER PRIMARY KEY AUTOINCREMENT,
 
4
  from pydantic import BaseModel
5
  from fastapi.middleware.cors import CORSMiddleware
6
  from fastapi import FastAPI, HTTPException
7
+ from fastapi.responses import FileResponse
8
+ from reportlab.pdfgen import canvas
9
 
10
 
11
  app = FastAPI()
 
830
  return []
831
 
832
 
833
+ def obtener_datos_prescripcion(id_prescripcion):
834
+ try:
835
+ conn = DatabaseConnection().get_connection()
836
+ cursor = conn.cursor()
837
+ query = """
838
+ SELECT
839
+ P.id_prescripcion,
840
+ P.fecha AS fecha_prescripcion,
841
+ P.detalle_lunas,
842
+ Me.Esfera_OD_lejos,
843
+ Me.Cilindro_OD_lejos,
844
+ Me.Eje_OD_lejos,
845
+ Me.Agudeza_visual_OD_lejos,
846
+ Me.Esfera_OI_lejos,
847
+ Me.Cilindro_OI_lejos,
848
+ Me.Eje_OI_lejos,
849
+ Me.Agudeza_visual_OI_lejos,
850
+ Me.Esfera_OD_cerca,
851
+ Me.Cilindro_OD_cerca,
852
+ Me.Eje_OD_cerca,
853
+ Me.Agudeza_visual_OD_cerca,
854
+ Me.Esfera_OI_cerca,
855
+ Me.Cilindro_OI_cerca,
856
+ Me.Eje_OI_cerca,
857
+ Me.Agudeza_visual_OI_cerca,
858
+ C.id_cliente,
859
+ C.nombres_y_apellidos,
860
+ C.edad,
861
+ C.telefono,
862
+ C.direccion
863
+ FROM
864
+ Prescripcion AS P
865
+ JOIN
866
+ Medidas AS Me ON P.id_medidas = Me.id_medidas
867
+ JOIN
868
+ Cliente AS C ON Me.id_cliente = C.id_cliente
869
+ WHERE
870
+ P.id_prescripcion = ?;
871
+ """
872
+ cursor.execute(query, (id_prescripcion,))
873
+ resultado = cursor.fetchone()
874
+ return resultado
875
+ except Exception as e:
876
+ print(e)
877
+ return []
878
+
879
+
880
+ class DatosPrescripcion:
881
+ def __init__(
882
+ self,
883
+ id_prescripcion,
884
+ fecha_prescripcion,
885
+ detalle_lunas,
886
+ esfera_od_lejos,
887
+ cilindro_od_lejos,
888
+ eje_od_lejos,
889
+ agudeza_visual_od_lejos,
890
+ esfera_oi_lejos,
891
+ cilindro_oi_lejos,
892
+ eje_oi_lejos,
893
+ agudeza_visual_oi_lejos,
894
+ esfera_od_cerca,
895
+ cilindro_od_cerca,
896
+ eje_od_cerca,
897
+ agudeza_visual_od_cerca,
898
+ esfera_oi_cerca,
899
+ cilindro_oi_cerca,
900
+ eje_oi_cerca,
901
+ agudeza_visual_oi_cerca,
902
+ id_cliente,
903
+ nombres_y_apellidos,
904
+ edad,
905
+ telefono,
906
+ direccion,
907
+ ):
908
+ self.id_prescripcion = id_prescripcion
909
+ self.fecha_prescripcion = fecha_prescripcion
910
+ self.detalle_lunas = detalle_lunas
911
+ self.esfera_od_lejos = esfera_od_lejos
912
+ self.cilindro_od_lejos = cilindro_od_lejos
913
+ self.eje_od_lejos = eje_od_lejos
914
+ self.agudeza_visual_od_lejos = agudeza_visual_od_lejos
915
+ self.esfera_oi_lejos = esfera_oi_lejos
916
+ self.cilindro_oi_lejos = cilindro_oi_lejos
917
+ self.eje_oi_lejos = eje_oi_lejos
918
+ self.agudeza_visual_oi_lejos = agudeza_visual_oi_lejos
919
+ self.esfera_od_cerca = esfera_od_cerca
920
+ self.cilindro_od_cerca = cilindro_od_cerca
921
+ self.eje_od_cerca = eje_od_cerca
922
+ self.agudeza_visual_od_cerca = agudeza_visual_od_cerca
923
+ self.esfera_oi_cerca = esfera_oi_cerca
924
+ self.cilindro_oi_cerca = cilindro_oi_cerca
925
+ self.eje_oi_cerca = eje_oi_cerca
926
+ self.agudeza_visual_oi_cerca = agudeza_visual_oi_cerca
927
+ self.id_cliente = id_cliente
928
+ self.nombres_y_apellidos_cliente = nombres_y_apellidos
929
+ self.edad_cliente = edad
930
+ self.telefono_cliente = telefono
931
+ self.direccion_cliente = direccion
932
+
933
+ def generar_pdf(self, filename):
934
+ pdf = canvas.Canvas(filename)
935
+ pdf.setFont("Helvetica-Bold", 12)
936
+ ubicacion_inicio = 780 # Posición inicial en y
937
+ pdf.drawCentredString(
938
+ 300, ubicacion_inicio, "OPTICA ARTE VISUAL - PRESCRIPCIÓN"
939
+ )
940
+ pdf.drawString(
941
+ 100,
942
+ ubicacion_inicio - 40,
943
+ f"Nombre del Cliente: {self.nombres_y_apellidos_cliente}",
944
+ )
945
+ pdf.drawString(
946
+ 100, ubicacion_inicio - 60, f"Datos del cliente: {self.direccion_cliente}"
947
+ )
948
+ pdf.drawString(
949
+ 100, ubicacion_inicio - 80, f"Número telefónico: {self.telefono_cliente}"
950
+ )
951
+ pdf.drawString(
952
+ 100,
953
+ ubicacion_inicio - 100,
954
+ f"Código de prescripción: {self.id_prescripcion}",
955
+ )
956
+ pdf.drawString(100, ubicacion_inicio - 120, f"Fecha: {self.fecha_prescripcion}")
957
+ pdf.drawString(
958
+ 100, ubicacion_inicio - 140, f"Descripción: {self.detalle_lunas}"
959
+ )
960
+ ubicacion_esfera = 150 # Posición inicial en x
961
+ ubicacion_cilindro = ubicacion_esfera + 65 # Posición inicial en x + 65
962
+ ubicacion_eje = ubicacion_cilindro + 75 # Posición anterior en x + 75
963
+ ubicacion_agudeza = ubicacion_eje + 70 # Posición anterior en x + 70
964
+ tabla_medidas = ubicacion_inicio - 170 # Posición inicial en y
965
+
966
+ pdf.drawString(ubicacion_esfera - 50, tabla_medidas, "Tabla de medidas:")
967
+ # Para el ojo izquierdo de lejos
968
+ pdf.drawString(
969
+ ubicacion_esfera + 100, tabla_medidas - 20, "Ojo izquierdo de lejos"
970
+ )
971
+ pdf.line(
972
+ x1=ubicacion_esfera,
973
+ y1=tabla_medidas - 25,
974
+ x2=ubicacion_esfera + 300,
975
+ y2=tabla_medidas - 25,
976
+ )
977
+ pdf.drawString(ubicacion_esfera, tabla_medidas - 40, "Esfera")
978
+ pdf.drawString(ubicacion_cilindro, tabla_medidas - 40, "Cilindro")
979
+ pdf.drawString(ubicacion_eje, tabla_medidas - 40, "Eje")
980
+ pdf.drawString(ubicacion_agudeza, tabla_medidas - 40, "Agudeza visual")
981
+ pdf.drawString(ubicacion_esfera, tabla_medidas - 60, f"{self.esfera_oi_lejos}")
982
+ pdf.drawString(
983
+ ubicacion_cilindro, tabla_medidas - 60, f"{self.cilindro_oi_lejos}"
984
+ )
985
+ pdf.drawString(ubicacion_eje, tabla_medidas - 60, f"{self.eje_oi_lejos}")
986
+ pdf.drawString(
987
+ ubicacion_agudeza, tabla_medidas - 60, f"{self.agudeza_visual_oi_lejos}"
988
+ )
989
+ # Para el ojo derecho de lejos
990
+ odl = tabla_medidas - 100 # Posición inicial en y
991
+ pdf.drawString(ubicacion_esfera + 100, odl, "Ojo derecho de lejos")
992
+ pdf.line(x1=ubicacion_esfera, y1=odl - 5, x2=ubicacion_esfera + 300, y2=odl - 5)
993
+ pdf.drawString(ubicacion_esfera, odl - 20, "Esfera")
994
+ pdf.drawString(ubicacion_cilindro, odl - 20, "Cilindro")
995
+ pdf.drawString(ubicacion_eje, odl - 20, "Eje")
996
+ pdf.drawString(ubicacion_agudeza, odl - 20, "Agudeza visual")
997
+ pdf.drawString(ubicacion_esfera, odl - 40, f"{self.esfera_od_lejos}")
998
+ pdf.drawString(ubicacion_cilindro, odl - 40, f"{self.cilindro_od_lejos}")
999
+ pdf.drawString(ubicacion_eje, odl - 40, f"{self.eje_od_lejos}")
1000
+ pdf.drawString(ubicacion_agudeza, odl - 40, f"{self.agudeza_visual_od_lejos}")
1001
+
1002
+ oic = odl - 80 # Posición inicial en y
1003
+ pdf.drawString(ubicacion_esfera + 100, oic, "Ojo izquierdo de cerca")
1004
+ pdf.line(x1=ubicacion_esfera, y1=oic - 5, x2=ubicacion_esfera + 300, y2=oic - 5)
1005
+ # Para el ojo izquierdo de cerca
1006
+ pdf.drawString(ubicacion_esfera, oic - 20, "Esfera")
1007
+ pdf.drawString(ubicacion_cilindro, oic - 20, "Cilindro")
1008
+ pdf.drawString(ubicacion_eje, oic - 20, "Eje")
1009
+ pdf.drawString(ubicacion_agudeza, oic - 20, "Agudeza visual")
1010
+ pdf.drawString(ubicacion_esfera, oic - 40, f"{self.esfera_oi_cerca}")
1011
+ pdf.drawString(ubicacion_cilindro, oic - 40, f"{self.cilindro_oi_cerca}")
1012
+ pdf.drawString(ubicacion_eje, oic - 40, f"{self.eje_oi_cerca}")
1013
+ pdf.drawString(ubicacion_agudeza, oic - 40, f"{self.agudeza_visual_oi_cerca}")
1014
+ odc = oic - 80
1015
+ pdf.drawString(ubicacion_esfera + 100, odc, "Ojo derecho de cerca")
1016
+ pdf.line(x1=ubicacion_esfera, y1=odc - 5, x2=ubicacion_esfera + 300, y2=odc - 5)
1017
+ # Para el ojo derecho de cerca
1018
+ pdf.drawString(ubicacion_esfera, odc - 20, "Esfera")
1019
+ pdf.drawString(ubicacion_cilindro, odc - 20, "Cilindro")
1020
+ pdf.drawString(ubicacion_eje, odc - 20, "Eje")
1021
+ pdf.drawString(ubicacion_agudeza, odc - 20, "Agudeza visual")
1022
+ pdf.drawString(ubicacion_esfera, odc - 40, f"{self.esfera_od_cerca}")
1023
+ pdf.drawString(ubicacion_cilindro, odc - 40, f"{self.cilindro_od_cerca}")
1024
+ pdf.drawString(ubicacion_eje, odc - 40, f"{self.eje_od_cerca}")
1025
+ pdf.drawString(ubicacion_agudeza, odc - 40, f"{self.agudeza_visual_od_cerca}")
1026
+
1027
+ # Calcular el centro de la página
1028
+ centro_pagina = pdf._pagesize[0] / 2
1029
+
1030
+ # Texto y línea centrados
1031
+ texto_firma = " Firma o sello: "
1032
+ ancho_texto = pdf.stringWidth(texto_firma, "Helvetica", 12)
1033
+ inicio_linea = centro_pagina - ancho_texto / 2
1034
+ fin_linea = inicio_linea + ancho_texto
1035
+ # ubicacion en y dependiendo de la tabla de medidas
1036
+ firma_ubicacion = odc - 70
1037
+ pdf.drawString(inicio_linea, firma_ubicacion, texto_firma)
1038
+ pdf.line(inicio_linea, firma_ubicacion - 50, fin_linea, firma_ubicacion - 50)
1039
+
1040
+ pdf.save()
1041
+ print(f"PDF generado: {filename}")
1042
+
1043
+
1044
+ # crear endpoint para obtener los datos de la prescripción
1045
+ @app.get("/prescripcion/{id_prescripcion}")
1046
+ def obtener_datos_prescripcion_api(id_prescripcion: int):
1047
+ datos_prescripcion = obtener_datos_prescripcion(id_prescripcion)
1048
+ if datos_prescripcion:
1049
+ # Crear un objeto de la clase DatosPrescripcion
1050
+ obj_datos_prescripcion = DatosPrescripcion(*datos_prescripcion)
1051
+ return obj_datos_prescripcion
1052
+ else:
1053
+ raise HTTPException(status_code=404, detail="Prescripción no encontrada")
1054
+
1055
+
1056
+ # crear endpoint retornando la url del PDF con los datos de la prescripción
1057
+ @app.get("/prescripcion/pdf/{id_prescripcion}")
1058
+ def obtener_pdf_prescripcion(id_prescripcion: int):
1059
+ datos_prescripcion = obtener_datos_prescripcion(id_prescripcion)
1060
+ if datos_prescripcion:
1061
+ # Crear un objeto de la clase DatosPrescripcion
1062
+ obj_datos_prescripcion = DatosPrescripcion(*datos_prescripcion)
1063
+
1064
+ # Generar el PDF con los datos
1065
+ obj_datos_prescripcion.generar_pdf("prescripcion.pdf")
1066
+ return FileResponse("prescripcion.pdf")
1067
+ else:
1068
+ raise HTTPException(status_code=404, detail="Prescripción no encontrada")
1069
+
1070
+
1071
  """
1072
  CREATE TABLE Montura (
1073
  id_montura INTEGER PRIMARY KEY AUTOINCREMENT,
optica.db CHANGED
Binary files a/optica.db and b/optica.db differ
 
prescripcion.pdf ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ %PDF-1.3
2
+ %���� ReportLab Generated PDF document http://www.reportlab.com
3
+ 1 0 obj
4
+ <<
5
+ /F1 2 0 R /F2 3 0 R
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ <<
10
+ /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
11
+ >>
12
+ endobj
13
+ 3 0 obj
14
+ <<
15
+ /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
16
+ >>
17
+ endobj
18
+ 4 0 obj
19
+ <<
20
+ /Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources <<
21
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
22
+ >> /Rotate 0 /Trans <<
23
+
24
+ >>
25
+ /Type /Page
26
+ >>
27
+ endobj
28
+ 5 0 obj
29
+ <<
30
+ /PageMode /UseNone /Pages 7 0 R /Type /Catalog
31
+ >>
32
+ endobj
33
+ 6 0 obj
34
+ <<
35
+ /Author (anonymous) /CreationDate (D:20231204171812+05'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20231204171812+05'00') /Producer (ReportLab PDF Library - www.reportlab.com)
36
+ /Subject (unspecified) /Title (untitled) /Trapped /False
37
+ >>
38
+ endobj
39
+ 7 0 obj
40
+ <<
41
+ /Count 1 /Kids [ 4 0 R ] /Type /Pages
42
+ >>
43
+ endobj
44
+ 8 0 obj
45
+ <<
46
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 735
47
+ >>
48
+ stream
49
+ Gat%a995Pr'SZ;Q/+0^F'^?L<lr'!;OeQQS0O86W^mT0F@1#RBoBU2--CH=V:lpdDc94AH%g*"]:Y]:*!oQQWhj506JbTM<3=On)/E2G.Sd`nSAUssGGch:#J06K&bKinqMInQs`XDRLg-*^30S.JlZ&?&k9siVQ66Es/I"M.J7jiu*B:[4U=WAn$):'JK"[?Ah'\&Ya[s4"[A"HrJ]!Y):`EZA)9uW]MoK9trWA&\aPCcj^>^4PTD7)pXWU("(Y3-%`fu$a*M41G<4I7f7]N2[?/+KX&80a%Df,6,bqN=O'+@7HC9G"OpW$]eSXKl^b\*a<&q'!"&i6EK@%XHJ:'Kd%3;GW'@Ll9%X(&q2=ipHJ?n1&2q2Wq!D^8j<tDWH?V"Y_gV@J;B@1[TC8Mu(LF6WAZn?5JH'S?o4P.)S-ePCYaeDPGhU2</T]r"8TZaUOeU@_/*O3PK88WDjPtQrN%h$O=a=QAGL&LA.jiJT!M'0&QLA)[t665_Cam3"C\oI1E#r[)(+`YqVQK4(D]m7?RhZ^sKC6b2Tj=?tR6R@;D[O8s=a<0VW8<UELP#,Rll)"s-,6ruV]MkZRa56Yb/iZ@g"U1[<\=BURpi12E&`K:??fL]#(@*6i-s#GpI"B\hi2H:Jna/K0TNCE/*.[2Es[_ZiK-R%4EK5E,jt8fcp'!>+pf"Ec7a<?tC-c1>3>B(b[(c)k+ATo]Xk-Odo\[XePlIfY5`%Aj~>endstream
50
+ endobj
51
+ xref
52
+ 0 9
53
+ 0000000000 65535 f
54
+ 0000000073 00000 n
55
+ 0000000114 00000 n
56
+ 0000000221 00000 n
57
+ 0000000333 00000 n
58
+ 0000000536 00000 n
59
+ 0000000604 00000 n
60
+ 0000000900 00000 n
61
+ 0000000959 00000 n
62
+ trailer
63
+ <<
64
+ /ID
65
+ [<cb36a7b4d17d95664f8eb4131f63a420><cb36a7b4d17d95664f8eb4131f63a420>]
66
+ % ReportLab generated PDF document -- digest (http://www.reportlab.com)
67
+
68
+ /Info 6 0 R
69
+ /Root 5 0 R
70
+ /Size 9
71
+ >>
72
+ startxref
73
+ 1784
74
+ %%EOF