Преглед изворни кода

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

Anastasia пре 10 година
родитељ
комит
89834caf1c

+ 2 - 0
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)

+ 19 - 0
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")

+ 22 - 20
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)

+ 38 - 9
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))
 
+
   
 
 

+ 2 - 2
templates/asuzr/attend_order.html

@@ -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' %}

+ 10 - 7
templates/asuzr/attendance.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>

+ 1 - 1
templates/asuzr/desreport.html

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

+ 1 - 1
templates/asuzr/orders.html

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

+ 1 - 1
templates/asuzr/orders_detail.html

@@ -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 %}

+ 1 - 1
templates/asuzr/plan_balance.html

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