v20260526-0314
id="login-screen" style="display:none;position:fixed;inset:0;background:var(--bg);z-index:1000;align-items:center;justify-content:center;flex-direction:column;gap:24px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:32px;font-weight:600;color:var(--accent)">taller.cr
v20260526-0314
id="login-step1" style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:32px;width:380px;display:flex;flex-direction:column;gap:16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text);margin-bottom:4px">Iniciar sesión
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
id="login-error" style="color:var(--danger);font-size:12px;display:none">
v20260526-0314
id="login-step2" style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:32px;width:380px;display:none;flex-direction:column;gap:16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text);margin-bottom:4px">Doble autenticación

Ingresá el código de 6 dígitos de tu app Authenticator.

v20260526-0314
id="totp-error" style="color:var(--danger);font-size:12px;display:none">
v20260526-0314
id="login-step3" style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:32px;width:420px;display:none;flex-direction:column;gap:16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text);margin-bottom:4px">Configurar Authenticator

Primera vez: escaneá este código QR con Microsoft Authenticator o Google Authenticator.

v20260526-0314
id="totp-qr" style="display:flex;justify-content:center;padding:16px;background:white;border-radius:8px">

Después de escanear, ingresá el código de 6 dígitos:

v20260526-0314
id="setup-totp-error" style="color:var(--danger);font-size:12px;display:none">
v20260526-0314
id="app-shell" style="display:none">
v20260526-0314
class="logo">taller.cr
v20260526-0314
class="header-actions">
v20260526-0314
id="save-indicator" style="display:none;align-items:center;gap:6px;padding:5px 10px;background:var(--surface);border:1px solid var(--border);border-radius:20px;font-size:11px;color:var(--muted);transition:all 0.3s"> Guardando...
v20260526-0314
id="presence-indicator" style="display:none;align-items:center;gap:6px;padding:5px 10px;background:var(--surface);border:1px solid var(--border);border-radius:20px;font-size:11px;color:var(--muted)"> Solo vos
v20260526-0314
class="tab-bar">
v20260526-0314
class="tab-content active" id="tab-facturas">
v20260526-0314
style="display:flex;gap:10px;align-items:stretch;margin:16px 32px 0">
v20260526-0314
id="drop-zone" style="margin:0;flex:1;padding:16px 24px"> 📂

Arrastrá tus facturas XML aquí

Formato Hacienda CR · Múltiples archivos

v20260526-0314
style="display:flex;flex-direction:column;justify-content:center;gap:6px;min-width:140px">

Sin factura electrónica

v20260526-0314
style="margin:0 32px 0">
v20260526-0314
class="stats-bar" id="stats-facturas" style="margin-top:12px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Facturas
v20260526-0314
class="stat-value neutral" id="stat-count">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Subtotal
v20260526-0314
class="stat-value" id="stat-subtotal">₡0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">IVA total
v20260526-0314
class="stat-value" id="stat-tax">₡0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total general
v20260526-0314
class="stat-value" id="stat-total">₡0
v20260526-0314
class="toolbar" id="toolbar-facturas">
v20260526-0314
class="table-wrap" id="table-facturas" style="display:none">
NúmeroFechaProveedor SubtotalIVA TotalMonedaEstado
v20260526-0314
class="empty-msg" id="empty-facturas">

No hay facturas que coincidan.

v20260526-0314
class="tab-content" id="tab-ordenes">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Órdenes de trabajo
v20260526-0314
class="stats-bar" id="stats-ot">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total
v20260526-0314
class="stat-value neutral" id="ot-stat-count">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">En proceso
v20260526-0314
class="stat-value" style="color:var(--orange)" id="ot-stat-abiertas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Cotizaciones
v20260526-0314
class="stat-value" style="color:var(--blue)" id="ot-stat-cerradas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Costo compras
v20260526-0314
class="stat-value" id="ot-stat-costo">₡0
v20260526-0314
class="toolbar visible" id="toolbar-ordenes">
v20260526-0314
class="table-wrap" id="table-ordenes" style="display:none">
OT # Fecha Cliente Placa / Activo Modelo TipoDetalle Proforma Monto proforma Costo compras Estado
v20260526-0314
class="empty-msg" id="empty-ordenes">

No hay órdenes. Creá la primera con el botón de arriba.

v20260526-0314
class="modal-overlay" id="modal-ot">
v20260526-0314
class="modal">
v20260526-0314
class="modal-header">
v20260526-0314
class="modal-body">
v20260526-0314
class="form-grid">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group full">
v20260526-0314
id="ot-tipo-picker" style="display:flex;flex-wrap:wrap;gap:6px;margin-top:4px">
v20260526-0314
id="ot-tipo-error" style="display:none;color:var(--danger);font-size:11px;margin-top:4px">Seleccioná al menos un tipo
v20260526-0314
class="form-group" style="position:relative">
v20260526-0314
id="ot-cliente-dropdown" style="display:none;position:absolute;top:100%;left:0;right:0;z-index:300; background:var(--surface);border:1px solid var(--accent);border-top:none;border-radius:0 0 var(--radius) var(--radius); max-height:200px;overflow-y:auto;box-shadow:0 8px 24px rgba(0,0,0,0.4)">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group full">
v20260526-0314
class="form-group full">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="lineas-section">

Líneas de factura a vincular

v20260526-0314
id="lineas-picker-wrap">
v20260526-0314
class="modal-footer">
v20260526-0314
class="tab-content" id="tab-clientes">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Clientes
v20260526-0314
class="stats-bar" id="stats-clientes">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total
v20260526-0314
class="stat-value neutral" id="cl-stat-total">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Particulares
v20260526-0314
class="stat-value" style="color:var(--blue)" id="cl-stat-part">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Empresas
v20260526-0314
class="stat-value" style="color:var(--warn)" id="cl-stat-emp">0
v20260526-0314
class="toolbar visible" id="toolbar-clientes">
v20260526-0314
class="table-wrap" id="table-clientes" style="display:none">
NombreTipoÓrdenes
v20260526-0314
class="empty-msg" id="empty-clientes">

No hay clientes. Creá el primero con el botón de arriba.

v20260526-0314
class="modal-overlay" id="modal-cliente">
v20260526-0314
class="modal" style="max-width:420px">
v20260526-0314
class="modal-header">
v20260526-0314
class="modal-body">
v20260526-0314
class="form-grid" style="grid-template-columns:1fr">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="modal-footer">
v20260526-0314
class="tab-content" id="tab-inventario">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Inventario
v20260526-0314
class="stats-bar" id="stats-inv">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Ítems
v20260526-0314
class="stat-value neutral" id="inv-stat-items">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">En stock
v20260526-0314
class="stat-value" id="inv-stat-stock">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Sin stock
v20260526-0314
class="stat-value" style="color:var(--danger)" id="inv-stat-zero">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Valor total
v20260526-0314
class="stat-value" id="inv-stat-valor">₡0
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:0 32px 12px">
v20260526-0314
class="toolbar visible" id="toolbar-inv">
v20260526-0314
class="table-wrap" id="table-inv" style="display:none">
CódigoCABYSDescripciónProveedor Stock Último costo unit. Valor stock Última entrada
v20260526-0314
class="empty-msg" id="empty-inv">

No hay ítems en inventario. Ingresá líneas de factura desde la pestaña Facturas.

v20260526-0314
class="tab-content" id="tab-gastos">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Gastos generales del taller
v20260526-0314
class="stats-bar visible" id="gg-stats" style="margin:0 32px 20px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total registros
v20260526-0314
class="stat-value neutral" id="gg-stat-count">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Subtotal
v20260526-0314
class="stat-value" id="gg-stat-sub">₡0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">IVA
v20260526-0314
class="stat-value" style="color:var(--warn)" id="gg-stat-iva">₡0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total
v20260526-0314
class="stat-value" id="gg-stat-total">₡0
v20260526-0314
class="toolbar visible" style="margin:0 32px 14px;gap:10px">
v20260526-0314
class="table-wrap" id="table-gg" style="margin:0 32px 32px;display:none">
FechaProveedorDescripción Subtotal IVA Total Moneda
v20260526-0314
class="empty-msg" id="empty-gg">

No hay gastos generales registrados. Marcá líneas de factura como "🏭 Gasto" desde la pestaña de Facturas.

v20260526-0314
class="tab-content" id="tab-config">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Configuración
v20260526-0314
style="margin:0 32px 32px;max-width:640px">
v20260526-0314
style="font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:16px">Tipos de servicio
v20260526-0314
style="display:flex;gap:8px;align-items:center;margin-bottom:20px;padding:16px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)">
v20260526-0314
style="display:flex;flex-direction:column;gap:3px;align-items:center">
v20260526-0314
id="cfg-tipos-list">
v20260526-0314
id="cfg-tipos-empty" style="display:none;color:var(--muted);font-size:12px;padding:16px 0;text-align:center">No hay tipos de servicio configurados.
v20260526-0314
style="margin:0 32px 32px;max-width:640px">
v20260526-0314
style="font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:16px">Colores de estados de OT
v20260526-0314
id="cfg-estados-list">
v20260526-0314
class="tab-content" id="tab-proformas">
v20260526-0314
style="display:flex;gap:0;border-bottom:1px solid var(--border);margin:0 32px;margin-top:20px">
v20260526-0314
id="fsub-proformas">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:20px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Cuentas por cobrar
v20260526-0314
style="display:flex;gap:10px;align-items:center">
v20260526-0314
id="proformas-alert" style="display:none;margin:0 32px 16px;padding:12px 16px;background:rgba(240,200,64,0.1);border:1px solid rgba(240,200,64,0.3);border-radius:var(--radius);font-size:12px;color:var(--warn)">
v20260526-0314
class="stats-bar visible" id="proformas-stats" style="margin:0 32px 20px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total proformas
v20260526-0314
class="stat-value neutral" id="pf-stat-total">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Pendientes
v20260526-0314
class="stat-value" style="color:var(--warn)" id="pf-stat-pendientes">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Completadas
v20260526-0314
class="stat-value" id="pf-stat-facturadas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total general
v20260526-0314
class="stat-value" id="pf-stat-monto">₡0
v20260526-0314
class="toolbar visible" style="margin:0 32px 14px;gap:10px">
v20260526-0314
class="table-wrap" id="table-proformas" style="margin:0 32px 32px">
v20260526-0314
class="empty-msg" id="empty-proformas">

No hay proformas registradas. Importá un reporte Excel.

v20260526-0314
id="pf-sel-bar" style="display:none;position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--surface);border:1px solid var(--accent);border-radius:var(--radius);padding:10px 20px;display:none;align-items:center;gap:16px;z-index:500;box-shadow:0 4px 24px rgba(0,0,0,0.4)"> 0 seleccionadas | ₡0 |
v20260526-0314
id="fsub-emitidas" style="display:none">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:20px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Facturas emitidas
v20260526-0314
style="display:flex;gap:10px;align-items:center">
v20260526-0314
class="stats-bar visible" style="margin:0 32px 20px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total facturas
v20260526-0314
class="stat-value neutral" id="fe-stat-total">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Vinculadas
v20260526-0314
class="stat-value" id="fe-stat-vinculadas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Sin vincular
v20260526-0314
class="stat-value" style="color:var(--warn)" id="fe-stat-sinvincular">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total facturado
v20260526-0314
class="stat-value" id="fe-stat-monto">₡0
v20260526-0314
class="toolbar visible" style="margin:0 32px 14px;gap:10px">
v20260526-0314
class="table-wrap" id="table-emitidas" style="margin:0 32px 32px">
Número Fecha Cliente Subtotal IVA Total Mon. Plazo Vencimiento Proforma OT Activo OC
v20260526-0314
class="empty-msg" id="empty-emitidas">

No hay facturas emitidas. Sincronizá desde OneDrive.

v20260526-0314
id="fsub-notas" style="display:none">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:20px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Notas de crédito emitidas
v20260526-0314
class="stats-bar visible" style="margin:0 32px 20px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total notas
v20260526-0314
class="stat-value neutral" id="nc-stat-total">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Facturas anuladas
v20260526-0314
class="stat-value" style="color:var(--danger)" id="nc-stat-anuladas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total acreditado
v20260526-0314
class="stat-value" id="nc-stat-monto">₡0
v20260526-0314
class="toolbar visible" style="margin:0 32px 14px">
v20260526-0314
class="table-wrap" id="table-notas" style="margin:0 32px 32px">
Número Fecha Cliente Total Mon. Razón Factura anulada
v20260526-0314
class="empty-msg" id="empty-notas">

No hay notas de crédito registradas.

v20260526-0314
id="fsub-pagos" style="display:none">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:20px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Registro de pagos
v20260526-0314
class="stats-bar visible" style="margin:0 32px 16px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total pagos
v20260526-0314
class="stat-value neutral" id="pg-stat-count">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total cobrado
v20260526-0314
class="stat-value" style="color:var(--accent)" id="pg-stat-total">₡0
v20260526-0314
class="toolbar visible" style="margin:0 32px 14px;gap:10px">
v20260526-0314
class="table-wrap" id="table-pagos" style="margin:0 32px 32px;display:none">
Fecha Cliente Factura Banco Monto
v20260526-0314
class="empty-msg" id="empty-pagos">

No hay pagos registrados.

v20260526-0314
class="tab-content" id="tab-reportes">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin:24px 32px 16px">
v20260526-0314
style="font-family:'Fraunces',serif;font-size:18px;font-weight:300;color:var(--text)">Reportes
v20260526-0314
class="toolbar visible" style="margin:0 32px 20px;gap:10px">
v20260526-0314
class="stats-bar visible" id="rep-stats" style="margin:0 32px 20px">
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Proveedores
v20260526-0314
class="stat-value neutral" id="rep-stat-provs">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Facturas
v20260526-0314
class="stat-value neutral" id="rep-stat-facturas">0
v20260526-0314
class="stat-card">
v20260526-0314
class="stat-label">Total gastado
v20260526-0314
class="stat-value" id="rep-stat-total">₡0
v20260526-0314
style="margin:0 32px 32px">
v20260526-0314
style="font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:12px">Gasto por proveedor
v20260526-0314
class="table-wrap" id="table-rep-provs">
Proveedor Facturas Total (₡) % del total
v20260526-0314
class="empty-msg" id="empty-rep-provs" style="display:none">

No hay facturas en el período seleccionado.

v20260526-0314
class="modal-overlay" id="modal-factura-manual">
v20260526-0314
class="modal" style="width:780px">
v20260526-0314
class="modal-header">

Factura manual

v20260526-0314
class="modal-body">
v20260526-0314
style="display:flex;gap:8px;margin-bottom:18px">
v20260526-0314
class="form-grid">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
id="mfm-panel-rapido">
v20260526-0314
class="form-grid">
v20260526-0314
class="form-group full">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
id="mfm-panel-detalle" style="display:none">
v20260526-0314
style="display:flex;justify-content:space-between;align-items:center;margin-bottom:10px">
v20260526-0314
style="font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:0.06em">Líneas de detalle
v20260526-0314
id="mfm-lineas-wrap">
v20260526-0314
id="mfm-totales" style="display:flex;justify-content:flex-end;gap:24px;margin-top:12px;padding-top:10px;border-top:1px solid var(--border);font-size:12px">
v20260526-0314
class="modal-footer">
v20260526-0314
class="modal-overlay" id="modal-inv-manual">
v20260526-0314
class="modal" style="width:600px">
v20260526-0314
class="modal-header">

Agregar ítem al inventario

v20260526-0314
class="modal-body">
v20260526-0314
class="form-grid">
v20260526-0314
class="form-group full">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
class="form-group">
v20260526-0314
style="display:flex;align-items:center;gap:8px">
v20260526-0314
id="inv-manual-iva-preview" style="margin-top:5px;font-size:11px;color:var(--muted);min-height:16px">
v20260526-0314
class="form-group full">
v20260526-0314
class="form-group full" style="background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:14px;margin-top:4px">
v20260526-0314
id="inv-manual-granel-fields" style="display:none;grid-template-columns:1fr 1fr 1fr;gap:10px">
v20260526-0314
style="grid-column:1/-1">
v20260526-0314
id="inv-manual-granel-preview" style="font-size:11px;color:var(--accent);min-height:16px">
v20260526-0314
class="modal-footer">
v20260526-0314
id="toast">
v20260526-0314
class="modal-overlay" id="modal-vincular-pf" style="display:none">
v20260526-0314
class="modal" style="width:640px">
v20260526-0314
class="modal-header">

Vincular a proforma

v20260526-0314
class="modal-body" style="padding-bottom:4px">
v20260526-0314
id="vp-factura-info" style="background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);padding:11px 14px;margin-bottom:14px;font-size:12px">
v20260526-0314
style="display:flex;border-bottom:1px solid var(--border);margin-bottom:12px">
v20260526-0314
id="vp-results" style="max-height:340px;overflow-y:auto;padding-right:2px">
v20260526-0314
class="modal-footer">
v20260526-0314
id="sel-bar" style="display:none;position:fixed;bottom:0;left:0;right:0;z-index:300;background:var(--surface);border-top:1px solid var(--accent);padding:10px 32px;display:none;align-items:center;gap:24px;box-shadow:0 -4px 20px rgba(0,0,0,0.3)"> 0 filas
v20260526-0314
style="flex:1"> IVA: ₡0 Total: ₡0
v20260526-0314
style="position:fixed;bottom:10px;right:14px;font-family:DM Mono,monospace;font-size:10px;color:rgba(255,255,255,0.2);pointer-events:none;z-index:9999">v20260526-0254