1.3.2.2. Логика приложения
Вычисляемые параметры документа, требующие выполнения кода на python
описываются в файле
/sphere_conf/bps/projects/<имя_проекта>/document.py
или пакете
/sphere_conf/bps/projects/<имя_проекта>/document/__init__.py
в котором должен быть класс «Document»
Пример файла:
class Document:
@cached_property
def ecuu(self):
return Ecuu.query.filter(ilike(Ecuu.email, self.customer_request_email)).first()
@property
def service_type_set(self):
""" Типы услуг в виде множества """
return {item.value for item in self.service_types}
def has_service_type(self, name):
return bool(str_to_set(name) & self.service_type_set)
@property
def s_service(self):
''' Стоимость услуги (для заказчика) '''
return sum([service.s_service for service in self.services if service.s_service])
@property
def s_sale_service(self):
''' Стоимость закупки услуги (у исполнителя) '''
return sum([service.s_sale_service for service in self.services if service.s_sale_service])
@property
def price_rpo(self):
''' Стоимость услуги РПО '''
return sum([service.price_rpo for service in self.services if service.price_rpo])
@property
def s_pay_rpo_fact(self):
''' Сумма оплаты РПО (факт) '''
return sum([service.s_pay_rpo_fact for service in self.services if service.s_pay_rpo_fact])
@property
def s_pay_executor_fact(self):
''' Сумма оплаты Исполнителю (факт) '''
return sum([service.s_pay_executor_fact for service in self.services if service.s_pay_executor_fact])
@property
def auto_owner_type(self):
''' Тип контрагента - потерпевшего '''
if self.auto_owner_id:
return get_data_source_label('ContractorType', self.auto_owner.contractor_type)
@property
def income_region(self):
''' Регион '''
if self.income_city_id:
return self.income_city.region
@cached_property
def fields_empty(self):
""" Set из названий параметров, которые СК не предоставила
(и вроде как теперь мы их требовать от оператора не будем) """
data = self.data or {}
return set(data.get('fields_empty', []))
def check_required(self, name):
""" Проверим заполненность поля с учетом того, что СК его просто не предоставила """
return bool(getattr(self, name) or name in self.fields_empty)
@property
def income_place_fill(self):
""" Проверяем что место выезда выбрано через КЛАДР или вписано ручками """
if self.income_place_kladr or self.income_place:
return True
return False
@property
def all_service_closed_success(self):
""" Все услуги выполнены и все успешно (не отказ) """
for item in self.services:
if item.status != 'archive' or 'service_closed_success' not in (item.tags or []):
return False
return True
@property
def any_service_closed_success(self):
""" Есть услуга, выполненная успешно (не отказ) """
for item in self.services:
if item.status == 'archive' and 'service_closed_success' in (item.tags or []):
return True
return False
@property
def all_service_closed(self):
""" Все услуги выполнены (успешно или отказ, но в архиве) """
for item in self.services:
if item.status != 'archive':
return False
return True
@property
def all_service_reject(self):
""" Все услуги отменены """
for item in self.services:
if item.status != 'archive' or item.service_status != 'reject_customer':
return False
return True
@property
def s_all_whithout_wear(self):
""" Итого (без учета износа) """
return _nvl(self.s_works) + _nvl(self.s_coloring) + _nvl(self.s_materials) + _nvl(self.s_spare_parts_whithout_wear)
@property
def s_all_whith_wear(self):
""" Итого (без учета износа) """
return _nvl(self.s_works) + _nvl(self.s_coloring) + _nvl(self.s_materials) + _nvl(self.s_spare_parts_whith_wear)
@property
def auto_is_foreign(self):
""" Машина иностранного производства """
data = self.data or {}
return data.get('auto_is_foreign') or 'false'
@property
def auto_right_hand(self):
""" Машина праворульная """
data = self.data or {}
return data.get('auto_right_hand') or 'false'
@cached_property
def bps_tasks(self):
""" Список задач по этому документу """
if self.id:
Task = get_model('Task')
return Task.query.filter(
Task.active == True,
Task.request_id == self.id
).all()
return []
@property
def is_executor_work_trust(self):
""" Все услуги по заявке мы доверяем исполнителям и не проверяем результат работ
Сдаем заказчику сразу """
# print('Request.is_executor_work_trust')
for service in self.services:
if not service.is_executor_work_trust:
return False
return True