feat(transactions): edição cooperativa e visibilidade de divisões

Adiciona splitGroupId para vincular as duas shares de um lançamento
dividido (schema + índice + migration 0026). Habilita:

- Edição de par dividido com escolha de escopo (apenas este lado ou
  ambos) via novo SplitPairDialog e updateTransactionSplitPairAction
- Filtro "Somente divididos" (isDivided) na tabela de lançamentos
- Visibilidade de anexos para pessoas com acesso compartilhado via
  payerShares; upload e detach em massa expandem para shares irmãs
- Cópia independente de anexos no fluxo "Importar para Minha Conta"
  (novo fileKey, novo userId, S3 CopyObject) com seção read-only
  "Anexos que serão copiados" no dialog de importação
- Ícone de clipe na tabela de lançamentos da página da pessoa via
  EXISTS em fetchPagadorLancamentos

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-04-25 14:45:35 +00:00
parent 5b03824a72
commit b14f487824
20 changed files with 3595 additions and 86 deletions

View File

@@ -265,7 +265,8 @@ export function TransactionsFilters({
searchParams.get("category") ||
searchParams.get("accountCard") ||
searchParams.get("settled") ||
searchParams.get("hasAttachment");
searchParams.get("hasAttachment") ||
searchParams.get("isDivided");
const handleResetFilters = () => {
handleReset();
@@ -628,6 +629,23 @@ export function TransactionsFilters({
}}
/>
</div>
<div className="flex items-center justify-between">
<label
htmlFor="filter-is-divided"
className="text-sm font-medium cursor-pointer"
>
Somente divididos
</label>
<Switch
id="filter-is-divided"
checked={searchParams.get("isDivided") === "true"}
disabled={isPending}
onCheckedChange={(checked) => {
handleFilterChange("isDivided", checked ? "true" : null);
}}
/>
</div>
</div>
<DrawerFooter>