Search by

kuteka / laravel-import

zagemilonga

Package Laravel genérico e independente de domínio para importações assíncronas de CSV/Excel com chunks, filas, transmissão de progresso, repetições e suporte multi-inquilino.

Package info

github.com/0zhacarias/lara-import

pkg:composer/kuteka/laravel-import

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-10-29 21:15 UTC

This package is not auto-updated.

Last update: 2026-10-30 10:17:49 UTC


README

Laravel Import — Guia rápido de utilização

Resumo prático. Para detalhes completos, consulte o README.md.

Package Laravel para importações assíncronas de CSV/Excel (streaming, chunks, filas, progresso em tempo real, erros por linha, repetição, cancelamento e multi-inquilino). A sua aplicação só implementa o importador do domínio.

Requisitos

  • PHP ^8.3
  • Laravel 13.x
  • maatwebsite/excel ^3.1 (dependência automática)
  • Fila Redis recomendada em produção (ext-redis); database/sqs também funcionam
  • Opcionais: laravel/reverb (progresso em tempo real), laravel/horizon (gestão da fila), spatie/laravel-multitenancy (multi-inquilino)

Instalação

composer require milonga/laravel-import

php artisan vendor:publish --tag=importe-config
php artisan vendor:publish --tag=importe-migrations   # opcional

php artisan migrate

Início rápido

use Kuteka\LaravelImport\DTOs\OpcoesImporte;
use Kuteka\LaravelImport\Enums\ModoImporte;
use Kuteka\LaravelImport\Enums\EstrategiaDuplicado;
use Kuteka\LaravelImport\Services\GerenciadorImporte;

$importe = GerenciadorImporte::criar(
    arquivo: $pedido->file('arquivo'),
    importador: ImportadorProduto::class,
    opcoes: OpcoesImporte::criar()
        ->tamanhoChunk(1000)
        ->fila('imports')
        ->modo(ModoImporte::Parcial)
        ->estrategiaDuplicado(EstrategiaDuplicado::Upsert),
);

$status = GerenciadorImporte::status($importe->uuid);

API estática:

GerenciadorImporte::criar(...)      // UploadedFile | caminho + importador
GerenciadorImporte::simular(...)    // pré-visualização sem persistir
GerenciadorImporte::status($uuid)
GerenciadorImporte::cancelar($uuid)
GerenciadorImporte::repetir($uuid, EscopoRepeticao::Inteiro /* ou ChunksFalhados */)
GerenciadorImporte::excluir($uuid)

Criar um importador

use Kuteka\LaravelImport\Importers\ImportadorAbstrato;
use Kuteka\LaravelImport\Contracts\LoteImportador;

class ImportadorProduto extends ImportadorAbstrato implements LoteImportador
{
    public function regras(): array
    {
        return ['nome' => ['required', 'string'], 'sku' => ['required', 'string']];
    }

    // Lote: chamado uma vez por chunk (recomendado para throughput)
    public function processarLote(array $linhas): void
    {
        Produto::query()->upsert($linhas, ['sku'], ['nome', 'preco']);
    }

    // Ou, linha a linha:
    // public function processar(array $linha): void
    // {
    //     Produto::updateOrCreate(['sku' => $linha['sku']], $linha);
    // }

    public function chaveUnica(array $linha): mixed
    {
        return $linha['sku'] ?? null;
    }

    public function cabecalhos(): array
    {
        return ['nome', 'sku', 'preco'];
    }

    public function opcoes(): array
    {
        return [
            'tem_cabecalho' => true,
            'aliases' => ['nome' => ['Nome Completo', 'full_name', 'name']],
        ];
    }
}

Mantenha os importadores idempotentes (upsert/updateOrCreate pela chaveUnica).

Fila

QUEUE_CONNECTION=redis
IMPORT_QUEUE_CONNECTION=redis
php artisan queue:work redis --queue=imports --tries=3 --timeout=600

Progresso em tempo real (opcional)

Canal privado importes.{uuid} (Reverb/Pusher/Soketi). Eventos: ImporteIniciado, ImporteProgressoAtualizado, ImporteConcluido, ImporteConcluidoComErros, ImporteFalhou, ImporteCancelado. Ative com transmitirProgresso(true) e config('importe.broadcast.enabled').

Erros

  • GET /importes/{uuid}/erros — erros por linha (JSON paginado)
  • GET /importes/{uuid}/erros/exporte?format=csv|xlsx — baixar relatório

Rotas HTTP (opcionais)

Prefixo /importes, desativáveis via config('importe.routes.enabled'):

Método Rota Descrição
GET /importes lista do utilizador
POST /importes upload + criação
GET /importes/{uuid} estado
POST /importes/{uuid}/cancelar cancelar
POST /importes/{uuid}/repetir?scope=entire|failed_chunks repetir
GET /importes/{uuid}/erros listar erros
GET /importes/{uuid}/erros/exporte baixar erros
DELETE /importes/{uuid} excluir

Comando de limpeza

php artisan importes:podar --dias=30

Resolução rápida

Problema Solução
Presa em pending Inicie o worker (queue:work redis --queue=imports)
processing não termina Ver laravel.log / jobs falhados
Sem transmissões Ver importe.broadcast.enabled e a autorização do canal
completed_with_errors Ver erros e reimportar o ficheiro corrigido