import pandas as pd import gradio as gr from datetime import datetime # 엑셀 데이터 처리 함수 def process_excel_files(member_file, order_file, 작성일자): try: # 회원정보 및 주문내역 파일 읽기 member_df = pd.read_excel(member_file) order_df = pd.read_excel(order_file) # 열 이름 매핑 order_df.rename( columns={ '주문자ID': '아이디', '총 결제금액': '총 결제금액', '예치금(최종)': '예치금(최종)', '총 주문금액': '주문금액' }, inplace=True ) # 열 이름 확인 required_member_columns = ['아이디', '이름', '상호', '사업자번호', '이메일'] required_order_columns = ['주문번호', '아이디', '총 결제금액', '예치금(최종)', '주문금액'] missing_member_columns = [col for col in required_member_columns if col not in member_df.columns] missing_order_columns = [col for col in required_order_columns if col not in order_df.columns] if missing_member_columns: return f"에러 발생: '회원정보 파일'에 누락된 열: {missing_member_columns}. 파일 열 이름: {list(member_df.columns)}" if missing_order_columns: return f"에러 발생: '주문내역 파일'에 누락된 열: {missing_order_columns}. 파일 열 이름: {list(order_df.columns)}" # 주문금액 열에 '총 결제금액 + 예치금(최종)' 합계를 계산 order_df['주문금액'] = order_df['총 결제금액'] + order_df['예치금(최종)'] # 주문번호 기준 중복 제거 및 주문금액이 0인 행 삭제 order_df.drop_duplicates(subset="주문번호", inplace=True) order_df = order_df[order_df['주문금액'] != 0] # 동일 아이디의 주문금액 합산하여 주문합계 열 생성 order_sum = order_df.groupby("아이디")['주문금액'].sum().reset_index() order_sum.rename(columns={'주문금액': '주문합계'}, inplace=True) order_df = pd.merge(order_df, order_sum, on="아이디", how="left") # 아이디 열 기준 중복 제거 (첫 번째 행 유지) order_df = order_df.drop_duplicates(subset="아이디", keep="first") # 회원정보와 주문내역 병합 (아이디 기준) merged_df = pd.merge(order_df, member_df, on="아이디", how="left") # 아이디가 동일한 행에만 값 입력 for idx in order_df.index: current_id = order_df.loc[idx, '아이디'] matching_row = merged_df[merged_df['아이디'] == current_id] if not matching_row.empty: order_df.loc[idx, '이름'] = matching_row.iloc[0]['이름'] order_df.loc[idx, '상호'] = matching_row.iloc[0]['상호'] order_df.loc[idx, '사업자번호'] = matching_row.iloc[0]['사업자번호'] order_df.loc[idx, '이메일'] = matching_row.iloc[0]['이메일'] # 수정된 주문내역 파일 저장 updated_order_file_path = f"주문내역(수정)_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx" order_df.to_excel(updated_order_file_path, index=False, header=['아이디'] + list(order_df.columns[1:])) # 수정된 주문내역 파일 다시 읽기 updated_order_df = pd.read_excel(updated_order_file_path) # 결과 엑셀 생성 (수정된 주문내역 값을 기반으로 생성) result = pd.DataFrame() result['A열'] = ['01'] * len(updated_order_df) result['B열'] = [작성일자] * len(updated_order_df) result['C열'] = updated_order_df['사업자번호'] result['D열'] = [''] * len(updated_order_df) result['E열'] = updated_order_df['상호'] result['F열'] = updated_order_df['이름'] result['G열'] = [''] * len(updated_order_df) result['H열'] = [''] * len(updated_order_df) result['I열'] = [''] * len(updated_order_df) result['J열'] = updated_order_df['이메일'] result['K열'] = [''] * len(updated_order_df) result['L열'] = (updated_order_df['주문합계'] / 1.1).round().astype(int) # 공급가액 (반올림하여 정수로 변환) result['M열'] = (updated_order_df['주문합계'] - result['L열']).round().astype(int) # 부가세 (반올림하여 정수로 변환) result['N열'] = [''] * len(updated_order_df) result['O열'] = [str(작성일자)[-2:]] * len(updated_order_df) result['P열'] = ['주방용품 외'] * len(updated_order_df) # 나머지 공란 열 채우기 (Q열부터 AY열까지) 공란_열 = [chr(i) + '열' for i in range(ord('Q'), ord('Z') + 1)] # Q~Z 공란_열 += [f"A{chr(i)}열" for i in range(ord('A'), ord('Y') + 1)] # AA~AY for col in 공란_열: result[col] = [''] * len(updated_order_df) # AY열 설정 result['AY열'] = ['01'] * len(updated_order_df) # 결과 파일 저장 result_file = f"결과_세금계산서_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx" result.to_excel(result_file, index=False) return result_file, updated_order_file_path except Exception as e: return f"에러 발생: {str(e)}" # Gradio 인터페이스 구성 def generate_excel(member_file, order_file, 작성일자): output_files = process_excel_files(member_file.name, order_file.name, 작성일자) if isinstance(output_files, str): # 에러 메시지 반환 return output_files, None else: return output_files # (result_file, updated_order_file) # Gradio UI with gr.Blocks() as app: gr.Markdown("### 세금계산서 엑셀 파일 생성기") with gr.Row(): member_file = gr.File(label="회원정보 엑셀 파일 업로드", file_types=[".xlsx"]) order_file = gr.File(label="주문내역 엑셀 파일 업로드", file_types=[".xlsx"]) 작성일자 = gr.Textbox(label="작성일자 (YYYYMMDD)", placeholder="예: 20250101") generate_btn = gr.Button("엑셀 생성") with gr.Row(): result_file_output = gr.File(label="결과 세금계산서 파일 다운로드") updated_order_file_output = gr.File(label="주문내역(수정) 파일 다운로드") generate_btn.click(generate_excel, inputs=[member_file, order_file, 작성일자], outputs=[result_file_output, updated_order_file_output]) app.launch()