php 파일에서 console에 로고 찍는 방법
 echo "<script>console.log('consoletest : ". var_dump($data). "');</script>";

var_dump를 통해 데이터 형식과 변수의 값까지 확인 할 수 있다.

 

배열을 문자열로, 문자열을 배열로
implode(array, '구분자');
emplode('구분자', string);

implode를 사용하면 배열의 값을 구분자로 이어 문자열로 반환한다.

emplode를 사용하면 문자열을 구분자로 구분지어 각각 배열에 저장한다.

 

explode() expects parameter 2 to be string array given: error

이 에러는 explode함수에서 두번째 파라미터의 값이 문자열이 아닐 경우에 발생한다.

문자열이라고 생각한 변수인데 문제가 발생한다면, var_dump를 통해 변수를 확인해보자.

array(1) => {'1,2,3'} 과 같은 형태로 저장되어 있을 수도 있다.

 

html의 checkbox 등에서 같은 이름을 키로 여러 데이터 읽기
<input type="checkbox" name="idxList[]" value="1">
<input type="checkbox" name="idxList[]" value="2">
<input type="checkbox" name="idxList[]" value="3">

name 태그는 id 태그와 달리 중복 값이 가능하다.

위와 같이 []를 사용하여 이름을 지정하고 다음과 같은 방식으로 읽어 들이면 $idx값은 배열로 읽어들임. (post뿐만 아니라 get도 가능)

$idx = $this->input->post('idxList');

다른 방식은 다음과 같다. $_POST 변수를 사용하면, 특정 값이 아닌 모든 post로 전달되는 값은 배열로 읽어온다.

$idx = $_POST['idxList'];
for ($i = 0; $i < sizeof($idx); i++){
	echo $idx[$i];
}

 

참고

php 와 html 등의 코드를 간단하게 웹에서 테스트 가능.

 

PHP Tutorial

PHP Tutorial PHP is a server scripting language, and a powerful tool for making dynamic and interactive Web pages. PHP is a widely-used, free, and efficient alternative to competitors such as Microsoft's ASP. PHP 7 is the latest stable release. Start learn

www.w3schools.com

코드이그나이터

 

Query Builder Class ‐ 코드이그나이터 3.0 한글매뉴얼

TRUE on success, FALSE on failure

www.ciboard.co.kr

 

세부내용

아래의 Python으로 작성한 이전의 엑셀 양식 작성 프로그램을 웹사이트로 배포하였다.

( ※ 프로그램을 작동시킨 날짜가 양식의 작성일자에 들어갔으나 ERP의 수금일자가 작성일자가 되도록 수정하였음)

 

[개발] 전자세금계산서 엑셀 양식 작성 프로그램: Python

전자세금계산서 엑셀 양식 작성 프로그램 ERP 시스템(전사적 자원 관리 시스템)을 통해 다운로드한 엑셀 파일을 가지고 전자세금계산서 발급을 위한 엑셀 양식 파일을 채우는 프로그램을 만들기로 했다. 기존에 사..

codingslime.tistory.com

 

사이트
 

전자세금계산서 발행

 

mighty-cove-94866.herokuapp.com

 

코드
 

hynjin/runForHeroku

using flask web server. Contribute to hynjin/runForHeroku development by creating an account on GitHub.

github.com

 

사용방법

위의 주소로 접속하면 위와 같은 단순한 UI의 사이트에 접속할 수 있다.

전자세금계산서 발행을 위한 웹 사이트로 ERP 프로그램에서 다운로드 받은 엑셀 파일에서 [사업자번호, 수금날짜, 법인명, 대표자, 업태, 종목, 사업장주소, 공급가액, 세액] 항목과 별도의 이메일 파일에서 [사업자번호, 이메일주소]를 사용하여 전자세금계산서 양식을 채운 엑셀 파일을 다운할 수 있다.

 

  • 모든 파일은 xlsx 파일로 업로드 해야하며 xlsx 파일로 다운로드한다. (xls 파일 불가능)
  • ERP 파일 (업로드)
    - [사업자번호, 수금날짜, 법인명, 대표자, 업태, 종목, 사업장주소, 공급가액, 세액] 항목이 반드시 포함되어 있어야함
    - 사업자명이나 수금액이 공란일 경우 세금계산서에 작성하지 않음

    - 첫번째 행은 공란이어야함(두번째 행에서부터 파일 시작해야함)
  • 이메일 파일 (업로드)
    -
    [사업자번호, 이메일주소] 항목이 필요하나 필수는 아님
    - 이메일 파일에 정보가 없을 경우 세금계산서 항목에 공란으로 작성
  • 전자세금계산서 파일 (다운로드)
    - ERP 파일와 이메일 파일을 모두 업로드 한 후 [다운로드] 버튼을 눌러 다운로드 할 수 있음
    - 필수 작성 항목인 [전자(세금)계산서 종류, 작성일자, 공급받는자 등록번호, 공급받는자 상호, 공급받는자 성명, 공급가액, 세액, 일자1, 공급가액1, 세액1, 영수(01)청구(02)] 항목을 각각 ERP 파일에서 ["01(영수)", 수금일자, 사업자번호, 법인명, 대표자, 공급가액, 세액, 수금일자의 일자, 공급가액, 세액, "01(영수)"] 항목으로 작성
    - 필수 작성 항목 이외에도 [공급받는자 사업장주소, 공급받는자 업태, 공급받는자 종목] 항목을 각각 ERP 파일의
    - [공급받는자 이메일1] 항목은 별도의 이메일 파일에서 사업자번호와 ERP 파일의 사업자번호가 일치하는 이메일 주소로 작성
    - [품목1] 항목은 세금계산서 작성 "월(다운로드한 월) + CCTV 용역료"으로 작성
  • 파일이나 파일 내의 항목이 잘못 된 경우 'Internal Server Error'가 발생할 수 있다. 이 경우 새로고침하여 웹사이트에 재접속 한 후에 파일의 상태를 확인한 후 다시 시도하면 된다.
  • 이 프로그램은 특정 회사의 요청으로 개발 되었으며 그로 인해 [전자(세금)계산서 종류, 품목1, 영수(01)청구(02)] 항목은 특정 회사의 요구사항에 맞게 자동 작성함

웹 프로그램을 개발하고 테스트하는 데는 아무런 문제없지만 다른 사람이 쓸 수 있도록 배포하고자 할 경우에 웹서버를 운영하는 것에 어려움이 있다. 직접 서버를 운영하려면 항상 서버용 컴퓨터가 켜져 있어야 하기 때문에 부담스러운 일이다. 다행히 깃허브를 이용하면 무료로 웹호스팅 기능을 사용할 수 있다는 걸 알게 되었다.

 

방법

우선 Repositories를 새로 만들어야한다. 'New' 버튼을 눌러 새로운 저장소를 만든다.

다음과 같이 저장소 이름을 정한 다음 'Create repository' 버튼을 눌러 저장소를 생성한다.

웹 서버가 클라이언트에게 보여줄 페이지가 필요하니 html 파일을 저장소에 업로드하기 위해 'Upload files' 버튼을 누른다.

다음과 같은 내용의 index.html 파일을 업로드 한다.

<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
      <h1>
        Hello
      </h1>
    </body>
</html>

 깃허브에서 변경된 사항을 업로드하기 위해서는 변경 사항을 설명하는 comment를 쓰고 'Commit Changes' 버튼을 눌러 변경 사항을 저장한다.

html 파일을 업로드한 후에 'Settings' 버튼을 누른다.

세팅 페이지에서 스크롤을 아래로 내리면 다음과 같이 GitHub Pages라는 부분을 볼 수 있다. None이라고 쓰인 부분을 누른다.

master branch 부분을 누른다.

성공적으로 등록이 된 경우 다음과 같이 주소가 나타난다.

주소를 통해 내가 올린 index.html 파일의 내용을 확인할 수 있다. 

 

https://hynjin.github.io/testForWebHosting/

 

hynjin.github.io

 

 

 

 

도메인 이름 변경

도메인을 <username>.github.io 외에 다른 것으로 하고자 할 경우 아래와 같은 방법이 있다.

생활코딩에서 이에 대한 자세한 설명을 제공하고 있다.

 

github pages에 도메인 연결하기 - 생활코딩

수업소개 나의 서버가 아닌 타사의 서비스를 이용하는 경우에 그 서비스에 도메인 이름을 연결시키는 방법을 알아봅니다. 티스토리나 카페 24 쇼핑몰과 같은 서비스에도 적용되는 방법입니다.  강의

opentutorials.org

 

깃허브 도메인 이름 변경 방법 설명

 

Managing a custom domain for your GitHub Pages site - GitHub Help

GitHub.com GitHub Pages Configuring a custom domain for your GitHub Pages site Managing a custom domain for your GitHub Pages site Managing a custom domain for your GitHub Pages site You can set up or update certain DNS records and your repository settings

help.github.com

깃허브 도메인 이름 변경에 문제가 생겼을 경우

 

Troubleshooting custom domains and GitHub Pages - GitHub Help

GitHub.com GitHub Pages Configuring a custom domain for your GitHub Pages site Troubleshooting custom domains and GitHub Pages Troubleshooting custom domains and GitHub Pages You can check for common errors to resolve issues with custom domains or HTTPS fo

help.github.com

단점

기본적으로 깃허브의 웹호스팅은 정적(static) 사이트만을 지원한다. 즉, php나 python 같은 언어로 웹사이트를 구현한 경우 '405 Not Allowed'와 같은 에러를 마주하게 된다.

이러한 문제를 해결하기 위해 깃허브는 지킬(Jekyll)을 built-in support를 추천한다. 이는 Ruby로 된 웹사이트에 특히 적합하다.

 

About GitHub Pages and Jekyll - GitHub Help

GitHub.com GitHub Pages Setting up a GitHub Pages site with Jekyll About GitHub Pages and Jekyll About GitHub Pages and Jekyll Jekyll is a static site generator with built-in support for GitHub Pages. GitHub Pages is available in public repositories with G

help.github.com

파이썬의 경우에는 펠리칸(Pelican)이 적합한 편이라고 한다. 다음 사이트에서 펠리칸의 설치과 사용 방법에 대해 자세히 알 수 있다.

 

Run your blog on GitHub Pages with Python

Create a blog with Pelican, a Python-based blogging platform that works well with GitHub.

opensource.com

 

참고

생활코딩, 웹호스팅(github pages), https://opentutorials.org/course/3084/18891

전자세금계산서 엑셀 양식 작성 프로그램

ERP 시스템(전사적 자원 관리 시스템)을 통해 다운로드한 엑셀 파일을 가지고 전자세금계산서 발급을 위한 엑셀 양식 파일을 채우는 프로그램을 만들기로 했다. 기존에 사람이 직접 전자세금계산서 발급을 위해서 엑셀 양식을 채우는 과정에서 빈번한 실수가 발생하여 이를 방지하기 위해 프로그램을 개발할 필요성이 있었다.

따라서, 기존에 회사에서 발급 양식을 채우던 방식 그대로 꼭 필수 항목이 아니더라도 양식을 채우기로 했다.

 

고려사항
  • 내가 받은 ERP 시스템에서 다운로드한 엑셀 파일에는 이메일 주소가 나와있지 않음
  • 최대 1000건의 엑셀 데이터를 다루어야함
  • 프로그래밍을 할 줄 모르는 사용자 고려 (프로그램을 실행하는 과정을 최대한 단순하게)
  • openpyxl 라이브러리는 xls 확장자를 지원하지 않음
  • 전자세금계산서 발급 양식은 어떤 경우에도 변경하지 않음
해결방안
  • 별도의 이메일 주소가 담긴 엑셀 파일을 준비
  • 파이썬의 openpyxl 라이브러리 사용
  • 쉽게 프로그램을 사용할 수 있도록 별도의 웹서버 운영 (진행 중)
  • ERP 시스템으로 xlsx 파일을 받을 수 있는지 확인, xlsx 파일로 전자세금계산서 발행이 가능한지 확인 (진행 중)
  • 전자세금계산서 발급 양식은 불변하므로 별도의 머릿글 행(열 이름)을 처리하지 않음
사용 언어
  • Python
데이터

프로그램 테스트를 위해 사용한 데이터는 다음과 같다.

erp.xlsx
email.xlsx
origin.xlsx
origin.xlsx
0.08MB
email.xlsx
0.01MB
erp.xlsx
0.03MB

 

코드
#!/usr/bin/env python
# coding: utf-8
import openpyxl
import os
import datetime

erpWB = openpyxl.load_workbook('data/erp.xlsx')
emailWB =  openpyxl.load_workbook('data/email.xlsx')
taxWB = openpyxl.load_workbook('data/origin.xlsx')

erpWS = erpWB[erpWB.sheetnames[0]]
emailWS = emailWB.active
taxWS = taxWB[taxWB.sheetnames[0]]

# 이메일 사업자 번호를 키로 해쉬테이블
emailAddress = dict()
for i in range(2,emailWS.max_row+1):
    emailAddress[emailWS[i][0].value] = emailWS[i][1].value
    print(emailWS[i][0].value,emailAddress[emailWS[i][0].value])

# erp 수금 기록 열 이름
# 사업자번호, 법인명, 대표자, 업태, 종목, 사업장주소, 공급가액, 세액 사용
erpDic = {'사업자번호':0,'법인명':1,'대표자':2,'업태':3,'종목':4,'사업장 주소':5,'공급가액':6,'세액':7}
erpHash = dict() #열 이름을 키값으로 갖는 셀 위치
erpName = []
for c in range (0,erpWS.max_column):
    erpHash[erpWS[2][c].value] = erpWS[2][c].coordinate.strip('0123456789')
    print(erpWS[2][c].value,erpHash[erpWS[2][c].value])

erpVal = []
for i in range (3,erpWS.max_row+1):
    temp = []
    if erpWS[erpHash['사업자번호']+str(i)].value!=None and erpWS[erpHash['수금액']+str(i)].value!=None: #사업자명이나 수금액이 없다면 저장하지 않음
        for j in erpDic:
            if j=='대표자': #대표자 이름 전처리
                temp.append(erpWS[erpHash[j]+str(i)].value.strip(' '))
            else:
                temp.append(erpWS[erpHash[j]+str(i)].value)
        if temp[0] in emailAddress.keys(): #저장된 이메일 주소가 없을 경우 None
            temp.append(emailAddress[temp[0]])
        else:
            temp.append(None)
        erpVal.append(temp)
        print(temp)

# 전자세금계산서 저장을 위한 이차원 배열
rowVal = []
dt = datetime.datetime.now();
for i in range (len(erpVal)):
    temp = []
    for j in range (taxWS.max_column):
        if j==0:
            temp.append('01')
        elif j==1:
            temp.append(dt.strftime("%Y%m%d"))
        elif j==2:
            temp.append(erpVal[i][erpDic['사업자번호']])
        elif j==4:
            temp.append(erpVal[i][erpDic['법인명']])
        elif j==5:
            temp.append(erpVal[i][erpDic['대표자']])
        elif j==6:
            temp.append(erpVal[i][erpDic['사업장 주소']])
        elif j==7:
            temp.append(erpVal[i][erpDic['업태']])
        elif j==8:
            temp.append(erpVal[i][erpDic['종목']])
        elif j==9:
            temp.append(erpVal[i][8]) #이메일
        elif j==11:
            temp.append(erpVal[i][erpDic['공급가액']])
        elif j==12:
            temp.append(erpVal[i][erpDic['세액']])
        elif j==14:
            temp.append(dt.strftime("%d"))
        elif j==15:
            temp.append(dt.strftime("%m")+'월 CCTV용역료')
        elif j==19:
            temp.append(erpVal[i][erpDic['공급가액']])
        elif j==20:
            temp.append(erpVal[i][erpDic['세액']])
        elif j==50:
            temp.append('01') #영수01 청구02
        else:
            temp.append('')
    rowVal.append(temp)
    print(temp)

for i in range (len(rowVal)):
    for j in range (taxWS.max_column):
        taxWS.cell(i+7,j+1,rowVal[i][j])
        print(rowVal[i][j])

taxWB.save('data/test.xlsx')

erpWB.close()
emailWB.close()
taxWB.close()

 

주피터 노트북으로 실행
taxInvoice-Copy1
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [2]:
import openpyxl
import os
import datetime
In [3]:
erpWB = openpyxl.load_workbook('data/erp.xlsx')
emailWB =  openpyxl.load_workbook('data/email.xlsx')
taxWB = openpyxl.load_workbook('data/origin.xlsx')
In [4]:
erpWS = erpWB[erpWB.sheetnames[0]]
emailWS = emailWB.active
taxWS = taxWB[taxWB.sheetnames[0]]
In [5]:
emailWS[8][0].value
In [6]:
# 이메일 사업자 번호를 키로 해쉬테이블
emailAddress = dict()
for i in range(2,emailWS.max_row+1):
    emailAddress[emailWS[i][0].value] = emailWS[i][1].value
    print(emailWS[i][0].value,emailAddress[emailWS[i][0].value])
1111111111 java@java.com
2222222222 ccc@ccc.com
3333333333 data@base.com
4444444444 python@python.com
5555555555 ruby@ruby.com
6666666666 perl@cperl.com
None None
In [7]:
# erp 수금 기록 열 이름
# 사업자번호, 법인명, 대표자, 업태, 종목, 사업장주소, 공급가액, 세액 사용
erpDic = {'사업자번호':0,'법인명':1,'대표자':2,'업태':3,'종목':4,'사업장 주소':5,'공급가액':6,'세액':7}
erpHash = dict() #열 이름을 키값으로 갖는 셀 위치
erpName = []
for c in range (0,erpWS.max_column):
    erpHash[erpWS[2][c].value] = erpWS[2][c].coordinate.strip('0123456789')
    print(erpWS[2][c].value,erpHash[erpWS[2][c].value])
상호 A
미수 B
수금액 C
미수금 D
수금일자 E
입금수방 F
미수금사유 G
메모 H
사업자번호 I
법인명 J
대표자 K
주민번호 L
업태 M
종목 N
사업장 주소 O
실발행일자 P
입력자사번 Q
우편물(우) R
우편물 주소 S
(전)발급코드 T
(전)발급일자 U
(전)신고일자 V
(전)사유 W
관리담당 X
지역명 Y
선후납 Z
비고 AA
가입자번호 AB
지출증빙 AC
핸드폰(기초정보) AD
공급가액 AE
세액 AF
In [8]:
erpVal = []
for i in range (3,erpWS.max_row+1):
    temp = []
    if erpWS[erpHash['사업자번호']+str(i)].value!=None and erpWS[erpHash['수금액']+str(i)].value!=None: #사업자명이나 수금액이 없다면 저장하지 않음
        for j in erpDic:
            if j=='대표자': #대표자 이름 전처리
                temp.append(erpWS[erpHash[j]+str(i)].value.strip(' '))
            else:
                temp.append(erpWS[erpHash[j]+str(i)].value)
        if temp[0] in emailAddress.keys(): #저장된 이메일 주소가 없을 경우 None
            temp.append(emailAddress[temp[0]])
        else:
            temp.append(None)
        erpVal.append(temp)
        print(temp)
[1111111111, '자바', '제임스', '음식점업', '카페', '서울특별시 서초구 자바빌딩', 29000, 2900, 'java@java.com']
[2222222222, '씨', '벨연구소', '도.소매', '컴퓨터판매', '인천광역시 남구 씨대로 99', 35000, 3500, 'ccc@ccc.com']
[3333333333, '데이터', '디비', '도.소매', '공장', '서울특별시 강남구 데이터대로 베이스빌딩', 30000, 3000, 'data@base.com']
[4444444444, '파이썬', '귀도', '도.소매', '꽃집', '서울특별시 강남구 파이썬로 29', 60000, 6000, 'python@python.com']
[5555555555, '루비', '마츠모토', '도.소매', '보석상', '경기도 시흥시 루비상가', 20000, 2000, 'ruby@ruby.com']
[6666666666, '펄', '래리', '음식점업', '횟집', '서울특별시 종로구 펄길', 35000, 3500, 'perl@cperl.com']
In [9]:
# 전자세금계산서 저장을 위한 이차원 배열
rowVal = []
dt = datetime.datetime.now();
for i in range (len(erpVal)):
    temp = []
    for j in range (taxWS.max_column):
        if j==0:
            temp.append('01')
        elif j==1:
            temp.append(dt.strftime("%Y%m%d"))
        elif j==2:
            temp.append(erpVal[i][erpDic['사업자번호']])
        elif j==4:
            temp.append(erpVal[i][erpDic['법인명']])
        elif j==5:
            temp.append(erpVal[i][erpDic['대표자']])
        elif j==6:
            temp.append(erpVal[i][erpDic['사업장 주소']])
        elif j==7:
            temp.append(erpVal[i][erpDic['업태']])
        elif j==8:
            temp.append(erpVal[i][erpDic['종목']])
        elif j==9:
            temp.append(erpVal[i][8]) #이메일
        elif j==11:
            temp.append(erpVal[i][erpDic['공급가액']])
        elif j==12:
            temp.append(erpVal[i][erpDic['세액']])
        elif j==14:
            temp.append(dt.strftime("%d"))
        elif j==15:
            temp.append(dt.strftime("%m")+'월 CCTV용역료')
        elif j==19:
            temp.append(erpVal[i][erpDic['공급가액']])
        elif j==20:
            temp.append(erpVal[i][erpDic['세액']])
        elif j==50:
            temp.append('01') #영수01 청구02
        else:
            temp.append('')
    rowVal.append(temp)
    print(temp)
['01', '20191204', 1111111111, '', '자바', '제임스', '서울특별시 서초구 자바빌딩', '음식점업', '카페', 'java@java.com', '', 29000, 2900, '', '04', '12월 CCTV용역료', '', '', '', 29000, 2900, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
['01', '20191204', 2222222222, '', '씨', '벨연구소', '인천광역시 남구 씨대로 99', '도.소매', '컴퓨터판매', 'ccc@ccc.com', '', 35000, 3500, '', '04', '12월 CCTV용역료', '', '', '', 35000, 3500, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
['01', '20191204', 3333333333, '', '데이터', '디비', '서울특별시 강남구 데이터대로 베이스빌딩', '도.소매', '공장', 'data@base.com', '', 30000, 3000, '', '04', '12월 CCTV용역료', '', '', '', 30000, 3000, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
['01', '20191204', 4444444444, '', '파이썬', '귀도', '서울특별시 강남구 파이썬로 29', '도.소매', '꽃집', 'python@python.com', '', 60000, 6000, '', '04', '12월 CCTV용역료', '', '', '', 60000, 6000, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
['01', '20191204', 5555555555, '', '루비', '마츠모토', '경기도 시흥시 루비상가', '도.소매', '보석상', 'ruby@ruby.com', '', 20000, 2000, '', '04', '12월 CCTV용역료', '', '', '', 20000, 2000, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
['01', '20191204', 6666666666, '', '펄', '래리', '서울특별시 종로구 펄길', '음식점업', '횟집', 'perl@cperl.com', '', 35000, 3500, '', '04', '12월 CCTV용역료', '', '', '', 35000, 3500, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '01']
In [10]:
for i in range (len(rowVal)):
    for j in range (taxWS.max_column):
        taxWS.cell(i+7,j+1,rowVal[i][j])
        print(rowVal[i][j])
01
20191204
1111111111

자바
제임스
서울특별시 서초구 자바빌딩
음식점업
카페
java@java.com

29000
2900

04
12월 CCTV용역료



29000
2900





























01
01
20191204
2222222222

씨
벨연구소
인천광역시 남구 씨대로 99
도.소매
컴퓨터판매
ccc@ccc.com

35000
3500

04
12월 CCTV용역료



35000
3500





























01
01
20191204
3333333333

데이터
디비
서울특별시 강남구 데이터대로 베이스빌딩
도.소매
공장
data@base.com

30000
3000

04
12월 CCTV용역료



30000
3000





























01
01
20191204
4444444444

파이썬
귀도
서울특별시 강남구 파이썬로 29
도.소매
꽃집
python@python.com

60000
6000

04
12월 CCTV용역료



60000
6000





























01
01
20191204
5555555555

루비
마츠모토
경기도 시흥시 루비상가
도.소매
보석상
ruby@ruby.com

20000
2000

04
12월 CCTV용역료



20000
2000





























01
01
20191204
6666666666

펄
래리
서울특별시 종로구 펄길
음식점업
횟집
perl@cperl.com

35000
3500

04
12월 CCTV용역료



35000
3500





























01
In [11]:
taxWB.save('data/test.xlsx')
In [12]:
erpWB.close()
emailWB.close()
taxWB.close()

 

결과

프로그램 실행 결과는 다음과 같다.

test.xlsx
test.xlsx
0.08MB

개선사항
  • 최대한 확장성을 고려해 다른 회사에서도 사용할 수 있게 만들고 싶었으나, 머릿글 행(열 이름)의 처리 문제
  • 전자세금계산서 발급을 위해서는 최대 1000건의 데이터만 입력해야 하는데 이를 위한 처리를 따로 해주어야 함
  • 결과 파일의 배경 색상이 바뀌는 것의 원인을 확인하고 해결 해야함

사이드 프로젝트를 진행해야 하는 다양한 이유들이 있겠지만, 나는 다음과 같은 이유들로 앞으로 사이드 프로젝트를 진행하고자 한다.

 

1. 코딩을 배울 수 있다.

2. 프로젝트 포트폴리오에 기술할 경험을 쌓을 수 있다.

3. 앉아서 책 읽고 문제 풀이와는 달리 가시적인 결과가 나온다.

 

사이드 프로젝트를 진행하는 데 있어서 가장 중요한 점은 조금씩이라도 꾸준히 진행하여 완성하는 일이라고 한다. 너무 장대하고 원대한 계획을 세웠다가 아무런 성과 없이 무산되는 일이 생기지 않도록 작은 프로젝트부터 진행하여 앱스토어에 등록하는 것을 우선 목표로 하고 있다. 거창한 아이디어가 있는 것은 아니므로 그냥 기존의 앱스토어에 널려 있는 계산기 어플 같은 프로그램을 단순 카피하는 것에 그칠지도 모른다. 하지만 이러한 시도를 시작하는 것만으로도 큰 의의가 있다고 본다.


어떤 식으로 사이드 프로젝트를 진행하면 되는 것일까 생각해 보니 다음과 같은 프로세스를 통해 진행하면 되겠다는 생각이 든다.

 

1. 아이디어 떠올리기

2. 진행 계획 세우기

3. 공부하기

4. 과정 정리&기록하기

5. 구현하기

6. 배포하기

 

이 중 3~5의 과정은 프로젝트를 진행하는 동안 반복해야 하는 부분이다. 위의 과정 중에 중도에 포기하고 마는 프로젝트가 없도록 조금씩 꾸준하게 진행하도록 노력해보겠다.

 

+ Recent posts