This commit is contained in:
oib
2026-01-26 19:58:21 +01:00
parent 329b3beeba
commit 5c99c92ffb
54 changed files with 6790 additions and 654 deletions

View File

@@ -4,8 +4,8 @@ from datetime import datetime
from typing import Optional
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel
from sqlalchemy import Column, JSON, String
from sqlmodel import Field, SQLModel, Relationship
from ..types import JobState
@@ -28,3 +28,10 @@ class Job(SQLModel, table=True):
receipt: Optional[dict] = Field(default=None, sa_column=Column(JSON, nullable=True))
receipt_id: Optional[str] = Field(default=None, index=True)
error: Optional[str] = None
# Payment tracking
payment_id: Optional[str] = Field(default=None, foreign_key="job_payments.id", index=True)
payment_status: Optional[str] = Field(default=None, max_length=20) # pending, escrowed, released, refunded
# Relationships
payment: Optional["JobPayment"] = Relationship(back_populates="jobs")

View File

@@ -0,0 +1,74 @@
"""Payment domain model"""
from __future__ import annotations
from datetime import datetime
from typing import Optional, List
from uuid import uuid4
from sqlalchemy import Column, String, DateTime, Numeric, ForeignKey
from sqlmodel import Field, SQLModel, Relationship
from ..schemas.payments import PaymentStatus, PaymentMethod
class JobPayment(SQLModel, table=True):
"""Payment record for a job"""
__tablename__ = "job_payments"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
job_id: str = Field(index=True)
# Payment details
amount: float = Field(sa_column=Column(Numeric(20, 8), nullable=False))
currency: str = Field(default="AITBC", max_length=10)
status: PaymentStatus = Field(default=PaymentStatus.PENDING)
payment_method: PaymentMethod = Field(default=PaymentMethod.AITBC_TOKEN)
# Addresses
escrow_address: Optional[str] = Field(default=None, max_length=100)
refund_address: Optional[str] = Field(default=None, max_length=100)
# Transaction hashes
transaction_hash: Optional[str] = Field(default=None, max_length=100)
refund_transaction_hash: Optional[str] = Field(default=None, max_length=100)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
escrowed_at: Optional[datetime] = None
released_at: Optional[datetime] = None
refunded_at: Optional[datetime] = None
expires_at: Optional[datetime] = None
# Additional metadata
metadata: Optional[dict] = Field(default=None)
# Relationships
jobs: List["Job"] = Relationship(back_populates="payment")
class PaymentEscrow(SQLModel, table=True):
"""Escrow record for holding payments"""
__tablename__ = "payment_escrows"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
payment_id: str = Field(index=True)
# Escrow details
amount: float = Field(sa_column=Column(Numeric(20, 8), nullable=False))
currency: str = Field(default="AITBC", max_length=10)
address: str = Field(max_length=100)
# Status
is_active: bool = Field(default=True)
is_released: bool = Field(default=False)
is_refunded: bool = Field(default=False)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
released_at: Optional[datetime] = None
refunded_at: Optional[datetime] = None
expires_at: Optional[datetime] = None