precio.py 1.68 KB
from django.db import transaction
from django.utils import timezone
from datetime import datetime, time


def calculadora(edicto, precio):
    try:
        with transaction.atomic():
            organismo = edicto.usuario.organismo
            es_publico = organismo.es_publico if organismo else False
            sellos = edicto.cantidad_sellos
            palabras = edicto.cantidad_palabras
            copias = edicto.cantidad_copias
            publicar = edicto.dias_publicar
            precio_valores = {
                'precio_palabra': precio.precio,
                'precio_ejemplar': precio.precio_ejemplar,
                'vigencia_desde': precio.vigencia_desde,
                'vigencia_hasta': precio.vigencia_hasta,
            }
            current_datetime = timezone.now().replace(tzinfo=None)
            vigencia_desde = datetime.combine(precio_valores['vigencia_desde'], time.min)
            vigencia_hasta = datetime.combine(precio_valores['vigencia_hasta'], time.max)
            if not (vigencia_desde <= current_datetime <= vigencia_hasta):
                raise ValueError("El precio seleccionado no se encuentra dentro de las fechas permitidas.")

            result_palabra = (sellos + palabras) * precio_valores['precio']
            result_ejemplar = \
                (copias * precio_valores['precio_ejemplar']) + (publicar * precio_valores['precio_ejemplar'])

            if es_publico:
                resultado = result_ejemplar + result_palabra / 2
            else:
                resultado = result_ejemplar + result_palabra

        return resultado
    except ValueError as values:

        raise ValueError("Los valores proporcionados son incorrectos: " + str(values))