Commit 13b936c5 by Javier

Recargas

parent 8878df1f
from enum import Enum
from site import USER_BASE from site import USER_BASE
from fastapi import Body, Depends, FastAPI, HTTPException, Query, Response, Request from fastapi import Body, Depends, FastAPI, HTTPException, Query, Response, Request
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
...@@ -5,6 +6,7 @@ import mbilling.models as models ...@@ -5,6 +6,7 @@ import mbilling.models as models
import mbilling.connector as mbc import mbilling.connector as mbc
import mbilling.exceptions as mbe import mbilling.exceptions as mbe
from mbilling.functions import MagnusCommandError from mbilling.functions import MagnusCommandError
import mbilling.functions as mbf
description = """ description = """
Servicio API para la interacción con el Tarficador de Telefonía ☎️ Servicio API para la interacción con el Tarficador de Telefonía ☎️
...@@ -37,6 +39,18 @@ app = FastAPI( ...@@ -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) @app.exception_handler(MagnusCommandError)
def magnus_error_handler(request: Request, ex: MagnusCommandError): def magnus_error_handler(request: Request, ex: MagnusCommandError):
return JSONResponse( return JSONResponse(
...@@ -140,10 +154,44 @@ def add_account_sip(sip: models.CreateSipAccount, account_name: str = Query(..., ...@@ -140,10 +154,44 @@ def add_account_sip(sip: models.CreateSipAccount, account_name: str = Query(...,
raise HTTPException(status_code=409, detail=str(e)) 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", @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) 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: ...@@ -144,7 +144,7 @@ def get_user(number: str) -> models.User:
select(Sip).where(Sip.id_user == user_account.id) select(Sip).where(Sip.id_user == user_account.id)
).fetchall() ).fetchall()
sip_accounts = [models.SipAccount.generate_from_automap( 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( user = models.User(
username=user_account.username, username=user_account.username,
......
...@@ -56,8 +56,8 @@ class CreateUser(BaseModel): ...@@ -56,8 +56,8 @@ class CreateUser(BaseModel):
default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea' default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea'
) )
address: Rate = Body( address: str = 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.' 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