From 89834caf1c869135e0937b4a82febb569d12507f Mon Sep 17 00:00:00 2001 From: Anastasia Date: Sun, 31 May 2015 18:20:00 +0500 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C.=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=80=D0=B0=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5.=20=D0=A0=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B2=D1=8B=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0?= =?UTF-8?q?=D1=85=20=D0=BD/=D0=B7=20=D0=BE=D1=82=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D0=B5=D1=89=D0=B0=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D0=B8.=20?= =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=B4=D0=BD=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=BC=D0=B5=D1=81=D1=8F=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asuzr/admin.py | 2 ++ asuzr/common.py | 19 ++++++++++++ asuzr/models.py | 42 +++++++++++++------------- asuzr/views.py | 47 ++++++++++++++++++++++++------ templates/asuzr/attend_order.html | 4 +-- templates/asuzr/attendance.html | 17 ++++++----- templates/asuzr/desreport.html | 2 +- templates/asuzr/orders.html | 2 +- templates/asuzr/orders_detail.html | 2 +- templates/asuzr/plan_balance.html | 2 +- 10 files changed, 97 insertions(+), 42 deletions(-) create mode 100644 asuzr/common.py 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' %}
{% include 'asuzr/plan_balance.html' %} diff --git a/templates/asuzr/attendance.html b/templates/asuzr/attendance.html index 0a58694..bdb9bb8 100644 --- a/templates/asuzr/attendance.html +++ b/templates/asuzr/attendance.html @@ -8,15 +8,17 @@ Посещения Заказы Стоимость + Дизайнеры {% for attend in attend_list %} - - {{ attend.date_dd_mm_yy}} - {{ attend.week_day}} - {{ attend.calls }} - {{ attend.visits }} - {{ attend.order_count}} + + {{ attend.date.date_dd_mm_yy}} + {{ attend.date.weekday_name}} + {{ attend.attend.calls }} + {{ attend.attend.visits }} + {{ attend.orders_count}} {{ attend.orders_price}} + {{ attend.designers}} {% endfor %} @@ -25,9 +27,10 @@ {{sum_visits}} {{sum_orders}} {{sum_price}} + {% else %} -

Список изделий пуст

+

Список пуст

{% 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 %} - {{des.designer__first_name}} + {{des.designer__first_name}} {{des.designer__last_name}} {{des.designer__count}} {{des.price__sum}} diff --git a/templates/asuzr/orders.html b/templates/asuzr/orders.html index 67acb00..645da63 100644 --- a/templates/asuzr/orders.html +++ b/templates/asuzr/orders.html @@ -36,7 +36,7 @@ {{ order.ostatok }} {%if order.approved%} {{ order.approved_date }} {%else%} Нет {% endif %} {{order.sketch.sketch_file}} - {{ order.executor.first_name }} + {{ order.executor.first_name }} {{ order.executor.last_name }} {%if order.is_done%} Да {%else%} Нет {% endif %} {% if archive %} {{ order.calls}} {% endif %} diff --git a/templates/asuzr/orders_detail.html b/templates/asuzr/orders_detail.html index 35bb2a2..389e468 100644 --- a/templates/asuzr/orders_detail.html +++ b/templates/asuzr/orders_detail.html @@ -14,7 +14,7 @@ {{ order.product.name }} {{ order.price }} {{ order.address }} - {{ order.designer.first_name }} + {{ order.designer.first_name}} {{order.designer.last_name}} {{ order.deadline_dmy }} {% endfor %} diff --git a/templates/asuzr/plan_balance.html b/templates/asuzr/plan_balance.html index 3431319..7c3ef55 100644 --- a/templates/asuzr/plan_balance.html +++ b/templates/asuzr/plan_balance.html @@ -3,7 +3,7 @@