Sistema de Inventario en Django - Consulta

594 views
Skip to first unread message

Sebastián Delgado

unread,
Jun 23, 2022, 2:58:04 PM6/23/22
to Django-es
Buenos días.  Le escribo porque hace tiempo que estoy intentando hacer un sitio web en django para un Sistema de inventario donde pueda crear, editar y aliminar Articulos,  y tambien pueda ingresar Compras de Articulos .  o Egresos de Articulos.-

La parte de CRUD de Articulos , ya la tengo armada.  Lo que no se como hacer es Que al realizar Compras o Egresos, me quede el historial de esas Compras y Egresos, pero no se como hacer para que cada vez que hago una compra o Egreso, me modifique la cantidad de Articulos que tengo.

Les paso los modelos, las vistas y forms que tengo creados hasta ahora.  



Models.py

 rom django.db import models

from django import forms

import datetime


class Articulo(models.Model):

nombre = models.CharField(max_length=40, verbose_name='Nombre')

marca = models.CharField(max_length=30)

modelo = models.CharField(max_length=30)

cantidad = models.SmallIntegerField(default=0, verbose_name='Cantidad')

observaciones = models.TextField(max_length=80)

ingreso = models.SmallIntegerField(default=0, verbose_name='Ingreso')

egreso = models.SmallIntegerField(default=0, verbose_name='Egreso')

fecha_modificacion = models.DateTimeField(auto_now=True, verbose_name='Fecha modificacion')

@property

def subtotal(self):

return self.cantidad + self.ingreso

def __str__(self):

return "%s %s %s %s" % (self.nombre, self.marca, self.cantidad, self.ingreso)




class CompraArticulo(models.Model):

fecha_compra = models.DateTimeField(auto_now=True, verbose_name='Fecha compra', null=True)

persona = models.CharField(max_length=40, verbose_name='Persona', null=True)

articulo = models.ForeignKey("Articulo", null=True, blank=True, on_delete=models.CASCADE)


#def __str__(self):

# return "%s %s %s" % (self.articulo, self.persona, self.fecha_compra)



VIEWS.PY

from django.shortcuts import render, redirect

from django.template import RequestContext

from django.http import HttpResponse

from django.views.generic.base import TemplateView

from django.views.generic import CreateView, ListView, DeleteView

from django.views.generic.detail import DetailView

from django.views.generic.edit import UpdateView

from .models import *

from .forms import *

from django.urls import reverse_lazy

from django.core.paginator import Paginator

from django.db.models import Q



# Create your views here.



class ArticuloNuevoView(CreateView):

model = Articulo

form_class = ArticuloForm

template_name = 'Articulo/articulonuevo.html'

success_url = reverse_lazy('listado_articulos')




class ArticuloEdicionView(TemplateView):

template_name = "Articulo/articuloedicion.html"


class ListarArticulo(ListView):

model = Articulo

form_class = ArticuloForm

paginate_by = 10

template_name = 'articulo/listado_articulos.html'



class ComprarArticulo(UpdateView):

model = CompraArticulo

form_class = CompraForm

template_name_suffix = '_update_form'

success_url = reverse_lazy('listado_articulos')


def form_valid(self, form):

response = super().form_valid(form)

form.instance.cantidad += form.instance.ingreso

form.instance.ingreso = 0

form.instance.save()


return response


class ListarCompras(ListView):

model = CompraArticulo

form_class = ArticuloForm

paginate_by = 10

template_name = 'articulo/listado_compras.html'



class EgresoArticulo(UpdateView):

model = Articulo

form_class = EgresoForm

template_name_suffix = '_update_form'

success_url = reverse_lazy('listado_articulos')


def form_valid(self, form):

response = super().form_valid(form)

form.instance.cantidad -= form.instance.ingreso

form.instance.ingreso = 0

form.instance.save()


return response





def modificar(request, id):

articulo = Articulo.objects.get(id=id)

data = { 'form': FormularioSumaResta() }

if request.method == 'POST':

form = FormularioSumaResta(request.POST)

if form.is_valid():

suma = form.cleaned_data["suma"]

#Chequeo que si usuario ingresa numero negativo, sea siempre positivo

if suma < 0:

suma *= -1

articulo.cantidad += int(suma)

articulo.save()

success_url = reverse_lazy('listado_articulos')

else:

form = FormularioSumaResta()


    return render(request, 'articulo/compra_articulo.html', data)




FORMS.PY

from django import forms

from .models import *

from django.db import models


class ArticuloForm(forms.ModelForm):

class Meta:

model = Articulo

fields = [

'nombre',

'marca',

'modelo',

'cantidad',

'observaciones',

'ingreso',

'egreso',

]


class CompraForm(forms.ModelForm):

articulo = forms.CharField(disabled=True)

#marca = forms.CharField(disabled=True)

ingreso = forms.CharField(max_length=80)

persona = forms.CharField(disabled=True)

class Meta:

model = CompraArticulo

fields = ['articulo', 'ingreso', 'persona']



class ListadoCompras(forms.ModelForm):


class Meta:

model = CompraArticulo

fields = ['persona']



class EgresoForm(forms.ModelForm):

nombre = forms.CharField(disabled=True)

marca = forms.CharField(disabled=True)

modelo = forms.CharField(disabled=True)

class Meta:

model = Articulo

fields = ['nombre', 'marca', 'modelo', 'ingreso']





class FormularioSumaResta(forms.ModelForm):

class Meta:

model = Articulo

fields = ['nombre']

suma = forms.IntegerField()

    #resta = forms.IntegerField()






francisco del roioFrancisco Del Roio

unread,
Jun 24, 2022, 12:14:47 AM6/24/22
to djan...@googlegroups.com

Hola,

Dos cosas:

1. El artículo no debería ser requerido?

2. Yo lo haría con dos componentes: Un modelo de compra y uno de venta.

Fijate que django tiene la funcionalidad de agregación de datos (aggregate), de esa forma podés obtener los distintos cálculos cada vez que cargas una compra o una venta en la db y guardar ese dato en el artículo.

Yo haría que la vista de comprar articulo agregue una compra...
--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/7c3765a5-3660-4ad2-a044-39c2607d140bn%40googlegroups.com.

Devilsito

unread,
Jul 10, 2022, 6:19:49 PM7/10/22
to Django-es
Podrías crear un campo en la tabla artículos que guarde el stock, de tal forma que cuando COMPRAS, le sumas al stock y cuando VENDES le restas la stock. Ahora para construir todos los stocks de movimientos históricos podrías hacer una función que al ordenar por fecha y código de producto tanto las COMPRAS y VENTAS vaya obteniendo el stock o saldo, esto, dentro de un buclé. Ojo, previamente deberías tener una fecha de corte y poblar el stock (en tabla PRODUCTOS)  con el stock existente a esa fecha de corte inicial dentro del bucle.
para esto último de sugiero PANDAS y un excel donde aparezca el código de producto y el stock inicial.
PANDAS te facilitara la vida.
Saludos
Reply all
Reply to author
Forward
0 new messages