Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,1211 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import openpyxl
|
| 3 |
+
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
|
| 4 |
+
from openpyxl.utils import get_column_letter
|
| 5 |
+
from datetime import datetime, date
|
| 6 |
+
import io
|
| 7 |
+
|
| 8 |
+
# ---------------------------------------------------------
|
| 9 |
+
# Page Configurations and Premium Styling (CSS)
|
| 10 |
+
# ---------------------------------------------------------
|
| 11 |
+
st.set_page_config(
|
| 12 |
+
page_title="์ฌ๋ยท์๋ฐฉยท์์ ๊ต์ก ๋ฌธ์ ์๋์์ฑ๊ธฐ",
|
| 13 |
+
page_icon="๐",
|
| 14 |
+
layout="wide",
|
| 15 |
+
initial_sidebar_state="expanded"
|
| 16 |
+
)
|
| 17 |
+
|
| 18 |
+
# Custom Glassmorphism & Modern Soft Palettes UI styling
|
| 19 |
+
st.markdown("""
|
| 20 |
+
<style>
|
| 21 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+KR:wght@300;400;500;700;900&display=swap');
|
| 22 |
+
|
| 23 |
+
html, body, [class*="css"] {
|
| 24 |
+
font-family: 'Noto Sans KR', 'Inter', sans-serif;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
/* Premium Title Card styling */
|
| 28 |
+
.title-card {
|
| 29 |
+
background: linear-gradient(135deg, #1A365D 0%, #2A4365 100%);
|
| 30 |
+
padding: 2.5rem;
|
| 31 |
+
border-radius: 16px;
|
| 32 |
+
color: white;
|
| 33 |
+
margin-bottom: 2rem;
|
| 34 |
+
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
|
| 35 |
+
position: relative;
|
| 36 |
+
overflow: hidden;
|
| 37 |
+
}
|
| 38 |
+
.title-card::after {
|
| 39 |
+
content: "";
|
| 40 |
+
position: absolute;
|
| 41 |
+
top: -50%;
|
| 42 |
+
right: -30%;
|
| 43 |
+
width: 300px;
|
| 44 |
+
height: 300px;
|
| 45 |
+
background: rgba(255, 255, 255, 0.05);
|
| 46 |
+
border-radius: 50%;
|
| 47 |
+
}
|
| 48 |
+
.title-card h1 {
|
| 49 |
+
font-size: 2.2rem;
|
| 50 |
+
font-weight: 900;
|
| 51 |
+
margin: 0 0 0.5rem 0;
|
| 52 |
+
color: #FFFFFF !important;
|
| 53 |
+
letter-spacing: -0.025em;
|
| 54 |
+
}
|
| 55 |
+
.title-card p {
|
| 56 |
+
font-size: 1.1rem;
|
| 57 |
+
margin: 0;
|
| 58 |
+
opacity: 0.9;
|
| 59 |
+
font-weight: 300;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
/* Section Headers */
|
| 63 |
+
.section-header {
|
| 64 |
+
font-size: 1.3rem;
|
| 65 |
+
font-weight: 700;
|
| 66 |
+
color: #1E3A8A;
|
| 67 |
+
border-left: 5px solid #3B82F6;
|
| 68 |
+
padding-left: 10px;
|
| 69 |
+
margin-top: 1.5rem;
|
| 70 |
+
margin-bottom: 1rem;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
/* Custom button styling */
|
| 74 |
+
div.stButton > button {
|
| 75 |
+
background: linear-gradient(90deg, #2563EB 0%, #1D4ED8 100%) !important;
|
| 76 |
+
color: white !important;
|
| 77 |
+
font-weight: 600 !important;
|
| 78 |
+
padding: 0.75rem 2rem !important;
|
| 79 |
+
border-radius: 10px !important;
|
| 80 |
+
border: none !important;
|
| 81 |
+
box-shadow: 0 4px 12px rgba(37, 99, 235, 0.2) !important;
|
| 82 |
+
transition: all 0.2s ease-in-out !important;
|
| 83 |
+
width: 100% !important;
|
| 84 |
+
font-size: 1.1rem !important;
|
| 85 |
+
}
|
| 86 |
+
div.stButton > button:hover {
|
| 87 |
+
transform: translateY(-2px) !important;
|
| 88 |
+
box-shadow: 0 6px 20px rgba(37, 99, 235, 0.35) !important;
|
| 89 |
+
}
|
| 90 |
+
</style>
|
| 91 |
+
""", unsafe_allow_html=True)
|
| 92 |
+
|
| 93 |
+
# ---------------------------------------------------------
|
| 94 |
+
# Dynamic Narrative Sentence Generation Engine
|
| 95 |
+
# ---------------------------------------------------------
|
| 96 |
+
def generate_narrative_text(info, section, training_type):
|
| 97 |
+
facility_name = info.get('facility_name', 'ํ๋ณต์์์')
|
| 98 |
+
total_participants = info.get('total_participants', 18)
|
| 99 |
+
staff_count = info.get('staff_participants', 8)
|
| 100 |
+
recipient_count = info.get('recipient_participants', 12)
|
| 101 |
+
evac_time = info.get('evac_time', '4๋ถ 30์ด')
|
| 102 |
+
vulnerable_count = info.get('vulnerable_count', 5)
|
| 103 |
+
wheelchair_count = info.get('wheelchair_count', 3)
|
| 104 |
+
walk_aid_count = info.get('walk_aid_count', 4)
|
| 105 |
+
|
| 106 |
+
emergency_mock = info.get('emergency_mock', '์ค์ ๋ฐ ์ํธ')
|
| 107 |
+
fire_ext_demo = info.get('fire_ext_demo', '์ค์ ๋ฐ ์ํธ')
|
| 108 |
+
route_checked = info.get('route_checked', 'ํ์ธ์๋ฃ')
|
| 109 |
+
contact_checked = info.get('contact_checked', '์๋ํ์ธ')
|
| 110 |
+
guardian_call_date = info.get('guardian_call_date', str(datetime.today().strftime('%Y-%m-%d')))
|
| 111 |
+
guardian_reflected = info.get('guardian_reflected', '๋ฐ์์๋ฃ')
|
| 112 |
+
|
| 113 |
+
if training_type == "์๋ฐฉํ๋ จ":
|
| 114 |
+
# Multi-occupational Opinions
|
| 115 |
+
if section == "opinion_์์ค์ฅ_1":
|
| 116 |
+
return "์๋ฐฉ ํ๋ จ ์ ์ ์ธต์ ์ํ ๋ฐ ๊ฒฝ๋ณด์ค๋น ๊ฐ๋์ ์ผ์ผ ์ ๊ฒํ๊ณ , ์ธ๋ ฅ ๊ต๋ ๊ทผ๋ฌด ์ ์ธ์์ธ๊ณ์์ '์ค๋์ ๋น์ ๋์ฑ
์ญํ ' ํ๊ธฐ๋ฅผ ์๋ฌดํํ๋ ํ์ ์ง์นจ์ ์๋ฌํจ."
|
| 117 |
+
elif section == "opinion_์์ค์ฅ_2":
|
| 118 |
+
return "์ํํ ํผ๋์ ๋ณด์ฅํ๊ธฐ ์ํด ๋
ธํ ํ ์ฒด์ด ์ ๋น ์์ฐ์ ํธ์ฑํ๊ณ , ์๋๋ฌ์ด ๊ฒฝ๋ณด ์ ํต์ ๋ฅผ ์ํ ํด๋์ ๋ฉ๊ฐํฐ 2๋ ๋ฐ ๋ฐ์ฌ ์ ๋์กฐ๋ผ ์ถ๊ฐ ๊ณต๊ธ์ ์ง์ํจ."
|
| 119 |
+
elif section == "opinion_์์ค์ฅ_role":
|
| 120 |
+
return "ํ๋ จ ์ด๊ด ์งํ, ์๋ฐฉ ์์ ๋์ฑ
์์ํ ์ฃผ๊ด ๋ฐ ์์ฐ ๊ฒฐ์ฌ"
|
| 121 |
+
|
| 122 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_1":
|
| 123 |
+
return f"์๊ธ์ {recipient_count}๋ช
์ค {vulnerable_count}๋ช
์ ๋ํผ์ทจ์ฝ์์ ๋ํ์ฌ ์์๋ณดํธ์ฌ ๋ฐ ๋ฌผ๋ฆฌ์น๋ฃ์ฌ์ 1:1 ๋งค์นญ ์กฐ๋ฅผ ํธ์ฑํ๊ณ , ๋ํผ ๊ฒฝ๋ก ๋์ ์์ ์ฅ์ ์์๏ฟฝ๏ฟฝ ์ฌ์ ์ ์คํฌ๋ฆฌ๋ํจ."
|
| 124 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_2":
|
| 125 |
+
return "๋ณดํธ์ ๋น์์ฐ๋ฝ๋ง ์ต์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์์ ๊ณํ์ ๊ฐฑ์ ํ์์ผ๋ฉฐ, ์๊ธ์๋ณ ์๊ตฌ์ฌ์ ๊ธฐ๋ก์ง์ ๊ฐ์ธ๋ณ ๋ํผ ์ ํน์ด์ฌํญ์ ๋ช
์ํ์ฌ ๋ฐ์ํจ."
|
| 126 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_role":
|
| 127 |
+
return "๋ํผ์ทจ์ฝ์ ๋ถ๋ฅ, ๋น์์ฐ๋ฝ ๋์ ์ ๊ฒ, ํ๋ จ์ผ์ง ๊ธฐ๋ก ๋ฐ ๋์ธ ๋ณดํธ์ ์๋ด"
|
| 128 |
+
|
| 129 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_1":
|
| 130 |
+
return f"ํ ์ฒด์ด ๋์์ {wheelchair_count}๋ช
๊ณผ ๋ณดํ๋ณด์กฐ ํ์์ {walk_aid_count}๋ช
์ ์ค์ค๋ก ๊ฒฝ๋ณด์์ ์ธ์งํ๋๋ผ๋ ๊ด์ ๊ฒฝ์ง ๋ฐ ์ธ์ง ์ ํ๋ก ์๋ ฅ ๋ํผ๊ฐ ๋ถ๊ฐ๋ฅํ์ฌ ๋ํผ ์ ๋์ ์ํ์ด ๋งค์ฐ ๋์ ์ํ๋ก ๊ด์ฐฐ๋จ."
|
| 131 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_2":
|
| 132 |
+
return "ํ์ฌ ์ ์ฐ๊ธฐ ํก์
์ ๋ง๊ธฐ ์ํด ์ ์ ์๊ฑด์ผ๋ก ์ฝ์ ์
์ ๋ณดํธํ๋ฉฐ, ํ ์ฒด์ด ์ด๋ ์์๋ ๊ฒฝ์ฌ๋ก ๋ธ๋ ์ดํฌ๊ฐ ๋ฐ๋ฆฌ์ง ์๋๋ก ๊ณ ์ ํ๋ ์ ์ฐจ๋ฅผ ์ถ๋ฐ ์ ํํ ์์งํ๊ณ ์ดํํด์ผ ํจ."
|
| 133 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_role":
|
| 134 |
+
return "์๊ธ์ 1:1 ๋ํผ ๋๋ฐ ์ด๋, ๋ํผ ์ค ๋์ ์ํ ํต์ , ํผ๋ ๋ฌผํ ์ ์ ๋ฐฐ๋ถ"
|
| 135 |
+
|
| 136 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_1":
|
| 137 |
+
return f"๋ํผ ์๋ฃ ํ ์ ์ํ๊ฒ ์์ ์ง๊ฒฐ์ง์์ ์๊ธ์ {recipient_count}๋ช
์ ํ์, ๋งฅ๋ฐ ๋ฑ ํ๋ ฅ์งํ๋ฅผ ๊ธฐ๋กํ์ฌ ๋น์ ์ง๋ฃ ์นด๋๋ฅผ ์์ฑํ๊ณ ์ผํฌ ์ฆ์ ๋ฐ ํธํก๊ธฐ ์งํ ์ฌ๋ถ๋ฅผ ํ์ธํ์์."
|
| 138 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_2":
|
| 139 |
+
return "ํด๋์ฉ ๊ตฌ๊ธ ์ฝํ ๊ฐ๋ฐฉ ๋ฐ ์ฐ์์บ ์ค๋น ์ํ๋ฅผ ์ฌ์ ์ ํ์ธํ์๊ณ , ๋ํผ ๊ณผ์ ์์ ๋ฐ์ ๊ฐ๋ฅํ ์๊ธ์์ ๊ฐ๋ฒผ์ด ์ฐฐ๊ณผ์์ ๋ํ ์๋
๋ฐ ์๊ธ ์ฒ์น ์๋ น์ ํ๋ จํ์์."
|
| 140 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_role":
|
| 141 |
+
return "๋น์ ์ฝํ ํด๋, ํ๋ ฅ์งํ ์ธก์ ๋ฐ ์๊ธ๊ตฌํธ ์กฐ์น ๊ฐ๋"
|
| 142 |
+
|
| 143 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_1":
|
| 144 |
+
return "๋ณดํ์ด ๋ถ์์ ํ ์๊ธ์๋ค์ ๋น์์ํฉ ์ ํ์๋ณด๋ค ๋ณดํ ๋ณด์กฐ๊ธฐ ์กฐ์ ์๋๋ฆ์ผ๋ก ์ธํด ๋ฌด๊ฒ์ค์ฌ์ด ๋ฌด๋์ ธ ๋์ด์ง๊ธฐ ์ฌ์ด ์ ์ฒด ํน์ฑ์ ์ง๋."
|
| 145 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_2":
|
| 146 |
+
return "๋ํผ ์ ๊ฒฝ์ฌ๋ก ๋ถ๊ทผ์์ ๋์ ๋ฐฉ์ง ํ์ง๋ฒ์ ์ค์ํ๊ณ , ํ ์ฒด์ด ์น๊ฐ๊ธฐ ์ง์
์ ๋ฐฉํฅ ์ ํ์ ๋ฐ๋ฅธ ์ถฉ๋ ๋ฐฉ์ง ์๋ น์ ๋ฌผ๋ฆฌ์น๋ฃ ๊ด์ ๋ฐ ์ฌํ ๋ณด์กฐ ๊ธฐ๊ตฌ๋ฅผ ์ ์ฉํด ์ง์ค ์ง์ํจ."
|
| 147 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_role":
|
| 148 |
+
return "๋ณดํ ๋ฐ ํ ์ฒด์ด ์์ ์ด๋ ๊ธฐ๋ฒ ๊ต์ก, ๋ฏธ๋๋ผ ๋ฐฉ์ง ์ ๋ ๋ณด์กฐ"
|
| 149 |
+
|
| 150 |
+
# 2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์
|
| 151 |
+
elif section == "result_problem":
|
| 152 |
+
return f"์๋ ฅ ๋ํผ๊ฐ ๋ถ๊ฐ๋ฅํ ๋ํผ์ทจ์ฝ์ {vulnerable_count}๋ช
์ ์ธ์ ์ธ๋ ฅ ๋ถ๋ด์ด ๋ถ๋ช
ํํ์๊ณ , ์ผ๋ถ ํ ์ฒด์ด({wheelchair_count}๋)์ ๋ธ๋ ์ดํฌ ์๋ ๊ฒฐํจ ๋ฐ ๊ฒฝ๋ณด ์๋ ์ ์์์ผ๋ก ์ธํ ๋ฌด์ ์ง์ ์ ๋ฌ ๋ถ๋ ํ์์ด ์กด์ฌํ์."
|
| 153 |
+
elif section == "result_action":
|
| 154 |
+
return f"ํ์ฌ ๋น์๊ฒฝ๋ณด ์ ํ ํ 119 ์ ๊ณ ๋ฅผ ์งํํ๊ณ ์ง์ ๋ํผ๊ฒฝ๋ก({route_checked})์ ๋ฐ๋ผ ์ ์ ๋ํผ๋ฅผ ๋ง์ณค์ผ๋ฉฐ, ๋ค์ง์ข
์ด ๋ฐ์ฐฉ ํ์
ํ์ฌ 1:1 ๋ํผ ๋ฐ ์ํ๊ธฐ ์๋ ์ค๋ฌด ์์ฐ({fire_ext_demo})์ ์์ํจ."
|
| 155 |
+
elif section == "result_role_actions":
|
| 156 |
+
return "์์ค์ฅ์ ์ ์ฒด ํ๋ จ ์งํ ๋ฐ ์ฐ๋ฝ๋ง ์๋์ ์ ๊ฒํ๊ณ , ๋ณต์ง์ฌ๋ ์ทจ์ฝ์ ์กฐ ๋ถ๋ด๊ณผ ๊ธฐ๋ก์, ์์๋ณดํธ์ฌ๋ ์ ์ ์๊ฑด์ ํ์ฉํด 1:1 ๋ํผ๋ฅผ, ๊ฐํธ์กฐ๋ฌด์ฌ๋ ํ๋ ฅ์งํ ์ ๊ฒ์, ๋ฌผ๋ฆฌ์น๋ฃ์ฌ๋ ์ด๋ ์์ธ ๋ณด์กฐ๋ฅผ ์ ๋ดํจ."
|
| 157 |
+
elif section == "result_outcome":
|
| 158 |
+
return f"์ ์ง์์ด ๋น์ ์ ํ๋ ์ง์นจ์ ์์งํ์๊ณ , ์์๋ณดํธ์ฌ์ 1:1 ๋งค์นญ ์ง์์ ํตํด ์ต์ข
๋ํผ์๋ฃ ์๊ฐ์ด {evac_time}๋ก ํฌ๊ฒ ๋จ์ถ๋์ด ์ค์ ๋์ ๋ฅ๋ ฅ์ด ์
์ฆ๋จ."
|
| 159 |
+
elif section == "result_data":
|
| 160 |
+
return f"์ด ์ฐธ์ฌ์ {total_participants}๋ช
(์ข
์ฌ์ {staff_count}๋ช
, ์๊ธ์ {recipient_count}๋ช
), ๋ํผ์ทจ์ฝ์ {vulnerable_count}๋ช
, ํ ์ฒด์ด {wheelchair_count}๋, ๋ณดํ๋ณด์กฐ {walk_aid_count}๋ช
, ๋ํผ์๋ฃ {evac_time}, ์ํ๊ธฐ ์ค์ต {fire_ext_demo}, ์๊ธ๋์ {emergency_mock}."
|
| 161 |
+
elif section == "result_risks":
|
| 162 |
+
return f"์ผ๋ถ ๋ณต๋ ๊ฒฝ์ฌ๋ก ๊ตฌ๊ฐ์์ ํ ์ฒด์ด {wheelchair_count}๋๊ฐ ๊ตํํ ๋ ๋ฌธํฑ ์ฅ์ ๋ฌผ๋ก ์ธํด ์๋๊ฐ ์ง์ฒด๋๋ ๋ณ๋ชฉ ํ์์ด ๋จ์์๊ณ , ์๋๋ฌ์ด ์ฌ์ด๋ ์ํฉ์์ ์ ๋์์ ์์ฑ ์ ๋ฌ์ด ๋ถ๋ถ์ ์ผ๋ก ๋ฐฉํด๋ฐ๋ ๋ฌด์ ์์ ์์์ด ๊ด์ฐฐ๋จ."
|
| 163 |
+
elif section == "result_next":
|
| 164 |
+
return "๊ฒฝ์ฌ๋ก ์ฃผ๋ณ ๋ฏธ๋๋ผ ๋ฐฉ์ง ๋งคํธ๋ฅผ ์๊ณตํ๊ณ ๋ฌธํฑ์ ์๋งํ๊ฒ ๊ฐ์กฐํ ๊ฒ์ด๋ฉฐ, ๋น์ ๋ํผ์ฉ ํด๋์ ๋ฉ๊ฐํฐ์ ์ถ๊ฐ ๋ฐฐ์นํ ์์ ์. ๋ค๏ฟฝ๏ฟฝ ํ๋ จ ์์๋ ์ผ๊ฐ ํ์ฌ ๋๋น ์ต์ ๊ทผ๋ฌด์ ์ค์ฌ ๋ํผ ํ๋ จ์ ์ถ์งํ๊ฒ ์."
|
| 165 |
+
elif section == "result_guardian":
|
| 166 |
+
return f"๋ณดํธ์ ์ ์ ์๋ด({guardian_call_date}) ๊ฒฐ๊ณผ ๊ฑฐ๋๋ถํธ ์๊ธ์์ ๋ํผ ์์ ์ฐ๋ ค๊ฐ ์์ด 1:1 ์ ๋ด ์ธ๋ ฅ ๋งค์นญ ๊ณํ์ ์ค๋ช
ํ์์ผ๋ฉฐ, ๋ณดํธ์ ๋น์ ์ฐ๋ฝ์ฒ ์ต์ ํ๋ฅผ ํตํด {guardian_reflected} ์ํ๋ฅผ ์๋ฃํจ."
|
| 167 |
+
|
| 168 |
+
elif training_type == "์ฌ๋ํ๋ จ":
|
| 169 |
+
# Multi-occupational Opinions
|
| 170 |
+
if section == "opinion_์์ค์ฅ_1":
|
| 171 |
+
return "์ง์ง ์ํฉ ๋ฐ์ ์ ๊ฑด๋ฌผ ๋ถ๊ดด ์ํ์ ๋๋นํ ์ค๋ด ๊ธด๊ธ ๋ํผ์ฒ์ ์ค์ธ ์ง๊ฒฐ์ง์ ์์ ์ํ๋ฅผ ์ฌ์ ๋นํ๊ณ , ์ฌ๋ ํต์ ๋งค๋ด์ผ์ ์ ์ง์์๊ฒ ์์ ๊ณต๋ ์ง์ํจ."
|
| 172 |
+
elif section == "opinion_์์ค์ฅ_2":
|
| 173 |
+
return "์ ์ ์ ๋๋นํด ๋น์ ๋ฐ์ ๊ธฐ ๊ฐ๋ ์ํ๋ฅผ ์ด๊ด ํ์ธํ๊ณ ๋น์์ฉ ์์ ๋ฑ, ์ฌ๋ ์์ ๋ชจ ๋ฑ ๊ตฌํธ ๋ฌผํ์ ์์ฐ ๋ฐ ์ ์ง์ ์ง๊ธ์ ์น์ธํจ."
|
| 174 |
+
elif section == "opinion_์์ค์ฅ_role":
|
| 175 |
+
return "์ฌ๋ ๋์ฑ
๋ณธ๋ถ ์ด๊ด ์งํ, ๊ฑด๋ฌผ ์์ ์ฑ ๊ด๋ฆฌ ๋ฐ ๋น์ ์ฉํ ๊ฒฐ์ฌ"
|
| 176 |
+
|
| 177 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_1":
|
| 178 |
+
return f"์ง์ง ๊ฒฝ๋ณด ์ ํจ๋ ์ํ์ ๋น ์ง ์ ์๋ ์๊ธ์ {recipient_count}๋ช
์ ์ธ์ง ์ํ๋ฅผ ๊ฐ์ํด ํน๋ณ ์ฌ๋ฆฌ ์ง์ ๋ฐ 1:1 ๋ํผ ๋งค์นญ ํ๋ฅผ ์์ฑํจ."
|
| 179 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_2":
|
| 180 |
+
return "์ฌ๋ ๋๋น ์๊ธ์ ํต๋ณด์ฒด๊ณ๋ฅผ ๊ฒํ ํ๊ณ , ์ ์ ์๋ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณดํธ์๋ค์๊ฒ ์ฌ๋ ๋ํผ ํ๋ จ ๊ณํ๊ณผ ๋ํผ์ ์์น๋ฅผ ์๋น์ค ๋์์์ ๋ช
์ํจ."
|
| 181 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_role":
|
| 182 |
+
return "์ฌ๋ฆฌ ๋ถ์ ์ํ์ ์ ๋ณ, ๋น์ ๋ํผ ๊ณํ ์๋น์ค ๊ณํ ๋ฐ์, ํ๋ จ ์๋๋ฆฌ์ค ์์ฑ"
|
| 183 |
+
|
| 184 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_1":
|
| 185 |
+
return f"์ง์ง ์ง๋ ๋ฐ์ ์ ํ ์ฒด์ด {wheelchair_count}๋ ๋ฐ ๋ณดํ๋ณด์กฐ ์ฅ๋น์ ๋ฏธ๋๋ฌ์ง์ผ๋ก ์ธํ ์ถฉ๋ ๋ฐ ๊ฐ๊ตฌ ๋ํ๋ก ๋์๊ณผ ์ ์ฒด ๊ณจ์ ์ํ์ด ํฌ๊ฒ ๊ด์ฐฐ๋จ."
|
| 186 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_2":
|
| 187 |
+
return "์ง๋ ์ ์๊ธ์๋ฅผ ํ
์ด๋ธ ๋ฐ์ผ๋ก ๋ํผ์ํค๊ฑฐ๋ ๋ฒ ๊ฐ ๋ฑ์ผ๋ก ๋จธ๋ฆฌ๋ฅผ ์ต์ฐ์ ์ ์ผ๋ก ๋ณดํธํ๋ฉฐ, ํ ์ฒด์ด์ ๋ฐํด ๊ณ ์ ๋ ๋ฒ๋ฅผ ๋ฐ๋์ ์ ๋ ์์น๋ก ์ก๊ณ ๋ฐ์ฐฉ ๋๊ธฐํด์ผ ํจ."
|
| 188 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_role":
|
| 189 |
+
return "์ ์ฒด ๋ํ ์ํ ์ฐจ๋จ, ๋งค์นญ ์๊ธ์ ๊ธด๊ธ ๋ณดํธ ๋ฐ ์์ ์ ๋"
|
| 190 |
+
|
| 191 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_1":
|
| 192 |
+
return f"์ง์ง์ผ๋ก ๋ฐ์ ๊ฐ๋ฅํ ํ๋ฐ์, ์ด์ ๋ฑ ๊ณจ์ ์์ฌ ํ์์ ๋๋นํ์ฌ ์ ์ ์ง๋จ ๊ฐ์ด๋๋ฅผ ํ์ธํ๊ณ ๋ํผ ์๋ฃ ํ ํ๋ ฅ์งํ ๋ฐ ์ฌ๋ฆฌ ์ถฉ๊ฒฉ ์ํ๋ฅผ ๊ด์ฐฐํ์์."
|
| 193 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_2":
|
| 194 |
+
return "๋น์ ๊ตฌ๊ธ ํคํธ ๋ด ๊น์ค ๋ถ๋ ๋ฐ ์ธ์ ์ฝํ ์ฌ๊ณ ๋ฅผ ํ์
ํ๊ณ , ๋น๋จ ํ์ ๋ฑ ํฌ์ฝ ์๊ฐ์ด ์ค์ํ ์๊ธ์์ ์ฝํ ํด๋ ๋ณด์กด ์ํ๋ฅผ ์ ๊ฒํจ."
|
| 195 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_role":
|
| 196 |
+
return "์ธ์ ์๊ธ์ฒ์น, ๋น์ ๊ตฌ๊ธํ ๊ด๋ฆฌ, ๋ํผ ์๋ฃ์ ๊ฑด๊ฐ ๊ฒ์ง"
|
| 197 |
+
|
| 198 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_1":
|
| 199 |
+
return "์ง์ง ๋ํผ ์ ์ผ์ธ๋ก ๋๊ฐ๋ ์ธํ๋ถํํ ๋ณด๋๋ธ๋ก์ด๋ ์๊ฐ๊ธธ ์์์ ๋ณดํ ๋ถ์์ ์๊ธ์๋ค์ ๊ท ํ ์ ํ๋ก ๋ฐ๋ชฉ ๋ถ์ ๋ฐ ์ ๋ ์ํ์ด ๋์ ๊ฒ์ผ๋ก ํ์ธ๋จ."
|
| 200 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_2":
|
| 201 |
+
return "๋ํผ๊ฒฝ๋ก ์์ ๊ฒฝ์ฌ๋ฉด์ ์ง๋ ๋ ๋ค์์ ๋ฐ์ณ์ฃผ๋ ์ ์ฒด ์ง์ง ์ด๋๋ฒ์ ํ์ฉํ๊ณ ํ๋ จ ์ข
๋ฃ ํ ํผ๋ก๊ฐ ์์ธ ๊ด์ ๊ณผ ๊ทผ์ก์ ํ์ด์ฃผ๊ธฐ ์ํ ์ด์ ์น๋ฃ๋ฅผ ์ง๋ํจ."
|
| 202 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_role":
|
| 203 |
+
return "์ด๋ ๊ฒฝ๋ก ๋
ธ๋ฉด ์ํ ์๋ด, ์ด๋ ๋ณด์กฐ ๊ธฐ๊ตฌ ์ ๋ ์์ธ ๊ต์ "
|
| 204 |
+
|
| 205 |
+
# 2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์
|
| 206 |
+
elif section == "result_problem":
|
| 207 |
+
return f"์ง๋ ์ํฉ ์ ํ ์ฒด์ด ๊ณ ์ ์กฐ์น ๋ฏธํก์ผ๋ก 2์ฐจ ์ถฉ๋ ์ํ์ด ๊ฐ์ง๋์๊ณ , ๋ํผ ๊ฒฝ๋ก ๋ด ๋ณต๋ ์ฝ๋ ๋ถ๋ถ์ ๊ตํ ์ ์ฒด์ ํจ๊ป ์ค์ฆ ์น๋งค ์๊ธ์ 1๋ช
์ ๋ํผ ๊ฑฐ๋ถ ๋๋ฐ ํ๋์ด ๋ฐ์ํจ."
|
| 208 |
+
elif section == "result_action":
|
| 209 |
+
return f"์ง์ง ๋ฐ์์ ๋ฐ๋ฅธ ๋จธ๋ฆฌ ๋ณดํธ(๋ฒ ๊ฐ ๋ฐ ๋ฐฉ์ ํ์ฉ) ํ, ์ง๋์ด ๋ฉ์ถ ์ํ๋ฅผ ๊ฐ์ ํ๊ณ ๋ํผ๊ฒฝ๋ก({route_checked})๋ฅผ ๋ฐ๋ผ ์ผ์ธ ๋ํผํ์์ผ๋ฉฐ, ์ ์ ๋๋น ํ๋์ ํ์ฉ ๋ฐ ์ฐ๋ฝ์ฒด๊ณ({contact_checked})๋ฅผ ๊ฒํ ํจ."
|
| 210 |
+
elif section == "result_role_actions":
|
| 211 |
+
return "์์ค์ฅ์ ๋น์ ๋ฐ์ ์ํ๋ฅผ ์ฒดํฌํ๊ณ , ๋ณต์ง์ฌ๋ ์น๋งค ์๊ธ์์๊ฒ ์์ฌ ์ง์ง ์๋ น์ ์ ๊ณตํ์ผ๋ฉฐ, ์์๋ณดํธ์ฌ๋ 1:1 ๋ํผ ์ด์ก์, ๊ฐํธ์กฐ๋ฌด์ฌ๋ ํ๋ ฅ์งํ ๋ฐ ๊ตฌํธ ์ฝํ์ ์ง์ฐธํ์๊ณ , ๋ฌผ๋ฆฌ์น๋ฃ์ฌ๋ ์ง์ง ์ ์ด๋ ์ง์ง๏ฟฝ๏ฟฝ๏ฟฝ ๋ด๋นํจ."
|
| 212 |
+
elif section == "result_outcome":
|
| 213 |
+
return f"์ด๊ธฐ ๋จธ๋ฆฌ ๋ณดํธ ์๋ น ๋ฐ ์ง์ ์ ์ฐํ ์ด๋์ ํตํด ๋ํผ์๋ฃ ์๊ฐ์ด {evac_time}๋ก ์ธก์ ๋์๊ณ , ์ฌ๋ ์ํฉ์ ๋์ํ ์ ์๋ ์๋ น์ด ์ฑ๊ณต์ ์ผ๋ก ์ต๋๋์์."
|
| 214 |
+
elif section == "result_data":
|
| 215 |
+
return f"์ด ์ฐธ์ฌ์ {total_participants}๋ช
(์ข
์ฌ์ {staff_count}๋ช
, ์๊ธ์ {recipient_count}๋ช
), ๋ํผ์ทจ์ฝ์ {vulnerable_count}๋ช
, ํ ์ฒด์ด {wheelchair_count}๋, ๋ณดํ๋ณด์กฐ {walk_aid_count}๋ช
, ๋ํผ์๋ฃ {evac_time}, ์ํ๊ธฐ ์ค์ต {fire_ext_demo}, ์๊ธ๋์ {emergency_mock}."
|
| 216 |
+
elif section == "result_risks":
|
| 217 |
+
return "์ผ์ธ ์ง๊ฒฐ์ง์ธ ์ฃผ์ฐจ์ฅ ๋
ธ๋ฉด์ ๋์ถ๋ ๊ฒฝ๊ณ์์ด ๋ณดํ์ ์ด๋ ์ ๋ฐ ๊ฑธ๋ฆผ ๋์ ์์๋ก ์๋ณ๋์๊ณ , ์ฌ๋ ์ํฉ ๊ธด์ฅ๊ฐ์ผ๋ก ์ผ๋ถ ๊ณ ๋ น ์๊ธ์์ ๋จ๊ธฐ ํ์ ์์น์ธ๊ฐ ์ ์ง๋จ."
|
| 218 |
+
elif section == "result_next":
|
| 219 |
+
return "์ง๊ฒฐ์ง ๋ฐ๋ฅ์ ๋์ถ๋ฌผ์ ํฉ์ ์์ ํ
์ดํ๋ฅผ ๋ถ์ฐฉํ๊ณ ๋ฏธ๋๋ผ ๋ฐฉ์ง ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐ ์๋ฆฝํ๋ฉฐ, ๋ค์ ํ๋ จ ์์๋ ์ธ๊ทผ ์ค๋ด ์ง์ ๋ํผ์(๋๊ฐ๋น)๋ก์ ์ค์ง ์ฐ๊ณ ๋์ ํ๋ จ์ ์ค์ํ๊ฒ ์."
|
| 220 |
+
elif section == "result_guardian":
|
| 221 |
+
return f"๋ณดํธ์ ์ ์ ์๋ด({guardian_call_date}) ๊ฒฐ๊ณผ ๊ฑฐ๋๋ถํธ ์๊ธ์์ ๋ํผ ์์ ์ฐ๋ ค๊ฐ ์์ด 1:1 ์ ๋ด ์ธ๋ ฅ ๋งค์นญ ๊ณํ์ ์ค๋ช
ํ์์ผ๋ฉฐ, ๋ณดํธ์ ๋น์ ์ฐ๋ฝ์ฒ ์ต์ ํ๋ฅผ ํตํด {guardian_reflected} ์ํ๋ฅผ ์๋ฃํจ."
|
| 222 |
+
|
| 223 |
+
else: # ์์ ๊ต์ก
|
| 224 |
+
# Multi-occupational Opinions
|
| 225 |
+
if section == "opinion_์์ค์ฅ_1":
|
| 226 |
+
return "๊ธฐ๊ด ๋ด ๋์, ์ง์, ์๋ฐฉ ๋ฑ ์์ ๊ด๋ จ ๋งค๋ด์ผ์ ์๊ธ์ ์
์ ๊ท์ ์ ์๋ฌด ์ฒจ๋ถํ๊ณ , ์ง์ข
๊ฐ์ ๋งค๋ด์ผ ์์ง ํธ์ฐจ๊ฐ ์๋๋ก ์ฐ๊ฐ ์์ ๊ต์ก ์ด์์ ๋ฅผ ์ด์ ์ง์ํจ."
|
| 227 |
+
elif section == "opinion_์์ค์ฅ_2":
|
| 228 |
+
return "์๊ธ์ํฉ ๋ชจ์๋์ ๋ฅ๋ ฅ ํฅ์์ ์ํ ๊ณ ์ฑ๋ฅ CPR ๋ง๋คํน ๋ฐ ์๋ฐฉ ์ด์ ์ฅ๋น ๊ตฌ์
์ ์ง์ํ๊ณ ์๋ด ๋ํผ ์ ๋ ์ ๊ด ์กฐ๋ผ ๊ตฌ์
์์ฐ์ ์ ์ก ๋ฐฐ์ ํจ."
|
| 229 |
+
elif section == "opinion_์์ค์ฅ_role":
|
| 230 |
+
return "์์ ๊ต์ก ์ฒด๊ณ ๊ตฌ์ถ, ์์ค ๋ด ์์ ๊ท์ ์ค์ ๊ฐ๋
๋ฐ ๊ต์ก ๊ต๊ตฌ ์น์ธ"
|
| 231 |
+
|
| 232 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_1":
|
| 233 |
+
return f"๋์ ๋ฐ ์ง์ ๊ณ ์ํ ์๊ธ์ {vulnerable_count}๋ช
์ ์ฌ๋ก ํ์๋ฅผ ํตํด ๊ฐ๋ณ ๋ง์ถคํ ๊ธ์ฌ์ ๊ณต๊ณํ์ ๋ณ๊ฒฝํ๊ณ ์์ ๊ต์ก์ ๋ฐ๋ฅธ ์๋ฐฉ ์์น์ ์ ๋นํจ."
|
| 234 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_2":
|
| 235 |
+
return "๋ณดํธ์์์ ์๋ด ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ๊ด ๋ด ์๊ธ์ํฉ ๋์ ์ ์ฐจ๋ฅผ ๊ณต์ ํ๊ณ ๋์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ, ์์ ๊ต์ก ๊ณํ ๋ฐ CPR ๋์์๋ฅผ ์์งยท๋ณด๊ดํจ."
|
| 236 |
+
elif section == "opinion_์ฌํ๋ณต์ง์ฌ_role":
|
| 237 |
+
return "์์ ๋์์ ๊ด๋ฆฌ, ์๊ธ์ ๋์์ํ๋ ์ฌํ๊ฐ ๋ฐ ๊ต์ก ์ค์ต ํ์ ๊ธฐ๋ก"
|
| 238 |
+
|
| 239 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_1":
|
| 240 |
+
return f"์ธ์ง ์ฅ์ ๊ฐ ์๋ ์๊ธ์๋ค์ ๊ธฐ์นจ ๋ฐ์ฌ๊ฐ ์ ํ๋์ด ์์ฌ ์ ๋ชฉ ๋๊น์ด ๋ถ์์ ํด ์ง์ ์ํ์ด ์์ผ๋ฉฐ, ํ ์ฒด์ด ์ ๋ ์ฅ์น๋ฅผ ์์๋ก ์์ด ์นจ๋ ํ์น ์ ๋์ ์ํ์ด ๋์."
|
| 241 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_2":
|
| 242 |
+
return f"์์ฌ ์ง์ ์ ์์ฒด๋ฅผ ๋ฐ๋ฅด๊ฒ ์ธ์ฐ๋ ์์ฌ ์์ธ๋ฅผ ๊ต์ ํ๊ณ , ํ ์ฒด์ด ์นํ์ฐจ ์์๋ ๋ธ๋ ์ดํฌ ์ํ๋ฅผ ๋ณดํธ์๊ฐ ์ ํ ์๋ด์์ ์ธ๊ธํ ๋์ ๋ฐฉ์ง ์์น์ ๋ง์ถฐ ํํ ์ด์ค ์ ๊ธํ์ฌ ์ ๊ณตํจ."
|
| 243 |
+
elif section == "opinion_์์๋ณดํธ์ฌ_role":
|
| 244 |
+
return "์์ ์์ฌ ๋ํ ๋ณด์กฐ, ํ ์ฒด์ด ์์ ์กฐ์ ๋ฐ ๋์ ์๋ฐฉ ๊ท์น ์ ์ฉ"
|
| 245 |
+
|
| 246 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_1":
|
| 247 |
+
return "์ง์ ์ํฉ ๋ชจ์ ์ ํ์๋ฆฌํ๋ฒ์ ์ ํํ๊ฒ ์์ฐํ๊ณ , ์ฌ์ ์ง ์๊ธ์ ๋ฐ์์ ๋ฐ๋ฅธ ์ ์ํ ์ธ๊ณตํธํก ๋ฐ ์๋์ฌ์ฅ์ถฉ๊ฒฉ๊ธฐ(AED) ํจ๋ ๋ถ์ฐฉ ์์น์ ์ํฉ๋ณ ์ฌ์ ๋ ๋ถ์ ์ ์ฐจ๋ฅผ ๊ต์กํจ."
|
| 248 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_2":
|
| 249 |
+
return "๊ฐ์ผ ๊ด๋ฆฌ๋ฅผ ์ํ ์ ์๋
์ ์ฐจ ๋ฐ ์ ์ผ๋ณ ์ ํ ์ ๊ฒฉ๋ฆฌ ์ง์นจ์ ์ฌ์ ์ ์๋ฆฝํ๊ณ ๋น์ ์ฝํ ์บ๋น๋์ ์ด์ ๋ฐ ๋ฐฐ์น ์ํ๋ฅผ ์ ์ง์์ ์ ํํจ."
|
| 250 |
+
elif section == "opinion_๊ฐํธ์กฐ๋ฌด์ฌ_role":
|
| 251 |
+
return "ํ์๋ฆฌํ๋ฒ ๋ฐ CPR ์์ฐ ๊ต์ก ์ฃผ๋, ๊ฐ์ผ๋ณ ์๋ฐฉ ๊ท์น ์ง๋"
|
| 252 |
+
|
| 253 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_1":
|
| 254 |
+
return "๋ณดํ๋ณด์กฐ๊ธฐ(์์ปค) ์ฌ์ฉ ์ด๋ฅด์ ๋ค์ด ๋ฐฉํฅ ์ ํ ์ ๋ค๋ฆฌ ์ํด์ผ๋ก ์ธํ ๋์ ์ํ์ด ํผ์ ํ์ธํ๊ณ ํ์ง ๊ทผ๋ ฅ ๊ฐํ๋ฅผ ์ํ ์ฌํ ์ด๋์ด ์ค์ํจ์ ์ธ์งํจ."
|
| 255 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_2":
|
| 256 |
+
return "ํ ์ฒด์ด์ ์์ปค ์ฌ์ด์ ์ฌ๋ฐ๋ฅธ ์ฒด์ค ์ด๋ ์ค์ฌ ํ๋ จ์ ์ฃผ 3ํ ์ ๊ธฐ ์งํํ๊ณ , ๋์ ์๋ฐฉ 3๋ ์ ์ฒด ๋ณด์กฐ ๊ธฐ๋ฒ์ ์์๋ณดํธ์ฌ์๊ฒ ์ง๋ฌด ๊ต์ก์ผ๋ก ์ฐ๊ณํจ."
|
| 257 |
+
elif section == "opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_role":
|
| 258 |
+
return "๋์ ์๋ฐฉ ์คํธ๋ ์นญ ๊ต์ก, ๋ณด์กฐ ๋ณดํ ๊ธฐ๊ตฌ ๊ต์ ๋ฐ ๋ณดํ ์ฌํ ์ด๋ ์ ๊ณต"
|
| 259 |
+
|
| 260 |
+
# 2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์
|
| 261 |
+
elif section == "result_problem":
|
| 262 |
+
return "์๊ธ์๋ค์ ๊ทผ๋ ฅ ์ฝํ๋ก ๋์ ์ํ๋๊ฐ ๋์ ์ํ์์ ์๊ธ ๋๊ตฌ(AED) ๋ฐ ์ฝํํจ ๋ณด๊ด ์์น ์ธ์ง ๋ถ์กฑ์ด ํ์ธ๋์๊ณ , ์ญํ ๋ถ๋ด์ ๋ฐ๋ฅธ ์ ์ํ ์๊ธ ์กฐ์น ์ฐ๊ณ๊ฐ ์ผ๋ถ ๋ฏธํกํ์์."
|
| 263 |
+
elif section == "result_action":
|
| 264 |
+
return f"๋ค์ง์ข
ํฉ๋ ์์ ๊ต์ก์ ์ค์ํ๊ณ ๋ํผ์ทจ์ฝ์ {vulnerable_count}๋ช
์ ๋ํ 1:1 ๋ณดํ ์ง์๋ฒ์ ์ค์ตํ์์ผ๋ฉฐ, ํ์๋ฆฌํ๋ฒ ๋ฐ AED๋ฅผ ํ์ฉํ ์ฌํ์์์ ๋ชจ์์ค์ต({emergency_mock})์ ์งํํจ."
|
| 265 |
+
elif section == "result_role_actions":
|
| 266 |
+
return "์์ค์ฅ์ ์์ ๊ฐ๋
์, ๋ณต์ง์ฌ๋ ์์ ๋์์ ์์ง ๋ฐ ๊ธฐ๋ก์, ์์๋ณดํธ์ฌ๋ ํ ์ฒด์ด ์ด์ค ์ ๋ ์ค์ต์, ๊ฐํธ์กฐ๋ฌด์ฌ๋ ํ์๋ฆฌํ๋ฒ๊ณผ CPR ๊ต์ก์, ๋ฌผ๋ฆฌ์น๋ฃ์ฌ๋ ๋์ ๋ฐฉ์ง ๋ณดํ ์ค์ฌ ์ง๋๋ฅผ ๋ด๋นํจ."
|
| 267 |
+
elif section == "result_outcome":
|
| 268 |
+
return "์ ์ง์์ด ์๊ธ์ํฉ ๋ฐ์ ์ ๋ณธ์ธ์ ๋ด๋น ์ญํ ์ ์์งํ๊ณ AED ์กฐ์ ๋ฐ ํ์๋ฆฌํ๋ฒ ๋ฑ ์๊ธ ์ํฉ์์์ ์ด๊ธฐ ๋์ ์ฒ์น ๋ฅ๋ ฅ์ด ํฌ๊ฒ ํฅ์๋์์."
|
| 269 |
+
elif section == "result_data":
|
| 270 |
+
return f"์ด ์ฐธ์ฌ์ {total_participants}๋ช
(์ข
์ฌ์ {staff_count}๋ช
, ์๊ธ์ {recipient_count}๋ช
), ๋ํผ์ทจ์ฝ์ {vulnerable_count}๋ช
, ํ ์ฒด์ด {wheelchair_count}๋, ๋ณดํ๋ณด์กฐ {walk_aid_count}๋ช
, ๋ํผ์๋ฃ {evac_time}, ์ํ๊ธฐ ์ค์ต {fire_ext_demo}, ์๊ธ๋์ {emergency_mock}."
|
| 271 |
+
elif section == "result_risks":
|
| 272 |
+
return "์ข
์ฌ์๋ค์ ๊ทผ๋ฌด ๊ต๋ ์ ๋น์ ์ญํ ์ธ์์ธ๊ณ ๋งค๋ด์ผ ์์ง ํธ์ฐจ๊ฐ ๋ฏธ์ธํ๊ฒ ๊ด์กดํ๊ณ ์์ผ๋ฉฐ, ์๋ด ์ผ๋ถ ๋ณต๋ ์กฐ๋ช
์ด ๋ค์ ์ด๋์ ์ผ๊ฐ ๋์ ์ ๋ฐ ์์ธ์ผ๋ก ์์ฉํ ์ฐ๋ ค๊ฐ ๋ณด์."
|
| 273 |
+
elif section == "result_next":
|
| 274 |
+
return "๊ต๋ ๋์ฅ ์์์ '๋น์๋๋น๋ฐ ์ญํ '์ ํ๊ธฐํ๋ ์กฐ์น๋ฅผ ๊ท์ ๊ฐ์ ํ๊ณ , ์ด๋์ด ๋ณต๋์ ๋์ ๊ฐ์ง์ ์ผ๊ฐ ์์ ์ ๋๋ฑ์ ์ถ๊ฐ ์๊ณตํ๋ฉฐ, ๋ถ๊ธฐ๋ณ 1ํ CPR ๋ชจ์ ํ
์คํธ๋ฅผ ์ค์ํ๊ฒ ์."
|
| 275 |
+
elif section == "result_guardian":
|
| 276 |
+
return f"๋ณดํธ์ ์ ์ ์๋ด({guardian_call_date}) ๊ฒฐ๊ณผ ๊ฑฐ๋๋ถํธ ์๊ธ์์ ๋ํผ ์์ ์ฐ๋ ค๊ฐ ์์ด 1:1 ์ ๋ด ์ธ๋ ฅ ๋งค์นญ ๊ณํ์ ์ค๋ช
ํ์์ผ๋ฉฐ, ๋ณดํธ์ ๋น์ ์ฐ๋ฝ์ฒ ์ต์ ํ๋ฅผ ํตํด {guardian_reflected} ์ํ๋ฅผ ์๋ฃํจ."
|
| 277 |
+
|
| 278 |
+
return ""
|
| 279 |
+
|
| 280 |
+
# ---------------------------------------------------------
|
| 281 |
+
# Compile Data Structures for Excel Workbook
|
| 282 |
+
# ---------------------------------------------------------
|
| 283 |
+
def compile_document_data(info, training_type):
|
| 284 |
+
data = {
|
| 285 |
+
'facility_name': info['facility_name'],
|
| 286 |
+
'facility_head': info['facility_head'],
|
| 287 |
+
'writer': info['writer'],
|
| 288 |
+
'training_date': info['training_date'].strftime('%Y-%m-%d') if isinstance(info['training_date'], (date, datetime)) else str(info['training_date']),
|
| 289 |
+
'training_time': info['training_time'],
|
| 290 |
+
'training_location': info['training_location'],
|
| 291 |
+
'training_type': training_type,
|
| 292 |
+
'host': info['host'],
|
| 293 |
+
'total_participants': info['total_participants'],
|
| 294 |
+
'staff_participants': info['staff_participants'],
|
| 295 |
+
'recipient_participants': info['recipient_participants'],
|
| 296 |
+
'evac_time': info['evac_time'],
|
| 297 |
+
'vulnerable_count': info['vulnerable_count'],
|
| 298 |
+
'wheelchair_count': info['wheelchair_count'],
|
| 299 |
+
'walk_aid_count': info['walk_aid_count'],
|
| 300 |
+
'emergency_mock': info['emergency_mock'],
|
| 301 |
+
'fire_ext_demo': info['fire_ext_demo'],
|
| 302 |
+
'route_checked': info['route_checked'],
|
| 303 |
+
'contact_checked': info['contact_checked'],
|
| 304 |
+
'guardian_call_date': info['guardian_call_date'].strftime('%Y-%m-%d') if isinstance(info['guardian_call_date'], (date, datetime)) else str(info['guardian_call_date']),
|
| 305 |
+
'guardian_opinion': info['guardian_opinion'],
|
| 306 |
+
'guardian_response': info['guardian_response'],
|
| 307 |
+
'guardian_reflected': info['guardian_reflected'],
|
| 308 |
+
}
|
| 309 |
+
|
| 310 |
+
# 5 Job Roles Opinions
|
| 311 |
+
roles_list = ['์์ค์ฅ', '์ฌํ๋ณต์ง์ฌ', '์์๋ณดํธ์ฌ', '๊ฐํธ์กฐ๋ฌด์ฌ', '๋ฌผ๋ฆฌ์น๋ฃ์ฌ']
|
| 312 |
+
for r in roles_list:
|
| 313 |
+
data[f'opinion_{r}_1'] = generate_narrative_text(data, f'opinion_{r}_1', training_type)
|
| 314 |
+
data[f'opinion_{r}_2'] = generate_narrative_text(data, f'opinion_{r}_2', training_type)
|
| 315 |
+
data[f'opinion_{r}_role'] = generate_narrative_text(data, f'opinion_{r}_role', training_type)
|
| 316 |
+
|
| 317 |
+
# 2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์
|
| 318 |
+
data['result_problem'] = generate_narrative_text(data, 'result_problem', training_type)
|
| 319 |
+
data['result_action'] = generate_narrative_text(data, 'result_action', training_type)
|
| 320 |
+
data['result_role_actions'] = generate_narrative_text(data, 'result_role_actions', training_type)
|
| 321 |
+
data['result_outcome'] = generate_narrative_text(data, 'result_outcome', training_type)
|
| 322 |
+
data['result_data'] = generate_narrative_text(data, 'result_data', training_type)
|
| 323 |
+
data['result_risks'] = generate_narrative_text(data, 'result_risks', training_type)
|
| 324 |
+
data['result_next'] = generate_narrative_text(data, 'result_next', training_type)
|
| 325 |
+
data['result_guardian'] = generate_narrative_text(data, 'result_guardian', training_type)
|
| 326 |
+
|
| 327 |
+
return data
|
| 328 |
+
|
| 329 |
+
# ---------------------------------------------------------
|
| 330 |
+
# openpyxl Styling Helpers
|
| 331 |
+
# ---------------------------------------------------------
|
| 332 |
+
header_fill = PatternFill(start_color="F2F4F7", end_color="F2F4F7", fill_type="solid") # soft gray
|
| 333 |
+
section_fill = PatternFill(start_color="E8EFF9", end_color="E8EFF9", fill_type="solid") # professional light blue
|
| 334 |
+
|
| 335 |
+
label_font = Font(name="๋ง์ ๊ณ ๋", size=9.5, bold=True, color="374151")
|
| 336 |
+
value_font = Font(name="๋ง์ ๊ณ ๋", size=9.5, color="111827")
|
| 337 |
+
section_font = Font(name="๋ง์ ๊ณ ๋", size=10.5, bold=True, color="1A365D")
|
| 338 |
+
|
| 339 |
+
align_center = Alignment(vertical="center", horizontal="center")
|
| 340 |
+
align_left = Alignment(vertical="center", horizontal="left", indent=1)
|
| 341 |
+
align_left_wrap = Alignment(vertical="center", horizontal="left", wrap_text=True)
|
| 342 |
+
|
| 343 |
+
thin_border = Border(
|
| 344 |
+
left=Side(style='thin', color='D0D5DD'),
|
| 345 |
+
right=Side(style='thin', color='D0D5DD'),
|
| 346 |
+
top=Side(style='thin', color='D0D5DD'),
|
| 347 |
+
bottom=Side(style='thin', color='D0D5DD')
|
| 348 |
+
)
|
| 349 |
+
|
| 350 |
+
def style_range(ws, cell_range, border=None, fill=None, font=None, alignment=None):
|
| 351 |
+
for row in ws[cell_range]:
|
| 352 |
+
for cell in row:
|
| 353 |
+
if border is not None:
|
| 354 |
+
cell.border = border
|
| 355 |
+
if fill is not None:
|
| 356 |
+
cell.fill = fill
|
| 357 |
+
if font is not None:
|
| 358 |
+
cell.font = font
|
| 359 |
+
if alignment is not None:
|
| 360 |
+
cell.alignment = alignment
|
| 361 |
+
|
| 362 |
+
def write_spacer(ws, r_num):
|
| 363 |
+
ws.row_dimensions[r_num].height = 10
|
| 364 |
+
|
| 365 |
+
def write_section_header(ws, r_num, title):
|
| 366 |
+
ws.row_dimensions[r_num].height = 25
|
| 367 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=9)
|
| 368 |
+
ws.cell(row=r_num, column=1, value=title)
|
| 369 |
+
style_range(ws, f"A{r_num}:I{r_num}", fill=section_fill, font=section_font, alignment=align_left, border=thin_border)
|
| 370 |
+
|
| 371 |
+
def setup_page_print(ws):
|
| 372 |
+
ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT
|
| 373 |
+
ws.page_setup.paperSize = ws.PAPERSIZE_A4
|
| 374 |
+
ws.sheet_properties.pageSetUpPr.fitToPage = True
|
| 375 |
+
ws.page_setup.fitToWidth = 1
|
| 376 |
+
ws.page_setup.fitToHeight = 1
|
| 377 |
+
|
| 378 |
+
ws.page_margins.left = 0.5
|
| 379 |
+
ws.page_margins.right = 0.5
|
| 380 |
+
ws.page_margins.top = 0.5
|
| 381 |
+
ws.page_margins.bottom = 0.5
|
| 382 |
+
|
| 383 |
+
ws.views.sheetView[0].showGridLines = True
|
| 384 |
+
|
| 385 |
+
def write_general_info_row(ws, r_num, key1, val1, key2, val2):
|
| 386 |
+
ws.row_dimensions[r_num].height = 24
|
| 387 |
+
|
| 388 |
+
# Left key-val
|
| 389 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 390 |
+
ws.cell(row=r_num, column=1, value=key1)
|
| 391 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 392 |
+
ws.cell(row=r_num, column=3, value=val1)
|
| 393 |
+
|
| 394 |
+
# Right key-val
|
| 395 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=6)
|
| 396 |
+
ws.cell(row=r_num, column=5, value=key2)
|
| 397 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=9)
|
| 398 |
+
ws.cell(row=r_num, column=7, value=val2)
|
| 399 |
+
|
| 400 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 401 |
+
style_range(ws, f"C{r_num}:D{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 402 |
+
style_range(ws, f"E{r_num}:F{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 403 |
+
style_range(ws, f"G{r_num}:I{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 404 |
+
|
| 405 |
+
# ---------------------------------------------------------
|
| 406 |
+
# Excel Creator: Header and Content Helpers
|
| 407 |
+
# ---------------------------------------------------------
|
| 408 |
+
def write_title_and_approval(ws, title_text, info):
|
| 409 |
+
ws.row_dimensions[1].height = 22
|
| 410 |
+
ws.row_dimensions[2].height = 43
|
| 411 |
+
|
| 412 |
+
ws.merge_cells(start_row=1, start_column=1, end_row=2, end_column=7)
|
| 413 |
+
title_cell = ws.cell(row=1, column=1)
|
| 414 |
+
title_cell.value = title_text
|
| 415 |
+
style_range(ws, "A1:G2",
|
| 416 |
+
font=Font(name="๋ง์ ๊ณ ๋", size=15, bold=True, color="111827"),
|
| 417 |
+
alignment=align_center,
|
| 418 |
+
border=thin_border)
|
| 419 |
+
|
| 420 |
+
ws.cell(row=1, column=8, value="๋ด๋น์")
|
| 421 |
+
ws.cell(row=1, column=9, value="์์ค์ฅ")
|
| 422 |
+
style_range(ws, "H1:I1",
|
| 423 |
+
fill=header_fill,
|
| 424 |
+
font=Font(name="๋ง์ ๊ณ ๋", size=9.5, bold=True, color="374151"),
|
| 425 |
+
alignment=align_center,
|
| 426 |
+
border=thin_border)
|
| 427 |
+
|
| 428 |
+
ws.cell(row=2, column=8, value="")
|
| 429 |
+
ws.cell(row=2, column=9, value="")
|
| 430 |
+
style_range(ws, "H2:I2", border=thin_border)
|
| 431 |
+
|
| 432 |
+
def write_plan_participants(ws, r_num, info):
|
| 433 |
+
ws.row_dimensions[r_num].height = 24
|
| 434 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 435 |
+
ws.cell(row=r_num, column=1, value="์ด ์ฐธ์ฌ์ธ์")
|
| 436 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 437 |
+
ws.cell(row=r_num, column=3, value=f"{info['total_participants']} ๋ช
")
|
| 438 |
+
|
| 439 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=6)
|
| 440 |
+
ws.cell(row=r_num, column=5, value="์ข
์ฌ์ ์")
|
| 441 |
+
ws.cell(row=r_num, column=7, value=f"{info['staff_participants']} ๋ช
")
|
| 442 |
+
|
| 443 |
+
ws.cell(row=r_num, column=8, value="์๊ธ์ ์")
|
| 444 |
+
ws.cell(row=r_num, column=9, value=f"{info['recipient_participants']} ๋ช
")
|
| 445 |
+
|
| 446 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 447 |
+
style_range(ws, f"C{r_num}:D{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 448 |
+
style_range(ws, f"E{r_num}:F{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 449 |
+
|
| 450 |
+
ws.cell(row=r_num, column=7).font = value_font
|
| 451 |
+
ws.cell(row=r_num, column=7).alignment = align_center
|
| 452 |
+
ws.cell(row=r_num, column=7).border = thin_border
|
| 453 |
+
|
| 454 |
+
ws.cell(row=r_num, column=8).fill = header_fill
|
| 455 |
+
ws.cell(row=r_num, column=8).font = label_font
|
| 456 |
+
ws.cell(row=r_num, column=8).alignment = align_center
|
| 457 |
+
ws.cell(row=r_num, column=8).border = thin_border
|
| 458 |
+
|
| 459 |
+
ws.cell(row=r_num, column=9).font = value_font
|
| 460 |
+
ws.cell(row=r_num, column=9).alignment = align_center
|
| 461 |
+
ws.cell(row=r_num, column=9).border = thin_border
|
| 462 |
+
|
| 463 |
+
r_num += 1
|
| 464 |
+
|
| 465 |
+
ws.row_dimensions[r_num].height = 24
|
| 466 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 467 |
+
ws.cell(row=r_num, column=1, value="๋ํผ์ทจ์ฝ์ ์")
|
| 468 |
+
ws.cell(row=r_num, column=3, value=f"{info['vulnerable_count']} ๋ช
")
|
| 469 |
+
|
| 470 |
+
ws.merge_cells(start_row=r_num, start_column=4, end_row=r_num, end_column=5)
|
| 471 |
+
ws.cell(row=r_num, column=4, value="ํ ์ฒด์ด ์ฌ์ฉ ๋์์")
|
| 472 |
+
ws.cell(row=r_num, column=6, value=f"{info['wheelchair_count']} ๋ช
")
|
| 473 |
+
|
| 474 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=8)
|
| 475 |
+
ws.cell(row=r_num, column=7, value="๋ณดํ๋ณด์กฐ ํ์์")
|
| 476 |
+
ws.cell(row=r_num, column=9, value=f"{info['walk_aid_count']} ๋ช
")
|
| 477 |
+
|
| 478 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 479 |
+
ws.cell(row=r_num, column=3).font = value_font
|
| 480 |
+
ws.cell(row=r_num, column=3).alignment = align_center
|
| 481 |
+
ws.cell(row=r_num, column=3).border = thin_border
|
| 482 |
+
|
| 483 |
+
style_range(ws, f"D{r_num}:E{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 484 |
+
ws.cell(row=r_num, column=6).font = value_font
|
| 485 |
+
ws.cell(row=r_num, column=6).alignment = align_center
|
| 486 |
+
ws.cell(row=r_num, column=6).border = thin_border
|
| 487 |
+
|
| 488 |
+
style_range(ws, f"G{r_num}:H{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 489 |
+
ws.cell(row=r_num, column=9).font = value_font
|
| 490 |
+
ws.cell(row=r_num, column=9).alignment = align_center
|
| 491 |
+
ws.cell(row=r_num, column=9).border = thin_border
|
| 492 |
+
|
| 493 |
+
return r_num
|
| 494 |
+
|
| 495 |
+
def write_plan_details(ws, r_num, info):
|
| 496 |
+
write_section_header(ws, r_num, "2. ํ๋ จ ๋ชฉ์ ๋ฐ ๊ณํ")
|
| 497 |
+
r_num += 1
|
| 498 |
+
|
| 499 |
+
ws.row_dimensions[r_num].height = 24
|
| 500 |
+
ws.row_dimensions[r_num+1].height = 24
|
| 501 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+1, end_column=2)
|
| 502 |
+
ws.cell(row=r_num, column=1, value="ํ๋ จ ๋ชฉ์ ")
|
| 503 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num+1, end_column=9)
|
| 504 |
+
|
| 505 |
+
purpose_text = (
|
| 506 |
+
f"{info['training_type']} ์ํฉ ๋ฐ์ ์ ์ ์ํ๊ณ ์ฒด๊ณ์ ์ธ ๋ํผ ๋ฐ ์ด๊ธฐ ๋์ ๋ฅ๋ ฅ์ ๋ฐฐ์ํ์ฌ ์๊ธ์์ ์๋ช
๊ณผ ์ ์ฒด๋ฅผ ๋ณดํธํ๊ณ , "
|
| 507 |
+
"๋ค์ง์ข
๊ฐ์ ์ ๊ธฐ์ ์ธ ํ๋ ฅ์ ํตํด ์ฅ๊ธฐ์์๊ธฐ๊ด ํ๊ฐ ๊ธฐ์ค์ ์ ํฉํ ์์ ๊ด๋ฆฌ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํจ."
|
| 508 |
+
)
|
| 509 |
+
ws.cell(row=r_num, column=3, value=purpose_text)
|
| 510 |
+
style_range(ws, f"A{r_num}:B{r_num+1}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 511 |
+
style_range(ws, f"C{r_num}:I{r_num+1}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 512 |
+
r_num += 2
|
| 513 |
+
|
| 514 |
+
ws.row_dimensions[r_num].height = 24
|
| 515 |
+
ws.row_dimensions[r_num+1].height = 24
|
| 516 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+1, end_column=2)
|
| 517 |
+
ws.cell(row=r_num, column=1, value="๋ํผ ๊ฒฝ๋ก")
|
| 518 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num+1, end_column=9)
|
| 519 |
+
|
| 520 |
+
route_text = (
|
| 521 |
+
"ํผ๋๊ณ๋จ ๋ฐ ์ง์ ๋ํผ๊ฒฝ๋ก ์ฌ์ ํ์ธ: ์ค๋ด ๋น์๊ตฌ ํ์๋ฑ ๋ฐ ๋ํผ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ง์ ๋ ์ธ๋ถ ์ง๊ฒฐ์ง๊น์ง์ ์ด๋ ๋์ ์ ํ์
ํ๊ณ ์ฅ์ ๋ฌผ์ ์์ ํ ์ ๊ฑฐํจ.\n"
|
| 522 |
+
f"(๋ํผ๊ฒฝ๋ก ํ์ธ ์ํ: {info['route_checked']})"
|
| 523 |
+
)
|
| 524 |
+
ws.cell(row=r_num, column=3, value=route_text)
|
| 525 |
+
style_range(ws, f"A{r_num}:B{r_num+1}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 526 |
+
style_range(ws, f"C{r_num}:I{r_num+1}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 527 |
+
r_num += 2
|
| 528 |
+
|
| 529 |
+
write_spacer(ws, r_num)
|
| 530 |
+
r_num += 1
|
| 531 |
+
|
| 532 |
+
write_section_header(ws, r_num, "3. ๋ค์ง์ข
๋ณ ์ญํ ๋ถ๋ด ๊ณํ")
|
| 533 |
+
r_num += 1
|
| 534 |
+
|
| 535 |
+
ws.row_dimensions[r_num].height = 24
|
| 536 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 537 |
+
ws.cell(row=r_num, column=1, value="์ง์ข
")
|
| 538 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=9)
|
| 539 |
+
ws.cell(row=r_num, column=3, value="์ญํ ๋ฐ ์ฃผ์ ์
๋ฌด ๋ถ๋ด ๋ด์ฉ")
|
| 540 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 541 |
+
style_range(ws, f"C{r_num}:I{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 542 |
+
r_num += 1
|
| 543 |
+
|
| 544 |
+
roles = [
|
| 545 |
+
("์์ค์ฅ", "ํ๋ จ ์ด๊ด, ์งํ, ํ๊ฐ ๋์, ์ ๊ด๊ธฐ๊ด ์ฐ๋ฝ์ฒด๊ณ ํ์ธ"),
|
| 546 |
+
("์ฌํ๋ณต์ง์ฌ", "์๊ธ์ ๋ช
๋จ ํ์ธ, ๋ํผ์ทจ์ฝ์ ๋ถ๋ฅ, ๋ณดํธ์ ์ฐ๋ฝ, ํ๋ จ๊ธฐ๋ก ์์ฑ"),
|
| 547 |
+
("์์๋ณดํธ์ฌ", "์๊ธ์ ๋ํผ ๋ณด์กฐ, ์ด๋ ์ง์, ๋์์ํ์ ๋ณดํธ, ์ค์ ํ์ฅ ๋์"),
|
| 548 |
+
("๊ฐํธ์กฐ๋ฌด์ฌ", "์๊ธ์ํฉ ํ์ธ, ํ๋ ฅ์งํ ํ์ธ, ํฌ์ฝยท๊ฑด๊ฐ์ํ ํ์ธ, ๋ถ์์ ์๊ธ์กฐ์น"),
|
| 549 |
+
("๋ฌผ๋ฆฌ์น๋ฃ์ฌ", "๋ณดํ๋ถ์์ ์๊ธ์ ์ด๋์ง์, ํ ์ฒด์ดยท์์ปค ์ฌ์ฉ ๋์์ ๋ํผ ์ง์, ๋์์๋ฐฉ ํ์ธ")
|
| 550 |
+
]
|
| 551 |
+
for role, desc in roles:
|
| 552 |
+
ws.row_dimensions[r_num].height = 24
|
| 553 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 554 |
+
ws.cell(row=r_num, column=1, value=role)
|
| 555 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=9)
|
| 556 |
+
ws.cell(row=r_num, column=3, value=desc)
|
| 557 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 558 |
+
style_range(ws, f"C{r_num}:I{r_num}", font=value_font, alignment=align_left, border=thin_border)
|
| 559 |
+
r_num += 1
|
| 560 |
+
|
| 561 |
+
write_spacer(ws, r_num)
|
| 562 |
+
r_num += 1
|
| 563 |
+
|
| 564 |
+
write_section_header(ws, r_num, "4. ๋น์ ์ฐ๋ฝ ๋ฐ ์ ๊ด๊ธฐ๊ด ํ์กฐ ์ฒด๊ณ")
|
| 565 |
+
r_num += 1
|
| 566 |
+
|
| 567 |
+
ws.row_dimensions[r_num].height = 24
|
| 568 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 569 |
+
ws.cell(row=r_num, column=1, value="์ ๊ด๊ธฐ๊ด")
|
| 570 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 571 |
+
ws.cell(row=r_num, column=3, value="๋น์์ฐ๋ฝ์ฒ")
|
| 572 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=9)
|
| 573 |
+
ws.cell(row=r_num, column=5, value="์ฃผ์ ํ์กฐ ๋ฐ ๋์ ๋ด์ฉ")
|
| 574 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 575 |
+
style_range(ws, f"C{r_num}:D{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 576 |
+
style_range(ws, f"E{r_num}:I{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 577 |
+
r_num += 1
|
| 578 |
+
|
| 579 |
+
contacts = [
|
| 580 |
+
("์๋ฐฉ์ (119)", "119 / ๊ดํ ์๋ฐฉ์", f"ํ์ฌ ๋ฐ์ ์ ๊ณ , ์ธ๋ช
๊ตฌ์กฐ ๋ฐ ํ์ฌ ์ง์ ์ง์ (์ํ๊ธฐ ์์ฐ: {info['fire_ext_demo']})"),
|
| 581 |
+
("๊ฒฝ์ฐฐ์ (112)", "112 / ๊ดํ ์ง๊ตฌ๋", "ํ๋ จ ์ ์ฃผ๋ณ ๊ตํต ํต์ ๋ฐ ์์ ์ ์ง ํ์กฐ"),
|
| 582 |
+
("ํ๋ ฅ ์๋ฃ๊ธฐ๊ด", "์ธ๊ทผ ์ข
ํฉ๋ณ์", f"์๊ธ ํ์ ๋ฐ์ ์ ๊ธด๊ธ ์ด์ก ๋ฐ ๊ธด๊ธ ์๋ฃ ์ง์์ฒด๊ณ ๊ฐ๋ (๋ชจ์๋์: {info['emergency_mock']})")
|
| 583 |
+
]
|
| 584 |
+
for org, phone, task in contacts:
|
| 585 |
+
ws.row_dimensions[r_num].height = 24
|
| 586 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 587 |
+
ws.cell(row=r_num, column=1, value=org)
|
| 588 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 589 |
+
ws.cell(row=r_num, column=3, value=phone)
|
| 590 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=9)
|
| 591 |
+
ws.cell(row=r_num, column=5, value=task)
|
| 592 |
+
|
| 593 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 594 |
+
style_range(ws, f"C{r_num}:D{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 595 |
+
style_range(ws, f"E{r_num}:I{r_num}", font=value_font, alignment=align_left, border=thin_border)
|
| 596 |
+
r_num += 1
|
| 597 |
+
|
| 598 |
+
return r_num
|
| 599 |
+
|
| 600 |
+
def write_report_participants(ws, r_num, info):
|
| 601 |
+
ws.row_dimensions[r_num].height = 24
|
| 602 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 603 |
+
ws.cell(row=r_num, column=1, value="์ด ์ฐธ์ฌ์ธ์")
|
| 604 |
+
ws.cell(row=r_num, column=3, value=f"{info['total_participants']} ๋ช
")
|
| 605 |
+
|
| 606 |
+
ws.merge_cells(start_row=r_num, start_column=4, end_row=r_num, end_column=5)
|
| 607 |
+
ws.cell(row=r_num, column=4, value="์ข
์ฌ์ ์ฐธ์ฌ์ ์")
|
| 608 |
+
ws.cell(row=r_num, column=6, value=f"{info['staff_participants']} ๋ช
")
|
| 609 |
+
|
| 610 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=8)
|
| 611 |
+
ws.cell(row=r_num, column=7, value="์๊ธ์ ์ฐธ์ฌ์ ์")
|
| 612 |
+
ws.cell(row=r_num, column=9, value=f"{info['recipient_participants']} ๋ช
")
|
| 613 |
+
|
| 614 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 615 |
+
ws.cell(row=r_num, column=3).font = value_font
|
| 616 |
+
ws.cell(row=r_num, column=3).alignment = align_center
|
| 617 |
+
ws.cell(row=r_num, column=3).border = thin_border
|
| 618 |
+
|
| 619 |
+
style_range(ws, f"D{r_num}:E{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 620 |
+
ws.cell(row=r_num, column=6).font = value_font
|
| 621 |
+
ws.cell(row=r_num, column=6).alignment = align_center
|
| 622 |
+
ws.cell(row=r_num, column=6).border = thin_border
|
| 623 |
+
|
| 624 |
+
style_range(ws, f"G{r_num}:H{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 625 |
+
ws.cell(row=r_num, column=9).font = value_font
|
| 626 |
+
ws.cell(row=r_num, column=9).alignment = align_center
|
| 627 |
+
ws.cell(row=r_num, column=9).border = thin_border
|
| 628 |
+
|
| 629 |
+
r_num += 1
|
| 630 |
+
|
| 631 |
+
ws.row_dimensions[r_num].height = 24
|
| 632 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 633 |
+
ws.cell(row=r_num, column=1, value="๋ํผ์๋ฃ ์๊ฐ")
|
| 634 |
+
ws.cell(row=r_num, column=3, value=f"{info['evac_time']}")
|
| 635 |
+
|
| 636 |
+
ws.merge_cells(start_row=r_num, start_column=4, end_row=r_num, end_column=5)
|
| 637 |
+
ws.cell(row=r_num, column=4, value="๋ํผ์ทจ์ฝ์ ์")
|
| 638 |
+
ws.cell(row=r_num, column=6, value=f"{info['vulnerable_count']} ๋ช
")
|
| 639 |
+
|
| 640 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=8)
|
| 641 |
+
ws.cell(row=r_num, column=7, value="ํ ์ฒด์ด ์ฌ์ฉ ๋์์")
|
| 642 |
+
ws.cell(row=r_num, column=9, value=f"{info['wheelchair_count']} ๋ช
")
|
| 643 |
+
|
| 644 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 645 |
+
ws.cell(row=r_num, column=3).font = value_font
|
| 646 |
+
ws.cell(row=r_num, column=3).alignment = align_center
|
| 647 |
+
ws.cell(row=r_num, column=3).border = thin_border
|
| 648 |
+
|
| 649 |
+
style_range(ws, f"D{r_num}:E{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 650 |
+
ws.cell(row=r_num, column=6).font = value_font
|
| 651 |
+
ws.cell(row=r_num, column=6).alignment = align_center
|
| 652 |
+
ws.cell(row=r_num, column=6).border = thin_border
|
| 653 |
+
|
| 654 |
+
style_range(ws, f"G{r_num}:H{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 655 |
+
ws.cell(row=r_num, column=9).font = value_font
|
| 656 |
+
ws.cell(row=r_num, column=9).alignment = align_center
|
| 657 |
+
ws.cell(row=r_num, column=9).border = thin_border
|
| 658 |
+
|
| 659 |
+
r_num += 1
|
| 660 |
+
|
| 661 |
+
ws.row_dimensions[r_num].height = 24
|
| 662 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 663 |
+
ws.cell(row=r_num, column=1, value="๋ณดํ๋ณด์กฐ ํ์์")
|
| 664 |
+
ws.cell(row=r_num, column=3, value=f"{info['walk_aid_count']} ๋ช
")
|
| 665 |
+
|
| 666 |
+
ws.merge_cells(start_row=r_num, start_column=4, end_row=r_num, end_column=5)
|
| 667 |
+
ws.cell(row=r_num, column=4, value="์๊ธ์ํฉ ๋ชจ์๋์")
|
| 668 |
+
ws.cell(row=r_num, column=6, value=f"{info['emergency_mock']}")
|
| 669 |
+
|
| 670 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=8)
|
| 671 |
+
ws.cell(row=r_num, column=7, value="์ํ๊ธฐ ์ฌ์ฉ ์์ฐ")
|
| 672 |
+
ws.cell(row=r_num, column=9, value=f"{info['fire_ext_demo']}")
|
| 673 |
+
|
| 674 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 675 |
+
ws.cell(row=r_num, column=3).font = value_font
|
| 676 |
+
ws.cell(row=r_num, column=3).alignment = align_center
|
| 677 |
+
ws.cell(row=r_num, column=3).border = thin_border
|
| 678 |
+
|
| 679 |
+
style_range(ws, f"D{r_num}:E{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 680 |
+
ws.cell(row=r_num, column=6).font = value_font
|
| 681 |
+
ws.cell(row=r_num, column=6).alignment = align_center
|
| 682 |
+
ws.cell(row=r_num, column=6).border = thin_border
|
| 683 |
+
|
| 684 |
+
style_range(ws, f"G{r_num}:H{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 685 |
+
ws.cell(row=r_num, column=9).font = value_font
|
| 686 |
+
ws.cell(row=r_num, column=9).alignment = align_center
|
| 687 |
+
ws.cell(row=r_num, column=9).border = thin_border
|
| 688 |
+
|
| 689 |
+
r_num += 1
|
| 690 |
+
|
| 691 |
+
ws.row_dimensions[r_num].height = 24
|
| 692 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 693 |
+
ws.cell(row=r_num, column=1, value="๋ํผ๊ฒฝ๋ก ํ์ธ")
|
| 694 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 695 |
+
ws.cell(row=r_num, column=3, value=f"{info['route_checked']}")
|
| 696 |
+
|
| 697 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=6)
|
| 698 |
+
ws.cell(row=r_num, column=5, value="๋น์์ฐ๋ฝ๋ง ํ์ธ")
|
| 699 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=9)
|
| 700 |
+
ws.cell(row=r_num, column=7, value=f"{info['contact_checked']}")
|
| 701 |
+
|
| 702 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 703 |
+
style_range(ws, f"C{r_num}:D{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 704 |
+
style_range(ws, f"E{r_num}:F{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 705 |
+
style_range(ws, f"G{r_num}:I{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 706 |
+
|
| 707 |
+
return r_num
|
| 708 |
+
|
| 709 |
+
# ---------------------------------------------------------
|
| 710 |
+
# Audit Style Meeting Opinion & 2nd Result Writers
|
| 711 |
+
# ---------------------------------------------------------
|
| 712 |
+
def write_role_meeting_opinion(ws, r_num, role, detail1, detail2, role_desc):
|
| 713 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+2, end_column=2)
|
| 714 |
+
ws.cell(row=r_num, column=1, value=role)
|
| 715 |
+
|
| 716 |
+
# Row 1 (Detail 1)
|
| 717 |
+
ws.row_dimensions[r_num].height = 28
|
| 718 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=9)
|
| 719 |
+
ws.cell(row=r_num, column=3, value=detail1)
|
| 720 |
+
|
| 721 |
+
# Row 2 (Detail 2)
|
| 722 |
+
ws.row_dimensions[r_num+1].height = 28
|
| 723 |
+
ws.merge_cells(start_row=r_num+1, start_column=3, end_row=r_num+1, end_column=9)
|
| 724 |
+
ws.cell(row=r_num+1, column=3, value=detail2)
|
| 725 |
+
|
| 726 |
+
# Row 3 (Role Desc)
|
| 727 |
+
ws.row_dimensions[r_num+2].height = 28
|
| 728 |
+
ws.merge_cells(start_row=r_num+2, start_column=3, end_row=r_num+2, end_column=9)
|
| 729 |
+
ws.cell(row=r_num+2, column=3, value=role_desc)
|
| 730 |
+
|
| 731 |
+
style_range(ws, f"A{r_num}:B{r_num+2}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 732 |
+
style_range(ws, f"C{r_num}:I{r_num}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 733 |
+
style_range(ws, f"C{r_num+1}:I{r_num+1}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 734 |
+
style_range(ws, f"C{r_num+2}:I{r_num+2}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 735 |
+
|
| 736 |
+
return r_num + 2
|
| 737 |
+
|
| 738 |
+
def write_secondary_result_row(ws, r_num, label, content):
|
| 739 |
+
ws.row_dimensions[r_num].height = 28
|
| 740 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 741 |
+
ws.cell(row=r_num, column=1, value=label)
|
| 742 |
+
|
| 743 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=9)
|
| 744 |
+
ws.cell(row=r_num, column=3, value=content)
|
| 745 |
+
|
| 746 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 747 |
+
style_range(ws, f"C{r_num}:I{r_num}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 748 |
+
|
| 749 |
+
return r_num
|
| 750 |
+
|
| 751 |
+
def write_guardian_feedback(ws, r_num, info):
|
| 752 |
+
# Row 1: meta (Date, Reflected)
|
| 753 |
+
ws.row_dimensions[r_num].height = 24
|
| 754 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 755 |
+
ws.cell(row=r_num, column=1, value="ํตํ์ผ์")
|
| 756 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=4)
|
| 757 |
+
ws.cell(row=r_num, column=3, value=f"{info['guardian_call_date']}")
|
| 758 |
+
|
| 759 |
+
ws.merge_cells(start_row=r_num, start_column=5, end_row=r_num, end_column=6)
|
| 760 |
+
ws.cell(row=r_num, column=5, value="๋ฐ์ ์ฌ๋ถ")
|
| 761 |
+
ws.merge_cells(start_row=r_num, start_column=7, end_row=r_num, end_column=9)
|
| 762 |
+
ws.cell(row=r_num, column=7, value=f"{info['guardian_reflected']}")
|
| 763 |
+
|
| 764 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 765 |
+
style_range(ws, f"C{r_num}:D{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 766 |
+
style_range(ws, f"E{r_num}:F{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 767 |
+
style_range(ws, f"G{r_num}:I{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 768 |
+
|
| 769 |
+
r_num += 1
|
| 770 |
+
|
| 771 |
+
# Row 2 & 3: Guardian Opinion
|
| 772 |
+
ws.row_dimensions[r_num].height = 28
|
| 773 |
+
ws.row_dimensions[r_num+1].height = 28
|
| 774 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+1, end_column=2)
|
| 775 |
+
ws.cell(row=r_num, column=1, value="๋ณดํธ์ ์๊ฒฌ")
|
| 776 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num+1, end_column=9)
|
| 777 |
+
ws.cell(row=r_num, column=3, value=f"{info['guardian_opinion']}")
|
| 778 |
+
|
| 779 |
+
style_range(ws, f"A{r_num}:B{r_num+1}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 780 |
+
style_range(ws, f"C{r_num}:I{r_num+1}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 781 |
+
|
| 782 |
+
r_num += 2
|
| 783 |
+
|
| 784 |
+
# Row 4 & 5: Facility Explanation
|
| 785 |
+
ws.row_dimensions[r_num].height = 28
|
| 786 |
+
ws.row_dimensions[r_num+1].height = 28
|
| 787 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+1, end_column=2)
|
| 788 |
+
ws.cell(row=r_num, column=1, value="๊ธฐ๊ด ์ค๋ช
๋ด์ฉ")
|
| 789 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num+1, end_column=9)
|
| 790 |
+
ws.cell(row=r_num, column=3, value=f"{info['guardian_response']}")
|
| 791 |
+
|
| 792 |
+
style_range(ws, f"A{r_num}:B{r_num+1}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 793 |
+
style_range(ws, f"C{r_num}:I{r_num+1}", font=value_font, alignment=align_left_wrap, border=thin_border)
|
| 794 |
+
|
| 795 |
+
return r_num + 1
|
| 796 |
+
|
| 797 |
+
def write_photo_section(ws, r_num):
|
| 798 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num+5, end_column=9)
|
| 799 |
+
for i in range(6):
|
| 800 |
+
ws.row_dimensions[r_num+i].height = 25
|
| 801 |
+
|
| 802 |
+
photo_cell = ws.cell(row=r_num, column=1)
|
| 803 |
+
photo_cell.value = (
|
| 804 |
+
"[ํ๋ จ ์ฌ์ง ์ฒจ๋ถ๋]\n\n"
|
| 805 |
+
"โป ์ฌ๊ธฐ์ ์ค์ ๋ํผํ๋ จ, ์ํ๊ธฐ ์์ฐ, ์๊ธ๋ชจ์๋์ ๋ฑ ํ๋ จ ์ฌ์ง์ ๋ถ์ฐฉํ์ญ์์ค.\n"
|
| 806 |
+
"(์ฅ๊ธฐ์์๊ธฐ๊ด ํ๊ฐ ๋์์ ์ํด 2์ฅ ์ด์์ ์ฌ์ง ๋ถ์ฐฉ์ด ํ์์ ์
๋๋ค.)"
|
| 807 |
+
)
|
| 808 |
+
style_range(ws, f"A{r_num}:I{r_num+5}",
|
| 809 |
+
font=Font(name="๋ง์ ๊ณ ๋", size=9.5, italic=True, color="667085"),
|
| 810 |
+
alignment=Alignment(vertical="center", horizontal="center", wrap_text=True),
|
| 811 |
+
border=thin_border)
|
| 812 |
+
|
| 813 |
+
return r_num + 5
|
| 814 |
+
|
| 815 |
+
# ---------------------------------------------------------
|
| 816 |
+
# Excel Creator: Write Checklist Sheet
|
| 817 |
+
# ---------------------------------------------------------
|
| 818 |
+
def write_checklist_tab(ws, info):
|
| 819 |
+
col_widths = {
|
| 820 |
+
'A': 10, 'B': 10, 'C': 12, 'D': 12, 'E': 12, 'F': 12, 'G': 12, 'H': 14, 'I': 14
|
| 821 |
+
}
|
| 822 |
+
for col, width in col_widths.items():
|
| 823 |
+
ws.column_dimensions[col].width = width
|
| 824 |
+
|
| 825 |
+
setup_page_print(ws)
|
| 826 |
+
|
| 827 |
+
# Title
|
| 828 |
+
ws.row_dimensions[1].height = 22
|
| 829 |
+
ws.row_dimensions[2].height = 22
|
| 830 |
+
ws.merge_cells("A1:I2")
|
| 831 |
+
title_cell = ws.cell(row=1, column=1)
|
| 832 |
+
title_cell.value = "์ฅ๊ธฐ์์๊ธฐ๊ด ํ๊ฐ ๋์ - ํ๋ จ ๋ฐ ๊ต์ก ๋๋ฝ ์ฒดํฌ๋ฆฌ์คํธ"
|
| 833 |
+
style_range(ws, "A1:I2",
|
| 834 |
+
font=Font(name="๋ง์ ๊ณ ๋", size=14, bold=True, color="111827"),
|
| 835 |
+
alignment=align_center,
|
| 836 |
+
border=thin_border)
|
| 837 |
+
|
| 838 |
+
# Info Banner
|
| 839 |
+
ws.row_dimensions[4].height = 30
|
| 840 |
+
ws.merge_cells("A4:I4")
|
| 841 |
+
banner_cell = ws.cell(row=4, column=1)
|
| 842 |
+
banner_cell.value = "โป ๋ณธ ์ฒดํฌ๋ฆฌ์คํธ๋ ๊ตญ๋ฏผ๊ฑด๊ฐ๋ณดํ๊ณต๋จ ์ฅ๊ธฐ์์๊ธฐ๊ด ํ๊ฐ ๊ณ ์ ๊ธฐ์ค ๋ฐ ๋งค๋ด์ผ์ ์๊ฑฐํ์ฌ ์์ฑ๋์์ต๋๋ค. ๊ฐ ํญ๋ชฉ์ ๋ฐ์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ญ์์ค."
|
| 843 |
+
style_range(ws, "A4:I4",
|
| 844 |
+
fill=PatternFill(start_color="F9FAFB", end_color="F9FAFB", fill_type="solid"),
|
| 845 |
+
font=Font(name="๋ง์ ๊ณ ๋", size=9, italic=True, color="475467"),
|
| 846 |
+
alignment=align_center,
|
| 847 |
+
border=thin_border)
|
| 848 |
+
|
| 849 |
+
# Headers
|
| 850 |
+
ws.row_dimensions[6].height = 26
|
| 851 |
+
ws.merge_cells("A6:B6")
|
| 852 |
+
ws.cell(row=6, column=1, value="ํ๊ฐ ํญ๋ชฉ")
|
| 853 |
+
ws.merge_cells("C6:E6")
|
| 854 |
+
ws.cell(row=6, column=3, value="์ธ๋ถ ํ์ธ์ฌํญ ๋ฐ ๊ธฐ์ค")
|
| 855 |
+
ws.merge_cells("F6:G6")
|
| 856 |
+
ws.cell(row=6, column=6, value="๋ฐ์ ์ํ")
|
| 857 |
+
ws.merge_cells("H6:I6")
|
| 858 |
+
ws.cell(row=6, column=8, value="ํ๊ฐ ๊ธฐ์ค ์ถฉ์กฑ ์ฌ๋ถ")
|
| 859 |
+
|
| 860 |
+
style_range(ws, "A6:I6", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 861 |
+
|
| 862 |
+
checklist_items = [
|
| 863 |
+
("ํ๋ จ๊ณํ์ ์์ฑ ์ฌ๋ถ", "ํ๋ จ์ ์ค์ํ๊ธฐ ์ ๊ตฌ์ฒด์ ์ธ ๊ณํ์๊ฐ ์๋ฆฝ๋์ด ์๋๊ฐ?", "์์ฑ ์๋ฃ", "์ถฉ์กฑ (Pass)"),
|
| 864 |
+
("๊ฒฐ๊ณผ๋ณด๊ณ ์ ์์ฑ ์ฌ๋ถ", "ํ๋ จ ์ค์ ํ ๊ฒฐ๊ณผ๋ณด๊ณ ์๊ฐ ์์ฑ ๋ฐ ๋ณด๊ด๋์ด ์๋๊ฐ?", "์์ฑ ์๋ฃ", "์ถฉ์กฑ (Pass)"),
|
| 865 |
+
("ํ๋ จ์ผ์ ๊ธฐ๋ก", "๊ณํ์ ๋ฐ ๊ฒฐ๊ณผ๋ณด๊ณ ์์ ์ค์ ํ๋ จ์ผ์๊ฐ ์ ํํ ๊ธฐ๋ก๋์๋๊ฐ?", f"{info['training_date']} ๊ธฐ๋ก๋จ", "์ถฉ์กฑ (Pass)"),
|
| 866 |
+
("ํ๋ จ์๊ฐ ๊ธฐ๋ก", "ํ๋ จ ์์ ๋ฐ ์ข
๋ฃ ์๊ฐ(์: 1์๊ฐ ์ด์)์ด ์์ธํ ๊ธฐ๋ก๋์๋๊ฐ?", f"{info['training_time']} ๊ธฐ๋ก๋จ", "์ถฉ์กฑ (Pass)"),
|
| 867 |
+
("ํ๋ จ์ฅ์ ๊ธฐ๋ก", "ํ๋ จ์ด ์ค์๋ ๊ตฌ์ฒด์ ์ธ ์ฅ์๊ฐ ๋ช
์๋์ด ์๋๊ฐ?", f"{info['training_location']} ๊ธฐ๋ก๋จ", "์ถฉ์กฑ (Pass)"),
|
| 868 |
+
("์ฐธ์ฌ์ ๋ช
๋จ", "ํ๋ จ์ ์ฐธ์ฌํ ์๊ธ์์ ์ข
์ฌ์์ ๋ช
๋จ์ด ์ฒจ๋ถ ๋๋ ๊ธฐ๋ก๋์๋๊ฐ?", f"์ด {info['total_participants']}๋ช
๋ช
๋จ ํ์ธ", "์ถฉ์กฑ (Pass)"),
|
| 869 |
+
("์ง์ข
๋ณ ์ญํ ๋ถ๋ด", "์์ค์ฅ, ๋ณต์ง์ฌ, ์์๋ณดํธ์ฌ ๋ฑ ๋ค์ง์ข
์ญํ ๋ถ๋ด์ด ๊ณํ์์ ์๋ฆฝ๋์๋๊ฐ?", "5๊ฐ ์ง์ข
์ญํ ์๋ฆฝ", "์ถฉ์กฑ (Pass)"),
|
| 870 |
+
("๋ํผ์ทจ์ฝ์ ์ง์๊ณํ", "ํ ์ฒด์ด, ๋ณดํ๋ณด์กฐ ํ์ ๋ฑ ๋ํผ์ทจ์ฝ์ ๊ฐ๋ณ ์ด๋์ง์ ๊ณํ์ด ์๋ฆฝ๋์๋๊ฐ?", f"๋ํผ์ทจ์ฝ์ {info['vulnerable_count']}๋ช
์ง์ ๊ณํ ๋ฐ์", "์ถฉ์กฑ (Pass)"),
|
| 871 |
+
("๋น์์ฐ๋ฝ์ฒด๊ณ", "์๋ฐฉ์, ๊ฒฝ์ฐฐ์, ํ๋ ฅ๋ณ์ ๋ฑ ์ ๊ด๊ธฐ๊ด ๋น์์ฐ๋ฝ์ฒด๊ณ๊ฐ ๊ตฌ์ฑ๋์๋๊ฐ?", f"{info['contact_checked']}", "์ถฉ์กฑ (Pass)"),
|
| 872 |
+
("๋ํผ๊ฒฝ๋ก", "ํผ๋๋์ ๋ฐ ๋น์ ๋ํผ๊ฒฝ๋ก๊ฐ ์ง์ ๋๊ณ ์ฌ์ ์ ํ์ธ๋์๋๊ฐ?", f"{info['route_checked']}", "์ถฉ์กฑ (Pass)"),
|
| 873 |
+
("์ํ๊ธฐ ์ฌ์ฉ ๋๋ ํ์ฌ๋์", "ํ๋ จ ๋ด์ฉ ์ค ์ํ์ค๋น ์์ฐ ๋๋ ํ์ฌ ๋ํผ ์ค๋ฌด๊ฐ ํฌํจ๋์๋๊ฐ?", f"{info['fire_ext_demo']}", "์ถฉ์กฑ (Pass)"),
|
| 874 |
+
("์ค์ ๋ํผํ๋ จ ์ค์ ์ฌ๋ถ", "๋ชจ์ ์ํฉ์ ๋ฐ๋ผ ์ ์์ด ์ค์ ๋ก ์ผ์ธ ๋ํผ ๋์ ์ผ๋ก ๋ํผ๋ฅผ ์ค์ํ๋๊ฐ?", "์ค์ ๋ํผํ๋ จ ์ค์", "์ถฉ์กฑ (Pass)"),
|
| 875 |
+
("์ฌ์ง ์ฒจ๋ถ๋", "ํ๋ จ ์ฅ๋ฉด์ ์ฆ๋ช
ํ ์ ์๋ ์ฌ์ง์ฒฉ ๋๋ ๋ถ์ฐฉ ๊ณต๊ฐ์ด ๋ง๋ จ๋์๋๊ฐ?", "์ฌ์ง ์ฒจ๋ถ ๊ณต๊ฐ ํ๋ณด", "์ถฉ์กฑ (Pass)"),
|
| 876 |
+
("๊ฐ์ ์กฐ์น", "ํ๋ จ ๊ณผ์ ์์ ๋
ธ์ถ๋ ๋ฌธ์ ์ ์ ๋ํด ๋ช
ํํ ๊ฐ์ ์กฐ์น๊ฐ ์๋ฆฝ๋์๋๊ฐ?", "๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ฐ์ ์กฐ์น ์๋ฆฝ", "์ถฉ์กฑ (Pass)"),
|
| 877 |
+
("๋ค์ ํ๋ จ ๋ฐ์์ฌํญ", "๊ธ๋ฒ ํ๋ จ ํ๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋ค์๋ฒ ํ๋ จ ๊ณํ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฐ์๋์๋๊ฐ?", "๋ค์ ํ๋ จ ๋ฐ์์ฌํญ ์๋ฆฝ", "์ถฉ์กฑ (Pass)"),
|
| 878 |
+
("๋ณดํธ์ ์ ํ ์๊ฒฌ ๋ฐ์๋", "ํ๋ จ ๊ฒฐ๊ณผ์ ๋ํด ๋ณดํธ์์ ์ ์ ํผ๋๋ฐฑ์ ๊ธฐ๋กํ๊ณ ์๋น์ค๊ณํ์ ๋ฐ์ํ์๋๊ฐ?", "๋ณดํธ์ ์๊ฒฌ ์๋ ด ์๋ฃ", "์ถฉ์กฑ (Pass)")
|
| 879 |
+
]
|
| 880 |
+
|
| 881 |
+
r_num = 7
|
| 882 |
+
for item, desc, status, compliance in checklist_items:
|
| 883 |
+
ws.row_dimensions[r_num].height = 24
|
| 884 |
+
ws.merge_cells(start_row=r_num, start_column=1, end_row=r_num, end_column=2)
|
| 885 |
+
ws.cell(row=r_num, column=1, value=item)
|
| 886 |
+
ws.merge_cells(start_row=r_num, start_column=3, end_row=r_num, end_column=5)
|
| 887 |
+
ws.cell(row=r_num, column=3, value=desc)
|
| 888 |
+
ws.merge_cells(start_row=r_num, start_column=6, end_row=r_num, end_column=7)
|
| 889 |
+
ws.cell(row=r_num, column=6, value=status)
|
| 890 |
+
ws.merge_cells(start_row=r_num, start_column=8, end_row=r_num, end_column=9)
|
| 891 |
+
ws.cell(row=r_num, column=8, value=compliance)
|
| 892 |
+
|
| 893 |
+
style_range(ws, f"A{r_num}:B{r_num}", fill=header_fill, font=label_font, alignment=align_center, border=thin_border)
|
| 894 |
+
style_range(ws, f"C{r_num}:E{r_num}", font=value_font, alignment=align_left, border=thin_border)
|
| 895 |
+
style_range(ws, f"F{r_num}:G{r_num}", font=value_font, alignment=align_center, border=thin_border)
|
| 896 |
+
|
| 897 |
+
pass_fill = PatternFill(start_color="E8F8F5", end_color="E8F8F5", fill_type="solid")
|
| 898 |
+
pass_font = Font(name="๋ง์ ๊ณ ๋", size=9.5, bold=True, color="0E6251")
|
| 899 |
+
style_range(ws, f"H{r_num}:I{r_num}", fill=pass_fill, font=pass_font, alignment=align_center, border=thin_border)
|
| 900 |
+
|
| 901 |
+
r_num += 1
|
| 902 |
+
|
| 903 |
+
# ---------------------------------------------------------
|
| 904 |
+
# Main Excel Workbook Generator
|
| 905 |
+
# ---------------------------------------------------------
|
| 906 |
+
def create_excel(info, training_type):
|
| 907 |
+
data = compile_document_data(info, training_type)
|
| 908 |
+
wb = openpyxl.Workbook()
|
| 909 |
+
|
| 910 |
+
# ---------------------------------------------------------
|
| 911 |
+
# TAB 1: ํ๋ จ ๊ณํ์ (Plan)
|
| 912 |
+
# ---------------------------------------------------------
|
| 913 |
+
ws_plan = wb.active
|
| 914 |
+
ws_plan.title = "ํ๋ จ ๊ณํ์"
|
| 915 |
+
|
| 916 |
+
col_widths = {
|
| 917 |
+
'A': 10, 'B': 10, 'C': 12, 'D': 12, 'E': 12, 'F': 12, 'G': 12, 'H': 14, 'I': 14
|
| 918 |
+
}
|
| 919 |
+
for col, width in col_widths.items():
|
| 920 |
+
ws_plan.column_dimensions[col].width = width
|
| 921 |
+
|
| 922 |
+
setup_page_print(ws_plan)
|
| 923 |
+
write_title_and_approval(ws_plan, f"{training_type} ๊ณํ์", data)
|
| 924 |
+
write_spacer(ws_plan, 3)
|
| 925 |
+
|
| 926 |
+
write_general_info_row(ws_plan, 4, "๊ธฐ๊ด๋ช
", data['facility_name'], "ํ๋ จ์ผ์", data['training_date'])
|
| 927 |
+
write_general_info_row(ws_plan, 5, "ํ๋ จ์๊ฐ", data['training_time'], "ํ๋ จ์ฅ์", data['training_location'])
|
| 928 |
+
write_general_info_row(ws_plan, 6, "ํ๋ จ์ ํ", f"{training_type} (๋ํผ์ค๋ฌด ํฌํจ)", "ํ๋ จ์ฃผ๊ด์", data['host'])
|
| 929 |
+
write_spacer(ws_plan, 7)
|
| 930 |
+
|
| 931 |
+
write_section_header(ws_plan, 8, "1. ํ๋ จ ์ฐธ์ฌ์ ๊ณํ ํํฉ")
|
| 932 |
+
write_plan_participants(ws_plan, 9, data)
|
| 933 |
+
write_spacer(ws_plan, 11)
|
| 934 |
+
|
| 935 |
+
write_plan_details(ws_plan, 12, data)
|
| 936 |
+
|
| 937 |
+
# ---------------------------------------------------------
|
| 938 |
+
# TAB 2: ํ๋ จ ๊ฒฐ๊ณผ๋ณด๊ณ ์ (Result Report)
|
| 939 |
+
# ---------------------------------------------------------
|
| 940 |
+
ws_report = wb.create_sheet(title="ํ๋ จ ๊ฒฐ๊ณผ๋ณด๊ณ ์")
|
| 941 |
+
for col, width in col_widths.items():
|
| 942 |
+
ws_report.column_dimensions[col].width = width
|
| 943 |
+
|
| 944 |
+
setup_page_print(ws_report)
|
| 945 |
+
write_title_and_approval(ws_report, f"{training_type} ๊ฒฐ๊ณผ๋ณด๊ณ ์ & ๊ฐ์ฌ ์๊ฒฌ์", data)
|
| 946 |
+
write_spacer(ws_report, 3)
|
| 947 |
+
|
| 948 |
+
write_general_info_row(ws_report, 4, "๊ธฐ๊ด๋ช
", data['facility_name'], "ํ๋ จ์ผ์", data['training_date'])
|
| 949 |
+
write_general_info_row(ws_report, 5, "ํ๋ จ์๊ฐ", data['training_time'], "ํ๋ จ์ฅ์", data['training_location'])
|
| 950 |
+
write_general_info_row(ws_report, 6, "ํ๋ จ์ ํ", f"{training_type} (์ค์ ํ๋ จ์๋ฃ)", "ํ๋ จ์ฃผ๊ด์", data['host'])
|
| 951 |
+
write_spacer(ws_report, 7)
|
| 952 |
+
|
| 953 |
+
# 1. ํ๋ จ ์ค์ ์ฐธ์ฌ ๋ฐ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ
|
| 954 |
+
write_section_header(ws_report, 8, "1. ํ๋ จ ์ค์ ์ฐธ์ฌ ๋ฐ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ")
|
| 955 |
+
curr_row = write_report_participants(ws_report, 9, data)
|
| 956 |
+
|
| 957 |
+
curr_row += 1
|
| 958 |
+
write_spacer(ws_report, curr_row)
|
| 959 |
+
curr_row += 1
|
| 960 |
+
|
| 961 |
+
# 2. ๋ค์ง์ข
๋ณ ํ๋ จ ํ๊ฐ ๋ฐ ํ์ ์๊ฒฌ
|
| 962 |
+
write_section_header(ws_report, curr_row, "2. ๋ค์ง์ข
๋ณ ํ๋ จ ํ๊ฐ ๋ฐ ํ์ ์๊ฒฌ")
|
| 963 |
+
curr_row += 1
|
| 964 |
+
|
| 965 |
+
curr_row = write_role_meeting_opinion(
|
| 966 |
+
ws_report, curr_row, "์์ค์ฅ",
|
| 967 |
+
f"- ํ๊ฐ ๋ฐ ์ด์์ ํ์ํ ์กฐ์น: {data['opinion_์์ค์ฅ_1']}",
|
| 968 |
+
f"- ๊ธฐ๊ด ์ฐจ์์ ์ง์: {data['opinion_์์ค์ฅ_2']}",
|
| 969 |
+
f"- ์ญํ : {data['opinion_์์ค์ฅ_role']}"
|
| 970 |
+
)
|
| 971 |
+
curr_row += 1
|
| 972 |
+
curr_row = write_role_meeting_opinion(
|
| 973 |
+
ws_report, curr_row, "์ฌํ๋ณต์ง์ฌ",
|
| 974 |
+
f"- ์ฌ๋ก๊ด๋ฆฌ ๊ด์ : {data['opinion_์ฌํ๋ณต์ง์ฌ_1']}",
|
| 975 |
+
f"- ์๋น์ค๊ณํ ๋ฐ์: {data['opinion_์ฌํ๋ณต์ง์ฌ_2']}",
|
| 976 |
+
f"- ์ญํ : {data['opinion_์ฌํ๋ณต์ง์ฌ_role']}"
|
| 977 |
+
)
|
| 978 |
+
curr_row += 1
|
| 979 |
+
curr_row = write_role_meeting_opinion(
|
| 980 |
+
ws_report, curr_row, "์์๋ณดํธ์ฌ",
|
| 981 |
+
f"- ์ผ์์ํ ๊ด์ฐฐ: {data['opinion_์์๋ณดํธ์ฌ_1']}",
|
| 982 |
+
f"- ๋๋ด ์ ๊ณต ์ ์ ์์ฌํญ: {data['opinion_์์๋ณดํธ์ฌ_2']}",
|
| 983 |
+
f"- ์ญํ : {data['opinion_์์๋ณดํธ์ฌ_role']}"
|
| 984 |
+
)
|
| 985 |
+
curr_row += 1
|
| 986 |
+
curr_row = write_role_meeting_opinion(
|
| 987 |
+
ws_report, curr_row, "๊ฐํธ์กฐ๋ฌด์ฌ",
|
| 988 |
+
f"- ๊ฑด๊ฐ์ํ ํ์ธ: {data['opinion_๊ฐํธ์กฐ๋ฌด์ฌ_1']}",
|
| 989 |
+
f"- ๋ณต์ฝยทํผ๋ถยท๊ฐ์ผ๊ด๋ฆฌ: {data['opinion_๊ฐํธ์กฐ๋ฌด์ฌ_2']}",
|
| 990 |
+
f"- ์ญํ : {data['opinion_๊ฐํธ์กฐ๋ฌด์ฌ_role']}"
|
| 991 |
+
)
|
| 992 |
+
curr_row += 1
|
| 993 |
+
curr_row = write_role_meeting_opinion(
|
| 994 |
+
ws_report, curr_row, "๋ฌผ๋ฆฌ์น๋ฃ์ฌ",
|
| 995 |
+
f"- ์ ์ฒด๊ธฐ๋ฅ ํ๊ฐ: {data['opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_1']}",
|
| 996 |
+
f"- ๋์์๋ฐฉ ๋ฐ ์ด๋๊ณํ: {data['opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_2']}",
|
| 997 |
+
f"- ์ญํ : {data['opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_role']}"
|
| 998 |
+
)
|
| 999 |
+
|
| 1000 |
+
curr_row += 1
|
| 1001 |
+
write_spacer(ws_report, curr_row)
|
| 1002 |
+
curr_row += 1
|
| 1003 |
+
|
| 1004 |
+
# 3. ํ๋ จ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ 2์ฐจ ๋ฐ์ (2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์)
|
| 1005 |
+
write_section_header(ws_report, curr_row, "3. ํ๋ จ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ 2์ฐจ ๋ฐ์ (2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์)")
|
| 1006 |
+
curr_row += 1
|
| 1007 |
+
|
| 1008 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "1์ฐจ ๋ฌธ์ ์ํ", data['result_problem'])
|
| 1009 |
+
curr_row += 1
|
| 1010 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "์ ์ฉํ ์กฐ์น", data['result_action'])
|
| 1011 |
+
curr_row += 1
|
| 1012 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "์ง์ข
๋ณ ์ํ๋ด์ฉ", data['result_role_actions'])
|
| 1013 |
+
curr_row += 1
|
| 1014 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "๋ณํ๋ ๊ฒฐ๊ณผ", data['result_outcome'])
|
| 1015 |
+
curr_row += 1
|
| 1016 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "๊ตฌ์ฒด์ ๋ฐ์ดํฐ", data['result_data'])
|
| 1017 |
+
curr_row += 1
|
| 1018 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "๋จ์ ์ํ์์ธ", data['result_risks'])
|
| 1019 |
+
curr_row += 1
|
| 1020 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "ํฅํ ๊ณํ", data['result_next'])
|
| 1021 |
+
curr_row += 1
|
| 1022 |
+
curr_row = write_secondary_result_row(ws_report, curr_row, "๋ณดํธ์ ์๊ฒฌ ๋ฐ์๋ด์ฉ", data['result_guardian'])
|
| 1023 |
+
|
| 1024 |
+
curr_row += 1
|
| 1025 |
+
write_spacer(ws_report, curr_row)
|
| 1026 |
+
curr_row += 1
|
| 1027 |
+
|
| 1028 |
+
# 4. ๋ณดํธ์ ์ ํ ์๊ฒฌ ๋ฐ์
|
| 1029 |
+
write_section_header(ws_report, curr_row, "4. ๋ณดํธ์ ์ ํ ์๊ฒฌ ๋ฐ์")
|
| 1030 |
+
curr_row += 1
|
| 1031 |
+
curr_row = write_guardian_feedback(ws_report, curr_row, data)
|
| 1032 |
+
|
| 1033 |
+
curr_row += 1
|
| 1034 |
+
write_spacer(ws_report, curr_row)
|
| 1035 |
+
curr_row += 1
|
| 1036 |
+
|
| 1037 |
+
# 5. ํ๋ จ ์ฌ์ง ์ฒจ๋ถ๋
|
| 1038 |
+
write_section_header(ws_report, curr_row, "5. ํ๋ จ ์ฌ์ง ์ฒจ๋ถ๋")
|
| 1039 |
+
curr_row += 1
|
| 1040 |
+
curr_row = write_photo_section(ws_report, curr_row)
|
| 1041 |
+
|
| 1042 |
+
# ---------------------------------------------------------
|
| 1043 |
+
# TAB 3: ํ๊ฐ๋๋ฝ ์ฒดํฌ๋ฆฌ์คํธ (Checklist)
|
| 1044 |
+
# ---------------------------------------------------------
|
| 1045 |
+
ws_checklist = wb.create_sheet(title="ํ๊ฐ๋๋ฝ ์ฒดํฌ๋ฆฌ์คํธ")
|
| 1046 |
+
write_checklist_tab(ws_checklist, data)
|
| 1047 |
+
|
| 1048 |
+
excel_stream = io.BytesIO()
|
| 1049 |
+
wb.save(excel_stream)
|
| 1050 |
+
excel_stream.seek(0)
|
| 1051 |
+
return excel_stream
|
| 1052 |
+
|
| 1053 |
+
# ---------------------------------------------------------
|
| 1054 |
+
# Streamlit Application User Interface
|
| 1055 |
+
# ---------------------------------------------------------
|
| 1056 |
+
def main():
|
| 1057 |
+
st.markdown('<div class="title-card"><h1>๐ ์ฅ๊ธฐ์์๊ธฐ๊ด ํ๊ฐ ๋์ ํ๋ จ ๋ฌธ์ ์๋์์ฑ๊ธฐ</h1><p>๋ค์ง์ข
๊ฐ์ฌ ์์ด์ ํธ์ ์ง์นจ์ 100% ๋ฐ์ํ์ฌ, ์ค์ ํ์ฅ ๋ฐ ํ๊ฐ ๋์์ด ๊ฐ๋ฅํ ์์ค์ ํ๋ จ ๋ฌธ์๋ฅผ ์ค๊ณํฉ๋๋ค.</p></div>', unsafe_allow_html=True)
|
| 1058 |
+
|
| 1059 |
+
col_left, col_right = st.columns([1, 2.2])
|
| 1060 |
+
|
| 1061 |
+
with col_left:
|
| 1062 |
+
st.markdown('<div class="section-header">๐ข ๊ธฐ๊ด ๊ธฐ๋ณธ ์ ๋ณด</div>', unsafe_allow_html=True)
|
| 1063 |
+
facility_name = st.text_input("๊ธฐ๊ด๋ช
", value="ํ๋ณต์์์")
|
| 1064 |
+
facility_head = st.text_input("์์ค์ฅ๋ช
", value="ํ๊ธธ๋")
|
| 1065 |
+
writer = st.text_input("๋ด๋น์ (์์ฑ์) ๋ช
", value="๊น๋ณต์ง")
|
| 1066 |
+
training_date = st.date_input("ํ๋ จ/๊ต์ก ์ผ์", value=datetime.today())
|
| 1067 |
+
training_time = st.text_input("ํ๋ จ/๊ต์ก ์๊ฐ", value="14:00 ~ 15:00")
|
| 1068 |
+
training_location = st.text_input("ํ๋ จ/๊ต์ก ์ฅ์", value="์์์ ์ ์ธต ๋ฐ ์ผ์ธ ๋ํผ๊ด์ฅ")
|
| 1069 |
+
|
| 1070 |
+
st.markdown('<div class="section-header">โ๏ธ ํ๋ จ ๋ฐ ๊ต์ก ์ค์ </div>', unsafe_allow_html=True)
|
| 1071 |
+
training_type = st.selectbox("ํ๋ จ/๊ต์ก ์ ํ", ["์๋ฐฉํ๋ จ", "์ฌ๋ํ๋ จ", "์์ ๊ต์ก"])
|
| 1072 |
+
host = st.text_input("ํ๋ จ ์ฃผ๊ด์", value=f"์์ค์ฅ {facility_head}")
|
| 1073 |
+
|
| 1074 |
+
with col_right:
|
| 1075 |
+
tab_inputs, tab_guardian, tab_preview = st.tabs(["๐ ์์ธ ์ ๋์ ๋ฐ์ดํฐ", "๐ ๋ณดํธ์ ์๊ฒฌ ๋ฐ์", "๐๏ธ ์ ๋ฌธ์ฑ๊ฐํ ๊ฐ์ฌ ๋ฌธ์ฅ ์ค์๊ฐ ํ๋ฆฌ๋ทฐ"])
|
| 1076 |
+
|
| 1077 |
+
with tab_inputs:
|
| 1078 |
+
st.markdown("##### ํ๋ จ ์ฐธ์ฌ ์ ๋ ๋ฐ์ดํฐ")
|
| 1079 |
+
col1, col2, col3 = st.columns(3)
|
| 1080 |
+
with col1:
|
| 1081 |
+
staff_participants = st.number_input("์ข
์ฌ์ ์ฐธ์ฌ์ ์ (๋ช
)", value=8, min_value=1)
|
| 1082 |
+
vulnerable_count = st.number_input("๋ํผ์ทจ์ฝ์ ์ (๋ช
)", value=5, min_value=0)
|
| 1083 |
+
with col2:
|
| 1084 |
+
recipient_participants = st.number_input("์๊ธ์ ์ฐธ์ฌ์ ์ (๋ช
)", value=12, min_value=1)
|
| 1085 |
+
wheelchair_count = st.number_input("ํ ์ฒด์ด ์ฌ์ฉ ๋์์ ์ (๋ช
)", value=3, min_value=0)
|
| 1086 |
+
with col3:
|
| 1087 |
+
total_participants = staff_participants + recipient_participants
|
| 1088 |
+
st.metric("์ด ์ฐธ์ฌ ์ธ์ (์ข
์ฌ์ + ์๊ธ์)", f"{total_participants} ๋ช
")
|
| 1089 |
+
walk_aid_count = st.number_input("๋ณดํ๋ณด์กฐ ํ์์ ์ (๋ช
)", value=4, min_value=0)
|
| 1090 |
+
|
| 1091 |
+
st.markdown("##### ํ๋ จ ๊ด๋ จ ํ์ธ/์ ๊ฒ ์งํ")
|
| 1092 |
+
col4, col5 = st.columns(2)
|
| 1093 |
+
with col4:
|
| 1094 |
+
evac_time = st.text_input("๋ํผ์๋ฃ ์๊ฐ", value="4๋ถ 30์ด")
|
| 1095 |
+
route_checked = st.selectbox("๋ํผ๊ฒฝ๋ก ํ์ธ ์ฌ๋ถ", ["ํ์ธ์๋ฃ", "๋ฏธํ์ธ"])
|
| 1096 |
+
contact_checked = st.selectbox("๋น์์ฐ๋ฝ๋ง ์๋ ์ฌ๋ถ", ["์๋ํ์ธ", "๋ฏธํ์ธ"])
|
| 1097 |
+
with col5:
|
| 1098 |
+
emergency_mock = st.selectbox("์๊ธ์ํฉ ๋ชจ์๋์ ์ฌ๋ถ", ["์ค์ ๋ฐ ์ํธ", "๋ฏธ์ค์"])
|
| 1099 |
+
fire_ext_demo = st.selectbox("์ํ๊ธฐ ์ฌ์ฉ ์์ฐ ์ฌ๋ถ", ["์ค์ ๋ฐ ์ํธ", "๋ฏธ์ค์"])
|
| 1100 |
+
|
| 1101 |
+
with tab_guardian:
|
| 1102 |
+
st.markdown("##### ํ๋ จ ํ ๋ณดํธ์ ์ ์ ํผ๋๋ฐฑ ์๋ ด (์ฌํ ์๊ฒฌ ๋ฐ์)")
|
| 1103 |
+
col_date, col_reflected = st.columns(2)
|
| 1104 |
+
with col_date:
|
| 1105 |
+
guardian_call_date = st.date_input("๋ณดํธ์ ์ ์ ์ฐ๋ฝ ์ผ์", value=datetime.today())
|
| 1106 |
+
with col_reflected:
|
| 1107 |
+
guardian_reflected = st.selectbox("์์ ๊ด๋ฆฌ/์๋น์ค๊ณํ ๋ฐ์ ์ฌ๋ถ", [
|
| 1108 |
+
"๋ฐ์์๋ฃ (์๋น์ค๊ณํ ๋ฐ ์์ ๊ด๋ฆฌ๊ณํ ๋ฐ์)",
|
| 1109 |
+
"๋ฐ์์๋ฃ (๋ณดํธ์ ์๋ด ๋ฐ ์ฐ๋ฝ๋ง ์ต์ ํ)",
|
| 1110 |
+
"๋ฏธ๋ฐ์"
|
| 1111 |
+
])
|
| 1112 |
+
|
| 1113 |
+
guardian_opinion = st.text_area(
|
| 1114 |
+
"๋ณดํธ์ ํตํ ์๊ฒฌ",
|
| 1115 |
+
value="ํ๋ จ ์ ๊ฑฐ๋์ด ๋ถํธํ ์ด๋ฅด์ ๋ค์ด ๋์ํ์ง ์๋๋ก ํน๋ณํ ์ ๊ฒฝ ์จ ์ฃผ์
จ์ผ๋ฉด ์ข๊ฒ ๊ณ , ๋น์์ ์ฐ๋ฝ์ด ์ ๋ฟ์ ์ ์๊ฒ ๋น์ ์ฐ๋ฝ๋ง ๊ด๋ฆฌ๋ฅผ ์ฒ ์ ํ ํด๋ฌ๋ผ๊ณ ์์ฒญํ์
จ์ต๋๋ค."
|
| 1116 |
+
)
|
| 1117 |
+
guardian_response = st.text_area(
|
| 1118 |
+
"๊ธฐ๊ด ์ค๋ช
๋ฐ ๋์ฑ
๋ด์ฉ",
|
| 1119 |
+
value="ํ๋ จ ์ ๋ํผ์ทจ์ฝ์๋ก ๋ถ๋ฅํ์ฌ ์์๋ณดํธ์ฌ๋ฅผ 1:1 ๋งค์นญํ์ฌ ์ด๋์ ์ง์ํ ๊ณํ์์ ์ค๋ช
ํ์์ผ๋ฉฐ, ๋ณดํธ์ ๋น์์ฐ๋ฝ์ฒ ์ต์ ํ๋ฅผ ๋ง์ณค๊ณ ํ๋ จ ์งํ ๊ฒฐ๊ณผ๋ฅผ ์๋ดํ ์์ ์์ ์ค๋ช
ํจ."
|
| 1120 |
+
)
|
| 1121 |
+
|
| 1122 |
+
with tab_preview:
|
| 1123 |
+
preview_info = {
|
| 1124 |
+
'facility_name': facility_name,
|
| 1125 |
+
'total_participants': total_participants,
|
| 1126 |
+
'staff_participants': staff_participants,
|
| 1127 |
+
'recipient_participants': recipient_participants,
|
| 1128 |
+
'evac_time': evac_time,
|
| 1129 |
+
'vulnerable_count': vulnerable_count,
|
| 1130 |
+
'wheelchair_count': wheelchair_count,
|
| 1131 |
+
'walk_aid_count': walk_aid_count,
|
| 1132 |
+
'emergency_mock': emergency_mock,
|
| 1133 |
+
'fire_ext_demo': fire_ext_demo,
|
| 1134 |
+
'route_checked': route_checked,
|
| 1135 |
+
'contact_checked': contact_checked,
|
| 1136 |
+
'guardian_call_date': str(guardian_call_date),
|
| 1137 |
+
'guardian_reflected': guardian_reflected
|
| 1138 |
+
}
|
| 1139 |
+
|
| 1140 |
+
st.markdown(f"### ๐ {training_type} ๋ค์ง์ข
๊ฐ์ฌ ์๊ฒฌ์ ๋ฐ 2์ฐจ ๊ฒฐ๊ณผ ํ๋ฆฌ๋ทฐ")
|
| 1141 |
+
|
| 1142 |
+
st.markdown("#### [๋ค์ง์ข
ํ์ ์๊ฒฌ]")
|
| 1143 |
+
roles_list = ['์์ค์ฅ', '์ฌํ๋ณต์ง์ฌ', '์์๋ณดํธ์ฌ', '๊ฐํธ์กฐ๋ฌด์ฌ', '๋ฌผ๋ฆฌ์น๋ฃ์ฌ']
|
| 1144 |
+
for r in roles_list:
|
| 1145 |
+
st.markdown(f"**๐น {r} ์๊ฒฌ**")
|
| 1146 |
+
if r == '์์ค์ฅ':
|
| 1147 |
+
st.write(f"- ํ๊ฐ ๋ฐ ์ด์์ ํ์ํ ์กฐ์น: {generate_narrative_text(preview_info, 'opinion_์์ค์ฅ_1', training_type)}")
|
| 1148 |
+
st.write(f"- ๊ธฐ๊ด ์ฐจ์์ ์ง์: {generate_narrative_text(preview_info, 'opinion_์์ค์ฅ_2', training_type)}")
|
| 1149 |
+
elif r == '์ฌํ๋ณต์ง์ฌ':
|
| 1150 |
+
st.write(f"- ์ฌ๋ก๊ด๋ฆฌ ๊ด์ : {generate_narrative_text(preview_info, 'opinion_์ฌํ๋ณต์ง์ฌ_1', training_type)}")
|
| 1151 |
+
st.write(f"- ์๋น์ค๊ณํ ๋ฐ์: {generate_narrative_text(preview_info, 'opinion_์ฌํ๋ณต์ง์ฌ_2', training_type)}")
|
| 1152 |
+
elif r == '์์๋ณดํธ์ฌ':
|
| 1153 |
+
st.write(f"- ์ผ์์ํ ๊ด์ฐฐ: {generate_narrative_text(preview_info, 'opinion_์์๋ณดํธ์ฌ_1', training_type)}")
|
| 1154 |
+
st.write(f"- ๋๋ด ์ ๊ณต ์ ์ ์์ฌํญ: {generate_narrative_text(preview_info, 'opinion_์์๋ณดํธ์ฌ_2', training_type)}")
|
| 1155 |
+
elif r == '๊ฐํธ์กฐ๋ฌด์ฌ':
|
| 1156 |
+
st.write(f"- ๊ฑด๊ฐ์ํ ํ์ธ: {generate_narrative_text(preview_info, 'opinion_๊ฐํธ์กฐ๋ฌด์ฌ_1', training_type)}")
|
| 1157 |
+
st.write(f"- ๋ณต์ฝยทํผ๋ถยท๊ฐ์ผ๊ด๋ฆฌ: {generate_narrative_text(preview_info, 'opinion_๊ฐํธ์กฐ๋ฌด์ฌ_2', training_type)}")
|
| 1158 |
+
elif r == '๋ฌผ๋ฆฌ์น๋ฃ์ฌ':
|
| 1159 |
+
st.write(f"- ์ ์ฒด๊ธฐ๋ฅ ํ๊ฐ: {generate_narrative_text(preview_info, 'opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_1', training_type)}")
|
| 1160 |
+
st.write(f"- ๋์์๋ฐฉ ๋ฐ ์ด๋๊ณํ: {generate_narrative_text(preview_info, 'opinion_๋ฌผ๋ฆฌ์น๋ฃ์ฌ_2', training_type)}")
|
| 1161 |
+
st.write(f"- ์ญํ : {generate_narrative_text(preview_info, f'opinion_{r}_role', training_type)}")
|
| 1162 |
+
|
| 1163 |
+
st.markdown("#### [2์ฐจ ๊ฒฐ๊ณผ ๋ฐ์]")
|
| 1164 |
+
st.write(f"**1์ฐจ ๋ฌธ์ ์ํ**: {generate_narrative_text(preview_info, 'result_problem', training_type)}")
|
| 1165 |
+
st.write(f"**์ ์ฉํ ์กฐ์น**: {generate_narrative_text(preview_info, 'result_action', training_type)}")
|
| 1166 |
+
st.write(f"**์ง์ข
๋ณ ์ํ๋ด์ฉ**: {generate_narrative_text(preview_info, 'result_role_actions', training_type)}")
|
| 1167 |
+
st.write(f"**๋ณํ๋ ๊ฒฐ๊ณผ**: {generate_narrative_text(preview_info, 'result_outcome', training_type)}")
|
| 1168 |
+
st.write(f"**๊ตฌ์ฒด์ ๋ฐ์ดํฐ**: {generate_narrative_text(preview_info, 'result_data', training_type)}")
|
| 1169 |
+
st.write(f"**๋จ์ ์ํ์์ธ**: {generate_narrative_text(preview_info, 'result_risks', training_type)}")
|
| 1170 |
+
st.write(f"**ํฅํ ๊ณํ**: {generate_narrative_text(preview_info, 'result_next', training_type)}")
|
| 1171 |
+
st.write(f"**๋ณดํธ์ ์๊ฒฌ ๋ฐ์๋ด์ฉ**: {generate_narrative_text(preview_info, 'result_guardian', training_type)}")
|
| 1172 |
+
|
| 1173 |
+
st.markdown('<div style="margin-top: 2rem;"></div>', unsafe_allow_html=True)
|
| 1174 |
+
|
| 1175 |
+
info_payload = {
|
| 1176 |
+
'facility_name': facility_name,
|
| 1177 |
+
'facility_head': facility_head,
|
| 1178 |
+
'writer': writer,
|
| 1179 |
+
'training_date': training_date,
|
| 1180 |
+
'training_time': training_time,
|
| 1181 |
+
'training_location': training_location,
|
| 1182 |
+
'host': host,
|
| 1183 |
+
'total_participants': total_participants,
|
| 1184 |
+
'staff_participants': staff_participants,
|
| 1185 |
+
'recipient_participants': recipient_participants,
|
| 1186 |
+
'evac_time': evac_time,
|
| 1187 |
+
'vulnerable_count': vulnerable_count,
|
| 1188 |
+
'wheelchair_count': wheelchair_count,
|
| 1189 |
+
'walk_aid_count': walk_aid_count,
|
| 1190 |
+
'emergency_mock': emergency_mock,
|
| 1191 |
+
'fire_ext_demo': fire_ext_demo,
|
| 1192 |
+
'route_checked': route_checked,
|
| 1193 |
+
'contact_checked': contact_checked,
|
| 1194 |
+
'guardian_call_date': guardian_call_date,
|
| 1195 |
+
'guardian_opinion': guardian_opinion,
|
| 1196 |
+
'guardian_response': guardian_response,
|
| 1197 |
+
'guardian_reflected': guardian_reflected,
|
| 1198 |
+
}
|
| 1199 |
+
|
| 1200 |
+
excel_file = create_excel(info_payload, training_type)
|
| 1201 |
+
filename = f"{facility_name}_{training_date.strftime('%Y%m%d')}_{training_type}_๋ค์ง์ข
ํ๊ฐ๋์_ํตํฉ๋ฌธ์.xlsx"
|
| 1202 |
+
|
| 1203 |
+
st.download_button(
|
| 1204 |
+
label=f"๐ฅ {training_type} ๊ณํ์/๊ฒฐ๊ณผ๋ณด๊ณ ์ ์์
๋ค์ด๋ก๋ (๊ฐ์ฌ ๋ฐ์๋ณธ)",
|
| 1205 |
+
data=excel_file,
|
| 1206 |
+
file_name=filename,
|
| 1207 |
+
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
| 1208 |
+
)
|
| 1209 |
+
|
| 1210 |
+
if __name__ == "__main__":
|
| 1211 |
+
main()
|