Files
export-sereia-guardia-fastapi/service/tray_order_service.py
2026-04-13 21:10:37 -03:00

123 lines
5.3 KiB
Python

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from db.helpers import get_engine
from db.models import Order, OrderStatus, OrderProductsSold # , ProductsSold
from service.helper import parse_date, get_paged_data
from constants import api_url
import logging
import requests
from service.auth_service import get_auth_token
from pyrate_limiter import Rate, Limiter, Duration
class TrayOrderService:
access_token = None
limiter = None
logger = logging.getLogger(__name__)
def __init__(self):
self.limiter = Limiter(Rate(100, Duration.SECOND * 60), max_delay=50000)
self.access_token = get_auth_token()
def get_complete_order(self, order_id: int):
url = f"{api_url}/orders/{order_id}/complete?access_token={self.access_token}"
response = requests.get(url)
return self.parse_complete_order(response.json()['Order'])
def save_all_orders(self):
params = {
'access_token': self.access_token
}
json_orders = get_paged_data('orders', 'Orders', self.limiter, max_pages=None, params=params)
self.save_orders(json_orders)
def parse_complete_order(self, json):
order = json.get('Order')
def parse_order(self, json_order):
return Order(
id=int(json_order.get('id')),
status=json_order.get('status'),
date=parse_date(json_order.get('date')),
customer_id=int(json_order.get('customer_id')),
partial_total=float(json_order.get('partial_total')),
taxes=float(json_order.get('taxes')),
discount=float(json_order.get('discount')),
point_sale=json_order.get('point_sale'),
shipment=json_order.get('shipment'),
shipment_value=float(json_order.get('shipment_value')),
shipment_date=parse_date(json_order.get('shipment_date')),
store_note=json_order.get('store_note'),
discount_coupon=json_order.get('discount_coupon'),
payment_method_rate=float(json_order.get('payment_method_rate')),
value_1=float(json_order.get('value_1')),
payment_form=json_order.get('payment_form'),
sending_code=json_order.get('sending_code'),
session_id=json_order.get('session_id'),
total=float(json_order.get('total')),
payment_date=parse_date(json_order.get('payment_date')),
access_code=json_order.get('access_code'),
#progressive_discount=float(json_order.get('progressive_discount')),
#shipping_progressive_discount=float(json_order.get('shipping_progressive_discount')),
shipment_integrator=json_order.get('shipment_integrator'),
modified=datetime.strptime(json_order.get('modified'), '%Y-%m-%d %H:%M:%S'),
printed=bool(json_order.get('printed')),
#interest=float(json_order.get('interest')),
#cart_additional_values_discount=float(json_order.get('cart_additional_values_discount')),
#cart_additional_values_increase=float(json_order.get('cart_additional_values_increase')),
id_quotation=json_order.get('id_quotation'),
estimated_delivery_date=parse_date(json_order.get('estimated_delivery_date')),
external_code=json_order.get('external_code'),
tracking_url=json_order.get('tracking_url'),
has_payment=bool(int(json_order.get('has_payment'))),
has_shipment=bool(int(json_order.get('has_shipment'))),
has_invoice=bool(int(json_order.get('has_invoice'))),
#total_comission_user=float(json_order.get('total_comission_user')),
#total_comission=float(json_order.get('total_comission')),
is_traceable=bool(json_order.get('is_traceable')),
#order_status_id=int(json_order.get('OrderStatus')['id'])
)
def parse_order_status(self, json_order_status):
return OrderStatus(
id=int(json_order_status['id']),
default=bool(int(json_order_status['default'])),
type=json_order_status['type'],
show_backoffice=bool(int(json_order_status['show_backoffice'])),
allow_edit_order=bool(int(json_order_status['allow_edit_order'])),
status=json_order_status['status'],
description=json_order_status['description'],
background=json_order_status['background']
)
def parse_order_products_sold(self, json_order_ps, order_id):
return OrderProductsSold(
order_id=order_id,
products_sold_id=json_order_ps['id']
)
def save_orders(self, orders):
for json_order in orders:
json_order = json_order['Order']
order = self.parse_order(json_order)
if 'OrderStatus' in json_order:
json_order_status = json_order['OrderStatus']
order_status = self.parse_order_status(json_order_status)
self.session.merge(order_status)
if 'ProductsSold' in json_order:
for json_ps in json_order['ProductsSold']:
order_products_sold = self.parse_order_products_sold(json_ps, order.id)
self.session.merge(order_products_sold)
self.session.merge(order)
self.session.commit()