Enzo Yair

feature/#51_quiero_visualizar_monto_a_pagar

... ... @@ -8,9 +8,9 @@ from core.serializers import ActionSerializer
from rest_framework.response import Response
from .filters import EdictoFilter, PrecioFilter
from .models import Edicto, Precio
from .models import Edicto, Precio, ComprobantePago
from .permissions import IsAdminOrAuthorized
from .serializers import EdictoSerializer, PrecioSerializer
from .serializers import EdictoSerializer, PrecioSerializer, ComprobanteSerializer
class EdictoViewSet(AuditoriaMixin, mixins.CreateModelMixin,
... ... @@ -52,3 +52,16 @@ class PrecioViewSet(AuditoriaMixin, viewsets.ReadOnlyModelViewSet):
ordering_fields = ('usuario',)
ordering = 'usuario'
queryset = Precio.objects.all()
class ComprobanteViewSet(mixins.UpdateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet,
):
serializer_class = ComprobanteSerializer
permission_classes = [IsAuthenticated, ]
queryset = ComprobantePago.objects.all()
... ...
# Generated by Django 4.1.9 on 2023-10-02 10:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('edicto', '0002_remove_comprobantepago_monto_and_more'),
]
operations = [
migrations.AlterField(
model_name='comprobantepago',
name='edicto',
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, to='edicto.edicto'),
),
]
... ...
... ... @@ -65,8 +65,8 @@ class ComprobantePago(models.Model):
monto_descuento = models.FloatField(editable=False, null=True)
numero_comprobante = models.CharField(max_length=300, blank=True, null=True)
fecha_pago = models.DateTimeField(blank=True, null=True)
edicto = models.OneToOneField(Edicto, on_delete=models.CASCADE)
edicto = models.OneToOneField(Edicto, on_delete=models.CASCADE, editable=False)
archivo = models.FileField(upload_to="uploads/%Y/%m/%d/", blank=True)
def __str__(self):
return self.numero_comprobante
return f"{self.numero_comprobante} - ComprobantePago"
... ...
from django.utils import timezone
from .models import Edicto, ComprobantePago, Precio
def contador(edicto_id, precio_id):
edicto = Edicto.objects.select_related('usuario').get(id=edicto_id)
organismo = edicto.usuario.organismo.es_publico
sellos = edicto.cantidad_sellos
palabras = edicto.cantidad_palabras
copias = edicto.cantidad_copias
publicar = edicto.dias_publicar
precio_valores = Precio.objects.values('precio',
'precio_ejemplar',
'vigencia_desde',
'vigencia_hasta',).get(id=precio_id)
precio = precio_valores['precio']
precio_ejemplar = precio_valores['precio_ejemplar']
vigencia_desde = precio_valores['vigencia_desde']
vigencia_hasta = precio_valores['vigencia_hasta']
current_datetime = timezone.now()
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
result_ejemplar = (copias * precio_ejemplar) + (publicar * precio_ejemplar)
if organismo:
resultado = result_ejemplar + result_palabra / 2
else:
resultado = result_ejemplar + result_palabra
precio_resultado = ComprobantePago(edicto=edicto, resultado=resultado)
precio_resultado.save()
return precio_resultado
from .models import ComprobantePago
def calculadora(edicto, precio):
try:
descuento = 50
organismo = edicto.creado_por.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': precio.precio,
'precio_ejemplar': precio.precio_ejemplar,
'precio_dia': precio.precio_dia
}
result_palabra = (sellos + palabras) * precio_valores['precio']
result_ejemplar = (copias * precio_valores['precio_ejemplar']) + (publicar * precio_valores['precio_dia'])
subtotal = result_ejemplar + result_palabra
if es_publico:
resultado = (descuento * subtotal) / 100
else:
resultado = ((100 - descuento) * subtotal) / 100
comprobante = ComprobantePago(monto_total=resultado,
monto_subtotal=subtotal,
monto_descuento=resultado,
edicto=edicto)
comprobante.save()
return comprobante
except ValueError as values:
raise ValueError("Los valores proporcionados son incorrectos: " + str(values))
\ No newline at end of file
... ...
... ... @@ -2,8 +2,9 @@ from rest_framework import serializers
from usuario.serializers import UsuarioListaSerializer
from .constants import EXTENSIONES_VALIDAS
from .models import Edicto, Precio
from .models import Edicto, Precio, ComprobantePago
from .utils import contador
from .precio import calculadora
class EdictoSerializer(serializers.ModelSerializer):
... ... @@ -28,7 +29,8 @@ class EdictoSerializer(serializers.ModelSerializer):
'fecha_creacion',
'observaciones',
'fecha_publicacion',
'fecha_modificacion'
'fecha_modificacion',
'tiene_descuento',
)
read_only_fields = ('fecha_publicacion',)
... ... @@ -40,9 +42,24 @@ class EdictoSerializer(serializers.ModelSerializer):
if request.method == 'POST':
data['creado_por'] = request.user
if data['creado_por'].organismo and data['creado_por'].organismo.es_publico:
data['tiene_descuento'] = True
else:
data['tiene_descuento'] = False
data['modificado_por'] = request.user
return data
def create(self, validated_data):
edicto = Edicto.objects.create(**validated_data)
precio = Precio.objects.latest('id')
calculadora(edicto, precio)
edicto.save()
return edicto
@staticmethod
def validate_archivo(value):
filename, extension = value.name.rsplit(".", 1)
... ... @@ -63,4 +80,28 @@ class PrecioSerializer(serializers.ModelSerializer):
'vigencia_hasta',
)
included_serializers = {'usuario': UsuarioListaSerializer}
included_serializers = {'usuario': UsuarioListaSerializer
}
class ComprobanteSerializer(serializers.ModelSerializer):
class Meta:
model = ComprobantePago
fields = (
'edicto',
'monto_subtotal',
'monto_total',
'monto_descuento',
'numero_comprobante',
'fecha_pago',
'archivo',
)
included_serializers = {'edicto': EdictoSerializer}
@staticmethod
def validate_archivo(value):
filename, extension = value.name.rsplit(".", 1)
if extension.lower() not in EXTENSIONES_VALIDAS:
raise serializers.ValidationError("Archivos permitidos: .pdf")
return value
... ...
... ... @@ -14,3 +14,4 @@ router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet)
router.register(r'edicto', EdictoViewSet, basename='edicto')
router.register(prefix='precio', viewset=edicto_api.PrecioViewSet)
router.register(prefix='auditoria', viewset=core_api.AuditoriaViewSet)
router.register(prefix='comprobante', viewset= edicto_api.ComprobanteViewSet)
... ...