예제 #1
0
    def get_price_modifier(self):
        """
        На основании источника финансирования возвращает прайс(объект)+модификатор(множитель цены)
        Если источник финансирования ДМС поиск осуществляется по цепочке company-contract. Company(Страховая организация)
        Если источник финансирования МЕДОСМОТР поиск осуществляется по цепочке company-contract. Company(место работы)
        Если источник финансирования ПЛАТНО поиск осуществляется по цепочке ист.фин-contract-прайс
        Если источник финансирования ОМС, ДИСПАНСЕРИЗАЦИЯ поиск осуществляется по цепочке ист.фин-contract-прайс
        Если источник финансирования Бюджет поиск осуществляется по цепочке contract
        """
        price_modifier = None
        price_contract = set(SettingManager.get("price_contract").split(','))
        price_company = set(SettingManager.get("price_company").split(','))

        if self.title.upper() in price_contract:
            contract_l = IstochnikiFinansirovaniya.objects.values_list(
                'contracts_id').filter(pk=self.pk).first()
            if contract_l[0]:
                price_modifier = contracts.Contract.objects.values_list(
                    'price', 'modifier').get(id=contract_l[0])
        elif self.title.upper() in price_company:
            contract_l = contracts.Company.objects.values_list(
                'contracts_id').filter(pk=self.pk).first()
            if contract_l[0]:
                price_modifier = contracts.Contract.objects.values_list(
                    'price', 'modifier').get(id=contract_l[0])
        return price_modifier
예제 #2
0
def confirm_reset(request):
    result = {"ok": False, "msg": "Ошибка"}

    if "pk" in request.POST.keys() or "pk" in request.GET.keys():
        if request.method == "POST":
            pk = int(request.POST["pk"])
        else:
            pk = int(request.GET["pk"])

        if Issledovaniya.objects.filter(pk=pk).exists():
            iss = Issledovaniya.objects.get(pk=pk)

            import time
            ctp = int(0 if not iss.time_confirmation else int(
                time.
                mktime(timezone.localtime(iss.time_confirmation).timetuple())))
            ctime = int(time.time())
            cdid = -1 if not iss.doc_confirmation else iss.doc_confirmation.pk
            if (
                    ctime - ctp <
                    SettingManager.get("lab_reset_confirm_time_min") * 60
                    and cdid == request.user.doctorprofile.pk
            ) or request.user.is_superuser or "Сброс подтверждений результатов" in [
                    str(x) for x in request.user.groups.all()
            ]:
                predoc = {
                    "fio":
                    'не подтверждено'
                    if cdid == -1 else iss.doc_confirmation.get_fio(),
                    "pk":
                    cdid,
                    "direction":
                    iss.napravleniye.pk
                }
                iss.doc_confirmation = iss.time_confirmation = None
                iss.save()
                if iss.napravleniye.result_rmis_send:
                    c = Client()
                    c.directions.delete_services(iss.napravleniye,
                                                 request.user.doctorprofile)
                result = {"ok": True}
                slog.Log(key=pk,
                         type=24,
                         body=json.dumps(predoc),
                         user=request.user.doctorprofile).save()
            else:
                result[
                    "msg"] = "Сброс подтверждения разрешен в течении %s минут" % (
                        str(SettingManager.get("lab_reset_confirm_time_min")))
    return JsonResponse(result)
예제 #3
0
def dashboard(request):
    if not request.is_ajax():
        return render(
            request, 'dashboard.html', {
                "rmis":
                SettingManager.get(
                    "rmis_enabled", default='false', default_type='b'),
                "mis_module":
                SettingManager.get(
                    "mis_module", default='false', default_type='b'),
                "paraclinic":
                SettingManager.get(
                    "paraclinic_module", default='false', default_type='b')
            })
    return HttpResponse("OK")
예제 #4
0
파일: views.py 프로젝트: moodpulse/l2
def researches_paraclinic(request):
    if SettingManager.get("paraclinic_module",
                          default='false',
                          default_type='b'):
        return redirect('/ui/construct/descriptive')
    else:
        return redirect('/')
예제 #5
0
def drawTituls(c, user, pages, page, paddingx, obj, otd="", group=-2, start=1):
    """Функция рисования шапки и подвала страницы pdf"""
    c.setFont('OpenSans', 9)
    c.setStrokeColorRGB(0, 0, 0)
    c.setLineWidth(1)

    c.drawCentredString(w / 2, h - 30, SettingManager.get("org_title"))
    c.setFont('OpenSans', 12)
    c.drawCentredString(w / 2, h - 50, "Журнал приема материала")
    group_str = "Все исследования"

    if group >= 0:
        group_str = directory.ResearchGroup.objects.get(pk=group).title
    elif group == -2:
        group_str = "Все исследования"
    else:
        group_str = "Без группы"

    c.drawString(paddingx, h - 65, "Группа: %s" % group_str)

    c.drawString(paddingx, h - 78, "Отделение: %s" % otd)

    c.setFont('OpenSans', 10)
    # c.drawString(paddingx * 3, h - 70, "№ " + str(doc_num))
    c.drawRightString(
        w - paddingx, h - 65,
        "Дата: " + str(dateformat.format(date.today(), settings.DATE_FORMAT)))

    c.drawRightString(w - paddingx, 20,
                      "Страница " + str(page) + " из " + str(pages))
예제 #6
0
파일: integration.py 프로젝트: moodpulse/l2
def get_url(path, query=None):
    if query is None:
        query = {}
    return urljoin(
        SettingManager.get(
            "tfoms_api_url", default='http://localhost/', default_type='s'),
        path) + ('?{}'.format(urlencode(query)) if query else '')
예제 #7
0
 def can_invalidate(self):
     rt = SettingManager.get("ticket_invalidate_time_min",
                             default='1440.0',
                             default_type='f') * 60
     ctp = time.mktime(timezone.localtime(self.date).timetuple())
     ctime = int(time.time())
     return ctime - ctp < rt
예제 #8
0
def get_phones_transfers(request):
    phones_transfer = SettingManager.get("phones_transfer_file",
                                         default='False',
                                         default_type='b')
    org_phones = []
    extrenal_phones = []

    if phones_transfer:
        try:
            phones_transfer_file = os.path.join(BASE_DIR, 'external_system',
                                                'settings', 'phones_org.json')
            with open(phones_transfer_file) as json_file:
                org_phones = json.load(json_file)
        except Exception:
            org_phones = []

    if phones_transfer:
        try:
            extrenal_phones_file = os.path.join(BASE_DIR, 'external_system',
                                                'settings',
                                                'extrenal_phones.json')
            with open(extrenal_phones_file) as json_file:
                extrenal_phones = json.load(json_file)
        except Exception:
            extrenal_phones = []

    return JsonResponse({
        "org_phones": list(org_phones),
        "extrenal_phones": list(extrenal_phones)
    })
예제 #9
0
def make_service(request):
    data = json.loads(request.body)
    main_direction = Napravleniya.objects.get(pk=data["main_direction"])
    parent_iss = Issledovaniya.objects.filter(
        napravleniye=main_direction, research__is_hospital=True).first()
    service = HospitalService.objects.get(pk=data["service"])
    TADP = SettingManager.get("tadp", default='Температура', default_type='s')
    if "Врач стационара" not in [
            str(x) for x in request.user.groups.all()
    ] and TADP not in service.slave_research.title:
        return JsonResponse({"pk": None})
    result = Napravleniya.gen_napravleniya_by_issledovaniya(
        main_direction.client_id,
        "",
        None,
        "",
        None,
        request.user.doctorprofile,
        {-1: [service.slave_research_id]},
        {},
        False,
        {},
        vich_code="",
        count=1,
        discount=0,
        parent_iss=parent_iss.pk,
        rmis_slot=None,
    )
    pk = result["list_id"][0]
    return JsonResponse({"pk": pk})
예제 #10
0
def researches_paraclinic(request):
    if SettingManager.get("paraclinic_module",
                          default='false',
                          default_type='b'):
        return render(request, 'construct_paraclinic.html')
    else:
        return redirect('/')
예제 #11
0
파일: processor.py 프로젝트: moodpulse/l2
    def get_active_ref(self, raw_ref=True, single=False):
        if raw_ref:
            if single:
                show_only_needed_ref = SettingManager.get("show_only_needed_ref", default='True', default_type='b')
                if not show_only_needed_ref or not self.raw_ref:
                    return None

                show_full_needed_ref = SettingManager.get("show_full_needed_ref", default='False', default_type='b')
                if show_full_needed_ref:
                    return {self.key: self.raw_ref}

                return {'Все': self.raw_ref}
            return self.raw_ref
        if isinstance(self.ref, ResultRight):
            return self.ref
        return ValueRange((0, ")"), (0, ")"))
예제 #12
0
파일: integration.py 프로젝트: moodpulse/l2
def get_headers():
    return {
        "Authorization":
        "Bearer {}".format(
            SettingManager.get("tfoms_api_token",
                               default='token',
                               default_type='s'))
    }
예제 #13
0
파일: views.py 프로젝트: moodpulse/l2
def log(request):
    response = {
        "cnt": slog.objects.all().count(),
        "store_days": SettingManager.get("max_log_store_days", "120", "i")
    }
    response["to_delete"] = slog.objects.filter(
        time__lt=datetime.today() - timedelta(days=response["store_days"]),
        type__in=CLEANUP_TYPES_LOG).count()
    return JsonResponse(response)
예제 #14
0
파일: fias.py 프로젝트: moodpulse/l2
def suggest(query, resource='address', count=5, detalized=False):
    k = SettingManager.get("dadata_key", default='', default_type='s')
    if not k:
        return []
    key = f'sugg:{k[:6]}:{resource}:{get_md5(query)}:{len(query)}:{detalized}'
    result = cache.get(key)
    if not result:
        url = BASE_URL.format(resource)
        headers = {"Authorization": "Token {}".format(k), "Content-Type": "application/json"}
        data = {"query": query, "count": count, "locations_boost": [{"kladr_id": SettingManager.get("dadata_kladr_prior_city", default='38', default_type='s')}]}
        result = requests.post(url, data=json.dumps(data), headers=headers, proxies=FIAS_PROXY).json()
        result = result.get('suggestions', [])
        if not detalized:
            result = [x.get('value', '') for x in result]
        cache.set(key, pickle.dumps(result, protocol=4), 24 * 3600)
    else:
        result = pickle.loads(result, encoding="utf8")

    return result
예제 #15
0
def make_menu(pages, groups, superuser, current_path=None):
    menu = []
    groups_set = set(groups)
    for page in pages:
        if (not superuser and "*" not in page["access"]
                and len(groups_set & set(page["access"]))
                == 0) or (page.get("module") and not SettingManager.get(
                    page["module"], default='false', default_type='b')):
            continue
        page["active"] = current_path == page.get("url")
        menu.append(page)
    return menu
예제 #16
0
파일: fias.py 프로젝트: moodpulse/l2
def kladrapi_request(data: dict):
    kladrapi_url = SettingManager.get('kladrapi_url', default='https://kladr-api.ru/api.php', default_type='s')
    token = SettingManager.get('kladrapi_token', default='', default_type='s')
    try:
        if token:
            data['token'] = token

        key = f"kladrapi_request:{get_md5(json.dumps(data, sort_keys=True))}"
        result = cache.get(key)

        if not result:
            result = requests.get(kladrapi_url, params=data, proxies=FIAS_PROXY).json()
            if not result or not isinstance(result, dict) or 'result' not in result:
                return {}
            cache.set(key, pickle.dumps(result, protocol=4), 24 * 3600)
        else:
            result = pickle.loads(result, encoding="utf8")

        return result
    except Exception as e:
        logger.exception(e)
        return {}
예제 #17
0
파일: models.py 프로젝트: moodpulse/l2
    def get_default_hospital() -> Optional['Hospitals']:
        hosp = Hospitals.objects.filter(hide=False, is_default=True).first()

        if not hosp:
            hosp = Hospitals.objects.filter(hide=False,
                                            code_tfoms=SettingManager.get(
                                                "org_id",
                                                default='',
                                                default_type='s')).first()
            if hosp:
                hosp.is_default = True
                hosp.save()

        return hosp
예제 #18
0
def confirm_reset(request):
    result = {"ok": False, "msg": "Ошибка"}

    if "pk" in request.POST.keys() or "pk" in request.GET.keys():
        if request.method == "POST":
            pk = int(request.POST["pk"])
        else:
            pk = int(request.GET["pk"])

        if Issledovaniya.objects.filter(pk=pk).exists():
            iss = Issledovaniya.objects.get(pk=pk)

            import time
            ctp = int(0 if not iss.time_confirmation else int(
                time.mktime(iss.time_confirmation.timetuple()))) + 8 * 60 * 60
            ctime = int(time.time())
            cdid = -1 if not iss.doc_confirmation else iss.doc_confirmation.pk
            if (ctime - ctp <
                    SettingManager.get("lab_reset_confirm_time_min") * 60
                    and cdid == request.user.doctorprofile.pk
                ) or request.user.is_superuser:
                predoc = {
                    "fio": iss.doc_confirmation.get_fio(),
                    "pk": iss.doc_confirmation.pk
                }
                iss.doc_confirmation = iss.time_confirmation = None
                iss.save()
                result = {"ok": True}
                slog.Log(key=pk,
                         type=24,
                         body=json.dumps(predoc),
                         user=request.user.doctorprofile).save()
            else:
                result[
                    "msg"] = "Сброс подтверждения разрешен в течении %s минут" % (
                        str(SettingManager.get("lab_reset_confirm_time_min")))
    return HttpResponse(json.dumps(result), content_type="application/json")
예제 #19
0
파일: integration.py 프로젝트: moodpulse/l2
def match_enp(enp) -> Optional[dict]:
    logger.exception(f"tfms: match enp: {enp}")
    if SettingManager.get("l2_patients_is_active",
                          default='f',
                          default_type='b'):
        logger.exception("l2_patients_is_active")
        resp = check_l2_enp(enp)
        logger.exception(f"resp: {resp}")
        if not isinstance(
                resp,
                dict) or not resp.get('ok') or not resp.get('patient_data'):
            return None
        return resp.get('patient_data')
    data = make_request("match-patient-by-enp-set2", {"enp": enp}, timeout=5)
    if isinstance(data, list) and len(data) > 0:
        return data[0]
    return data
예제 #20
0
def make_menu(pages, groups, superuser, current_path=None):
    menu = []
    groups_set = set(groups)
    hide_buttons = []
    for k, v in HIDE_TITLE_BUTTONS_MAIN_MENU.items():
        if k in groups:
            hide_buttons.extend(v)
    for page in pages:
        is_hide_button = False
        if page.get("title", "Нет такой кнопки") in hide_buttons:
            is_hide_button = True
        if (not superuser and "*" not in page["access"] and len(groups_set & set(page["access"])) == 0) or (
            page.get("module") and not SettingManager.get(page["module"], default='false', default_type='b')
        ):
            continue
        if is_hide_button and not superuser:
            continue
        page["active"] = current_path == page.get("url")
        menu.append(page)
    return menu
예제 #21
0
 def handle(self, *args, **kwargs):
     research_pk = kwargs["research_pk"]
     research_data = {}
     r = Researches.objects.get(pk=research_pk)
     research_data['title'] = r.title
     research_data['code'] = r.code
     research_data['short_title'] = r.short_title
     groups = ParaclinicInputGroups.objects.filter(research=r)
     groups_to_save = []
     for group in groups:
         fields_in_group = []
         for f in ParaclinicInputField.objects.filter(group=group,
                                                      hide=False):
             field_data = {
                 'title': f.title,
                 'short_title': f.short_title,
                 'order': f.order,
                 'default_value': f.default_value,
                 'lines': f.lines,
                 'field_type': f.field_type,
                 'for_extract_card': f.for_extract_card,
                 'for_talon': f.for_talon,
                 'helper': f.helper,
                 'input_templates': f.input_templates,
                 'required': f.required,
                 'hide': f.hide,
             }
             fields_in_group.append(field_data)
         groups_to_save.append({
             'title': group.title,
             'show_title': group.show_title,
             'order': group.order,
             'hide': group.hide,
             'paraclinic_input_field': fields_in_group,
             'fieldsInline': group.fields_inline,
         })
     research_data['paraclinic_input_groups'] = groups_to_save
     dir_tmp = SettingManager.get("dir_param")
     with open(f'{dir_tmp}/{research_pk}.json', 'w') as fp:
         json.dump(research_data, fp)
예제 #22
0
파일: integration.py 프로젝트: moodpulse/l2
def match_patient(family, name, patronymic, birthday) -> List[dict]:
    logger.exception(f"match_patient: {(family, name, patronymic, birthday)}")
    if SettingManager.get("l2_patients_is_active",
                          default='f',
                          default_type='b'):
        logger.exception("l2_patients_is_active")
        resp = check_l2_patient(family, name, patronymic, birthday)
        logger.exception(f"resp: {resp}")
        if not isinstance(resp,
                          dict) or not resp.get('ok') or not resp.get('list'):
            return []
        return resp.get('list')
    q = {
        "family": family,
        "name": name,
        "birthdate": birthday,
    }

    if patronymic:
        q["patronymic"] = patronymic

    return make_request("match-patient", q)
예제 #23
0
파일: views.py 프로젝트: moodpulse/l2
def dnk_covid(request):
    prefixes = []
    key_dnk = SettingManager.get("dnk_kovid",
                                 default='false',
                                 default_type='s')
    to_return = None
    for x in "ABCDEF":
        prefixes.extend([f"{x}{i}" for i in range(1, 13)])
    file = request.FILES['file']
    if file.content_type == 'application/pdf' and file.size < 100000:
        with tempfile.TemporaryFile() as fp:
            fp.write(file.read())
            text = extract_text_from_pdf(fp)
        if text:
            text = text.replace("\n", "").split(
                "Коронавирусы подобные SARS-CoVВККоронавирус SARS-CoV-2")
        to_return = []
        if text:
            for i in text:
                k = i.split("N")
                if len(k) > 1 and k[1].split(" ")[0].isdigit():
                    result = json.dumps({
                        "pk":
                        k[1].split(" ")[0],
                        "result": [{
                            "dnk_SARS":
                            "Положительно" if "+" in i else "Отрицательно"
                        }]
                    })
                    to_return.append({
                        "pk":
                        k[1].split(" ")[0],
                        "result":
                        "Положительно" if "+" in i else "Отрицательно"
                    })
                    http_func({"key": key_dnk, "result": result}, request.user)

    return to_return
예제 #24
0
def form_02(request_data):
    """
    Форма 025/у - титульный лист амбулаторной карты
    Приказ Минздрава России от 15.12.2014 N 834н (ред. от 09.01.2018)
    """
    ind_card = Card.objects.get(pk=request_data["card_pk"])
    ind = ind_card.individual
    ind_doc = Document.objects.filter(individual=ind, is_active=True)

    hospital_name = SettingManager.get("org_title")
    hospital_address = SettingManager.get("org_address")
    hospital_kod_ogrn = SettingManager.get("org_ogrn", "<TODO:OGRN>")
    hospital_okpo = SettingManager.get("org_ogrn", "<TODO:OKPO>")

    individual_fio = ind.fio()
    individual_sex = ind.sex
    individual_date_born = ind.bd()

    document_passport = "Паспорт РФ"

    documents = forms_func.get_all_doc(ind_doc)
    document_passport_num = documents['passport']['num']
    document_passport_serial = documents['passport']['serial']
    document_passport_date_start = documents['passport']['date_start']
    document_passport_issued = documents['passport']['issued']
    document_polis = documents['polis']['num']
    document_snils = documents['snils']['num']

    indivudual_insurance_org = documents['polis']['issued']
    individual_benefit_code = "_________"

    ind_card_num = ind_card.number_with_type()
    ind_card_address = ind_card.main_address
    ind_card_phone = ", ".join(ind_card.get_phones())

    individual_work_organization = "Управление Федераньной службы по ветеринарному и фитосанитрному надзору по Иркутской области" \
                                   "и Усть-Ордынскому бурятскому автономному округу"  # реест организаций
    work_organization_okved = "91.5 - Обслуживание и ремонт компютерной и оргтехники, заправка картриджей" \
                              "обслуживание принтеров"
    individual_department = "отдел информационных технология, ораганизаци ремонта и обслуживания медицинского оборудования"
    individual_profession = "старший государственный таможенный инспектор"  # реест профессий

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
    # http://www.cnews.ru/news/top/2018-12-10_rossijskim_chinovnikam_zapretili_ispolzovat
    # Причина PTAstraSerif использовать

    buffer = BytesIO()
    individual_fio = ind.fio()
    individual_date_born = ind.bd()

    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=6 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("025/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} </font>'.format(
                    hospital_name, hospital_address, hospital_kod_ogrn),
                styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>Учетная форма № 025/у</font>',
                styleT)
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    content_title = [
        Indenter(left=0 * mm),
        Spacer(1, 4 * mm),
        Paragraph(
            'МЕДИЦИНСКАЯ КАРТА ПАЦИЕНТА, <br/> ПОЛУЧАЮЩЕГО МЕДИЦИНСКУЮ ПОМОЩЬ В АМБУЛАТОРНЫХ УСЛОВИЯХ',
            styleCenter),
        Paragraph('{}№&nbsp;{}'.format(3 * space_symbol, ind_card_num),
                  styleCenterBold),
        Spacer(1, 2 * mm),
        Paragraph(
            '1.Дата заполнения медицинской карты: {}'.format(
                pytils.dt.ru_strftime(u"%d %B %Y",
                                      inflected=True,
                                      date=datetime.datetime.now())), style),
        Paragraph(
            "2. Фамилия, имя, отчество:<b> {} </b> ".format(individual_fio),
            style),
        Paragraph(
            '3. Пол: {} {} 4. Дата рождения: {}'.format(
                individual_sex, 3 * space_symbol, individual_date_born),
            style),
        Paragraph('5. Место регистрации: {}'.format(ind_card_address), style),
        Paragraph('тел. {}'.format(ind_card_phone), style),
        Paragraph('6. Местность: городская — 1, сельская — 2', style),
        Paragraph(
            '7. Полис ОМС: серия______№: {} {}'
            '8. СНИЛС: {}'.format(document_polis, 13 * space_symbol,
                                  document_snils), style),
        Paragraph(
            '9. Наименование страховой медицинской организации: {}'.format(
                indivudual_insurance_org), style),
        Paragraph(
            '10. Код категории льготы: {} {} 11. Документ: {} &nbsp; серия: {} &nbsp;&nbsp; №: {}'
            .format(individual_benefit_code, 35 * space_symbol,
                    document_passport, document_passport_serial,
                    document_passport_num), style),
        Paragraph(
            '12. Заболевания, по поводу которых осуществляется диспансерное наблюдение:',
            style),
        Spacer(1, 2 * mm),
    ]

    objs.extend(content_title)

    styleTCenter = deepcopy(styleT)
    styleTCenter.alignment = TA_CENTER
    styleTCenter.leading = 3.5 * mm

    opinion = [
        [
            Paragraph(
                '<font size=9>Дата начала диспансерного наблюдения </font>',
                styleTCenter),
            Paragraph(
                '<font size=9 >Дата прекращения диспансерного наблюдения</font>',
                styleTCenter),
            Paragraph('<font size=9 >Диагноз</font>', styleTCenter),
            Paragraph('<font size=9 >Код по МКБ-10</font>', styleTCenter),
            Paragraph('<font size=9 >Врач</font>', styleTCenter),
        ],
    ]
    for i in range(0, 5):
        para = ['', '', '', '', '']
        opinion.append(para)

    row_height = []
    for i in opinion:
        row_height.append(6 * mm)

    row_height[0] = None

    tbl = Table(opinion,
                colWidths=(27 * mm, 30 * mm, 75 * mm, 20 * mm, 27 * mm),
                rowHeights=row_height)

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('VALIGN', (0, 0), (-1, 0), 'MIDDLE'),
        ]))

    objs.append(tbl)
    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
예제 #25
0
def form_01(request_data):
    """
    Договор, включающий услуги на оплату и необходимые реквизиты
    """
    form_name = "Договор"

    ind_card = Card.objects.get(pk=request_data["card_pk"])
    ind = ind_card.individual
    ind_doc = Document.objects.filter(individual=ind, is_active=True)
    ind_dir = json.loads(request_data["dir"])
    #exec_person = print(request_data.user.doctorprofile.fio)
    exec_person = 'Иванов Иван Иванович'

    # Получить данные с клиента физлицо-ФИО, пол, дата рождения
    individual_fio = ind.fio()
    individual_date_born = ind.bd()

    # Получить все источники, у которых title-ПЛАТНО
    ist_f = []
    ist_f = list(
        IstochnikiFinansirovaniya.objects.values_list('id').filter(
            title__exact='Платно'))
    ist_f_list = []
    ist_f_list = ([int(x[0]) for x in ist_f])

    napr = Napravleniya.objects.filter(id__in=ind_dir)
    dir_temp = []

    #Проверить, что все направления принадлежат к одной карте и имеют ист. финансирования "Платно"
    num_contract_set = set()
    for n in napr:
        if (n.istochnik_f_id in ist_f_list) and (n.client == ind_card):
            num_contract_set.add(n.num_contract)
            dir_temp.append(n.pk)

    # получить УСЛУГИ по направлениям(отфильтрованы по "платно" и нет сохраненных исследований) в Issledovaniya
    research_direction = forms_func.get_research_by_dir(dir_temp)

    # получить по направлению-услугам цену из Issledovaniya
    research_price = forms_func.get_coast_from_issledovanie(research_direction)

    #Получить Итоговую стр-ру данных
    result_data = forms_func.get_final_data(research_price)

    today = datetime.datetime.now()
    date_now1 = datetime.datetime.strftime(today, "%y%m%d%H%M%S%f")[:-3]
    date_now_str = str(ind_card.pk) + str(date_now1)

    # Проверить записан ли номер контракта в направлениях
    # ПереЗаписать номер контракта Если в наборе направлений значение None
    num_contract_set = set()
    napr_end = []
    napr_end = Napravleniya.objects.filter(id__in=result_data[3])
    for n in napr_end:
        num_contract_set.add(n.num_contract)

    if (len(num_contract_set) == 1) and (None in num_contract_set):
        print('Перезаписано т.к. было NONE')
        Napravleniya.objects.filter(id__in=result_data[3]).update(
            num_contract=date_now_str)
    # ПереЗаписать номер контракта Если в наборе направлении значение разные значения
    if len(num_contract_set) > 1:
        print('Перезаписано т.к. были разные контракты в направлениях')
        Napravleniya.objects.filter(id__in=result_data[3]).update(
            num_contract=date_now_str)

    if (len(num_contract_set) == 1) and (not None in num_contract_set):
        print('No-No-No-No не надо создавать номер контракта он есть')
        print()
        date_now_str = num_contract_set.pop()

# Получить данные физлицо-документы: паспорт, полис, снилс
    document_passport = "Паспорт РФ"
    documents = forms_func.get_all_doc(ind_doc)
    document_passport_num = documents['passport']['num']
    document_passport_serial = documents['passport']['serial']
    document_passport_date_start = documents['passport']['date_start']
    document_passport_issued = documents['passport']['issued']

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    # Генерировать pdf-Лист на оплату
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
    pdfmetrics.registerFont(
        TTFont('Symbola', os.path.join(FONTS_FOLDER, 'Symbola.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=12 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=22 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("Лист на оплату"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 9
    style.leading = 12
    style.spaceAfter = 0 * mm
    style.alignment = TA_JUSTIFY
    style.firstLineIndent = 15
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 9
    styleCenter.leading = 10
    styleCenter.spaceAfter = 0 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 20
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []
    barcode128 = code128.Code128(date_now_str, barHeight=6 * mm, barWidth=1.25)

    objs.append(Spacer(1, 11 * mm))

    # head = [
    #     Paragraph('ДОГОВОР &nbsp;&nbsp; № <u>{}</u>'.format(date_now_str),styleCenter),
    #     Spacer(1, 1 * mm),
    #     Paragraph('НА ОКАЗАНИЕ ПЛАТНЫХ МЕДИЦИНСКИХ УСЛУГ НАСЕЛЕНИЮ', styleCenter),
    #     ]
    objs.append(
        Paragraph('ДОГОВОР &nbsp;&nbsp; № <u>{}</u>'.format(date_now_str),
                  styleCenter))
    objs.append(Spacer(1, 1 * mm))
    objs.append(
        Paragraph('НА ОКАЗАНИЕ ПЛАТНЫХ МЕДИЦИНСКИХ УСЛУГ НАСЕЛЕНИЮ',
                  styleCenter))
    styleTCenter = deepcopy(styleCenter)
    styleTCenter.alignment = TA_CENTER
    styleTCenter.leading = 3.5 * mm

    styleTBold = deepcopy(styleCenterBold)
    styleTBold.fontSize = 10
    styleTBold.alignment = TA_LEFT

    # barcode128 = code128.Code128(date_now_str,barHeight= 4 * mm, barWidth = 1.25)

    date_now = pytils.dt.ru_strftime(u"%d %B %Y",
                                     inflected=True,
                                     date=datetime.datetime.now())

    styleTR = deepcopy(style)
    styleTR.alignment = TA_RIGHT

    opinion = [
        [
            Paragraph('г. Иркутск', style),
            Paragraph('{} года'.format(date_now), styleTR)
        ],
    ]

    tbl = Table(opinion, colWidths=(95 * mm, 95 * mm))

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.white),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm),
        ]))

    objs.append(Spacer(1, 5 * mm))
    objs.append(tbl)

    objs.append(Spacer(1, 4.5 * mm))
    hospital_name = SettingManager.get("rmis_orgname")
    hospital_short_name = SettingManager.get("org_title")
    hospital_address = SettingManager.get("org_address")

    post_contract = SettingManager.get("post_contract")
    document_base = SettingManager.get("document_base")

    if document_passport_issued:
        passport_who_give = document_passport_issued
    else:
        passport_who_give = "______________________________________________________________________"

    if ind_card.main_address:
        main_address = ind_card.main_address
    else:
        main_address = "______________________________________________________________________"

    if ind_card.fact_address:
        fact_address = ind_card.fact_address
    elif main_address:
        fact_address = main_address
    else:
        fact_address = "______________________________________________________________________"

    objs.append(
        Paragraph(
            '{}, именуемая в дальнейшем "Исполнитель", в лице {} {}, действующего(ей) на основании {} с '
            'одной стороны, и <u>{}</u>, именуемый(ая) в дальнейшем "Пациент", дата рождения {} г., '
            'паспорт: {}-{} '
            'выдан {} г. '
            'кем: {} '
            'зарегистрирован по адресу: {}, '
            'адрес проживания: {} '
            'с другой стороны, вместе также именуемые "Стороны", заключили настоящий договор (далее - "Договор") о нижеследующем:'
            .format(hospital_name, post_contract, exec_person, document_base,
                    individual_fio, individual_date_born,
                    document_passport_serial, document_passport_num,
                    document_passport_date_start, passport_who_give,
                    main_address, fact_address), style))

    objs.append(Spacer(1, 2 * mm))
    objs.append(Paragraph('1. ПРЕДМЕТ ДОГОВОРА', styleCenter))
    objs.append(
        Paragraph(
            '1.1. Исполнитель на основании обращения Пациента обязуется оказать ему медицинские услуги в соответствие с лицензией:',
            style))

    #Касьяненко начало шаблон услуг только для водителей, на работу
    template_research = "Перечень услуг"
    # Касьяненко конец

    tr = ""
    if template_research:
        tr = template_research
    objs.append(Spacer(1, 2 * mm))
    objs.append(Paragraph('{}'.format(tr), style))

    styleTB = deepcopy(style)
    styleTB.firstLineIndent = 0
    styleTB.fontSize = 8.5
    styleTB.alignment = TA_CENTER
    styleTB.fontName = "PTAstraSerifBold"

    styleTC = deepcopy(style)
    styleTC.firstLineIndent = 0
    styleTC.fontSize = 8.5
    styleTC.alignment = TA_LEFT

    styleTCright = deepcopy(styleTC)
    styleTCright.alignment = TA_RIGHT

    styleTCcenter = deepcopy(styleTC)
    styleTCcenter.alignment = TA_CENTER

    opinion = []
    if result_data[2] == 'no_discount':
        opinion = [
            [
                Paragraph('Код услуги', styleTB),
                Paragraph('Направление', styleTB),
                Paragraph('Услуга', styleTB),
                Paragraph('Цена,<br/>руб.', styleTB),
                Paragraph('Кол-во, усл.', styleTB),
                Paragraph('Сумма, руб.', styleTB),
            ],
        ]
    else:
        opinion = [
            [
                Paragraph('Код услуги', styleTB),
                Paragraph('Направление', styleTB),
                Paragraph('Услуга', styleTB),
                Paragraph('Цена,<br/>руб.', styleTB),
                Paragraph('Скидка<br/>Наценка<br/>%', styleTB),
                Paragraph('Цена со<br/> скидкой,<br/>руб.', styleTB),
                Paragraph('Кол-во, усл.', styleTB),
                Paragraph('Сумма, руб.', styleTB),
            ],
        ]

    # example_template = [
    #     ['1.2.3','4856397','Полный гематологический анализ','1000.00','0','1000.00','1','1000.00'],
    #     ['1.2.3','','РМП','2500.45','0','2500.45','1','2500.45'],
    #     ['1.2.3', '4856398', 'УЗИ брюшной полости', '3500.49', '0', '3500.49', '1', '3500.49'],
    #     ['1.2.3','4856398','Эзофагогастродуоденоскопия','5700.99','0','5700.99','1','5700.99']
    # ]
    # #

    example_template = result_data[0]

    list_g = []

    #используется range(len()) - к определенной колонке (по номеру) применяется свое свойство
    for i in range(len(example_template)):
        list_t = []
        for j in range(len(example_template[i])):
            if j in (3, 5, 7):
                s = styleTCright
            elif j in (4, 6):
                s = styleTCcenter
            else:
                s = styleTC
            list_t.append(Paragraph(example_template[i][j], s))
        list_g.append(list_t)

    sum_research = result_data[1]

    sum_research_decimal = sum_research.replace(' ', '')

    opinion.extend(list_g)

    if result_data[2] == 'is_discount':
        tbl = Table(opinion,
                    colWidths=(18 * mm, 19 * mm, 52 * mm, 22 * mm, 21 * mm,
                               22 * mm, 13 * mm, 25 * mm))
    else:
        tbl = Table(opinion,
                    colWidths=(23 * mm, 34 * mm, 62 * mm, 22 * mm, 23 * mm,
                               25 * mm))

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ]))

    objs.append(tbl)
    objs.append(Spacer(1, 1 * mm))
    objs.append(
        Paragraph('<font size=12> Итого: {}</font>'.format(sum_research),
                  styleTCright))
    objs.append(Spacer(1, 2 * mm))

    objs.append(Spacer(1, 3 * mm))
    objs.append(
        Paragraph(
            '(далее - "медицинские услуги"), а Пациент уплачивает Исполнителю вознаграждение в размере, '
            'порядке и сроки, которые установлены настоящим Договором.',
            style))
    objs.append(
        Paragraph(
            '1.2.	Исполнитель оказывает услуги по месту своего нахождения по адресу: '
            'г. Иркутск, Байкальская, 201, в соответствии с установленными Правилами предоставления платных медицинских услуг.',
            style))
    objs.append(Spacer(1, 2 * mm))
    objs.append(Paragraph('2. ПРАВА И ОБЯЗАННОСТИ СТОРОН', styleCenter))
    objs.append(Paragraph('<u>2.1. Исполнитель обязуется:</u>', style))
    objs.append(
        Paragraph(
            '2.1.1. Обеспечить Пациента бесплатной, доступной и достоверной информацией о платных медицинских услугах, '
            'содержащей следующие сведения о:', style))
    objs.append(
        Paragraph(
            'а) порядках оказания медицинской помощи и стандартах медицинской помощи, применяемых при предоставлении платных медицинских услуг;',
            style))
    objs.append(
        Paragraph(
            'б) данных о конкретном медицинском работнике, предоставляющем соответствующую платную медицинскую услугу (его профессиональном образовании и квалификации);',
            style))
    objs.append(
        Paragraph(
            'в) данных о методах оказания медицинской помощи, связанных с ними рисках, возможных видах медицинского вмешательства, их последствиях и ожидаемых результатах оказания медицинской помощи;',
            style))
    objs.append(
        Paragraph(
            'г) других сведениях, относящихся к предмету настоящего Договора.',
            style))
    objs.append(
        Paragraph(
            '2.1.2.Оказывать Пациенту услуги, предусмотренные п. 1.1 настоящего Договора, а при необходимости и дополнительные услуги.',
            style))
    objs.append(
        Paragraph(
            '2.1.3.Давать при необходимости по просьбе Пациента разъяснения о ходе оказания услуг ему и '
            'предоставлять по требованию Пациента необходимую медицинскую документацию.',
            style))
    objs.append(
        Paragraph(
            '2.1.4.Предоставить в доступной форме информацию о возможности получения соответствующих видов '
            'и объемов медицинской помощи без взимания платы в рамках Программы государственных гарантий '
            'бесплатного оказания гражданам медицинской помощи и территориальной программы государственных гарантий '
            'бесплатного оказания гражданам медицинской помощи.', style))
    objs.append(
        Paragraph(
            '2.15. Соблюдать порядки оказания медицинской помощи, утвержденные Министерством здравоохранения '
            'Российской Федерации.', style))
    objs.append(Paragraph('<u>2.2. Пациент обязуется:</u>', style))
    objs.append(
        Paragraph('2.2.1. Соблюдать назначение и рекомендации лечащих врачей.',
                  style))
    objs.append(
        Paragraph(
            '2.2.3. Оплачивать услуги Исполнителя в порядке, сроки и на условиях, которые установлены настоящим Договором.',
            style))
    objs.append(
        Paragraph(
            '2.2.4. Подписывать своевременно акты об оказании услуг Исполнителем.',
            style))
    objs.append(Paragraph('2.2.5. Кроме того Пациент обязан:', style))
    objs.append(
        Paragraph(
            '- информировать врача о перенесенных заболеваниях, известных ему аллергических реакциях, противопоказаниях;',
            style))
    objs.append(
        Paragraph(
            '- соблюдать правила поведения пациентов в медицинском учреждении, режим работы медицинского учреждения;',
            style))
    objs.append(
        Paragraph(
            '- выполнять все рекомендации медицинского персонала и третьих лиц, оказывающих ему по настоящему Договору'
            'медицинские услуги, по лечению, в том числе соблюдать указания медицинского учреждения, предписанные на период после оказания услуг.',
            style))
    objs.append(
        Paragraph(
            '2.3.	Предоставление Исполнителем дополнительных услуг оформляется дополнительным соглашением Сторон и оплачивается дополнительно.',
            style))
    objs.append(
        Paragraph(
            '2.4.	Стороны обязуются хранить в тайне лечебную, финансовую и иную конфиденциальную информацию, '
            'полученную от другой Стороны при исполнении настоящего Договора.',
            style))
    objs.append(Paragraph('3. ПОРЯДОК ИСПОЛНЕНИЯ ДОГОВОРА', styleCenter))
    objs.append(
        Paragraph(
            '3.1.	Условия получения Пациентом медицинских услуг: (вне медицинской организации; амбулаторно; '
            'в дневном стационаре; стационарно; указать,организационные моменты, связанные с оказанием медицинских услуг)',
            style))
    objs.append(
        Paragraph(
            '3.2.	В случае если при предоставлении платных медицинских услуг требуется предоставление '
            'на возмездной основе дополнительных медицинских услуг, не предусмотренных настоящим Договором, '
            'Исполнитель обязан предупредить об этом Пациента.', style))
    objs.append(
        Paragraph(
            'Без согласия Пациента Исполнитель не вправе предоставлять дополнительные медицинские услуги на возмездной основе.',
            style))
    objs.append(
        Paragraph(
            '3.3.	В случае, если при предоставлении платных медицинских услуг потребуется предоставление '
            'дополнительных медицинских услуг по экстренным показаниям для устранения угрозы жизни Пациента'
            ' при внезапных острых заболеваниях, состояниях, обострениях хронических заболеваний, такие '
            'медицинские услуги оказываются без взимания платы в соответствии с Федеральным загоном '
            'от 21.11.2011N 323-ФЗ "Об основах охраны здоровья граждан в Российской Федерации".',
            style))
    objs.append(
        Paragraph(
            '3.4.	В случае отказа Пациента после заключения Договора от получения медицинских услуг Договор '
            'расторгается. При этом Пациент оплачивает Исполнителю фактически понесенные Исполнителем расходы,'
            'связанные с исполнением обязательств по Договору. ', style))
    objs.append(
        Paragraph(
            '3.5. К отношениям, связанным с исполнением настоящего Договора, применяются положения Закона '
            'Российской Федерации от 7 февраля 1992 г. N 2300-1 "О защите прав потребителей".',
            style))
    objs.append(Paragraph('4. ПОРЯДОК ОПЛАТЫ', styleCenter))

    s = pytils.numeral.rubles(float(sum_research_decimal))
    objs.append(
        Paragraph(
            '4.1.	Стоимость медицинских услуг составляет: <u>{}</u> '.format(
                s.capitalize()), style))
    objs.append(Paragraph('Сроки оплаты:', style))
    objs.append(
        Paragraph(
            'Предоплата________________________________________ , оставшаяся сумма______________________________ рублей',
            style))
    objs.append(Paragraph('Сроки оплаты: _________________________', style))
    objs.append(
        Paragraph(
            '4.2.	Компенсируемые расходы Исполнителя на _________________________________________________',
            style))
    objs.append(Paragraph('составляют_____________________ рублей', style))
    objs.append(
        Paragraph(
            '4.3.	Оплата услуг производится путем перечисления суммы на расчетный счет Исполнителя или путем внесения в кассу Исполнителя.',
            style))
    objs.append(
        Paragraph(
            'Пациенту в соответствии с законодательством Российской Федерации выдается документ; '
            'подтверждающий произведенную оплату предоставленных медицинских услуг (кассовый чек, квитанция '
            'или иные документы).', style))
    objs.append(
        Paragraph(
            '4.4.	Дополнительные услуги оплачиваются на основании акта об оказанных услугах, подписанного Сторонами.',
            style))
    objs.append(Paragraph('5. ОТВЕТСТВЕННОСТЬ СТОРОН', styleCenter))
    objs.append(
        Paragraph(
            '5.1.	Исполнитель несет ответственность перед Пациентом за неисполнение или ненадлежащее '
            'исполнение условий настоящего Договора, несоблюдение требований, предъявляемых к методам '
            'диагностики, профилактики и лечения, разрешенным на территории Российской Федерации, а также '
            'в случае причинения вреда здоровью и жизни Пациента.', style))
    objs.append(
        Paragraph(
            '5.2.	При несоблюдении Исполнителем обязательств по срокам исполнения услуг Пациент вправе по своему выбору:',
            style))
    objs.append(Paragraph('- назначить новый срок оказания услуги;', style))
    objs.append(
        Paragraph('- потребовать уменьшения стоимости предоставленной услуги;',
                  style))
    objs.append(
        Paragraph('- потребовать исполнения услуги другим специалистом;',
                  style))
    objs.append(
        Paragraph(
            '- расторгнуть настоящий Договор и потребовать возмещения убытков.',
            style))
    objs.append(
        Paragraph(
            '5.3.	Ни одна из Сторон не будет нести ответственности за полное или частичное неисполнение другой '
            'Стороной своих обязанностей, если, неисполнение будет являться следствием обстоятельств непреодолимой '
            'силы, таких как, пожар, наводнение, землетрясение, забастовки и другие стихийные бедствия; '
            'война и военные действия или другие обстоятельства, находящиеся вне контроля Сторон, '
            'препятствующие выполнению настоящего Договора, возникшие после заключения Договора, а также по '
            'иным основаниям, предусмотренным законом', style))
    objs.append(
        Paragraph(
            'Если любое из таких обстоятельств непосредственно повлияло на неисполнение обязательства в '
            'срок, указанный в Договоре, то этот срок соразмерно отодвигается на время действия соответствующего '
            'обстоятельства.', style))
    objs.append(
        Paragraph(
            '5.4.	Вред, причиненный жизни или здоровью Пациента в результате предоставления некачественной '
            'платной медицинской услуги, подлежит возмещению Исполнителем в соответствии с законодательством '
            'Российской Федерации.', style))
    objs.append(Paragraph('6. ПОРЯДОК РАССМОТРЕНИЯ СПОРОВ', styleCenter))
    objs.append(
        Paragraph(
            '6.1.	Все споры, претензии и разногласия, которые могут возникнуть между Сторонами, будут '
            'разрешаться путем переговоров.', style))
    objs.append(
        Paragraph(
            '6.2.	При не урегулировании в процессе переговоров спорных вопросов споры подлежат рассмотрению '
            'в судебном порядке.', style))
    objs.append(Paragraph('7. СРОК ДЕЙСТВИЯ ДОГОВОРА', styleCenter))
    objs.append(
        Paragraph(
            '7.1.	Срок действия настоящего Договора: с «	»	201	г. по «	»	201	г.',
            style))
    objs.append(
        Paragraph(
            '7.2.	Настоящий Договор, может быть, расторгнут по обоюдному согласию Сторон или в порядке, '
            'предусмотренном действующим законодательством.', style))
    objs.append(
        Paragraph(
            '7.3.	Все изменения и дополнения к настоящему Договору, а также его расторжение считаются '
            'действительными при условии, если они совершены в письменной форме и подписаны уполномоченными'
            ' на то представителями обеих Сторон.', style))
    objs.append(Paragraph('8. ИНЫЕ УСЛОВИЯ', styleCenter))
    objs.append(
        Paragraph(
            '8.1.	Все дополнительные соглашения Сторон, акты и иные приложения к настоящему Договору, '
            'подписываемые Сторонами при исполнении настоящего Договора, являются его неотъемлемой частью.',
            style))
    objs.append(
        Paragraph(
            '8.2.	Настоящий Договор составлен в 2 (двух) экземплярах, имеющих одинаковую юридическую силу, '
            'по одному для каждой из Сторон', style))
    # objs.append(Paragraph('9. АДРЕСА И РЕКВИЗИТЫ СТОРОН', styleCenter))

    styleAtr = deepcopy(style)
    styleAtr.firstLineIndent = 0
    f = ind.family
    n = ind.name[0:1]
    p = ind.patronymic[0:1]
    npf = n + '.' + ' ' + p + '.' + ' ' + f
    fio_director_list = exec_person.split(' ')
    print(fio_director_list)
    dir_f = fio_director_list[0]
    dir_n = fio_director_list[1]
    dir_p = fio_director_list[2]
    dir_npf = dir_n[0:1] + '.' + ' ' + dir_p[0:1] + '.' + ' ' + dir_f

    styleAtrEndStr = deepcopy(styleAtr)

    # styleAtrEndStr.spaceBefor = 5

    space_symbol = '&nbsp;'
    opinion = [
        [
            Paragraph('Исполнитель', styleAtr),
            Paragraph('', styleAtr),
            Paragraph('Пациент/Плательщик:', styleAtr)
        ],
        [
            Paragraph('{} <br/>{}'.format(hospital_name, hospital_address),
                      styleAtr),
            Paragraph('', styleAtr),
            Paragraph(
                '{}<br/>Паспорт: {}-{}<br/>Адрес:{}'.format(
                    individual_fio, document_passport_serial,
                    document_passport_num, ind_card.main_address), styleAtr)
        ],
        [
            Paragraph('', styleAtr),
            Paragraph('', style),
            Paragraph('', styleAtr)
        ],
        [
            Paragraph('Сотрудник {}'.format(hospital_short_name), styleAtr),
            Paragraph('', styleAtr),
            Paragraph('', styleAtr)
        ],
        [
            Paragraph('________________________/{}/'.format(dir_npf),
                      styleAtr),
            Paragraph('', styleAtr),
            Paragraph(
                '/{}/________________________ <font face="Symbola" size=18>\u2713</font>'
                .format(npf), styleAtr)
        ],
    ]

    rowHeights = 5 * [None]
    rowHeights[4] = 35
    tbl = Table(opinion,
                colWidths=(90 * mm, 10 * mm, 90 * mm),
                rowHeights=rowHeights)

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.white),
            ('TOPPADDING', (0, 0), (-1, -1), 1.5 * mm),
            ('VALIGN', (0, 0), (-1, -2), 'TOP'),
            ('VALIGN', (0, -1), (-1, -1), 'BOTTOM'),
            ('BOTTOMPADDING', (0, -1), (-1, -1), 4.2 * mm),
            ('BOTTOMPADDING', (0, -1), (0, -1), 1 * mm),
        ]))

    objs.append(Spacer(1, 2 * mm))

    objs.append(
        KeepTogether(
            [Paragraph('9. АДРЕСА И РЕКВИЗИТЫ СТОРОН', styleCenter), tbl]))

    objs.append(Spacer(1, 7 * mm))

    styleRight = deepcopy(style)
    styleRight.alignment = TA_RIGHT

    space_symbol = ' '

    qr_napr = ','.join([str(elem) for elem in result_data[3]])
    protect_val = SettingManager.get('protect_val')
    bstr = (qr_napr + protect_val).encode()
    protect_code = str(zlib.crc32(bstr))

    left_size_str = hospital_short_name + 15 * space_symbol + protect_code + 15 * space_symbol

    qr_value = npf + '(' + qr_napr + '),' + protect_code

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.setFont("PTAstraSerifReg", 9)
        # вывести интерактивную форму "текст"
        form = canvas.acroForm
        # canvas.drawString(25, 780, '')
        form.textfield(name='comment',
                       tooltip='comment',
                       fontName='Times-Roman',
                       fontSize=10,
                       x=57,
                       y=750,
                       borderStyle='underlined',
                       borderColor=black,
                       fillColor=white,
                       width=515,
                       height=13,
                       textColor=black,
                       forceBorder=False)

        # Вывести на первой странице код-номер договора
        barcode128.drawOn(canvas, 120 * mm, 283 * mm)

        #вывести внизу QR-code (ФИО, (номера направлений))
        qr_code = qr.QrCodeWidget(qr_value)
        qr_code.barWidth = 70
        qr_code.barHeight = 70
        qr_code.qrVersion = 1
        bounds = qr_code.getBounds()
        width = bounds[2] - bounds[0]
        height = bounds[3] - bounds[1]
        d = Drawing()
        d.add(qr_code)
        renderPDF.draw(d, canvas, 90 * mm, 7)
        #вывести атрибуты для подписей
        canvas.setFont('PTAstraSerifReg', 10)
        canvas.drawString(40 * mm, 10 * mm, '____________________________')
        canvas.drawString(115 * mm, 10 * mm,
                          '/{}/____________________________'.format(npf))
        canvas.setFont('Symbola', 18)
        canvas.drawString(195 * mm, 10 * mm, '\u2713')

        canvas.setFont('PTAstraSerifReg', 8)
        canvas.drawString(50 * mm, 7 * mm, '(подпись сотрудника)')
        canvas.drawString(160 * mm, 7 * mm, '(подпись плательщика)')

        #вывестии защитны вертикальный мелкий текст
        canvas.rotate(90)
        canvas.setFillColor(HexColor(0x4f4b4b))
        canvas.setFont('PTAstraSerifReg', 5.2)
        canvas.drawString(10 * mm, -12 * mm, '{}'.format(6 * left_size_str))

        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        #вывести внизу QR-code (ФИО, (номера направлений))
        qr_code = qr.QrCodeWidget(qr_value)
        qr_code.barWidth = 70
        qr_code.barHeight = 70
        qr_code.qrVersion = 1
        bounds = qr_code.getBounds()
        width = bounds[2] - bounds[0]
        height = bounds[3] - bounds[1]
        d = Drawing()
        d.add(qr_code)
        renderPDF.draw(d, canvas, 90 * mm, 7)
        #вывести атрибуты для подписей
        canvas.setFont('PTAstraSerifReg', 10)
        canvas.drawString(40 * mm, 10 * mm, '____________________________')
        canvas.drawString(115 * mm, 10 * mm,
                          '/{}/____________________________'.format(npf))

        canvas.setFont('Symbola', 18)
        canvas.drawString(195 * mm, 10 * mm, '\u2713')

        canvas.setFont('PTAstraSerifReg', 8)
        canvas.drawString(50 * mm, 7 * mm, '(подпись сотрудника)')
        canvas.drawString(160 * mm, 7 * mm, '(подпись плательщика)')

        canvas.rotate(90)
        canvas.setFillColor(HexColor(0x4f4b4b))
        canvas.setFont('PTAstraSerifReg', 5.2)
        canvas.drawString(10 * mm, -12 * mm, '{}'.format(6 * left_size_str))
        canvas.restoreState()

    doc.build(objs,
              onFirstPage=first_pages,
              onLaterPages=later_pages,
              canvasmaker=PageNumCanvas)

    pdf = buffer.getvalue()

    buffer.close()
    return pdf
예제 #26
0
def log_cleanup(request):
    _, cnt = slog.objects.filter(
        time__lt=datetime.today() - timedelta(days=SettingManager.get("max_log_store_days", "120", "i"))).exclude(type__in=(7, 21, 9, 11, 12, 4000, 13, 14, 24, 26, 5001)).delete()
    return HttpResponse(str(cnt.get("slog.Log", 0)), content_type="text/plain")
예제 #27
0
def log(request):
    response = {"cnt": slog.objects.all().count(),
                "store_days": SettingManager.get("max_log_store_days", "120", "i")}
    response["to_delete"] = slog.objects.filter(
        time__lt=datetime.today() - timedelta(days=response["store_days"])).exclude(type__in=(7, 21, 9, 11, 12, 4000, 13, 14, 24, 26, 5001)).count()
    return JsonResponse(response)
예제 #28
0
def construct_consults(request):
    if SettingManager.get("consults_module", default='false',
                          default_type='b'):
        return render(request, 'construct_consults.html')
    else:
        return redirect('/')
예제 #29
0
파일: l2.py 프로젝트: moodpulse/l2
def get_headers(token=None):
    return {"Authorization": "Bearer {}".format(token or SettingManager.get("l2_patients_token", default='token', default_type='s'))}
예제 #30
0
파일: l2.py 프로젝트: moodpulse/l2
def get_url(path, base=None):
    return urljoin(base or SettingManager.get("l2_patients_url", default='http://localhost/if', default_type='s'), path)