fmatituy/selectospromanager
0
1import openpyxl
2from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
3
4wb = openpyxl.Workbook()
5ws = wb.active
6ws.title = "ARO"
7
8# Define styles
9thin = Side(border_style="thin", color="000000")
10medium = Side(border_style="medium", color="000000")
11thick = Side(border_style="thick", color="000000")
12
13thin_border = Border(left=thin, right=thin, top=thin, bottom=thin)
14thick_border_outer = Border(left=thick, right=thick, top=thick, bottom=thick)
15
16bold_font = Font(bold=True)
17title_font = Font(bold=True, size=12)
18small_font = Font(size=9)
19blue_header_fill = PatternFill(start_color="9BC2E6", end_color="9BC2E6", fill_type="solid") # #9BC2E6 is close to the image header color
20
21# Set column widths to match proportions
22ws.column_dimensions['A'].width = 15
23ws.column_dimensions['B'].width = 10
24ws.column_dimensions['C'].width = 10
25ws.column_dimensions['D'].width = 10
26ws.column_dimensions['E'].width = 20
27ws.column_dimensions['F'].width = 10
28ws.column_dimensions['G'].width = 20
29ws.column_dimensions['H'].width = 15
30ws.column_dimensions['I'].width = 15
31ws.column_dimensions['J'].width = 15
32
33# Helper to apply border to a range
34def set_border(ws, cell_range, border=thin_border):
35 for row in ws[cell_range]:
36 for cell in row:
37 cell.border = border
38
39# Helper to merge and set value/style
40def merge_and_set(ws, cell_range, value, font=None, alignment=None, fill=None, border=thin_border):
41 ws.merge_cells(cell_range)
42 top_left_cell = ws[cell_range.split(':')[0]]
43 top_left_cell.value = value
44 if font: top_left_cell.font = font
45 if alignment: top_left_cell.alignment = alignment
46 if fill: top_left_cell.fill = fill
47 set_border(ws, cell_range, border)
48
49# Row 1-3: Header
50merge_and_set(ws, "A1:B3", "Food Machinery\n//Diseñamos la solución//", font=bold_font, alignment=Alignment(horizontal="center", vertical="center", wrap_text=True))
51merge_and_set(ws, "C1:H1", "Código: ARO-SST-001", font=bold_font, alignment=Alignment(horizontal="center", vertical="center"))
52merge_and_set(ws, "I1:J1", "ARO", font=bold_font, alignment=Alignment(horizontal="center", vertical="center"))
53
54merge_and_set(ws, "C2:H2", "SISTEMA DE GESTION DE LA SEGURIDAD Y SALUD EN EL TRABAJO SG-SST", font=small_font, alignment=Alignment(horizontal="center", vertical="center"))
55merge_and_set(ws, "I2:J2", "Versión: 1", font=bold_font, alignment=Alignment(horizontal="center", vertical="center"))
56
57merge_and_set(ws, "C3:H3", "ANALISIS DE RIESGO POR OFICIO", font=title_font, alignment=Alignment(horizontal="center", vertical="center"))
58merge_and_set(ws, "I3:J3", "15-Nov-22", font=bold_font, alignment=Alignment(horizontal="center", vertical="center"))
59
60# Row 4: Rules
61rules_text = (
62 "1. El no llenar este permiso es infracción a los estándares de seguridad industrial.\n"
63 "2. Si las condiciones iniciales bajo las cuales se autoriza este permiso de trabajo cambian, se debe tramitar un nuevo permiso.\n"
64 "3. Este permiso es exigido para trabajos especiales definidos en el programa de prevención y protección contra caídas de la empresa que se realicen "
65 "a alturas IGUALES O MAYORES A 2 metros o más sobre un nivel inferior."
66)
67merge_and_set(ws, "A4:J6", rules_text, font=small_font, alignment=Alignment(horizontal="left", vertical="top", wrap_text=True))
68ws.row_dimensions[4].height = 20
69ws.row_dimensions[5].height = 20
70ws.row_dimensions[6].height = 20
71
72# Information General
73merge_and_set(ws, "A7:J7", "1. INFORMACIÓN GENERAL.", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
74
75ws["A8"] = "FECHA:"
76ws["A8"].font = bold_font
77ws["A8"].border = thin_border
78ws["B8"] = "DD"
79ws["B8"].font = Font(color="7F7F7F")
80ws["B8"].alignment = Alignment(horizontal="center")
81ws["B8"].border = thin_border
82ws["C8"] = "MM"
83ws["C8"].font = Font(color="7F7F7F")
84ws["C8"].alignment = Alignment(horizontal="center")
85ws["C8"].border = thin_border
86ws.merge_cells("D8:E8")
87ws["D8"] = "AAAA"
88ws["D8"].font = Font(color="7F7F7F")
89ws["D8"].alignment = Alignment(horizontal="center")
90set_border(ws, "D8:E8", thin_border)
91
92merge_and_set(ws, "F8:G8", "LUGAR:", font=bold_font, alignment=Alignment(horizontal="center", vertical="center"))
93merge_and_set(ws, "H8:J8", "")
94
95merge_and_set(ws, "A9:D9", "HORA DE INICIO:", font=bold_font, alignment=Alignment(horizontal="left", vertical="center"))
96merge_and_set(ws, "E9:F9", "")
97merge_and_set(ws, "G9:H9", "HORA DE FINALIZACIÓN:", font=bold_font, alignment=Alignment(horizontal="left", vertical="center"))
98merge_and_set(ws, "I9:J9", "")
99
100# Table 1
101merge_and_set(ws, "A11:D12", "Área y ubicación especifica del sitio en\nel cual se realizará el trabajo", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center", wrap_text=True))
102merge_and_set(ws, "E11:H12", "Descripción del trabajo a realizar", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
103merge_and_set(ws, "I11:J12", "Altura\nApróximada", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center", wrap_text=True))
104ws.row_dimensions[11].height = 25
105ws.row_dimensions[12].height = 25
106
107merge_and_set(ws, "A13:D18", "")
108merge_and_set(ws, "E13:H18", "")
109merge_and_set(ws, "I13:J18", "")
110for i in range(13, 19): ws.row_dimensions[i].height = 18
111
112# Subtitle
113merge_and_set(ws, "A20:J20", "PARA ESTE TRABAJO SE REQUIERE PERMISO DE:", font=Font(bold=True, size=16), alignment=Alignment(horizontal="center", vertical="center"))
114ws.row_dimensions[20].height = 30
115
116# Checkboxes
117merge_and_set(ws, "A21:C21", "TRABAJO EN ALTURAS", font=bold_font, border=Border())
118merge_and_set(ws, "D21:D21", " ", border=medium)
119merge_and_set(ws, "E21:G21", "ESPACIO CONFINADO", font=bold_font, border=Border())
120merge_and_set(ws, "H21:H21", " ", border=medium)
121merge_and_set(ws, "I21:I21", "OTRO:", font=bold_font, border=Border())
122merge_and_set(ws, "J21:J21", "", border=Border(bottom=thin))
123
124merge_and_set(ws, "A22:C22", "TRABAJO EN CALIENTE", font=bold_font, border=Border())
125merge_and_set(ws, "D22:D22", " ", border=medium)
126merge_and_set(ws, "E22:G22", "ENERGIAS PELIGROSAS", font=bold_font, border=Border())
127merge_and_set(ws, "H22:H22", " ", border=medium)
128merge_and_set(ws, "I22:I22", "NO SE REQUIERE", font=bold_font, border=Border())
129merge_and_set(ws, "J22:J22", " ", border=medium)
130
131# Full border around checkboxes
132for row in ws["A21:J22"]:
133 for cell in row:
134 if cell.border == Border():
135 cell.border = Border(left=thin, right=thin)
136set_border(ws, "A20:J22", thin_border)
137set_border(ws, "D21:D21", medium)
138set_border(ws, "H21:H21", medium)
139set_border(ws, "J21:J21", Border(bottom=thin))
140set_border(ws, "D22:D22", medium)
141set_border(ws, "H22:H22", medium)
142set_border(ws, "J22:J22", medium)
143
144
145# Text block
146obs_text = (
147 "ANALISIS DE RIESGO POR OFICIO CONCEDIDO A: (\"Los abajo firmantes declaramos que NO nos encontramos bajo los efectos de ninguna sustancia psicoactiva, "
148 "narcótica, bajo los efectos del alcohol, medicamentos que produzcan sueño o cualquier otra condición actitudinal que pueda afectar el desarrollo del trabajo. Así "
149 "mismo nos comprometemos a cumplir las normas y/o recomendaciones emitidas por el coordinador de trabajo en alturas y entendemos que cualquier condición "
150 "anormal amerita la suspensión inmediata del permiso.\")"
151)
152merge_and_set(ws, "A23:J25", obs_text, font=Font(size=8, bold=True), alignment=Alignment(horizontal="left", vertical="top", wrap_text=True))
153ws.row_dimensions[23].height = 20
154ws.row_dimensions[24].height = 20
155ws.row_dimensions[25].height = 20
156
157# Executers table
158merge_and_set(ws, "A26:E26", "Nombre y Apellidos Completos", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
159merge_and_set(ws, "F26:H26", "No. Cédula", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
160merge_and_set(ws, "I26:I26", "ARL", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
161merge_and_set(ws, "J26:J26", "Firma", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
162
163for i in range(27, 34):
164 merge_and_set(ws, f"A{i}:E{i}", "")
165 merge_and_set(ws, f"F{i}:H{i}", "")
166 merge_and_set(ws, f"I{i}:I{i}", "")
167 merge_and_set(ws, f"J{i}:J{i}", "")
168 ws.row_dimensions[i].height = 18
169
170# Aspectos Generales
171merge_and_set(ws, "A34:H34", "2. VERIFICACIÓN DE ASPECTOS GENERALES (marque con una X)", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
172merge_and_set(ws, "I34:I34", "SI", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
173merge_and_set(ws, "J34:J34", "N/A", font=bold_font, fill=blue_header_fill, alignment=Alignment(horizontal="center", vertical="center"))
174
175questions = [
176 "¿Todos los participantes en la tarea tienen la seguridad social al día?",
177 "¿En caso de hacer actividades de trabajo en alturas, cuentan con certificado para Trabajo Seguro en Alturas vigente?",
178 "¿Se ha realizado una inspección previa al lugar donde se va a ejecutar el trabajo y se ha evaluado el nivel de riesgo de la tarea?",
179 "¿Las condiciones climaticas son adecuadas para ejecutar la actividad?",
180 "¿El area donde se ejecutará la actividad esta limpia, estable y libre de residuos?",
181 "¿Se han realizado las diversas medidas de control necesario en la fuente, en el medio y en la persona para la anulación, mitigación o aislamiento del riesgo si fuera necesario?",
182 "¿Los trabajadores conocen los peligros y riesgos a los cuales están expuestos al ejecutar el trabajo?"
183]
184
185start_row = 35
186for q in questions:
187 merge_and_set(ws, f"A{start_row}:H{start_row+1}", q, font=small_font, alignment=Alignment(horizontal="left", vertical="center", wrap_text=True))
188 merge_and_set(ws, f"I{start_row}:I{start_row+1}", "")
189 merge_and_set(ws, f"J{start_row}:J{start_row+1}", "")
190 ws.row_dimensions[start_row].height = 15
191 ws.row_dimensions[start_row+1].height = 15
192 start_row += 2
193
194
195
196# Final save
197wb.save(r"C:\Users\faust\.gemini\antigravity\scratch\Formato_ARO_Food_Machinery.xlsx")
198print("Archivo Excel generado en C:\\Users\\faust\\.gemini\\antigravity\\scratch\\Formato_ARO_Food_Machinery.xlsx")
199 