Martín Miranda

Merge branch 'feature/#51_quiero_visualizar_monto_a_pagar' into 'develop'

feature/#51_quiero_visualizar_monto_a_pagar



See merge request !65
... ... @@ -4,7 +4,7 @@ from .models import Edicto, Precio
# Register your models here.
admin.site.register(Precio)
admin.site.register(Precio)
admin.site.register(Edicto)
... ...
... ... @@ -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,18 @@ 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()
ordering_fields = ('edicto',)
ordering = 'id'
... ...
# 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'),
),
]
... ...
# Generated by Django 4.1.9 on 2023-10-03 11:23
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('edicto', '0003_alter_comprobantepago_edicto'),
]
operations = [
migrations.AlterField(
model_name='precio',
name='usuario',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
... ...
... ... @@ -13,7 +13,7 @@ class Precio(models.Model):
precio = models.FloatField(max_length=50, blank=False, null=False)
vigencia_desde = models.DateField()
vigencia_hasta = models.DateField(blank=True, null=True)
usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE)
usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE, editable=False)
moneda = models.CharField(max_length=50, blank=False, null=False, choices=MONEDA,
default='peso_argentino')
precio_ejemplar = models.FloatField(max_length=50, blank=False, null=False)
... ... @@ -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
from .models import ComprobantePago
def contador(edicto_id, precio_id):
edicto = Edicto.objects.select_related('usuario').get(id=edicto_id)
organismo = edicto.usuario.organismo.es_publico
def calculadora(edicto, precio):
try:
descuento = edicto.tiene_descuento
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 descuento:
resultado = (50 * subtotal) / 100
else:
resultado = ((100 - 50) * subtotal) / 100
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)
comprobante = ComprobantePago(monto_total=resultado,
monto_subtotal=subtotal,
monto_descuento=resultado,
edicto=edicto)
comprobante.save()
if organismo:
resultado = result_ejemplar + result_palabra / 2
else:
resultado = result_ejemplar + result_palabra
return comprobante
precio_resultado = ComprobantePago(edicto=edicto, resultado=resultado)
precio_resultado.save()
return precio_resultado
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)
... ... @@ -61,6 +78,31 @@ class PrecioSerializer(serializers.ModelSerializer):
'precio_ejemplar',
'vigencia_desde',
'vigencia_hasta',
'precio_dia',
)
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 = {'usuario': UsuarioListaSerializer}
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
... ...
from django.test import TestCase
from edicto.utils import contador
from edicto.models import Edicto
class ContadorTestCase(TestCase):
... ...
... ... @@ -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)
... ...