154 lines
4.5 KiB
Python
154 lines
4.5 KiB
Python
from django.shortcuts import render
|
|
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
|
|
from django.views.generic import ListView
|
|
from django.db import transaction
|
|
|
|
from .models import Sale, Product, ProductCategory, Payment
|
|
from .forms import ImportProductsForm, PurchaseForm, SaleLineFormSet, ReconciliationJarForm, PurchaseSummaryForm
|
|
|
|
import csv
|
|
import io
|
|
|
|
|
|
def index(request):
|
|
return render(request, 'don_confiao/index.html')
|
|
|
|
|
|
def buy(request):
|
|
if request.method == "POST":
|
|
sale_form = PurchaseForm(request.POST)
|
|
line_formset = SaleLineFormSet(request.POST)
|
|
sale_summary_form = PurchaseSummaryForm(request.POST)
|
|
forms_are_valid = all([
|
|
sale_form.is_valid(),
|
|
line_formset.is_valid(),
|
|
sale_summary_form.is_valid()
|
|
])
|
|
if forms_are_valid:
|
|
with transaction.atomic():
|
|
sale = sale_form.save()
|
|
line_formset.instance = sale
|
|
line_formset.save()
|
|
return HttpResponseRedirect("compras")
|
|
else:
|
|
sale_form = PurchaseForm()
|
|
line_formset = SaleLineFormSet()
|
|
sale_summary_form = PurchaseSummaryForm()
|
|
return render(
|
|
request,
|
|
'don_confiao/purchase.html',
|
|
{
|
|
'sale_form': sale_form,
|
|
'linea_formset': line_formset,
|
|
'summary_form': sale_summary_form,
|
|
}
|
|
)
|
|
|
|
|
|
def purchases(request):
|
|
purchases = Sale.objects.all()
|
|
context = {
|
|
"purchases": purchases,
|
|
}
|
|
return render(request, 'don_confiao/purchases.html', context)
|
|
|
|
|
|
def products(request):
|
|
rproducts = []
|
|
products = Product.objects.all()
|
|
for product in products:
|
|
rproduct = {
|
|
"name": product.name,
|
|
"price_list": product.price,
|
|
"uom": product.measuring_unit,
|
|
"categories": [c.name for c in product.categories.all()]
|
|
}
|
|
rproducts.append(rproduct)
|
|
|
|
return JsonResponse(rproducts, safe=False)
|
|
|
|
|
|
def import_products(request):
|
|
if request.method == "POST":
|
|
form = ImportProductsForm(request.POST, request.FILES)
|
|
if form.is_valid():
|
|
handle_import_products_file(request.FILES["csv_file"])
|
|
return HttpResponseRedirect("productos")
|
|
else:
|
|
form = ImportProductsForm()
|
|
return render(
|
|
request,
|
|
"don_confiao/import_products.html",
|
|
{'form': form}
|
|
)
|
|
|
|
|
|
def reconciliate_jar(request):
|
|
summary = Payment.get_reconciliation_jar_summary()
|
|
if request.method == 'POST':
|
|
form = ReconciliationJarForm(request.POST)
|
|
if form.is_valid():
|
|
reconciliation = form.save()
|
|
reconciliation.add_payments(summary.payments)
|
|
reconciliation.clean()
|
|
reconciliation.save()
|
|
return HttpResponseRedirect('cuadres')
|
|
else:
|
|
form = ReconciliationJarForm()
|
|
return render(
|
|
request,
|
|
"don_confiao/reconciliate_jar.html",
|
|
{'summary': summary, 'form': form}
|
|
)
|
|
|
|
|
|
def reconciliations(request):
|
|
return HttpResponse('<h1>Reconciliaciones</h1>')
|
|
|
|
def purchase_summary(request, id):
|
|
purchase = Sale.objects.get(pk=id)
|
|
return render(
|
|
request,
|
|
"don_confiao/purchase_summary.html",
|
|
{
|
|
"purchase" : purchase
|
|
}
|
|
)
|
|
|
|
def _categories_from_csv_string(categories_string, separator="&"):
|
|
categories = categories_string.split(separator)
|
|
clean_categories = [c.strip() for c in categories]
|
|
return [_category_from_name(category) for category in clean_categories]
|
|
|
|
|
|
def _category_from_name(name):
|
|
return ProductCategory.objects.get_or_create(name=name)[0]
|
|
|
|
|
|
def handle_import_products_file(csv_file):
|
|
data = io.StringIO(csv_file.read().decode('utf-8'))
|
|
reader = csv.DictReader(data, quotechar='"')
|
|
for row in reader:
|
|
product, created = Product.objects.update_or_create(
|
|
name=row['producto'],
|
|
defaults={
|
|
'price': row['precio'],
|
|
'measuring_unit': row['unidad']
|
|
}
|
|
)
|
|
categories = _categories_from_csv_string(row["categorias"])
|
|
product.categories.clear()
|
|
for category in categories:
|
|
product.categories.add(category)
|
|
|
|
|
|
class ProductListView(ListView):
|
|
model = Product
|
|
template_model = 'don_confiao/product_list.html'
|
|
|
|
def get_queryset(self):
|
|
name = self.request.GET.get('name')
|
|
if name:
|
|
return Product.objects.filter(name__icontains=name)
|
|
return Product.objects.all()
|