o
    Wi                 ]   @   s  d dl mZmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlZd dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlZd dl m!Z! ej"ej#dd e Z$e$j%edgddgdgd ej&'ddZ(ej&'ddZ)ej&'ddZ*ej&'ddZ+ddddddZ,dZ-de- d Z.de- d Z/dd  Z0e$j1d!ee/d"d#d$ e$j1e-d% ee.d"d&d$ G d'd( d(eZ2e$j'd)ed*d+d, Z3G d-d. d.eZ4G d/d0 d0eZ5e$6e-d1 d2e2fd3d4Z7e$6e-d5 d2e4fd6d7Z8d8e9fd9d:Z:e$6e-d; ed<ededededededededededededededededededfd=e9d>e	e9 d?e	e9 d@e	e9 dAe	e9 dBe	e9 dCe	e9 dDe	e9 dEe	e9 dFe	e9 dGe	e9 dHe	e9 dIe	e9 dJe	e9 dKe	e9 dLe	e9 dMee dNee9 dOe	e9 f&dPdQZ;e$6e-dR ed<ededededededededededededededededededededededededededededfd8e9dSe	e9 dTe	e9 dUe	e9 dVe	e9 dWe	e9 dXe	e9 dYe	e9 dZe	e9 d[e	e9 d\e	e9 d]e	e9 d^e	e9 d_e	e9 d`e	e9 dae	e9 dbe	e9 dce	e9 dde	e9 dee	e9 dfe	e9 dge	e9 dhe	e9 die	e9 dje	e9 dke	e9 dle	e9 dme	e9 dne	e9 f:dodpZ<e$6e-dq ed<ededededededededededededededededededededededededededededfd8e9dSe	e9 dTe	e9 dUe	e9 dVe	e9 dWe	e9 dXe	e9 dYe	e9 dZe	e9 d[e	e9 d\e	e9 d]e	e9 d^e	e9 d_e	e9 d`e	e9 dae	e9 dbe	e9 dce	e9 dde	e9 dee	e9 dfe	e9 dge	e9 dhe	e9 die	e9 dje	e9 dke	e9 dle	e9 dme	e9 dne	e9 f:drdsZ=e$6e-dt ed<ededededededfd8e9due	e9 dve	e9 dwe	e9 dxe	e9 dBe	e9 dye	e9 fdzd{Z>e$6e-d| ed<edededededededededededededededededededededededfd8e9d}e	e9 d~e	e9 de	e9 de	e9 de	e9 d@e	e9 dAe	e9 de	e9 dBe	e9 dCe	e9 de	e9 de	e9 de	e9 dOe	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 f0ddZ?e$6e-d ed<ededededededededededededededededededededededededededededededededededededededededededededf-d8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 fZddZ@e$6e-d ed<edeg eg fd8e9de	e9 dMee dNee9 fddÄZAe$6e-d ed<ededededededededededededededededededededededededfd8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 f2ddƄZBe$6e-d ed<edededededededededededededededfd8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 f dd؄ZCe$6e-d ed<ed<edfd8e9dOe9de	e9 fdd܄ZDe$6e-d ed<edededededededededededededededededededfd8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 dOe	e9 dMee dNee9 de	e9 de	eE f(ddZFe$6e-d ed<edededededededededededededededededededfd8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 dOe	e9 dMee dNee9 de	e9 de	eE f(ddZGe$6e-d ed<ededededededededededededededededededfd8e9de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 de	e9 dOe	e9 dMee dNee9 de	e9 f&ddZHG dd deZIe$j'e-d eeI ddd ZJG dd deZIe$j'e-d eeI ddd ZKe$'e-d dd ZLd dlMZMdd ZNde9d8e9deOfddZPe$'e-d d8e9fd dZQe$'e-d d8e9fddZRe$'e-d d8e9fddZSe$'e-d d8e9fd	d
ZTe$'e-d d8e9fddZUe$'e-d d8e9fddZVe$'e-d d8e9fddZWe$6e-d ed<d=dedededededededededededededededededfd=e9d>e	e9 d?e	e9 d@e	e9 dAe	e9 dBe	e9 dCe	e9 dDe	e9 dEe	e9 dFe	e9 dGe	e9 dHe	e9 dIe	e9 dJe	e9 dKe	e9 dLe	e9 dOe	e9 dMee f$ddZXe$6e-d ed<fd8e9fddZYde9d8e9deOfddZPe$'e-d dd ZZe$'e-d d8e9fd d!Z[e$'e-d" d8e9fd#d$Z\e$'e-d% d8e9fd&d'Z]e$'e-d( d8e9fd)d*Z^e$'e-d+ d8e9fd,d-Z_e$'e-d. d8e9fd/d0Z`e$'e-d1 d8e9fd2d3Zae$'e-d4 d8e9fd5d6Zbe$'e-d7 d8e9fd8d9Zcd8e9d:e9fd;d<Zde$'e-d= d8e9fd>d?Zee$'e-d@ d8e9fdAdBZfe$'e-dC d8e9fdDdEZge$'e-dF dGdH Zhe$'e-dI d8e9fdJdKZie$6e-dL d2e5fdMdNZje$6e-dO d2e5fdPdQZke$6e-dR ed<fd8e9fdSdTZldS (U      )FastAPIHTTPExceptionFile
UploadFileForm)	BaseModel)OptionalDictListN)Image)Font)CORSMiddleware)datetime)StaticFiles)HTMLResponseJSONResponse)RotatingFileHandlerz)%(asctime)s - %(levelname)s - %(message)s)levelformat*T)allow_originsallow_credentialsallow_methodsallow_headersDB_HOST	localhostDB_USERz
sos-testerDB_PASSWORDzPassWord12!!DB_NAMEsos_pdfi  )hostuserpassworddatabaseportz/sos-pdfz	/home/air	/uploads/z/templates/c                   C   s   t jjttttdS )N)r    r!   r"   r#   )mysql	connectorconnectr   r   r   r    r)   r)   (/home/air/sos-pdf/back/save_all_times.pyget_db_connection;   s   r+   z/reports)	directoryreports)namez/uploadsuploadsc                   @      e Zd ZU eed< eed< dS )LoginRequestcodecallNameN__name__
__module____qualname__str__annotations__r)   r)   r)   r*   r1   N      
 r1   /)response_classc                     sp   t jt jtd} t j| stdddt| ddd}t|	 dW  d    S 1 s1w   Y  d S )	Nz
index.html  zindex.html not foundstatus_codedetailrzutf-8)encodingcontent)
ospathjoindirname__file__existsr   openr   read)
index_pathfr)   r)   r*   serve_indexS   s   $rO   c                   @   s   e Zd ZU eed< dS )NextNoRequestprefixNr4   r)   r)   r)   r*   rP   ^   s   
 rP   c                   @   r0   )AdminLoginRequestidr"   Nr4   r)   r)   r)   r*   rR   a   r:   rR   z
/api/loginreqc              
   C   sf  | j  }| j }|r|stdddddS d }zzRtjjdi t}|jdd}d}|	|||f |
 }|rVd|d	 |d
 dW W |rT| rU|  |  S S S dddW W |rk| rl|  |  S S S  tjjy } z'td|  tdddddW  Y d }~W |r| r|  |  S S S d }~ww |r| r|  |  w w w )Ni  Fu9   隊コードと呼出名称を入力してください。successmessager?   rD   T
dictionaryz[SELECT team_name, abbreviation FROM ambulance_teams WHERE team_code = %s AND call_name = %s	team_nameabbreviation)rV   teamNamer\   u<   隊コードまたは呼出名称が間違っています。zDatabase Error:   u3   データベースエラーが発生しました。r)   )r2   stripr3   r   r&   r'   r(   	DB_CONFIGcursorexecutefetchoneis_connectedcloseErrorprint)rT   
input_codeinput_call_nameconnra   queryr!   errr)   r)   r*   loginf   sX   







rm   z/api/get_next_noc              
   C   s`  | j }d }zzctjjdi t}|jdd}d}||| df | }d}t|}|D ] }|d }	t|	|krN|	|d  }
|
	 rNt
|
}||krN|}q.|d }d|dW W |rh| ri|  |  S S S  tjjy } z'td	|  td
ddddW  Y d }~W |r| r|  |  S S S d }~ww |r| r|  |  w w w )NTrY   z'SELECT No FROM patient WHERE No LIKE %s%r   No   )rV   next_no
DB Error: r^   FzDB ErrorrU   rX   r)   )rQ   r&   r'   r(   r`   ra   rb   fetchalllenisdigitintrd   re   rf   rg   r   )rT   rQ   rj   ra   rk   rowsmax_no
prefix_lenrowpidsuffixnorq   rl   r)   r)   r*   get_next_no   sL   


r~   
patient_noc           	      C   s   |  d|f |  rdS td|  td}t|}|d}g d}||	  }|  d|||f g d}|D ]}|  d	| d
|f q=|  d|f |  d|||f dS )u   
    DB에 해당 patient_no가 존재하는지 확인하고,
    없다면 patient 테이블 및 모든 관련 테이블에 초기 행(placeholder)을 생성합니다.
    $SELECT No FROM patient WHERE No = %sNz/Auto-initiating record for missing patient_no: 
Asia/Tokyo%Y-%m-%d %H:%M:%Su   月u   火u   水u   木u   金u   土u   日zDINSERT INTO patient (No, date_time, day_of_week) VALUES (%s, %s, %s))timecall_receivedprimary_triagesecondary_triage_1secondary_triage_2secondary_triage_3contact_time_Tmemobefore_arrivalreporttransfer_statesick_and_wounded_listINSERT INTO  (patient_no) VALUES (%s)FINSERT INTO patient_info (patient_no, urgency_level) VALUES (%s, NULL)u]   INSERT INTO list (patient_no, date_time, day_of_week, name2) VALUES (%s, %s, %s, '未入力'))
rb   rc   logginginfopytztimezoner   nowstrftimeweekday)	ra   r   jstnow_jstdate_time_strweekdaysday_of_weekplaceholder_tablestabler)   r)   r*   ensure_patient_record_exists   s   


r   z/api/save_patient.ro   name1name2agegenderaddressphone_numbermonthdayam_pmtime_htime_mtriage_officer_name1triage_officer_name2transport_agency_namereceiving_hospital_nameimagesexisting_imagesurgency_levelc           ,         sB  t d|   t }| }zz[g }|r"|dd |D  |rqtjtdd |D ]C}|jrpt	
  tj|jd  }tjt|}t|d}t|j| W d    n1 s_w   Y  t d| }|| q-|rxd	|nd }td
}t|}|d}g d}||  } |r| r|nd}!|d| f | }"|"st d|   d}#| ||!||||||||	|
||||||| f}$||#|$ g d}%|%D ]}&|d|& d| f q|d| |f |d| || |!f n6t d|   d}'||!|||||||	|
||||||| f}(||'|( |d|!| f |r,|d|| f |d urCd})||)|| f t d|   d}*||*||!||| f t d|   |  dd|  d d!W W |  |  S  ty }+ z|   t j!d"|  d#|+ dd$ t"d%d&t#|+ d'd }+~+ww |  |  w )(Nz+Attempting to save/update patient with No: c                 S      g | ]
}|  r|  qS r)   r_   .0rF   r)   r)   r*   
<listcomp>
      z save_patient.<locals>.<listcomp>Texist_okrp   wbr%   ,r   r   r   	   未入力r   zInsert NEW patient record: aD  
                INSERT INTO patient (
                    No, name1, name2, age, gender, img, address, phone_number,
                    month, day, am_pm, time_h, time_m,
                    triage_officer_name1, triage_officer_name2,
                    transport_agency_name, receiving_hospital_name,
                    date_time, day_of_week
                ) VALUES (
                    %s, %s, %s, %s, %s, %s, %s, %s,
                    %s, %s, %s, %s, %s,
                    %s, %s,
                    %s, %s,
                    %s, %s
                )
            )r   r   r   r   r   r   r   r   r   r   r   r   r   DINSERT INTO patient_info (patient_no, urgency_level) VALUES (%s, %s)TINSERT INTO list (patient_no, date_time, day_of_week, name2) VALUES (%s, %s, %s, %s)z Update EXISTING patient record: a  
                UPDATE patient SET 
                    name1=%s, name2=%s, age=%s, gender=%s, address=%s, phone_number=%s,
                    month=%s, day=%s, am_pm=%s, time_h=%s, time_m=%s,
                    triage_officer_name1=%s, triage_officer_name2=%s,
                    transport_agency_name=%s, receiving_hospital_name=%s,
                    img=%s
                WHERE No = %s
            0UPDATE list SET name2 = %s WHERE patient_no = %sz@UPDATE patient_info SET urgency_level = %s WHERE patient_no = %sz;UPDATE call_received SET address = %s WHERE patient_no = %sz(Synced address to call_received for No: z
            UPDATE patient_info 
            SET patient_name1 = %s, patient_name2 = %s, gender = %s, phone_number = %s
            WHERE patient_no = %s
        z3Synced name, gender, phone to patient_info for No: rV   z$Patient data saved successfully (No=)statusrW   z!Error saving patient data for No : exc_infor^   Database error: r>   )$r   r   r+   ra   extendrE   makedirs
UPLOAD_DIRfilenameuuiduuid4rF   splitextrG   rK   shutilcopyfileobjfilePREFIXappendr   r   r   r   r   r   r_   rb   rc   commitre   	Exceptionrollbackerrorr   r8   ),ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   cnxra   final_pathsimgunique_filenamefull_save_pathbufferweb_urlcombined_img_stringr   r   r   r   r   effective_name2record_existsinsert_queryinsert_paramsr   r   update_queryupdate_paramssync_cr_querysync_pi_queryer)   r)   r*   save_patient   s   










r   z/api/initiate_record_from_timecall_received_hcall_received_m
dispatch_h
dispatch_marrival_on_scene_harrival_on_scene_mpatient_contact_hpatient_contact_mtransport_start_htransport_start_mpatient_loaded_hpatient_loaded_mdepart_scene_hdepart_scene_marrival_hospital_harrival_hospital_mhandover_to_doctor_hhandover_to_doctor_mreturn_from_site_hreturn_from_site_mreturn_to_station_hreturn_to_station_mtransfer1_htransfer1_mtransfer2_htransfer2_mdispatch_locationdoctor_car_detailc           0         s  t d|   dtt dtt fdd}t }| }z1z|d| f | r9t d|   t	dd	d
t
d} t| }!|!d}"g d}#|#|!  }$d}%| |"|$f}&||%|& t d|   d}'| |"|$f}(||'|( t d|   d})| ||||||||||||||||||	||
||||||||||||||||||||||||||||||||||||f}*||)|* t d|   g d}+|+D ]},|d|, d| f qd}-||-| f t d|  d |  dddW W |  |  S  t	y* }. z|.d }.~.w tyO }/ z|  t jd|  d|/ dd  t	d!t|/d
d }/~/ww |  |  w )"Nz9Attempting to initiate time-based record for patient_no: valreturnc                 S   s   | dkrd S | S )N r)   )r  r)   r)   r*   to_db  s   z(initiate_record_from_time.<locals>.to_dbr   z8Attempted to create a record with duplicate patient_no: i  uZ   この番号は既に使用されています。別の番号を入力してください。r>   r   r   r   zs
            INSERT INTO patient (No, date_time, day_of_week, name2)
            VALUES (%s, %s, %s, NULL)
        z-Inserted new minimal patient record with No: zVINSERT INTO list (patient_no, date_time, day_of_week, name2) VALUES (%s, %s, %s, NULL)z.Added summary to 'list' table for patient_no: a]  
            INSERT INTO time (
                patient_no, call_received_h, call_received_m, dispatch_h, dispatch_m,
                arrival_on_scene_h, arrival_on_scene_m, patient_contact_h, patient_contact_m,
                transport_start_h, transport_start_m, patient_loaded_h, patient_loaded_m,
                depart_scene_h, depart_scene_m, arrival_hospital_h, arrival_hospital_m,
                handover_to_doctor_h, handover_to_doctor_m, return_from_site_h, return_from_site_m,
                return_to_station_h, return_to_station_m, transfer1_h, transfer1_m,
                transfer2_h, transfer2_m, dispatch_location, doctor_car_detail
            ) VALUES (
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s
            )
        z.Inserted detailed time record for patient_no: )r   r   r   r   r   r   r   r   r   r   r   r   r   r   z)Created placeholder rows for patient_no: z in remaining related tables.rV   zITime-based record initiated with detailed times and placeholders created.r   z2Error in initiate_record_from_time for patient_no r   Tr   r^   )r   r   r   r8   r+   ra   rb   rc   warningr   r   r   r   r   r   r   r   re   r   r   r   )0r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r
  r   ra   r   r   r   r   r   insert_patient_querypatient_valuesinsert_list_querylist_valuestime_insert_querytime_valuesr   r   insert_pi_queryhttp_excr   r)   r)   r*   initiate_record_from_time  sp    







r  z/api/save_all_timesc           *         s  t d|   t }| }zzd}|||||||||	|
||||||||||||||||||| f} |||  |d urT|d urTd}!||!||| f t d|   |d uro|d urod}"||"||| f t d|   |ru|rudnd}#|r}|r}dnd}$|r|rdnd}%|r|rdnd}&d	}'|#|$|%|&| f}(||'|( t d
|   |  dddW W |  |  S  ty }) z|  t j	d|  d|) dd t
dt|)dd })~)ww |  |  w )Nz#Updating time data for patient_no: a  
            UPDATE time SET
            call_received_h=%s, call_received_m=%s, dispatch_h=%s, dispatch_m=%s,
            arrival_on_scene_h=%s, arrival_on_scene_m=%s, patient_contact_h=%s, patient_contact_m=%s,
            transport_start_h=%s, transport_start_m=%s, patient_loaded_h=%s, patient_loaded_m=%s,
            depart_scene_h=%s, depart_scene_m=%s, arrival_hospital_h=%s, arrival_hospital_m=%s,
            handover_to_doctor_h=%s, handover_to_doctor_m=%s, return_from_site_h=%s, return_from_site_m=%s,
            return_to_station_h=%s, return_to_station_m=%s, transfer1_h=%s, transfer1_m=%s,
            transfer2_h=%s, transfer2_m=%s, dispatch_location=%s, doctor_car_detail=%s
            WHERE patient_no = %s
        z
                UPDATE contact_time_T 
                SET contact_time_h = %s, contact_time_m = %s 
                WHERE patient_no = %s
             z6Synced time.patient_contact -> contact_time_T for No: z
                UPDATE before_arrival 
                SET contact_time_h = %s, contact_time_m = %s 
                WHERE patient_no = %s
             z7Synced time.arrival_hospital -> before_arrival for No: rp   r   z
            UPDATE transfer_state SET
            patient_loaded_time=%s, depart_scene_time=%s, arrival_hospital_time=%s, handover_to_doctor_time=%s
            WHERE patient_no = %s
        z;Updated transfer_state (Checked _h and _m) for patient_no: rV   zTime data updated.r   z(Error updating time data for patient_no r   Tr   r^   r>   r   r   r+   ra   rb   r   re   r   r   r   r   r8   )*r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   ra   rk   valuessync_contact_querysync_before_querypatient_loaded_statusdepart_scene_statusarrival_hospital_statushandover_to_doctor_statustransfer_update_querytransfer_update_valuer   r)   r)   r*   save_all_times  s\    

r  z/api/save_call_receivedcall_received_datecall_methodmonthly_numberrequest_locationincident_typec              
      s   t d|   d}||krd }|dkrd }||krd }||kr#d }t }| }	zJz$d}
||||||| f}|	|
| |  dddW W |	  |  S  tyt } z|  t j	d|  d	| d
d t
dt|dd }~ww |	  |  w )Nz,Updating call_received data for patient_no: <   クリックすると選択メニューが表示されますr	  z
            UPDATE call_received SET
            call_received_date=%s, call_method=%s, monthly_number=%s,
            request_location=%s, address=%s, incident_type=%s
            WHERE patient_no = %s
        rV   zCall received data updated.r   z1Error updating call_received data for patient_no r   Tr   r^   r>   r  )r   r   r!  r"  r#  r   r$  placeholderr   ra   rk   r  r   r)   r)   r*   save_call_received  s@   


r'  z/api/save_patient_infopatient_name1patient_name2
birth_yearbirth_month	birth_day
occupationcompanion_namerelationcontact_info
onset_timecontact_conditionchief_complaintsymptom_severity	allergiesmedication_historymedical_historylast_meal_timeprimary_medical_institutionc                    s"  t d|   t }| }zwzQ|r| r|nd}d}|||||||||	|
|||||||||||||| f}||| d}|||| f t d|   |  dddW W |  |  S  ty } z|	  t j
d	|  d
| dd tdt|dd }~ww |  |  w )Nz+Updating patient_info data for patient_no: r   a#  
            UPDATE patient_info SET
            patient_name1=%s, patient_name2=%s, birth_year=%s, birth_month=%s, birth_day=%s,
            age=%s, gender=%s, occupation=%s, address=%s, phone_number=%s,
            companion_name=%s, relation=%s, contact_info=%s, urgency_level=%s,
            onset_time=%s, contact_condition=%s, chief_complaint=%s, symptom_severity=%s,
            allergies=%s, medication_history=%s, medical_history=%s, last_meal_time=%s,
            primary_medical_institution=%s
            WHERE patient_no = %s
        r   z+Updated 'list' table name2 for patient_no: rV   zPatient info data updated.r   z0Error updating patient_info data for patient_no r   Tr   r^   r>   )r   r   r+   ra   r_   rb   r   re   r   r   r   r   r8   )r   r(  r)  r*  r+  r,  r   r   r-  r   r   r.  r/  r0  r   r1  r2  r3  r4  r5  r6  r7  r8  r9  r   ra   effective_patient_name2rk   r  update_list_name2_queryr   r)   r)   r*   save_patient_info  s<   



r<  z/api/save_contact_timecontact_time_hcontact_time_mconsciousness_jcsconsciousness_econsciousness_vconsciousness_mrespiration_raterespiration_condition
pulse_ratepulse_1pulse_2temperature_Ltemperature_Rtemperature_text
bp_right_1
bp_right_2	bp_left_1	bp_left_2	spo2_left
spo2_rightoxygen_flow_rate
oxygen_use
ecg_statusauscultationpupil_right_sizepupil_right_reactionpupil_left_sizepupil_left_reactiongaze_deviationpalpebral_conjunctivavisual_impairment	nystagmus
convulsionaffected_area_conditionskin_condition	paralysisparalysis_areavomitvomit_countdiarrhea	first_aidfirst_aid_othertransport_positionadlc-           7   
      s.  t d|   d}-t }.g d}/|/D ]}0|.|0|-kr!d |.|0< qt }1|1 }2zzd}3g |||.d |||||.d |	|.d |.d |||||||||||.d	 |.d
 |.d ||.d ||.d |.d |.d |.d |.d |.d |"|.d |.d |%|.d |'|.d |.d |*|.d |.d | R }4|2|3|4 |d ur|d urd}5|2|5||| f t d|   |1  dddW W |2  |1  S  t	y }6 z|1
  t jd|  d |6 d!d" td#t|6d$d }6~6ww |2  |1  w )%Nz-Updating contact_time_T data for patient_no: r%  )r?  rD  rF  rG  rR  rS  rT  rV  rX  rY  rZ  r[  r\  r]  r_  r`  rb  rd  re  rg  rh  a  
            UPDATE contact_time_T SET
            contact_time_h=%s, contact_time_m=%s, consciousness_jcs=%s, consciousness_e=%s,
            consciousness_v=%s, consciousness_m=%s, respiration_rate=%s, respiration_condition=%s,
            pulse_rate=%s, pulse_1=%s, pulse_2=%s, temperature_L=%s, temperature_R=%s,
            temperature_text=%s, bp_right_1=%s, bp_right_2=%s, bp_left_1=%s, bp_left_2=%s,
            spo2_left=%s, spo2_right=%s, oxygen_flow_rate=%s, oxygen_use=%s, ecg_status=%s,
            auscultation=%s, pupil_right_size=%s, pupil_right_reaction=%s, pupil_left_size=%s,
            pupil_left_reaction=%s, gaze_deviation=%s, palpebral_conjunctiva=%s, visual_impairment=%s,
            nystagmus=%s, convulsion=%s, affected_area_condition=%s, skin_condition=%s,
            paralysis=%s, paralysis_area=%s, vomit=%s, vomit_count=%s, diarrhea=%s,
            first_aid=%s, first_aid_other=%s, transport_position=%s, adl=%s
            WHERE patient_no = %s
        r?  rD  rF  rG  rR  rS  rT  rV  rX  rY  rZ  r[  r\  r]  r_  r`  rb  rd  re  rg  rh  z
                UPDATE time 
                SET patient_contact_h = %s, patient_contact_m = %s 
                WHERE patient_no = %s
            z6Synced contact_time_T -> time.patient_contact for No: rV   zContact time data updated.r   z2Error updating contact_time_T data for patient_no r   Tr   r^   r>   r   r   localsgetr+   ra   rb   r   re   r   r   r   r   r8   )7r   r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  r&  
local_varsfields_to_checkfieldr   ra   rk   r  sync_time_queryr   r)   r)   r*   save_contact_time  s   0					





rp  z/api/save_memotextc              
      sj  t d|   t }| }zzg }|r |dd |D  |rmtjtdd |D ]A}|jrlt	
  tj|jd  }tjt|}	t|	d}
t|j|
 W d    n1 s]w   Y  |t d|  q+|rtd	|nd }d
}||||| f |  dddW W |  |  S  ty } z|  tdt|dd }~ww |  |  w )Nz#Updating memo data for patient_no: c                 S   r   r)   r   r   r)   r)   r*   r   ~  r   zsave_memo.<locals>.<listcomp>Tr   rp   r   r%   r   z9UPDATE memo SET text = %s, img = %s WHERE patient_no = %srV   z!Memo updated with multiple imagesr   r^   r>   )r   r   r+   ra   r   rE   r   r   r   r   r   rF   r   rG   rK   r   r   r   r   r   rb   r   re   r   r   r   r8   )r   rq  r   r   r   ra   r   r   r   	full_pathr   r   rk   r   r)   r)   r*   	save_memoo  sB   

rs  z/api/save_before_arrivalc           $         s  t d|   d}t }g d}|D ]}|||kr!d ||< qt }| }zzhd}|||d |||||d |	|d |d |||||||||||d	 |d
 |d | f} |||  |d ur|d urd}!||!||| f d}"||"| f t d|   |  dddW W |  |  S  t	y }# z|
  t jd|  d|# dd tdt|#dd }#~#ww |  |  w )Nz-Updating before_arrival data for patient_no: r%  )r?  rD  rF  rG  rR  rS  rT  a:  
            UPDATE before_arrival SET
            contact_time_h=%s, contact_time_m=%s, consciousness_jcs=%s, consciousness_e=%s,
            consciousness_v=%s, consciousness_m=%s, respiration_rate=%s, respiration_condition=%s,
            pulse_rate=%s, pulse_1=%s, pulse_2=%s, temperature_L=%s, temperature_R=%s,
            temperature_text=%s, bp_right_1=%s, bp_right_2=%s, bp_left_1=%s, bp_left_2=%s,
            spo2_left=%s, spo2_right=%s, oxygen_flow_rate=%s, oxygen_use=%s, ecg_status=%s,
            auscultation=%s
            WHERE patient_no = %s
        r?  rD  rF  rG  rR  rS  rT  z
                UPDATE time 
                SET arrival_hospital_h = %s, arrival_hospital_m = %s 
                WHERE patient_no = %s
            z
                UPDATE transfer_state 
                SET arrival_hospital_time = 1 
                WHERE patient_no = %s
            z7Synced before_arrival -> time.arrival_hospital for No: rV   zBefore arrival data updated.r   z2Error updating before_arrival data for patient_no r   Tr   r^   r>   ri  )$r   r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  r&  rl  rm  rn  r   ra   rk   r  ro  transfer_sync_queryr   r)   r)   r*   save_before_arrival  sN   


ru  z/api/save_reportambulance_team_nameteam_leader_namediagnosis_nameseverityhospital_selection_reasondistance_station_to_scene_Ldistance_station_to_scene_Rdistance_scene_to_hospital_Ldistance_scene_to_hospital_Rdistance_hospital_to_station_Ldistance_hospital_to_station_Rdistance_station_roundtrip_Ldistance_station_roundtrip_Rfirst_doctor_namerelated_organizationc                    s   t d|   t }| }zSz-d}|||||||||	|
|||||| f}||| |  dddW W |  |  S  tyc } z|  t j	d|  d| dd	 t
d
t|dd }~ww |  |  w )Nz%Updating report data for patient_no: a4  
            UPDATE report SET
            ambulance_team_name=%s, team_leader_name=%s, diagnosis_name=%s, severity=%s,
            hospital_selection_reason=%s, distance_station_to_scene_L=%s, distance_station_to_scene_R=%s,
            distance_scene_to_hospital_L=%s, distance_scene_to_hospital_R=%s,
            distance_hospital_to_station_L=%s, distance_hospital_to_station_R=%s,
            distance_station_roundtrip_L=%s, distance_station_roundtrip_R=%s,
            first_doctor_name=%s, related_organization=%s
            WHERE patient_no = %s
        rV   zReport data updated.r   z*Error updating report data for patient_no r   Tr   r^   r>   r  )r   rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r   ra   rk   r  r   r)   r)   r*   save_report  s4   

r  z/api/save_primary_triagechecklist_datac              
      s   t d|   t }| }z?z#t||  d}||||| f |  dddW W |  |  S  tyO } z|	  t
ddt| dd }~ww |  |  w )	Nz&UPSERT primary_triage for patient_no: zWUPDATE primary_triage SET urgency_level = %s, checklist_data = %s WHERE patient_no = %srV   zPrimary triage data saved.r   r^   rr   r>   )r   r   r+   ra   r   rb   r   re   r   r   r   r8   )r   r   r  r   ra   rk   r   r)   r)   r*   save_primary_triage2  s&   


r  z/api/save_secondary_triage_1practitioner_name1practitioner_name2treatment_timerespirationtreatment_details
save_statec                    R  t  }| }zg }|r|dd |D  |rdtjtdd |D ]A}|jrct  tj	
|jd  }tj	t|}t|d}t|j| W d    n1 sTw   Y  |t d|  q"|rkd|nd }t||  d	}|||||||||	|
||||||||| f}||| |  d
diW |  |  S |  |  w )Nc                 S   r   r)   r   r   r)   r)   r*   r   h  r   z+save_secondary_triage_1.<locals>.<listcomp>Tr   rp   r   r%   r   a  
            UPDATE secondary_triage_1 SET
            practitioner_name1=%s, practitioner_name2=%s, treatment_time=%s, respiration=%s,
            bp_right_1=%s, bp_right_2=%s, bp_left_1=%s, bp_left_2=%s, pulse_rate=%s,
            consciousness_jcs=%s, consciousness_e=%s, consciousness_v=%s, consciousness_m=%s,
            treatment_details=%s, urgency_level=%s, img=%s, checklist_data=%s, save_state=COALESCE(%s, save_state)
            WHERE patient_no = %s
        r   rV   r+   ra   r   rE   r   r   r   r   r   rF   r   rG   rK   r   r   r   r   r   r   rb   r   re   r   r  r  r  r  rK  rL  rM  rN  rE  r?  r@  rA  rB  r  r   r   r   r  r  r   ra   r   r   u_namerr  r   r   rk   valsr)   r)   r*   save_secondary_triage_1K  B   
	


r  z/api/save_secondary_triage_2c                    r  )Nc                 S   r   r)   r   r   r)   r)   r*   r     r   z+save_secondary_triage_2.<locals>.<listcomp>Tr   rp   r   r%   r   a  
            UPDATE secondary_triage_2 SET
            practitioner_name1=%s, practitioner_name2=%s, treatment_time=%s, respiration=%s,
            bp_right_1=%s, bp_right_2=%s, bp_left_1=%s, bp_left_2=%s, pulse_rate=%s,
            consciousness_jcs=%s, consciousness_e=%s, consciousness_v=%s, consciousness_m=%s,
            treatment_details=%s, urgency_level=%s, img=%s, checklist_data=%s, save_state=COALESCE(%s, save_state)
            WHERE patient_no = %s
        r   rV   r  r  r)   r)   r*   save_secondary_triage_2  r  r  z/api/save_secondary_triage_3c                    sP  t  }| }zg }|r|dd |D  |rdtjtdd |D ]A}|jrct  tj	
|jd  }tj	t|}t|d}t|j| W d    n1 sTw   Y  |t d|  q"|rkd|nd }t||  d	}|||||||||	|
|||||||| f}||| |  d
diW |  |  S |  |  w )Nc                 S   r   r)   r   r   r)   r)   r*   r     r   z+save_secondary_triage_3.<locals>.<listcomp>Tr   rp   r   r%   r   a  
            UPDATE secondary_triage_3 SET
            practitioner_name1=%s, practitioner_name2=%s, treatment_time=%s, respiration=%s,
            bp_right_1=%s, bp_right_2=%s, bp_left_1=%s, bp_left_2=%s, pulse_rate=%s,
            consciousness_jcs=%s, consciousness_e=%s, consciousness_v=%s, consciousness_m=%s,
            treatment_details=%s, urgency_level=%s, img=%s, checklist_data=%s
            WHERE patient_no = %s
        r   rV   r  )r   r  r  r  r  rK  rL  rM  rN  rE  r?  r@  rA  rB  r  r   r   r   r  r   ra   r   r   r  rr  r   r   rk   r  r)   r)   r*   save_secondary_triage_3  sB   
	



r  c                   @      e Zd ZU eed< dZee ed< dZee ed< dZ	ee ed< dZ
ee ed< dZee ed< dZee ed< dZee ed	< d
Zee ed< dS Incident
patient_NoN	date_timer   patient_nameprimary_urgencysecondary_1_urgencysecondary_2_urgencysecondary_3_urgencyr   complete_listr5   r6   r7   r8   r9   r  r   r   r   r  r  r  r  r  r  rv   r)   r)   r)   r*   r  
     
 r  z/api/transport_patients)response_modelc               
         t  } | jdd}z9zd}|| | }|W W |  |   S  tyC } ztjd| dd tddt	| dd }~ww |  |   w )	NTrY   a  
        SELECT
            p.No as patient_No,
            p.date_time,
            p.day_of_week,
            p.name2 as patient_name,
            pt.urgency_level as primary_urgency,
            st1.urgency_level as secondary_1_urgency,
            st2.urgency_level as secondary_2_urgency,
            st3.urgency_level as secondary_3_urgency,
            l.complete_list
        FROM
            patient p
        LEFT JOIN list l ON p.No = l.patient_no
        LEFT JOIN sick_and_wounded_list swl ON p.No = swl.patient_no
        LEFT JOIN primary_triage pt ON p.No = pt.patient_no
        LEFT JOIN secondary_triage_1 st1 ON p.No = st1.patient_no
        LEFT JOIN secondary_triage_2 st2 ON p.No = st2.patient_no
        LEFT JOIN secondary_triage_3 st3 ON p.No = st3.patient_no
        WHERE p.name2 IS NOT NULL
          AND swl.id IS NULL
        ORDER BY
            p.id DESC;
        z+Error fetching patient list for transport: r   r^   r   r>   
r+   ra   rb   rs   re   r   r   r   r   r8   r   ra   rk   resultsr   r)   r)   r*   get_patient_list_for_transport  s"   


r  c                   @   r  r  r  r)   r)   r)   r*   r  D  r  z/api/incidentsc               
      r  )	NTrY   a  
            SELECT
                l.patient_no AS patient_No,
                l.date_time,
                l.day_of_week,
                l.name2 AS patient_name,
                pt.urgency_level AS primary_urgency,
                st1.urgency_level AS secondary_1_urgency,
                st2.urgency_level AS secondary_2_urgency,
                st3.urgency_level AS secondary_3_urgency,
                swl.complete_list
            FROM
                list l
            INNER JOIN sick_and_wounded_list swl ON l.patient_no = swl.patient_no
            LEFT JOIN primary_triage pt ON l.patient_no = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON l.patient_no = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON l.patient_no = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON l.patient_no = st3.patient_no
            ORDER BY
                l.id DESC;
        z0Error fetching incident list from 'list' table: r   r^   r   r>   r  r  r)   r)   r*   get_incident_listO  s"   


r  z/api/transfer_status_listc               
      s   t d t } | jdd}zLz*d}|| | }|s/t d g W W |  |   S |W W |  |   S  ty[ } zt jd| dd t	dd	t
| d
d}~ww |  |   w )u   
    모든 환자에 대한 이송 상태 (transfer_state) 정보를 반환합니다.
    (車内収容, 現場出発, 病院到着, 医師引継 상태)
    z"Fetching all transfer status data.TrY   a  
            SELECT
                patient_no,
                patient_loaded_time,
                depart_scene_time,
                arrival_hospital_time,
                handover_to_doctor_time
            FROM transfer_state
            ORDER BY patient_no DESC;
        z!No transfer status records found.z%Error fetching transfer status list: r   r^   r   r>   N)r   r   r+   ra   rb   rs   re   r   r   r   r8   r  r)   r)   r*   get_transfer_status_listy  s.   






r  c              
   C   s   z.ddddd|| g}t j|dddd}td|j tjtj| d	 d
 }tj||W S  t	y:   td   t j
yU } ztd|j  td|j  d}~w tyh } ztd|   d}~ww )uM   
    LibreOffice를 사용하여 Excel 파일을 PDF로 변환합니다.
    libreofficez
--headlessz--convert-topdfz--outdirT)capture_outputrq  checkz"LibreOffice PDF conversion stdout:r   .pdfzZERROR: 'libreoffice' command not found. Is LibreOffice installed and in the system's PATH?z3ERROR: LibreOffice conversion failed. Return code: zStderr:Nz4An unexpected error occurred during PDF conversion: )
subprocessrunrg   stdoutrE   rF   r   basenamerG   FileNotFoundErrorCalledProcessError
returncodestderrr   )
excel_path
output_dircommandresultpdf_filenamer   r)   r)   r*   convert_excel_to_pdf  s4   	r  rQ   r  c                 C   s*   |  d| d}t jt|}t j|S )u   
    /home/air/sos-test/templates/ 폴더 안에
    prefix_patient_no.pdf (예: reportA_3.pdf) 가 존재하는지 확인
    _r  rE   rF   rG   TEMPLATE_DIRrJ   )rQ   r   r   rF   r)   r)   r*   report_exists  s   r  z/api/report_status/{patient_no}c                    s(   t d| t d| t d| t d| dS )u   
    특정 patient_no 에 대해 A/B/C/triage 보고서 PDF 존재 여부를 반환
    예: { "A": true, "B": false, "C": true, "triage": false }
    reportAreportBreportCreport_triage)ABCtriage)r  r   r)   r)   r*   get_report_status  s   r  z!/api/generate_report/{patient_no}c           4         sD	  t  }|jdd}zYz7d}||| f |  td|   tdt fdddD   td	t   sAtd
ddW n t	yY } ztddt| dd }~ww W |
  |
  n	|
  |
  w z	tjtd}d|  d}tjt|}t|}d}	|	|jv r||	 ntd|	 d |jfdd}
 drz' d }t|trt|d}|j d< |j d< g d}||   d< W n t	y } ztd|  W Y d }~nd }~ww ddd d!d"d#}| D ]\}} |d ur|
| |  qd$d%d&d'}| D ]\}} |d ur*|
| |  qi d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdM}| D ]\}} |}|d urzt|}W n   Y |
|| qki dNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrds}| D ]\}} |d ur|
| |  qg dt}|D ]$\}}} |} |}|d ur|d ur|
|| du|  qi dvdwdxdydzd{d|d}d~dddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddÓddœddǓddɓdd˓dd͓ddϓddѓddӓddՓddדddٓddۓ}| D ]\}} |d ur|
| |  q dܡd ur dݡd ur d  du d  }|
d| i dddddddddddddddddddddddddddddddddd ddddddd}| D ]\}} |d ur?|
| |  q, dd urf d	d urf d  du d	  }|
d
| g d}g }tdt  tdt fdd|D   |D ]0} |r | dD ]} tj|   }!tjt|!}"tj!|"r|"|" qqd}#g d}$d}%d}&t#|}'t#|$}(|'|( d |( })|)dkrd}*nd}*t$|D ]t\}+} zO|+t#|$ },|+t#|$ }-|#|-|%  }.|.d }/|$|,  |/ }0|&j%|. _&|*j%|/ _&t'| }1|1j(dkr5|1j&|1j( }2d|1_(d|2 |1_&)|1|0 W q t	y^ } ztd|  d|  W Y d }~qd }~ww d_*|+| t,|t}3dd||3dW S  t-y   td
d| d t	y } ztdd t| dd }~ww (!  NTrY     
            SELECT
                p.*,
                t.call_received_h, t.call_received_m, t.dispatch_h, t.dispatch_m, t.arrival_on_scene_h, t.arrival_on_scene_m,
                t.patient_contact_h, t.patient_contact_m, t.transport_start_h, t.transport_start_m, t.patient_loaded_h, t.patient_loaded_m,
                t.depart_scene_h, t.depart_scene_m, t.arrival_hospital_h, t.arrival_hospital_m, t.handover_to_doctor_h, t.handover_to_doctor_m,
                t.return_from_site_h, t.return_from_site_m, t.return_to_station_h, t.return_to_station_m, t.transfer1_h, t.transfer1_m,
                t.transfer2_h, t.transfer2_m, t.dispatch_location, t.doctor_car_detail,
                cr.call_received_date, cr.call_method, cr.monthly_number, cr.request_location, cr.address as cr_address, cr.incident_type,
                pi.patient_name1, pi.patient_name2, pi.birth_year, pi.birth_month, pi.birth_day, pi.age as pi_age, pi.gender as pi_gender, pi.occupation,
                pi.address as pi_address, pi.phone_number as pi_phone_number, pi.companion_name, pi.relation, pi.contact_info, pi.urgency_level as pi_urgency_level,
                pi.onset_time, pi.contact_condition, pi.chief_complaint, pi.symptom_severity, pi.allergies, pi.medication_history,
                pi.medical_history, pi.last_meal_time, pi.primary_medical_institution,
                pt.urgency_level as primary_triage_urgency_level,
                st1.practitioner_name1 as st1_practitioner_name1, st1.practitioner_name2 as st1_practitioner_name2, st1.treatment_time as st1_treatment_time,
                st1.respiration as st1_respiration, st1.bp_right_1 as st1_bp_right_1, st1.bp_right_2 as st1_bp_right_2,
                st1.bp_left_1 as st1_bp_left_1, st1.bp_left_2 as st1_bp_left_2, st1.pulse_rate as st1_pulse_rate,
                st1.consciousness_jcs as st1_consciousness_jcs, st1.consciousness_e as st1_consciousness_e,
                st1.consciousness_v as st1_consciousness_v, st1.consciousness_m as st1_consciousness_m,
                st1.treatment_details as st1_treatment_details, st1.urgency_level as st1_urgency_level, st1.img as st1_img,
                st2.practitioner_name1 as st2_practitioner_name1, st2.practitioner_name2 as st2_practitioner_name2, st2.treatment_time as st2_treatment_time,
                st2.respiration as st2_respiration, st2.bp_right_1 as st2_bp_right_1, st2.bp_right_2 as st2_bp_right_2,
                st2.bp_left_1 as st2_bp_left_1, st2.bp_left_2 as st2_bp_left_2, st2.pulse_rate as st2_pulse_rate,
                st2.consciousness_jcs as st2_consciousness_jcs, st2.consciousness_e as st2_consciousness_e,
                st2.consciousness_v as st2_consciousness_v, st2.consciousness_m as st2_consciousness_m,
                st2.treatment_details as st2_treatment_details, st2.urgency_level as st2_urgency_level, st2.img as st2_img,
                st3.practitioner_name1 as st3_practitioner_name1, st3.practitioner_name2 as st3_practitioner_name2, st3.treatment_time as st3_treatment_time,
                st3.respiration as st3_respiration, st3.bp_right_1 as st3_bp_right_1, st3.bp_right_2 as st3_bp_right_2,
                st3.bp_left_1 as st3_bp_left_1, st3.bp_left_2 as st3_bp_left_2, st3.pulse_rate as st3_pulse_rate,
                st3.consciousness_jcs as st3_consciousness_jcs, st3.consciousness_e as st3_consciousness_e,
                st3.consciousness_v as st3_consciousness_v, st3.consciousness_m as st3_consciousness_m,
                st3.treatment_details as st3_treatment_details, st3.urgency_level as st3_urgency_level, st3.img as st3_img,
                ct.contact_time_h as ct_contact_time_h, ct.contact_time_m as ct_contact_time_m, ct.consciousness_jcs as ct_consciousness_jcs,
                ct.consciousness_e as ct_consciousness_e, ct.consciousness_v as ct_consciousness_v, ct.consciousness_m as ct_consciousness_m,
                ct.respiration_rate as ct_respiration_rate, ct.respiration_condition as ct_respiration_condition,
                ct.pulse_rate as ct_pulse_rate, ct.pulse_1 as ct_pulse_1, ct.pulse_2 as ct_pulse_2,
                ct.temperature_L as ct_temperature_L, ct.temperature_R as ct_temperature_R, ct.temperature_text as ct_temperature_text,
                ct.bp_right_1 as ct_bp_right_1, ct.bp_right_2 as ct_bp_right_2, ct.bp_left_1 as ct_bp_left_1,
                ct.bp_left_2 as ct_bp_left_2, ct.spo2_left as ct_spo2_left, ct.spo2_right as ct_spo2_right,
                ct.oxygen_flow_rate as ct_oxygen_flow_rate, ct.oxygen_use as ct_oxygen_use, ct.ecg_status as ct_ecg_status,
                ct.auscultation as ct_auscultation, ct.pupil_right_size as ct_pupil_right_size,
                ct.pupil_right_reaction as ct_pupil_right_reaction, ct.pupil_left_size as ct_pupil_left_size,
                ct.pupil_left_reaction as ct_pupil_left_reaction, ct.gaze_deviation as ct_gaze_deviation,
                ct.palpebral_conjunctiva as ct_palpebral_conjunctiva, ct.visual_impairment as ct_visual_impairment,
                ct.nystagmus as ct_nystagmus, ct.convulsion as ct_convulsion, ct.affected_area_condition as ct_affected_area_condition,
                ct.skin_condition as ct_skin_condition, ct.paralysis as ct_paralysis, ct.paralysis_area as ct_paralysis_area,
                ct.vomit as ct_vomit, ct.vomit_count as ct_vomit_count, ct.diarrhea as ct_diarrhea,
                ct.first_aid as ct_first_aid, ct.first_aid_other as ct_first_aid_other,
                ct.transport_position as ct_transport_position, ct.adl as ct_adl,
                m.text as memo_text, m.img as memo_img,
                ba.contact_time_h as ba_contact_time_h, ba.contact_time_m as ba_contact_time_m, ba.consciousness_jcs as ba_consciousness_jcs,
                ba.consciousness_e as ba_consciousness_e, ba.consciousness_v as ba_consciousness_v, ba.consciousness_m as ba_consciousness_m,
                ba.respiration_rate as ba_respiration_rate, ba.respiration_condition as ba_respiration_condition,
                ba.pulse_rate as ba_pulse_rate, ba.pulse_1 as ba_pulse_1, ba.pulse_2 as ba_pulse_2,
                ba.temperature_L as ba_temperature_L, ba.temperature_R as ba_temperature_R, ba.temperature_text as ba_temperature_text,
                ba.bp_right_1 as ba_bp_right_1, ba.bp_right_2 as ba_bp_right_2, ba.bp_left_1 as ba_bp_left_1,
                ba.bp_left_2 as ba_bp_left_2, ba.spo2_left as ba_spo2_left, ba.spo2_right as ba_spo2_right,
                ba.oxygen_flow_rate as ba_oxygen_flow_rate, ba.oxygen_use as ba_oxygen_use, ba.ecg_status as ba_ecg_status,
                ba.auscultation as ba_auscultation,
                r.ambulance_team_name, r.team_leader_name, r.diagnosis_name, r.severity as report_severity,
                r.hospital_selection_reason, r.distance_station_to_scene_L, r.distance_station_to_scene_R,
                r.distance_scene_to_hospital_L, r.distance_scene_to_hospital_R,
                r.distance_hospital_to_station_L, r.distance_hospital_to_station_R,
                r.distance_station_roundtrip_L, r.distance_station_roundtrip_R,
                r.first_doctor_name, r.related_organization
            FROM
                patient p
            LEFT JOIN time t ON p.No = t.patient_no
            LEFT JOIN call_received cr ON p.No = cr.patient_no
            LEFT JOIN patient_info pi ON p.No = pi.patient_no
            LEFT JOIN primary_triage pt ON p.No = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON p.No = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON p.No = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON p.No = st3.patient_no
            LEFT JOIN contact_time_T ct ON p.No = ct.patient_no
            LEFT JOIN memo m ON p.No = m.patient_no
            LEFT JOIN before_arrival ba ON p.No = ba.patient_no
            LEFT JOIN report r ON p.No = r.patient_no
            WHERE p.No = %s
        z[REPORT] patient_no=z[REPORT] image_fields_raw=c                       i | ]}|  |qS r)   rk  )r   kdatar)   r*   
<dictcomp>2      z#generate_report.<locals>.<dictcomp>r   st1_imgst2_imgst3_imgmemo_imgz[REPORT] UPLOAD_DIR=r=   /Report data not found for the given patient_no.r>   r^   r   z20251226_A.xlsxreportA_.xlsxu   消防機関用'C   ' 시트를 찾을 수 없어 첫 번째 시트를 사용합니다.c              
      ~   z|d u rd  | < W d S | | < W d S  t y> } z td|  d td| dt| d td|   d }~ww )Nz'---!!! CRITICAL ERROR WRITING TO CELL:  !!!---    VALUE:  (Type: r       ERROR: r   r   r   typecellvaluer   sheetr)   r*   write_to_cellO  s   z&generate_report.<locals>.write_to_cellr   %Y-%m-%d
calc_monthcalc_dayr   calc_weekdayu   날짜 변환 오류: J5S5AC5AQ5CI5)r  r  r  r!  r"  J11Z11J20)r#  
cr_addressr$  r   A27r   F27r   J27r   O27r   R27r   W27r   Z27r   AE27r   AH27r   AM27r   AP27r   AU27r   AX27r   BC27r   BF27r   BK27r   BN27BS27BV27CA27)r   r   r   r  J31r  BA31r(  J35r)  J38r*  AR35r+  BD35r,  BL35pi_ageBV35	pi_genderCE35
pi_addressJ44pi_phone_numberJ48rx  AP48report_severityBZ48r.  J52r/  AH52r0  AW52pi_urgency_levelBZ52A58BV56BV60)rz  r  r  ))r{  r|  AE58)r}  r~  AO58)r  r  AY58)r  r  BI58.r1  P65r2  BM65r3  P69r4  BM69ct_contact_time_hA79ct_contact_time_mI79ct_consciousness_jcsU79ct_consciousness_eR83ct_consciousness_vW83ct_consciousness_mAB83ct_respiration_rateAE79ct_respiration_conditionAE83
ct_pulse_1AT79ct_pulse_rateAT81
ct_pulse_2AT83ct_temperature_textBI83ct_bp_right_1CF79ct_bp_right_2CM79ct_bp_left_1CF82ct_bp_left_2CM82ct_spo2_leftI85ct_spo2_rightW85ct_oxygen_useAH85ct_oxygen_flow_rateAT85ct_ecg_statusBL85ct_auscultationCG85ct_pupil_right_sizeJ90ct_pupil_right_reactionV90ct_gaze_deviationAO90ct_palpebral_conjunctivaBF90ct_pupil_left_sizeJ93ct_pupil_left_reactionV93ct_visual_impairmentAO93ct_nystagmusBF93ct_convulsionBW90ct_affected_area_conditionCG90ct_skin_conditionF96ct_paralysisAF96ct_paralysis_areaAU96ct_vomitBW96ct_vomit_countCC98ct_diarrheaCN96ct_first_aidI101ct_first_aid_otherAM101ct_transport_positionI107ct_adlP110r5  BN110r6  P114r7  BN114r8  P118r9  BN118ct_temperature_Lct_temperature_RBI79ba_contact_time_hA125ba_contact_time_mI125ba_consciousness_jcsU125ba_consciousness_eR129ba_consciousness_vW129ba_consciousness_mAB129ba_respiration_rateAE125ba_respiration_conditionAE129
ba_pulse_1AT125ba_pulse_rateAT127
ba_pulse_2AT129ba_temperature_textBI129ba_bp_right_1CF125ba_bp_right_2CM125ba_bp_left_1CF128ba_bp_left_2CM128ba_spo2_leftI131W131AH131AT131BL131CG131A136ba_spo2_rightba_oxygen_useba_oxygen_flow_rateba_ecg_statusba_auscultation	memo_textba_temperature_Lba_temperature_RBI125z[IMG] UPLOAD_DIR=z[IMG] raw_fields=c                    r  r)   r  )r   rN   r  r)   r*   r  =  r  r      r  TAOBHCB   
   rp      n   F   r         이미지 삽입 실패 (): A1:CV400rV   z3Report generated and converted to PDF successfully.r   rW   r  pdf_pathTemplate file not found at )File processing or PDF conversion error: ).r+   ra   rb   rc   r   r   r8   r   r   r   re   rE   rF   rG   r  openpyxlload_workbook
sheetnamesr  activerk  
isinstancer   strptimer   r   r   r   itemsrv   splitr  r_   rJ   r   rt   	enumeraterow_dimensionsheightr   width	add_image
print_areasaver  r  )4r   r   ra   rk   r   template_pathoutput_filenameexcel_output_pathworkbooktarget_sheet_namer  cr_dater   PAGE1_HEADER_MAPkey	cell_addrPAGE1_LOCATION_MAPPAGE1_TIME_MAPr  PAGE1_INFO_MAPdistance_pairsl_keyr_keyl_valr_valPAGE1_VITALS_MAPcombined_tempPAGE2_BEFORE_ARRIVAL_MAPcombined_temp_baimage_fields	all_pathsrn  pfnamefpath	start_rowcolsrow_height_incrementspacer_heighttotal_imagesimages_per_rownum_image_rowsimage_heighticol_idx	row_group
spacer_row	image_rowtarget_cellimg_objratior  r)   )r  r  r*   generate_report  s  P








			


	


	


  !!"##$%()*+,/ 
		


$$




r
  z/api/address/{patient_no}c              
      s   t d|   t }|jdd}zHz&d}||| f | }|r4d|d dW W |  |  S tdd	d
 tyZ } zt j	d|  d| dd tdt
|d
d }~ww |  |  w )Nz!Fetching address for patient_no: TrY   z7SELECT address FROM call_received WHERE patient_no = %srV   r   )r   r   r=   z+Address not found for the given patient_no.r>   z&Error fetching address for patient_no r   r   r^   r   r   r+   ra   rb   rc   re   r   r   r   r8   )r   r   ra   rk   r  r   r)   r)   r*   get_address  s(   

r  z#/api/generate_report_b/{patient_no}c           0         s  t  }|jdd}z9zd}||| f | }|s!tdddW n ty9 } ztddt| dd }~ww W |  |  n	|  |  w zd	}tj	
t|}d
|  d}tj	
t|}	t|}
d}||
jv rv|
|  ntd| d |
j  fdd}|drz'|d }t|trt|d}|j|d< |j|d< g d}||  |d< W n	 ty   Y nw dddddddd}| D ]\}}||d ur||||  qi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdF}| D ]\}}||}|d ur>zt|}W n   Y ||| q i dGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdk}| D ]\}}||d ur||||  q~i dldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddÓddœddǓddɓdd˓dd͓ddϓddѓ}| D ]\}}||d urI||||  q6|dҡd urk|dӡd urk|d  d|d  }|d| i ddדddٓddۓddݓddߓddddddddddddddddddddddddddddddd}| D ]\}}||d ur||||  q|dd ur|d d ur|d  d|d   }|d| g d}g }|D ]0}||r|| dD ]}tj	| }tj	
t|}tj	|r| | qqd}g d} d}!d}"t!|}#t!| }$|#|$ d |$ }%|%d	krHd
}&nd}&t"|D ]t\}'}zO|'t!|  }(|'t!|  })||)|!  }*|*d }+| |(  |+ },|" j#|* _$|& j#|+ _$t%|}-|-j&dkr|-j$|-j& }.d|-_&d|. |-_$ '|-|, W qO ty } zt(d| d|  W Y d }~qOd }~ww d _)|
*|	 t+|	t}/dd|	|/dW S  t,y   tdd| d ty } ztddt| dd }~ww (  NTrY   r  r=   r  r>   r^   r   z20251226_B.xlsxreportB_r  u   引継ぎ用r  r  c              
      r  )Nz2---!!! CRITICAL ERROR WRITING TO CELL (Report B): r  r  r  r   r  r  r  r  r)   r*   r    s   z(generate_report_b.<locals>.write_to_cellr   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r!  r#  r  r$  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r	  r
  r  r  CD27CI27)r   r   r   r   r   r  r  r  r  r(  r  r)  r  r*  r  r+  r  r,  r  r  r  r  r  r  r  r  r  rx  r  r  r  r.  r  r/  r   r0  r!  rz  r$  AE60r%  )rv  rw  r1  r,  r2  r-  r3  r.  r4  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r5  r  r6  r  r7  r  r8  r  r9  r  r  r  r+  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  rp   r  r  r  r   r  r  r  r  rV   z5Report B generated and converted to PDF successfully.r  r  r  )-r+   ra   rb   rc   r   r   r8   re   rE   rF   rG   r  r  r  r  r   r  r  rk  r  r   r  r   r   r   r  rv   r  r  r_   r   rJ   r   rt   r  r  r  r   r  r  r   r  r  r  r  )0r   r   ra   rk   r  r   template_filenamer  r  r  r  r  r  r  r   REPORT_B_PAGE1_MAPr  r  REPORT_B_TIME_MAPr  REPORT_B_INFO_MAPREPORT_B_VITALS_MAPr  REPORT_B_BEFORE_ARRIVAL_MAPr  r  r  rn  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r  r)   r  r*   generate_report_b  s  P








		


	
		
 !!""#$$%&)*+,-0 
		

"





r  z#/api/generate_report_c/{patient_no}c           &         s  t  }|jdd}z9zd}||| f | }|s!tdddW n ty9 } ztddt| dd }~ww W |  |  n	|  |  w zd	}tj	
t|}d
|  d}tj	
t|}	t|}
d}||
jv rv|
|  ntd| d |
j  fdd}|drz'|d }t|trt|d}|j|d< |j|d< g d}||  |d< W n   Y dddddddd}| D ]\}}||d ur||||  qi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJ	}| D ]\}}||}|d ur=zt|}W n   Y ||| qi dKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdq}| D ]\}}||d ur||||  qg dr}g }|D ]/}||r|| dsD ]}tj	| }tj	
t|}tj	|r| | qqdt}g du}dv}t!|D ]^\}}z;|t"| }|t"| } || |  }!||  |! }"t#|}#|#j$dwkr|#j%|#j$ }$dx|#_$dx|$ |#_% &|#|" W q ty6 } zt'dy| dz|  W Y d }~qd }~ww d{ _(|
)|	 t*|	t}%d|d}|	|%d~W S  t+y\   tdd| d tys } ztddt| dd }~ww )NTrY   a  
            SELECT
                p.*,
                t.call_received_h, t.call_received_m, t.dispatch_h, t.dispatch_m, t.arrival_on_scene_h, t.arrival_on_scene_m,
                t.patient_contact_h, t.patient_contact_m, t.transport_start_h, t.transport_start_m, t.patient_loaded_h, t.patient_loaded_m,
                t.depart_scene_h, t.depart_scene_m, t.arrival_hospital_h, t.arrival_hospital_m, t.handover_to_doctor_h, t.handover_to_doctor_m,
                t.return_from_site_h, t.return_from_site_m, t.return_to_station_h, t.return_to_station_m, t.transfer1_h, t.transfer1_m,
                t.transfer2_h, t.transfer2_m, t.dispatch_location, t.doctor_car_detail,
                cr.call_received_date, cr.call_method, cr.monthly_number, cr.request_location, cr.address as cr_address, cr.incident_type,
                pi.patient_name1, pi.patient_name2, pi.birth_year, pi.birth_month, pi.birth_day, pi.age as pi_age, pi.gender as pi_gender, pi.occupation as pi_occupation,
                pi.address as pi_address, pi.phone_number as pi_phone_number, pi.companion_name, pi.relation, pi.contact_info, pi.urgency_level as pi_urgency_level,
                pi.onset_time, pi.contact_condition, pi.chief_complaint, pi.symptom_severity, pi.allergies, pi.medication_history,
                pi.medical_history, pi.last_meal_time, pi.primary_medical_institution,
                pt.urgency_level as primary_triage_urgency_level,
                st1.practitioner_name1 as st1_practitioner_name1, st1.practitioner_name2 as st1_practitioner_name2, st1.treatment_time as st1_treatment_time,
                st1.respiration as st1_respiration, st1.bp_right_1 as st1_bp_right_1, st1.bp_right_2 as st1_bp_right_2,
                st1.bp_left_1 as st1_bp_left_1, st1.bp_left_2 as st1_bp_left_2, st1.pulse_rate as st1_pulse_rate,
                st1.consciousness_jcs as st1_consciousness_jcs, st1.consciousness_e as st1_consciousness_e,
                st1.consciousness_v as st1_consciousness_v, st1.consciousness_m as st1_consciousness_m,
                st1.treatment_details as st1_treatment_details, st1.urgency_level as st1_urgency_level, st1.img as st1_img,
                st2.practitioner_name1 as st2_practitioner_name1, st2.practitioner_name2 as st2_practitioner_name2, st2.treatment_time as st2_treatment_time,
                st2.respiration as st2_respiration, st2.bp_right_1 as st2_bp_right_1, st2.bp_right_2 as st2_bp_right_2,
                st2.bp_left_1 as st2_bp_left_1, st2.bp_left_2 as st2_bp_left_2, st2.pulse_rate as st2_pulse_rate,
                st2.consciousness_jcs as st2_consciousness_jcs, st2.consciousness_e as st2_consciousness_e,
                st2.consciousness_v as st2_consciousness_v, st2.consciousness_m as st2_consciousness_m,
                st2.treatment_details as st2_treatment_details, st2.urgency_level as st2_urgency_level, st2.img as st2_img,
                st3.practitioner_name1 as st3_practitioner_name1, st3.practitioner_name2 as st3_practitioner_name2, st3.treatment_time as st3_treatment_time,
                st3.respiration as st3_respiration, st3.bp_right_1 as st3_bp_right_1, st3.bp_right_2 as st3_bp_right_2,
                st3.bp_left_1 as st3_bp_left_1, st3.bp_left_2 as st3_bp_left_2, st3.pulse_rate as st3_pulse_rate,
                st3.consciousness_jcs as st3_consciousness_jcs, st3.consciousness_e as st3_consciousness_e,
                st3.consciousness_v as st3_consciousness_v, st3.consciousness_m as st3_consciousness_m,
                st3.treatment_details as st3_treatment_details, st3.urgency_level as st3_urgency_level, st3.img as st3_img,
                ct.contact_time_h as ct_contact_time_h, ct.contact_time_m as ct_contact_time_m, ct.consciousness_jcs as ct_consciousness_jcs,
                ct.consciousness_e as ct_consciousness_e, ct.consciousness_v as ct_consciousness_v, ct.consciousness_m as ct_consciousness_m,
                ct.respiration_rate as ct_respiration_rate, ct.respiration_condition as ct_respiration_condition,
                ct.pulse_rate as ct_pulse_rate, ct.pulse_1 as ct_pulse_1, ct.pulse_2 as ct_pulse_2,
                ct.temperature_L as ct_temperature_L, ct.temperature_R as ct_temperature_R, ct.temperature_text as ct_temperature_text,
                ct.bp_right_1 as ct_bp_right_1, ct.bp_right_2 as ct_bp_right_2, ct.bp_left_1 as ct_bp_left_1,
                ct.bp_left_2 as ct_bp_left_2, ct.spo2_left as ct_spo2_left, ct.spo2_right as ct_spo2_right,
                ct.oxygen_flow_rate as ct_oxygen_flow_rate, ct.oxygen_use as ct_oxygen_use, ct.ecg_status as ct_ecg_status,
                ct.auscultation as ct_auscultation, ct.pupil_right_size as ct_pupil_right_size,
                ct.pupil_right_reaction as ct_pupil_right_reaction, ct.pupil_left_size as ct_pupil_left_size,
                ct.pupil_left_reaction as ct_pupil_left_reaction, ct.gaze_deviation as ct_gaze_deviation,
                ct.palpebral_conjunctiva as ct_palpebral_conjunctiva, ct.visual_impairment as ct_visual_impairment,
                ct.nystagmus as ct_nystagmus, ct.convulsion as ct_convulsion, ct.affected_area_condition as ct_affected_area_condition,
                ct.skin_condition as ct_skin_condition, ct.paralysis as ct_paralysis, ct.paralysis_area as ct_paralysis_area,
                ct.vomit as ct_vomit, ct.vomit_count as ct_vomit_count, ct.diarrhea as ct_diarrhea,
                ct.first_aid as ct_first_aid, ct.first_aid_other as ct_first_aid_other,
                ct.transport_position as ct_transport_position, ct.adl as ct_adl,
                m.text as memo_text, m.img as memo_img,
                ba.contact_time_h as ba_contact_time_h, ba.contact_time_m as ba_contact_time_m, ba.consciousness_jcs as ba_consciousness_jcs,
                ba.consciousness_e as ba_consciousness_e, ba.consciousness_v as ba_consciousness_v, ba.consciousness_m as ba_consciousness_m,
                ba.respiration_rate as ba_respiration_rate, ba.respiration_condition as ba_respiration_condition,
                ba.pulse_rate as ba_pulse_rate, ba.pulse_1 as ba_pulse_1, ba.pulse_2 as ba_pulse_2,
                ba.temperature_L as ba_temperature_L, ba.temperature_R as ba_temperature_R, ba.temperature_text as ba_temperature_text,
                ba.bp_right_1 as ba_bp_right_1, ba.bp_right_2 as ba_bp_right_2, ba.bp_left_1 as ba_bp_left_1,
                ba.bp_left_2 as ba_bp_left_2, ba.spo2_left as ba_spo2_left, ba.spo2_right as ba_spo2_right,
                ba.oxygen_flow_rate as ba_oxygen_flow_rate, ba.oxygen_use as ba_oxygen_use, ba.ecg_status as ba_ecg_status,
                ba.auscultation as ba_auscultation,
                r.ambulance_team_name, r.team_leader_name, r.diagnosis_name, r.severity as report_severity,
                r.hospital_selection_reason, r.distance_station_to_scene_L, r.distance_station_to_scene_R,
                r.distance_scene_to_hospital_L, r.distance_scene_to_hospital_R,
                r.distance_hospital_to_station_L, r.distance_hospital_to_station_R,
                r.distance_station_roundtrip_L, r.distance_station_roundtrip_R,
                r.first_doctor_name, r.related_organization
            FROM
                patient p
            LEFT JOIN time t ON p.No = t.patient_no
            LEFT JOIN call_received cr ON p.No = cr.patient_no
            LEFT JOIN patient_info pi ON p.No = pi.patient_no
            LEFT JOIN primary_triage pt ON p.No = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON p.No = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON p.No = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON p.No = st3.patient_no
            LEFT JOIN contact_time_T ct ON p.No = ct.patient_no
            LEFT JOIN memo m ON p.No = m.patient_no
            LEFT JOIN before_arrival ba ON p.No = ba.patient_no
            LEFT JOIN report r ON p.No = r.patient_no
            WHERE p.No = %s
        r=   r  r>   r^   r   z20251226_C.xlsxreportC_r  u   医療機関提出用r  r  c              
      sZ   z|d ur| | < W d S W d S  t y, } ztd|  d|  W Y d }~d S d }~ww )NzError Report C (r  )r   r   r   r  r  r)   r*   r  	  s   $z(generate_report_c.<locals>.write_to_cellr   r  r  r  r   r  r  r  r  r  r  r  r  r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r	  r
  r  r  r  r  CL27CR27CL29CR29)	r   r   r   r   r   r  r  r  r  r  r  r  r  r(  r  r)  r  r*  r  r+  r  r,  r  r  r  r  r  pi_occupationCJ39r  r  r  r  r.  r  r/  r   r0  r!  rx  r  r  r  r$  r  r%  A65)rz  rv  rw  r  r  r   G   r     r   r  r  r  zA1:CU200rV   z5Report C generated and converted to PDF successfully.r  r  r  ),r+   ra   rb   rc   r   r   r8   re   rE   rF   rG   r  r  r  r  r   r  r  rk  r  r   r  r   r   r   r  rv   r  r  r_   r   rJ   r   r  rt   r   r  r  r  r   r  r  r  r  )&r   r   ra   rk   r  r   r  r  r  r  r  r  r  r  r   REPORT_C_PAGE1_MAPr  r  REPORT_C_TIME_MAPr  REPORT_C_INFO_MAPr  r  rn  r  r  r  r  r  r  r  r  r  current_rowr  r  r	  r  r)   r  r*   generate_report_c"	  sv  P








		


	
 



r'  z&/api/generate_triage_list/{patient_no}c              
      s  t  }|jdd}zqzPd}|| | }|s!tdddtjtd}d|  d	}tjt|}t	
|}|j}	td
dd}
tddd}tddd}tddd}|
|||d}|d }|d|d|d|d|df\|	d< |	d< |	d< |	d< |	d< dd }t|D ]\}}d| }|d |	d| < |d  |	d!| < d"|d#fd$|d%fd&|d'fd(|d)fg}|D ]\}}||}|	| |  }||_||v r|| |_q|d* pd+|	d,| < |d- pd+|	d.| < |d/pd+|	d0| < |d1p	d+|	d2| < |d3pd+|	d4| < |d5p#d+|	d6| < |dp0d+|	d7| < |dp=d+|	d8| < q|| t|t}d9||d:W W |  |  S  ty| } ztjd;| dd< td=t|dd }~ww |  |  w )>NTrY   aE  
            SELECT
                p.No, p.age, p.gender, p.name2 AS name_kanji, p.address,
                p.receiving_hospital_name, p.transport_agency_name,
                p.month, p.day, p.am_pm, p.time_h, p.time_m,
                pt.urgency_level AS primary_urgency,
                st1.urgency_level AS secondary1_urgency,
                st2.urgency_level AS secondary2_urgency,
                st3.urgency_level AS secondary3_urgency
            FROM patient p
            LEFT JOIN primary_triage pt ON p.No = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON p.No = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON p.No = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON p.No = st3.patient_no
            WHERE p.No IS NOT NULL
            ORDER BY CAST(p.No AS UNSIGNED) ASC
        r=   u'   登録された傷病者がいませんr>   z20251112_toriazi.xlsxreport_triage_r  FF0000)colorboldFFC00000B050000000)   赤   黄   緑   黒r   r   r   r   r   r   I1K1M1N1P1c                 S   s   ddddd}| | dS )Nr/  r0  r1  r2  )RYGr  r	  r  )r   mappingr)   r)   r*   get_triage_textj
  s   z-generate_triage_list.<locals>.get_triage_text   rp   r  ro   r  r  r  Dsecondary1_urgencyEsecondary2_urgencyFsecondary3_urgencyr   r	  r:  r   H
name_kanjiIr   Jr   Sr   r  Wr9  rV   )r   r  r  u#   PDF作成中にエラーが発生: r   r^   )r+   ra   rb   rs   r   rE   rF   rG   r  r  r  r  r   rk  r  r  fontr  r  re   r   r   r   r8   )r   r   ra   rk   patientsr  excel_filenamer  r   wsfont_redfont_yellow
font_green
font_blackfont_mapfirstr<  idxr  rz   triage_levelscolr   rq  r  r  r   r)   r)   r*   generate_triage_list9
  sv   

* 




rW  z/api/get_times/{patient_no}c              
      s   t d|   t }|jdd}zPz!d}||| f | }|r/|W W |  |  S tddd tyB } z|d }~w tyb } zt j	d|  d	| dd
 tdt
|dd }~ww |  |  w )Nz,Fetching specific time data for patient_no: TrY   z
            SELECT 
                patient_contact_h, 
                patient_contact_m, 
                arrival_hospital_h, 
                arrival_hospital_m 
            FROM time 
            WHERE patient_no = %s
        r=   z-Time data not found for the given patient_no.r>   z(Error fetching time data for patient_no r   r   r^   r  )r   r   ra   rk   	time_datar  r   r)   r)   r*   	get_times
  s.   		

rY  z/api/update_patient_data)aliasc           )         s  t d|   t }| }zQz3|d| f | }|r%|d nd }|r.|dng }|r}tjt	dd |D ]A}|j
r|t  tj|j
d  }tjt	|}t|d}t|j| W d    n1 smw   Y  |t d	|  q;|rd|nd }td
}t|}|d}g d}||  } |r| r|nd}!|d| f | sd}"||"| ||!|||||||	|
||||||| |f g d}#|#D ]}$|d|$ d| f q|d| |f |d| || |!f n:|rdnd}%d|% d}&||!|||||||	|
|||||g}'|r|'| |'|  ||&t|' |d|!| f |  dd|  ddW W |  |  S  t yb }( z|!  t"ddt#|( d d }(~(ww |  |  w )!NzUPSERT patient data for No: z%SELECT img FROM patient WHERE No = %sr   r   Tr   rp   r   r%   r   r   r   r   r   a  
                INSERT INTO patient (
                    No, name1, name2, age, gender, address, phone_number,
                    month, day, am_pm, time_h, time_m,
                    triage_officer_name1, triage_officer_name2,
                    transport_agency_name, receiving_hospital_name,
                    date_time, day_of_week, img
                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            )
r   r   r   r   r   r   r   r   r   r   r   r   r   r   z
, img = %sr	  af  
                UPDATE patient SET 
                    name1=%s, name2=%s, age=%s, gender=%s, address=%s, phone_number=%s,
                    month=%s, day=%s, am_pm=%s, time_h=%s, time_m=%s,
                    triage_officer_name1=%s, triage_officer_name2=%s,
                    transport_agency_name=%s, receiving_hospital_name=%s
                    z+
                WHERE No = %s
            r   rV   zPatient data saved (No=r   r   r^   rr   r>   )$r   r   r+   ra   rb   rc   r  rE   r   r   r   r   r   rF   r   rG   rK   r   r   r   r   r   r   r   r   r   r   r   r_   tupler   re   r   r   r   r8   ))ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ra   rz   existing_img_strr   r   r   rr  r   r   r   r   r   r   r   r   r   r   r   
img_clauser   paramsr   r)   r)   r*   update_patient_data\  s|   


	
"	


r_  z/api/complete_incidentc              
      s   t  }| }znzJd}||| f | r/td|  d dddW W |  |  S d}||| f td|  d	 |  dd
dW W |  |  S  tyv } z|	  t
d|  d|  tdt|dd }~ww |  |  w )Nz:SELECT id FROM sick_and_wounded_list WHERE patient_no = %szPatient z% is already in sick_and_wounded_list.rV   z'Already moved to Sick and Wounded List.r   z:INSERT INTO sick_and_wounded_list (patient_no) VALUES (%s)zMoved patient z. from Triage List to Sick List (Manual Button)z(Incident moved to Sick and Wounded List.zError completing incident for r   r^   r>   )r+   ra   rb   rc   r   r   re   r   r   r   r   r   r8   )r   r   ra   check_queryr   r   r)   r)   r*   complete_incident  s4   


ra  c                 C   s&   t jt|  d| d}t j|S )u   
    /home/air/sos-test/templates/ 폴더 안에
    prefix_patient_no.pdf (예: reportA_X.pdf) 가 존재하는지 확인
    r  r  r  )rQ   r   rF   r)   r)   r*   r    s   z/api/report_status_listc            
         sR  t  } | jdd}zzsd}|| | }g }|D ]W}|d}|r)t|ts/td qz|t	d|t	d|t	d|t	d	|d
}|
| W q tyr } ztd| d|  |
|ddddd
 W Y d}~qd}~ww |W W |  |   S  ty }	 ztjd|	 dd tddt|	 dd}	~	ww |  |   w )u   
    모든 환자에 대해 4가지 필수 보고서의 작성 현황을 반환합니다.
    (patient_no, A, B, C, Triage의 bool 상태 포함)
    TrY   zSELECT No FROM patientro   z0Skipping non-string/None patient_no found in DB.r  r  r  r  )r   r  r  r  r  z"File check failed for patient_no: z	. Error: FNz#Error fetching report status list: r   r^   r   r>   )r+   ra   rb   rs   rk  r  r8   r   r  r  r   r   r   re   r   )
r   ra   rk   patient_nosr  r  r   r   
file_errorr   r)   r)   r*   get_report_status_list  sL   





rd  z/api/get_time_data/{patient_no}c              
         t d|   t }|jdd}zLz-d}||| f | }|r2d|dW W |  |  S di dW W |  |  S  ty^ } zt jd| dd t	d	t
|d
d }~ww |  |  w )Nz"Fetching FULL time data for edit: TrY   z(SELECT * FROM time WHERE patient_no = %srV   r   r  zError fetching time data: r   r^   r>   r   r   r+   ra   rb   rc   re   r   r   r   r8   r   r   ra   rk   rz   r   r)   r)   r*   get_time_data_full-  ,   


ri  z(/api/get_call_received_data/{patient_no}c              
      re  )Nz+Fetching FULL call_received data for edit: TrY   z1SELECT * FROM call_received WHERE patient_no = %srV   rf  z#Error fetching call_received data: r   r^   r>   rg  rh  r)   r)   r*   get_call_received_dataE  rj  rk  z'/api/get_patient_info_data/{patient_no}c              
      re  )Nz*Fetching FULL patient_info data for edit: TrY   z0SELECT * FROM patient_info WHERE patient_no = %srV   rf  z"Error fetching patient_info data: r   r^   r>   rg  rh  r)   r)   r*   get_patient_info_data]  rj  rl  z)/api/get_contact_time_T_data/{patient_no}c              
      re  )Nz,Fetching FULL contact_time_T data for edit: TrY   z2SELECT * FROM contact_time_T WHERE patient_no = %srV   rf  z$Error fetching contact_time_T data: r   r^   r>   rg  rh  r)   r)   r*   get_contact_time_T_datau  rj  rm  z/api/get_memo_data/{patient_no}c           
   
      s.  t d|   t }|jdd}z{z\d}||| f | }|ra|d g d}|drR|d d}t|D ]\}}|	 rQ|d	 
d
| |	 d q:d|dW W |  |  S di dW W |  |  S  ty }	 zt jd|	 dd tdt|	dd }	~	ww |  |  w )Nz"Fetching FULL memo data for edit: TrY   z(SELECT * FROM memo WHERE patient_no = %srq  )rq  r   r   r   r   server_img_)rS   urlrV   rf  zError fetching memo data: r   r^   r>   )r   r   r+   ra   rb   rc   rk  r  r  r_   r   re   r   r   r   r8   )
r   r   ra   rk   rz   result_datapathsr  rF   r   r)   r)   r*   get_memo_data  s@   



rr  z)/api/get_before_arrival_data/{patient_no}c              
      re  )Nz,Fetching FULL before_arrival data for edit: TrY   z2SELECT * FROM before_arrival WHERE patient_no = %srV   rf  z$Error fetching before_arrival data: r   r^   r>   rg  rh  r)   r)   r*   get_before_arrival_data  rj  rs  z!/api/get_report_data/{patient_no}c              
      re  )Nz$Fetching FULL report data for edit: TrY   z*SELECT * FROM report WHERE patient_no = %srV   rf  zError fetching report data: r   r^   r>   rg  rh  r)   r)   r*   get_report_data  rj  rt  z"/api/get_patient_data/{patient_no}c           	   
      s4  t d|   t }|jdd}z~z_d}||| f | }|rd|drU|d d}g }|D ]}d|v rH|t	 dt
j|  q3|| q3d||d< d	|d
W W |  |  S d	i d
W W |  |  S  ty } zt jd| dd tdt|dd }~ww |  |  w )NzFetching patient data for: TrY   z#SELECT * FROM patient WHERE No = %sr   r   /home/r%   rV   rf  zError fetching patient data: r   r^   r>   )r   r   r+   ra   rb   rc   rk  r  r   r   rE   rF   r  rG   re   r   r   r   r8   )	r   r   ra   rk   rz   	raw_pathsconverted_pathsrF   r   r)   r)   r*   get_patient_data  s<   



rx  z)/api/get_primary_triage_data/{patient_no}c              
      s   t d|   t }|jdd}z=z d}||| f | }d|r&|ni dW W |  |  S  tyO } zt d|  t	dt
|d	d }~ww |  |  w )
Nz"Fetching primary triage data for: TrY   z2SELECT * FROM primary_triage WHERE patient_no = %srV   rf  zError fetching primary triage: r^   r>   rg  rh  r)   r)   r*   get_primary_triage_data  s$   

ry  
table_namec           	         s  t d| d|   t }|jdd}zhd| d}||| f | }|rp|drb|d d}g }|D ]!}| }|sBq9d	|v rU|	t
 d
tj|  q9|	| q9d||d< d|dW |  |  S di dW |  |  S |  |  w )Nz	Fetching z for: TrY   zSELECT * FROM z WHERE patient_no = %sr   r   ru  r%   rV   rf  )r   r   r+   ra   rb   rc   rk  r  r_   r   r   rE   rF   r  rG   re   )	r   rz  r   ra   rk   rz   rv  rw  rF   r)   r)   r*   get_secondary_triage_common  s6   





r{  z-/api/get_secondary_triage_1_data/{patient_no}c                       t | dI d H S )Nr   r{  r  r)   r)   r*   get_secondary_triage_1_data3     r~  z-/api/get_secondary_triage_2_data/{patient_no}c                    r|  )Nr   r}  r  r)   r)   r*   get_secondary_triage_2_data8  r  r  z-/api/get_secondary_triage_3_data/{patient_no}c                    r|  )Nr   r}  r  r)   r)   r*   get_secondary_triage_3_data=  r  r  z/api/patient_listc                     sr  t  } | jdd}zzkd}|| | }g }|D ]G}|d |d |d |d g}||d |d	 r8|d	 nd
|d rA|d nd
|d rJ|d nd|d rS|d nd|d r\|d nd|d qt|dW W |ro|  | rv|   S S  tjj	y } z&t
d|  tdt|iddW  Y d }~W |r|  | r|   S S d }~ww |r|  | r|   w w )NTrY   u  
            SELECT 
                l.patient_no,
                
                -- 患者基本情報 (patient_info)
                pi.patient_name2 as name,
                pi.patient_name1 as kana,
                pi.age,
                pi.gender,
                pi.chief_complaint,
                
                -- トリアージ情報（DBにはG, R, Y, Bで保存されています）
                pt.urgency_level as triage_1,
                st1.urgency_level as triage_2,
                st2.urgency_level as triage_3,
                st3.urgency_level as triage_4
                
            FROM list l
            -- データがなくてもlistは表示する必要があるため、LEFT JOINを使用
            LEFT JOIN patient_info pi ON l.patient_no = pi.patient_no
            LEFT JOIN primary_triage pt ON l.patient_no = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON l.patient_no = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON l.patient_no = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON l.patient_no = st3.patient_no
            
            ORDER BY l.date_time DESC
        triage_1triage_2triage_3triage_4r   r.   -kanar   r	  r   r3  )r   r.   r  r   r   r3  r  rC   rr   r   r^   rD   r?   )r+   ra   rb   rs   r   r   re   r&   r'   rf   r   r   r8   )rj   ra   sqlrw   r  rz   triage_datarl   r)   r)   r*   get_patient_listB  sX   


 

r  z/api/patient_detailc              
      sH  t  }|jdd}zzVd}||| f | }|s2tddiddW W |r*|  |r1|  S S |d r:|d nd	}|d
 rJ|d|d
  d7 }||d< t|dW W |rZ|  |ra|  S S  tjjy } z&t	
d|  tdt|iddW  Y d }~W |r|  |r|  S S d }~ww |r|  |r|  w w )NTrY   u$  
            SELECT 
                -- 1. 基本ヘッダー情報
                p.No as patient_no,
                pi.patient_name2 as name,
                pi.patient_name1 as kana,
                pi.age,
                pi.gender,
                
                pt.urgency_level as triage_1,
                st1.urgency_level as triage_2,
                st2.urgency_level as triage_3,
                st3.urgency_level as triage_4,

                -- 2. ピンクエリア
                cr.call_received_date,
                cr.call_method,
                cr.monthly_number,
                cr.request_location,
                cr.incident_type,
                
                CONCAT(t.call_received_h, ':', t.call_received_m) as time_call_received,
                CONCAT(t.dispatch_h, ':', t.dispatch_m) as time_dispatch,
                CONCAT(t.arrival_on_scene_h, ':', t.arrival_on_scene_m) as time_arrival_scene,
                CONCAT(t.patient_contact_h, ':', t.patient_contact_m) as time_contact,
                CONCAT(t.transport_start_h, ':', t.transport_start_m) as time_transport_start,
                CONCAT(t.patient_loaded_h, ':', t.patient_loaded_m) as time_loaded,
                CONCAT(t.depart_scene_h, ':', t.depart_scene_m) as time_depart,
                CONCAT(t.arrival_hospital_h, ':', t.arrival_hospital_m) as time_arrival_hospital,
                CONCAT(t.handover_to_doctor_h, ':', t.handover_to_doctor_m) as time_handover,
                CONCAT(t.return_from_site_h, ':', t.return_from_site_m) as time_return_site,
                CONCAT(t.return_to_station_h, ':', t.return_to_station_m) as time_return_station,
                CONCAT(t.transfer1_h, ':', t.transfer1_m) as time_transfer1,
                CONCAT(t.transfer2_h, ':', t.transfer2_m) as time_transfer2,
                t.dispatch_location,
                t.doctor_car_detail,

                -- 3. 黄色エリア
                CONCAT(pi.birth_year, '/', pi.birth_month, '/', pi.birth_day) as dob,
                pi.occupation,
                pi.address,
                pi.phone_number as tel,
                pi.companion_name,
                pi.relation,
                pi.contact_info,
                pi.urgency_level as pi_urgency,
                pi.onset_time,
                pi.contact_condition,
                pi.chief_complaint,
                pi.symptom_severity,
                pi.allergies,
                pi.medication_history,
                pi.medical_history,
                pi.last_meal_time,
                pi.primary_medical_institution,

                -- 4. 青エリア
                r.diagnosis_name,
                r.severity,
                r.hospital_selection_reason,
                CONCAT(r.distance_station_to_scene_L, '.', r.distance_station_to_scene_R, ' km') as dist_station_scene,
                CONCAT(r.distance_scene_to_hospital_L, '.', r.distance_scene_to_hospital_R, ' km') as dist_scene_hospital,
                CONCAT(r.distance_hospital_to_station_L, '.', r.distance_hospital_to_station_R, ' km') as dist_hospital_station,
                CONCAT(r.distance_station_roundtrip_L, '.', r.distance_station_roundtrip_R, ' km') as dist_roundtrip,
                r.first_doctor_name,
                r.related_organization,

                -- 5. 肌色エリア (contact_time_T)
                CONCAT(ct.contact_time_h, ':', ct.contact_time_m) as ct_time,
                ct.consciousness_jcs as ct_jcs,
                ct.consciousness_e as ct_e,
                ct.consciousness_v as ct_v,
                ct.consciousness_m as ct_m,
                CONCAT(ct.respiration_rate, ' 回/分') as ct_respiration,
                ct.respiration_condition as ct_respiration_cond,
                CONCAT(ct.pulse_rate, ' 回/分') as ct_pulse,
                ct.pulse_1 as ct_pulse_1,
                ct.pulse_2 as ct_pulse_2,
                CONCAT(ct.temperature_L, '.', ct.temperature_R, ' ℃') as ct_temp,
                ct.temperature_text as ct_temp_text,
                CONCAT(ct.bp_right_1, '/', ct.bp_right_2, ' mmHg') as ct_bp_right,
                CONCAT(ct.bp_left_1, '/', ct.bp_left_2, ' mmHg') as ct_bp_left,
                
                
                CONCAT(ct.spo2_left, ' % -> ', ct.spo2_right, ' %') as ct_spo2,
                
                CONCAT(ct.oxygen_flow_rate, ' L/分') as ct_oxygen,
                ct.oxygen_use as ct_oxygen_use,
                ct.ecg_status as ct_ecg,
                ct.auscultation as ct_auscultation,
                CONCAT(ct.pupil_right_size, ' mm / ', ct.pupil_right_reaction) as ct_pupil_right,
                CONCAT(ct.pupil_left_size, ' mm / ', ct.pupil_left_reaction) as ct_pupil_left,
                ct.gaze_deviation,
                ct.visual_impairment,
                ct.palpebral_conjunctiva,
                ct.nystagmus,
                ct.convulsion,
                ct.affected_area_condition,
                ct.skin_condition,
                ct.paralysis,
                ct.paralysis_area,
                ct.vomit,
                CONCAT(ct.vomit_count, ' 回') as ct_vomit_count,
                ct.diarrhea,
                ct.first_aid,
                ct.first_aid_other,
                ct.transport_position,
                ct.adl,

                -- 6. 緑エリア (before_arrival)
                CONCAT(ba.contact_time_h, ':', ba.contact_time_m) as ba_time,
                ba.consciousness_jcs as ba_jcs,
                ba.consciousness_e as ba_e,
                ba.consciousness_v as ba_v,
                ba.consciousness_m as ba_m,
                CONCAT(ba.respiration_rate, ' 回/分') as ba_respiration,
                ba.respiration_condition as ba_respiration_cond,
                CONCAT(ba.pulse_rate, ' 回/分') as ba_pulse,
                ba.pulse_1 as ba_pulse_1,
                ba.pulse_2 as ba_pulse_2,
                CONCAT(ba.temperature_L, '.', ba.temperature_R, ' ℃') as ba_temp,
                ba.temperature_text as ba_temp_text,
                CONCAT(ba.bp_right_1, '/', ba.bp_right_2, ' mmHg') as ba_bp_right,
                CONCAT(ba.bp_left_1, '/', ba.bp_left_2, ' mmHg') as ba_bp_left,
                
               
                CONCAT(ba.spo2_left, ' % -> ', ba.spo2_right, ' %') as ba_spo2,
                
                CONCAT(ba.oxygen_flow_rate, ' L/分') as ba_oxygen,
                ba.oxygen_use as ba_oxygen_use,
                ba.ecg_status as ba_ecg,
                ba.auscultation as ba_auscultation,
                
                -- メモ
                m.text as memo_text,

                -- 7. 画像パス
                p.img as img_1,
                st1.img as img_2,
                st2.img as img_3,
                st3.img as img_4

            FROM list l
            LEFT JOIN patient p ON l.patient_no = p.No
            LEFT JOIN patient_info pi ON l.patient_no = pi.patient_no
            LEFT JOIN call_received cr ON l.patient_no = cr.patient_no
            LEFT JOIN time t ON l.patient_no = t.patient_no
            LEFT JOIN report r ON l.patient_no = r.patient_no
            LEFT JOIN contact_time_T ct ON l.patient_no = ct.patient_no
            LEFT JOIN before_arrival ba ON l.patient_no = ba.patient_no
            LEFT JOIN memo m ON l.patient_no = m.patient_no
            
            LEFT JOIN primary_triage pt ON l.patient_no = pt.patient_no
            LEFT JOIN secondary_triage_1 st1 ON l.patient_no = st1.patient_no
            LEFT JOIN secondary_triage_2 st2 ON l.patient_no = st2.patient_no
            LEFT JOIN secondary_triage_3 st3 ON l.patient_no = st3.patient_no
            
            WHERE l.patient_no = %s
        r   zPatient not foundr=   r  re  r	  rf  (r   first_aid_fullrC   rr   r^   )r+   ra   rb   rc   r   re   r&   r'   rf   r   r   r8   )r   rj   ra   r  rz   first_aid_textrl   r)   r)   r*   get_patient_detail  sP    !

 

r  z/api/login/firec                    s   t  }|jdd}z6d}||| j| jf | }|r0td|d ddW |  |  S tdd	id
dW |  |  S |  |  w )NTrY   zESELECT * FROM ambulance_teams WHERE team_code = %s AND call_name = %sLogin Successr[   )rW   r!   rC   rW   Login Failed  r  r+   ra   rb   rS   r"   rc   r   re   rT   rj   ra   r  r!   r)   r)   r*   
login_fireM  s    


r  z/api/login/medicalc                    s   t  }|jdd}z3d}||| j| jf | }|r-tddidW |  |  S tddidd	W |  |  S |  |  w )
NTrY   zASELECT * FROM medical_users WHERE login_id = %s AND password = %srW   r  rC   r  r  r  r  r  r)   r)   r*   login_medical_  s    


r  z/api/complete_sick_woundedc              
      s   t  }| }z5zd}||| f |  dddW W |  |  S  ty= } z|  tdt|dd }~ww |  |  w )NzHUPDATE sick_and_wounded_list SET complete_list = 1 WHERE patient_no = %srV   z3Incident completed (sick_and_wounded_list updated).r   r^   r>   )	r+   ra   rb   r   re   r   r   r   r8   )r   r   ra   rk   r   r)   r)   r*   complete_sick_woundedr  s"   

r  )mfastapir   r   r   r   r   pydanticr   typingr   r	   r
   mysql.connectorr&   rE   r   r   r  openpyxl.drawing.imager   openpyxl.stylesr   fastapi.middleware.corsr   r   r   fastapi.staticfilesr   fastapi.responsesr   r   r   logging.handlersr   basicConfigINFOappadd_middlewareenvironrk  r   r   r   r   r`   r   r   r  r+   mountr1   rO   rP   rR   postrm   r~   r8   r   r   r  r  r'  r<  rp  rs  ru  r  r  rv   r  r  r  r  r  r  r  r  r  boolr  r  r
  r  r  r'  rW  rY  r_  ra  rd  ri  rk  rl  rm  rr  rs  rt  rx  ry  r{  r~  r  r  r  r  r  r  r  r)   r)   r)   r*   <module>   s   			

,.&	
 *	
~	
p0	
D	
 !"#$%&'()*+,-v+	
a	
4	
?	
?	
>
,
)
$   <  ~  c ?	
o"
3 ! J @ 