from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field, model_validator class FacetofaceApplySchema(BaseModel): """当面付代开通申请请求""" enterprise_id: str = Field(description="关联企业ID") account: str = Field(description="商户支付宝账号或pid(2088开头)") contact_name: str = Field(description="联系人名称") contact_mobile: str = Field(description="联系人手机号") contact_email: Optional[str] = Field(default=None, description="联系人邮箱") order_ticket: Optional[str] = Field(default=None, description="订单授权凭证(预授权模式)") sign_and_auth: bool = Field(default=False, description="是否签约且授权") rate: Optional[str] = Field(default=None, description="费率(sign_and_auth=true时必填)") remark: Optional[str] = Field(default=None, description="备注") @model_validator(mode="after") def validate_rate(self): if self.sign_and_auth and not self.rate: raise ValueError("签约且授权时费率不能为空") return self class FacetofaceOrderOutSchema(BaseModel): """当面付申请单详情响应""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") enterprise_id: Optional[str] = Field(default=None, description="关联企业ID") batch_no: Optional[str] = Field(default=None, description="事务编号") order_no: Optional[str] = Field(default=None, description="签约单号") order_status: str = Field(description="申请单状态") account: Optional[str] = Field(default=None, description="商户支付宝账号/pid") contact_name: Optional[str] = Field(default=None, description="联系人名称") contact_mobile: Optional[str] = Field(default=None, description="联系人手机号") contact_email: Optional[str] = Field(default=None, description="联系人邮箱") order_ticket: Optional[str] = Field(default=None, description="订单授权凭证") rate: Optional[str] = Field(default=None, description="费率") sign_and_auth: bool = Field(default=False, description="是否签约且授权") merchant_pid: Optional[str] = Field(default=None, description="商户pid") confirm_url: Optional[str] = Field(default=None, description="商家确认链接") app_auth_token: Optional[str] = Field(default=None, description="应用授权令牌") app_refresh_token: Optional[str] = Field(default=None, description="刷新令牌") auth_app_id: Optional[str] = Field(default=None, description="授权商户appId") user_id: Optional[str] = Field(default=None, description="授权商户userId") open_id: Optional[str] = Field(default=None, description="授权商户openId") expires_in: Optional[str] = Field(default=None, description="授权令牌过期秒数") re_expires_in: Optional[str] = Field(default=None, description="刷新令牌过期秒数") reject_reason: Optional[str] = Field(default=None, description="驳回原因") remark: Optional[str] = Field(default=None, description="备注") last_query_time: Optional[datetime] = Field(default=None, description="最后查询时间") next_query_time: Optional[datetime] = Field(default=None, description="下次查询时间") query_count: int = Field(default=0, description="已查询次数") created_time: datetime = Field(description="创建时间") updated_time: datetime = Field(description="更新时间") class FacetofaceOrderListOutSchema(BaseModel): """当面付申请单列表响应""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") enterprise_id: Optional[str] = Field(default=None, description="关联企业ID") batch_no: Optional[str] = Field(default=None, description="事务编号") order_status: str = Field(description="申请单状态") account: Optional[str] = Field(default=None, description="商户支付宝账号") contact_name: Optional[str] = Field(default=None, description="联系人") sign_and_auth: bool = Field(default=False, description="是否授权") confirm_url: Optional[str] = Field(default=None, description="商家确认链接") reject_reason: Optional[str] = Field(default=None, description="驳回原因") created_time: datetime = Field(description="创建时间") updated_time: datetime = Field(description="更新时间")