AbstractSpreadsheetBatchProcessorStrategy
extends AbstractStrategy
in package
implements
BatchProcessorStrategyInterface
Base de las estrategias de "billing.document.batch_processor" que parsean un lote de documentos tributarios entregado como planilla con el formato estándar de LibreDTE.
Genera el listado de los documentos en la estructura oficial del SII; no los construye, eso se hace después, uno a uno, al procesar el lote.
Cada estrategia concreta solo debe entregar las filas de la planilla
(readRows()), según su formato de archivo (CSV, XLSX, etc.). Todo lo demás
es común.
Formato de la planilla:
- La primera fila es el encabezado y se ignora.
- Una fila con
TipoDTEcrea un documento nuevo, con su primer ítem y su primera referencia (si las tiene). - Una fila sin
TipoDTEagrega un ítem (si traeNmbItem) y/o una referencia al último documento creado. - El par (
TipoDTE,Folio) no puede repetirse dentro del archivo. - Las filas pueden venir sin las últimas columnas, que se asumen vacías.
- En los decimales se puede usar punto o coma. No se usa separador de miles.
- Un archivo sin documentos entrega un arreglo vacío.
- Los errores indican el número de la fila donde ocurrieron.
Columnas (letra, nombre, largo máximo y obligatoriedad):
- A
TipoDTE(3, obligatorio): tipo de documento. Por ejemplo: 33 factura afecta, 34 factura exenta, 39 boleta afecta, 41 boleta exenta, 46 factura de compra, 52 guía de despacho, 56 nota de débito, 61 nota de crédito, 110 factura de exportación, 111 nota de débito de exportación y 112 nota de crédito de exportación. - B
Folio(10, obligatorio): entero mayor a 0 que identifica al documento dentro del archivo. Normalmente parte en 1 y es correlativo. - C
FchEmis(10, opcional): fecha de emisión AAAA-MM-DD. Si falta o no es válida se usa la fecha actual. - D
FchVenc(10, opcional): fecha de vencimiento AAAA-MM-DD. Si no es válida se ignora. - E
RUTRecep(10, obligatorio): RUT del receptor sin puntos, con guión y dígito verificador. - F
RznSocRecep(100, obligatorio excepto en boletas): razón social del receptor. - G
GiroRecep(40, obligatorio excepto en boletas): giro del receptor. - H
Telefono(20, opcional): teléfono del receptor, se guarda en el contacto. Formato recomendado: +56 9 55443322. - I
CorreoRecep(80, opcional): correo del receptor. Se valida. - J
DirRecep(70, obligatorio excepto en boletas): dirección del receptor. - K
CmnaRecep(20, obligatorio excepto en boletas): comuna del receptor, sin abreviaciones. - L
VlrCodigo(35, opcional): código del ítem. - M
IndExe(1, opcional): 1 si el ítem es exento, 2 si es no facturable. Otros valores no están soportados. - N
NmbItem(80, obligatorio): nombre del ítem. - O
DscItem(1000, opcional): descripción del ítem. - P
QtyItem(18, obligatorio salvo que el precio sea 0): cantidad del ítem. Una cantidad vacía o 0 solo es válida si el precio también es 0; en ese caso se omiten la cantidad y el precio del ítem. - Q
UnmdItem(4, opcional): unidad del ítem. - R
PrcItem(18, obligatorio): precio del ítem. Monto bruto (con IVA) en boletas y monto neto en los demás documentos. Un precio 0 se omite. - S
Descuento(18, opcional): descuento del ítem, en porcentaje (por ejemplo50%) o en monto (por ejemplo1000). En boletas el monto es bruto. El porcentaje se redondea a 2 decimales y el monto a un entero. Un descuento que resulta 0 se omite. - T
TermPagoGlosa(100, opcional): observación del documento. - U
PeriodoDesde(10, opcional): inicio del período AAAA-MM-DD. Si no es válido se ignora. - V
PeriodoHasta(10, opcional): fin del período AAAA-MM-DD. Si no es válido se ignora. - W
Patente(8, opcional): patente del vehículo de despacho. - X
RUTTrans(10, opcional): RUT del transportista sin puntos, con guión y dígito verificador. - Y
RUTChofer(10, obligatorio solo si va el nombre del chofer): RUT del chofer sin puntos, con guión y dígito verificador. - Z
NombreChofer(30, obligatorio solo si va el RUT del chofer): nombre del chofer. - AA
DirDest(70, opcional): dirección de despacho. - AB
CmnaDest(20, opcional): comuna de despacho, sin abreviaciones. - AC
TpoDocRef(3, opcional): tipo del documento de referencia. Por ejemplo: 33, 34, 39, 41, 52, 801 orden de compra o HES hoja de entrada de servicios. - AD
FolioRef(18, obligatorio si hay referencia): folio del documento de referencia. El folio 0 indica una referencia global a un conjunto de documentos. - AE
FchRef(10, obligatorio si hay referencia): fecha del documento de referencia AAAA-MM-DD. - AF
CodRef(1, obligatorio en notas de crédito y de débito): código de referencia. 1 anula el documento, 2 corrige el texto y 3 corrige los montos. - AG
RazonRef(90, obligatorio en notas de crédito y de débito): motivo de la referencia. - AH
Moneda(3, opcional): moneda de los documentos de exportación. Por defecto USD. - AI
NumId(20, opcional): ID del receptor extranjero, en los documentos de exportación. - AJ
DscGlobal Exento(18, opcional): descuento global sobre el monto exento, en porcentaje (por ejemplo50%) o en monto. - AK
Nombre PDF(100, opcional): nombre del PDF a descargar. Se pueden usar las variables {rut}, {dv}, {dte} y {folio}. - AL
Forma de Pago(1, opcional): 1 contado, 2 crédito y 3 sin costo (entrega gratuita). - AM
CodImpAdic(3, opcional): código del impuesto adicional, recargo o retención del ítem. Por ejemplo: 15 para el IVA retenido total en facturas de compra. - AN
DscGlobal Afecto(18, opcional): descuento global sobre el monto afecto, en porcentaje (por ejemplo50%) o en monto. En boletas el monto es bruto. - AO
PatenteCarro(8, opcional): patente del carro o remolque. - AP
FchSalida(10, opcional): fecha de salida del traslado AAAA-MM-DD. Si no es válida se ignora. - AQ
HraSalida(8, opcional): hora de salida del traslado, HH:MM o HH:MM:SS. - AR
FchLlegada(10, opcional): fecha de llegada del traslado AAAA-MM-DD. Si no es válida se ignora.
Table of Contents
Interfaces
- BatchProcessorStrategyInterface
- Interfaz para las estrategias de los procesadores de documentos en lote.
Properties
- $repositoryManager : RepositoryManagerInterface
Methods
- __construct() : mixed
- Constructor de la estrategia con sus dependencias.
- parse() : array<string|int, mixed>
- Parsea los datos de entrada del lote y genera los datos de los documentos tributarios electrónicos.
- readRows() : array<int, array<int, string>>
- Entrega las filas de la planilla del lote, incluyendo el encabezado.
- addGlobalDiscount() : void
- Agrega un descuento global al documento.
- addItem() : void
- Agrega un ítem al documento.
- addReference() : void
- Agrega una referencia a un documento.
- addTransport() : void
- Agrega información de transporte a un documento.
- createDocument() : array<string|int, mixed>
- Crea un documento a partir de los datos proporcionados.
- getCurrency() : string|null
- Obtiene la glosa de una moneda a partir de su código ISO.
- setInitialDTE() : array<string|int, mixed>
- Genera la estructura inicial del DTE.
Properties
$repositoryManager
private
RepositoryManagerInterface
$repositoryManager
Methods
__construct()
Constructor de la estrategia con sus dependencias.
public
__construct(RepositoryManagerInterface $repositoryManager) : mixed
Parameters
- $repositoryManager : RepositoryManagerInterface
parse()
Parsea los datos de entrada del lote y genera los datos de los documentos tributarios electrónicos.
public
parse(DocumentBatchInterface $batch) : array<string|int, mixed>
Parameters
- $batch : DocumentBatchInterface
-
Contenedor del lote a parsear.
Return values
array<string|int, mixed> —Arreglo con los datos de cada documento parseado.
readRows()
Entrega las filas de la planilla del lote, incluyendo el encabezado.
protected
abstract readRows(DocumentBatchInterface $batch) : array<int, array<int, string>>
Cada fila es un arreglo de strings con los valores de las celdas, en el
orden de las columnas. Las celdas vacías son '' (nunca null) y los
valores, incluidos los números y las fechas, están como texto tal cual
los entregaría un formulario (por ejemplo, las fechas como AAAA-MM-DD).
No se deben omitir filas (ni las vacías): el índice de cada fila se usa
para informar dónde ocurrió un error.
Parameters
- $batch : DocumentBatchInterface
Tags
Return values
array<int, array<int, string>>addGlobalDiscount()
Agrega un descuento global al documento.
private
addGlobalDiscount(array<string|int, mixed> &$documento, string $descuento, bool $exento) : void
Parameters
- $documento : array<string|int, mixed>
-
Documento al que se agregará el descuento. Se pasa por referencia para modificarlo.
- $descuento : string
-
Porcentaje (por ejemplo
10%) o monto (por ejemplo1000) del descuento. - $exento : bool
-
Si es
trueel descuento aplica al monto exento, si esfalseaplica al monto afecto.
Return values
void —Modifica el documento directamente.
addItem()
Agrega un ítem al documento.
private
addItem(array<string|int, mixed> &$documento, array<string|int, mixed> $item) : void
Procesa los datos de un ítem y lo agrega al arreglo de detalles. Valida que los campos mínimos estén presentes y ajusta la longitud de los datos.
Parameters
- $documento : array<string|int, mixed>
-
Documento al que se agregará el ítem. Modificado directamente.
- $item : array<string|int, mixed>
-
Datos del ítem. Los índices corresponden a:
- 0: Código del ítem (opcional).
- 1: Indicador de exención (opcional).
- 2: Nombre del ítem (obligatorio).
- 3: Descripción del ítem (opcional).
- 4: Cantidad del ítem (obligatoria, salvo que el precio sea 0).
- 5: Unidad de medida (opcional).
- 6: Precio del ítem (obligatorio).
- 7: Descuento (opcional, porcentaje o monto).
- 8: Código de impuesto adicional (opcional).
Tags
addReference()
Agrega una referencia a un documento.
private
addReference(array<string|int, mixed> &$documento, array<string|int, mixed> $referencia) : void
Procesa los datos de referencia y los agrega al arreglo Referencia
dentro del documento. Valida los campos obligatorios y ajusta su longitud
si es necesario.
Parameters
- $documento : array<string|int, mixed>
-
Documento al que se agregará la referencia. Se pasa por referencia para modificarlo.
- $referencia : array<string|int, mixed>
-
Datos de la referencia a agregar. Los índices deben ser:
- 0: Tipo del documento referenciado (obligatorio).
- 1: Folio del documento referenciado (obligatorio).
- 2: Fecha del documento en formato AAAA-MM-DD (obligatorio).
- 3: Código de referencia (opcional).
- 4: Razón de la referencia (opcional).
Tags
Return values
void —Modifica el documento directamente.
addTransport()
Agrega información de transporte a un documento.
private
addTransport(array<string|int, mixed> &$documento, array<string|int, mixed> $transporte) : void
Procesa los datos de transporte proporcionados y los agrega al arreglo
Transporte dentro del documento. Los datos incluyen información de
patente, transportista, chofer, destino y fechas del traslado.
Parameters
- $documento : array<string|int, mixed>
-
Documento al que se agregará la información de transporte. Se pasa por referencia para modificarlo.
- $transporte : array<string|int, mixed>
-
Datos de transporte a procesar. Los índices son:
- 0: Patente del vehículo (opcional).
- 1: RUT del transportista (opcional).
- 2: RUT del chofer (opcional).
- 3: Nombre del chofer (opcional).
- 4: Dirección del destino (opcional).
- 5: Comuna del destino (opcional).
- 6: Patente del carro o remolque (opcional).
- 7: Fecha de salida AAAA-MM-DD (opcional, se ignora si no es válida).
- 8: Hora de salida HH:MM o HH:MM:SS (opcional).
- 9: Fecha de llegada AAAA-MM-DD (opcional, se ignora si no es válida).
Tags
Return values
void —Modifica el documento directamente.
createDocument()
Crea un documento a partir de los datos proporcionados.
private
createDocument(array<string|int, mixed> $data) : array<string|int, mixed>
Verifica los datos mínimos requeridos y genera la estructura base.
También agrega ítems, transporte y referencias al documento.
Parameters
- $data : array<string|int, mixed>
-
Datos para crear el documento. Los índices corresponden a:
- 0: Tipo de documento (obligatorio).
- 1: Folio del documento (obligatorio).
- 2: Fecha de emisión (opcional).
- 3: Fecha de vencimiento (opcional).
- 4: RUT del receptor (obligatorio).
- 5: Razón social del receptor (obligatoria si no es boleta).
- 6: Giro del receptor (obligatorio si no es boleta).
- 7: Teléfono del receptor, va en Contacto (opcional, máximo 20).
- 8: Correo del receptor (opcional, validado si se proporciona).
- 9: Dirección del receptor (obligatoria si no es boleta).
- 10: Comuna del receptor (obligatoria si no es boleta).
- 33: Tipo de moneda (opcional, por defecto USD si aplica).
- 34: Número de identificación del receptor extranjero (opcional).
- 35: Descuento global exento (opcional, porcentaje o monto).
- 36: Nombre del PDF (opcional).
- 37: Forma de pago (opcional, 1, 2 o 3).
- 38: Código de impuesto adicional (opcional).
- 39: Descuento global afecto (opcional, porcentaje o monto).
Tags
Return values
array<string|int, mixed> —Estructura del documento generado.
getCurrency()
Obtiene la glosa de una moneda a partir de su código ISO.
private
getCurrency(string $moneda) : string|null
Este método busca en el repositorio de la entidad AduanaMoneda un
registro que coincida con el código ISO proporcionado. Si encuentra un
resultado, devuelve la glosa asociada; de lo contrario, retorna null.
Parameters
- $moneda : string
-
Código ISO de la moneda que se desea buscar.
Return values
string|null —La glosa de la moneda o null si no existe.
setInitialDTE()
Genera la estructura inicial del DTE.
private
setInitialDTE(array<string|int, mixed> $data) : array<string|int, mixed>
Este método crea un arreglo con la estructura base del DTE, incluyendo encabezado, emisor, receptor y detalles. Configura valores predeterminados para los campos opcionales y procesa algunos datos de entrada.
Parameters
- $data : array<string|int, mixed>
-
Datos de entrada para generar la estructura del DTE.
Return values
array<string|int, mixed> —Arreglo con la estructura inicial del DTE.