"""Payment models for ACPortal API."""
from __future__ import annotations
from typing import List, Optional
from pydantic import Field
from ab.api.models.base import RequestModel, ResponseModel
[docs]
class PaymentParams(RequestModel):
"""Query parameters for GET /job/{jobDisplayId}/payment."""
job_sub_key: Optional[str] = Field(None, alias="jobSubKey", description="Job subscription key")
[docs]
class PaymentInfo(ResponseModel):
"""Payment state for a job — GET /job/{jobDisplayId}/payment."""
total_amount: Optional[float] = Field(None, alias="totalAmount", description="Job total")
balance_due: Optional[float] = Field(None, alias="balanceDue", description="Remaining balance")
payment_status: Optional[str] = Field(None, alias="paymentStatus", description="Current status")
payments: Optional[List[dict]] = Field(None, description="Payment history")
[docs]
class PaymentSource(ResponseModel):
"""Stored payment method — GET /job/{jobDisplayId}/payment/sources."""
source_id: Optional[str] = Field(None, alias="sourceId", description="Payment source ID")
type: Optional[str] = Field(None, description="card or bank_account")
last_four: Optional[str] = Field(None, alias="lastFour", description="Last 4 digits")
brand: Optional[str] = Field(None, description="Card brand (Visa, etc.)")
is_default: Optional[bool] = Field(None, alias="isDefault", description="Default source flag")
[docs]
class ACHSessionResponse(ResponseModel):
"""ACH payment session — POST /job/{jobDisplayId}/payment/ACHPaymentSession."""
session_id: Optional[str] = Field(None, alias="sessionId", description="ACH session identifier")
client_secret: Optional[str] = Field(None, alias="clientSecret", description="Stripe client secret")
[docs]
class PayBySourceRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/bysource."""
source_id: Optional[str] = Field(None, alias="sourceId", description="Payment source to charge")
amount: Optional[float] = Field(None, description="Amount (or full balance)")
[docs]
class ACHSessionRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/ACHPaymentSession."""
return_url: Optional[str] = Field(None, alias="returnUrl", description="Redirect after session")
[docs]
class ACHCreditTransferRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/ACHCreditTransfer."""
amount: Optional[float] = Field(None, description="Transfer amount")
[docs]
class AttachBankRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/attachCustomerBank."""
token: Optional[str] = Field(None, description="Bank account token")
[docs]
class VerifyACHRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/verifyJobACHSource."""
amounts: Optional[List[int]] = Field(None, description="Micro-deposit verification amounts")
[docs]
class BankSourceRequest(RequestModel):
"""Body for POST /job/{jobDisplayId}/payment/banksource."""
source_id: Optional[str] = Field(None, alias="sourceId", description="Bank source ID")