Commit 13b936c5 by Javier

Recargas

parent 8878df1f
from enum import Enum
from site import USER_BASE
from fastapi import Body, Depends, FastAPI, HTTPException, Query, Response, Request
from fastapi.responses import JSONResponse
......@@ -5,6 +6,7 @@ import mbilling.models as models
import mbilling.connector as mbc
import mbilling.exceptions as mbe
from mbilling.functions import MagnusCommandError
import mbilling.functions as mbf
description = """
Servicio API para la interacción con el Tarficador de Telefonía ☎️
......@@ -37,6 +39,18 @@ app = FastAPI(
)
class Tax(str, Enum):
GENERAL = 'General'
EXENTA = 'Exento'
class Refill(str, Enum):
AUTOMATICA = 'Automatica'
LIQUIDACION = 'Liquidacion'
MANUAL = 'Manual'
TRASPASO = 'Traspaso'
INICIAL = 'Inicial'
@app.exception_handler(MagnusCommandError)
def magnus_error_handler(request: Request, ex: MagnusCommandError):
return JSONResponse(
......@@ -140,10 +154,44 @@ def add_account_sip(sip: models.CreateSipAccount, account_name: str = Query(...,
raise HTTPException(status_code=409, detail=str(e))
@app.get('/v2/account/{account_name}/balance')
def get_account_balance(account_name: str, last_movements: int = 10):
pass
@app.post('/v2/account/{account_name}/balance', name='Añade saldo a una cuenta SIP', description='Realiza una recarga en nombre del cliente.', tags=['Account'])
def add_balance(account_name: str = Query(..., regex=r'[89][1-9]\d{7}', name='Número', description='Cuenta SIP a recargar'),
quantity: float = Query(
default=10.00, name='Cantidad', description='Total a ingresar incluyendo impuestos'),
tax: Tax = Query(default=Tax.GENERAL, name='Impuesto',
description='Tasa impositiva a reducir del monto.'),
description: Refill = Query(default=Refill.AUTOMATICA, name='Tipo', description='Clase de Recarga')):
if quantity >= 0:
try:
# Cálculo de Impuestos
if description != Refill.TRASPASO:
tax_percentage = 0.21 if tax == Tax.GENERAL else 0.0
else:
tax_percentage = 0.0
# Llamada a API Magnus
mbf.add_balance(
account_name, quantity, tax_percentage, description
)
return JSONResponse(
content={
'result': 'OK',
'description': 'Se ha realizado una recarga de {quantity}€ ({quantity_taxed}€ iva exc.) al usuario {account}.'.format(
quantity=quantity,
quantity_taxed=quantity*(1-tax_percentage),
account=account_name
)
}, status_code=201
)
except mbf.MagnusCommandError as e:
raise HTTPException(
status_code=404, detail="La cuenta SIP no ha sido localizada.")
else:
raise HTTPException(
status_code=400, detail="La cantidad debe ser mayor que 0.0€")
@app.get('/v2/account/{account_name}/sip', response_model=list[models.SipAccount], name="Obtener Cuentas SIP",
description="Devuelve todas la cuentas SIP asignadas a la cuenta de Facturación", tags=["Account"], status_code=200)
......
......@@ -144,7 +144,7 @@ def get_user(number: str) -> models.User:
select(Sip).where(Sip.id_user == user_account.id)
).fetchall()
sip_accounts = [models.SipAccount.generate_from_automap(
sip[0], user.username) for sip in user_sip]
sip[0], user_account.username) for sip in user_sip]
user = models.User(
username=user_account.username,
......
......@@ -56,8 +56,8 @@ class CreateUser(BaseModel):
default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea'
)
address: Rate = Body(
..., regex=IP_REGEX, example='192.168.2.71', title='Dirección IP', description='Dirección estática del usuario, sólo si es PBX.'
address: str = Body(
default="dynamic", regex=IP_REGEX, example='192.168.2.71', title='Dirección IP', description='Dirección estática del usuario, sólo si es PBX.'
)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment