You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.0 KiB
109 lines
4.0 KiB
# -*- coding: utf-8 -*-
|
|
import os
|
|
import re
|
|
|
|
from django.conf import settings
|
|
from django.http import Http404, HttpResponseForbidden, HttpResponse
|
|
|
|
from xlwt import easyxf
|
|
from xlrd import open_workbook
|
|
from xlutils.copy import copy
|
|
from pytils.numeral import rubles
|
|
|
|
from customer.models import License
|
|
from customer.utils import raise_if_no_profile
|
|
|
|
|
|
XLS_ROOT = os.path.join(settings.TEMPLATES[0]['DIRS'][0], 'xls')
|
|
|
|
|
|
def get_doc(request, order_num=None):
|
|
if not request.user.is_authenticated():
|
|
raise HttpResponseForbidden
|
|
|
|
raise_if_no_profile(request)
|
|
|
|
license = License.objects.get(pk=order_num)
|
|
pm = license.payform
|
|
data = request.user.profile
|
|
if pm == 0:
|
|
tmp_name = 'bill.xls'
|
|
file_name = f"Invoice No.{order_num}.xls"
|
|
elif pm == 2:
|
|
tmp_name = '4pd.xls'
|
|
file_name = f"Kvitanciya na oplatu zakaza No.{order_num}.xls"
|
|
else:
|
|
raise Http404()
|
|
|
|
response = HttpResponse(content_type="application/vnd.ms-excel")
|
|
response['Content-Disposition'] = f'attachment; filename={file_name}'
|
|
|
|
rb = open_workbook(os.path.join(XLS_ROOT, tmp_name), on_demand=True, formatting_info=True)
|
|
wb = copy(rb)
|
|
ws = wb.get_sheet(0)
|
|
|
|
# отключить колонтитулы
|
|
ws.show_headers = 0
|
|
ws.print_headers = 0
|
|
ws.header_str = b''
|
|
ws.footer_str = b''
|
|
|
|
# заполняем счет
|
|
if pm == 0:
|
|
style0 = easyxf('font: name Times New Roman, height 280, bold True;')
|
|
style0_center = \
|
|
easyxf('font: name Times New Roman, height 280, bold True; align: horiz center')
|
|
style1 = easyxf('font: name Times New Roman, height 180;')
|
|
style2 = easyxf('font: name Times New Roman, height 180, bold True;')
|
|
style3 = easyxf('font: name Times New Roman, height 180;'
|
|
'border: top thin, left thin, right thin, bottom thin;'
|
|
)
|
|
style4 = easyxf('font: name Times New Roman, height 180, bold True;'
|
|
'border: top thin, left thin, right thin, bottom thin;'
|
|
)
|
|
style4.num_format_str = "#,##0.00"
|
|
|
|
ws.write(11, 0, f"СЧЕТ № {order_num} от {license.order_date.strftime('%d.%m.%Y')}",
|
|
style0_center)
|
|
ws.write(13, 0, f"Покупатель: {data.name}", style1)
|
|
ws.write(16, 2, f"Лицензия Dokumentor.ru на {license.get_term()}", style3)
|
|
|
|
style3.num_format_str = "#,##0.00"
|
|
|
|
ws.write(16, 36, license.pay_sum, style3)
|
|
ws.write(16, 44, license.pay_sum, style3)
|
|
ws.write(17, 44, license.pay_sum, style4)
|
|
ws.write(19, 44, license.pay_sum, style4)
|
|
ws.write(21, 0, f"Всего наименование 1, на сумму {license.pay_sum},00 руб.", style1)
|
|
ws.write(23, 0, f"{rubles(license.pay_sum).capitalize()}.", style2)
|
|
|
|
ws.insert_bitmap(os.path.join(XLS_ROOT, 'stamp.bmp'), 26, 12, y=3, scale_y=1.1)
|
|
|
|
# заполняем квитанцию
|
|
elif pm == 2:
|
|
style0 = easyxf('font: name Times New Roman, height 160, bold True;'
|
|
'border: bottom thin;'
|
|
)
|
|
style1 = easyxf('font: name Times New Roman, height 160, bold True;'
|
|
'border: bottom thin;'
|
|
'align: horiz center;'
|
|
)
|
|
|
|
# заполняем оригинал
|
|
ws.write(11, 4, f"Лицензия Dokumentor.ru на {license.get_term()}", style1)
|
|
ws.write(13, 13, data.get_boss_fio(), style0)
|
|
ws.write(14, 13, re.sub("^\s+|\n|\r|\s+$", ' ', data.address), style0)
|
|
ws.write(15, 11, license.pay_sum, style1)
|
|
|
|
# заполняем копию
|
|
ws.write(31, 4, u"Лицензия Dokumentor.ru на %s" % (license.get_term()), style1)
|
|
ws.write(33, 13, data.get_boss_fio(), style0)
|
|
ws.write(34, 13, re.sub("^\s+|\n|\r|\s+$", ' ', data.address), style0)
|
|
ws.write(35, 11, license.pay_sum, style1)
|
|
|
|
else:
|
|
raise Http404()
|
|
|
|
wb.save(response)
|
|
|
|
return response
|
|
|