Scripts por Lotes¶
Esta sección contiene ejemplos prácticos de scripts por lotes para automatizar procesos con xls2sage50.
Scripts por Categoría¶
Importación de Clientes¶
Importación Diaria¶
@echo off
REM ============================================================================
REM Importación Diaria de Clientes
REM Importa automáticamente los clientes nuevos todos los días
REM ============================================================================
setlocal
REM Configuración
set PLANTILLA=Clientes_Mensual
set DIRECTORIO_DATOS=C:\Datos\Importaciones\Clientes
set DIRECTORIO_LOGS=C:\Logs\Importaciones
set DIRECTORIO_PROCESADOS=C:\Datos\Procesados
REM Crear directorios si no existen
if not exist "%DIRECTORIO_LOGS%" mkdir "%DIRECTORIO_LOGS%"
if not exist "%DIRECTORIO_PROCESADOS%" mkdir "%DIRECTORIO_PROCESADOS%"
REM Fecha actual para nombres de archivo
set FECHA=%date:~-4,4%%date:~-7,2%%date:~-10,2%
REM Buscar archivo más reciente
pushd "%DIRECTORIO_DATOS%"
for /f "delims=" %%A in ('dir /b /o-d *.xlsx') do (
set ARCHIVO=%%A
goto :encontrado
)
:encontrado
popd
if "%ARCHIVO%"=="" (
echo [%date% %time%] ERROR: No se encontraron archivos en %DIRECTORIO_DATOS% >> "%DIRECTORIO_LOGS%\clientes_%FECHA%.log"
exit /b 1
)
REM Ejecutar importación
echo [%date% %time%] Iniciando importación de %ARCHIVO% >> "%DIRECTORIO_LOGS%\clientes_%FECHA%.log"
python xls2sage50.py run --template=%PLANTILLA% --file="%DIRECTORIO_DATOS%\%ARCHIVO%" >> "%DIRECTORIO_LOGS%\clientes_%FECHA%.log" 2>&1
REM Verificar resultado
if %ERRORLEVEL% EQU 0 (
echo [%date% %time%] Importación exitosa >> "%DIRECTORIO_LOGS%\clientes_%FECHA%.log"
move "%DIRECTORIO_DATOS%\%ARCHIVO%" "%DIRECTORIO_PROCESADOS%\%ARCHIVO%.%FECHA%"
exit /b 0
) else (
echo [%date% %time%] ERROR: Importación falló (código %ERRORLEVEL%) >> "%DIRECTORIO_LOGS%\clientes_%FECHA%.log"
exit /b %ERRORLEVEL%
)
endlocal
Importación con Validación¶
@echo off
REM ============================================================================
REM Importación de Clientes con Validación Previa
REM ============================================================================
setlocal
set PLANTILLA=Clientes_Mensual
set ARCHIVO=%1
if "%ARCHIVO%"=="" (
echo Uso: %~nx0 archivo.xlsx
exit /b 1
)
REM Validar archivo
if not exist "%ARCHIVO%" (
echo ERROR: El archivo no existe: %ARCHIVO%
exit /b 1
)
REM Validar plantilla
python xls2sage50.py validate --template=%PLANTILLA% --file="%ARCHIVO%"
if %ERRORLEVEL% NEQ 0 (
echo ERROR: Validación falló. Revise el archivo.
exit /b 1
)
REM Importar
python xls2sage50.py run --template=%PLANTILLA% --file="%ARCHIVO%" --verbose
endlocal
Importación de Artículos¶
Actualización de Precios¶
@echo off
REM ============================================================================
REM Actualización Masiva de Precios de Artículos
REM ============================================================================
setlocal
set PLANTILLA=Articulos_Precios
set ARCHIVO=%~1
if "%ARCHIVO%"=="" (
echo Uso: %~nx0 archivo_precios.xlsx
exit /b 1
)
echo Actualizando precios desde %ARCHIVO%...
echo.
REM Vista previa de cambios
python xls2sage50.py run --template=%PLANTILLA% --file="%ARCHIVO%" --dry-run
echo.
set /p CONTINUAR=¿Desea continuar con la importación? (S/N):
if /i not "%CONTINUAR%"=="S" exit /b 0
REM Importación
python xls2sage50.py run --template=%PLANTILLA% --file="%ARCHIVO%"
if %ERRORLEVEL% EQU 0 (
echo.
echo Precios actualizados correctamente.
REM Generar reporte
python xls2sage50.py info --template=%PLANTILLA% --json > reporte_precios.json
echo Reporte guardado en reporte_precios.json
) else (
echo.
echo ERROR: La actualización falló.
)
endlocal
Actualización de Stock¶
@echo off
REM ============================================================================
REM Actualización de Stock de Artículos
REM ============================================================================
setlocal
set PLANTILLA=Articulos_Stock
set DIRECTORIO=C:\Datos\Stock
REM Procesar todos los archivos Excel del directorio
for %%F in ("%DIRECTORIO%\*.xlsx") do (
echo Procesando: %%~nxF
python xls2sage50.py run --template=%PLANTILLA% --file="%%F"
if %ERRORLEVEL% EQU 0 (
echo OK: %%~nxF >> "%DIRECTORIO%\procesados.log"
move "%%F" "%DIRECTORIO%\Procesados\"
) else (
echo ERROR: %%~nxF >> "%DIRECTORIO%\errores.log"
)
)
endlocal
Importación de Asientos¶
Asientos Contables¶
@echo off
REM ============================================================================
REM Importación de Asientos Contables
REM ============================================================================
setlocal
set PLANTILLA=Asientos_Contables
set ARCHIVO=%~1
if "%ARCHIVO%"=="" (
echo Uso: %~nx0 asientos.xlsx [ejercicio]
exit /b 1
)
set EJERCICIO=%~2
if "%EJERCICIO%"=="" set EJERCICIO=2024
echo Importando asientos al ejercicio %EJERCICIO%...
python xls2sage50.py run --template=%PLANTILLA% --file="%ARCHIVO%"
if %ERRORLEVEL% EQU 0 (
echo.
echo Asientos importados correctamente.
REM Generar libro diario
python xls2sage50.py run --template=Libro_Diario --file="%ARCHIVO%"
) else (
echo ERROR: La importación falló.
)
endlocal
Múltiples Importaciones¶
Importación en Cascada¶
@echo off
REM ============================================================================
REM Importación en Cascada (Múltiples Entidades)
REM ============================================================================
setlocal
set DIRECTORIO_DATOS=C:\Datos\Importaciones
set FECHA=%date:~-4,4%%date:~-7,2%%date:~-10,2%
set LOG_FILE=C:\Logs\cascada_%FECHA%.log
echo [%date% %time%] Iniciando importación en cascada > %LOG_FILE%
REM Lista de importaciones en orden
set IMPORTACIONES=^
Clientes_Mensual:clientes.xlsx^
Proveedores_Mensual:proveedores.xlsx^
Articulos_Precios:articulos.xlsx
REM Procesar cada importación
for %%I in (%IMPORTACIONES%) do (
for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
set PLANTILLA=%%a
set ARCHIVO=%%b
echo [%date% %time%] Importando: !PLANTILLA! >> %LOG_FILE%
python xls2sage50.py run --template=!PLANTILLA! --file="%DIRECTORIO_DATOS%\!ARCHIVO!" >> %LOG_FILE% 2>&1
if !ERRORLEVEL! EQU 0 (
echo [%date% %time%] OK: !PLANTILLA! >> %LOG_FILE%
) else (
echo [%date% %time%] ERROR: !PLANTILLA! >> %LOG_FILE%
REM Continuar con la siguiente importación
)
)
)
echo [%date% %time%] Importación en cascada finalizada >> %LOG_FILE%
endlocal
Mantenimiento¶
Limpieza de Archivos Temporales¶
@echo off
REM ============================================================================
REM Limpieza de Archivos Temporales y Logs Antiguos
REM ============================================================================
setlocal
REM Directorios a limpiar
set DIR_TEMP=%USERPROFILE%\Documents\xls2sage50\procesos\uploads
set DIR_LOGS=%USERPROFILE%\Documents\xls2sage50\logs
set DIR_CSV=%USERPROFILE%\Documents\xls2sage50\csv
REM Días a retener
set DIAS_RETENER=30
REM Calcular fecha límite
powershell -command "$fecha = (Get-Date).AddDays(-%DIAS_RETENER%); Write-Output $fecha.ToString('yyyyMMdd-HHmmss')" > temp.txt
set /p FECHA_LIMITE=<temp.txt
del temp.txt
echo Limpiando archivos anteriores a %FECHA_LIMITE%...
REM Limpiar uploads (archivos más antiguos de 7 días)
forfiles /P "%DIR_TEMP%" /M *.* /D -7 /C "cmd /c echo Eliminando @path... & del @path" 2>nul
REM Limpiar logs antiguos
forfiles /P "%DIR_LOGS%" /M *.log /D -%DIAS_RETENER% /C "cmd /c echo Eliminando @path... & del @path" 2>nul
REM Limpiar CSV antiguos
forfiles /P "%DIR_CSV%" /M *.csv /D -%DIAS_RETENER% /C "cmd /c echo Eliminando @path... & del @path" 2>nul
echo Limpieza completada.
endlocal
Copia de Seguridad de Plantillas¶
@echo off
REM ============================================================================
REM Copia de Seguridad de Plantillas
REM ============================================================================
setlocal
set DIR_PLANTILLAS=%USERPROFILE%\Documents\xls2sage50\plantillas
set DIR_BACKUP=%USERPROFILE%\Documents\xls2sage50\backups\plantillas
set FECHA=%date:~-4,4%%date:~-7,2%%date:~-10,2%
REM Crear directorio de backup
if not exist "%DIR_BACKUP%" mkdir "%DIR_BACKUP%"
REM Copiar plantillas
echo Copiando plantillas a backup...
xcopy "%DIR_PLANTILLAS%\*.PREDEFINIDO" "%DIR_BACKUP%\%FECHA%\" /Y /I
echo Backup completado en: %DIR_BACKUP%\%FECHA%
endlocal
Monitoreo¶
Verificación de Importaciones¶
@echo off
REM ============================================================================
REM Verificación de Importaciones del Día
REM ============================================================================
setlocal
set DIR_LOGS=C:\Logs\Importaciones
set FECHA_HOY=%date:~-4,4%%date:~-7,2%%date:~-10,2%
echo Verificando importaciones del %FECHA_HOY%...
echo.
REM Buscar logs del día
if exist "%DIR_LOGS%\*%FECHA_HOY%.log" (
for %%F in ("%DIR_LOGS%\*%FECHA_HOY%.log") do (
echo.
echo Archivo: %%~nxF
echo ----------------------------------------
type "%%F"
echo ----------------------------------------
)
) else (
echo No se encontraron logs de hoy.
)
REM Contar importaciones exitosas y fallidas
set EXITOSOS=0
set FALLIDOS=0
for %%F in ("%DIR_LOGS%\*%FECHA_HOY%.log") do (
findstr /C:"Importacion exitosa" "%%F" >nul
if %ERRORLEVEL% EQU 0 set /a EXITOSOS+=1
findstr /C:"ERROR" "%%F" >nul
if %ERRORLEVEL% EQU 0 set /a FALLIDOS+=1
)
echo.
echo Resumen del día:
echo Exitosos: %EXITOSOS%
echo Fallidos: %FALLIDOS%
endlocal
Alerta de Errores¶
@echo off
REM ============================================================================
REVISA LOGS EN BUSCA DE ERRORES Y ENVÍA ALERTA
REM ============================================================================
setlocal
set DIR_LOGS=C:\Logs\Importaciones
set FECHA_HOY=%date:~-4,4%%date:~-7,2%%date:~-10,2%
set EMAIL=admin@empresa.com
set HAY_ERRORES=0
REM Buscar errores en logs de hoy
for %%F in ("%DIR_LOGS%\*%FECHA_HOY%.log") do (
findstr /C:"ERROR" "%%F" >nul
if !ERRORLEVEL! EQU 0 (
set HAY_ERRORES=1
echo ERROR encontrado en: %%~nxF >> errores_temp.txt
type "%%F" >> errores_temp.txt
echo. >> errores_temp.txt
)
)
REM Si hay errores, enviar alerta
if %HAY_ERRORES% EQU 1 (
echo Enviando alerta de errores...
REM Usar blat o similar para enviar email
blat errores_temp.txt -to %EMAIL% -subject "ALERTA: Errores en importaciones" -priority 1
del errores_temp.txt
) else (
echo No se encontraron errores hoy.
)
endlocal
!!! tip "Requiere Blat**
Para enviar emails desde scripts batch, necesita [Blat](https://www.blat.net/), una herramienta de línea de comandos para enviar emails.
Próximo Paso¶
- Automatización - Configurar tareas programadas