From 3dff9df09cf8773a2cf93b4c08cbd256a77c18e0 Mon Sep 17 00:00:00 2001 From: OrazioPirataDelloSpazio Date: Fri, 8 Nov 2013 01:41:49 +0100 Subject: [PATCH] baraled patched, stats improved --- fusolab2_0/apps/bar/managers.py | 6 +- fusolab2_0/apps/baraled/models.py | 6 +- fusolab2_0/apps/ingresso/models.py | 2 +- fusolab2_0/apps/reports/stats.py | 84 ++- fusolab2_0/apps/reports/urls.py | 9 +- fusolab2_0/apps/reports/views.py | 566 +++++++++++------- fusolab2_0/common/templates/index.html | 4 +- .../common/templates/reports/daily_stats.html | 170 +++--- fusolab2_0/settings.tmpl.py | 242 ++++++++ 9 files changed, 754 insertions(+), 335 deletions(-) create mode 100644 fusolab2_0/settings.tmpl.py diff --git a/fusolab2_0/apps/bar/managers.py b/fusolab2_0/apps/bar/managers.py index 134fcaa..9adeb52 100644 --- a/fusolab2_0/apps/bar/managers.py +++ b/fusolab2_0/apps/bar/managers.py @@ -34,11 +34,11 @@ def get_payment_display(key): d = dict(PAYMENT_SUBTYPES) - return d[key] if key in d else None + return d[key] if key in d else "" def get_deposit_display(key): d = dict(DEPOSIT_SUBTYPES) - return d[key] if key in d else None + return d[key] if key in d else "" class BalanceManager(models.Manager): @@ -48,7 +48,7 @@ def is_open(self,time=datetime.now): except ObjectDoesNotExist: return False - def get_parent_t(self, current_time): + def get_parent_t(self, current_time=datetime.now): try: return super(BalanceManager, self).get_query_set().filter(Q(operation__in=[OPENING,CASHPOINT]) & Q(date__lt=current_time)).latest('date') except ObjectDoesNotExist: diff --git a/fusolab2_0/apps/baraled/models.py b/fusolab2_0/apps/baraled/models.py index 6fb83f0..f60ac36 100644 --- a/fusolab2_0/apps/baraled/models.py +++ b/fusolab2_0/apps/baraled/models.py @@ -27,12 +27,10 @@ def send_ledbar_cmd(sender, instance, **kwargs): ''' After being saved, each LedString sends an UPD message to the Arduino that controls the led bar ''' - BARALED_IP = settings.IP_OPENER - BARALED_PORT = settings.PORT_OPENER sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.sendto(instance.coded_sentence, (BARALED_IP, BARALED_PORT)) + sock.sendto("baraled:" + instance.coded_sentence, (settings.BARALED_IP, settings.BARALED_PORT)) sock.close() -post_save.connect(send_ledbar_cmd, sender=LedString, dispatch_uid="send_ledbar_cmd") +post_save.connect(send_ledbar_cmd, sender=LedString) diff --git a/fusolab2_0/apps/ingresso/models.py b/fusolab2_0/apps/ingresso/models.py index 111f0e0..def72a4 100644 --- a/fusolab2_0/apps/ingresso/models.py +++ b/fusolab2_0/apps/ingresso/models.py @@ -64,7 +64,7 @@ def get_entrance_summary(closing): notes.append("apertura "+ str(closing.parent.amount)) if closing.parent.note: - notes.append(closing.parent.note.replace("\r\n"," ")+"\n") + notes.append(" "+closing.parent.note.replace("\r\n"," ")+"\n") else: notes.append("\n") diff --git a/fusolab2_0/apps/reports/stats.py b/fusolab2_0/apps/reports/stats.py index bfcfcba..754626b 100644 --- a/fusolab2_0/apps/reports/stats.py +++ b/fusolab2_0/apps/reports/stats.py @@ -8,6 +8,7 @@ from django.db.models import Sum from django.db.models import Count from bar.models import * +from ingresso.models import * from django.conf import settings from django.utils import simplejson from decimal import Decimal @@ -27,36 +28,69 @@ def default(self, obj): return simplejson.JSONEncoder.default(self, obj) @staff_member_required -def get_bar_stats(request): +def get_stats(request,what,yyyy=None,mm=None,dd=None): + start_time = BarBalance.objects.get_parent_t() + end_time = datetime.now() + if all((yyyy,mm,dd)): + end_time = datetime(int(yyyy),int(mm),int(dd)+1,12,00,00) + start_time = datetime(int(yyyy),int(mm),int(dd),12,00,00) - end_time = datetime(2013,10,26,00,00,00) - start_time = datetime(2013,10,24,00,00,00) - - data = [] - series = {} - counter = {} - products = Product.objects.all() - - #initialize counter and data series dicts - for pa in products: - counter[pa.name] = 0 - series[pa.name] = [] + data = [] + + if what == "bar": + + series = {} + counter = {} + products = Product.objects.all() + + #initialize counter and data series dicts + for pa in products: + counter[pa.name] = 0 + series[pa.name] = [] - #fill data series dict - for r in Receipt.objects.receipts_between(start_time,end_time): - for pp in PurchasedProduct.objects.filter(receipt=r): - counter[pp.name]+=1 - for pb in products: - series[pb.name].append( [ int(r.date.strftime('%s')+'000') , counter[pb.name] * pb.cost ] ) -# series[pb.name].append( [ r.date , counter[pb.name] * pb.cost ] ) + #fill data series dict + for r in Receipt.objects.receipts_between(start_time,end_time): + for pp in PurchasedProduct.objects.filter(receipt=r): + counter[pp.name]+=1 + for pb in products: + series[pb.name].append( [ int(r.date.strftime('%s')+'000') , counter[pb.name] * pb.cost ] ) - #build return list of dicts - for pc in products: - data.append( {"key" : pc.name.encode('utf-8') , "values" : series[pc.name] } ) + #build return list of dicts + for pc in products: + data.append( {"key" : pc.name.encode('utf-8') , "values" : series[pc.name] } ) - buffer = simplejson.dumps( data, cls=FuckYeahEncoder ) - return HttpResponse(buffer, mimetype = "application/json" ) + buffer = simplejson.dumps( data, cls=FuckYeahEncoder ) + return HttpResponse(buffer, mimetype = "application/json" ) + + if what == "ingresso": + + counter_serie = [] + counter = 0 + amount_serie = [ ] + amount = 0 + + for e in Entrance.objects.filter(date__range=[start_time,end_time]): + counter += 1 + counter_serie.append( [ int(e.date.strftime('%s')+'000') , counter ] ) + amount_serie.append( [ int(e.date.strftime('%s')+'000') , e.cost ] ) + + data.append( {"key" : "Euro" ,"bar": true, "values" : amount_serie } ) + data.append( {"key" : "Numerico" , "values" : counter_serie } ) + + buffer = simplejson.dumps( data, cls=FuckYeahEncoder ) + return HttpResponse(buffer, mimetype = "application/json" ) + + if what == "total": + + values = [] + values.append( {"label": "Bar", "value" : Receipt.objects.total_between(start_time,end_time)}) + values.append( {"label": "Ingresso", "value" : Entrance.objects.total_between(start_time,end_time)}) + data = { "key" : "Cumulative Return" , "values" : values } + buffer = simplejson.dumps( data, cls=FuckYeahEncoder ) + return HttpResponse(buffer, mimetype = "application/json" ) + else: + raise Http404 # @staff_member_required # def stats(request): diff --git a/fusolab2_0/apps/reports/urls.py b/fusolab2_0/apps/reports/urls.py index 43696e6..c80cba0 100644 --- a/fusolab2_0/apps/reports/urls.py +++ b/fusolab2_0/apps/reports/urls.py @@ -2,14 +2,11 @@ from django.views.generic import TemplateView urlpatterns = patterns('', - url(r'^/daily_stats/$', 'reports.views.daily_stats', name='reports_daily_stats'), + #url(r'^/daily_stats/$', 'reports.views.daily_stats', name='reports_daily_stats'), #url(r'^/make_balance/$', 'reports.views.make_balance', name='reports_make_balance'), - - url(r'^excel_writer/(?P\S+)/(?P\d{2})/(?P\d{2})/(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P\d{4})/$', 'reports.views.excel_writer', name='excel_writer'), - + url(r'^excel/(?P\S+)/(?P\d{2})/(?P\d{2})/(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P\d{4})/$', 'reports.views.excel', name='excel'), - #url(r'^stats/(?P\S+)/(?P\S+)/(?P
\d{2})/(?P\d{2})/(?P\d{4})/$', 'stats.stats.ajax_stats', name='ajax_stats'), - url(r'^get_daily_stats.json$', 'reports.stats.get_bar_stats', name='get_bar_stats'), + url(r'^(?P\d{4})/(?P\d{2})/(?P
\d{2})/(?P\S+).json$', 'reports.stats.get_stats', name='get_stats'), #url(r'^devstats/(?P\S+)/(?P\S+)/(?P
\d{2})/(?P\d{2})/(?P\d{4})/$', 'stats.stats.ajax_stats_dev', name='ajax_stats_dev'), #url(r'^trends/(?P\S+)/(?P\S+)/(?P
\d{2})/(?P\d{2})/(?P\d{4})/$', 'stats.trends.ajax_stats', name='ajax_stats'), #url(r'^trends/$', 'stats.trends.trends', name='trends'), diff --git a/fusolab2_0/apps/reports/views.py b/fusolab2_0/apps/reports/views.py index 6a994c1..4424e43 100644 --- a/fusolab2_0/apps/reports/views.py +++ b/fusolab2_0/apps/reports/views.py @@ -9,201 +9,11 @@ from ingresso.models import * from ingresso.managers import * import datetime -#from mm.contrib.django.grid import DjangoGrid -#import mm -#from excel_response import ExcelResponse -import xlwt import xlsxwriter import StringIO -def excel(request, what, from_day, from_month, from_year, to_day, to_month, to_year): - ''' generate an excel with the full balance for this reference period ''' - - from_datetime = datetime.datetime(int(from_year), int(from_month), int(from_day)) - to_datetime = datetime.datetime(int(to_year), int(to_month), int(to_day), hour=23, minute=59) + datetime.timedelta(hours=12) - - output_name = 'bilancio_'+what+'_fusolab.xls' - response = HttpResponse(mimetype="application/ms-excel") - response['Content-Disposition'] = 'attachment;filename="%s"' % (output_name ) - - book = xlwt.Workbook(encoding='utf8') - - ### create the sheet for the summary and another for the transaction list### - sheet = book.add_sheet('riepilogo') - list_sheet = book.add_sheet('elenco') - - #set the headers - header_style = xlwt.XFStyle() # Create the Style - font = xlwt.Font() # Create the Font - font.bold = True - header_style.font = font # set the font - borders = xlwt.Borders() - borders.bottom = xlwt.Borders.THICK - header_style.borders = borders #set the border - pattern = xlwt.Pattern() - pattern.pattern = xlwt.Pattern.SOLID_PATTERN - pattern.pattern_fore_colour = 22 - header_style.pattern = pattern - - algn1 = xlwt.Alignment() - algn1.wrap = 1 - note_style = xlwt.XFStyle() - note_style.alignment = algn1 - - if what == 'bar': - - - summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'cassiere', 'note', 'totale scontrini', 'check1', 'check2', 'ricavi', 'costi', 'risultato'] - for i in range(0, len(summary_headers)): - sheet.write(0, i, summary_headers[i], header_style) - tall_style = xlwt.easyxf('font:height 720;') # 36pt - sheet.row(0).set_style(tall_style) - - list_headers = ['data','operazione','tipo','somma','cassiere','note'] - for i in range(0, len(list_headers)): - list_sheet.write(0, i, list_headers[i], header_style) - list_sheet.row(0).set_style(tall_style) - - qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(BarBalance.objects.filter(qf).order_by('date'), start=1): - list_sheet.write(rowx,0,str(bb.date)) - list_sheet.write(rowx,1,bb.get_operation_display()) - if bb.operation == PAYMENT: - list_sheet.write(rowx,2,get_payment_display(bb.subtype)) - elif bb.operation == DEPOSIT: - list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) - list_sheet.write(rowx,3,bb.amount) - list_sheet.write(rowx,4,str(bb.cashier)) - list_sheet.write(rowx,5,bb.note) - - qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(BarBalance.objects.filter(qf).order_by('date'), start=1): - data = get_bar_summary(bb) - parent = BarBalance.objects.get_parent_o(bb) - sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) - sheet.write(rowx, 1, data['opening_amount']) - if parent: - sheet.write(rowx, 2, data['wi']) - sheet.write(rowx, 3, data['de']) - sheet.write(rowx, 4, data['pa']) - #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) - #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) - #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) - sheet.write(rowx, 5, data['closing_amount']) - sheet.write(rowx, 6, str(data['cashier'])) - sheet.write(rowx, 7, data['notes'],note_style) - sheet.write(rowx, 8, data['receipt_count']) - # excel rows start from one - if rowx != 1: - sheet.write(rowx, 9, xlwt.Formula('B%d-F%d' % (rowx+1, rowx-1+1))) #check1 - sheet.write(rowx, 10, xlwt.Formula('L%d+M%d-I%d' % (rowx+1, rowx+1, rowx+1))) #check2 - sheet.write(rowx, 11, xlwt.Formula('F%d-B%d' % (rowx+1, rowx+1))) #ricavi - sheet.write(rowx, 12, xlwt.Formula('E%d+C%d-D%d' % (rowx+1, rowx+1, rowx+1))) #costi - sheet.write(rowx, 13, xlwt.Formula('L%d-M%d' % (rowx+1, rowx+1))) #risultato - - elif what == 'ingresso': - - - summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'cassiere', 'note', 'totale ingressi', 'check1', 'check2', 'ricavi', 'costi', 'risultato'] - for i in range(0, len(summary_headers)): - sheet.write(0, i, summary_headers[i], header_style) - tall_style = xlwt.easyxf('font:height 720;') # 36pt - sheet.row(0).set_style(tall_style) - - list_headers = ['data','operazione','tipo','somma','cassiere','note'] - for i in range(0, len(list_headers)): - list_sheet.write(0, i, list_headers[i], header_style) - list_sheet.row(0).set_style(tall_style) - qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): - list_sheet.write(rowx,0,str(bb.date)) - list_sheet.write(rowx,1,bb.get_operation_display()) - if bb.operation == PAYMENT: - list_sheet.write(rowx,2,get_payment_display(bb.subtype)) - elif bb.operation == DEPOSIT: - list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) - list_sheet.write(rowx,3,bb.amount) - list_sheet.write(rowx,4,str(bb.cashier)) - list_sheet.write(rowx,5,bb.note) - - qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): - data = get_entrance_summary(bb) - parent = EntranceBalance.objects.get_parent_o(bb) - sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) - sheet.write(rowx, 1, data['opening_amount']) - if parent: - sheet.write(rowx, 2, data['wi']) - sheet.write(rowx, 3, data['de']) - sheet.write(rowx, 4, data['pa']) - #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) - #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) - #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) - sheet.write(rowx, 5, data['closing_amount']) - sheet.write(rowx, 6, str(data['cashier'])) - sheet.write(rowx, 7, data['notes'],note_style) - sheet.write(rowx, 8, data['receipt_count']) - # excel rows start from one - if rowx != 1: - sheet.write(rowx, 9, xlwt.Formula('B%d-F%d' % (rowx+1, rowx-1+1))) #check1 - sheet.write(rowx, 10, xlwt.Formula('L%d+M%d-I%d' % (rowx+1, rowx+1, rowx+1))) #check2 - sheet.write(rowx, 11, xlwt.Formula('F%d-B%d' % (rowx+1, rowx+1))) #ricavi - sheet.write(rowx, 12, xlwt.Formula('E%d+C%d-D%d' % (rowx+1, rowx+1, rowx+1))) #costi - sheet.write(rowx, 13, xlwt.Formula('L%d-M%d' % (rowx+1, rowx+1))) #risultato - - elif what == 'interregno': - - - summary_headers = ['data', 'punto di cassa precedente', 'prelevati', 'depositati', 'pagamenti', 'cassiere', 'note', 'totale ricevute','atteso','punto di cassa', 'controllo cassa'] - for i in range(0, len(summary_headers)): - sheet.write(0, i, summary_headers[i], header_style) - tall_style = xlwt.easyxf('font:height 720;') # 36pt - sheet.row(0).set_style(tall_style) - - list_headers = ['data','operazione','tipo','somma','cassiere','note'] - for i in range(0, len(list_headers)): - list_sheet.write(0, i, list_headers[i], header_style) - list_sheet.row(0).set_style(tall_style) - - qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): - list_sheet.write(rowx,0,str(bb.date)) - list_sheet.write(rowx,1,bb.get_operation_display()) - if bb.operation == PAYMENT: - list_sheet.write(rowx,2,get_payment_display(bb.subtype)) - elif bb.operation == DEPOSIT: - list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) - list_sheet.write(rowx,3,bb.amount) - list_sheet.write(rowx,4,str(bb.cashier)) - list_sheet.write(rowx,5,bb.note) - - qf = Q(operation=CASHPOINT) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) - for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): - data = get_small_summary(bb) - #parent = SmallBalance.objects.get_parent_o(bb) - - sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) - sheet.write(rowx, 1, data['last_checkpoint']) - sheet.write(rowx, 2, data['wi']) - sheet.write(rowx, 3, data['de']) - sheet.write(rowx, 4, data['pa']) - #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) - #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) - #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) - sheet.write(rowx, 5, str(data['cashier'])) - sheet.write(rowx, 6, data['notes'],note_style) - sheet.write(rowx, 7, data['receipt_count']) - sheet.write(rowx, 8, data['expected_checkpoint']) - sheet.write(rowx, 9, data['checkpoint']) - sheet.write(rowx, 10, data['check']) - else: - raise Http404 - - book.save(response) - return response - -def excel_writer(request, what, from_day, from_month, from_year, to_day, to_month, to_year): +def excel(request, what, from_day, from_month, from_year, to_day, to_month, to_year): ''' generate an excel with the full balance for this reference period ''' from_datetime = datetime.datetime(int(from_year), int(from_month), int(from_day)) @@ -217,23 +27,30 @@ def excel_writer(request, what, from_day, from_month, from_year, to_day, to_mont sheet = workbook.add_worksheet('riepilogo') list_sheet = workbook.add_worksheet('elenco') - ### create generic styles for cell content + ### create styles for cell content header_format = workbook.add_format({'bold': True,'align':'center'}) + header_format.set_border() money_format = workbook.add_format({'num_format':'0.00'}) date_format = workbook.add_format({'num_format':'dd/mm/yy','align':'center','valign':'center',}) note_format = workbook.add_format() note_format.set_text_wrap() + note_format.set_right() warning_under_format = workbook.add_format({'bg_color':'#FFC7CE','font_color':'#9C0006'}) warning_over_format = workbook.add_format({'bg_color': '#C6EFCE','font_color': '#006100'}) check_format = workbook.add_format({'bold': True}) + check_format.set_top() check_under_format = workbook.add_format({'bold': True,'bg_color':'#9C0006','font_color':'#FFC7CE'}) + check_under_format.set_top() check_over_format = workbook.add_format({'bold': True,'bg_color':'#006100','font_color':'#C6EFCE'}) + check_over_format.set_top() + line_format = workbook.add_format() + line_format.set_top() if what == 'bar': summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'ricevute', 'check1', 'check2', 'teorico', 'netto', 'cassiere', 'note'] for i in range(0, len(summary_headers)): - sheet.write(0, i, summary_headers[i], header_format) + sheet.write_string(0, i, summary_headers[i], header_format) rowx = 0 qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) @@ -254,8 +71,11 @@ def excel_writer(request, what, from_day, from_month, from_year, to_day, to_mont sheet.write(rowx,8,'=K'+str(rowx+1)+'-J'+str(rowx+1),money_format) sheet.write(rowx,9, '=G'+str(rowx+1)+'+D'+str(rowx+1)+'-E'+str(rowx+1)+'-C'+str(rowx+1),money_format) sheet.write(rowx,10,'=F'+str(rowx+1)+'-B'+str(rowx+1),money_format) - sheet.write(rowx, 11, str(data['cashier'])) + sheet.write_string(rowx, 11, str(data['cashier'])) sheet.write_string(rowx, 12, ''.join(data['notes']),note_format) + + for col in range(13): + sheet.write(rowx+1,col,'',line_format) #add column check sheet.write(rowx+1,7,'=SUM(H3:H'+str(rowx+1)+')',check_format) @@ -284,26 +104,186 @@ def excel_writer(request, what, from_day, from_month, from_year, to_day, to_mont list_headers = ['data','operazione','tipo','somma','cassiere','note'] for i in range(0, len(list_headers)): - list_sheet.write(0, i, list_headers[i], header_format) + list_sheet.write_string(0, i, list_headers[i], header_format) qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) for rowx, bb in enumerate(BarBalance.objects.filter(qf).order_by('date'), start=1): list_sheet.write(rowx,0,bb.date,date_format) - list_sheet.write(rowx,1,bb.get_operation_display()) + list_sheet.write_string(rowx,1,bb.get_operation_display()) if bb.operation == PAYMENT: - list_sheet.write(rowx,2,get_payment_display(bb.subtype)) + list_sheet.write_string(rowx,2,get_payment_display(bb.subtype)) elif bb.operation == DEPOSIT: - list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) + list_sheet.write_string(rowx,2,get_deposit_display(bb.subtype)) list_sheet.write(rowx,3,bb.amount,money_format) - list_sheet.write(rowx,4,str(bb.cashier)) - list_sheet.write(rowx,5,bb.note,note_format) + list_sheet.write_string(rowx,4,str(bb.cashier)) + list_sheet.write_string(rowx,5,bb.note,note_format) + + for col in range(6): + list_sheet.write(rowx+1,col,'',line_format) #list_sheet formatting list_sheet.set_column('A:A', 15) list_sheet.set_column('E:E', 15) list_sheet.set_column('F:F', 80) + + elif what == 'ingresso': + + summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'ingressi', 'check1', 'check2', 'teorico', 'netto', 'cassiere', 'note'] + for i in range(0, len(summary_headers)): + sheet.write(0, i, summary_headers[i], header_format) + + rowx = 0 + qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) + for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): + data = get_entrance_summary(bb) + parent = EntranceBalance.objects.get_parent_o(bb) + sheet.write(rowx, 0, parent.date,date_format) + sheet.write(rowx, 1, data['opening_amount'],money_format) + if parent: + sheet.write(rowx, 2, data['wi'],money_format) + sheet.write(rowx, 3, data['de'],money_format) + sheet.write(rowx, 4, data['pa'],money_format) + sheet.write(rowx, 5, data['closing_amount'],money_format) + + sheet.write(rowx, 6, data['receipt_count'],money_format) + if rowx > 1: + sheet.write(rowx,7,'=B'+str(rowx+1)+'-F'+str(rowx),money_format) + sheet.write(rowx,8,'=K'+str(rowx+1)+'-J'+str(rowx+1),money_format) + sheet.write(rowx,9, '=G'+str(rowx+1)+'+D'+str(rowx+1)+'-E'+str(rowx+1)+'-C'+str(rowx+1),money_format) + sheet.write(rowx,10,'=F'+str(rowx+1)+'-B'+str(rowx+1),money_format) + sheet.write_string(rowx, 11, str(data['cashier'])) + sheet.write_string(rowx, 12, ''.join(data['notes']),note_format) + + for col in range(13): + sheet.write(rowx+1,col,'',line_format) + + #add column check + sheet.write(rowx+1,7,'=SUM(H3:H'+str(rowx+1)+')',check_format) + sheet.write(rowx+1,8,'=SUM(I2:I'+str(rowx+1)+')',check_format) + + ###sheet formatting + sheet.set_column('A:A', 15) + sheet.set_column('L:L',12) + sheet.set_column('M:M',80) + sheet.conditional_format('H2:I'+str(rowx+1), {'type': 'cell', + 'criteria': '<=', + 'value': -settings.MONEY_DELTA, + 'format': warning_under_format}) + sheet.conditional_format('H2:I'+str(rowx+1), {'type': 'cell', + 'criteria': '>=', + 'value': settings.MONEY_DELTA, + 'format': warning_over_format}) + sheet.conditional_format('H'+str(rowx+2)+':I'+str(rowx+2), {'type': 'cell', + 'criteria': '<=', + 'value': -settings.MONEY_DELTA, + 'format': check_under_format}) + sheet.conditional_format('H'+str(rowx+2)+':I'+str(rowx+2), {'type': 'cell', + 'criteria': '>=', + 'value': settings.MONEY_DELTA, + 'format': check_over_format}) + + list_headers = ['data','operazione','tipo','somma','cassiere','note'] + for i in range(0, len(list_headers)): + list_sheet.write(0, i, list_headers[i], header_format) + + qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) + for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): + + list_sheet.write(rowx,0,bb.date,date_format) + list_sheet.write_string(rowx,1,bb.get_operation_display()) + if bb.operation == PAYMENT: + list_sheet.write_string(rowx,2,get_payment_display(bb.subtype)) + elif bb.operation == DEPOSIT: + list_sheet.write_string(rowx,2,get_deposit_display(bb.subtype)) + list_sheet.write(rowx,3,bb.amount,money_format) + list_sheet.write_string(rowx,4,str(bb.cashier)) + list_sheet.write_string(rowx,5,bb.note,note_format) + + for col in range(6): + list_sheet.write(rowx+1,col,'',line_format) + + #list_sheet formatting + list_sheet.set_column('A:A', 15) + list_sheet.set_column('E:E', 15) + list_sheet.set_column('F:F', 80) + + elif what == 'interregno': + rowx = 0 + summary_headers = ['data', 'precedente', 'prelevati', 'depositati', 'pagamenti', 'ricevute','atteso','punto cassa', 'controllo', 'cassiere', 'note'] + for i in range(0, len(summary_headers)): + sheet.write_string(0, i, summary_headers[i], header_format) + + qf = Q(operation=CASHPOINT) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) + for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): + data = get_small_summary(bb) + #parent = SmallBalance.objects.get_parent_o(bb) + + sheet.write(rowx, 0, bb.date,date_format) + sheet.write(rowx, 1, data['last_checkpoint'],money_format) + sheet.write(rowx, 2, data['wi'],money_format) + sheet.write(rowx, 3, data['de'],money_format) + sheet.write(rowx, 4, data['pa'],money_format) + sheet.write(rowx, 5, data['receipt_count'],money_format) + sheet.write(rowx, 6, data['expected_checkpoint'],money_format) + sheet.write(rowx, 7, data['checkpoint'],money_format) + sheet.write(rowx, 8, data['check'],money_format) + sheet.write_string(rowx, 9, str(data['cashier'])) + sheet.write_string(rowx, 10, ''.join(data['notes']),note_format) + + for col in range(11): + sheet.write(rowx+1,col,'',line_format) + + #add column check + sheet.write(rowx+1,8,'=SUM(I2:I'+str(rowx+1)+')',check_format) + + sheet.set_column('A:A', 15) + sheet.set_column('J:J',12) + sheet.set_column('K:K',80) + + sheet.conditional_format('I2:I'+str(rowx+1), {'type': 'cell', + 'criteria': '<=', + 'value': -settings.MONEY_DELTA, + 'format': warning_under_format}) + sheet.conditional_format('I2:I'+str(rowx+1), {'type': 'cell', + 'criteria': '>=', + 'value': settings.MONEY_DELTA, + 'format': warning_over_format}) + sheet.conditional_format('I'+str(rowx+2)+':I'+str(rowx+2), {'type': 'cell', + 'criteria': '<=', + 'value': -settings.MONEY_DELTA, + 'format': check_under_format}) + sheet.conditional_format('I'+str(rowx+2)+':I'+str(rowx+2), {'type': 'cell', + 'criteria': '>=', + 'value': settings.MONEY_DELTA, + 'format': check_over_format}) + + list_headers = ['data','operazione','tipo','somma','cassiere','note'] + for i in range(0, len(list_headers)): + list_sheet.write_string(0, i, list_headers[i], header_format) + + qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) + for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): + list_sheet.write(rowx,0,bb.date) + list_sheet.write_string(rowx,1,bb.get_operation_display()) + if bb.operation == PAYMENT: + list_sheet.write_string(rowx,2,get_payment_display(bb.subtype)) + elif bb.operation == DEPOSIT: + list_sheet.write_string(rowx,2,get_deposit_display(bb.subtype)) + list_sheet.write(rowx,3,bb.amount,money_format) + list_sheet.write_string(rowx,4,str(bb.cashier)) + list_sheet.write_string(rowx,5,bb.note,note_format) + + for col in range(6): + list_sheet.write(rowx+1,col,'',line_format) + + + #list_sheet formatting + list_sheet.set_column('A:A', 15) + list_sheet.set_column('E:E', 15) + list_sheet.set_column('F:F', 80) + else: raise Http404 @@ -315,6 +295,192 @@ def excel_writer(request, what, from_day, from_month, from_year, to_day, to_mont return response +# def excel(request, what, from_day, from_month, from_year, to_day, to_month, to_year): +# ''' generate an excel with the full balance for this reference period ''' +# +# from_datetime = datetime.datetime(int(from_year), int(from_month), int(from_day)) +# to_datetime = datetime.datetime(int(to_year), int(to_month), int(to_day), hour=23, minute=59) + datetime.timedelta(hours=12) +# +# output_name = 'bilancio_'+what+'_fusolab.xls' +# response = HttpResponse(mimetype="application/ms-excel") +# response['Content-Disposition'] = 'attachment;filename="%s"' % (output_name ) +# +# book = xlwt.Workbook(encoding='utf8') +# +# ### create the sheet for the summary and another for the transaction list### +# sheet = book.add_sheet('riepilogo') +# list_sheet = book.add_sheet('elenco') +# +# #set the headers +# header_style = xlwt.XFStyle() # Create the Style +# font = xlwt.Font() # Create the Font +# font.bold = True +# header_style.font = font # set the font +# borders = xlwt.Borders() +# borders.bottom = xlwt.Borders.THICK +# header_style.borders = borders #set the border +# pattern = xlwt.Pattern() +# pattern.pattern = xlwt.Pattern.SOLID_PATTERN +# pattern.pattern_fore_colour = 22 +# header_style.pattern = pattern +# +# algn1 = xlwt.Alignment() +# algn1.wrap = 1 +# note_style = xlwt.XFStyle() +# note_style.alignment = algn1 +# +# if what == 'bar': +# +# +# summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'cassiere', 'note', 'totale scontrini', 'check1', 'check2', 'ricavi', 'costi', 'risultato'] +# for i in range(0, len(summary_headers)): +# sheet.write(0, i, summary_headers[i], header_style) +# tall_style = xlwt.easyxf('font:height 720;') # 36pt +# sheet.row(0).set_style(tall_style) +# +# list_headers = ['data','operazione','tipo','somma','cassiere','note'] +# for i in range(0, len(list_headers)): +# list_sheet.write(0, i, list_headers[i], header_style) +# list_sheet.row(0).set_style(tall_style) +# +# qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(BarBalance.objects.filter(qf).order_by('date'), start=1): +# list_sheet.write(rowx,0,str(bb.date)) +# list_sheet.write(rowx,1,bb.get_operation_display()) +# if bb.operation == PAYMENT: +# list_sheet.write(rowx,2,get_payment_display(bb.subtype)) +# elif bb.operation == DEPOSIT: +# list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) +# list_sheet.write(rowx,3,bb.amount) +# list_sheet.write(rowx,4,str(bb.cashier)) +# list_sheet.write(rowx,5,bb.note) +# +# qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(BarBalance.objects.filter(qf).order_by('date'), start=1): +# data = get_bar_summary(bb) +# parent = BarBalance.objects.get_parent_o(bb) +# sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) +# sheet.write(rowx, 1, data['opening_amount']) +# if parent: +# sheet.write(rowx, 2, data['wi']) +# sheet.write(rowx, 3, data['de']) +# sheet.write(rowx, 4, data['pa']) +# #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) +# #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) +# #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) +# sheet.write(rowx, 5, data['closing_amount']) +# sheet.write(rowx, 6, str(data['cashier'])) +# sheet.write(rowx, 7, data['notes'],note_style) +# sheet.write(rowx, 8, data['receipt_count']) +# # excel rows start from one +# if rowx != 1: +# sheet.write(rowx, 9, xlwt.Formula('B%d-F%d' % (rowx+1, rowx-1+1))) #check1 +# sheet.write(rowx, 10, xlwt.Formula('L%d+M%d-I%d' % (rowx+1, rowx+1, rowx+1))) #check2 +# sheet.write(rowx, 11, xlwt.Formula('F%d-B%d' % (rowx+1, rowx+1))) #ricavi +# sheet.write(rowx, 12, xlwt.Formula('E%d+C%d-D%d' % (rowx+1, rowx+1, rowx+1))) #costi +# sheet.write(rowx, 13, xlwt.Formula('L%d-M%d' % (rowx+1, rowx+1))) #risultato +# +# elif what == 'ingresso': +# +# +# summary_headers = ['data', 'apertura', 'prelevati', 'depositati', 'pagamenti', 'chiusura', 'cassiere', 'note', 'totale ingressi', 'check1', 'check2', 'ricavi', 'costi', 'risultato'] +# for i in range(0, len(summary_headers)): +# sheet.write(0, i, summary_headers[i], header_style) +# tall_style = xlwt.easyxf('font:height 720;') # 36pt +# sheet.row(0).set_style(tall_style) +# +# list_headers = ['data','operazione','tipo','somma','cassiere','note'] +# for i in range(0, len(list_headers)): +# list_sheet.write(0, i, list_headers[i], header_style) +# list_sheet.row(0).set_style(tall_style) +# +# qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): +# list_sheet.write(rowx,0,str(bb.date)) +# list_sheet.write(rowx,1,bb.get_operation_display()) +# if bb.operation == PAYMENT: +# list_sheet.write(rowx,2,get_payment_display(bb.subtype)) +# elif bb.operation == DEPOSIT: +# list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) +# list_sheet.write(rowx,3,bb.amount) +# list_sheet.write(rowx,4,str(bb.cashier)) +# list_sheet.write(rowx,5,bb.note) +# +# qf = Q(operation=CLOSING) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(EntranceBalance.objects.filter(qf).order_by('date'), start=1): +# data = get_entrance_summary(bb) +# parent = EntranceBalance.objects.get_parent_o(bb) +# sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) +# sheet.write(rowx, 1, data['opening_amount']) +# if parent: +# sheet.write(rowx, 2, data['wi']) +# sheet.write(rowx, 3, data['de']) +# sheet.write(rowx, 4, data['pa']) +# #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) +# #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) +# #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) +# sheet.write(rowx, 5, data['closing_amount']) +# sheet.write(rowx, 6, str(data['cashier'])) +# sheet.write(rowx, 7, data['notes'],note_style) +# sheet.write(rowx, 8, data['receipt_count']) +# # excel rows start from one +# if rowx != 1: +# sheet.write(rowx, 9, xlwt.Formula('B%d-F%d' % (rowx+1, rowx-1+1))) #check1 +# sheet.write(rowx, 10, xlwt.Formula('L%d+M%d-I%d' % (rowx+1, rowx+1, rowx+1))) #check2 +# sheet.write(rowx, 11, xlwt.Formula('F%d-B%d' % (rowx+1, rowx+1))) #ricavi +# sheet.write(rowx, 12, xlwt.Formula('E%d+C%d-D%d' % (rowx+1, rowx+1, rowx+1))) #costi +# sheet.write(rowx, 13, xlwt.Formula('L%d-M%d' % (rowx+1, rowx+1))) #risultato +# +# elif what == 'interregno': +# +# +# summary_headers = ['data', 'punto di cassa precedente', 'prelevati', 'depositati', 'pagamenti', 'cassiere', 'note', 'totale ricevute','atteso','punto di cassa', 'controllo cassa'] +# for i in range(0, len(summary_headers)): +# sheet.write(0, i, summary_headers[i], header_style) +# tall_style = xlwt.easyxf('font:height 720;') # 36pt +# sheet.row(0).set_style(tall_style) +# +# list_headers = ['data','operazione','tipo','somma','cassiere','note'] +# for i in range(0, len(list_headers)): +# list_sheet.write(0, i, list_headers[i], header_style) +# list_sheet.row(0).set_style(tall_style) +# +# qf = Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): +# list_sheet.write(rowx,0,str(bb.date)) +# list_sheet.write(rowx,1,bb.get_operation_display()) +# if bb.operation == PAYMENT: +# list_sheet.write(rowx,2,get_payment_display(bb.subtype)) +# elif bb.operation == DEPOSIT: +# list_sheet.write(rowx,2,get_deposit_display(bb.subtype)) +# list_sheet.write(rowx,3,bb.amount) +# list_sheet.write(rowx,4,str(bb.cashier)) +# list_sheet.write(rowx,5,bb.note) +# +# qf = Q(operation=CASHPOINT) & Q(date__lte=to_datetime) & Q(date__gte=from_datetime) +# for rowx, bb in enumerate(SmallBalance.objects.filter(qf).order_by('date'), start=1): +# data = get_small_summary(bb) +# #parent = SmallBalance.objects.get_parent_o(bb) +# +# sheet.write(rowx, 0, data['date'], xlwt.easyxf(num_format_str='dd/mm/yyyy') ) +# sheet.write(rowx, 1, data['last_checkpoint']) +# sheet.write(rowx, 2, data['wi']) +# sheet.write(rowx, 3, data['de']) +# sheet.write(rowx, 4, data['pa']) +# #sheet.write(rowx, 2, BarBalance.objects.get_withdraws_for(parent)) +# #sheet.write(rowx, 3, BarBalance.objects.get_deposits_for(parent)) +# #sheet.write(rowx, 4, BarBalance.objects.get_payments_for(parent)) +# sheet.write(rowx, 5, str(data['cashier'])) +# sheet.write(rowx, 6, data['notes'],note_style) +# sheet.write(rowx, 7, data['receipt_count']) +# sheet.write(rowx, 8, data['expected_checkpoint']) +# sheet.write(rowx, 9, data['checkpoint']) +# sheet.write(rowx, 10, data['check']) +# else: +# raise Http404 +# +# book.save(response) +# return response #def reports(request): # return render_to_response('base/reports.html', {} , context_instance=RequestContext(request)) diff --git a/fusolab2_0/common/templates/index.html b/fusolab2_0/common/templates/index.html index 0fefc67..2b87461 100644 --- a/fusolab2_0/common/templates/index.html +++ b/fusolab2_0/common/templates/index.html @@ -60,10 +60,10 @@

- +
- +
diff --git a/fusolab2_0/common/templates/reports/daily_stats.html b/fusolab2_0/common/templates/reports/daily_stats.html index 2412b80..4e3818f 100644 --- a/fusolab2_0/common/templates/reports/daily_stats.html +++ b/fusolab2_0/common/templates/reports/daily_stats.html @@ -32,8 +32,8 @@

Incassi