diff --git a/asuzr/admin.py b/asuzr/admin.py index df59dc2..24ab7b9 100644 --- a/asuzr/admin.py +++ b/asuzr/admin.py @@ -7,6 +7,7 @@ from asuzr.models import ProdPlan from asuzr.models import AccessProtocol from asuzr.models import OrderPlan from asuzr.models import Attendance +from asuzr.models import Schedule # Register your models here. #admin.site.register(Product) @@ -19,6 +20,7 @@ admin.site.register(Action) admin.site.register(ProdPlan) admin.site.register(AccessProtocol) admin.site.register(OrderPlan) +admin.site.register(Schedule) class AttendAdmin(admin.ModelAdmin): list_display=('date', 'calls', 'visits') admin.site.register(Attendance, AttendAdmin) \ No newline at end of file diff --git a/asuzr/common.py b/asuzr/common.py new file mode 100644 index 0000000..9dcd28f --- /dev/null +++ b/asuzr/common.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from datetime import date + +class custom_date(date): + + day_names = ("Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье") + day_colors = ("FFFFFF","FFFFFF","FFFFFF","FFFFFF","FFFFFF","#FFE4E1", "#FFE4E1") + + @property + def weekday_name(self): + return self.day_names[self.weekday()] + + @property + def weekday_color(self): + return self.day_colors[self.weekday()] + + @property + def date_dd_mm_yy(self): + return self.strftime("%d/%m/%Y") \ No newline at end of file diff --git a/asuzr/models.py b/asuzr/models.py index fa87d4b..1002069 100644 --- a/asuzr/models.py +++ b/asuzr/models.py @@ -5,12 +5,6 @@ from django.db import models from django.contrib.auth.models import User from datetime import date, timedelta -# Create your models here. -#Соответствие названий и номеров дней недели -class Common: - day_names = ("Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье") - day_colors = ("FFFFFF","FFFFFF","FFFFFF","FFFFFF","FFFFFF","#FFE4E1", "#FFE4E1") - #Изделия class Product(models.Model): name = models.CharField(max_length=150) @@ -19,6 +13,14 @@ class Product(models.Model): def __unicode__(self): return self.name +#График работы +class Schedule(models.Model): + date = models.DateField() + designer = models.ForeignKey(User) + + def __unicode__(self): + return ', '.join((self.date.strftime('%d %b %Y'), self.designer.first_name,)) + #Таблица посещаемости class Attendance(models.Model): date = models.DateField() @@ -33,18 +35,6 @@ class Attendance(models.Model): def date_as_tuple(self): return tuple(self.date_dd_mm_yy().split("/")) - @property - def week_day(self): - day_number = self.date.weekday() - day_name = Common.day_names[day_number] - return day_name - - @property - def day_color(self): - day_number = self.date.weekday() - color = Common.day_colors[day_number] - return color - @property def order_count(self): return Order.objects.filter(date=self.date).count() @@ -55,6 +45,10 @@ class Attendance(models.Model): day_price = sum(o.price for o in orders) return day_price +#Статьи затрат +class CostItem(models.Model): + name = models.CharField(max_length=150) + default_item = models.BooleanField(default=False) #Заказы class Order(models.Model): @@ -68,12 +62,13 @@ class Order(models.Model): lifting = models.BooleanField(default=False) #подъем paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено approved = models.DateTimeField(null=True, blank = True) #согласовано - executor = models.ForeignKey(User, related_name='+') #id исполнителя + executor = models.ForeignKey(User, null = True, blank = True, related_name='+') #id исполнителя is_done = models.BooleanField(default=False) #сдан calls = models.TextField(null=True, blank = True) #обзвон contact = models.CharField(max_length=150, null=True, blank = True) #контактное лицо phone_num = models.CharField(max_length=150,null=True, blank = True) #контактный телефон cancelled = models.BooleanField(default=False) #отменен + cost_items = models.ManyToManyField(CostItem, through='OrderCosts') #статьи затрат def __unicode__(self): return ', '.join((self.date.strftime('%d %b %Y'), self.product.name, self.address)) @@ -130,7 +125,14 @@ class AccessProtocol(models.Model): #План заказов class OrderPlan(models.Model): date = models.DateField() - plan = models.IntegerField() + plan = models.DecimalField(max_digits=12, decimal_places=2) def __unicode__(self): return self.date.strftime('%B %Y') + +# Затраты по заказам +class OrderCosts(models.Model): + order = models.ForeignKey(Order) + cost_item = models.ForeignKey(CostItem) + value = models.DecimalField(max_digits=12, decimal_places=2) + formula = models.CharField(max_length=150) diff --git a/asuzr/views.py b/asuzr/views.py index 5ab78f3..864bfb8 100644 --- a/asuzr/views.py +++ b/asuzr/views.py @@ -5,10 +5,11 @@ from asuzr.models import Product from asuzr.models import Attendance from asuzr.models import Order from asuzr.models import OrderPlan -from datetime import datetime, date +from asuzr.models import Schedule +from datetime import datetime, date, timedelta +import calendar from django.db.models import Count, Sum - -# Create your views here. +from asuzr.common import custom_date def prod_list(request): product_list = Product.objects.all() @@ -37,35 +38,62 @@ def get_orders_by_date(dt): def main(request, day, month, year): + d,m,y=int(day),int(month), int(year) + attend_list = Attendance.objects.all().order_by('date') filtered_attend_list=get_filtered_list(attend_list, year, month) p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y') order_list = Order.objects.filter(date=p_date).order_by('id') + month_order_list=Order.objects.filter(date__range=(date(y,m,1),date(y,m,calendar.monthrange(y,m)[1]))).values('date').annotate(Count('product'),Sum('price')) plan = OrderPlan.objects.all() filtered_plan = get_filtered_list(plan, year, month) + month_plan=0 + if len(filtered_plan) > 0: + month_plan=filtered_plan[0].plan + + schedule = Schedule.objects.all().order_by('date') + filtered_schedule = get_filtered_list(schedule, year, month) + + month_days={i: {'date': custom_date(int(year),int(month),i)} for i in range(1,calendar.monthrange(int(year),int(month))[1]+1)} + + for l in filtered_attend_list: + month_days[l.date.day]['attend']=l + + for s in filtered_schedule: + if 'designers' in month_days[s.date.day]: + des=', '.join((month_days[s.date.day]['designers'], ' '.join((s.designer.first_name, s.designer.last_name)))) + month_days[s.date.day]['designers'] = des + else: + month_days[s.date.day]['designers'] = ' '.join((s.designer.first_name, s.designer.last_name)) + + for order in month_order_list: + month_days[order['date'].day]['orders_count'] = order['product__count'] + month_days[order['date'].day]['orders_price'] = order['price__sum'] + + month_days_values = month_days.values() sum_calls = sum(l.calls for l in filtered_attend_list) sum_visits = sum(l.visits for l in filtered_attend_list) - sum_orders = sum(l.order_count for l in filtered_attend_list) - sum_price = sum(l.orders_price for l in filtered_attend_list) + sum_orders = sum(l['orders_count'] for l in month_days_values if 'orders_count' in l) + sum_price = sum(l['orders_price'] for l in month_days_values if 'orders_price' in l) sum_order_price = sum(l.price for l in order_list) - plan_balance = filtered_plan[0].plan-sum_price + plan_balance = month_plan-sum_price d_date = p_date.strftime("%d/%m/%Y") t = loader.get_template('asuzr/attend_order.html') c = Context({ - 'attend_list': filtered_attend_list, + 'attend_list': month_days_values, 'order_list': order_list, 'sum_calls': sum_calls, 'sum_visits': sum_visits, 'sum_orders': sum_orders, 'sum_price': sum_price, 'sum_order_price': sum_order_price, - 'plan': filtered_plan[0], + 'plan': month_plan, 'balance': plan_balance, 'd_date': d_date, }) @@ -90,7 +118,7 @@ def desreport(request): sdate = datetime.strptime(start_date, '%d.%m.%y') end_date = request.GET.get('edate', date.today().strftime('%d.%m.%y')) edate = datetime.strptime(end_date, '%d.%m.%y') - des_list = Order.objects.filter(cancelled=False, date__range=(sdate,edate)).values('designer__first_name').annotate(Sum('price'),Count('designer')) + des_list = Order.objects.filter(cancelled=False, date__range=(sdate,edate)).values('designer__first_name','designer__last_name').annotate(Sum('price'),Count('designer')) t=loader.get_template('asuzr/desreport.html') c=Context({ 'des_list' : des_list, @@ -99,6 +127,7 @@ def desreport(request): }) return HttpResponse(t.render(c)) + diff --git a/templates/asuzr/attend_order.html b/templates/asuzr/attend_order.html index e9118d0..2490922 100644 --- a/templates/asuzr/attend_order.html +++ b/templates/asuzr/attend_order.html @@ -4,9 +4,9 @@ {% block page %}
| {% include 'asuzr/attendance.html' %} | +{% include 'asuzr/attendance.html' %} | - | {% include 'asuzr/orders_detail.html' %} | +{% include 'asuzr/orders_detail.html' %} |
Список изделий пуст
+Список пуст
{% endif %} diff --git a/templates/asuzr/desreport.html b/templates/asuzr/desreport.html index a6a5962..a2e73ce 100644 --- a/templates/asuzr/desreport.html +++ b/templates/asuzr/desreport.html @@ -13,7 +13,7 @@ {% for des in des_list %}