views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. # -*- coding: utf-8 -*-
  2. from django.shortcuts import render, redirect, get_object_or_404
  3. from django.http import HttpResponse, HttpResponseRedirect
  4. from django.template import RequestContext, Context, loader
  5. from django.contrib.admin.models import LogEntry
  6. from asuzr.models import *
  7. from datetime import datetime, date, timedelta
  8. import calendar
  9. from django.db.models import Count, Sum
  10. from asuzr.common import custom_date
  11. from django.contrib.auth.decorators import login_required
  12. from asuzr.tables import *
  13. from asuzr.forms import *
  14. from django_tables2 import RequestConfig
  15. @login_required
  16. def prod_list(request):
  17. product_list = Product.objects.all()
  18. t = loader.get_template('asuzr/prod_list.html')
  19. c = Context({
  20. 'product_list': product_list,
  21. })
  22. return HttpResponse(t.render(c))
  23. @login_required
  24. def prod_detail(request, prod_id):
  25. return HttpResponse("This is %s" % prod_id)
  26. def get_filtered_list(p_list, year, month):
  27. filtered_list=[]
  28. for a in p_list:
  29. a_date = a.date
  30. if a_date.strftime('%m/%Y').lstrip('0') == '/'.join((month,year)).lstrip('0'):
  31. filtered_list.append(a)
  32. return filtered_list
  33. def get_orders_by_date(dt):
  34. order_list = Order.objects.filter(date=dt).order_by('id')
  35. return order_list
  36. def get_attendance_table(year, month, prefix):
  37. day_in_month = calendar.monthrange(year,month)[1]
  38. sdate = date(year,month,1)
  39. edate = date(year,month,day_in_month)
  40. month_days = {i+1: {'date': custom_date(year,month,i+1)} for i in range(day_in_month)}
  41. attend_list = Attendance.objects.filter(date__range = (sdate,edate))
  42. attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits'))
  43. for attend in attend_list:
  44. month_days[attend.date.day]['attend'] = attend
  45. order_list = Order.objects.filter(date__range = (sdate,edate))
  46. order_sum = order_list.aggregate(Count('product'), Sum('price'))
  47. order_list = order_list.values('date')
  48. order_list = order_list.annotate(Count('product'), Sum('price'))
  49. for order in order_list:
  50. month_days[order['date'].day]['order'] = order
  51. schedule = Schedule.objects.filter(date__range = (sdate,edate))
  52. for designer in schedule:
  53. day = designer.date.day
  54. if 'designer' in month_days[day]:
  55. month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer)
  56. else:
  57. month_days[day]['designer'] = designer
  58. month_plan = OrderPlan.objects.filter(date = sdate).first()
  59. month_plan = 0 if month_plan == None else month_plan.plan
  60. month_balance = month_plan - (order_sum['price__sum'] or 0)
  61. additional_info = {'title': 'Справочно',
  62. 'rows': [
  63. {'title': 'ПЛАН', 'value': month_plan},
  64. {'title': 'Осталось до выполнения', 'value': month_balance},
  65. ]
  66. }
  67. table = VisitTable(month_days.values(), prefix = prefix)
  68. table.verbose_name = 'Сводная информация'
  69. table.set_summaries({
  70. 'calls': attend_sum['calls__sum'] or 0,
  71. 'visits': attend_sum['visits__sum'] or 0,
  72. 'orders': order_sum['product__count'] or 0,
  73. 'cost': order_sum['price__sum'] or 0,
  74. })
  75. return table, additional_info
  76. def get_day_orders_table(date, prefix):
  77. orders = Order.objects.filter(date = date)
  78. summaries = orders.aggregate(Sum('price'), Sum('paid'))
  79. table = DayOrdersTable(orders, prefix = prefix)
  80. table.verbose_name = 'Заказы на %s' % date.strftime('%d %B %Y г')
  81. table.set_summary(summaries['price__sum'] or 0, summaries['paid__sum'] or 0)
  82. return table
  83. def create_attendance_if_need(date):
  84. attendance, created = Attendance.objects.get_or_create(date = date,
  85. defaults={'calls': 0, 'visits': 0})
  86. if created:
  87. attendance.save()
  88. @login_required
  89. def visit_view(request):
  90. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  91. form = DateForm({'date':curr_date})
  92. create_attendance_if_need(curr_date)
  93. attendance_table, add_info = get_attendance_table(curr_date.year, curr_date.month, 'attendance-')
  94. RequestConfig(request, paginate={'per_page': 32}).configure(attendance_table)
  95. orders_table = get_day_orders_table(curr_date, 'orders-')
  96. RequestConfig(request).configure(orders_table)
  97. order_form = OrderForm()
  98. title = 'Таблица посещаемости на %s' % curr_date.strftime('%B %Y г')
  99. return render(request, 'asuzr/table2.html', {
  100. 'table1': attendance_table,
  101. 'table2': orders_table,
  102. 'additional_info': add_info,
  103. 'title': title,
  104. 'dateform': form,
  105. 'order_form': order_form
  106. })
  107. @login_required
  108. def main(request, day, month, year):
  109. if day == None:
  110. day = str(date.today().day)
  111. if month == None:
  112. month = str(date.today().month)
  113. if year == None:
  114. year = str(date.today().year)
  115. d,m,y=int(day),int(month), int(year)
  116. attend_list = Attendance.objects.all().order_by('date')
  117. filtered_attend_list=get_filtered_list(attend_list, year, month)
  118. p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y')
  119. order_list = Order.objects.filter(date=p_date).order_by('id')
  120. 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'))
  121. plan = OrderPlan.objects.all()
  122. filtered_plan = get_filtered_list(plan, year, month)
  123. month_plan=0
  124. if len(filtered_plan) > 0:
  125. month_plan=filtered_plan[0].plan
  126. schedule = Schedule.objects.all().order_by('date')
  127. filtered_schedule = get_filtered_list(schedule, year, month)
  128. month_days={i: {'date': custom_date(int(year),int(month),i)} for i in range(1,calendar.monthrange(int(year),int(month))[1]+1)}
  129. for l in filtered_attend_list:
  130. month_days[l.date.day]['attend']=l
  131. for s in filtered_schedule:
  132. if 'designers' in month_days[s.date.day]:
  133. des=', '.join((month_days[s.date.day]['designers'], ' '.join((s.designer.first_name, s.designer.last_name))))
  134. month_days[s.date.day]['designers'] = des
  135. else:
  136. month_days[s.date.day]['designers'] = ' '.join((s.designer.first_name, s.designer.last_name))
  137. for order in month_order_list:
  138. month_days[order['date'].day]['orders_count'] = order['product__count']
  139. month_days[order['date'].day]['orders_price'] = order['price__sum']
  140. month_days_values = month_days.values()
  141. sum_calls = sum(l.calls for l in filtered_attend_list)
  142. sum_visits = sum(l.visits for l in filtered_attend_list)
  143. sum_orders = sum(l['orders_count'] for l in month_days_values if 'orders_count' in l)
  144. sum_price = sum(l['orders_price'] for l in month_days_values if 'orders_price' in l)
  145. sum_order_price = sum(l.price for l in order_list)
  146. plan_balance = month_plan-sum_price
  147. d_date = p_date.strftime("%d/%m/%Y")
  148. t = loader.get_template('asuzr/attend_order.html')
  149. c = RequestContext(request,{
  150. 'attend_list': month_days_values,
  151. 'order_list': order_list,
  152. 'sum_calls': sum_calls,
  153. 'sum_visits': sum_visits,
  154. 'sum_orders': sum_orders,
  155. 'sum_price': sum_price,
  156. 'sum_order_price': sum_order_price,
  157. 'plan': month_plan,
  158. 'balance': plan_balance,
  159. 'd_date': d_date,
  160. })
  161. return HttpResponse(t.render(c))
  162. @login_required
  163. def sketches(request, order_id):
  164. curr_order = Order.objects.get(pk = order_id)
  165. if request.method == 'POST':
  166. if 'sketch_file' in request.FILES:
  167. files = request.FILES.getlist('sketch_file')
  168. for f in files:
  169. instance = Sketch(sketch_file = f, order = curr_order)
  170. instance.save()
  171. return redirect(sketches, order_id = order_id)
  172. sketch_list = Sketch.objects.filter(order = curr_order)
  173. return render(request, 'asuzr/sketches.html', {
  174. 'order_id': order_id,
  175. 'sketch_list': sketch_list,
  176. 'title': 'Эскизы заказа: %s' % curr_order})
  177. def add_order(request):
  178. new_order = Order(date=date.today(), designer = request.user)
  179. form = OrderForm(request.POST, instance = new_order)
  180. form.save()
  181. return redirect(visit_view)
  182. def delete_sketch(request):
  183. pk = request.GET.get('pk', -1)
  184. sketch = get_object_or_404(Sketch, pk = pk)
  185. order_id = sketch.order.pk
  186. sketch.sketch_file.delete(save = False)
  187. sketch.delete()
  188. return redirect(sketches, order_id = order_id)
  189. @login_required
  190. def orders(request, archive):
  191. is_archive = (archive == '1')
  192. Table = ArchiveOrdersTable if is_archive else OrdersTable
  193. table = Table(Order.objects.filter(is_done = is_archive))
  194. title = 'Архивная таблица заказов' if is_archive else 'Таблица выхода заказов'
  195. RequestConfig(request).configure(table)
  196. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  197. @login_required
  198. def desreport(request):
  199. start_date = request.GET.get('sdate', date.today().strftime('%d.%m.%Y'))
  200. sdate = datetime.strptime(start_date, '%d.%m.%Y')
  201. end_date = request.GET.get('edate', date.today().strftime('%d.%m.%Y'))
  202. edate = datetime.strptime(end_date, '%d.%m.%Y')
  203. Table = DesignerTable
  204. table = Table(Order.objects.filter(cancelled=False, date__range=(sdate,edate)).values('designer__first_name','designer__last_name').annotate(Sum('price'),Count('designer')))
  205. title = u'Отчет по дизайнерам за '+' - '.join((start_date, end_date))
  206. form = DiapDateForm({'sdate': sdate, 'edate': edate})
  207. RequestConfig(request).configure(table)
  208. return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'dateform': form})
  209. @login_required
  210. def production_table(request, order_id):
  211. order_costs = OrderCosts.objects.filter(order=order_id)
  212. table = ProductionTable(order_costs)
  213. curr_order = Order.objects.get(pk = order_id)
  214. title = u'Производственная таблица'
  215. table.verbose_name = u'Заказ: %s' % (', '.join((curr_order.product.name, curr_order.address)))
  216. table.verbose_name2 = u'Стоимость: %s' % str(curr_order.price)
  217. costs_sum = order_costs.aggregate(Sum('value'))
  218. table.set_summary(costs_sum['value__sum'] or 0)
  219. table.set_balance(curr_order.price - (costs_sum['value__sum'] or 0))
  220. RequestConfig(request).configure(table)
  221. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  222. @login_required
  223. def prod_plan_view(request):
  224. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  225. y,m,d = curr_date.year, curr_date.month, curr_date.day
  226. wd = curr_date.weekday()
  227. sdate = curr_date - timedelta(days = wd)
  228. edate = curr_date + timedelta(days = 6-wd)
  229. days = [sdate + timedelta(days=i) for i in range(0,7)]
  230. week_days = {i.weekday(): {'date': custom_date(i.year,i.month,i.day)} for i in days}
  231. print week_days
  232. prodplan_list = ProdPlan.objects.filter(start_date__range = (sdate,edate))
  233. for prodplan in prodplan_list:
  234. week_days[prodplan.start_date.weekday()]['prodplan'] = prodplan
  235. table = ProdPlanTable(week_days.values())
  236. title = u'Производственный план на %s - %s' % (sdate.strftime('%d.%m.%Y'), edate.strftime('%d.%m.%Y'))
  237. form = DateForm({'date':curr_date})
  238. RequestConfig(request).configure(table)
  239. return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'dateform': form})
  240. @login_required
  241. def log_view(request):
  242. log = LogEntry.objects.all()
  243. table = LogTable(log)
  244. RequestConfig(request).configure(table)
  245. return render(request, 'asuzr/table.html', {'table': table, 'title': 'Журнал операций'})