test
This commit is contained in:
@@ -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")
|
||||
|
||||
74
apps/coordinator-api/src/app/domain/payment.py
Normal file
74
apps/coordinator-api/src/app/domain/payment.py
Normal 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
|
||||
Reference in New Issue
Block a user