.ʼNᠫ9~w杷3} %T1\r8WQN)t-#P&τ>3 \9/ ,0ޱK_ٓL@LgCt\},pNdG㤓{>ʆ*>SaQD*nH%%s蔋Ɲ0%9N3gz;]: o@~6ss$OxH=fPńI&0Q5F6fLQLgW4A֛K=Շa@B_Jї ɢ3)V$B9Ю{@XW=Ff!]yUZAUW)eYkiW^0!&2nϫjhf6,'5b3^=C揫'&#^3'kBG	;_LM{#Cp.=JjucqcEkF:?9&d/kRe*|PLnlOr,`y5@<#eZڻ&J/M)kEZV-Qm n[9o!gںm]-FRDCK]=RU!3')YAܡլ(JγWN۾x-SEpٲD#? [ңbgt@UKp-壶OJmҬ^V
hC\:jv 24@Xs:}n.*`k~ۦ%Уo%
0\,ic	E~tzT/td$儡6M̎oqGd*,]jrfL+Ngj*JvZ1,eKvEcrGӑ[3Nᾣ1#ɎznN789MY qFJï,8=c|Tܡլ(JγWXѲWu,Nh 03Nᾣ1#Ɏz&uW2GGJ	aVCf>_v䄯A[/=͜Dd7='$oK>(`6"nǾ׆&z0qvWL(x >_$,o5$Ymg9d9ܣ/I+ly<"2LhE#j-'xn)c{v٬xMB,Ewbr9.R-+)b>M'G	Yv'8	oA*c(.O_5$$OU(R	@N%уȍUP "gs'Ƣ
\Ȝo(*%D-#',SAxި?swh&
ӆsnɘ%T|My77"6=PGDbKߎdimT/td$儡O!vjV"D)M	|)?}>L(H-O9uઋ;lI"}1??_oO#OX*2[MXSKciMH<)ơoR4e%eɽ,2Kxd[=F~7紓̬ҽ$~9`4ϭ)dC򆡳Yj3Nᾣ1#Ɏzj#x37,[hOU<IfV.j^q
xM<
S
~ZmV%E=eHtusm/(S{f 0άSHI0hWVйuL̕8fxW@eD_\iZ^SMR?0DI<^'i٦䜥2N|!kQ`n1ڬl/b/(S{NP)9$Q>ȹKY-rGU-Jm;e8(֝0.3Nᾣ1#ɎzMtYOGA1U) KS mCR3s!}wʗ1*׋o[J!@,73Nᾣ1#Ɏz+^yᱭdZ"_WQ3Nᾣ1#ɎzgWzq`A[&3Nᾣ1#Ɏz"l\̶Nz)BJܰ%򬓴̄ɳ4b^3Nᾣ1#Ɏzۺ]e]X/is3Nᾣ1#ɎzZumqlyy/B*[+3XѲWu,Nh 03Nᾣ1#Ɏz8=D*wXQj3Nᾣ1#ɎznǾ׆&z0qN@3-ΕEC8f eE.]$E{qA t.%z0B)&4Vxcw{~kh-]A3Nᾣ1#Ɏz2ɡcfX
#}2MM2爲cU_RkO)#8#b.C?̿(O٪<OKm9Qtۤ޼楇@ŬqN2 oaKKZX띎b(+fhzRI!ZlY"mt WCӊ?$UFPyI^Vֿ9O YxR`IV!~:I1C9uV0d 0;tjܓpQD@gMɢ4^
ե|[q	F1:
HvYb(?R
KTN̬BCI˨f[|(͖NwQԬeD$E5~`qucgvTRoigmsZlдDJ[
]#+f'|bU M"wHA)U^5o~EF))jR¥X^	B8WKDi4#ʈ4&f߯+]gd7㳒narg\r[&ɖKlX>8Ҋ3W
gʱ0,cU_RkO)#8/葚p.&Z=/øiTH5;eEHRAm%+i؅=jX<ayD&2<p%O4[8OpEӕ}2h"3eCj&Β J,	k Oj8KWt$G? ~dE8Ŗq$uK5y'p%zd.^`׏\,#S#S>Fi#iirA=t	ebo?q@ǯ(p'4QNy!u m"BQO7`䍆&<uaIC- LY*8vc%4lqD4Qh0	+1w017:ik HEH)Q_mvp7EUGϛ%xiճTp̄ۆ!	Z֤){cBR.nxgJ{p#ϭ>]V!
4T]1]AtJ,]mȞWӓwFϴaR
zt[~6_G=pnݽXd0YҡGO}}y]8S0p?v{Y#5ff"ˌI6!RR'=+i[VӫoYa8qZxի 0sMI]o/͘t	t@QMש"a M[#CirixTtAyL+\'6p2'][F%"_֐jpcJQ={[U}9s,(\HVfp'Y0@Tȵ{Jo,\A'XVjm}{ F<V|{ٝ	\)TzKvl{[
D@p"2RЁU>Dg/?	r軜t62ۈ>0I f_96L%|dMٴT.Ù9RweX_+D׳5b99r9"3liminar símbolos de moneda y comas
        value = value.replace('$', '').replace(',', '').replace(' ', '')
        return float(value)
    except:
        return default

def escape_sql(value):
    """Escapa un valor para SQL"""
    if value is None:
        return 'NULL'
    value = str(value)
    value = value.replace('\\', '\\\\')
    value = value.replace("'", "\\'")
    value = value.replace('"', '\\"')
    return f"'{value}'"

def generate_clientes_sql():
    """Genera archivo SQL para clientes"""
    print("\n" + "="*50)
    print("PROCESANDO CLIENTES")
    print("="*50)
    
    rows = parse_xlsx('clientes.xlsx')
    if not rows:
        print("❌ No se pudieron leer datos de clientes.xlsx")
        return
    
    # Primera fila son encabezados
    headers = rows[0]
    print(f"\n📋 Columnas encontradas: {', '.join([str(h) for h in headers])}")
    
    # Mapeo de columnas
    column_map = {
        'nombre': find_column_index(headers, ['nombre', 'name', 'cliente', 'razon_social', 'razon social', 'cliente_de']),
        'telefono': find_column_index(headers, ['telefono', 'phone', 'tel', 'celular', 'teléfono']),
        'direccion': find_column_index(headers, ['direccion', 'address', 'domicilio', 'dirección']),
        'cedula': find_column_index(headers, ['cedula', 'rnc', 'identificacion', 'id', 'documento', 'cédula', 'identificación']),
        'balance': find_column_index(headers, ['balance', 'saldo', 'deuda']),
        'max_credito': find_column_index(headers, ['credito', 'limite_credito', 'max_credito', 'limite', 'crédito']),
    }
    
    print("\n🔗 Mapeo de columnas:")
    for field, index in column_map.items():
        if index >= 0:
            print(f"   {field}: {headers[index]}")
    
    # Generar SQL
    sql_lines = []
    sql_lines.append("-- Importación de Clientes")
    sql_lines.append("-- Generado automáticamente\n")
    
    imported = 0
    
    # Procesar datos (saltar encabezados)
    for i, row in enumerate(rows[1:], start=2):
        if not row or len(row) == 0:
            continue
        
        # Extraer valores
        nombre = row[column_map['nombre']] if column_map['nombre'] >= 0 and column_map['nombre'] < len(row) else ''
        telefono = row[column_map['telefono']] if column_map['telefono'] >= 0 and column_map['telefono'] < len(row) else ''
        direccion = row[column_map['direccion']] if column_map['direccion'] >= 0 and column_map['direccion'] < len(row) else ''
        cedula = row[column_map['cedula']] if column_map['cedula'] >= 0 and column_map['cedula'] < len(row) else ''
        balance = clean_numeric_value(row[column_map['balance']] if column_map['balance'] >= 0 and column_map['balance'] < len(row) else 0)
        max_credito = clean_numeric_value(row[column_map['max_credito']] if column_map['max_credito'] >= 0 and column_map['max_credito'] < len(row) else 0)
        
        # Validar que al menos tenga nombre
        if not nombre or not str(nombre).strip():
            continue
        
        query = f"""INSERT INTO clientes (nombre, telefono, direccion, cedula, balance, max_credito, clave, precio, enviado, max_dias, alow_vencidas) VALUES ({escape_sql(nombre)}, {escape_sql(telefono)}, {escape_sql(direccion)}, {escape_sql(cedula)}, {balance}, {max_credito}, '..', 1, 0, 0, 0);"""
        
        sql_lines.append(query)
        imported += 1
    
    # Guardar archivo
    with open('importar_clientes.sql', 'w', encoding='utf-8') as f:
        f.write('\n'.join(sql_lines))
    
    print(f"\n✅ Generadas {imported} sentencias SQL en importar_clientes.sql")
    return imported

def generate_productos_sql():
    """Genera archivo SQL para productos"""
    print("\n" + "="*50)
    print("PROCESANDO PRODUCTOS")
    print("="*50)
    
    rows = parse_xlsx('articulos.xlsx')
    if not rows:
        print("❌ No se pudieron leer datos de articulos.xlsx")
        return
    
    # Primera fila son encabezados
    headers = rows[0]
    print(f"\n📋 Columnas encontradas: {', '.join([str(h) for h in headers])}")
    
    # Mapeo de columnas
    column_map = {
        'descripcion': find_column_index(headers, ['descripcion', 'description', 'nombre', 'producto', 'articulo', 'name', 'artículo', 'descripción']),
        'codigo': find_column_index(headers, ['codigo', 'code', 'sku', 'barcode', 'barra', 'código']),
        'costo': find_column_index(headers, ['costo', 'cost', 'precio_costo', 'precio_compra', 'precio costo', 'precio compra']),
        'precio': find_column_index(headers, ['precio', 'price', 'precio_venta', 'pvp', 'precio venta']),
        'precio2': find_column_index(headers, ['precio2', 'precio_mayoreo', 'precio_mayor', 'precio_distribuidor', 'precio 2', 'precio mayoreo']),
        'proveedor': find_column_index(headers, ['proveedor', 'supplier', 'suplidor']),
        'stock': find_column_index(headers, ['stock', 'existencia', 'inventario', 'cantidad']),
        'unidad': find_column_index(headers, ['unidad', 'unit', 'medida', 'um']),
        'variedad': find_column_index(headers, ['variedad', 'variety', 'tipo', 'categoria', 'categoría']),
    }
    
    print("\n🔗 Mapeo de columnas:")
    for field, index in column_map.items():
        if index >= 0:
            print(f"   {field}: {headers[index]}")
    
    # Generar SQL
    sql_lines = []
    sql_lines.append("-- Importación de Productos")
    sql_lines.append("-- Generado automáticamente\n")
    
    imported = 0
    
    # Procesar datos (saltar encabezados)
    for i, row in enumerate(rows[1:], start=2):
        if not row or len(row) == 0:
            continue
        
        # Extraer valores
        descripcion = row[column_map['descripcion']] if column_map['descripcion'] >= 0 and column_map['descripcion'] < len(row) else ''
        codigo = row[column_map['codigo']] if column_map['codigo'] >= 0 and column_map['codigo'] < len(row) else ''
        costo = clean_numeric_value(row[column_map['costo']] if column_map['costo'] >= 0 and column_map['costo'] < len(row) else 0)
        precio = clean_numeric_value(row[column_map['precio']] if column_map['precio'] >= 0 and column_map['precio'] < len(row) else 0)
        precio2 = clean_numeric_value(row[column_map['precio2']] if column_map['precio2'] >= 0 and column_map['precio2'] < len(row) else 0)
        proveedor = row[column_map['proveedor']] if column_map['proveedor'] >= 0 and column_map['proveedor'] < len(row) else 'null'
        stock = clean_numeric_value(row[column_map['stock']] if column_map['stock'] >= 0 and column_map['stock'] < len(row) else 0)
        unidad = row[column_map['unidad']] if column_map['unidad'] >= 0 and column_map['unidad'] < len(row) else 'UNIDAD'
        variedad = row[column_map['variedad']] if column_map['variedad'] >= 0 and column_map['variedad'] < len(row) else 'null'
        
        # Validar que al menos tenga descripción
        if not descripcion or not str(descripcion).strip():
            continue
        
        # Si no tiene código, generar uno
        if not codigo or not str(codigo).strip():
            codigo = f'PROD{i:05d}'
        
        # Si precio2 está vacío, usar precio
        if precio2 == 0 and precio > 0:
            precio2 = precio
        
        query = f"""INSERT INTO productos (descripcion, codigo, costo, precio, precio2, proveedor, stock, unidad, variedad, tipo_impuestos, valor_impuestos) VALUES ({escape_sql(descripcion)}, {escape_sql(codigo)}, {costo}, {precio}, {precio2}, {escape_sql(proveedor)}, {stock}, {escape_sql(unidad)}, {escape_sql(variedad)}, '0.00', 0);"""
        
        sql_lines.append(query)
        imported += 1
    
    # Guardar archivo
    with open('importar_productos.sql', 'w', encoding='utf-8') as f:
        f.write('\n'.join(sql_lines))
    
    print(f"\n✅ Generadas {imported} sentencias SQL en importar_productos.sql")
    return imported

def main():
    """Función principal"""
    print("=" * 60)
    print("CONVERSIÓN DE ARCHIVOS EXCEL A SQL")
    print("=" * 60)
    
    # Verificar que los archivos existan
    if not os.path.exists('clientes.xlsx'):
        print("❌ Error: No se encuentra el archivo clientes.xlsx")
        return
    
    if not os.path.exists('articulos.xlsx'):
        print("❌ Error: No se encuentra el archivo articulos.xlsx")
        return
    
    # Generar archivos SQL
    clientes_count = generate_clientes_sql()
    productos_count = generate_productos_sql()
    
    print("\n" + "=" * 60)
    print("✅ CONVERSIÓN COMPLETADA")
    print("=" * 60)
    print(f"\nSe generaron {clientes_count} clientes en importar_clientes.sql")
    print(f"Se generaron {productos_count} productos en importar_productos.sql")
    print("\nPara importar los datos, ejecuta:")
    print("  mysql -u root -p santanasoft < importar_clientes.sql")
    print("  mysql -u root -p santanasoft < importar_productos.sql")

if __name__ == '__main__':
    main()
