Corregeix els errors del teu ledger

Corregeix els moviments incorrectes del teu ledger sense perdre el rastre del que ha canviat. Cada correcció deixa una entrada d’historial visible, de manera que sempre pots veure quin aspecte tenia un moviment abans i després. Tot passa al teu ordinador: no s’envia res enlloc.

Abans de començar

Necessita:

  • Un perfil de contribuent actiu. Cada ordre següent treballa sobre el perfil actiu; si no n’hi ha cap, l’ordre es nega. Consulta Configura el teu perfil de contribuent.

  • Una contrasenya de clau mestra. L’eina te la demana el primer cop que obre el teu emmagatzematge xifrat en una sessió.

  • Un ledger amb moviments.

Per trobar el moviment que vols corregir, llistes els teus moviments i visualitza’n un en detall. La seqüència següent registra una despesa d’exemple, llista el ledger i inspecciona aquella fila:

1Record an example expense you will correct in the sections below.
aeat --format json app ledger add --date 2026-03-15 --amount 210.00 --direction OUTGOING \
  --description Silla de oficina --idempotency-key correct-find
aeat --format json app ledger add --date 2026-03-15 --amount 210.00 --direction OUTGOING `
  --description Silla de oficina --idempotency-key correct-find
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "a9ef0aa32d83010e35c72d35d6cc793ade13766f38979a9ae358646f1064352f"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "210",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Silla de oficina",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb"
  },
  "schema_version": "2",
  "status": "success"
}
2List your transactions to find the one to fix.
aeat app ledger list
aeat app ledger list
ACCOUNTING LEDGER TRANSACTIONS
id	full_id	date	amount	description	IVA category	review_status
f83add28	f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb	2026-03-15	210	Silla de oficina		pending
3Inspect one transaction in detail before changing it.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "210",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Silla de oficina",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the inspected transaction is the one you want to fix.

L’ordre view reporta l’id, l’import, la direcció, la descripció i l’estat del cicle de vida. La guia de moviments tracta a fons la llista i el filtratge.

Tria la teva correcció

  • Si un moviment té un import, una data o un text incorrectes, actualitza’l.

  • Si un moviment no hauria d’existir en absolut, elimina’l.

  • Si la mateixa compra s’ha importat dues vegades, elimines el duplicat, o bé arxiva’l per conservar-ne un rastre deliberat.

  • Si un pagament cobreix dues coses diferents, divideix-lo.

  • Si has dividit una cosa i la vols tornar a ajuntar, fusiona les parts.

  • Si dubtes d’un moviment i el vols treure del mig, posa’l de banda.

  • Si vols mantenir un moviment a l’historial però fora de les llistes quotidianes, arxiva’l.

  • Si has posat de banda o arxivat un moviment per error, restaura’l a actiu.

Actualitza camps d’un moviment

Canvia un o més camps directament. La seqüència registra una cadira al preu incorrecte, corregeix l’import i la descripció i confirma la correcció:

1Record a transaction with a wrong price to correct.
aeat --format json app ledger add --date 2026-03-15 --amount 100.00 --direction OUTGOING \
  --description Office chair --idempotency-key correct-update
aeat --format json app ledger add --date 2026-03-15 --amount 100.00 --direction OUTGOING `
  --description Office chair --idempotency-key correct-update
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "47c494e7c2a1631efad4835b3c50110ccfda63015482d65fef4f0b83f8dd1c61"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "100",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Office chair",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "1a9106f8f6783eaf5ba09478eeb3bcec6188caf02d136a7cdd9770bcd6e7830d",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "1a9106f8f6783eaf5ba09478eeb3bcec6188caf02d136a7cdd9770bcd6e7830d"
  },
  "schema_version": "2",
  "status": "success"
}
2Change the amount and description in one command.
aeat app ledger update {transaction_id} --amount 121.00 --description \
  Office chair, corrected price
aeat app ledger update {transaction_id} --amount 121.00 --description `
  Office chair, corrected price
ID	59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5
Date	2026-03-15
Amount	121
Description	Office chair, corrected price
Review status	pending
3The original id still resolves; view it to confirm the correction.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "121",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Office chair, corrected price",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the update replaced the amount and description.

Cada indicador substitueix completament aquell camp: escriu el valor nou complet, no una addició a l’antic. Escriu l’import com una xifra positiva: el camp de direcció indica si els diners han entrat o han sortit, i un import negatiu es rebutja. Els camps actualitzables són: date, value-date, amount, direction, currency, counterparty, description, taxable-base, iva-rate, iva-amount, irpf-category, notes i group.

Una actualització dona un ID nou al moviment: la sortida de l’actualització l’imprimeix. No cal que facis el seguiment del canvi per a les ordres de lectura: un ID que hagis anotat abans de l’actualització continua responent a history, view i track, resolent-se al moviment corregit, exactament com fa el view anterior. Per a una mutació posterior (una altra update, classify o archive), utilitza l’ID actual de la sortida de l’actualització o de list, perquè aquestes ordres actuen sobre el moviment viu.

L’actualització només funciona sobre moviments actius. Els moviments arxivats i posats de banda la rebutgen, igual que un pare de divisió: les parts actives d’una divisió es poden actualitzar amb normalitat.

Elimina un moviment

Eliminar suprimeix un moviment dels teus registres actius. Previsualitza-ho primer amb --dry-run i, tot seguit, elimina’l de veritat. L’id eliminat ja no es resol, que és com la seqüència confirma la supressió:

1Record a transaction imported from the wrong file.
aeat --format json app ledger add --date 2026-03-15 --amount 60.50 --direction OUTGOING \
  --description Wrong import --idempotency-key correct-remove
aeat --format json app ledger add --date 2026-03-15 --amount 60.50 --direction OUTGOING `
  --description Wrong import --idempotency-key correct-remove
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "8b33ed95365478e1093bdc08e4960210b7eb3fda5fe8f7de1144c1a9c47a8688"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "60.5",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Wrong import",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb"
  },
  "schema_version": "2",
  "status": "success"
}
2Preview the removal without deleting anything.
aeat app ledger remove {transaction_id} --reason wrong file imported --dry-run
aeat app ledger remove {transaction_id} --reason wrong file imported --dry-run
Bucket	<profile-id>
ID	1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb
Removed	False
DRY RUN MODE	True
3Remove it for real.
aeat app ledger remove {transaction_id} --reason wrong file imported --yes
aeat app ledger remove {transaction_id} --reason wrong file imported --yes
Bucket	<profile-id>
ID	1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb
Removed	True
DRY RUN MODE	False
4Confirm the id no longer resolves.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "error": {
    "action": {
      "action": null,
      "argument_bindings": [],
      "conditionality": "not_applicable",
      "evidence": [
        {
          "condition_id": "cli.ledger.transaction_id.resolves",
          "evidence_id": "cli.ledger.transaction_id.resolves.observation",
          "provenance": "runtime_observation",
          "values": {
            "transaction_id_resolves": false
          }
        }
      ],
      "failed_condition_id": "cli.ledger.transaction_id.resolves",
      "missing_argument_names": [],
      "no_recovery_outcome": "operator_decision"
    },
    "category": "REFUSED",
    "code": "REFUSED_FINANCIAL_LEDGER_TRANSACTION_ID_PREFIX",
    "context": {
      "prefix": "'1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb'"
    },
    "message": "no transaction matches id prefix '1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb'",
    "retryable": false,
    "runbook_id": null,
    "trace_id": null
  },
  "notices": [],
  "schema_version": "2",
  "status": "error"
}

Confirm the removed transaction no longer resolves.

Un moviment eliminat ja no és als teus registres actius: el view final es nega perquè l’id ja no anomena una fila activa.

Divideix un moviment en parts

Quan un pagament cobreix dues coses diferents (per exemple, un pagament amb targeta que barreja articles de negoci i personals), divideix-lo en parts. Els imports i les descripcions s’aparellen un per part: el primer import va amb la primera descripció, i així successivament:

1Record a card payment that mixes business and personal items.
aeat --format json app ledger add --date 2026-03-15 --amount 121.00 --direction OUTGOING \
  --description Mixed receipt --idempotency-key correct-split
aeat --format json app ledger add --date 2026-03-15 --amount 121.00 --direction OUTGOING `
  --description Mixed receipt --idempotency-key correct-split
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "9f5e7d2af0b80902321e3b1202a64f33db90510f94d37b6ac8a1faae0c89d25c"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "121",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Mixed receipt",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9"
  },
  "schema_version": "2",
  "status": "success"
}
2Split the payment into two parts.
aeat --format json app ledger split {transaction_id} --child-amount 100.00 \
  --child-description office supplies --child-amount 21.00 --child-description \
  personal items --reason mixed receipt --yes
aeat --format json app ledger split {transaction_id} --child-amount 100.00 `
  --child-description office supplies --child-amount 21.00 --child-description `
  personal items --reason mixed receipt --yes
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.split",
  "notices": [],
  "result": {
    "bucket_event_id": "2960d40c4f90dbaa25b1c462ce52210f4b2cc4ab1904c6c78c08739e821fbf1b",
    "bucket_id": "<bucket-id>",
    "child_transaction_ids": [
      "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49",
      "0bba86e710bdb3ccf97cd1cf82d62a5011a7107989ee76648f8ef8932c28ba0e"
    ],
    "child_transactions": [
      {
        "display_id": "9cc7a263",
        "full_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49"
      },
      {
        "display_id": "0bba86e7",
        "full_id": "0bba86e710bdb3ccf97cd1cf82d62a5011a7107989ee76648f8ef8932c28ba0e"
      }
    ],
    "classified_child_count": null,
    "llm": null,
    "parent_amount": null,
    "parent_transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9",
    "persisted": null,
    "proposed_children": null,
    "provenance": null,
    "provider": null,
    "reason": null,
    "split_group_id": "49e46bf12630b536b609999a5502582c94bc0faefcbba41cf784f89552823662"
  },
  "schema_version": "2",
  "status": "success"
}
3Confirm the first part is an active transaction of its own.
aeat --format json app ledger view {first_part}
aeat --format json app ledger view {first_part}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "100",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "office supplies",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the split produced two active child parts.

El moviment original esdevé el pare de la divisió, i les parts en porten el saldo a partir d’aleshores. La sortida de la divisió imprimeix una fila child_transactions per part, cadascuna amb un display_id curt i un full_id complet. Copia aquests ids: l’ordre de fusió els necessita per desfer la divisió.

Torna a fusionar les parts d’una divisió

Per desfer una divisió, torna a fusionar les parts utilitzant els ids fills que la divisió va imprimir. Anomena cada part germana: l’ordre rebutja una fusió parcial. La seqüència divideix un pagament i, tot seguit, fusiona les parts en un moviment nou:

1Merge the two parts back into one transaction, naming every sibling.
aeat --format json app ledger merge --child-id {first_child} --child-id {second_child} \
  --reason undo split --yes
aeat --format json app ledger merge --child-id {first_child} --child-id {second_child} `
  --reason undo split --yes
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.merge",
  "notices": [],
  "result": {
    "bucket_event_id": "24fa3aac51e5315bbb008dcbc57b80fdc41b292a4d2e504303e54e6c21354591",
    "bucket_id": "<bucket-id>",
    "merged_transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9",
    "parent_transaction_id": "3cda9f1229ee04269a70bb6705dafeff1de2f9b14f1bfcefacba4ae277b20a9d",
    "source_child_ids": [
      "63c3f9245937ab54232f067804fc12248abcbb1a5f9d93e9433313f8bf74b23d",
      "e0504b924f0b4500f0be1c70fe2958279ff9d9d0e5f61c4c66615fe9ed65ae84"
    ],
    "split_group_id": "ea58900b8c1962062494a7fb1c80418936a96ae53f2e402af33f8b212fb055c0"
  },
  "schema_version": "2",
  "status": "success"
}
2Confirm the merged transaction is active and carries the full amount.
aeat --format json app ledger view {merged}
aeat --format json app ledger view {merged}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "121",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Split to undo",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the merge produced a single active transaction carrying the full amount.

Les parts i el pare original passen a l’historial, i la fusió crea un moviment nou al seu lloc. Si ja no tens la sortida de la divisió, les parts són files actives: executa aeat app ledger list i llegeix-ne els ids del llistat.

Posa de banda un moviment del qual dubta

Posar de banda deixa un moviment a part per a més endavant. Un moviment posat de banda es manté fora del treball ordinari. La seqüència posa de banda una fila i confirma el seu nou estat del cicle de vida:

1Record a transaction you are not ready to resolve.
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
  --description Awaiting invoice --idempotency-key correct-stash
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING `
  --description Awaiting invoice --idempotency-key correct-stash
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "78ad404abaedb72ff65685f682bb8eeb58032ac35d5553aabd48810cc6cbea06"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "80",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Awaiting invoice",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22"
  },
  "schema_version": "2",
  "status": "success"
}
2Set it aside for later.
aeat app ledger stash {transaction_id} --reason waiting for invoice --yes
aeat app ledger stash {transaction_id} --reason waiting for invoice --yes
ID	f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22
Date	2026-03-15
Amount	80
Description	Awaiting invoice
Review status	pending
3Confirm the lifecycle state now reads STASHED.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "80",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Awaiting invoice",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "STASHED",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the transaction moved to the stashed state.

Utilitza posar de banda per a una fila que encara no has resolt i arxivar per a una fila que has deixat a part deliberadament, com ara un duplicat confirmat. Totes dues són reversibles: restaurar torna la fila a actiu. L’ordre stash imprimeix els camps del moviment però no el seu nou estat del cicle de vida, de manera que view és com confirma que el canvi ha tingut efecte.

Arxiva un moviment

Arxivar manté un moviment a l’historial però fora del treball ordinari: és l’opció adequada per a duplicats dels quals vols conservar un rastre deliberat. La seqüència arxiva una fila duplicada i confirma el canvi d’estat:

1Record a duplicate row you want to keep a trace of.
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
  --description Duplicate import --idempotency-key correct-archive
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING `
  --description Duplicate import --idempotency-key correct-archive
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.add",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "23efbc39a82a4a3977431bce885841629c5b7721e681921b8b70c0b9d90586f1"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "80",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Duplicate import",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0"
  },
  "schema_version": "2",
  "status": "success"
}
2Archive it out of ordinary work.
aeat app ledger archive {transaction_id} --reason duplicate imported row --yes
aeat app ledger archive {transaction_id} --reason duplicate imported row --yes
ID	a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0
Date	2026-03-15
Amount	80
Description	Duplicate import
Review status	pending
3Confirm the lifecycle state now reads ARCHIVED.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "80",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Duplicate import",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ARCHIVED",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the duplicate moved to the archived state.

Com posar de banda, l’ordre imprimeix els camps del moviment però no el seu nou estat del cicle de vida, de manera que view confirma que la fila ara diu ARCHIVED.

Restaura un moviment posat de banda o arxivat

Si has posat de banda o arxivat un moviment per error, restaura’l a actiu. Restaurar és la inversa de posar de banda i arxivar: la fila torna a les teves llistes i totals quotidians. La seqüència posa de banda una fila i després la restaura:

1Return it to your everyday lists and totals.
aeat app ledger restore {transaction_id} --reason stashed by mistake --yes
aeat app ledger restore {transaction_id} --reason stashed by mistake --yes
ID	d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332
Date	2026-03-15
Amount	80
Description	Stashed by mistake
Review status	pending
2Confirm the lifecycle state is ACTIVE again.
aeat --format json app ledger view {transaction_id}
aeat --format json app ledger view {transaction_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.view",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "review_status": "pending",
    "transaction": {
      "amount": "80",
      "attachment_ids": [],
      "booked_date": "2026-03-15",
      "business_classification": "NOT_YET_PROCESSED",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": null,
      "classification_reason": "",
      "classified_at": null,
      "classified_by": "auto",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-03-15",
      "description": "Stashed by mistake",
      "direction": "OUTGOING",
      "fx_rate": null,
      "invoice_id": null,
      "irpf_category": null,
      "iva_amount": null,
      "iva_category": null,
      "iva_rate": null,
      "lifecycle_state": "ACTIVE",
      "m210_income_classification": null,
      "modified_at": "2026-04-01T09:00:00+00:00",
      "notes": "",
      "prorrata_reference": null,
      "purchase_invoice_evidence_id": null,
      "source_jurisdiction": "ES",
      "taxable_base": null,
      "transaction_id": "d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332",
      "usage_ratio_id": null,
      "value_date": null,
      "value_in_eur": null
    },
    "transaction_id": "d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the restored transaction is active again.

Restaurar accepta el mateix prefix d’id que accepten les altres ordres. Per recuperar diverses files posades de banda per error, restaura cadascuna per id: no cal que restableixis tot el ledger. list no té cap filtre de només posades de banda, de manera que identifiques les files posades de banda a partir dels ids que has posat de banda, o de l’estat del cicle de vida de cada fila que mostra view.

Restaurar rebutja una fila que ja és activa, i rebutja una fila el període de la qual ja has presentat: restaurar-la canviaria les dades d’entrada darrere d’una declaració que has presentat. Restaura’n una d’aquestes només després d’haver corregit la presentació mitjançant una rectificació.

Revisa què ha canviat

Cada correcció queda registrada. Per veure cada acció sobre un moviment en ordre, executa ledger history. La seqüència divideix un pagament i, tot seguit, llegeix l’historial amb l’indicador de germans per seguir tota la família de la divisió:

1List every action on the transaction in order.
aeat app ledger history {transaction_id}
aeat app ledger history {transaction_id}
Bucket	<profile-id>
ID	1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570
Event count	2
2026-04-01T09:00:00+00:00	ledger.transaction.split	0dd721341b0758df0aa4baaab3e24ad7dd79c3a2f90f5f2fc17856dfe491a21f
2026-04-01T09:00:00+00:00	ledger.transaction.created	808c7c37fdc6678905928147c14d45cb7e28450f8c87c917c27a3b61f6406388
2Follow the whole split family with the sibling flag.
aeat --format json app ledger history {transaction_id} --include-split-siblings
aeat --format json app ledger history {transaction_id} --include-split-siblings
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.history",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "event_count": 2,
    "events": [
      {
        "actor": "<profile-id>",
        "bucket_id": "<bucket-id>",
        "event_id": "0dd721341b0758df0aa4baaab3e24ad7dd79c3a2f90f5f2fc17856dfe491a21f",
        "event_type": "ledger.transaction.split",
        "object_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570",
        "object_type": "ledger_transaction",
        "occurred_at": "2026-04-01T09:00:00Z",
        "payload": {
          "child_count": "2",
          "parent_transaction_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570",
          "reason": "mixed receipt",
          "source_command": "aeat app ledger split",
          "split_group_id": "4d2d96d6579ac45716e2561a4bc5e7c73876e0a76843db90f5045ebc6dc7a026"
        },
        "payload_version": 1
      },
      {
        "actor": "<profile-id>",
        "bucket_id": "<bucket-id>",
        "event_id": "808c7c37fdc6678905928147c14d45cb7e28450f8c87c917c27a3b61f6406388",
        "event_type": "ledger.transaction.created",
        "object_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570",
        "object_type": "ledger_transaction",
        "occurred_at": "2026-04-01T09:00:00Z",
        "payload": {
          "amount": "121.00",
          "currency": "EUR",
          "direction": "OUTGOING",
          "source_command": "aeat app ledger add"
        },
        "payload_version": 1
      }
    ],
    "transaction_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the history records the transaction's events in order.

L’historial llista cada acció en ordre amb la seva marca de temps i la referència de l’esdeveniment. Detalls com ara la raó i els nous valors són a la sortida JSON. Per veure un valor abans d’un canvi, llegeix els esdeveniments anteriors de l’historial. La referència de la CLI tracta cada camp que mostra l’historial.

Evidència i correccions

Un registre d’evidència adjunt (un rebut o una factura) no s’elimina quan corregeixes un moviment. Després d’una divisió o una fusió, comprova els nous moviments i torna a adjuntar l’evidència on calgui. La guia d’evidència tracta com adjuntar i comprovar l’evidència.

Comença de nou com a últim recurs

Si el ledger no té reparació (per exemple, després d’importar els fitxers incorrectes repetidament), buida’l i reconstrueix-lo. Previsualitza primer i després confirma. La seqüència registra una fila, previsualitza el restabliment, buida el ledger i confirma que no queda res:

1Preview the reset without clearing anything.
aeat app ledger reset --reason re-importing all statements --dry-run
aeat app ledger reset --reason re-importing all statements --dry-run
Bucket	<profile-id>
Rows	1
Reset	False
DRY RUN MODE	True
2Clear the whole ledger for the active profile.
aeat app ledger reset --reason re-importing all statements --yes
aeat app ledger reset --reason re-importing all statements --yes
Bucket	<profile-id>
Rows	1
Reset	True
DRY RUN MODE	False
3Confirm no transactions remain.
aeat --format json app ledger list
aeat --format json app ledger list
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.list",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "limit": null,
    "offset": 0,
    "rows": [],
    "shown": 0,
    "total": 0,
    "truncated": false
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the reset cleared the active ledger.

El restabliment buida tot el ledger del perfil actiu. Utilitza la guia de moviments per reconstruir-lo a partir dels teus extractes.

On obtenir ajuda

Si una ordre es nega o falla, consultes la guia de resolució de problemes. Els termes desconeguts s’expliquen al glossari. Abans de compartir la sortida d’una ordre amb ningú, elimina els identificadors fiscals com ara el teu NIF, CIF, DNI, NIE o NII.

Passos següents