mekup doc faktura, some pep8

prod
Dmitriy Shesterkin 9 years ago
parent 8d21128bf6
commit f1ca23ce6e
  1. 29
      src/customer/admin.py
  2. 1
      src/customer/apps.py
  3. 22
      src/customer/context_processors.py
  4. 139
      src/customer/forms.py
  5. 3
      src/customer/views/bank_accounts.py
  6. 2
      src/docs/autocomplete_light_registry.py
  7. 3
      src/docs/forms/faktura.py
  8. 22
      src/docs/views/aktsverki.py
  9. 42
      src/docs/views/faktura.py
  10. 43
      src/dokumentor/static/css/style.css
  11. 4
      src/dokumentor/static/js/client.commons.js
  12. 41
      src/dokumentor/static/js/dialogs.js
  13. 22
      src/dokumentor/templates/docs/faktura/form.html
  14. 5
      src/dokumentor/templates/docs/parts/form_client_choices.html
  15. 2
      src/dokumentor/templates/docs/parts/form_field_client.html
  16. 2
      src/dokumentor/templates/docs/parts/form_field_receiver.html
  17. 2
      src/dokumentor/templates/docs/parts/form_field_sender.html
  18. 45
      src/dokumentor/templates/docs/stub_js.html

@ -10,25 +10,14 @@ class UserProfileAdmin(admin.ModelAdmin):
list_display_links = list_display
form = forms.UserProfileAdminForm
class LicenseAdmin(admin.ModelAdmin):
list_display = ('get_company', 'term', 'status', 'order_date', 'date_from', 'date_to')
list_display_links = list_display
search_fields = ('company__email', )
search_fields = ('company__email',)
list_filter = ('status', 'term', 'order_date', 'date_from', 'date_to')
#TODO прописать fieldsets
# fieldsets = [
# (None, {'fields': ['user',]}),
# (None, {'fields': ['profile_type',]}),
# (None, {'fields': ['name', 'phone_code', 'phone', 'address', 'inn',]}),
# (None, {'fields': ['add_glavbuh_sign', 'glavbuh_fio',]}),
# (None, {'fields': ['v_litce', 'na_osnovanii',]}),
# (u'ИП', {'fields': ['ip_surname', 'ip_name', 'ip_midname', 'ip_kod_okpo',]}),
# (u'Организация', {'fields': ['org_boss_name', 'org_kpp',]}),
# (u'Печать и подписи', {'fields': ['boss_sign', 'glavbuh_sign', 'stamp',]}),
# ]
class BankAccountAdmin(admin.ModelAdmin):
class Media:
@ -48,15 +37,15 @@ class ClientAdmin(admin.ModelAdmin):
form = forms.ClientAdminForm
fieldsets = [
(None, {'fields': ['company',]}),
(None, {'fields': ['name', 'inn', 'address', 'ogrn',]}),
(u'ИП', {'fields': ['okpo',]}),
(u'Организация', {'fields': ['kpp',]}),
(None, {'fields': ['company']}),
(None, {'fields': ['name', 'inn', 'address', 'ogrn']}),
(u'ИП', {'fields': ['okpo']}),
(u'Организация', {'fields': ['kpp', ]}),
(u'Банковские реквизиты',
{'fields': ['bank_bik', 'bank_name', 'bank_korr_account', 'bank_account',]}),
{'fields': ['bank_bik', 'bank_name', 'bank_korr_account', 'bank_account']}),
(u'Контакты',
{'fields': ['contact_name', 'contact_email', 'contact_phone', 'contact_skype',
'contact_other',]}),
{'fields': ['contact_name', 'contact_email',
'contact_phone', 'contact_skype', 'contact_other']}),
]

@ -5,4 +5,3 @@ from django.apps import AppConfig
class CustomerConfig(AppConfig):
name = 'customer'
verbose_name = 'Клиенты'

@ -12,7 +12,12 @@ def license_check_soon_ends(request):
cur_license = cache.get('cur_license_%s' % (request.user.username,), None)
if not days_left or not cur_license:
now = datetime.today()
cur_license = License.objects.filter(company=request.user.profile, date_from__lte=now, date_to__gte=now, status__in=[-1, 1, 2], deleted=False)
cur_license = License.objects.filter(
company=request.user.profile, date_from__lte=now,
date_to__gte=now,
status__in=[-1, 1, 2],
deleted=False
)
if cur_license:
cur_license = cur_license[0]
days_left = (cur_license.date_to - now.date()).days
@ -22,8 +27,17 @@ def license_check_soon_ends(request):
if not license_cookie:
now = datetime.today()
if license_15days is None:
licenses_ends = License.objects.filter(company=request.user.profile, date_to__lte=now + timedelta(15), status__in=[-1, 1, 2], deleted=False)
next_licenses = License.objects.filter(company=request.user.profile, status=1, deleted=False)
licenses_ends = License.objects.filter(
company=request.user.profile,
date_to__lte=now + timedelta(15),
status__in=[-1, 1, 2],
deleted=False
)
next_licenses = License.objects.filter(
company=request.user.profile,
status=1,
deleted=False
)
if licenses_ends and not next_licenses:
days_to_end = licenses_ends[0].date_to
cache.set('license_15_%s' % (request.user.username,), days_to_end, 3600)
@ -38,4 +52,4 @@ def license_check_soon_ends(request):
}
except Exception as e:
# print e
return { }
return {}

@ -12,7 +12,8 @@ from django.forms.utils import ErrorList
from django.forms.forms import NON_FIELD_ERRORS
FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb
FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ',
2621440) # default 2.5Mb
def get_profile_form_class(profile_type):
@ -33,18 +34,15 @@ def get_profile_filters_form_class(profile_type):
return None
###
def _numeric(field):
real_maxlength = field.widget.attrs['maxlength']
return {
'maxlength': int(real_maxlength)*3, # set fake maxlength. otherwise browser would cut pasted values too early
'maxlength': int(real_maxlength) * 3,
# set fake maxlength. otherwise browser would cut pasted values too early
'data-type': 'number', # used by jquery selector
'data-maxlength': real_maxlength, # save real maxlength
}
# -----------------------------------------------------------------------------
class UserProfileForm(MyBaseModelForm):
"""Общая форма редактирования профиля пользователя.
@ -77,8 +75,8 @@ class UserProfileForm(MyBaseModelForm):
def _check_file_size(self, image):
"""Ограничить максимальный размер загружаемого файла."""
if image and image.size > FILE_UPLOAD_MAX_MEMORY_SIZE:
raise forms.ValidationError(
u'Размер изображения превышает %i Мб' % (FILE_UPLOAD_MAX_MEMORY_SIZE / (1024*1024)))
raise forms.ValidationError(u'Размер изображения превышает %i Мб' % (
FILE_UPLOAD_MAX_MEMORY_SIZE / (1024 * 1024)))
return image
def clean_boss_sign(self):
@ -113,7 +111,8 @@ class IpUserProfileForm(UserProfileForm):
# фио главбуха
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname',
# контактная информация - адреса, телефон, факс, почта, сайт
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site',
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax',
'email', 'site',
# подписи, печать и логотип
'boss_sign', 'glavbuh_sign', 'stamp', 'logo',
'tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp',
@ -136,7 +135,8 @@ class OrgUserProfileForm(UserProfileForm):
# фио главбуха
'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname',
# контактная информация - адреса, телефон, факс, почта, сайт
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site',
'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax',
'email', 'site',
# подписи, печать и логотип
'boss_sign', 'glavbuh_sign', 'stamp', 'logo',
'tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp',
@ -146,7 +146,8 @@ class OrgUserProfileForm(UserProfileForm):
class UserProfileAdminForm(UserProfileForm):
"""Форма редактирования профиля - для админки."""
# условно-обязательные поля, проверять отдельно - могут быть обязательны в зависимости от типа профиля
# условно-обязательные поля, проверять отдельно -
# могут быть обязательны в зависимости от типа профиля
unset_required = [
# для ИП
'kpp', 'name'
@ -168,16 +169,17 @@ class UserProfileAdminForm(UserProfileForm):
org_boss_name = cleaned_data.get('org_boss_name')
kpp = cleaned_data.get('kpp')
if not org_boss_name: set_field_error(self, 'org_boss_name')
if not kpp: set_field_error(self, 'kpp')
if not org_boss_name:
set_field_error(self, 'org_boss_name')
if not kpp:
set_field_error(self, 'kpp')
return cleaned_data
# -----------------------------------------------------------------------------
class BankAccountForm(forms.ModelForm):
"""Форма редактирования расчетных счетов."""
class Meta:
model = models.BankAccount
fields = ('bik', 'name', 'short_name', 'korr_account', 'account', 'is_main', 'company')
@ -198,6 +200,7 @@ class BankAccountForm(forms.ModelForm):
class BankAccountAdminForm(BankAccountForm):
"""Форма редактирования расчетных счетов - для админки."""
class Meta(BankAccountForm.Meta):
fields = '__all__'
@ -211,18 +214,33 @@ class BankAccountListForm(forms.Form):
super(BankAccountListForm, self).__init__(*args, **kwargs)
self.fields['bank_account'].queryset = models.BankAccount.objects.get_all(user.profile)
# -----------------------------------------------------------------------------
class ClientForm(forms.ModelForm):
"""Форма редактирования контрагентов."""
class Meta:
model = models.Client
fields = ('name', 'name_short_self', 'name_short_dadata', 'inn', 'kpp', 'ogrn', 'okpo', 'address',
fields = (
'name',
'name_short_self',
'name_short_dadata',
'inn',
'kpp',
'ogrn',
'okpo',
'address',
# банковские реквизиты
'bank_bik', 'bank_name', 'bank_short_name', 'bank_korr_account', 'bank_account',
'bank_bik',
'bank_name',
'bank_short_name',
'bank_korr_account',
'bank_account',
# контакты
'contact_name', 'contact_email', 'contact_phone', 'contact_skype', 'contact_other',
'contact_name',
'contact_email',
'contact_phone',
'contact_skype',
'contact_other',
)
_textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3})
widgets = {
@ -259,6 +277,7 @@ class ClientForm(forms.ModelForm):
class ClientAdminForm(ClientForm):
"""Форма редактирования контрагентов - для админки."""
class Meta(ClientForm.Meta):
fields = None
exclude = ('bank_address',)
@ -273,12 +292,11 @@ class ClientsListForm(forms.Form):
super(ClientsListForm, self).__init__(*args, **kwargs)
self.fields['client'].queryset = models.Client.objects.get_all(user.profile)
# -----------------------------------------------------------------------------
class UserProfileFiltersForm(MyBaseModelForm):
"""Общая форма фильтрации реквизитов."""
_profile_type = None # задать в наследнике!
# задать в наследнике!
_profile_type = None
_is_admin = False
_user = None
@ -303,7 +321,8 @@ class UserProfileFiltersForm(MyBaseModelForm):
# TODO 1. переписать проверки в стиле new_initial['show_inn'] = bool(profile.inn)
# TODO 2. загнать условия в словарь вида {'show_inn': 'inn'}. потом в цикле обработать
if profile:
# сбросить чекбоксы, если не заполнены определенные поля в профиле или нет расчетных счетов
# сбросить чекбоксы, если не заполнены определенные поля
# в профиле или нет расчетных счетов
if instance:
new_initial['show_inn'] = bool(profile.inn)
new_initial['show_ogrn'] = bool(profile.ogrn)
@ -372,34 +391,57 @@ class UserProfileFiltersForm(MyBaseModelForm):
f_acc = f['bank_account'] # TODO вынести настройку расчетных счетов в mixin?
f_acc.queryset = accounts
f_acc.empty_label = None
# исправить метку
f_acc.label_from_instance = lambda obj: mark_safe(
force_text('%s<br /><span class="name">%s</span>' % (obj.account, obj.name,))) # исправить метку
force_text('%s<br /><span class="name">%s</span>' % (obj.account, obj.name,)))
# заблокировать чекбоксы, если: не заполнены определенные поля в профиле или нет расчетных счетов
# TODO: refactor
# заблокировать чекбоксы, если: не заполнены определенные поля
# в профиле или нет расчетных счетов
if profile:
if not profile.inn: f['show_inn'].widget.attrs['disabled'] = 'disabled'
if not profile.ogrn: f['show_ogrn'].widget.attrs['disabled'] = 'disabled'
if not profile.okpo: f['show_okpo'].widget.attrs['disabled'] = 'disabled'
if not profile.get_glavbuh_fio(): f['show_glavbuh'].widget.attrs['disabled'] = 'disabled'
if not profile.address: f['show_address'].widget.attrs['disabled'] = 'disabled'
if not profile.jur_address: f['show_jur_address'].widget.attrs['disabled'] = 'disabled'
if not profile.real_address: f['show_real_address'].widget.attrs['disabled'] = 'disabled'
if not profile.get_full_phone(): f['show_phone'].widget.attrs['disabled'] = 'disabled'
if not profile.get_full_fax(): f['show_fax'].widget.attrs['disabled'] = 'disabled'
if not profile.email: f['show_email'].widget.attrs['disabled'] = 'disabled'
if not profile.site: f['show_site'].widget.attrs['disabled'] = 'disabled'
if not profile.logo: f['show_logo'].widget.attrs['disabled'] = 'disabled'
if not accounts: f['show_bank_account'].widget.attrs['disabled'] = 'disabled'
if not profile.inn:
f['show_inn'].widget.attrs['disabled'] = 'disabled'
if not profile.ogrn:
f['show_ogrn'].widget.attrs['disabled'] = 'disabled'
if not profile.okpo:
f['show_okpo'].widget.attrs['disabled'] = 'disabled'
if not profile.get_glavbuh_fio():
f['show_glavbuh'].widget.attrs['disabled'] = 'disabled'
if not profile.address:
f['show_address'].widget.attrs['disabled'] = 'disabled'
if not profile.jur_address:
f['show_jur_address'].widget.attrs['disabled'] = 'disabled'
if not profile.real_address:
f['show_real_address'].widget.attrs['disabled'] = 'disabled'
if not profile.get_full_phone():
f['show_phone'].widget.attrs['disabled'] = 'disabled'
if not profile.get_full_fax():
f['show_fax'].widget.attrs['disabled'] = 'disabled'
if not profile.email:
f['show_email'].widget.attrs['disabled'] = 'disabled'
if not profile.site:
f['show_site'].widget.attrs['disabled'] = 'disabled'
if not profile.logo:
f['show_logo'].widget.attrs['disabled'] = 'disabled'
if not accounts:
f['show_bank_account'].widget.attrs['disabled'] = 'disabled'
if self._profile_type == consts.IP_PROFILE:
if not profile.svid_gos_reg: f['show_svid_gos_reg'].widget.attrs['disabled'] = 'disabled'
if not profile.ip_reg_date: f['show_ip_reg_date'].widget.attrs['disabled'] = 'disabled'
if not profile.svid_gos_reg:
f['show_svid_gos_reg'].widget.attrs['disabled'] = 'disabled'
if not profile.ip_reg_date:
f['show_ip_reg_date'].widget.attrs['disabled'] = 'disabled'
elif self._profile_type == consts.ORG_PROFILE:
if not profile.name: f['show_name'].widget.attrs['disabled'] = 'disabled'
if not profile.full_name: f['show_full_name'].widget.attrs['disabled'] = 'disabled'
if not profile.kpp: f['show_kpp'].widget.attrs['disabled'] = 'disabled'
if not profile.boss_title: f['show_org_boss_title_and_fio'].widget.attrs['disabled'] = 'disabled'
if not profile.na_osnovanii: f['show_na_osnovanii'].widget.attrs['disabled'] = 'disabled'
if not profile.name:
f['show_name'].widget.attrs['disabled'] = 'disabled'
if not profile.full_name:
f['show_full_name'].widget.attrs['disabled'] = 'disabled'
if not profile.kpp:
f['show_kpp'].widget.attrs['disabled'] = 'disabled'
if not profile.boss_title:
f['show_org_boss_title_and_fio'].widget.attrs['disabled'] = 'disabled'
if not profile.na_osnovanii:
f['show_na_osnovanii'].widget.attrs['disabled'] = 'disabled'
# блокировать чекбоксы, т.к.эти реквизиты юзеру выключать нельзя
if self._profile_type == consts.IP_PROFILE:
@ -475,8 +517,6 @@ class OrgUserProfileFiltersForm(UserProfileFiltersForm):
'show_logo',
)
# -----------------------------------------------------------------------------
class EmailProfileForm(forms.Form):
"""Форма отправки реквизитов пользователя по email."""
@ -489,7 +529,8 @@ class LicenseForm(forms.Form):
"""Форма продления лицензии
"""
term = forms.ModelChoiceField(queryset=models.LicensePrice.objects.all(),
widget=forms.RadioSelect, label=u'Срок лицензии', empty_label = None)
widget=forms.RadioSelect, label=u'Срок лицензии',
empty_label=None)
payform = forms.ChoiceField(choices=consts.PAYFORMS[1:], widget=forms.RadioSelect,
label=u'Форма оплаты')

@ -7,7 +7,6 @@ from django.contrib.auth.decorators import login_required
from commons.paginator import pagination, save_per_page_value
from .. import models, forms
from ..decorators import license_required
from ..utils import raise_if_no_profile
@ -20,7 +19,7 @@ def bank_accounts_list(request, page_num=None):
template_name = 'customer/bank_accounts/list.html'
account_list = models.BankAccount.objects.get_all(request.user.profile)
page, pagination_form = pagination(request, account_list, page_num)
return render(request, template_name, {'page': page, 'pagination_form': pagination_form,})
return render(request, template_name, {'page': page, 'pagination_form': pagination_form})
@login_required

@ -66,7 +66,7 @@ class AutocompleteCountry(autocomplete_light.AutocompleteModelTemplate):
"""
attrs = {
'data-autcomplete-minimum-characters': 0,
'placeholder': 'Название страны',
'placeholder': '',
}
search_fields = ('name', 'full_name', '^code')
choice_template = 'autocomplete_light/docs_country_choice.html'

@ -25,12 +25,13 @@ class FakturaForm(BaseModelForm):
)
adjust_client_fields = []
class Meta:
model = Faktura
fields = (
'doc_num',
'doc_date',
'plat_doc_num',
'plat_doc_date',
'fix_doc_num',
'fix_doc_date',
'client',

@ -13,12 +13,17 @@ from docs.views.base_views import BaseItemsViews
class AktSverkiViews(BaseItemsViews):
"""Views для актов сверки."""
MODEL = AktSverki # модель документа
FORM_CLASS = AktSverkiForm # форма документа
ITEM_MODEL = AktSverkiItem # модель табличной части документа
ITEM_FORM_CLASS = AktSverkiItemForm # форма табличной части документа
ITEM_FORM_PREFIX = 'aktsverki_items' # префикс формы табличной части
# модель документа
MODEL = AktSverki
# форма документа
FORM_CLASS = AktSverkiForm
# модель табличной части документа
ITEM_MODEL = AktSverkiItem
# форма табличной части документа
ITEM_FORM_CLASS = AktSverkiItemForm
# префикс формы табличной части
ITEM_FORM_PREFIX = 'aktsverki_items'
# поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name',)
@ -61,7 +66,10 @@ class AktSverkiViews(BaseItemsViews):
}
def update_list_dict(self, dictionary):
"""Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов."""
"""
Здесь можно изменить словарь параметров перед
передачей его в шаблон вывода списка документов.
"""
dictionary['clients_form'] = ClientsListForm(self.request.user)
def update_parent_on_items_save(self, obj, obj_items):

@ -15,12 +15,17 @@ from .mixins import AddByInvoiceMethodMixin
class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
"""Views для накладных торг12."""
MODEL = Faktura # модель документа
FORM_CLASS = FakturaForm # форма документа
ITEM_MODEL = FakturaItem # модель табличной части документа
ITEM_FORM_CLASS = FakturaItemForm # форма табличной части документа
ITEM_FORM_PREFIX = 'faktura_items' # префикс формы табличной части
# модель документа
MODEL = Faktura
# форма документа
FORM_CLASS = FakturaForm
# модель табличной части документа
ITEM_MODEL = FakturaItem
# форма табличной части документа
ITEM_FORM_CLASS = FakturaItemForm
# префикс формы табличной части
ITEM_FORM_PREFIX = 'faktura_items'
FILTERSET_CLASS = FakturaFilterSet # фильтры
@ -89,15 +94,18 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
# высота в строках + рамки и вертикальные отступы
doc_header_rows = 20 # TODO: рассчитывать!
doc_footer_rows = 26
tbl_header_rows = 6 + 1 # шапка таблицы
tbl_page_footer_rows = 1 + 1 # подитог (итого по странице) таблицы
tbl_footer_rows = 1 + 1 # подвал таблицы
# шапка таблицы
tbl_header_rows = 6 + 1
# подитог (итого по странице) таблицы
tbl_page_footer_rows = 1 + 1
# подвал таблицы
tbl_footer_rows = 1 + 1
curr_rows = doc_header_rows + tbl_header_rows
# print '(start) curr_rows =', curr_rows
# если шрифт не моноширный, то в строчках умещается разное количество символов!
chars_per_line = 38 # для наименования
# для наименования
chars_per_line = 38
last_page_item_idx = 0
@ -118,8 +126,6 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
# сколько строк займет строка
name = wrap(item.name, chars_per_line)
name_rows = max(1, len(name.split('\n'))) + 1 # + отступ/рамка
# print 'name_rows =', name_rows,
# print '(+%s)' % (tbl_page_footer_rows + tbl_footer_rows)
# строка, подитог и итог не помещаются на странице
if (curr_rows + name_rows + tbl_page_footer_rows +
tbl_footer_rows > page_rows):
@ -127,10 +133,7 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
item.pdf_pagebreak_before = True
prev_item = item
else:
prev_item = obj_items[idx-1]
# print '--- new page', \
# curr_rows + name_rows + tbl_page_footer_rows + tbl_footer_rows, \
# '>', page_rows
prev_item = obj_items[idx - 1]
prev_item.pdf_pagebreak_after = True
prev_item.pdf_page_footer = True
calc_itogo(prev_item, last_page_item_idx, idx)
@ -140,7 +143,8 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
else:
curr_rows += name_rows
else:
if len(obj_items): # только если были записи в табличной части
# только если были записи в табличной части
if len(obj_items):
if not just_calc_itogo:
item.pdf_page_footer = True
calc_itogo(item, last_page_item_idx, idx)
@ -148,5 +152,3 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
curr_rows += tbl_footer_rows
if curr_rows + doc_footer_rows > page_rows:
item.pdf_pagebreak_after = True
# print 'curr_rows =', curr_rows

@ -863,7 +863,8 @@ input[type=number] {
.doc-form select#id_currency {width: 330px;height: 40px;font-size: 25px;margin-left: 0;padding-left: 2px;}
#fixes, #avance {
.fixes__wrapper,
.avance__wrapper {
padding-bottom: 7px;
font-size: 15px;
}
@ -876,8 +877,7 @@ input[type=number] {
#sender p,
#receiver p {
margin: 0;
margin-bottom: 10px;
margin: 0 0 10px;
}
#sender p .add-client-link,
#receiver p .add-client-link {
@ -888,3 +888,40 @@ input[type=number] {
#id_receiver-autocomplete {
width: 570px;
}
#id_plat_doc_num,
#id_plat_doc_date,
#id_fix_doc_num,
#id_fix_doc_date {
width: 155px;
}
#id_fix_doc_num {
margin-right: 10px;
}
.fixes__comment,
.avance__comment {
float: left;
display: inline-block;
font-size: 10px;
width: 250px;
padding-top: 28px;
}
#fixes,
#avance {
cursor: pointer;
font-style: normal;
}
.checkbox__org {
font-style: normal;
cursor: pointer;
}
.doc-form #sender .hilight,
.doc-form #receiver .hilight {
font-size: 25px;
}

@ -98,7 +98,11 @@ function setup_client_add_link(form, reload_on_success) {
clear_form_errors(form);
clearResultSearchDiv($("#searchBankResult"));
form.addClass(link.attr('type'));
// console.log('-----',form);
form.dialog('open');
return false;
});
});

@ -36,6 +36,7 @@ $(document).ready(function() {
/*beforeSend: function() {
$('.errors-layout', form).html('').hide();
},*/
// add client
success: function(data) {
clear_form_errors(form);
@ -44,18 +45,45 @@ $(document).ready(function() {
// console.log('!!!!!!!!!!!!!!!!!!!');
// console.log(data);
// console.log(form);
console.log('--------',form[0]);
console.log('--------sender:',$(form).hasClass( "sender" ));
console.log('--------receiver',$(form).hasClass( "receiver" ));
var clientType = '';
if ($(form).hasClass( "sender" )) { clientType = "sender"};
if ($(form).hasClass( "receiver" )) { clientType = "receiver"};
if (form[0].id == 'client-edit-form') {
if (!clientType) {
$('#id_client_text').hide();
$('#id_client-deck').html(
'<span class="hilight" data-value=' + data.id + '>' +
'<span style="display:inline" class="remove">' +
' ' +
' ˣ' +
' </span>' + data.name + '</span>');
$('#id_client').html('<option selected="selected" value="' + data.id + '"></option>');
$('#id_client').trigger('change');
} else {
var idType = '#id_' + clientType;
var idText = idType + '_text',
idDesk = idType + '-deck';
$(idText).hide();
$(idDesk).html(
'<span class="hilight" data-value='+ data.id + '>' +
'<span style="display:inline" class="remove">'+
' ' +
' ˣ' +
' </span>' + data.name + '</span>');
$('#id_client').html('<option selected="selected" value="'+ data.id +'"></option>');
$('#id_client').trigger('change');
$(idType).html('<option selected="selected" value="'+ data.id +'"></option>');
$(idType).trigger('change');
}
}
form.dialog('close');
form.clearForm();
@ -70,13 +98,20 @@ $(document).ready(function() {
}
}
if (data.action){
var autocomplete;
// console.log(data.action);
if (data.action == 'client-add'){
$(data.row_html).insertAfter('#clients_header_row');
clients_edit_del_update();
$('table#clients').show();
var autocomplete = $('#id_client-autocomplete');
if (!clientType) {
autocomplete = $('#id_client-autocomplete');
if (autocomplete.is(":visible")){autocomplete.hide()}
} else {
autocomplete = $('#id_'+ clientType + '-autocomplete');
if (autocomplete.is(":visible")){autocomplete.hide()}
}
}
if (data.action == 'client-edit'){

@ -6,13 +6,21 @@
{% include 'docs/parts/form_field.html' with field=form.doc_num id="doc_num" classes="left" label="Номер" required="True" no_clear_after="True" %}
{% include 'docs/parts/form_field.html' with field=form.doc_date id="doc_date" classes="left" label="Дата создания" required="True" no_clear_after="True"%}
{% include 'docs/parts/form_field.html' with field=form.bank_account %}
<div id="fixes"><input id="id_fixes" name="fixes" type="checkbox"> Исправления</div>
<div id='fix_block' class="block{% if not form.fixes.value %} hidden{% endif %}" style="border-bottom: 1px solid #777; padding: 0 20px 15px 0; margin-top: 0;">
<div class="fixes__wrapper"><label id="fixes" for="id_fixes"><input id="id_fixes" name="fixes" type="checkbox"> Исправления</label></div>
<div id='fix_block' class="block{% if not form.fixes.value %} hidden{% endif %}">
{% include 'docs/parts/form_field.html' with field=form.fix_doc_num id="fix_doc_num" classes="left" label="Номер исправления" required="True" no_clear_after="True" %}
{% include 'docs/parts/form_field.html' with field=form.fix_doc_date id="fix_doc_date" classes="left" label="Дата исправления" required="True" %}
{% include 'docs/parts/form_field.html' with field=form.fix_doc_date id="fix_doc_date" classes="left" label="Дата исправления" required="True" no_clear_after="True" %}
<div class="fixes__comment">Номера исправлений должны начинаться с 1 для каждой счет-фактуры в отдельности.</div>
<div class="clear"></div>
</div>
<div class="avance__wrapper"><label id="avance" for="id_avance"><input id="id_avance" name="avance" type="checkbox"> Аванс</label></div>
<div id='avance_block' class="block{% if not form.fixes.value %} hidden{% endif %}">
{% include 'docs/parts/form_field.html' with field=form.plat_doc_num id="plat_doc_num" classes="left" label="К плат. док-ту №" required="True" no_clear_after="True" %}
{% include 'docs/parts/form_field.html' with field=form.plat_doc_date id="plat_doc_date" classes="left" label="Дата документа" required="True" no_clear_after="True" %}
<div class="avance__comment">Платежное поручение, кассовый чек, приходный ордер и т.п.Заполняется только при наличии аванса.</div>
<div class="clear"></div>
</div>
<div id="avance"><input id="id_avance" name="avance" type="checkbox"> Аванс</div>
{% include 'docs/parts/form_field.html' with field=form.currency id="currency" classes="field" label="Валюта документа " %}
{% include 'docs/parts/form_field.html' with field=form.currency id="currency" classes="field" label="Валюта документа" %}
</div>
@ -20,8 +28,8 @@
{% include 'docs/parts/form_field_client.html' with field=form.client required="True" is_ajax="True" label="Покупатель" %}
{% include 'docs/parts/form_field.html' with field=form.invoice id="invoice" classes="field hidden" label="Создать счёт-фактуру по счёту" %}
{% include 'docs/parts/form_field_sender.html' with field=form.sender id="sender" %}
{% include 'docs/parts/form_field_receiver.html' with field=form.receiver id="receiver" %}
{% include 'docs/parts/form_field_sender.html' with field=form.sender id="sender" type="sender" %}
{% include 'docs/parts/form_field_receiver.html' with field=form.receiver id="receiver" type="receiver" %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 5px 0;">

@ -1,4 +1 @@
{#<p>{{ label }}</p>#}
{#<input type="radio" name="{{ client_group|default:'client_group' }}" value="he_is"{% if default == 'he_is' %} checked{% endif %}> {{ label1|default:'Он же' }}#}
<input type="checkbox" name="{{ client_group|default:'client_group' }}" value="another"{% if default == 'another' %} checked{% endif %}><span class="checkbox__org">{{ label2|default:'Стороннее лицо' }}</span>
{#<input type="radio" name="{{ client_group|default:'client_group' }}" value="nobody"{% if default == 'nobody' %} checked{% endif %}> Не указывать#}
<input type="checkbox" id="{{ id }}" name="{{ client_group|default:'client_group' }}" value="another"{% if default == 'another' %} checked{% endif %}><label class="checkbox__org" for="{{ id }}">{{ label2|default:'Стороннее лицо' }}</label>

@ -13,7 +13,7 @@ no_clear_after - не добавлять очистку float после бло
{% endif %}
<p>
{{ field }}
<a class="client add-client-link" href="{% url 'customer_clients_add' %}" title="Добавить контрагента">
<a class="client add-client-link" href="{% url 'customer_clients_add' %}" title="Добавить контрагента" {% if type %}type="{{ type }}"{% endif %}>
Добавить контрагента
</a>
</p>

@ -1,2 +1,2 @@
{% include 'docs/parts/form_client_choices.html' with client_group="receiver_group" id="receiver_choices" classes="field" label2='Грузополучатель - стороннее лицо (не покупатель)' default=receiver_choice %}
{% include 'docs/parts/form_field_client.html' with field=form.receiver id="receiver" classes="field" label=' ' %}
{% include 'docs/parts/form_field_client.html' with field=form.receiver id="receiver" classes="field" label=' ' type="receiver" %}

@ -1,2 +1,2 @@
{% include 'docs/parts/form_client_choices.html' with client_group="sender_group" id="sender_choices" classes="field" label2='Грузоотправитель - стороннее лицо (не моя компания)' default=sender_choice %}
{% include 'docs/parts/form_field_client.html' with field=form.sender id="sender" classes="field" label=" " %}
{% include 'docs/parts/form_field_client.html' with field=form.sender id="sender" classes="field" label=" " type="sender" %}

@ -2,6 +2,8 @@
<script type="text/javascript">
$(document).ready(function() {
console.log('-----','stab js');
$('tr.plat_form').formset({
prefix: '{{ pformset.prefix }}',
formCssClass: 'plat_dynamic-form'
@ -46,25 +48,38 @@
});
/* проверяем видимость блока */
check_vis = function (block){
var check_vis = function (block){
if (block.is(":visible")){block.hide();
} else{block.show()}
};
var add_block = $('.add-client-link'), // блок с кнопкой "Добавить контрагента"
client_block = $('#id_client');
//console.log('rte');
client_block = $('#id_client'),
senderBlock = $('#id_sender'),
receiverBlock = $('#id_receiver');
// прячем кнопку добавить контрагента если он уже есть в документе
if (client_block.val()){
check_vis(add_block);
} else {}
senderBlock.on('change', function () {
console.log('change senderBlock');
add_block = $(this).parent().siblings('.add-client-link');
check_vis(add_block);
});
receiverBlock.on('change', function () {
console.log('change receiverBlock');
add_block = $(this).parent().siblings('.add-client-link');
check_vis(add_block);
});
// отрабатываем изменение в блоке добавления контрагента
// как я понимаю основной блок на поиск и вывод "инвойсов" для автодобавления контрагента
client_block.on('change', function() {
//console.log('change');
add_block = $(this).parent().siblings('.add-client-link');
check_vis(add_block);
var client_id = $(this).val();
@ -175,7 +190,11 @@
if (sender_val == 'another') {
$('#' + client_type).show()
} else {
$('#' + client_type).hide()
$('#' + client_type).hide();
if ($('#' + client_type + ' span.remove')[0].style.display === 'inline-block') {
$('#' + client_type + ' span.remove')[0].click();
}
}
};
@ -192,12 +211,24 @@
$('#fix_block').hide();
}
if ($('#id_avance').is(':checked')){
$('#avance_block').show();
} else {
$('#avance_block').hide();
}
$('#id_fixes').change(function(){
$('#fix_block').toggle();
$('#id_fix_doc_num').val('11');
$('#id_fix_doc_num').val('1');
$('#id_fix_doc_date').val('');
});
$('#id_avance').change(function(){
$('#avance_block').toggle();
$('#plat_doc_num').val('');
$('#plat_doc_date').val('');
});
function displayInvoiceBlock(visibly) {
var invoiceBlock = $('#invoice');

Loading…
Cancel
Save