Загрузка данных


from flask import Flask, render_template, request, send_file
import psycopg2
import traceback
import os
import tempfile
import xlrd
import xlwt
from xlutils.copy import copy as xl_copy
from openpyxl import load_workbook  # для работы с .xlsx

app = Flask(__name__)

# -------------------- Настройки подключения --------------------
DB_HOST = "172.16.2.38"
DB_PORT = 5432
DB_NAME = "dev_intern"
DB_USER = "dev_intern"
DB_PASSWORD = "Cneltynbr33"

TEMPLATE_PATH_BLANK6 = "BLANKS6.XLS"      # старый шаблон
TEMPLATE_PATH_BLANK5 = "BLANK5_1.xlsx"    # новый шаблон

def get_db_connection():
    return psycopg2.connect(
        host=DB_HOST, port=DB_PORT, dbname=DB_NAME,
        user=DB_USER, password=DB_PASSWORD
    )

# -------------------- Главная страница (список работников) --------------------
@app.route("/")
def index():
    search_tabnum = request.args.get("tabnum", "").strip()
    search_fam = request.args.get("fam", "").strip()

    try:
        conn = get_db_connection()
        cur = conn.cursor()
        query = "SELECT Tabnum, fam, imja, otch, nam_dol FROM rabotnik WHERE 1=1"
        params = []
        if search_tabnum:
            query += " AND Tabnum = %s"
            params.append(search_tabnum)
        if search_fam:
            query += " AND fam ILIKE %s"
            params.append(f"%{search_fam}%")
        query += " ORDER BY fam, imja"

        cur.execute(query, params)
        rows = cur.fetchall()
        columns = [desc[0] for desc in cur.description]
        cur.close()
        conn.close()

        return render_template("index.html", rows=rows, columns=columns,
                               search_tabnum=search_tabnum, search_fam=search_fam)
    except Exception as e:
        return f"<h2>Ошибка загрузки работников</h2><pre>{traceback.format_exc()}</pre>"

# -------------------- Страница детей сотрудника --------------------
@app.route("/employee/<tabnum>/children")
def select_children(tabnum):
    try:
        conn = get_db_connection()
        cur = conn.cursor()
        cur.execute("SELECT fam, imja, otch, Tabnum, nam_dol FROM rabotnik WHERE Tabnum = %s", (tabnum,))
        worker = cur.fetchone()
        if not worker:
            return f"<h2>Работник с таб. № {tabnum} не найден</h2><a href='/'>Назад</a>"

        cur.execute("SELECT id, fam_rod, imja_rod, otch_rod, drog_rod, step_rod, pol_rod FROM deti WHERE tabnum = %s ORDER BY id", (tabnum,))
        children = cur.fetchall()
        cur.close()
        conn.close()

        return render_template("employee.html", worker=worker, children=children)
    except Exception as e:
        return f"<h2>Ошибка загрузки детей</h2><pre>{traceback.format_exc()}</pre>"

# ==================== ЭКСПОРТ В BLANKS6.XLS (старый, только работник) ====================
@app.route("/employee/<tabnum>/export_worker_blank6")
def export_worker_blank6(tabnum):
    try:
        conn = get_db_connection()
        cur = conn.cursor()
        cur.execute("SELECT fam, imja, otch FROM rabotnik WHERE Tabnum = %s", (tabnum,))
        worker = cur.fetchone()
        cur.close()
        conn.close()

        if not worker:
            return "Работник не найден"

        if not os.path.exists(TEMPLATE_PATH_BLANK6):
            return f"Файл шаблона {TEMPLATE_PATH_BLANK6} не найден."

        rb = xlrd.open_workbook(TEMPLATE_PATH_BLANK6, formatting_info=True)
        wb = xl_copy(rb)
        ws = wb.get_sheet(0)

        # Стиль для ячеек
        style = xlwt.XFStyle()
        font = xlwt.Font()
        font.name = 'Times New Roman'
        font.height = 200
        style.font = font
        alignment = xlwt.Alignment()
        alignment.horz = xlwt.Alignment.HORZ_CENTER
        alignment.vert = xlwt.Alignment.VERT_CENTER
        style.alignment = alignment
        borders = xlwt.Borders()
        borders.left = xlwt.Borders.THIN
        borders.right = xlwt.Borders.THIN
        borders.top = xlwt.Borders.THIN
        borders.bottom = xlwt.Borders.THIN
        style.borders = borders

        rows_for_fio = [14, 15, 16]   # строки 15,16,17
        start_col = 3                 # столбец D
        fam, imja, otch = worker

        for i, ch in enumerate(fam.upper()):
            col = start_col + i * 3
            if col < 256:
                ws.write(rows_for_fio[0], col, ch, style)
        for i, ch in enumerate(imja.upper()):
            col = start_col + i * 3
            if col < 256:
                ws.write(rows_for_fio[1], col, ch, style)
        for i, ch in enumerate(otch.upper()):
            col = start_col + i * 3
            if col < 256:
                ws.write(rows_for_fio[2], col, ch, style)

        fd, tmp_path = tempfile.mkstemp(suffix=".xls")
        os.close(fd)
        wb.save(tmp_path)
        return send_file(tmp_path, as_attachment=True,
                         download_name=f"BLANKS6_{tabnum}.xls",
                         mimetype="application/vnd.ms-excel")
    except Exception as e:
        return f"<h2>Ошибка экспорта</h2><pre>{traceback.format_exc()}</pre>"

# ==================== ЭКСПОРТ В BLANK5_1.xlsx (работник) ====================
@app.route("/employee/<tabnum>/export_worker_blank5")
def export_worker_blank5(tabnum):
    try:
        conn = get_db_connection()
        cur = conn.cursor()
        cur.execute("SELECT fam, imja, otch FROM rabotnik WHERE Tabnum = %s", (tabnum,))
        worker = cur.fetchone()
        cur.close()
        conn.close()

        if not worker:
            return "Работник не найден"

        if not os.path.exists(TEMPLATE_PATH_BLANK5):
            return f"Файл шаблона {TEMPLATE_PATH_BLANK5} не найден."

        wb = load_workbook(TEMPLATE_PATH_BLANK5)
        ws = wb.active

        # Строки для работника: 16, 17, 18 (индексы в openpyxl начинаются с 1)
        # Объединённые ячейки по 5 столбцов – мы пишем в первую ячейку диапазона (например, B16)
        # Предположим, что объединение начинается со столбца B (индекс 2) и длится 5 столбцов
        # Уточните по вашему шаблону, если нужно изменить стартовую колонку
        start_col_worker = 2   # столбец B
        rows_worker = [16, 17, 18]

        fam, imja, otch = worker

        # Записываем каждую часть в соответствующую строку
        ws.cell(row=rows_worker[0], column=start_col_worker, value=fam.upper())
        ws.cell(row=rows_worker[1], column=start_col_worker, value=imja.upper())
        ws.cell(row=rows_worker[2], column=start_col_worker, value=otch.upper())

        # Сохраняем во временный файл
        fd, tmp_path = tempfile.mkstemp(suffix=".xlsx")
        os.close(fd)
        wb.save(tmp_path)
        return send_file(tmp_path, as_attachment=True,
                         download_name=f"BLANK5_1_{tabnum}.xlsx",
                         mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    except Exception as e:
        return f"<h2>Ошибка экспорта работника в BLANK5_1</h2><pre>{traceback.format_exc()}</pre>"

# ==================== ЭКСПОРТ В BLANK5_1.xlsx (ребёнок) ====================
@app.route("/employee/<tabnum>/export_child_blank5/<int:child_id>")
def export_child_blank5(tabnum, child_id):
    try:
        conn = get_db_connection()
        cur = conn.cursor()
        # Получаем данные ребёнка
        cur.execute("SELECT fam_rod, imja_rod, otch_rod FROM deti WHERE id = %s AND tabnum = %s", (child_id, tabnum))
        child = cur.fetchone()
        cur.close()
        conn.close()

        if not child:
            return "Ребёнок не найден"

        if not os.path.exists(TEMPLATE_PATH_BLANK5):
            return f"Файл шаблона {TEMPLATE_PATH_BLANK5} не найден."

        wb = load_workbook(TEMPLATE_PATH_BLANK5)
        ws = wb.active

        # Строки для ребёнка: 33, 36, 37
        # Стартовая колонка – пусть тоже B (2), но может отличаться, уточните по шаблону
        start_col_child = 2   # столбец B
        rows_child = [33, 36, 37]

        fam_rod, imja_rod, otch_rod = child

        ws.cell(row=rows_child[0], column=start_col_child, value=fam_rod.upper())
        ws.cell(row=rows_child[1], column=start_col_child, value=imja_rod.upper())
        ws.cell(row=rows_child[2], column=start_col_child, value=otch_rod.upper())

        fd, tmp_path = tempfile.mkstemp(suffix=".xlsx")
        os.close(fd)
        wb.save(tmp_path)
        return send_file(tmp_path, as_attachment=True,
                         download_name=f"BLANK5_1_child_{child_id}.xlsx",
                         mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    except Exception as e:
        return f"<h2>Ошибка экспорта ребёнка в BLANK5_1</h2><pre>{traceback.format_exc()}</pre>"

# -------------------- Запуск --------------------
if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=5000)