feat: Sistema de gestión de impresoras persistente

- Crear modelo Printer con campos: id, name, host, deviceId, timeout, isDefault
- Almacenamiento persistente en data/printers.json
- APIs CRUD: GET/POST /api/printers, GET/PUT/DELETE /api/printers/:id
- API para seleccionar impresora activa: POST /api/printers/select
- Endpoint de impresión ahora usa la impresora seleccionada o la especificada por printerId
- Composable usePrinters() para el cliente
- UI: Selector de impresora en sidebar, tab Impresoras en mobile
- Componentes: PrintersList, PrintersCard, PrintersForm, PrintersSelector
This commit is contained in:
2025-11-25 00:44:50 -06:00
parent 955584275b
commit e97b2b4d8e
15 changed files with 1006 additions and 6 deletions

View File

@@ -1,18 +1,20 @@
// Endpoint genérico de impresión que acepta una lista de operaciones
import { buildFromOperations, type Operation } from '../../utils/eposBuilder'
import { buildSoapEnvelope, sendToPrinter, parsePrinterResponse } from '../../utils/printer'
import { getSelectedPrinter, getPrinterById } from '../../utils/printers'
export default defineEventHandler(async (event) => {
try {
const config = useRuntimeConfig()
const body = await readBody(event)
const {
operations = [],
dryRun = false
dryRun = false,
printerId
} = body as {
operations?: Operation[]
dryRun?: boolean
printerId?: string
}
// Construir el XML interior con las operaciones
@@ -28,12 +30,24 @@ export default defineEventHandler(async (event) => {
}
}
// Obtener la impresora a usar
let printer = printerId
? await getPrinterById(printerId)
: await getSelectedPrinter()
if (!printer) {
return {
ok: false,
error: 'No hay impresora configurada. Por favor, agrega una impresora primero.'
}
}
// Enviar a la impresora
const result = await sendToPrinter(
soap,
config.printerHost,
config.printerDeviceId,
parseInt(config.printerTimeoutMs)
printer.host,
printer.deviceId,
printer.timeout
)
// Parsear la respuesta
@@ -43,7 +57,11 @@ export default defineEventHandler(async (event) => {
ok: success,
httpStatus: result.status,
code,
raw: result.data
raw: result.data,
printerUsed: {
id: printer.id,
name: printer.name
}
}
} catch (err: any) {
return {