feat(exports): preserve transfer decisions (#1639)

* feat(exports): preserve transfer decisions

* fix(api): apply transfer date filters to both sides

* fix(api): refine transfer decision handling

* fix(api): align transfer decision schemas

* fix(api): use current context for transfer filters

* fix(api): include either side in transfer date filters

* fix(api): deduplicate transfer decision filters

* fix(api): guard transfer decision exports
This commit is contained in:
ghost
2026-05-08 15:03:57 -06:00
committed by GitHub
parent 81cdccb768
commit 8abecf8a8d
23 changed files with 1817 additions and 4 deletions

View File

@@ -1470,6 +1470,152 @@ components:
"$ref": "#/components/schemas/Transaction"
pagination:
"$ref": "#/components/schemas/Pagination"
TransferTransactionSide:
type: object
required:
- id
- entry_id
- date
- amount
- amount_cents
- currency
- name
- kind
- account
properties:
id:
type: string
format: uuid
entry_id:
type: string
format: uuid
date:
type: string
format: date
amount:
type: string
amount_cents:
type: integer
description: Signed amount in currency minor units
currency:
type: string
name:
type: string
kind:
type: string
account:
type: object
required:
- id
- name
- account_type
properties:
id:
type: string
format: uuid
name:
type: string
account_type:
type: string
nullable: true
TransferDecision:
type: object
required:
- id
- status
- date
- amount
- amount_cents
- currency
- transfer_type
- inflow_transaction
- outflow_transaction
- created_at
- updated_at
properties:
id:
type: string
format: uuid
status:
type: string
enum:
- pending
- confirmed
date:
type: string
format: date
amount:
type: string
amount_cents:
type: integer
description: Absolute transfer amount in currency minor units
currency:
type: string
transfer_type:
type: string
enum:
- transfer
- liability_payment
- loan_payment
notes:
type: string
nullable: true
inflow_transaction:
"$ref": "#/components/schemas/TransferTransactionSide"
outflow_transaction:
"$ref": "#/components/schemas/TransferTransactionSide"
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
TransferDecisionCollection:
type: object
required:
- transfers
- pagination
properties:
transfers:
type: array
items:
"$ref": "#/components/schemas/TransferDecision"
pagination:
"$ref": "#/components/schemas/Pagination"
RejectedTransfer:
type: object
required:
- id
- inflow_transaction
- outflow_transaction
- created_at
- updated_at
properties:
id:
type: string
format: uuid
inflow_transaction:
"$ref": "#/components/schemas/TransferTransactionSide"
outflow_transaction:
"$ref": "#/components/schemas/TransferTransactionSide"
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
RejectedTransferCollection:
type: object
required:
- rejected_transfers
- pagination
properties:
rejected_transfers:
type: array
items:
"$ref": "#/components/schemas/RejectedTransfer"
pagination:
"$ref": "#/components/schemas/Pagination"
Valuation:
type: object
required:
@@ -4919,6 +5065,111 @@ paths:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/rejected_transfers":
get:
summary: List rejected transfers
tags:
- Rejected Transfers
security:
- apiKeyAuth: []
parameters:
- name: page
in: query
required: false
description: 'Page number (default: 1)'
schema:
type: integer
- name: per_page
in: query
required: false
description: 'Items per page (default: 25, max: 100)'
schema:
type: integer
- name: account_id
in: query
required: false
schema:
type: string
format: uuid
description: Filter rejected transfers involving this account
- name: start_date
in: query
required: false
schema:
type: string
format: date
description: Filter rejected transfers from this date
- name: end_date
in: query
required: false
schema:
type: string
format: date
description: Filter rejected transfers until this date
responses:
'200':
description: rejected transfers listed
content:
application/json:
schema:
"$ref": "#/components/schemas/RejectedTransferCollection"
'401':
description: unauthorized
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'403':
description: insufficient scope
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'422':
description: invalid filter
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/rejected_transfers/{id}":
parameters:
- name: id
in: path
required: true
description: Rejected transfer ID
schema:
type: string
get:
summary: Retrieve a rejected transfer
tags:
- Rejected Transfers
security:
- apiKeyAuth: []
responses:
'200':
description: rejected transfer retrieved
content:
application/json:
schema:
"$ref": "#/components/schemas/RejectedTransfer"
'401':
description: unauthorized
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'403':
description: insufficient scope
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'404':
description: rejected transfer not found
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/rule_runs":
get:
summary: List rule runs
@@ -6184,6 +6435,120 @@ paths:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/transfers":
get:
summary: List transfers
tags:
- Transfers
security:
- apiKeyAuth: []
parameters:
- name: page
in: query
required: false
description: 'Page number (default: 1)'
schema:
type: integer
- name: per_page
in: query
required: false
description: 'Items per page (default: 25, max: 100)'
schema:
type: integer
- name: status
in: query
required: false
schema:
type: string
enum:
- pending
- confirmed
description: Filter by transfer status
- name: account_id
in: query
required: false
schema:
type: string
format: uuid
description: Filter transfers involving this account
- name: start_date
in: query
required: false
schema:
type: string
format: date
description: Filter transfers from this date
- name: end_date
in: query
required: false
schema:
type: string
format: date
description: Filter transfers until this date
responses:
'200':
description: transfers listed
content:
application/json:
schema:
"$ref": "#/components/schemas/TransferDecisionCollection"
'401':
description: unauthorized
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'403':
description: insufficient scope
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'422':
description: invalid filter
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/transfers/{id}":
parameters:
- name: id
in: path
required: true
description: Transfer ID
schema:
type: string
get:
summary: Retrieve a transfer
tags:
- Transfers
security:
- apiKeyAuth: []
responses:
'200':
description: transfer retrieved
content:
application/json:
schema:
"$ref": "#/components/schemas/TransferDecision"
'401':
description: unauthorized
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'403':
description: insufficient scope
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
'404':
description: transfer not found
content:
application/json:
schema:
"$ref": "#/components/schemas/ErrorResponse"
"/api/v1/users/reset":
delete:
summary: Reset account