Passed
Push — main ( 3c9970...a8cb20 )
by Sat CFDI
01:45
created

ActionButtonManager.text()   B

Complexity

Conditions 6

Size

Total Lines 15
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 13
dl 0
loc 15
rs 8.6666
c 0
b 0
f 0
cc 6
nop 1
1
from datetime import date, datetime
2
3
import PySimpleGUI as sg
4
# noinspection PyUnresolvedReferences
5
from satcfdi.transform.catalog import CATALOGS
6
from satdigitalinvoice.gui_functions import mf_pago_fmt
7
8
from .log_tools import *
9
10
FORMA_PAGO = CATALOGS['{http://www.sat.gob.mx/sitio_internet/cfd/catalogos}c_FormaPago']
11
TEXT_PADDING = ((5, 0), 3)
12
13
# 24 x 24
14
FOLDER_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqElEQVR4nO3UsQnCYBRF4U/EAcRJtHUJcQddwQlsxcpVLF0hOoY2FlaC+SUQQWI0PmwscuF0j3PhFZc2" \
15
              "/5QR9siRnjhhid6vBVlFXGWHwS8Ft4aCHLPydozFGybo1BV8kl8wLe/muDbcryIFBwzRxbpB/OAcfV8f2y/lD17y7qcbHIPy2oKoILUFqX1RdCpSgMIVHrsUoHDVznVWM9cpQF46imlp8ye5AyE7C1To4" \
16
              "/HLAAAAAElFTkSuQmCC"
17
18
EXCEL_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7klEQVR4nN2VQQqCUBCGv2pfFyhv0FmC7hGFq1bhrgi6gi1cBK6CdhFtvYdCi6CgrZsXwgTyUNOnLmrgBx31" \
19
             "/+DNOAP/HkNgCqyBK3AHLsDA1HAELIEjcANUjuYm5hbwKDBVKTnyjZ5/ATugkwWwS5qrAsBHkyyA0yBg1SQgAraiSHueCwgBL3V" \
20
             "/kFwWwAd6Ir8swJXcSZTEvsIRfQXEwFg6y5LruElAogDoioKma1AF4JvUoPUjctsucqi1qVfQpsY1KPuj+SY1qDsqnLaH3SJvF9Qd1wp4ilethTOT9zea7CLzsivzDPSrmPx2vAFRfA9plcmcVwAAAABJRU5ErkJggg=="
21
22
HTML_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/ElEQVR4nN2VOwoCMRCGPz2HB7ARHyfwBN5EsLOxWKzs7Ox0e69gYbOtoK2dZ7BVRwZGWJbsJvuw0IGfDUkmX" \
23
            "/gzm8A/xgi4AC9AHNLo1gGccxaWFCAC1lUBz0CAVIVICYAYpPVNgJSF+ABtYOHoXzcF6AMdYAmsMuo1ATgZpJTvZQAScEa5ETcAiIsA+vcmDm9XgUpsjUJ7tASnGV1tTL8z26VeKTdgAOwz5esFqA6mKDX2WUR3ebe" \
24
            "+MXCsAkhMLsAGmNQBZC3C7MHRpxY9rO0FvMyWeUUdfIe8a6BMt9S8rqVAmlv7wZECaa43RjYx78kUh3Su5gxDAL8Vb7wE7yjidnvCAAAAAElFTkSuQmCC"
25
26
PDF_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA+0lEQVR4nN3VPUrEQBQA4E89gCBio7WI" \
27
           "+INbeAbxAoI3ESzEysoFd21tbe28QixE7a2t7dxGRwKvWCTrTpJNoQ9ek5k3X8hM5vEfo4cXfCFVZBkbbYDnCQunMeAM" \
28
           "/abAZyaQmiKpBpACmesSSHWRacA8Tiue92cF7GIN57j4kduzAB4DqfXdc4ACQ3xk7FEjYBk7GHQFrOMQl10BJ3GC7roC3mL8vivgNsYXsYmlyKIt8IojLOAYV1jFQWz6sA1QxOnZwv" \
29
           "7YFf6OG1xj1AYYRH9YwVPGT5jqXtejeMuHzMXL2tYNJ/2SZe3U6MXESS0zVWQ5t6zZywH+VnwDCQv1frFQIlYAAAAASUVORK5CYII="
30
31
ABOUT_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABP0lEQVR4nOWVTU7DMBCFvxuwKmrX0G4o5QLtQboDFXEbwrLkGNDucwB" \
32
             "+VvQObS5ApCxAIz1LCNmOG68QTxopst882y/jMfwHnAIroAQ2ilJjgxzhkYRa4AvYA6" \
33
             "+KvcZacYx7FBZADXwC98DUw7GxAmjEXRwjbkkfwHkCfyyu5cy7yCPtxhJOUnckruUcgGGMWMqWs8D8UhE6iZ3iMVYtrTwPoVKEUEjDW123qowL" \
34
             "+uNSGjche6z8YlhGLHI4hGzaAi8dyVWHReiePPsmNprMXeAdeOprUZWwQB2yaKUfNM1Y4Eoa17EyLTIWeIiVqbOp0aXx4U7hw0S565RWsevRKnYpreJ3sxsniE8kntTsHObaTaN" \
35
             "/MvNwZvK8ETdZ3GGocnMPjom8KeofD846xZYYBuotJmQ31MK+bSzryfwb+AbymF7gpXVM1QAAAABJRU5ErkJggg=="
36
37
REFRESH_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABGUlEQVR4nO3VzSqFURTG8Z8JYmRiJN9yDQYiKbdhYqDO9OQWyMSQDGRISoYMlHIJJEWZ" \
38
               "+v4oysTRrqU4nePdZej91+ptt3frWWu31/NS8kdaMINNXOANLzjFGia/ne3CdHyzGMUxarjBNpawgt0QSnsHGA6xWp1oU8bxhGvMorXBmQ5UQugO1VyBITziBD0ZxQziCh+5Aoe4z0y+ELEeyQsF0r2" \
39
               "/Y14etQZR2EE32jIFSv4Z7fFAfuVr3Osjh0o88ZFcgS0sRhTRF9OffEmOQBr7S/RnJO/FWUz" \
40
               "/QK5ANQzsOVrvbHA2DeMcbvGAsYxiflhuMr39WCfH3AurXsZOFJD2joruXcFPYwKr4a6po1ecYwNTuYlLNOMTqXpPNQBv/ywAAAAASUVORK5CYII="
41
42
PREVIEW_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABKElEQVR4nO2VMU8CQRCFP6WAQksqOxJ/A6WJUFFprJSEilARWgsa" \
43
               "/4IVLYUNFZ0WVECwNxpCIDQYfwEVGj0zycNcCOTulqMxvGQze2/eztub3O3Cf0QJ6IQYD8CRi8Ed4AUUn0rTczFZGoTRfLmYRDG4Aj6BAXC8C4M80NC8H/ZNohh4K6Mel0FGu" \
44
               "/cPT2tjMViHvUEg9i0KxBmQjeszPVSxCnCrmBW/lUECqAKzDX/yTPmEi0EaeFauq0JDzU+BG809HX7pKAYnwAiYA9fi7qVr+jZgKEo30rqNBh2dlAe65Yx7BJLStX2teQFa4i3/JN7WBV6Z5+JrwA/wKu4S" \
45
               "+FYhixdADniTzvSRUQDeVXSsNiwUJ+ItbzpnpICy2vAhA4v2bLzl//ALOtSCJzC7jH4AAAAASUVORK5CYII="
46
47
SEARCH_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABM0lEQVR4nOXTuytAYRzG8Y8RJTPJ5jJIitwGoxiZGSTZDAaDTQaJhYWBf0A" \
48
              "WRDHjD7BIMrkUg2wol079lEGc1yXJU2c4b8/5Pu/vfZ/Df1MjJrGKLSyjHyVfBZdjE0+4wwH2cB5rVxj8LLwmQNcYeWO3TdiOoJlUeDGOcIbqd3wFmI2QgZSAcTyiPYc3C9nBZcq" \
49
              "dnGAjYUPNMUVfHnNlmIcSArIpLrCUx9wSAZ3StB8V/lD1EdCTGJBVeCVvg+4wlQAvxT0m8n6wERUtyukfjakb8ga04QELOby1uMGaxFbsxq4W49jeUke05xRlKfD5gO/GJBlkGr3" \
50
              "ownA0JvsZD1H1Gfh8vLdiHbex/vIcYwyFX4G/VnbhdRFYIVEZbO7VmRekAn4Nnqn7nWP5NnX9JNyf1DM+Yku7BVpvYgAAAABJRU5ErkJggg=="
51
52
CONFIG_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVR4nOWVvWoCQRSFP5NCSJHOdGkECaa3s" \
53
              "/MtUu6CYOcTaGMZU2efwNYtrKwkWPgK9nmAEC38IRMGTmCZrIMru6B44MLOmXPP7N6ZvQPXgiowdcJyueEFMMBMYcTlhjfgG7hR2OfhqWYB0AEqQBnoA1/APKGZi" \
54
              "+tLU1GOzfXiEVirBDvgE9gA70A9oauL20izU85aHgcxAlZACxgAH0DDo29IM1DOSh6paAI/QJQyVwJCIFaE4lxE8rBe//AALIA90HbMY5VgqTDikou0lbuQVyrugIkMnsSFGttN/ENHnJ1DWqNc6+FFV" \
55
              "+J7jWO9tYul5pDWKJc8FxhnXSBriQKNa8eUqPBNbh5xTMeK4JRjWviP5msVkdMqnsVts7aKtGbX8zS7XtZmdwhDff5tol2/ckkXTrXoK/N88Qvnr38CSEQRlwAAAABJRU5ErkJggg=="
56
57
EDIT_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA10lEQVR4nO3UPUpDQRSG4cfCQgn" \
58
            "+LSPLSCcEC1u3EXdgEXdg3EC2IXYS0N4itZWWGkGvDHyBkE45Npq3usyB95tz5s6w4ZfZwwQveMIFtqvkB5jhDZe4xmdCyuQdxivrk3RSIl/gAe84Ta118oytCvkQPdwmZJxxXVXJl/TSSZd6O/hvs4+7yE" \
59
            "/Wasd4xT2ONvIl/3gsuys3dLRWGyZ0ll/2RwwiX2SnZ5XyxnkerD5uEjKqkjemmOe7H3FXJW885rGaR9xVyg/xkZBpxjXIwZewU7VTf4ovf6VSMafchm4AAAAASUVORK5CYII="
60
61
BUTTON_COLOR = (sg.theme_background_color(), sg.theme_background_color())
62
63
64
class MyTable(sg.Table):
65
    def __init__(self, key, headings, row_fn):
66
        super().__init__(
67
            values=[],
68
            key=key,
69
            headings=headings,
70
            expand_x=True,
71
            expand_y=True,
72
            select_mode=sg.TABLE_SELECT_MODE_EXTENDED,
73
            enable_events=True,
74
            text_color="black",
75
            background_color="white",
76
            # headings=HEADINGS,
77
            # values=[],
78
            # auto_size_columns=False,
79
            # col_widths=COL_WIDTHS,
80
            # justification="center",
81
            # num_rows=20,
82
            alternating_row_color="grey95", #"aliceblue",
83
            # row_height=ROW_HEIGHT,
84
            # header_text_color="white",
85
            # header_background_color="darkblue",
86
            # font=FONT,
87
            # bind_return_key=True,
88
            tooltip="Doble click para ver factura",
89
            # right_click_menu=RIGHT_CLICK_MENU
90
            metadata=[]
91
        )
92
        self.row_fn = row_fn
93
94
    def selected_items(self):
95
        return [self.metadata[i] for i in self.SelectedRows]
96
97
    def select_all(self):
98
        self.update(
99
            select_rows=list(range(len(self.metadata)))
100
        )
101
102
    def update(self, values=None, **kwargs):
103
        super().update(
104
            values=[
105
                self.row_fn(i, item)
106
                for i, item in enumerate(values, start=1)
107
            ],
108
            **kwargs
109
        )
110
        self.metadata = values
111
112
113
def make_layout(has_fiel, local_db):
114
    # LAYOUT
115
    button_column = [
116
        sg.Text("Periodo:", pad=TEXT_PADDING),
117
        sg.Input(date.today().strftime('%Y-%m'), size=(11, 1), key="periodo"),
118
        sg.Button(image_data=FOLDER_ICON, key="ver_carpeta", border_width=0, button_color=BUTTON_COLOR),
119
        sg.Button(image_data=EXCEL_ICON, key="ver_excel", border_width=0, button_color=BUTTON_COLOR),
120
        sg.Button(image_data=HTML_ICON, key="ver_html", border_width=0, button_color=BUTTON_COLOR),
121
122
        sg.Push(),
123
        sg.Text("Factura Siguiente:", pad=TEXT_PADDING),
124
        sg.Text("", key="serie_folio", pad=TEXT_PADDING),
125
        sg.Button("".center(22), disabled=True, key="crear_facturas", border_width=0, button_color=sg.theme_background_color()),
126
    ]
127
128
    # ----- Full layout -----
129
    return [
130
        button_column,
131
        [
132
            sg.TabGroup(
133
                [[
134
                    sg.Tab(
135
                        'Consola'.center(13),
136
                        [
137
                            [
138
                                sg.Push(),
139
                                sg.Button(image_data=ABOUT_ICON, key="about", border_width=0, button_color=BUTTON_COLOR),
140
                            ],
141
                            [sg.Multiline(
142
                                expand_x=True,
143
                                expand_y=True,
144
                                key="console",
145
                                write_only=True,
146
                                autoscroll=True,
147
                                reroute_stdout=True
148
                            )]
149
                        ],
150
                        key='console_tab',
151
                    ),
152
                    sg.Tab(
153
                        'Clientes'.center(13),
154
                        [
155
                            [
156
                                sg.Button("Refrescar", key="refresh_clientes", border_width=0),
157
                                sg.Push(),
158
                                sg.Button(image_data=EDIT_ICON, key="editar_clientes", border_width=0, button_color=BUTTON_COLOR),
159
                            ],
160
                            [
161
                                MyTable(
162
                                    key="clientes_table",
163
                                    headings=[
164
                                        "#",
165
                                        "Razon Social",
166
                                        "Rfc",
167
                                        "Reg",
168
                                        "CP"
169
                                    ],
170
                                    row_fn=lambda i, r: [
171
                                        i,
172
                                        r["RazonSocial"],
173
                                        r["Rfc"],
174
                                        r["RegimenFiscal"].code,
175
                                        r["CodigoPostal"]
176
                                    ]
177
                                )
178
                            ]],
179
                        key='clientes_tab',
180
                    ),
181
                    sg.Tab(
182
                        'Facturas'.center(13),
183
                        [
184
                            [
185
                                sg.Button("Refrescar", key="refresh_facturas", border_width=0, ),
186
                                sg.Text("", pad=TEXT_PADDING, key="preparar_facturas_text"),
187
                                sg.Push(),
188
                                sg.Button(image_data=EDIT_ICON, key="editar_facturas", border_width=0, button_color=BUTTON_COLOR),
189
                            ],
190
                            [
191
                                MyTable(
192
                                    key="facturas_table",
193
                                    headings=[
194
                                        '#',
195
                                        'EReg',
196
                                        'Receptor Razon Social',
197
                                        'Recep. Rfc',
198
                                        "Tipo",
199
                                        "Subtotal",
200
                                        "Total"
201
                                    ],
202
                                    row_fn=lambda i, r: [
203
                                        i,
204
                                        r['Emisor']['RegimenFiscal'].code,
205
                                        r['Receptor']['Nombre'],
206
                                        r['Receptor']['Rfc'],
207
                                        mf_pago_fmt(r),
208
                                        r['SubTotal'],
209
                                        r['Total']
210
                                    ]
211
                                )
212
                            ]],
213
                        key='facturas_tab',
214
                    ),
215
                    sg.Tab(
216
                        'Emitidas'.center(13),
217
                        [
218
                            [
219
                                sg.Button("Pendientes", key="facturas_pendientes", border_width=0),
220
                                sg.Button("Todas", key="facturas_emitidas", border_width=0),
221
                                sg.Button(image_data=SEARCH_ICON, key="emitidas_search_enter", border_width=0, button_color=BUTTON_COLOR),
222
                                sg.Input("", size=(40, 1), key="emitidas_search", border_width=0),
223
                                sg.Text("", pad=TEXT_PADDING, key="emitidas_text"),
224
                            ],
225
                            [
226
                                sg.Column([[
227
                                    sg.Button("".ljust(10), key="status_sat", border_width=0, button_color=sg.theme_background_color()),
228
                                    sg.Button("".ljust(10), key="email_notificada", border_width=0, button_color=sg.theme_background_color()),
229
                                    sg.Button("".ljust(10), key="pendiente_pago", border_width=0, button_color=sg.theme_background_color()),
230
                                ]]),
231
                                sg.VSeparator(),
232
                                sg.Column([[
233
                                    sg.CalendarButton("FechaPago:", format='%Y-%m-%d', title="FechaPago", no_titlebar=False, target="fecha_pago", pad=TEXT_PADDING,
234
                                                      border_width=0,
235
                                                      key="fecha_pago_select"),
236
                                    sg.Input(datetime.now().strftime('%Y-%m-%d'), size=(12, 1), key="fecha_pago", border_width=0),
237
                                    sg.Combo([Code(k, v) for k, v in FORMA_PAGO.items()], default_value=Code("03", FORMA_PAGO["03"]), key="forma_pago", size=(28, 1)),
238
                                    sg.Text("ImpPagado:", pad=TEXT_PADDING, key="imp_pagado_text", border_width=0),
239
                                    sg.Input("", size=(12, 1), key="importe_pago", border_width=0),
240
                                    sg.Button("Comprobante Pago", key="prepare_pago", border_width=0),
241
                                    sg.Button(image_data=PREVIEW_ICON, key="ver_html_pago", border_width=0, button_color=BUTTON_COLOR),
242
                                ]], visible=False, key="ppd_action_items"),
243
                            ],
244
                            [
245
                                MyTable(
246
                                    key="emitidas_table",
247
                                    headings=[
248
                                        '#',
249
                                        'Receptor Razon Social',
250
                                        'Recep. Rfc',
251
                                        'Factura',
252
                                        "Fecha",
253
                                        "Total",
254
                                        "Pendiente",
255
                                        "Pagada",
256
                                        "Tipo",
257
                                        "Folio"
258
                                    ],
259
                                    row_fn=lambda i, r: [
260
                                        i,
261
                                        r['Receptor'].get('Nombre', ''),
262
                                        r['Receptor']['Rfc'],
263
                                        r.name,
264
                                        r["Fecha"].strftime("%Y-%m-%d"),
265
                                        r["Total"],
266
                                        r.saldo_pendiente if r.saldo_pendiente else "",
267
                                        local_db.liquidated_state(r),
268
                                        mf_pago_fmt(r),
269
                                        r.uuid
270
                                    ]
271
                                )
272
                            ]],
273
                        key='emitidas_tab',
274
                    ),
275
                    sg.Tab(
276
                        'Correos'.center(13),
277
                        [
278
                            [
279
                                sg.Button("Refrescar", key="refresh_correos", border_width=0, ),
280
                            ],
281
                            [
282
                                MyTable(
283
                                    key="correos_table",
284
                                    headings=[
285
                                        '#',
286
                                        'Receptor Razon Social',
287
                                        'Recep. Rfc',
288
                                        'Facturas',
289
                                        'Pendientes Emitidas Meses Anteriores'
290
                                    ],
291
                                    row_fn=lambda i, r: [
292
                                        i,
293
                                        r[0]["RazonSocial"][0:36],
294
                                        r[0]["Rfc"],
295
                                        ",".join(n.name for n in r[1]),
296
                                        ",".join(n.name for n in r[2])
297
                                    ]
298
                                )
299
                            ]],
300
                        key='correos_tab',
301
                    ),
302
                    sg.Tab(
303
                        'Ajustes'.center(13),
304
                        [
305
                            [
306
                                sg.Button("Refrescar", key="refresh_ajustes", border_width=0, ),
307
                                sg.Text("", pad=TEXT_PADDING, key="preparar_ajustes_text"),
308
                            ],
309
                            [
310
                                MyTable(
311
                                    key="ajustes_table",
312
                                    headings=[
313
                                        "#",
314
                                        "Receptor Razon Social",
315
                                        "Recep. Rfc",
316
                                        "Actual",
317
                                        "Nuevo",
318
                                        "Ajuste %",
319
                                        "Periodo",
320
                                        "Meses",
321
                                        "Ajuste Efectivo"
322
                                    ],
323
                                    row_fn=lambda i, r: [
324
                                        i,
325
                                        r["receptor"]["RazonSocial"],
326
                                        r["receptor"]["Rfc"],
327
                                        r["valor_unitario"],
328
                                        r["valor_unitario_nuevo"],
329
                                        r["ajuste_porcentaje"],
330
                                        r["periodo"],
331
                                        r["meses"],
332
                                        r["efectivo_periodo_desc"]
333
                                    ]
334
                                )
335
                            ]],
336
                        key='ajustes_tab'
337
                    ),
338
                    sg.Tab(
339
                        'Recuperar'.center(13),
340
                        [
341
                            [
342
                                sg.Button("SAT Status", key="sat_status_todas", border_width=0),
343
                                sg.Text("Recuperar:", pad=TEXT_PADDING),
344
                                sg.Button("Emitidas ", key="recuperar_emitidas", border_width=0),
345
                                sg.Button("Recibidas", key="recuperar_recibidas", border_width=0),
346
                                sg.Text("Dias:", pad=TEXT_PADDING),
347
                                sg.Input("40", size=(4, 1), key="recuperar_dias"),
348
                            ]
349
                        ],
350
                        key='recuperar_tab',
351
                        visible=has_fiel
352
                    ),
353
                    sg.Tab(
354
                        'Configuracion'.center(13),
355
                        [
356
                            [
357
                                sg.Text("Folio de Proxima Factura:", pad=TEXT_PADDING),
358
                                sg.Input("", key="folio", size=(8, 1), enable_events=True),
359
                            ],
360
                            [
361
                                sg.Button(image_data=CONFIG_ICON, key="ver_config", border_width=0, button_color=BUTTON_COLOR),
362
                            ]
363
                        ],
364
                        key='configuracion_tab',
365
                    ),
366
                ]],
367
                expand_x=True,
368
                expand_y=True,
369
                enable_events=True,
370
                key="main_tab_group",
371
            )
372
        ]
373
    ]
374
375
376
class ActionButtonManager:
377
    def __init__(self, button):
378
        self.name = ""
379
        self.items = []
380
        self.button = button
381
382
    def set_items(self, name, items):
383
        self.name = name
384
        self.items = items
385
        self.style_button()
386
387
    def clear(self):
388
        self.name = ""
389
        self.items = []
390
        self.style_button()
391
392
    def text(self):
393
        header = "Procesar"
394
        if self.name == "clientes":
395
            header = "Validar"
396
        elif self.name == "facturas":
397
            header = "Crear"
398
        elif self.name == "correos":
399
            header = "Enviar"
400
        elif self.name == "ajustes":
401
            header = "Enviar"
402
403
        if self.items:
404
            return f"{header} {len(self.items)} {self.name.capitalize()}"
405
        else:
406
            return ""
407
408
    def style_button(self):
409
        self.button.update(
410
            self.text().center(22),
411
            disabled=not self.items,
412
            button_color=sg.theme_button_color() if self.items else sg.theme_background_color()
413
        )
414