Внесены изменения в модель. Добавлено расписание. Реализован вывод информации о заказах н/з от посещаемости. Реализовано отображение всех дней месяца

This commit is contained in:
Anastasia
2015-05-31 18:20:00 +05:00
parent beb04bc693
commit 89834caf1c
10 changed files with 97 additions and 42 deletions

View File

@@ -7,6 +7,7 @@ from asuzr.models import ProdPlan
from asuzr.models import AccessProtocol from asuzr.models import AccessProtocol
from asuzr.models import OrderPlan from asuzr.models import OrderPlan
from asuzr.models import Attendance from asuzr.models import Attendance
from asuzr.models import Schedule
# Register your models here. # Register your models here.
#admin.site.register(Product) #admin.site.register(Product)
@@ -19,6 +20,7 @@ admin.site.register(Action)
admin.site.register(ProdPlan) admin.site.register(ProdPlan)
admin.site.register(AccessProtocol) admin.site.register(AccessProtocol)
admin.site.register(OrderPlan) admin.site.register(OrderPlan)
admin.site.register(Schedule)
class AttendAdmin(admin.ModelAdmin): class AttendAdmin(admin.ModelAdmin):
list_display=('date', 'calls', 'visits') list_display=('date', 'calls', 'visits')
admin.site.register(Attendance, AttendAdmin) admin.site.register(Attendance, AttendAdmin)

19
asuzr/common.py Normal file
View File

@@ -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")

View File

@@ -5,12 +5,6 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from datetime import date, timedelta 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): class Product(models.Model):
name = models.CharField(max_length=150) name = models.CharField(max_length=150)
@@ -19,6 +13,14 @@ class Product(models.Model):
def __unicode__(self): def __unicode__(self):
return self.name 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): class Attendance(models.Model):
date = models.DateField() date = models.DateField()
@@ -33,18 +35,6 @@ class Attendance(models.Model):
def date_as_tuple(self): def date_as_tuple(self):
return tuple(self.date_dd_mm_yy().split("/")) 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 @property
def order_count(self): def order_count(self):
return Order.objects.filter(date=self.date).count() 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) day_price = sum(o.price for o in orders)
return day_price return day_price
#Статьи затрат
class CostItem(models.Model):
name = models.CharField(max_length=150)
default_item = models.BooleanField(default=False)
#Заказы #Заказы
class Order(models.Model): class Order(models.Model):
@@ -68,12 +62,13 @@ class Order(models.Model):
lifting = models.BooleanField(default=False) #подъем lifting = models.BooleanField(default=False) #подъем
paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено
approved = models.DateTimeField(null=True, blank = True) #согласовано 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) #сдан is_done = models.BooleanField(default=False) #сдан
calls = models.TextField(null=True, blank = True) #обзвон calls = models.TextField(null=True, blank = True) #обзвон
contact = models.CharField(max_length=150, 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) #контактный телефон phone_num = models.CharField(max_length=150,null=True, blank = True) #контактный телефон
cancelled = models.BooleanField(default=False) #отменен cancelled = models.BooleanField(default=False) #отменен
cost_items = models.ManyToManyField(CostItem, through='OrderCosts') #статьи затрат
def __unicode__(self): def __unicode__(self):
return ', '.join((self.date.strftime('%d %b %Y'), self.product.name, self.address)) 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): class OrderPlan(models.Model):
date = models.DateField() date = models.DateField()
plan = models.IntegerField() plan = models.DecimalField(max_digits=12, decimal_places=2)
def __unicode__(self): def __unicode__(self):
return self.date.strftime('%B %Y') 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)

View File

@@ -5,10 +5,11 @@ from asuzr.models import Product
from asuzr.models import Attendance from asuzr.models import Attendance
from asuzr.models import Order from asuzr.models import Order
from asuzr.models import OrderPlan 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 from django.db.models import Count, Sum
from asuzr.common import custom_date
# Create your views here.
def prod_list(request): def prod_list(request):
product_list = Product.objects.all() product_list = Product.objects.all()
@@ -37,35 +38,62 @@ def get_orders_by_date(dt):
def main(request, day, month, year): def main(request, day, month, year):
d,m,y=int(day),int(month), int(year)
attend_list = Attendance.objects.all().order_by('date') attend_list = Attendance.objects.all().order_by('date')
filtered_attend_list=get_filtered_list(attend_list, year, month) filtered_attend_list=get_filtered_list(attend_list, year, month)
p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y') p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y')
order_list = Order.objects.filter(date=p_date).order_by('id') 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() plan = OrderPlan.objects.all()
filtered_plan = get_filtered_list(plan, year, month) 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_calls = sum(l.calls for l in filtered_attend_list)
sum_visits = sum(l.visits 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_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 filtered_attend_list) 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) 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") d_date = p_date.strftime("%d/%m/%Y")
t = loader.get_template('asuzr/attend_order.html') t = loader.get_template('asuzr/attend_order.html')
c = Context({ c = Context({
'attend_list': filtered_attend_list, 'attend_list': month_days_values,
'order_list': order_list, 'order_list': order_list,
'sum_calls': sum_calls, 'sum_calls': sum_calls,
'sum_visits': sum_visits, 'sum_visits': sum_visits,
'sum_orders': sum_orders, 'sum_orders': sum_orders,
'sum_price': sum_price, 'sum_price': sum_price,
'sum_order_price': sum_order_price, 'sum_order_price': sum_order_price,
'plan': filtered_plan[0], 'plan': month_plan,
'balance': plan_balance, 'balance': plan_balance,
'd_date': d_date, 'd_date': d_date,
}) })
@@ -90,7 +118,7 @@ def desreport(request):
sdate = datetime.strptime(start_date, '%d.%m.%y') sdate = datetime.strptime(start_date, '%d.%m.%y')
end_date = request.GET.get('edate', date.today().strftime('%d.%m.%y')) end_date = request.GET.get('edate', date.today().strftime('%d.%m.%y'))
edate = datetime.strptime(end_date, '%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') t=loader.get_template('asuzr/desreport.html')
c=Context({ c=Context({
'des_list' : des_list, 'des_list' : des_list,
@@ -102,3 +130,4 @@ def desreport(request):

View File

@@ -4,9 +4,9 @@
{% block page %} {% block page %}
<table WIDTH="100%"> <table WIDTH="100%">
<TR VALIGN=top> <TR VALIGN=top>
<TD WIDTH="40%">{% include 'asuzr/attendance.html' %}</TD> <TD WIDTH="50%">{% include 'asuzr/attendance.html' %}</TD>
<TD WIDTH="5%"></TD> <TD WIDTH="5%"></TD>
<TD WIDTH="55%">{% include 'asuzr/orders_detail.html' %}</TD> <TD WIDTH="45%">{% include 'asuzr/orders_detail.html' %}</TD>
</TR> </TR>
</table> </table>
{% include 'asuzr/plan_balance.html' %} {% include 'asuzr/plan_balance.html' %}

View File

@@ -8,15 +8,17 @@
<TH>Посещения</TH> <TH>Посещения</TH>
<TH>Заказы</TH> <TH>Заказы</TH>
<TH>Стоимость</TH> <TH>Стоимость</TH>
<TH>Дизайнеры</TH>
</TR> </TR>
{% for attend in attend_list %} {% for attend in attend_list %}
<TR bgcolor={{attend.day_color}}> <TR bgcolor={{attend.date.weekday_color}}>
<TD>{{ attend.date_dd_mm_yy}}</TD> <TD>{{ attend.date.date_dd_mm_yy}}</TD>
<TD>{{ attend.week_day}}</TD> <TD>{{ attend.date.weekday_name}}</TD>
<TD>{{ attend.calls }}</TD> <TD>{{ attend.attend.calls }}</TD>
<TD>{{ attend.visits }}</TD> <TD>{{ attend.attend.visits }}</TD>
<TD><a href="{% url 'asuzr-main' attend.date.day attend.date.month attend.date.year %}">{{ attend.order_count}}</a></TD> <TD><a href="{% url 'asuzr-main' attend.date.day attend.date.month attend.date.year %}">{{ attend.orders_count}}</a></TD>
<TD>{{ attend.orders_price}}</TD> <TD>{{ attend.orders_price}}</TD>
<TD>{{ attend.designers}}</TD>
</TR> </TR>
{% endfor %} {% endfor %}
<TR> <TR>
@@ -25,9 +27,10 @@
<TD>{{sum_visits}}</TD> <TD>{{sum_visits}}</TD>
<TD>{{sum_orders}}</TD> <TD>{{sum_orders}}</TD>
<TD>{{sum_price}}</TD> <TD>{{sum_price}}</TD>
<TD></TD>
</TR> </TR>
</ul> </ul>
{% else %} {% else %}
<p>Список изделий пуст</p> <p>Список пуст</p>
{% endif %} {% endif %}
</TABLE> </TABLE>

View File

@@ -13,7 +13,7 @@
</TR> </TR>
{% for des in des_list %} {% for des in des_list %}
<TR> <TR>
<TD>{{des.designer__first_name}}</TD> <TD>{{des.designer__first_name}} {{des.designer__last_name}}</TD>
<TD>{{des.designer__count}}</TD> <TD>{{des.designer__count}}</TD>
<TD>{{des.price__sum}}</TD> <TD>{{des.price__sum}}</TD>
</TR> </TR>

View File

@@ -36,7 +36,7 @@
<TD>{{ order.ostatok }}</TD> <TD>{{ order.ostatok }}</TD>
<TD>{%if order.approved%} {{ order.approved_date }} {%else%} Нет {% endif %}</TD> <TD>{%if order.approved%} {{ order.approved_date }} {%else%} Нет {% endif %}</TD>
<TD>{{order.sketch.sketch_file}}</TD> <TD>{{order.sketch.sketch_file}}</TD>
<TD>{{ order.executor.first_name }}</TD> <TD>{{ order.executor.first_name }} {{ order.executor.last_name }}</TD>
<TD>{%if order.is_done%} Да {%else%} Нет {% endif %}</TD> <TD>{%if order.is_done%} Да {%else%} Нет {% endif %}</TD>
{% if archive %} <TD {% if order.calls_color%} bgcolor='FFFACD' {% endif %}>{{ order.calls}}</TD> {% endif %} {% if archive %} <TD {% if order.calls_color%} bgcolor='FFFACD' {% endif %}>{{ order.calls}}</TD> {% endif %}
</TR> </TR>

View File

@@ -14,7 +14,7 @@
<TD>{{ order.product.name }}</TD> <TD>{{ order.product.name }}</TD>
<TD>{{ order.price }}</TD> <TD>{{ order.price }}</TD>
<TD>{{ order.address }}</TD> <TD>{{ order.address }}</TD>
<TD>{{ order.designer.first_name }}</TD> <TD>{{ order.designer.first_name}} {{order.designer.last_name}}</TD>
<TD>{{ order.deadline_dmy }}</TD> <TD>{{ order.deadline_dmy }}</TD>
</TR> </TR>
{% endfor %} {% endfor %}

View File

@@ -3,7 +3,7 @@
<ul> <ul>
<TR> <TR>
<TD>ПЛАН</TD> <TD>ПЛАН</TD>
<TD>{{ plan.plan }}</TD> <TD>{{ plan }}</TD>
</TR> </TR>
<TR> <TR>
<TD>Осталось до выполнения</TD> <TD>Осталось до выполнения</TD>