본문 바로가기

Study Information Technology

자동 송장 생성 스크립트 구축하기

728x90
반응형

자동 송장 생성 스크립트 구축하기

Overview

소프트웨어 개발에서 송장 생성은 특히 재무 관리와 고객 관계 관리(CRM)에서 중요한 역할을 합니다. 이 글에서는 판매 데이터와 고객 정보를 기반으로 송장을 자동으로 생성하는 스크립트를 구축하는 방법에 대해 자세히 설명하겠습니다. Python 언어를 사용하여 예제 코드를 통해 실질적인 구현 방법을 보여드리겠습니다.

1. 프로젝트 환경 설정

1.1. 필요한 라이브러리

먼저, 필요한 라이브러리를 설치해야 합니다. 아래의 라이브러리를 사용할 예정입니다:

  • pandas: 데이터 처리 및 분석을 위해 사용됩니다.
  • jinja2: 템플릿을 사용하여 송장을 생성합니다.
  • pdfkit: HTML 파일을 PDF로 변환하기 위해 사용됩니다.
pip install pandas jinja2 pdfkit

1.2. 환경 설정

PDFKit을 사용하기 위해서는 추가적인 설정이 필요합니다. PDFKit은 wkhtmltopdf라는 도구를 사용하여 HTML을 PDF로 변환합니다. wkhtmltopdf를 설치한 후, 시스템 PATH에 추가해야 합니다.

예시 (Windows 기준)

  1. wkhtmltopdf 다운로드 페이지에서 설치 파일을 다운로드합니다.
  2. 설치 후 C:\Program Files\wkhtmltopdf\bin 디렉토리를 시스템 PATH에 추가합니다.

2. 데이터 구조

2.1. 판매 데이터와 고객 정보

데이터는 CSV 파일 형식으로 준비합니다. 다음은 예시 CSV 파일의 구조입니다.

sales_data.csv

customer_id,customer_name,product,quantity,price
1,홍길동,상품A,2,50000
2,김철수,상품B,1,30000
1,홍길동,상품C,3,15000

customer_info.csv

customer_id,customer_address,customer_email
1,서울특별시 강남구,example1@example.com
2,부산광역시 해운대구,example2@example.com

3. 송장 생성 스크립트

3.1. 기본 코드 구조

아래의 코드는 CSV 파일에서 데이터를 읽고, Jinja2 템플릿을 사용하여 송장을 생성하는 과정을 포함합니다.

import pandas as pd
from jinja2 import Environment, FileSystemLoader
import pdfkit

# 데이터 불러오기
sales_data = pd.read_csv('sales_data.csv')
customer_info = pd.read_csv('customer_info.csv')

# 고객 정보와 판매 데이터를 결합
invoice_data = sales_data.merge(customer_info, on='customer_id')

# 송장 템플릿 로드
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('invoice_template.html')

# 송장 생성 및 PDF로 변환
for customer_id, group in invoice_data.groupby('customer_id'):
html_output = template.render(customer=group.iloc[0], sales=group)
pdfkit.from_string(html_output, f'invoice_{customer_id}.pdf')

3.2. 송장 템플릿 (invoice_template.html)

Jinja2를 사용한 HTML 템플릿의 예시는 다음과 같습니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Invoice for {{ customer.customer_name }}</title>
    <style>
      body { font-family: Arial, sans-serif; }
      table { width: 100%; border-collapse: collapse; }
      th, td { border: 1px solid #ddd; padding: 8px; }
      th { background-color: #f2f2f2; }
    </style>
  </head>
  <body>
    <h1>Invoice</h1>
    <p>고객명: {{ customer.customer_name }}</p>
    <p>주소: {{ customer.customer_address }}</p>
    <p>이메일: {{ customer.customer_email }}</p>

    <table>
      <tr>
        <th>상품</th>
        <th>수량</th>
        <th>가격</th>
        <th>합계</th>
      </tr>
      {% for sale in sales %}
      <tr>
        <td>{{ sale.product }}</td>
        <td>{{ sale.quantity }}</td>
        <td>{{ sale.price }}</td>
        <td>{{ sale.quantity * sale.price }}</td>
      </tr>
      {% endfor %}
    </table>

    <h2>총합계: {{ sales['quantity'].sum() * sales['price'].sum() }}</h2>
  </body>
</html>

4. 에러 처리 및 예외 상황

4.1. 파일 읽기 오류

CSV 파일을 읽는 과정에서 파일이 없거나 잘못된 형식일 경우, 다음과 같은 에러가 발생할 수 있습니다.

FileNotFoundError: [Errno 2] No such file or directory: 'sales_data.csv'

이 경우, 파일 경로를 확인하고 파일이 존재하는지 확인해야 합니다. 아래와 같이 예외 처리를 추가할 수 있습니다.

try:
sales_data = pd.read_csv('sales_data.csv')
except FileNotFoundError:
print("판매 데이터 파일이 존재하지 않습니다.")

4.2. PDF 변환 오류

PDF로 변환하는 과정에서 wkhtmltopdf가 설치되지 않았거나 PATH가 잘못 설정된 경우, 다음과 같은 오류가 발생할 수 있습니다.

OSError: No wkhtmltopdf executable found

이 경우, wkhtmltopdf가 올바르게 설치되었는지 확인하고, 시스템 PATH에 추가했는지 점검해야 합니다.

5. 결론

위의 과정을 통해 판매 데이터와 고객 정보를 기반으로 송장을 자동으로 생성하는 스크립트를 구축할 수 있습니다. 이 스크립트는 기업의 재무 관리에 큰 도움이 될 수 있으며, 수작업으로 인한 오류를 줄일 수 있습니다. 필요에 따라 추가적인 기능(예: 이메일 발송 등)을 구현하여 확장할 수도 있습니다.

참고문서

728x90
반응형