Внесены изменения в модель. Добавлено расписание. Реализован вывод информации о заказах н/з от посещаемости. Реализовано отображение всех дней месяца
This commit is contained in:
@@ -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)
|
||||
19
asuzr/common.py
Normal file
19
asuzr/common.py
Normal 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")
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
@@ -102,3 +130,4 @@ def desreport(request):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
{% block page %}
|
||||
<table WIDTH="100%">
|
||||
<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="55%">{% include 'asuzr/orders_detail.html' %}</TD>
|
||||
<TD WIDTH="45%">{% include 'asuzr/orders_detail.html' %}</TD>
|
||||
</TR>
|
||||
</table>
|
||||
{% include 'asuzr/plan_balance.html' %}
|
||||
|
||||
@@ -8,15 +8,17 @@
|
||||
<TH>Посещения</TH>
|
||||
<TH>Заказы</TH>
|
||||
<TH>Стоимость</TH>
|
||||
<TH>Дизайнеры</TH>
|
||||
</TR>
|
||||
{% for attend in attend_list %}
|
||||
<TR bgcolor={{attend.day_color}}>
|
||||
<TD>{{ attend.date_dd_mm_yy}}</TD>
|
||||
<TD>{{ attend.week_day}}</TD>
|
||||
<TD>{{ attend.calls }}</TD>
|
||||
<TD>{{ attend.visits }}</TD>
|
||||
<TD><a href="{% url 'asuzr-main' attend.date.day attend.date.month attend.date.year %}">{{ attend.order_count}}</a></TD>
|
||||
<TR bgcolor={{attend.date.weekday_color}}>
|
||||
<TD>{{ attend.date.date_dd_mm_yy}}</TD>
|
||||
<TD>{{ attend.date.weekday_name}}</TD>
|
||||
<TD>{{ attend.attend.calls }}</TD>
|
||||
<TD>{{ attend.attend.visits }}</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.designers}}</TD>
|
||||
</TR>
|
||||
{% endfor %}
|
||||
<TR>
|
||||
@@ -25,9 +27,10 @@
|
||||
<TD>{{sum_visits}}</TD>
|
||||
<TD>{{sum_orders}}</TD>
|
||||
<TD>{{sum_price}}</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>Список изделий пуст</p>
|
||||
<p>Список пуст</p>
|
||||
{% endif %}
|
||||
</TABLE>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</TR>
|
||||
{% for des in des_list %}
|
||||
<TR>
|
||||
<TD>{{des.designer__first_name}}</TD>
|
||||
<TD>{{des.designer__first_name}} {{des.designer__last_name}}</TD>
|
||||
<TD>{{des.designer__count}}</TD>
|
||||
<TD>{{des.price__sum}}</TD>
|
||||
</TR>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<TD>{{ order.ostatok }}</TD>
|
||||
<TD>{%if order.approved%} {{ order.approved_date }} {%else%} Нет {% endif %}</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>
|
||||
{% if archive %} <TD {% if order.calls_color%} bgcolor='FFFACD' {% endif %}>{{ order.calls}}</TD> {% endif %}
|
||||
</TR>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<TD>{{ order.product.name }}</TD>
|
||||
<TD>{{ order.price }}</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>
|
||||
</TR>
|
||||
{% endfor %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<ul>
|
||||
<TR>
|
||||
<TD>ПЛАН</TD>
|
||||
<TD>{{ plan.plan }}</TD>
|
||||
<TD>{{ plan }}</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Осталось до выполнения</TD>
|
||||
|
||||
Reference in New Issue
Block a user