forlogic-core 1.16.2 → 1.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ # Memory: features/import/attachment-idempotency-registry
2
+ Updated: now
3
+
4
+ ## REMOVIDO
5
+
6
+ O controle de idempotência via tabela `common.imports_file_registry` foi removido para simplificar o fluxo de importação de anexos. Agora todo arquivo válido (>0 bytes) é enviado diretamente ao Azure Blob Storage sem verificar se já existe no registry. As funções `lookupExistingFiles`, `registerUploadedFiles` e o campo `newFiles` do `UploadResult` foram removidos de `attachmentUploadService.ts`.
7
+
8
+ A tabela `common.imports_file_registry` no Supabase pode ser removida manualmente se desejado — a aplicação não a consulta mais.
@@ -1,18 +1,30 @@
1
1
  # Memory: features/import/attachment-strategy
2
2
  Updated: now
3
3
 
4
- O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{id_company_padded_5}` com nome `{id_file_revision}.{ext}`. Esse mesmo ID é incluído no CSV como coluna `id_file_revision` para que a API grave no banco com a mesma referência. Metadados (nome, extensão, tamanho, usuário, revision) são injetados automaticamente nas linhas do CSV via campos `data_type: 'file'` e `'file_metadata'`. A Edge Function `azure-blob-upload` aceita campo `container` opcional no FormData.
4
+ O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{id_company}` com nome `{id_file_revision}.{ext}`. Esse mesmo ID é incluído no CSV como coluna `id_file_revision` para que a API grave no banco com a mesma referência.
5
+
6
+ ## Idempotência via `common.imports_file_registry`
7
+
8
+ Tabela Supabase com PK `CHAR(8)` (o próprio `id_file_revision`) e constraint `UNIQUE(alias, code, file_name)`:
9
+ - Se `(alias, code, file_name)` já existe com **mesmo tamanho** → reutiliza `id_file_revision` e `blob_url`, **não faz upload**
10
+ - Se existe com **tamanho diferente** → erro de conflito
11
+ - Se não existe → gera novo ID, faz upload, registra no registry **somente após sucesso da API**
12
+ - Arquivos com 0 bytes são rejeitados imediatamente
13
+
14
+ ## Fluxo de consistência
15
+
16
+ 1. Upload para Azure (novos arquivos)
17
+ 2. Envio do CSV para API staging
18
+ 3. **Se API sucesso** → `registerUploadedFiles()` grava no registry
19
+ 4. **Se API falhar** → registry NÃO é gravado, próxima tentativa refaz upload
5
20
 
6
21
  ## Templates de anexo (attachment-only)
7
22
 
8
- Quando todos os campos ativos do template são `data_type: 'file'` ou `'file_metadata'`, o sistema detecta automaticamente como "template de anexo". Nesse modo:
23
+ Quando `import_target === 'attachments'` ou todos os campos ativos são `file`/`file_metadata`, o sistema detecta automaticamente. Nesse modo:
9
24
  - O .zip **não precisa conter xlsx** — apenas pastas com arquivos
10
- - O código do registro é extraído do **diretório pai imediato** do arquivo (último nível): `dir1/dir2/file.txt → "dir2"`
11
- - As linhas do CSV são geradas automaticamente a partir dos metadados dos arquivos
12
- - O botão "Baixar template" é substituído por "Gerenciar template"
13
- - O dropzone aceita apenas `.zip`
14
- - Não fetch de lookups nem validação de colunas
15
- - Função `executeAttachmentOnlyImport` no `importHelpers.ts` orquestra o fluxo completo
16
- - Função `buildRowsFromAttachments` no `attachmentUploadService.ts` gera as linhas
17
- - Função `extractZipAttachmentsOnly` no `zipExtractorService.ts` extrai sem exigir xlsx
18
- - Detecção via `isAttachmentOnlyTemplate` no `attachmentUploadService.ts`
25
+ - O código é extraído do **diretório pai imediato** do arquivo
26
+ - As linhas do CSV são geradas automaticamente a partir dos metadados
27
+ - Função `executeAttachmentOnlyImport` orquestra o fluxo completo
28
+ - `buildRowsFromAttachments` gera as linhas
29
+ - `extractZipAttachmentsOnly` extrai sem exigir xlsx
30
+ - `isAttachmentOnlyTemplate` detecta o tipo
@@ -2,17 +2,16 @@ import type { ModuleAccessResult } from '../types';
2
2
  /**
3
3
  * Hook para verificar se o usuário logado tem acesso a um módulo específico.
4
4
  *
5
- * Busca a lista de softwares e as associações do usuário via API Qualiex,
6
- * cruza os dados e retorna se o usuário tem acesso ao módulo configurado.
5
+ * Usa um mapa estático de softwares (alias id) e busca apenas as associações
6
+ * do usuário via API Qualiex para verificar acesso.
7
7
  *
8
8
  * **Pré-requisitos:**
9
9
  * - O projeto deve configurar `moduleAlias` no `CoreProviders`
10
10
  * - O usuário deve estar autenticado (via `useAuth`)
11
11
  *
12
12
  * **Cache:**
13
- * - Softwares: cache de 30 minutos (raramente muda)
14
13
  * - Associações: cache de 10 minutos (pode mudar com permissões)
15
- * - Ambos são limpos automaticamente no `switchUnit`
14
+ * - Limpo automaticamente no `switchUnit`
16
15
  *
17
16
  * @param moduleAliasOverride - Alias opcional para verificar acesso a outro módulo
18
17
  * (ignora o alias configurado no CoreProviders)