npm package: @seiton/printer
Description: Driver para las impresoras Seiton, incluye todas las funciones basicas para poder imprimir tickets
Author: Seiton
Latest version: 3.0.4

# Seiton Driver Node

[![NPM Version](https://img.shields.io/npm/v/@seiton/printer)](https://www.npmjs.com/package/@seiton/printer)

Driver para impresoras térmicas Seiton que facilita la impresión de tickets mediante Node.js, con soporte completo de TypeScript.

## 📋 Requisitos Previos

- Node.js >= 14.0.0
- npm >= 6.0.0
- Impresora Seiton conectada vía USB

## 🚀 Instalación

```bash
npm install @seiton/printer
```

## 💡 Uso Básico

### Typescript

```typescript
import { Seiton } from '@seiton/printer';

// Crear una nueva instancia de Seiton para Windows vía USB
const printerWindows = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80', // Nombre de la impresora en Windows
    },
  },
});

// O para Linux vía USB
const printerLinux = new Seiton({
  usb: {
    linux: {
      devicePath: '/dev/usb/lp0',
    },
  },
});

// O para conexión vía Ethernet
const printerNetwork = new Seiton({
  ethernet: {
    ip: '192.168.1.100',
    port: 9100,
  },
});

// Crear un ticket
printer
  .alignToCenter() // Centrar el contenido
  .doubleTallDoubleWide() // Texto doble alto y ancho
  .addText('Mi Negocio') // Agregar texto
  .feedLines(1) // Avanzar una línea
  .setDefaultStyles() // Restablecer estilos
  .addText('Ticket #001') // Agregar número de ticket
  .feedLines(2) // Avanzar dos líneas
  .addQRCode('https://minegocio.com', 8) // Generar código QR
  .feedAndCutPaper() // Avanzar y cortar papel
  .print(); // Imprimir el ticket
```

### Javascript

```javascript
const { Seiton } = require('@seiton/printer');

// Crear una nueva instancia de Seiton para Windows vía USB
const printerWindows = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80', // Nombre de la impresora en Windows
    },
  },
});

// O para Linux vía USB
const printerLinux = new Seiton({
  usb: {
    linux: {
      devicePath: '/dev/usb/lp0',
    },
  },
});

// O para conexión vía Ethernet
const printerNetwork = new Seiton({
  ethernet: {
    ip: '192.168.1.100',
    port: 9100,
  },
});

// Crear un ticket
printer
  .alignToCenter() // Centrar el contenido
  .doubleTallDoubleWide() // Texto doble alto y ancho
  .addText('Mi Negocio') // Agregar texto
  .feedLines(1) // Avanzar una línea
  .setDefaultStyles() // Restablecer estilos
  .addText('Ticket #001') // Agregar número de ticket
  .feedLines(2) // Avanzar dos líneas
  .addQRCode('https://minegocio.com', 8) // Generar código QR
  .feedAndCutPaper() // Avanzar y cortar papel
  .print(); // Imprimir el ticket
```

La diferencia principal radica en la manera de importar el módulo.

## 📖 Métodos Disponibles

### Estilos de Texto

- `.setDefaultStyles()` - Restablece todos los estilos a sus valores predeterminados
- `.doubleTall()` - Aplica formato de texto doble alto
- `.doubleWide()` - Aplica formato de texto doble ancho
- `.doubleTallBold()` - Aplica formato de texto doble alto y negrita

### Alineación

- `.alignToCenter()` - Centra el contenido
- `.alignToRight()` - Alinea el contenido a la derecha

### Manejo de Texto y Papel

- `.addText(texto: string)` - Agrega texto al ticket
- `.feedLine()` - Avanza una línea
- `.feedLines(lineas: number)` - Avanza múltiples líneas
- `.feedAndCutPaper()` - Avanza y corta el papel
- `.cutPaper()` - Corta el papel

### Códigos y Elementos Especiales

- `.addQRCode(contenido: string, tamaño: number)` - Genera un código QR
- `.addBarcode(datos: string, ancho?: number, alto?: number)` - Imprime un código de barras
- `.posBeep(cantidadPitidos: number, duracionMs: number)` - Activa el buzzer
- `.setStaticIP(ip: string, mask: string, gateway: string, dns1: string, dns2: string)` - Configura la impresora con una dirección IP estática
- `.setDHCP()` - Configura la impresora para obtener una dirección IP dinámica mediante DHCP

### Control de Impresión y Estado

- `.print()` - Imprime el ticket
- `.printSelfTest()` - Imprime página de prueba
- `.isPrinterConnected()` - Verifica si la impresora está conectada y accesible

### Métodos Estáticos (Windows)

- `Seiton.getWindowsPrinters()` - Obtiene la lista de todas las impresoras instaladas en Windows con su estado
- `Seiton.isWindowsPrinterAvailable(printerName: string)` - Verifica si una impresora específica está disponible en Windows

## 🎯 Ejemplos Prácticos

### Ticket de Venta

```typescript
// Configuración para Windows
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80',
    },
  },
});

// O para Linux
// const printer = new Seiton({
//   linux: {
//     devicePath: '/dev/usb/lp0'
//   }
// });

printer
  .alignToCenter()
  .doubleTallBold()
  .addText('Supermercado XYZ')
  .setDefaultStyles()
  .feedLines(1)
  .addText('Fecha: 2024-01-20')
  .addText('Ticket #: 001')
  .feedLines(1)
  .addText('Producto 1 ........... $100')
  .addText('Producto 2 ........... $200')
  .feedLines(1)
  .doubleTallBold()
  .alignToRight()
  .addText('Total: $300')
  .setDefaultStyles()
  .feedLines(2)
  .alignToCenter()
  .addQRCode('https://miticket.com/001', 8)
  .feedAndCutPaper()
  .print();
```

### Ticket Simple con Código de Barras

```typescript
// Configuración para Windows
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80',
    },
  },
});

printer.alignToCenter().addText('Código de Producto').addBarcode('12345678', 4, 100).feedLines(4).print();
```

### Configuración de la impresora con IP estática

```typescript
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80',
    },
  },
});

printer.setStaticIP('192.168.1.100', '255.255.255.0', '192.168.1.1', '8.8.8.8', '8.8.4.4').printSelfTest();
```

### Configuración de la impresora con IP dinámica

```typescript
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80',
    },
  },
});

printer.setDHCP().printSelfTest();
```

## 🔍 Obtener Nombres de Impresoras en Windows

Antes de configurar tu impresora en Windows, puedes obtener la lista de impresoras disponibles:

### Obtener todas las impresoras

```typescript
import { Seiton } from '@seiton/printer';

// Obtener lista de impresoras disponibles en Windows
const printers = await Seiton.getWindowsPrinters();
console.log(printers);
// Salida:
// [
//   { name: "POS-80", status: "Idle", isDefault: false },
//   { name: "Microsoft Print to PDF", status: "Idle", isDefault: true }
// ]
```

### Verificar si una impresora específica está disponible

```typescript
import { Seiton } from '@seiton/printer';

const isAvailable = await Seiton.isWindowsPrinterAvailable('POS-80');
if (isAvailable) {
  console.log('La impresora POS-80 está disponible');
  // Crear instancia con esa impresora
  const printer = new Seiton({
    usb: {
      windows: {
        printerName: 'POS-80',
      },
    },
  });
} else {
  console.log('La impresora no está disponible');
}
```

### Ejemplo completo: Seleccionar impresora dinámicamente

```typescript
import { Seiton } from '@seiton/printer';

// Obtener todas las impresoras
const printers = await Seiton.getWindowsPrinters();

// Buscar una impresora Seiton (por ejemplo, que contenga "POS" en el nombre)
const seitonPrinter = printers.find(p => p.name.includes('POS'));

if (seitonPrinter) {
  console.log(`Impresora encontrada: ${seitonPrinter.name}`);
  
  // Crear instancia con la impresora encontrada
  const printer = new Seiton({
    usb: {
      windows: {
        printerName: seitonPrinter.name,
      },
    },
  });
  
  // Imprimir ticket de prueba
  printer
    .alignToCenter()
    .addText('Impresora configurada correctamente')
    .feedAndCutPaper()
    .print();
} else {
  console.log('No se encontró ninguna impresora Seiton');
}
```

## 🔧 Configuración del Dispositivo

La librería soporta dos modos de configuración dependiendo del sistema operativo:

### Windows

## 🔧 Configuración

La clase `Seiton` acepta un objeto de configuración con las siguientes interfaces:

### ISeitonConfig

Interfaz principal de configuración que permite especificar el tipo de conexión:

```typescript
interface ISeitonConfig {
  usb?: ISeitonUSBConfig; // Configuración para conexión USB
  ethernet?: ISeitonEthConfig; // Configuración para conexión Ethernet
}
```

### ISeitonUSBConfig

Configuración específica para conexiones USB en diferentes sistemas operativos:

```typescript
interface ISeitonUSBConfig {
  windows?: ISeitonWindowsConfig; // Configuración para Windows
  linux?: ISeitonLinuxConfig; // Configuración para Linux
}
```

### ISeitonWindowsConfig

Configuración para impresoras en Windows:

```typescript
interface ISeitonWindowsConfig {
  printerName: string; // Nombre de la impresora en Windows (ej: 'POS-80')
}
```

### ISeitonLinuxConfig

Configuración para dispositivos USB en Linux:

```typescript
interface ISeitonLinuxConfig {
  devicePath: string; // Ruta del dispositivo USB (ej: '/dev/usb/lp0')
}
```

### ISeitonEthConfig

Configuración para conexiones Ethernet:

```typescript
interface ISeitonEthConfig {
  ip: string; // Dirección IP de la impresora
  port: number; // Puerto de la impresora (típicamente 9100)
}
```

### Notas importantes:

- Solo se debe proporcionar una configuración a la vez (USB o Ethernet)
- Para USB, solo se debe configurar un sistema operativo (Windows o Linux)
- Para Windows, `printerName` debe ser el nombre exacto de la impresora tal como aparece en el sistema
- Para Linux, `devicePath` debe ser una ruta válida al dispositivo USB
- Para Ethernet, se requiere una dirección IP válida y un puerto

```typescript
// Configuración para Windows usando el nombre de la impresora
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80', // Nombre exacto de la impresora en Windows
    },
  },
});

// Puedes obtener el nombre exacto usando el método getWindowsPrinters()
const printers = await Seiton.getWindowsPrinters();
const myPrinter = printers[0]; // Selecciona la impresora deseada
const printer = new Seiton({
  usb: {
    windows: {
      printerName: myPrinter.name,
    },
  },
});
```

### Linux

En Linux, necesitas proporcionar la ruta del dispositivo:

```typescript
const printer = new Seiton({
  usb: {
    linux: {
      devicePath: '/dev/usb/lp0', // Ajusta según tu configuración
    },
  },
});
```

Las rutas típicas en Linux son:

- `/dev/usb/lp0` (primera impresora)
- `/dev/usb/lp1` (segunda impresora)

> **Nota**: Solo puedes configurar un sistema operativo a la vez. La librería lanzará un error si intentas configurar ambos simultáneamente.

### Verificación de Conexión

Puedes verificar si la impresora está correctamente conectada y accesible usando el método `isPrinterConnected()`:

```typescript
const printer = new Seiton({
  usb: {
    windows: {
      printerName: 'POS-80',
    },
  },
});

const isPrinterConnected = await printer.isPrinterConnected();
if (isPrinterConnected) {
  console.log('Impresora conectada y lista');
} else {
  console.log('No se pudo conectar con la impresora');
}
```

### Manejo de Errores

La librería proporciona mensajes de error detallados que te ayudarán a identificar problemas comunes:

- Impresora no encontrada (VID/PID incorrectos)
- Dispositivo ocupado por otro proceso
- Interfaces USB no disponibles
- Errores de acceso al dispositivo

## 📜 Términos y Condiciones de Uso

- Esta libreria es de uso gratuito para los clientes de Seiton.
- No se garantiza funcionamiento con otras impresoras.
- Seiton se reserva el derecho de realizar cambios en la librería, publicando actualizaciones sin previo aviso.

## 🏢 Empresa

[Seiton](https://seiton.com.ar/) - Soluciones de impresión para tu negocio.

## 📞 Soporte

- Sitio Web: [https://seiton.com.ar/](https://seiton.com.ar/)
- Email: [contacto@seiton.com.ar](mailto:contacto@seiton.com.ar)