feat: excluir transações de extrato + delete em lote por mês

Remove restrição que bloqueava delete de transações importadas.
Adiciona DELETE /transactions?month=YYYY-MM para exclusão em lote
e botão "EXCLUIR MÊS" na view de transações.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
2026-05-27 16:41:26 -03:00
co-authored by Claude Sonnet 4.6
parent 0507d7bff3
commit 88461a4aea
6 changed files with 50 additions and 5 deletions
@@ -16,6 +16,7 @@ type ManualTransactionRepository interface {
Create(ctx context.Context, t model.Transaction) (*model.Transaction, error)
Update(ctx context.Context, t model.Transaction) (*model.Transaction, error)
Delete(ctx context.Context, id int) error
DeleteByMonth(ctx context.Context, month string) (int, error)
// HasMatchingTransaction checks if a category has a transaction of the given type in the given month.
HasMatchingTransaction(ctx context.Context, categoryID *int, month string, amount float64, txType string) (bool, error)
}
@@ -93,7 +94,7 @@ func (r *manualTxRepo) Update(ctx context.Context, t model.Transaction) (*model.
}
func (r *manualTxRepo) Delete(ctx context.Context, id int) error {
tag, err := r.db.Exec(ctx, `DELETE FROM transactions WHERE id = $1 AND source = 'manual'`, id)
tag, err := r.db.Exec(ctx, `DELETE FROM transactions WHERE id = $1`, id)
if err != nil {
return err
}
@@ -103,6 +104,14 @@ func (r *manualTxRepo) Delete(ctx context.Context, id int) error {
return nil
}
func (r *manualTxRepo) DeleteByMonth(ctx context.Context, month string) (int, error) {
tag, err := r.db.Exec(ctx, `DELETE FROM transactions WHERE TO_CHAR(date, 'YYYY-MM') = $1`, month)
if err != nil {
return 0, err
}
return int(tag.RowsAffected()), nil
}
func (r *manualTxRepo) HasMatchingTransaction(ctx context.Context, categoryID *int, month string, amount float64, txType string) (bool, error) {
if categoryID == nil {
// No category set — cannot auto-match, always report as uncovered