File size: 6,425 Bytes
f6bd0ed
 
 
2db5d71
ead5a43
622fa60
f6bd0ed
2db5d71
 
ead5a43
 
 
3fbcb34
6751d01
3fbcb34
6751d01
622fa60
 
 
6751d01
b6a3da8
 
 
e2fb9d9
 
 
b6a3da8
70c9087
 
 
 
 
b6a3da8
2db5d71
b6a3da8
622fa60
70c9087
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e439f47
2db5d71
 
70c9087
 
 
 
 
 
 
 
 
 
 
 
2db5d71
 
70c9087
 
 
 
 
 
 
 
 
 
2adb419
b200ba7
13848d4
 
70c9087
 
2db5d71
 
622fa60
13848d4
b200ba7
70c9087
 
 
b200ba7
2db5d71
70c9087
2db5d71
 
 
 
 
 
 
 
 
 
70c9087
 
 
 
2db5d71
 
 
f6bd0ed
2db5d71
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import streamlit as st
import pandas as pd
import random
import zipfile
from faker import Faker
from unidecode import unidecode
from pathlib import Path
from datetime import datetime
from PyDictionary import PyDictionary

faker = Faker('es_MX')

def generar_rfc(nombre, apellido, anio, mes, dia):
    return f"{apellido[:2].upper()}{nombre[:2].upper()}{str(anio)[-2:]}{mes:02}{dia:02}{random.randint(10, 99)}"

def generar_telefono_por_estado(estado):
    ladas = {'Ciudad de Mexico': '55', 'Jalisco': '33', 'Nuevo Leon': '81', 'Veracruz': '229', 'Yucatan': '999', 
             'Puebla': '222', 'Chiapas': '961', 'Tamaulipas': '834', 'Queretaro': '442', 'Coahuila': '871'}
    return f"{ladas.get(estado, '55')}{random.randint(1000000, 9999999)}"

def generar_nss():
    return f"{random.randint(100, 999)}-{random.randint(10, 99)}-{random.randint(1000, 9999)}"

def limpiar_correo(correo):
    return unidecode(correo.replace(" ", "").lower())
    
def generar_correo_aleatorio():
    try:
        diccionario = PyDictionary()
        palabra = random.choice(list(diccionario.meaning("word").keys()))
    except Exception:
        palabra = faker.word()
    dominio = random.choice(["gmail.com", "hotmail.com"])
    return limpiar_correo(f"{palabra}{random.randint(1, 999)}@{dominio}")

def generar_datos(cantidad, columnas, progreso):
    try:
        estados = ['Ciudad de Mexico', 'Jalisco', 'Nuevo Leon', 'Veracruz', 'Yucatan', 
                   'Puebla', 'Chiapas', 'Tamaulipas', 'Queretaro', 'Coahuila']
        bancos, datos = ['BBVA', 'Banorte', 'Santander', 'Citibanamex', 'HSBC', 
                         'AMEX', 'Inbursa', 'Bancoppel'], []
        for i in range(cantidad):
            estado = random.choice(estados)
            nombre, apellido = faker.first_name(), faker.last_name()
            dia, mes, anio = faker.date_of_birth().day, faker.date_of_birth().month, faker.date_of_birth().year
            fila = {'Nombre': f"{nombre} {apellido}" if 'Nombre' in columnas else None, 
                    'RFC': generar_rfc(nombre, apellido, anio, mes, dia) if 'RFC' in columnas else None,
                    'Telefono': generar_telefono_por_estado(estado) if 'Telefono' in columnas else None,
                    'Estado': estado if 'Estado' in columnas else None,
                    'Direccion': faker.address() if 'Direccion' in columnas else None,
                    'Correo Electronico': generar_correo_aleatorio() if 'Correo Electronico' in columnas else None,
                    'Tarjeta': ''.join([str(random.randint(0, 9)) for _ in range(16)]) if 'Tarjeta' in columnas else None,
                    'Banco': random.choice(bancos) if 'Banco' in columnas else None,
                    'Score de Credito': random.randint(300, 850) if 'Score de Credito' in columnas else None,
                    'NSS': generar_nss() if 'NSS' in columnas else None}
            datos.append({k: v for k, v in fila.items() if v is not None})
            if i % max(1, cantidad // 100) == 0:  # Actualiza progreso proporcionalmente
                progreso.progress(i / cantidad)
        progreso.progress(1.0)
        return pd.DataFrame(datos)
    except Exception as e:
        raise RuntimeError(f"Error al generar datos: {e}")

def guardar_varios_archivos(dfs, formato):
    archivos = []
    try:
        for i, df in enumerate(dfs):
            timestamp = datetime.now().strftime("_%H%M%S")
            archivo_nombre = f"leads_buro_{i+1}{timestamp}." + ("csv" if formato == "CSV" else "xlsx")
            if formato == "CSV":
                df.to_csv(archivo_nombre, index=False)
            else:
                df.to_excel(archivo_nombre, index=False, engine='openpyxl')
            archivos.append(archivo_nombre)
        return archivos
    except Exception as e:
        raise RuntimeError(f"Error al guardar archivos: {e}")

def crear_zip(archivos):
    try:
        zip_nombre = "archivos_generados.zip"
        with zipfile.ZipFile(zip_nombre, 'w') as zipf:
            for archivo in archivos:
                zipf.write(archivo, Path(archivo).name)
        for archivo in archivos:  # Limpia archivos temporales
            Path(archivo).unlink(missing_ok=True)
        return zip_nombre
    except Exception as e:
        raise RuntimeError(f"Error al crear archivo ZIP: {e}")

def main():
    st.set_page_config(layout="wide")
    st.sidebar.title("Configuraci贸n")
    opciones_columnas = ["Nombre", "Telefono", "RFC", "Estado", "Direccion", 
                         "Correo Electronico", "Tarjeta", "Banco", "Score de Credito", "NSS"]
    columnas = [col for col in opciones_columnas if st.sidebar.checkbox(col, value=False)]
    num_archivos = st.sidebar.slider("N煤mero de archivos (1M registros c/u):", min_value=1, max_value=25, value=1)
    formato_descarga = st.sidebar.radio("Selecciona el formato de descarga:", ["CSV", "XLS"])
    if st.sidebar.button("Generar Datos"):
        try:
            if not columnas:
                st.error("Debe seleccionar al menos una columna.")
                return
            progreso = st.progress(0)
            st.write(f"Generando {num_archivos} archivo(s) de 1 mill贸n de registros...")
            dfs = [generar_datos(1_000_000, columnas, progreso) for _ in range(num_archivos)]
            st.subheader("Previsualizaci贸n de datos (primeros 100 registros del primer archivo):")
            st.dataframe(dfs[0].head(100))
            archivos_generados = guardar_varios_archivos(dfs, formato_descarga)
            
            if len(archivos_generados) > 1:
                zip_nombre = crear_zip(archivos_generados)
                with open(zip_nombre, "rb") as file:
                    st.download_button("Descargar todos en ZIP", data=file, file_name=zip_nombre, mime="application/zip")
            else:
                with open(archivos_generados[0], "rb") as file:
                    st.download_button(f"Descargar {formato_descarga}", data=file, 
                                       file_name=archivos_generados[0], 
                                       mime="text/csv" if formato_descarga == "CSV" else 
                                            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            st.success("Archivos generados y listos para descargar.")
        except Exception as e:
            st.error(f"Error durante la generaci贸n: {e}")

if __name__ == "__main__":
    main()