Passed
Push — main ( 69a97f...2ac74a )
by Sat CFDI
01:49
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, timedelta
2
from enum import StrEnum
3
4
import PySimpleGUI as sg
5
from satcfdi.pacs.sat import TipoDescargaMasivaTerceros
6
# noinspection PyUnresolvedReferences
7
from satcfdi.transform.catalog import CATALOGS
8
from satdigitalinvoice.gui_functions import mf_pago_fmt, CALENDAR_FECHA_FMT
9
10
from .log_tools import *
11
12
FORMA_PAGO = CATALOGS['{http://www.sat.gob.mx/sitio_internet/cfd/catalogos}c_FormaPago']
13
TEXT_PADDING = ((5, 0), 3)
14
15
# 24 x 24
16
FOLDER_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqElEQVR4nO3UsQnCYBRF4U/EAcRJtHUJcQddwQlsxcpVLF0hOoY2FlaC+SUQQWI0PmwscuF0j3PhFZc2" \
17
              "/5QR9siRnjhhid6vBVlFXGWHwS8Ft4aCHLPydozFGybo1BV8kl8wLe/muDbcryIFBwzRxbpB/OAcfV8f2y/lD17y7qcbHIPy2oKoILUFqX1RdCpSgMIVHrsUoHDVznVWM9cpQF46imlp8ye5AyE7C1To4" \
18
              "/HLAAAAAElFTkSuQmCC"
19
20
EXCEL_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7klEQVR4nN2VQQqCUBCGv2pfFyhv0FmC7hGFq1bhrgi6gi1cBK6CdhFtvYdCi6CgrZsXwgTyUNOnLmrgBx31" \
21
             "/+DNOAP/HkNgCqyBK3AHLsDA1HAELIEjcANUjuYm5hbwKDBVKTnyjZ5/ATugkwWwS5qrAsBHkyyA0yBg1SQgAraiSHueCwgBL3V" \
22
             "/kFwWwAd6Ir8swJXcSZTEvsIRfQXEwFg6y5LruElAogDoioKma1AF4JvUoPUjctsucqi1qVfQpsY1KPuj+SY1qDsqnLaH3SJvF9Qd1wp4ilethTOT9zea7CLzsivzDPSrmPx2vAFRfA9plcmcVwAAAABJRU5ErkJggg=="
23
24
HTML_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/ElEQVR4nN2VOwoCMRCGPz2HB7ARHyfwBN5EsLOxWKzs7Ox0e69gYbOtoK2dZ7BVRwZGWJbsJvuw0IGfDUkmX" \
25
            "/gzm8A/xgi4AC9AHNLo1gGccxaWFCAC1lUBz0CAVIVICYAYpPVNgJSF+ABtYOHoXzcF6AMdYAmsMuo1ATgZpJTvZQAScEa5ETcAiIsA+vcmDm9XgUpsjUJ7tASnGV1tTL8z26VeKTdgAOwz5esFqA6mKDX2WUR3ebe" \
26
            "+MXCsAkhMLsAGmNQBZC3C7MHRpxY9rO0FvMyWeUUdfIe8a6BMt9S8rqVAmlv7wZECaa43RjYx78kUh3Su5gxDAL8Vb7wE7yjidnvCAAAAAElFTkSuQmCC"
27
28
PDF_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA+0lEQVR4nN3VPUrEQBQA4E89gCBio7WI" \
29
           "+INbeAbxAoI3ESzEysoFd21tbe28QixE7a2t7dxGRwKvWCTrTpJNoQ9ek5k3X8hM5vEfo4cXfCFVZBkbbYDnCQunMeAM" \
30
           "/abAZyaQmiKpBpACmesSSHWRacA8Tiue92cF7GIN57j4kduzAB4DqfXdc4ACQ3xk7FEjYBk7GHQFrOMQl10BJ3GC7roC3mL8vivgNsYXsYmlyKIt8IojLOAYV1jFQWz6sA1QxOnZwv" \
31
           "7YFf6OG1xj1AYYRH9YwVPGT5jqXtejeMuHzMXL2tYNJ/2SZe3U6MXESS0zVWQ5t6zZywH+VnwDCQv1frFQIlYAAAAASUVORK5CYII="
32
33
ABOUT_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABP0lEQVR4nOWVTU7DMBCFvxuwKmrX0G4o5QLtQboDFXEbwrLkGNDucwB" \
34
             "+VvQObS5ApCxAIz1LCNmOG68QTxopst882y/jMfwHnAIroAQ2ilJjgxzhkYRa4AvYA6" \
35
             "+KvcZacYx7FBZADXwC98DUw7GxAmjEXRwjbkkfwHkCfyyu5cy7yCPtxhJOUnckruUcgGGMWMqWs8D8UhE6iZ3iMVYtrTwPoVKEUEjDW123qowL" \
36
             "+uNSGjche6z8YlhGLHI4hGzaAi8dyVWHReiePPsmNprMXeAdeOprUZWwQB2yaKUfNM1Y4Eoa17EyLTIWeIiVqbOp0aXx4U7hw0S565RWsevRKnYpreJ3sxsniE8kntTsHObaTaN" \
37
             "/MvNwZvK8ETdZ3GGocnMPjom8KeofD846xZYYBuotJmQ31MK+bSzryfwb+AbymF7gpXVM1QAAAABJRU5ErkJggg=="
38
39
REFRESH_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABGUlEQVR4nO3VzSqFURTG8Z8JYmRiJN9yDQYiKbdhYqDO9OQWyMSQDGRISoYMlHIJJEWZ" \
40
               "+v4oysTRrqU4nePdZej91+ptt3frWWu31/NS8kdaMINNXOANLzjFGia/ne3CdHyzGMUxarjBNpawgt0QSnsHGA6xWp1oU8bxhGvMorXBmQ5UQugO1VyBITziBD0ZxQziCh+5Aoe4z0y+ELEeyQsF0r2" \
41
               "/Y14etQZR2EE32jIFSv4Z7fFAfuVr3Osjh0o88ZFcgS0sRhTRF9OffEmOQBr7S/RnJO/FWUz" \
42
               "/QK5ANQzsOVrvbHA2DeMcbvGAsYxiflhuMr39WCfH3AurXsZOFJD2joruXcFPYwKr4a6po1ecYwNTuYlLNOMTqXpPNQBv/ywAAAAASUVORK5CYII="
43
44
PREVIEW_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABKElEQVR4nO2VMU8CQRCFP6WAQksqOxJ/A6WJUFFprJSEilARWgsa" \
45
               "/4IVLYUNFZ0WVECwNxpCIDQYfwEVGj0zycNcCOTulqMxvGQze2/eztub3O3Cf0QJ6IQYD8CRi8Ed4AUUn0rTczFZGoTRfLmYRDG4Aj6BAXC8C4M80NC8H/ZNohh4K6Mel0FGu" \
46
               "/cPT2tjMViHvUEg9i0KxBmQjeszPVSxCnCrmBW/lUECqAKzDX/yTPmEi0EaeFauq0JDzU+BG809HX7pKAYnwAiYA9fi7qVr+jZgKEo30rqNBh2dlAe65Yx7BJLStX2teQFa4i3/JN7WBV6Z5+JrwA/wKu4S" \
47
               "+FYhixdADniTzvSRUQDeVXSsNiwUJ+ItbzpnpICy2vAhA4v2bLzl//ALOtSCJzC7jH4AAAAASUVORK5CYII="
48
49
SEARCH_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABM0lEQVR4nOXTuytAYRzG8Y8RJTPJ5jJIitwGoxiZGSTZDAaDTQaJhYWBf0A" \
50
              "WRDHjD7BIMrkUg2wol079lEGc1yXJU2c4b8/5Pu/vfZ/Df1MjJrGKLSyjHyVfBZdjE0+4wwH2cB5rVxj8LLwmQNcYeWO3TdiOoJlUeDGOcIbqd3wFmI2QgZSAcTyiPYc3C9nBZcq" \
51
              "dnGAjYUPNMUVfHnNlmIcSArIpLrCUx9wSAZ3StB8V/lD1EdCTGJBVeCVvg+4wlQAvxT0m8n6wERUtyukfjakb8ga04QELOby1uMGaxFbsxq4W49jeUke05xRlKfD5gO/GJBlkGr3" \
52
              "ownA0JvsZD1H1Gfh8vLdiHbex/vIcYwyFX4G/VnbhdRFYIVEZbO7VmRekAn4Nnqn7nWP5NnX9JNyf1DM+Yku7BVpvYgAAAABJRU5ErkJggg=="
53
54
CONFIG_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVR4nOWVvWoCQRSFP5NCSJHOdGkECaa3s" \
55
              "/MtUu6CYOcTaGMZU2efwNYtrKwkWPgK9nmAEC38IRMGTmCZrIMru6B44MLOmXPP7N6ZvQPXgiowdcJyueEFMMBMYcTlhjfgG7hR2OfhqWYB0AEqQBnoA1/APKGZi" \
56
              "+tLU1GOzfXiEVirBDvgE9gA70A9oauL20izU85aHgcxAlZACxgAH0DDo29IM1DOSh6paAI/QJQyVwJCIFaE4lxE8rBe//AALIA90HbMY5VgqTDikou0lbuQVyrugIkMnsSFGttN/ENHnJ1DWqNc6+FFV" \
57
              "+J7jWO9tYul5pDWKJc8FxhnXSBriQKNa8eUqPBNbh5xTMeK4JRjWviP5msVkdMqnsVts7aKtGbX8zS7XtZmdwhDff5tol2/ckkXTrXoK/N88Qvnr38CSEQRlwAAAABJRU5ErkJggg=="
58
59
EDIT_ICON = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA10lEQVR4nO3UPUpDQRSG4cfCQgn" \
60
            "+LSPLSCcEC1u3EXdgEXdg3EC2IXYS0N4itZWWGkGvDHyBkE45Npq3usyB95tz5s6w4ZfZwwQveMIFtqvkB5jhDZe4xmdCyuQdxivrk3RSIl/gAe84Ta118oytCvkQPdwmZJxxXVXJl/TSSZd6O/hvs4+7yE" \
61
            "/Wasd4xT2ONvIl/3gsuys3dLRWGyZ0ll/2RwwiX2SnZ5XyxnkerD5uEjKqkjemmOe7H3FXJW885rGaR9xVyg/xkZBpxjXIwZewU7VTf4ovf6VSMafchm4AAAAASUVORK5CYII="
62
63
BUTTON_COLOR = (sg.theme_background_color(), sg.theme_background_color())
64
LARGE_FONT = ("Courier New", 11, "bold")
65
66
67
class TipoRecuperar(StrEnum):
68
    Emitidas = 'Emitidas'
69
    Recibidas = 'Recibidas'
70
71
72
class MyTable(sg.Table):
73
    def __init__(self, key, headings, row_fn):
74
        super().__init__(
75
            values=[],
76
            key=key,
77
            headings=headings,
78
            expand_x=True,
79
            expand_y=True,
80
            select_mode=sg.TABLE_SELECT_MODE_EXTENDED,
81
            enable_events=True,
82
            text_color="black",
83
            background_color="white",
84
            # headings=HEADINGS,
85
            # values=[],
86
            # auto_size_columns=False,
87
            # col_widths=COL_WIDTHS,
88
            # justification="center",
89
            # num_rows=20,
90
            alternating_row_color="grey95",  # "aliceblue",
91
            # row_height=ROW_HEIGHT,
92
            # header_text_color="white",
93
            # header_background_color="darkblue",
94
            # font=FONT,
95
            # bind_return_key=True,
96
            # tooltip="Doble click para ver factura",
97
            # right_click_menu=RIGHT_CLICK_MENU
98
            metadata=True
99
        )
100
        self.row_fn = row_fn
101
102
    def selected_items(self):
103
        return [self.metadata[i] for i in self.SelectedRows]
104
105
    def select_all(self):
106
        self.update(
107
            select_rows=list(range(len(self.metadata)))
108
        )
109
110
    def update(self, values=None, **kwargs):
111
        if values is not None:
112
            super().update(
113
                values=[
114
                    self.row_fn(i, item)
115
                    for i, item in enumerate(values, start=1)
116
                ],
117
                **kwargs
118
            )
119
            self.metadata = values
120
        else:
121
            super().update(**kwargs)
122
123
    def refresh(self):
124
        self.update(
125
            self.metadata,
126
            select_rows=self.SelectedRows
127
        )
128
129
130
def make_layout(has_fiel, local_db):
131
    # LAYOUT
132
    button_column = [
133
        sg.Column([[
134
            sg.Push(),
135
            sg.Text("Factura:", pad=TEXT_PADDING),
136
            sg.Text("", key="serie_folio", pad=TEXT_PADDING),
137
            sg.Button(image_data=PREVIEW_ICON, key="ver_preview", border_width=0, button_color=BUTTON_COLOR, disabled=True),
138
            sg.Button("".center(22), disabled=True, key="crear_facturas", border_width=0, button_color=sg.theme_background_color()),
139
            sg.Text(" "),  # Spacer
140
        ]],
141
            expand_x=True,
142
        )
143
    ]
144
145
    # ----- Full layout -----
146
    return [
147
        [
148
            sg.TabGroup(
149
                [[
150
                    sg.Tab(
151
                        'Emitidas'.center(13),
152
                        [
153
                            [
154
                                sg.Column([[
155
                                    sg.ButtonMenu(
156
                                        image_data=SEARCH_ICON, button_text="", key="buscar_facturas", border_width=0, button_color=BUTTON_COLOR,
157
                                        menu_def=[
158
                                            [],
159
                                            ['No Pagadas', datetime.now().strftime(CALENDAR_FECHA_FMT), datetime.now().strftime('%Y-%m')]
160
                                        ],
161
                                    ),
162
                                    sg.Input(datetime.now().strftime('%Y-%m'), size=(40, 1), key="emitidas_search"),
163
                                ]])
164
                            ],
165
                            [
166
                                sg.HorizontalSeparator(color="black"),
167
                            ],
168
                            [
169
                                sg.Column([[
170
                                    sg.Button("".ljust(10), key="status_sat", border_width=0, button_color=sg.theme_background_color()),
171
                                    sg.Button("".ljust(10), key="email_notificada", border_width=0, button_color=sg.theme_background_color()),
172
                                    sg.Button("".ljust(10), key="pendiente_pago", border_width=0, button_color=sg.theme_background_color()),
173
                                ]]),
174
                                sg.VSeparator(color="black"),
175
                                sg.Column([[
176
                                    sg.CalendarButton("FechaPago:", format=CALENDAR_FECHA_FMT, title="FechaPago", no_titlebar=False, target="fecha_pago", pad=TEXT_PADDING,
177
                                                      border_width=0),
178
                                    sg.Input(datetime.now().strftime(CALENDAR_FECHA_FMT), size=(12, 1), key="fecha_pago"),
179
                                    sg.Text("FormaPago:", pad=TEXT_PADDING, border_width=0),
180
                                    sg.Combo([Code(k, v) for k, v in FORMA_PAGO.items()],
181
                                             default_value=Code("03", FORMA_PAGO["03"]), key="forma_pago", size=(35, 1)),
182
                                    sg.Text("ImpPagado:", pad=TEXT_PADDING, border_width=0),
183
                                    sg.Input("", size=(12, 1), key="importe_pago"),
184
                                ]], visible=False, key="ppd_action_items"),
185
                            ],
186
                            [
187
                                MyTable(
188
                                    key="emitidas_table",
189
                                    headings=[
190
                                        '#',
191
                                        'Receptor Razon Social',
192
                                        'Recep. Rfc',
193
                                        'Factura',
194
                                        "Fecha",
195
                                        "Total",
196
                                        "Pendiente",
197
                                        "Status",
198
                                        "Tipo",
199
                                        "Folio"
200
                                    ],
201
                                    row_fn=lambda i, r: [
202
                                        i,
203
                                        r['Receptor'].get('Nombre', ''),
204
                                        r['Receptor']['Rfc'],
205
                                        r.name,
206
                                        r["Fecha"].strftime(CALENDAR_FECHA_FMT),
207
                                        r["Total"],
208
                                        r.saldo_pendiente if r.saldo_pendiente else "",
209
                                        str(local_db.liquidated_state(r)) + str(" 📧" if local_db.notified(r) else "   "),
210
                                        mf_pago_fmt(r),
211
                                        r.uuid
212
                                    ]
213
                                )
214
                            ]],
215
                        key='emitidas_tab',
216
                    ),
217
                    sg.Tab(
218
                        'Facturas'.center(13),
219
                        [
220
                            [
221
                                sg.Button(image_data=EDIT_ICON, key="editar_facturas", border_width=0, button_color=BUTTON_COLOR),
222
                                sg.Text("Periodo:", pad=TEXT_PADDING),
223
                                sg.Input(date.today().strftime('%Y-%m'), size=(11, 1), key="facturas_periodo"),
224
                                sg.Text("", pad=TEXT_PADDING, key="preparar_facturas_text", font=LARGE_FONT),
225
                            ],
226
                            [
227
                                MyTable(
228
                                    key="facturas_table",
229
                                    headings=[
230
                                        '#',
231
                                        'EReg',
232
                                        'Receptor Razon Social',
233
                                        'Recep. Rfc',
234
                                        "Tipo",
235
                                        "Subtotal",
236
                                        "Total"
237
                                    ],
238
                                    row_fn=lambda i, r: [
239
                                        i,
240
                                        r['Emisor']['RegimenFiscal'].code,
241
                                        r['Receptor']['Nombre'],
242
                                        r['Receptor']['Rfc'],
243
                                        mf_pago_fmt(r),
244
                                        r['SubTotal'],
245
                                        r['Total']
246
                                    ]
247
                                )
248
                            ]],
249
                        key='facturas_tab',
250
                    ),
251
                    sg.Tab(
252
                        'Correos'.center(13),
253
                        [
254
                            [
255
                                sg.Text("", pad=TEXT_PADDING),
256
                            ],
257
                            [
258
                                MyTable(
259
                                    key="correos_table",
260
                                    headings=[
261
                                        '#',
262
                                        'Receptor Razon Social',
263
                                        'Recep. Rfc',
264
                                        'Facturas',
265
                                        'Pendientes Emitidas Meses Anteriores'
266
                                    ],
267
                                    row_fn=lambda i, r: [
268
                                        i,
269
                                        r[0]["RazonSocial"],
270
                                        r[0]["Rfc"],
271
                                        ",".join(n.name for n in r[1]),
272
                                        ",".join(n.name for n in r[2])
273
                                    ]
274
                                )
275
                            ]],
276
                        key='correos_tab',
277
                    ),
278
                    sg.Tab(
279
                        'Ajustes'.center(13),
280
                        [
281
                            [
282
                                sg.Button(image_data=EDIT_ICON, key="editar_ajustes", border_width=0, button_color=BUTTON_COLOR),
283
                                sg.Text("Periodo:", pad=TEXT_PADDING),
284
                                sg.Input(date.today().strftime('%Y-%m'), size=(11, 1), key="ajustes_periodo"),
285
                                sg.Text("", pad=TEXT_PADDING, key="preparar_ajustes_text", font=LARGE_FONT),
286
                            ],
287
                            [
288
                                MyTable(
289
                                    key="ajustes_table",
290
                                    headings=[
291
                                        "#",
292
                                        "Receptor Razon Social",
293
                                        "Recep. Rfc",
294
                                        "Actual",
295
                                        "Nuevo",
296
                                        "Ajuste %",
297
                                        "Periodo",
298
                                        "Meses",
299
                                        "Ajuste Efectivo"
300
                                    ],
301
                                    row_fn=lambda i, r: [
302
                                        i,
303
                                        r["receptor"]["RazonSocial"],
304
                                        r["receptor"]["Rfc"],
305
                                        r["valor_unitario"],
306
                                        r["valor_unitario_nuevo"],
307
                                        r["ajuste_porcentaje"],
308
                                        r["periodo"],
309
                                        r["meses"],
310
                                        r["efectivo_periodo_desc"]
311
                                    ]
312
                                )
313
                            ]],
314
                        key='ajustes_tab'
315
                    ),
316
                    sg.Tab(
317
                        'Clientes'.center(13),
318
                        [
319
                            [
320
                                sg.Button(image_data=EDIT_ICON, key="editar_clientes", border_width=0, button_color=BUTTON_COLOR),
321
                            ],
322
                            [
323
                                MyTable(
324
                                    key="clientes_table",
325
                                    headings=[
326
                                        "#",
327
                                        "Razon Social",
328
                                        "Rfc",
329
                                        "Reg",
330
                                        "CP"
331
                                    ],
332
                                    row_fn=lambda i, r: [
333
                                        i,
334
                                        r["RazonSocial"],
335
                                        r["Rfc"],
336
                                        r["RegimenFiscal"].code,
337
                                        r["CodigoPostal"]
338
                                    ]
339
                                )
340
                            ]],
341
                        key='clientes_tab',
342
                    ),
343
                    sg.Tab(
344
                        'Solicitudes'.center(13),
345
                        [
346
                            [
347
                                sg.Column([[
348
                                    sg.Button(image_data=EDIT_ICON, key="editar_contabilidad", border_width=0, button_color=BUTTON_COLOR),
349
                                    sg.Text("Periodo:", pad=TEXT_PADDING),
350
                                    sg.Input(date.today().strftime('%Y-%m'), size=(11, 1), key="periodo"),
351
                                    sg.Button(image_data=EXCEL_ICON, key="ver_excel", border_width=0, button_color=BUTTON_COLOR),
352
                                    sg.Button(image_data=FOLDER_ICON, key="ver_carpeta", border_width=0, button_color=BUTTON_COLOR),
353
                                    sg.Button("SAT Status", key="sat_status_todas", border_width=0),
354
                                ]])
355
                            ],
356
                            [
357
                                sg.Column([[
358
                                    sg.Text("Recuperar:", pad=TEXT_PADDING),
359
                                    sg.Combo([TipoRecuperar.Recibidas, TipoRecuperar.Emitidas], default_value=TipoRecuperar.Recibidas, key="tipo_recuperar", size=(15, 1)),
360
361
                                    sg.CalendarButton("Inicio:", format=CALENDAR_FECHA_FMT, title="Inicio", no_titlebar=False, target="fecha_inicial", pad=TEXT_PADDING,
362
                                                      border_width=0),
363
                                    sg.Input((datetime.now() - timedelta(days=40)).strftime(CALENDAR_FECHA_FMT), size=(12, 1), key="fecha_inicial"),
364
365
                                    sg.CalendarButton("Final:", format=CALENDAR_FECHA_FMT, title="Final", no_titlebar=False, target="fecha_final", pad=TEXT_PADDING,
366
                                                      border_width=0),
367
                                    sg.Input(datetime.now().strftime(CALENDAR_FECHA_FMT), size=(12, 1), key="fecha_final"),
368
369
                                    sg.Text("Tipo:", pad=TEXT_PADDING),
370
                                    sg.Combo([TipoDescargaMasivaTerceros.CFDI, TipoDescargaMasivaTerceros.Metadata], default_value=TipoDescargaMasivaTerceros.CFDI,
371
                                             key="tipo_solicitud", size=(15, 1)),
372
373
                                    sg.Button("Nueva Solicitud", key="nueva_solicitud", border_width=0),
374
                                ]])
375
                            ],
376
                            [
377
                                MyTable(
378
                                    key="solicitudes_table",
379
                                    headings=[
380
                                        "#",
381
                                        "IdSolicitud",
382
                                        "Mensaje",
383
                                        "FechaInicial",
384
                                        "FechaFinal",
385
                                        "TipoSolicitud",
386
                                        "RfcReceptor",
387
                                        "RfcEmisor",
388
                                    ],
389
                                    row_fn=lambda i, r: [
390
                                        i,
391
                                        r["response"]["IdSolicitud"],
392
                                        r["response"]["Mensaje"],
393
                                        r["request"]["fecha_inicial"].strftime(CALENDAR_FECHA_FMT),
394
                                        r["request"]["fecha_final"].strftime(CALENDAR_FECHA_FMT),
395
                                        r["request"]["tipo_solicitud"],
396
                                        r["request"]["rfc_receptor"] or "",
397
                                        r["request"]["rfc_emisor"] or "",
398
                                    ]
399
                                )
400
                            ]
401
                        ],
402
                        key='solicitudes_tab',
403
                        # visible=has_fiel
404
                    ),
405
                    sg.Tab(
406
                        'Consola'.center(13),
407
                        [
408
                            [
409
                                sg.Push(),
410
                                sg.Button(image_data=ABOUT_ICON, key="about", border_width=0, button_color=BUTTON_COLOR),
411
                            ],
412
                            [sg.Multiline(
413
                                expand_x=True,
414
                                expand_y=True,
415
                                key="console",
416
                                write_only=True,
417
                                autoscroll=True,
418
                                reroute_stdout=True
419
                            )]
420
                        ],
421
                        key='console_tab',
422
                    ),
423
                    sg.Tab(
424
                        'Configuracion'.center(13),
425
                        [
426
                            [
427
                                sg.Column([[
428
                                    sg.Button(image_data=CONFIG_ICON, key="ver_config", border_width=0, button_color=BUTTON_COLOR),
429
                                    sg.Text("Proxima Factura:", pad=TEXT_PADDING),
430
                                    sg.Text("Serie:", pad=TEXT_PADDING),
431
                                    sg.Input("", key="serie", size=(8, 1)),
432
                                    sg.Text("Folio:", pad=TEXT_PADDING),
433
                                    sg.Input("", key="folio", size=(8, 1)),
434
                                ]],
435
                                    expand_x=True
436
                                )
437
                            ],
438
                            [
439
                                sg.Column([[
440
                                    sg.Button("Organizar Facturas", key="organizar_facturas", border_width=0),
441
                                ]],
442
                                    expand_x=True
443
                                )
444
                            ]
445
                        ],
446
                        key='configuracion_tab',
447
                    ),
448
                ]],
449
                expand_x=True,
450
                expand_y=True,
451
                enable_events=True,
452
                key="main_tab_group",
453
            )
454
        ],
455
        button_column,
456
    ]
457
458
459
class ActionButtonManager:
460
    def __init__(self, button, preview):
461
        self.name = ""
462
        self.items = []
463
        self.button = button
464
        self.preview = preview
465
466
    def set_items(self, name, items):
467
        self.name = name
468
        self.items = items
469
        self.style_button()
470
471
    def clear(self):
472
        self.name = ""
473
        self.items = []
474
        self.style_button()
475
476
    def text(self):
477
        header = "Procesar"
478
        if self.name == "clientes":
479
            header = "Validar"
480
        elif self.name in ("facturas", "pago"):
481
            header = "Crear"
482
        elif self.name == "correos":
483
            header = "Enviar"
484
        elif self.name == "ajustes":
485
            header = "Enviar"
486
487
        if self.items:
488
            return f"{header} {len(self.items)} {self.name.capitalize()}"
489
        else:
490
            return ""
491
492
    def style_button(self):
493
        self.preview.update(
494
            disabled=not (bool(self.items) and self.name in ("facturas", "pago")),
495
        )
496
        self.button.update(
497
            self.text().center(22),
498
            disabled=not self.items,
499
            button_color=sg.theme_button_color() if self.items else sg.theme_background_color()
500
        )
501