示例#1
0
def counts(request):
    data = json.loads(request.body)
    pk = int(data["direction"])
    every = data.get("every", False)
    result = defaultdict(int)

    if every:
        hosps = list(
            map(
                lambda d: d["direction"],
                filter(
                    lambda d: not Napravleniya.objects.get(pk=d["direction"]).
                    cancel, hosp_get_hosp_direction(pk))))
        result["all"] += 1
    else:
        hosps = [pk]

    for i in Issledovaniya.objects.filter(
            napravleniye__pk__in=hosps, research__is_hospital=True).distinct():
        for k in HospitalService.TYPES_BY_KEYS:
            hss = HospitalService.objects.filter(
                main_research=i.research,
                site_type=HospitalService.TYPES_BY_KEYS[k])
            nested = Napravleniya.objects.filter(
                parent=i,
                issledovaniya__research__in=[x.slave_research
                                             for x in hss]).distinct()
            result[k] += nested.count()
        result["laboratory"] += Napravleniya.objects.filter(
            parent=i, issledovaniya__research__podrazdeleniye__p_type=2
        ).distinct().count()
        result["paraclinical"] += Napravleniya.objects.filter(
            parent=i,
            issledovaniya__research__is_paraclinic=True).distinct().count()
        result["consultation"] += Napravleniya.objects.filter(
            parent=i,
            issledovaniya__research__is_doc_refferal=True).distinct().count()
        result["morfology"] += (Napravleniya.objects.filter(parent=i).filter(
            Q(issledovaniya__research__is_microbiology=True)
            | Q(issledovaniya__research__is_citology=True)
            | Q(issledovaniya__research__is_gistology=True)).distinct().count(
            ))
        result["pharmacotherapy"] = ProcedureList.objects.filter(
            history=i.napravleniye,
            cancel=False,
            diary__issledovaniya__time_confirmation__isnull=False).count()
        result["all"] += Napravleniya.objects.filter(parent=i).count()
    return JsonResponse(dict(result))
示例#2
0
def procedure_for_extract(request):
    request_data = json.loads(request.body)
    iss_pk = request_data.get('pk', -1)
    obj_iss = Issledovaniya.objects.get(pk=iss_pk)
    hosp_direction = hosp_get_hosp_direction(obj_iss.napravleniye_id)
    result_dir = [i["direction"] for i in hosp_direction]
    pharma_result = get_pharmacotherapy_exec_by_directions(tuple(result_dir))

    prev_prescription = None
    step = 0
    tmp_prescription = {"pharmaTitle": "", "mode": ""}
    result = []
    for i in pharma_result:
        if i.prescription_id != prev_prescription and step != 0:
            tmp_result = ""
            for k, v in tmp_prescription["mode"].items():
                tmp_result = f"{tmp_result} {k}-{len(v)}р/д; "
            tmp_prescription["mode"] = tmp_result
            result.append(tmp_prescription.copy())
            tmp_prescription = {"pharmaTitle": "", "mode": ""}

        title = i.mnn if i.mnn else i.trade_name
        current_title = f"{title} {i.form_title} {i.method_title} {i.dosage} {i.units} {i.comment}"
        if tmp_prescription["pharmaTitle"] != current_title:
            tmp_prescription["pharmaTitle"] = current_title
            tmp_prescription["mode"] = {i.date_char: []}
        current_time = tmp_prescription["mode"].get(i.date_char, [])
        current_time.append(i.time_char)
        tmp_prescription["mode"][i.date_char] = current_time.copy()
        step += 1
        prev_prescription = i.prescription_id

    tmp_result = ""
    for k, v in tmp_prescription["mode"].items():
        tmp_result = f"{tmp_result} {k} {len(v)} р/д;"
    tmp_prescription["mode"] = tmp_result
    result.append(tmp_prescription.copy())

    return JsonResponse({"data": result})
示例#3
0
文件: forms109.py 项目: moodpulse/l2
def form_01(request_data):
    # план операций
    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')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(
        buffer, pagesize=landscape(A4), leftMargin=20 * mm, rightMargin=12 * mm, topMargin=6 * mm, bottomMargin=4 * mm, allowSplitting=1, title="Форма {}".format("План операций")
    )

    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10.5
    style.leading = 12
    style.spaceAfter = 0 * mm
    style.alignment = TA_LEFT
    style.firstLineIndent = 0
    style.spaceAfter = 1.5 * mm

    styleCenterBold = deepcopy(style)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 16
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'

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

    styleCenter = deepcopy(style)
    styleCenter.firstLineIndent = 0
    styleCenter.alignment = TA_CENTER

    data = request_data["pks_plan"]
    pks_plan = [int(i) for i in data.split(',')]
    plans = get_plans_by_pk(pks_plan)

    objs = []
    objs.append(Paragraph("План операций", styleCenterBold))
    objs.append(Spacer(1, 5 * mm))

    opinion = [
        [
            Paragraph('Дата операции', styleTB),
            Paragraph('№ Истории', styleTB),
            Paragraph('Пациент', styleTB),
            Paragraph('Вид операции', styleTB),
            Paragraph('Врач - хирург', styleTB),
            Paragraph('Отделение', styleTB),
            Paragraph('Анестезиолог', styleTB),
        ],
    ]

    for i in plans:
        doc_fio = ''
        if i[6]:
            doc_fio = i[6].split(' ')
            if len(doc_fio) == 1:
                doc_fio = doc_fio[0]
            elif len(doc_fio) == 2:
                doc_fio = f"{doc_fio[0]} {doc_fio[1]}"
            else:
                doc_fio = f"{doc_fio[0]} {doc_fio[1][0]}.{doc_fio[2][0]}."
        anesthetist_fio = ''
        if i[9]:
            anesthetist_fio = i[9].split(' ')
            anesthetist_fio = f"{anesthetist_fio[0]} {anesthetist_fio[1][0]}.{anesthetist_fio[2][0]}."
        strike_o = ""
        strike_cl = ""
        if i[10]:
            strike_o = "<strike>"
            strike_cl = "</strike>"
        department = i[7] if i[7] else i[16]

        hosp_nums_obj = hosp_get_hosp_direction(i[2])
        hosp_first_num = hosp_nums_obj[0].get('direction')
        primary_reception_data = primary_reception_get_data(hosp_first_num)
        if primary_reception_data['weight']:
            weight = f", Вес-{primary_reception_data['weight']}"
        else:
            weight = ''
        opinion.append(
            [
                Paragraph(f"{strike_o}{i[3]}{strike_cl}", styleCenter),
                Paragraph(f"{strike_o}{i[2]}{strike_cl}", styleCenter),
                Paragraph(f"{strike_o}{i[11]} {i[12]} {i[13]}, {i[14]}{weight}{strike_cl}", style),
                Paragraph(f"{strike_o}{i[4]}{strike_cl}", style),
                Paragraph(f"{strike_o}{doc_fio}{strike_cl}", style),
                Paragraph(f"{strike_o}{department}{strike_cl}", style),
                Paragraph(f"{strike_o}{anesthetist_fio}{strike_cl}", style),
            ]
        )

    tbl = Table(opinion, colWidths=(30 * mm, 27 * mm, 50 * mm, 50 * mm, 40 * mm, 30 * mm, 40 * mm), splitByRow=1, repeatRows=1)

    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)
    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf
示例#4
0
def load(request):
    data = json.loads(request.body)
    pk = int(data["pk"])
    if pk >= 4600000000000:
        pk -= 4600000000000
        pk //= 10
    hospital_pk = request.user.doctorprofile.get_hospital_id()
    tree_direction = hosp_get_hosp_direction(pk)
    result = {"ok": False, "message": "Нет данных", "data": {}}
    i: Issledovaniya
    for i in Issledovaniya.objects.filter(napravleniye__pk=pk,
                                          research__is_hospital=True):
        direction: Napravleniya = i.napravleniye
        card: Card = direction.client
        result["ok"] = True
        result["message"] = ""
        if direction.cancel:
            result["message"] = "Направление было отменено"
        forbidden_edit = forbidden_edit_dir(direction.pk)
        child_issledovaniye, child_research_title, child_direction = '', '', ''
        for iss in tree_direction:
            if i.pk == iss['parent_iss']:
                child_issledovaniye = iss['issledovaniye']
                iss_obj = Issledovaniya.objects.filter(
                    pk=child_issledovaniye).first()
                if iss_obj:
                    child_direction = iss_obj.napravleniye.pk
                    child_research_title = iss_obj.research.title
                break
        result["data"] = {
            "direction":
            direction.pk,
            "cancel":
            direction.cancel,
            "fin_pk":
            direction.istochnik_f_id,
            "iss":
            i.pk,
            "parent_issledovaniye":
            direction.parent.pk if direction.parent else '-1',
            "child_issledovaniye":
            child_issledovaniye if child_issledovaniye else '-1',
            "child_direction":
            child_direction if child_direction else '-1',
            "child_research_title":
            child_research_title if child_research_title else '-1',
            "iss_title":
            i.research.title,
            "forbidden_edit":
            forbidden_edit or "Врач стационара"
            not in [str(x) for x in request.user.groups.all()],
            "soft_forbidden":
            not forbidden_edit,
            "patient": {
                "fio_age": card.individual.fio(full=True),
                "card": card.number_with_type(),
                "base": card.base_id,
                "card_pk": card.pk,
                "individual_pk": card.individual_id,
            },
            "department_id":
            i.hospital_department_override_id or i.research.podrazdeleniye_id,
            "departments":
            get_hospitals_podrazdeleniya(hospital_pk),
            "tree":
            list(
                map(
                    lambda dirc: {
                        **dirc,
                        "research_title":
                        dirc["research_title"].replace("отделение", "отд.").
                        replace("Отделение", "Отд."),
                        "isCurrent":
                        int(dirc["direction"]) == pk,
                        "cancel":
                        Napravleniya.objects.get(pk=dirc["direction"]).cancel,
                        "correct_level":
                        dirc["correct_level"],
                        "color":
                        dirc["color"],
                        "issledovaniye":
                        dirc["issledovaniye"],
                        "order":
                        dirc["order"],
                    },
                    tree_direction,
                )),
        }
        break
    return JsonResponse(result)
示例#5
0
def form_01(request_data):
    """
    Температурный лист (АД, Пульс)
    на входе: type=107.01&hosps_pk=[113110]&titles=['Температура (°C)', 'Пульс', 'Давление']
    """
    num_dir = json.loads(request_data["hosp_pks"])
    direction_obj = Napravleniya.objects.get(pk=num_dir[0])
    hosp_nums_obj = hosp_get_hosp_direction(num_dir[0])
    hosp_nums = ''
    for i in hosp_nums_obj:
        hosp_nums = hosp_nums + ' - ' + str(i.get('direction'))

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    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')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=landscape(A4),
                            leftMargin=15 * mm,
                            rightMargin=5 * mm,
                            topMargin=13 * mm,
                            bottomMargin=10 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("Лист показателей"))
    width, height = landscape(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    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'
    styleCenterBold.borderColor = black
    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'

    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=13>Показатели жизненно важных функций</font><br/>',
            styleCenter),
        Paragraph(
            '({} № {} {})'.format(patient_data['fio'], p_card_num, hosp_nums),
            styleCenter),
    ]
    objs.extend(title_page)
    objs.append(Spacer(1, 3 * mm))

    result = get_temperature_list(num_dir[0])
    titles = json.loads(request_data["titles"])
    count_in_graph = 26
    if 'Температура (°C)' in titles and 'Температура (°C)' in result:
        result_data = result['Температура (°C)']
        min_max = result_data['min_max']
        count_param = count_len_param(result_data, count_in_graph)
        for i in range(count_param):
            elements = count_graph_el(count_in_graph, result_data)
            temp_obj = [
                Paragraph(' <u>Температура (°C)</u>', style),
                Spacer(1, 2 * mm),
                draw_temper_pulse(
                    {
                        'data': elements[0],
                        'xtext': elements[1],
                        'min_max': min_max
                    }, 1, 250 * mm, 27 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))

    if 'Пульс (уд/с)' in titles and 'Пульс (уд/с)' in result:
        result_data = result['Пульс (уд/с)']
        min_max = result_data['min_max']
        count_param = count_len_param(result_data, count_in_graph)
        for i in range(count_param):
            elements = count_graph_el(count_in_graph, result_data)
            temp_obj = [
                Paragraph(' <u>Пульс (уд/с)</u>', style),
                Spacer(1, 2 * mm),
                draw_temper_pulse(
                    {
                        'data': elements[0],
                        'xtext': elements[1],
                        'min_max': min_max
                    }, 10, 250 * mm, 27 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))

    diastolic = 'Диастолическое давление (мм рт.с)'
    systolic = 'Диастолическое давление (мм рт.с)'
    if 'Давление' in titles and diastolic in result and systolic in result:
        result_data = {
            diastolic: result[diastolic],
            systolic: result[systolic]
        }
        min_max_diastolic = result_data[diastolic]['min_max']
        min_max_systolic = result_data[systolic]['min_max']
        count_param = count_len_param(result_data[diastolic], count_in_graph)
        for i in range(count_param):
            elements = count_graph_el_pressure(count_in_graph, result_data,
                                               diastolic, systolic,
                                               min_max_diastolic,
                                               min_max_systolic)
            temp_obj = [
                Paragraph(
                    '<u>Давление:</u> (<img src="forms/img/squreline.png" width="20" height="10" />  систолическое, '
                    '<img src="forms/img/strokedot.png" width="20" height="10" />  диастолическое)',
                    style,
                ),
                Spacer(1, 2 * mm),
                draw_pressure(elements, 10, 250 * mm, 45 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))
    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
示例#6
0
文件: forms105.py 项目: moodpulse/l2
def form_03(request_data):
    """
    Статистическая форма 066/у Приложение № 5 к приказу Минздрава России от 30 декабря 2002 г. № 413
    """
    num_dir = request_data["dir_pk"]
    direction_obj = Napravleniya.objects.get(pk=num_dir)
    hosp_nums_obj = hosp_get_hosp_direction(num_dir)
    hosp_nums = f"- {hosp_nums_obj[0].get('direction')}"

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    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')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=10 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("066/у-02"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    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'
    styleCenterBold.borderColor = black
    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'

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>форма № 066/у-02</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;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    sex = patient_data['sex']
    if sex == 'м':
        sex = f'{sex} - 1'
    if sex == 'ж':
        sex = f'{sex} - 2'

    doc_patient = f"{patient_data['type_doc']}, {patient_data['serial']} - {patient_data['num']}"
    polis_data = f"{patient_data['oms']['polis_serial']} {patient_data['oms']['polis_num']}"

    ############################################################################################################
    # Получить данные из первичного приема (самого первого hosp-направления)
    hosp_first_num = hosp_nums_obj[0].get('direction')
    primary_reception_data = primary_reception_get_data(hosp_first_num)

    hospitalized = ''
    if primary_reception_data[
            'what_time_hospitalized'] and primary_reception_data[
                'plan_hospital']:
        if primary_reception_data['what_time_hospitalized'].lower().replace(
                ' ', '') == 'впервые':
            hospitalized = "первично - 1"
        if primary_reception_data['what_time_hospitalized'].lower().replace(
                ' ', '') == 'повторно':
            hospitalized = "повторно - 2"
        if primary_reception_data['plan_hospital'].lower().replace(' ',
                                                                   '') == 'да':
            hospitalized = f"{hospitalized}; в плановом порядке -4"
        if primary_reception_data['extra_hospital'].lower().replace(
                ' ', '') == 'да':
            hospitalized = f"{hospitalized}; по экстренным показаниям - 3"

    # Получить отделение - из названия услуги или самого главного направления
    hosp_depart = hosp_nums_obj[0].get('research_title')

    # взять самое последнее направленеие из hosp_dirs
    hosp_last_num = hosp_nums_obj[-1].get('direction')
    # 'Время выписки', 'Дата выписки', 'Основной диагноз (описание)', 'Осложнение основного диагноза (описание)', 'Сопутствующий диагноз (описание)'
    date_value, time_value, outcome, result_hospital = '', '', '', ''
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)
    days_count = '__________________________'
    doc_fio = ''
    if hosp_extract_data:
        if hosp_extract_data['result_hospital']:
            result_hospital = hosp_extract_data['result_hospital']
        if hosp_extract_data['outcome']:
            outcome = hosp_extract_data['outcome']
        if hosp_extract_data['date_value']:
            date_value = hosp_extract_data['date_value']
        if hosp_extract_data['time_value']:
            time_value = hosp_extract_data['time_value']
        days_count = hosp_extract_data['days_count']
        doc_fio = hosp_extract_data['doc_fio']

    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 8 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=13>СТАТИСТИЧЕСКАЯ КАРТА ВЫБЫВШЕГО ИЗ СТАЦИОНАРА<br/> '
            'круглосуточного пребывания, дневного стационара при больничном<br/> учреждении, дневного стационара при'
            ' амбулаторно-поликлиническом<br/> учреждении, стационара на дому<br/>'
            'N медицинской карты {} {}</font>'.format(p_card_num, hosp_nums),
            styleCenter,
        ),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            '1. Код пациента: ________  2. Ф.И.О.: {}'.format(
                patient_data['fio']), style),
        Paragraph(
            '3. Пол: {} {}4. Дата рождения {}'.format(sex, space_symbol * 24,
                                                      patient_data['born']),
            style),
        Paragraph(
            '5. Документ, удостов. личность: (название, серия, номер) {} {}'.
            format(space_symbol * 2, doc_patient), style),
        Paragraph(
            '6. Адрес: регистрация по месту жительства: {}'.format(
                patient_data['main_address']), style),
        Paragraph(
            '7. Код территории проживания: ___ Житель: город - 1; село - 2.',
            style),
        Paragraph('8. Страховой полис (серия, номер):{}'.format(polis_data),
                  style),
        Paragraph('Выдан: {}'.format(patient_data['oms']['polis_issued']),
                  style),
        Paragraph('9. Вид оплаты:______________', style),
        Paragraph(
            '10. Социальный статус: {}'.format(
                primary_reception_data['social_status']), style),
        Paragraph(
            '11. Категория льготности: {}'.format(
                primary_reception_data['category_privilege']), style),
        Paragraph(
            '12. Кем направлен больной: {}'.format(
                primary_reception_data['who_directed']), style),
        Paragraph(
            '13. Кем доставлен: _________________________________ Код______ Номер наряда__________',
            style),
        Paragraph(
            '14. Диагноз направившего учреждения: {}'.format(
                primary_reception_data['diagnos_who_directed']), style),
        Paragraph(
            '14.1 Состояние при поступлении: {}'.format(
                primary_reception_data['state']), style),
        Paragraph(
            '15. Диагноз приемного отделения:{}'.format(
                primary_reception_data['diagnos_entered']), style),
        Paragraph(
            '16. Доставлен в состоянии опьянения: Алкогольного — 1; Наркотического — 2.',
            style),
        Paragraph(
            '17. Госпитализирован по поводу данного заболевания в текущем году: {}'
            .format(hospitalized), style),
        Paragraph(
            '18.Доставлен в стационар от начала заболевания(получения травмы): {}'
            .format(primary_reception_data['time_start_ill']), style),
        Paragraph(
            '19. Травма: {}'.format(primary_reception_data['type_trauma']),
            style),
        Paragraph(
            '20. Дата поступления в приемное отделение:______________ Время__________',
            style),
        Paragraph(
            '21. Название отделения: <u>{}</u>; дата поступления: <u>{}</u>; время: <u>{}</u>'
            .format(hosp_depart, primary_reception_data['date_entered_value'],
                    primary_reception_data['time_entered_value']),
            style,
        ),
        Paragraph(
            'Подпись врача приемного отделения ______________ Код __________',
            style),
        Paragraph(
            '22. Дата выписки (смерти): {}; Время {}'.format(
                date_value, time_value), style),
        Paragraph(
            '23. Продолжительность госпитализации (койко - дней): {}'.format(
                days_count), style),
        Paragraph('24. Исход госпитализации: {}'.format(outcome), style),
        Paragraph('24.1. Результат госпитализации: {}'.format(result_hospital),
                  style),
    ]

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))
    title_page.append(
        Paragraph(
            f"25. Листок нетрудоспособности: открыт <u>{closed_bl_result['start_date']}</u> закрыт: <u>{closed_bl_result['end_date']}</u>"
            f" к труду: <u>{closed_bl_result['start_work']}</u>",
            style,
        ))
    title_page.append(
        Paragraph(f"25.1. Номере ЛН : <u>{closed_bl_result['num']}</u>",
                  style))
    title_page.append(
        Paragraph(f"25.2. Выдан кому : {closed_bl_result['who_get']}", style))
    title_page.append(
        Paragraph(
            '25.3. По уходу за больным Полных лет: _____ Пол: {}'.format(sex),
            style))
    title_page.append(Paragraph('26. Движение пациента по отделениям:', style))

    objs.extend(title_page)

    styleTB = deepcopy(style)
    styleTB.fontSize = 8.7
    styleTB.alignment = TA_CENTER
    styleTB.leading = 3.5 * mm

    styleTC = deepcopy(style)
    styleTC.fontSize = 9.5
    styleTC.alignment = TA_LEFT

    styleTCright = deepcopy(styleTC)
    styleTCright.alignment = TA_RIGHT

    styleTCcenter = deepcopy(styleTC)
    styleTCcenter.alignment = TA_CENTER

    opinion = [[
        Paragraph('N', styleTB),
        Paragraph('Код отделения', styleTB),
        Paragraph('Профиль коек', styleTB),
        Paragraph('Код врача', styleTB),
        Paragraph('Дата поступления', styleTB),
        Paragraph('Дата выписки, перевода', styleTB),
        Paragraph('Код диагноза по МКБ', styleTB),
        Paragraph('Код медицинского стандарта', styleTB),
        Paragraph('Код прерванного случая', styleTB),
        Paragraph('Вид оплаты', styleTB),
    ]]

    patient_movement = hosp_patient_movement(hosp_nums_obj)
    x = 0
    for i in patient_movement:
        x += 1
        doc_code = ''
        if i['doc_confirm_code']:
            doc_code = str(i['doc_confirm_code'])
        tmp_data = [
            [
                Paragraph(str(x), styleTB),
                Paragraph('', styleTB),
                Paragraph(i['bed_profile_research_title'], styleTB),
                Paragraph(doc_code, styleTB),
                Paragraph(i['date_entered_value'], styleTB),
                Paragraph(i['date_oute'], styleTB),
                Paragraph(i['diagnos_mkb'], styleTB),
                Paragraph('', styleTB),
                Paragraph('', styleTB),
                Paragraph('ОМС', styleTB),
            ],
        ]

        opinion.extend(tmp_data.copy())

    # получить структуру данных для таблицы
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(7 * mm, 15 * mm, 30 * mm, 20 * mm, 21 * mm,
                               21 * mm, 20 * mm, 14 * mm, 14 * mm, 20 * mm))

    tbl_act.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_act)
    objs.append(Spacer(1, 2 * mm))
    objs.append(
        Paragraph(
            '27. Хирургические операции(обозначить: основную операцию, использование спец.аппаратуры):',
            style), )

    opinion = [[
        Paragraph('Дата, Час', styleTB),
        Paragraph('Код <br/>хирурга', styleTB),
        Paragraph('Код отделения', styleTB),
        Paragraph('наименование операции', styleTB),
        Paragraph('код операции', styleTB),
        Paragraph('наименование осложнения', styleTB),
        Paragraph('Код ослонения', styleTB),
        Paragraph('Анестезия (код врача)', styleTB),
        Paragraph('энд.', styleTB),
        Paragraph('лазер.', styleTB),
        Paragraph('криог.', styleTB),
        Paragraph('Вид оплаты', styleTB),
    ]]

    patient_operation = hosp_get_operation_data(num_dir)
    operation_result = []
    for i in patient_operation:
        operation_template = [''] * 12
        operation_template[0] = Paragraph(
            i['date'] + '<br/>' + i['time_start'] + '-' + i['time_end'],
            styleTB)
        operation_template[1] = Paragraph(str(i['doc_code']), styleTB)
        operation_template[3] = Paragraph(
            f"{i['name_operation']} <br/><font face=\"PTAstraSerifBold\" size=\"8.7\">({i['category_difficult']})</font>",
            styleTB)
        operation_template[4] = Paragraph(
            '{}'.format(i['code_operation'] + '<br/>' + i['plan_operation']),
            styleTB)
        operation_template[7] = Paragraph(
            '{}'.format(i['anesthesia method'] + '<br/> (' +
                        i['code_doc_anesthesia'] + ')'), styleTB)
        operation_template[5] = Paragraph(i['complications'], styleTB)
        operation_template[11] = Paragraph(" ОМС", styleTB)
        operation_result.append(operation_template.copy())

    opinion.extend(operation_result)
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(22 * mm, 12 * mm, 11 * mm, 26 * mm, 26 * mm,
                               20 * mm, 10 * mm, 15 * mm, 7 * mm, 7 * mm,
                               7 * mm, 16 * mm))
    tbl_act.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_act)
    objs.append(Spacer(1, 2 * mm))
    space_symbol = '&nbsp;'

    objs.append(
        Paragraph('28. Обследован: RW {}  AIDS '.format(space_symbol * 10),
                  style), )
    objs.append(Spacer(1, 2 * mm))
    objs.append(Paragraph('29. Диагноз стационара(при выписке):', style), )

    opinion = [[
        Paragraph('Клинический заключительный', styleTB),
        Paragraph('Основное заболевание', styleTB),
        Paragraph('Код МКБ', styleTB),
        Paragraph('Осложнение', styleTB),
        Paragraph('Код МКБ', styleTB),
        Paragraph('Сопутствующее заболевание', styleTB),
        Paragraph('Код МКБ', styleTB),
    ]]

    hosp_last_num = hosp_nums_obj[-1].get('direction')
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)

    opinion_diagnos = []
    if hosp_extract_data:
        opinion_diagnos = [[
            Paragraph('', styleTB),
            Paragraph(hosp_extract_data['final_diagnos'], styleTB),
            Paragraph(hosp_extract_data['final_diagnos_mkb'], styleTB),
            Paragraph(hosp_extract_data['other_diagnos'], styleTB),
            Paragraph(hosp_extract_data['other_diagnos_mkb'], styleTB),
            Paragraph(
                hosp_extract_data['near_diagnos'].replace('<', '&lt;').replace(
                    '>', '&gt;'), styleTB),
            Paragraph(hosp_extract_data['near_diagnos_mkb'], styleTB),
        ]]

    opinion.extend(opinion_diagnos)
    opinion_pathologist = [[
        Paragraph('Патологоанатомический	', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
    ]]

    opinion.extend(opinion_pathologist)
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(28 * mm, 45 * mm, 15 * mm, 30 * mm, 15 * mm,
                               30 * mm, 15 * mm))
    tbl_act.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'),
            ('SPAN', (0, 0), (0, 1)),
        ]))

    objs.append(tbl_act)
    objs.append(Spacer(1, 2 * mm))
    objs.append(
        Paragraph(
            '30.В случае смерти указать основную причину:______________________________________________________________'
            'Код МКБ', style), )
    objs.append(Spacer(1, 20 * mm))
    objs.append(
        Paragraph(
            '31. Дефекты догоспитального этапа: несвоевременность госпитализации - 1; недостаточный объем клинико - диагностического обследования - 2; '
            'неправильная тактика лечения - 3; несовпадение диагноза - 4.',
            style,
        ), )
    objs.append(Spacer(1, 7 * mm))
    objs.append(
        Paragraph(
            'Подпись лечащего врача ({}) ____________________________'.format(
                doc_fio), style), )
    objs.append(Spacer(1, 7 * mm))
    objs.append(Paragraph('Подпись заведующего отделением', style), )

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf
示例#7
0
文件: forms106.py 项目: moodpulse/l2
def form_01(request_data):
    """
    Форма 003/у - cстационарная карта
    """

    num_dir = request_data["dir_pk"]
    direction_obj = Napravleniya.objects.get(pk=num_dir)
    hosp_nums_obj = hosp_get_hosp_direction(num_dir)
    hosp_nums = f"- {hosp_nums_obj[0].get('direction')}"

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    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')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=20 * mm,
                            rightMargin=12 * mm,
                            topMargin=6 * mm,
                            bottomMargin=4 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("003/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    style.spaceAfter = 0.5 * mm

    styleLead = deepcopy(style)
    styleLead.leading = 12
    styleLead.alignment = TA_JUSTIFY

    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'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    styleRight = deepcopy(styleJustified)
    styleRight.alignment = TA_RIGHT

    objs = []

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

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>форма № 003/у</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;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    p_phone = ''
    if patient_data['phone']:
        p_phone = 'тел.: ' + ", ".join(patient_data['phone'])

    p_address = patient_data['main_address']
    work_place = patient_data['work_place_db'] if patient_data[
        'work_place_db'] else patient_data['work_place']
    p_work = work_place

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    # взять самое последнее направленеие из hosp_dirs
    hosp_last_num = hosp_nums_obj[-1].get('direction')
    ############################################################################################################
    # Получение данных из выписки
    # Взять услугу типа выписка. Из полей "Дата выписки" - взять дату. Из поля "Время выписки" взять время
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)

    extrac_date, extract_time, final_diagnos, other_diagnos, near_diagnos, outcome, doc_fio, manager_depart, room_num, depart_extract = '', '', '', '', '', '', '', '', '', ''
    days_count = '__________________________'

    if hosp_extract_data:
        extrac_date = hosp_extract_data['date_value']
        extract_time = hosp_extract_data['time_value']
        final_diagnos = hosp_extract_data['final_diagnos']
        other_diagnos = hosp_extract_data['other_diagnos']
        near_diagnos = hosp_extract_data['near_diagnos']
        days_count = hosp_extract_data['days_count']
        if hosp_extract_data['outcome']:
            outcome = hosp_extract_data['outcome'] + ' (' + hosp_extract_data[
                'result_hospital'] + ')'
        doc_fio = hosp_extract_data['doc_fio']
        manager_depart = hosp_extract_data['manager_depart']
        room_num = hosp_extract_data['room_num']
        iss_last_hosp = Issledovaniya.objects.filter(
            napravleniye__pk=hosp_last_num)[0]
        depart_extract = iss_last_hosp.research.title

    # Получить отделение - из названия услуги или самого главного направления
    hosp_depart = hosp_nums_obj[0].get('research_title')

    ############################################################################################################
    # Получить данные из первичного приема (самого первого hosp-направления)
    hosp_first_num = hosp_nums_obj[0].get('direction')
    primary_reception_data = primary_reception_get_data(hosp_first_num)

    ###########################################################################################################
    # Получение данных группы крови
    fcaction_avo_id = Fractions.objects.filter(
        title='Групповая принадлежность крови по системе АВО').first()
    fcaction_rezus_id = Fractions.objects.filter(title='Резус').first()
    group_blood_avo = get_fraction_result(ind_card.pk,
                                          fcaction_avo_id.pk,
                                          count=1)
    if group_blood_avo:
        group_blood_avo_value = group_blood_avo[0][5]
    else:
        group_blood_avo_value = primary_reception_data['blood_group']
    group_blood_rezus = get_fraction_result(ind_card.pk,
                                            fcaction_rezus_id.pk,
                                            count=1)
    if group_blood_rezus:
        group_rezus_value = group_blood_rezus[0][5].replace('<br/>', ' ')
    else:
        group_rezus_value = primary_reception_data['resus_factor']

    ###########################################################################################################
    # получение данных клинического диагноза
    clinical_diagnos = hosp_get_clinical_diagnos(hosp_nums_obj)

    #####################################################################################################
    # получить даные из переводного эпикриза: Дата перевода, Время перевода, в какое отделение переведен
    # у каждого hosp-направления найти подчиненное эпикриз Перевод*
    transfers_data = hosp_get_transfers_data(hosp_nums_obj)
    transfers = ''
    for i in transfers_data:
        transfers = f"{transfers} в {i['transfer_research_title']} {i['date_transfer_value']}/{i['time_transfer_value']};"

    #####################################################################################################
    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 8 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=15>МЕДИЦИНСКАЯ КАРТА № {} <u>{}</u>, <br/> стационарного больного</font>'
            .format(p_card_num, hosp_nums), styleCenter),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            'Дата и время поступления: {} - {}'.format(
                primary_reception_data['date_entered_value'],
                primary_reception_data['time_entered_value']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Дата и время выписки: {} - {}'.format(extrac_date, extract_time),
            style),
        Spacer(1, 0.5 * mm),
        Paragraph('Отделение: {}'.format(hosp_depart), style),
        Spacer(1, 0.5 * mm),
        Paragraph(f"Палата №: {room_num} {depart_extract}", style),
        Spacer(1, 0.5 * mm),
        Paragraph('Переведен в отделение:', style),
        Spacer(1, 8 * mm),
        Paragraph('Проведено койко-дней: {}'.format(days_count), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Виды транспортировки(на каталке, на кресле, может идти): {}'.
            format(primary_reception_data['type_transport']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Группа крови: {}. Резус-принадлежность: {}'.format(
                group_blood_avo_value, group_rezus_value), style),
        Spacer(1, 1 * mm),
        Paragraph('Побочное действие лекарств(непереносимость):', style),
        Spacer(1, 12 * mm),
        Paragraph("1. Фамилия, имя, отчество:&nbsp;", style),
        Spacer(1, 2 * mm),
        Paragraph(
            '2. Пол: {} {} 3. Дата рождения: {}'.format(
                patient_data['sex'], 3 * space_symbol, patient_data['born']),
            style),
        Spacer(1, 0.5 * mm),
        Paragraph('4. Постоянное место жительства: ', style),
        Spacer(1, 3.5 * mm),
        Paragraph('5. Место работы, профессия или должность:', style),
        Spacer(1, 0.5 * mm),
        Paragraph('6. Кем направлен больной:', style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            '7. Доставлен в стационар по экстренным показаниям: {}'.format(
                primary_reception_data['extra_hospital']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            ' через: {} после начала заболевания, получения травмы; '.format(
                primary_reception_data['time_start_ill']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            ' госпитализирован в плановом порядке (подчеркнуть) {}.'.format(
                primary_reception_data['plan_hospital']), style),
        Spacer(1, 0.5 * mm),
        Paragraph('8. Диагноз направившего учреждения:', style),
        Spacer(1, 8 * mm),
        Paragraph('9. Диагноз при поступлении:', style),
        Spacer(1, 10 * mm),
        Paragraph('10. Диагноз клинический:', style),
        PageBreak(),
    ]

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))
    data_bl = ''
    if closed_bl_result['start_date'] and closed_bl_result[
            'end_date'] and closed_bl_result['num']:
        data_bl = (
            f"<br/>открыт <u>{closed_bl_result['start_date']}</u>{5 * space_symbol}закрыт: <u>{closed_bl_result['end_date']}</u> {3 * space_symbol}"
            f"к труду: <u>{closed_bl_result['start_work']}</u> <br/>Номер ЛН: <u>{closed_bl_result['num']}</u> Выдан кому: {closed_bl_result['who_get']} "
        )

    second_page = [
        Spacer(1, 2 * mm),
        Paragraph('11. Диагноз заключительный клинический:', style),
        Spacer(1, 0.5 * mm),
        Paragraph('а) основной:', style),
        Spacer(1, 45 * mm),
        Paragraph('б) осложнение основного:', style),
        Spacer(1, 18 * mm),
        Paragraph('в) сопутствующий:', style),
        Spacer(1, 19 * mm),
        Paragraph(
            '12. Госпитализирован в данном году по поводу данного заболевания: {}, <br/>'
            'всего  - {} раз.:'.format(
                primary_reception_data['what_time_hospitalized'],
                primary_reception_data['all_hospitalized']),
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph(
            '13. Хирургические операции, методы обезболивания и послеоперационные осложнения:',
            styleLead),
        Spacer(1, 40 * mm),
        Paragraph(
            '14. Другие виды лечения:___________________________________________',
            styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph('для больных злокачественными новообразованиями.',
                  styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph(
            ' 1.Специальное лечение: хирургическое(дистанционная гамматерапия, рентгенотерапия, быстрые '
            'электроны, контактная и дистанционная гамматерапия, контактная гамматерапия и глубокая '
            'рентгенотерапия); комбинированное(хирургическое и гамматерапия, хирургическое и рентгено - '
            'терапия, хирургическое и сочетанное лучевое); химиопрепаратами, гормональными препаратами.',
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph('2. Паллиативное', styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph('3. Симптоматическое лечение.', styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph(f"15. Отметка о выдаче листка нетрудоспособности:{data_bl}",
                  styleLead),
        Spacer(1, 1 * mm),
        Paragraph('16. Исход заболевания: {}'.format(outcome), styleLead),
        Spacer(1, 1 * mm),
        Paragraph(
            '17.  Трудоспособность восстановлена полностью, снижена, временно утрачена, стойко утрачена в связи '
            'с данным заболеванием, с другими причинами(подчеркнуть): {}'.
            format(''),
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph(
            '18. Для поступивших на экспертизу - заключение:___________________',
            styleLead),
        Spacer(1, 1 * mm),
        Paragraph(
            '___________________________________________________________________',
            styleLead),
        Spacer(1, 1 * mm),
        Paragraph('19. Особые отметки', style),
        Spacer(1, 2 * mm),
        Paragraph('Лечащий врач: {}'.format(doc_fio), style),
        Paragraph('Заведующий отделением: {}'.format(manager_depart), style),
    ]
    if primary_reception_data['weight']:
        second_page.append(
            Paragraph(f"Вес: {primary_reception_data['weight']}", styleRight))
    objs.extend(title_page)
    objs.extend(second_page)

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))

    def first_pages(canvas, document):
        canvas.saveState()
        if closed_bl_result.get('is_closed', None):
            canvas.setFont('PTAstraSerifBold', 12)
            canvas.drawString(7 * mm, 290 * mm, 'ЛН')
        # Переведен
        transfers_text = [Paragraph('{}'.format(transfers), styleJustified)]
        transfers_frame = Frame(27 * mm,
                                206 * mm,
                                175 * mm,
                                7 * mm,
                                leftPadding=0,
                                bottomPadding=0,
                                rightPadding=0,
                                topPadding=0,
                                id='diagnos_frame',
                                showBoundary=0)
        transfers_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            transfers_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        transfers_frame.addFromList([transfers_inframe], canvas)

        # Побочное действие лекарств(непереносимость) координаты
        medicament_text = [
            Paragraph(
                '{}'.format(primary_reception_data['medicament_allergy']),
                styleJustified)
        ]
        medicament_frame = Frame(27 * mm,
                                 171 * mm,
                                 175 * mm,
                                 9 * mm,
                                 leftPadding=0,
                                 bottomPadding=0,
                                 rightPadding=0,
                                 topPadding=0,
                                 id='diagnos_frame',
                                 showBoundary=0)
        medicament_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            medicament_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        medicament_frame.addFromList([medicament_inframe], canvas)

        # ФИО
        fio_text = [
            Paragraph(
                "<font size=11.7 fontname ='PTAstraSerifBold'> {}</font> ".
                format(patient_data['fio']), style)
        ]
        fio_frame = Frame(77 * mm,
                          159 * mm,
                          125 * mm,
                          8 * mm,
                          leftPadding=0,
                          bottomPadding=0,
                          rightPadding=0,
                          topPadding=0,
                          id='diagnos_frame',
                          showBoundary=0)
        fio_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            fio_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        fio_frame.addFromList([fio_inframe], canvas)

        # Постоянное место жительства
        live_text = [Paragraph('{}, {}'.format(p_address, p_phone), style)]
        live_frame = Frame(88 * mm,
                           144 * mm,
                           115 * mm,
                           9 * mm,
                           leftPadding=0,
                           bottomPadding=0,
                           rightPadding=0,
                           topPadding=0,
                           id='diagnos_frame',
                           showBoundary=0)
        live_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            live_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        live_frame.addFromList([live_inframe], canvas)

        # Место работы
        work_text = [Paragraph('{}'.format(p_work), style)]
        work_frame = Frame(108 * mm,
                           138.5 * mm,
                           95 * mm,
                           5 * mm,
                           leftPadding=0,
                           bottomPadding=0,
                           rightPadding=0,
                           topPadding=0,
                           id='diagnos_frame',
                           showBoundary=0)
        work_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            work_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        work_frame.addFromList([work_inframe], canvas)

        # Кем направлен больной
        who_directed_text = [
            Paragraph('{}'.format(primary_reception_data['who_directed']),
                      style)
        ]
        who_directed_frame = Frame(77 * mm,
                                   129.5 * mm,
                                   126 * mm,
                                   7 * mm,
                                   leftPadding=0,
                                   bottomPadding=0,
                                   rightPadding=0,
                                   topPadding=0,
                                   id='diagnos_frame',
                                   showBoundary=0)
        who_directed_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            who_directed_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        who_directed_frame.addFromList([who_directed_inframe], canvas)

        # Диагноз направившего учреждения координаты
        diagnos_directed_text = [
            Paragraph(
                '{}'.format(primary_reception_data['diagnos_who_directed']),
                styleJustified)
        ]
        diagnos_directed_frame = Frame(27 * mm,
                                       98 * mm,
                                       175 * mm,
                                       9 * mm,
                                       leftPadding=0,
                                       bottomPadding=0,
                                       rightPadding=0,
                                       topPadding=0,
                                       id='diagnos_frame',
                                       showBoundary=0)
        diagnos_directed_inframe = KeepInFrame(
            175 * mm,
            10 * mm,
            diagnos_directed_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        diagnos_directed_frame.addFromList([diagnos_directed_inframe], canvas)

        # Диагноз при поступлении координаты
        diagnos_entered_text = [
            Paragraph('{}'.format(primary_reception_data['diagnos_entered']),
                      styleJustified)
        ]
        diagnos_entered_frame = Frame(27 * mm,
                                      83 * mm,
                                      175 * mm,
                                      10 * mm,
                                      leftPadding=0,
                                      bottomPadding=0,
                                      rightPadding=0,
                                      topPadding=0,
                                      id='diagnos_frame',
                                      showBoundary=0)
        diagnos_entered_inframe = KeepInFrame(
            175 * mm,
            10 * mm,
            diagnos_entered_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        diagnos_entered_frame.addFromList([diagnos_entered_inframe], canvas)

        # клинический диагноз координаты
        diagnos_text = [
            Paragraph('{}'.format(clinical_diagnos), styleJustified)
        ]
        diagnos_frame = Frame(27 * mm,
                              22 * mm,
                              175 * mm,
                              55 * mm,
                              leftPadding=0,
                              bottomPadding=0,
                              rightPadding=0,
                              topPadding=0,
                              id='diagnos_frame',
                              showBoundary=0)
        diagnos_inframe = KeepInFrame(175 * mm, 55 * mm, diagnos_text)
        diagnos_frame.addFromList([diagnos_inframe], canvas)

        # представитель пациента
        p_agent = None
        agent_status = ''
        agent = ''
        if ind_card.who_is_agent:
            p_agent = getattr(ind_card, ind_card.who_is_agent)
            agent_status = ind_card.get_who_is_agent_display()
        if p_agent:
            agent_data = p_agent.get_data_individual()
            agent_fio = agent_data['fio']
            agent_phone = ','.join(agent_data['phone'])
            agent = f"{agent_status}: {agent_fio}, тел.:{agent_phone}"

        agent_text = [Paragraph('<u>{}</u>'.format(agent), styleRight)]
        agent_frame = Frame(27 * mm,
                            5 * mm,
                            175 * mm,
                            7 * mm,
                            leftPadding=0,
                            bottomPadding=0,
                            rightPadding=0,
                            topPadding=0,
                            id='diagnos_frame',
                            showBoundary=0)
        agent_inframe = KeepInFrame(175 * mm, 10 * mm, agent_text)
        agent_frame.addFromList([agent_inframe], canvas)
        canvas.restoreState()

    # Получить все услуги из категории операции
    styleTO = deepcopy(style)
    styleTO.alignment = TA_LEFT
    styleTO.firstLineIndent = 0
    styleTO.fontSize = 9.5
    styleTO.leading = 10
    styleTO.spaceAfter = 0.2 * mm

    # Таблица для операции
    opinion_oper = [[
        Paragraph('№', styleTO),
        Paragraph('Название операции', styleTO),
        Paragraph('Дата, &nbsp час', styleTO),
        Paragraph('Метод обезболивания', styleTO),
        Paragraph('Осложнения', styleTO),
        Paragraph('Оперировал', styleTO),
    ]]

    hosp_operation = hosp_get_operation_data(num_dir)
    x = 0
    operation_result = []
    for i in hosp_operation:
        operation_template = [''] * 6
        x += 1
        operation_template[0] = Paragraph(str(x), styleTO)
        operation_template[1] = Paragraph(
            f"{i['name_operation']} <br/><font face=\"PTAstraSerifBold\" size=\"8.7\">({i['category_difficult']})</font>",
            styleTO)
        operation_template[2] = Paragraph(
            i['date'] + '<br/>' + i['time_start'] + '-' + i['time_end'],
            styleTO)
        operation_template[3] = Paragraph(i['anesthesia method'], styleTO)
        operation_template[4] = Paragraph(i['complications'], styleTO)
        operation_template[5] = Paragraph(i['doc_fio'], styleTO)
        operation_result.append(operation_template.copy())

    opinion_oper.extend(operation_result)

    t_opinion_oper = opinion_oper.copy()
    tbl_o = Table(
        t_opinion_oper,
        colWidths=(
            7 * mm,
            62 * mm,
            25 * mm,
            30 * mm,
            15 * mm,
            45 * mm,
        ),
    )
    tbl_o.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 2.1 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ]))

    def later_pages(canvas, document):
        canvas.saveState()
        # Заключительные диагнозы
        # Основной заключительный диагноз
        final_diagnos_text = [
            Paragraph('{}'.format(final_diagnos), styleJustified)
        ]
        final_diagnos_frame = Frame(27 * mm,
                                    230 * mm,
                                    175 * mm,
                                    45 * mm,
                                    leftPadding=0,
                                    bottomPadding=0,
                                    rightPadding=0,
                                    topPadding=0,
                                    showBoundary=0)
        final_diagnos_inframe = KeepInFrame(
            175 * mm,
            50 * mm,
            final_diagnos_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        final_diagnos_frame.addFromList([final_diagnos_inframe], canvas)

        # Осложнения основного заключительного диагноза
        other_diagnos_text = [
            Paragraph('{}'.format(other_diagnos), styleJustified)
        ]
        other_diagnos_frame = Frame(27 * mm,
                                    205 * mm,
                                    175 * mm,
                                    20 * mm,
                                    leftPadding=0,
                                    bottomPadding=0,
                                    rightPadding=0,
                                    topPadding=0,
                                    showBoundary=0)
        other_diagnos_inframe = KeepInFrame(
            175 * mm,
            20 * mm,
            other_diagnos_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        other_diagnos_frame.addFromList([other_diagnos_inframe], canvas)

        # Сопутствующие основного заключительного диагноза
        near_diagnos_text = [
            Paragraph(
                '{}'.format(
                    near_diagnos.replace('<', '&lt;').replace('>', '&gt;')),
                styleJustified)
        ]
        near_diagnos_frame = Frame(27 * mm,
                                   181 * mm,
                                   175 * mm,
                                   20 * mm,
                                   leftPadding=0,
                                   bottomPadding=0,
                                   rightPadding=0,
                                   topPadding=0,
                                   showBoundary=0)
        near_diagnos_inframe = KeepInFrame(
            175 * mm,
            20 * mm,
            near_diagnos_text,
            vAlign='TOP',
        )
        near_diagnos_frame.addFromList([near_diagnos_inframe], canvas)

        # Таблица операции
        operation_text = [tbl_o]
        operation_frame = Frame(22 * mm,
                                123 * mm,
                                170 * mm,
                                40 * mm,
                                leftPadding=0,
                                bottomPadding=0,
                                rightPadding=0,
                                topPadding=0,
                                showBoundary=0)
        operation_inframe = KeepInFrame(175 * mm,
                                        40 * mm,
                                        operation_text,
                                        hAlign='CENTRE',
                                        vAlign='TOP',
                                        fakeWidth=False)
        operation_frame.addFromList([operation_inframe], canvas)

        canvas.setFont('PTAstraSerifBold', 8)
        hospital: Hospitals = request_data["hospital"]

        hospital_name = hospital.safe_short_title

        canvas.drawString(55 * mm, 12 * mm, '{}'.format(hospital_name))
        canvas.drawString(
            55 * mm, 9 * mm,
            '№ карты : {}; Номер истории: {}'.format(p_card_num, hosp_nums))
        canvas.drawString(
            55 * mm, 6 * mm, 'Пациент: {} {}'.format(patient_data['fio'],
                                                     patient_data['born']))
        canvas.line(55 * mm, 11.5 * mm, 200 * mm, 11.5 * mm)

        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf