110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
from django.shortcuts import render
|
|
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
|
|
from django.template import loader
|
|
|
|
from .models import Sale, Product, ProductCategory, Payment
|
|
from .forms import ImportProductsForm, PurchaseForm, LineaFormSet, ReconciliationJarForm
|
|
|
|
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)
|
|
sale_linea_form = LineaFormSet(request.POST)
|
|
if sale_form.is_valid():
|
|
sale_form.save()
|
|
if sale_linea_form.is_valid():
|
|
sale_linea_form.save()
|
|
return HttpResponseRedirect("productos")
|
|
else:
|
|
sale_form = PurchaseForm()
|
|
sale_linea_form = LineaFormSet()
|
|
return render(
|
|
request,
|
|
'don_confiao/purchase.html',
|
|
{
|
|
'sale_form': sale_form,
|
|
'linea_formset': sale_linea_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):
|
|
if request.method == 'POST':
|
|
return HttpResponseRedirect("cuadres")
|
|
|
|
form = ReconciliationJarForm()
|
|
summary = Payment.get_reconciliation_jar_summary()
|
|
# raise Exception(Payment.get_reconciliation_jar_summary().payments)
|
|
return render(
|
|
request,
|
|
"don_confiao/reconciliate_jar.html",
|
|
{'summary': summary, 'form': form}
|
|
)
|
|
|
|
|
|
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)
|