From 75fa533f4c36a78c926d60afa597ec1f035a671e Mon Sep 17 00:00:00 2001 From: Hersonls Date: Fri, 14 Feb 2025 15:43:20 -0300 Subject: [PATCH] Add order payload data model --- barte/client.py | 10 ++++-- barte/models.py | 95 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/barte/client.py b/barte/client.py index 2fa862d..ac38572 100644 --- a/barte/client.py +++ b/barte/client.py @@ -1,4 +1,5 @@ -from typing import Dict, Any, Optional +from typing import Dict, Any, Optional, Union +from dataclasses import asdict import requests from dacite import from_dict from .models import ( @@ -11,6 +12,7 @@ BuyerList, Order, ChargeList, + OrderPayload, ) @@ -51,9 +53,13 @@ def get_instance(cls) -> "BarteClient": ) return cls._instance - def create_order(self, data: Dict[str, Any]) -> Order: + def create_order(self, data: Union[Dict[str, Any], OrderPayload]) -> Order: """Create a new order""" endpoint = f"{self.base_url}/v2/orders" + + if isinstance(data, OrderPayload): + data = asdict(data) + response = requests.post(endpoint, headers=self.headers, json=data) response.raise_for_status() return from_dict(data_class=Order, data=response.json(), config=DACITE_CONFIG) diff --git a/barte/models.py b/barte/models.py index b8ddda2..57a3093 100644 --- a/barte/models.py +++ b/barte/models.py @@ -1,6 +1,6 @@ from dataclasses import dataclass from datetime import datetime -from typing import Optional, List +from typing import Optional, List, Literal from dacite import Config from dateutil.parser import parse as parse_date @@ -199,3 +199,96 @@ class BuyerList(BaseListReponse): @dataclass class ChargeList(BaseListReponse): content: List[Charge] + + +@dataclass +class Card: + holderName: str + number: str + expiration: str + cvv: str + + +@dataclass +class InternationalDocument: + documentNumber: str + documentType: str + documentNation: str + + +@dataclass +class BillingAddress: + country: str + state: str + city: str + district: str + street: str + zipCode: str + number: Optional[str] + complement: Optional[str] + + +@dataclass +class FraudData: + name: str + email: str + phone: str + billingAddress: BillingAddress + internationalDocument: Optional[InternationalDocument] + document: Optional[str] + + +@dataclass +class Payment: + method: Literal[ + "PIX", + "BANK_SLIP", + "CREDIT_CARD", + "CREDIT_CARD_EARLY_BUYER", + "CREDIT_CARD_EARLY_SELLER", + "DEBIT_CARD", + "CREDIT_CARD_EARLY_MIXED", + "GOOGLE_PAY", + "APPLE_PAY", + "INVALID", + ] + brand: Optional[str] + cardToken: Optional[str] + capture: Optional[bool] + integrationOrderId: Optional[str] + card: Optional[Card] + fraudData: Optional[FraudData] + + +@dataclass +class SubSellerPayment: + idSubSeller: int + amount: int + paymentValue: int + paymentType: str + + +@dataclass +class SubSellerPaymentRequest: + subSellerPayment: List[SubSellerPayment] + + +@dataclass +class Metadata: + key: str + value: str + + +@dataclass +class OrderPayload: + title: str + uuidBuyer: str + startDate: str + value: int + installments: int + payment: Payment + attemptReference: Optional[str] + urlCallBack: Optional[str] + description: Optional[str] + subSellerPaymentRequest: Optional[SubSellerPaymentRequest] + metadata: Optional[List[Metadata]]