# `Sat.Cfdi.Descarga.Masiva.Paquete.Reader`

Extrae el contenido del ZIP descargado del WS de Descarga Masiva.

Hay dos tipos de paquete segun el `tipo_solicitud`:

  * `:cfdi` — el ZIP contiene archivos `.xml` (uno por CFDI).
  * `:metadata` — el ZIP contiene un unico `.txt` con metadatos en TSV.

Esta capa abre el ZIP en memoria con `:zip.unzip/2` y entrega cada
XML/registro al consumidor. No parsea el XML — para eso usar `Cfdi.Xml.Parser`.

# `list_files`

```elixir
@spec list_files(Sat.Cfdi.Descarga.Masiva.Types.Paquete.t()) ::
  {:ok, [String.t()]} | {:error, term()}
```

Lista los nombres de archivos dentro del paquete (utilidad de debug).

# `parse_metadata`

```elixir
@spec parse_metadata(Sat.Cfdi.Descarga.Masiva.Types.Paquete.t()) ::
  {:ok, [map()]} | {:error, term()}
```

Lista de filas del paquete `:metadata`. Cada fila es un map con keys
como `:uuid`, `:rfcemisor`, `:rfcreceptor`, `:total`, etc.

El TSV usa `~` (tilde) como separador de columnas (formato del SAT) y
la primera linea es el header.

# `stream_cfdis`

```elixir
@spec stream_cfdis(Sat.Cfdi.Descarga.Masiva.Types.Paquete.t()) ::
  {:ok, Enumerable.t()} | {:error, term()}
```

Stream lazy de XMLs de un paquete `:cfdi`. Cada elemento es
`{filename, xml}` donde `filename` es el nombre dentro del ZIP y `xml`
es el contenido como binario UTF-8.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
