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