add invoice template in pdf for license, clear

prod
Dmitriy Shesterkin 9 years ago
parent cad014d17c
commit b7f6244b34
  1. BIN
      extra/boss_sign.png
  2. BIN
      extra/gb_sign.png
  3. BIN
      extra/stamp.png
  4. 14
      src/customer/models.py
  5. 16
      src/customer/urls.py
  6. 172
      src/customer/views/documents.py
  7. 2
      src/docs/views/invoice.py
  8. 23
      src/dokumentor/settings/common.py
  9. 6
      src/dokumentor/urls.py
  10. BIN
      templates/xls/4pd.xls
  11. BIN
      templates/xls/act.xls
  12. BIN
      templates/xls/bill.xls
  13. BIN
      templates/xls/stamp.bmp
  14. BIN
      templates/xls/stamp1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

@ -194,9 +194,6 @@ class UserProfile(models.Model):
verbose_name = 'Реквизиты (профиль)' verbose_name = 'Реквизиты (профиль)'
verbose_name_plural = 'Реквизиты (профили)' verbose_name_plural = 'Реквизиты (профили)'
def __unicode__(self):
return '%s, ИНН %s' % (self.get_company_name()[0:30], self.inn or 'не указан')
def __str__(self): def __str__(self):
return '%s, ИНН %s' % (self.get_company_name()[0:30], self.inn or 'не указан') return '%s, ИНН %s' % (self.get_company_name()[0:30], self.inn or 'не указан')
@ -600,16 +597,15 @@ class License(models.Model):
if self.status == 0: if self.status == 0:
if self.payform == 0: if self.payform == 0:
url = reverse('customer_license_get_doc', kwargs={'order_num': self.id}) url = reverse(
'customer_license_get_payment_account',
kwargs={'order_num': self.id}
)
return f'<a href="{url}">Оплата безналичным платежом</a>' return f'<a href="{url}">Оплата безналичным платежом</a>'
# redirect to pay terminal with data
elif self.payform == 1: elif self.payform == 1:
return f'<a href="#">Оплата банковской картой</a>' return f'<a href="#">Оплата банковской картой</a>'
elif self.payform == 2:
url = reverse('customer_license_get_doc', kwargs={'order_num': self.id})
return f'<a href="{url}">Скачать квитанцию</a>'
elif self.status in [1, 2]: elif self.status in [1, 2]:
url = '#' url = '#'
cost_str = f'{self.pay_sum} ' \ cost_str = f'{self.pay_sum} ' \

@ -17,11 +17,16 @@ urlpatterns = [
url(r'^license/$', license.order_license, name='customer_order_license'), url(r'^license/$', license.order_license, name='customer_order_license'),
url(r'^delete_license/(?P<pk>\d+)/$', license.delete_license, url(r'^delete_license/(?P<pk>\d+)/$', license.delete_license,
name='customer_delete_license'), name='customer_delete_license'),
url(r'^get_doc/(?P<order_num>\d+)/$', documents.get_doc, # for delete
name='customer_license_get_doc'), # url(r'^get_doc/(?P<order_num>\d+)/$', documents.get_doc,
url(r'^payment/result/$', license.payment_result, name='yamoney_result'), # name='customer_license_get_doc'),
url(r'^payment/success/$', license.payment_success, name='yamoney_success'),
url(r'^payment/fail/$', license.payment_fail, name='yamoney_fail'), url(r'^get_payment_account/(?P<order_num>\d+)/$', documents.create_payment_account,
name='customer_license_get_payment_account'),
# for delete
# url(r'^payment/result/$', license.payment_result, name='yamoney_result'),
# url(r'^payment/success/$', license.payment_success, name='yamoney_success'),
# url(r'^payment/fail/$', license.payment_fail, name='yamoney_fail'),
# for delete # for delete
# url(r'^license_list/$', license.license_list, name='customer_license_list'), # url(r'^license_list/$', license.license_list, name='customer_license_list'),
# url(r'^paid_list/$', license.paid_list, name='customer_paid_list'), # url(r'^paid_list/$', license.paid_list, name='customer_paid_list'),
@ -81,6 +86,5 @@ urlpatterns = [
url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax, url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax,
name='customer_clients_delete_ajax'), name='customer_clients_delete_ajax'),
# url(r'^tmp_upload/ajax/$', profile.tmp_upload, name='upload_tmp_file'),
url(r'^upload-image/ajax/$', profile.upload_image, name='upload-image'), url(r'^upload-image/ajax/$', profile.upload_image, name='upload-image'),
] ]

@ -1,109 +1,87 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import re
from django.conf import settings from django.conf import settings
from django.http import Http404, HttpResponseForbidden, HttpResponse from django.http import HttpResponseForbidden, HttpResponse
from xlwt import easyxf
from xlrd import open_workbook
from xlutils.copy import copy
from pytils.numeral import rubles
from commons.pdf_tools import render_pdf_to_string
from customer.models import License from customer.models import License
from customer.utils import raise_if_no_profile from customer.utils import raise_if_no_profile
XLS_ROOT = os.path.join(settings.TEMPLATES[0]['DIRS'][0], 'xls') def create_payment_account(request, order_num=None):
def get_doc(request, order_num=None):
if not request.user.is_authenticated(): if not request.user.is_authenticated():
raise HttpResponseForbidden raise HttpResponseForbidden
raise_if_no_profile(request) raise_if_no_profile(request)
license = License.objects.get(pk=order_num) lic = License.objects.get(pk=order_num)
pm = license.payform pay_form = lic.payform
data = request.user.profile customer = request.user.profile
if pm == 0:
tmp_name = 'bill.xls' response = HttpResponse(content_type='application/pdf')
file_name = f"Invoice No.{order_num}.xls"
elif pm == 2: profile = {
tmp_name = '4pd.xls' 'is_org': True,
file_name = f"Kvitanciya na oplatu zakaza No.{order_num}.xls" 'get_company_name': settings.OWNER['NAME'],
else: 'address': settings.OWNER['ADDRESS'],
raise Http404() 'phone': settings.OWNER['PHONE'],
'get_full_phone': settings.OWNER['PHONE'],
response = HttpResponse(content_type="application/vnd.ms-excel") 'inn': settings.OWNER['INN'],
response['Content-Disposition'] = f'attachment; filename={file_name}' 'kpp': settings.OWNER['KPP'],
'get_boss_fio': settings.OWNER['BOSS'],
rb = open_workbook(os.path.join(XLS_ROOT, tmp_name), on_demand=True, formatting_info=True) 'get_boss_title': settings.OWNER['POSITION_BOSS'],
wb = copy(rb) 'get_glavbuh_fio': settings.OWNER['GB'],
ws = wb.get_sheet(0) 'boss_sign': {
'path': settings.OWNER['SIGN_BOSS']
# отключить колонтитулы },
ws.show_headers = 0 'glavbuh_sign': {
ws.print_headers = 0 'path': settings.OWNER['SIGN_GB']
ws.header_str = b'' },
ws.footer_str = b'' 'stamp': {
'path': settings.OWNER['STAMP']
# заполняем счет }
if pm == 0: }
style0 = easyxf('font: name Times New Roman, height 280, bold True;')
style0_center = \ if pay_form == 0:
easyxf('font: name Times New Roman, height 280, bold True; align: horiz center') response['Content-Disposition'] = \
style1 = easyxf('font: name Times New Roman, height 180;') f'attachment; filename="Schet_{order_num}_Dokumentor-ru.pdf"'
style2 = easyxf('font: name Times New Roman, height 180, bold True;')
style3 = easyxf('font: name Times New Roman, height 180;' obj = {
'border: top thin, left thin, right thin, bottom thin;' 'bank_account': {
) 'name': settings.OWNER['BANK'],
style4 = easyxf('font: name Times New Roman, height 180, bold True;' 'account': settings.OWNER['BANK_ACC'],
'border: top thin, left thin, right thin, bottom thin;' 'korr_account': settings.OWNER['CORR_ACC'],
) 'bik': settings.OWNER['BIK']
style4.num_format_str = "#,##0.00" },
'client': {
ws.write(11, 0, f"СЧЕТ № {order_num} от {license.order_date.strftime('%d.%m.%Y')}", 'name': customer.get_company_name(),
style0_center) 'get_inn_and_kpp': customer.get_inn_and_kpp(),
ws.write(13, 0, f"Покупатель: {data.name}", style1) 'address': customer.address,
ws.write(16, 2, f"Лицензия Dokumentor.ru на {license.get_term()}", style3) 'contact_phone': customer.get_full_phone()
},
style3.num_format_str = "#,##0.00" 'doc_num': order_num,
'doc_date': lic.order_date,
ws.write(16, 36, license.pay_sum, style3) 'total_price': lic.pay_sum,
ws.write(16, 44, license.pay_sum, style3) 'sum_total_nds': 0,
ws.write(17, 44, license.pay_sum, style4) 'nds_itogo_text': 'Без налога (НДС)',
ws.write(19, 44, license.pay_sum, style4) 'sum_total_price': lic.pay_sum,
ws.write(21, 0, f"Всего наименование 1, на сумму {license.pay_sum},00 руб.", style1) 'sum_full_total_price': lic.pay_sum
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) obj_items = [{
'name': f'Лицензия на ПО Dokumentor на {lic.get_term()}',
# заполняем квитанцию 'units': 'услуги',
elif pm == 2: 'qty': 1,
style0 = easyxf('font: name Times New Roman, height 160, bold True;' 'price': lic.pay_sum,
'border: bottom thin;' 'total_price': lic.pay_sum
) }]
style1 = easyxf('font: name Times New Roman, height 160, bold True;'
'border: bottom thin;' dictionary = {
'align: horiz center;' 'obj': obj,
) 'doc_sign': True,
'obj_items': obj_items,
# заполняем оригинал 'profile': profile,
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) pdf = render_pdf_to_string(request, 'docs/invoice/as_pdf.html', dictionary)
ws.write(15, 11, license.pay_sum, style1) response.write(pdf)
return response
# заполняем копию
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

@ -46,7 +46,7 @@ class InvoiceViews(BaseItemsViews):
# для генерации pdf/xls # для генерации pdf/xls
PDF_TEMPLATE = 'docs/invoice/as_pdf.html' PDF_TEMPLATE = 'docs/invoice/as_pdf.html'
XLS_TEMPLATE = 'invoice.xls' XLS_TEMPLATE = 'invoice.xls'
FILENAME = u'Счет № %s, %s' # без расширения FILENAME = 'Счет № %s, %s' # без расширения
MAYBE_SIGNED = True MAYBE_SIGNED = True
# --- грамматика для вывода наименований в шаблонах # --- грамматика для вывода наименований в шаблонах

@ -219,7 +219,7 @@ CMS_PLACEHOLDER_CONF = {
}, },
} }
CMS_PERMISSION = True CMS_PERMISSION = False
BROKER_URL = e.get('CELERY_BROKER_URL') BROKER_URL = e.get('CELERY_BROKER_URL')
CELERY_RESULT_BACKEND = e.get('CELERY_RESULT_BACKEND') CELERY_RESULT_BACKEND = e.get('CELERY_RESULT_BACKEND')
@ -281,7 +281,8 @@ THUMBNAIL_PROCESSORS = (
) )
RAVEN_CONFIG = { RAVEN_CONFIG = {
'dsn': 'http://02d524ef0d044bdfae0b39546b752cb2:1e025305594d4532ae93125372dcde50@sentry.mitri4.pro/1', 'dsn': 'http://02d524ef0d044bdfae0b39546b752cb2:'
'1e025305594d4532ae93125372dcde50@sentry.mitri4.pro/1',
# If you are using git, you can also automatically configure the # If you are using git, you can also automatically configure the
# release based on the git info. # release based on the git info.
'release': raven.fetch_git_sha(ROOT_DIR), 'release': raven.fetch_git_sha(ROOT_DIR),
@ -308,6 +309,24 @@ DADATA_SECRET_KEY = '9c5c3fdfba74af122730db650346b3e91586abc7'
SITE_URL = 'https://dokumentor.ru' SITE_URL = 'https://dokumentor.ru'
OWNER = {
'NAME': 'ООО "СетьИнвест"',
'INN': '5190051810',
'KPP': '519001001',
'ADDRESS': '183036, г. Мурманск, ул. Скальная, д. 29, оф. 49',
'PHONE': '+7 (909) 560-88-80',
'BANK': 'ФИЛИАЛ "САНКТ-ПЕТЕРБУРГСКИЙ" АО "АЛЬФА-БАНК"',
'BANK_ACC': '40702810532160002516',
'BIK': '044030786',
'CORR_ACC': '30101810600000000786',
'POSITION_BOSS': 'Руководитель организации',
'BOSS': 'Костенко А.Ю',
'GB': 'Костенко Д.Ю',
'STAMP': os.path.join(ROOT_DIR, 'extra', 'stamp.png'),
'SIGN_BOSS': os.path.join(ROOT_DIR, 'extra', 'boss_sign.png'),
'SIGN_GB': os.path.join(ROOT_DIR, 'extra', 'gb_sign.png')
}
LOGGING = { LOGGING = {
'version': 1, 'version': 1,
'disable_existing_loggers': True, 'disable_existing_loggers': True,

@ -5,6 +5,7 @@ from django.conf.urls import include, url
import autocomplete_light import autocomplete_light
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.views.generic import RedirectView
admin.autodiscover() admin.autodiscover()
autocomplete_light.autodiscover() autocomplete_light.autodiscover()
@ -14,8 +15,11 @@ admin.site.index_title = 'Документор'
admin.site.site_title = 'Документор' admin.site.site_title = 'Документор'
urlpatterns = [ urlpatterns = [
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^favicon\.ico$',
RedirectView.as_view(url=settings.STATIC_URL + 'favicon.ico')
),
url(r'autocomplete/', include('autocomplete_light.urls')), url(r'autocomplete/', include('autocomplete_light.urls')),
url(r'^$', 'pages.views.site_index', name='site_index'), url(r'^$', 'pages.views.site_index', name='site_index'),
url(r'^my/', include('customer.urls')), url(r'^my/', include('customer.urls')),

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Loading…
Cancel
Save