티스토리 뷰

반응형

php언어뿐만 아니라 어떤 언어도 비슷하게 구현될 것입니다. 전자결재의 간단한 형태는 아래와 같을 것입니다.

PHP를 이용하여 웹 어플리케이션을 구현할 수 있으며,

데이터베이스와 연동하여 작성함, 상신함, 미결함, 가결함, 부결함, 대기함, 참조함 등의 기능을 구현할 수 있습니다.

1. 데이터베이스 설계


전자결재 시스템에서는 다양한 정보들을 데이터베이스에 저장하게 됩니다. 

예를 들어, 문서 정보, 결재자 정보, 결재라인 정보 등이 이에 해당됩니다. 이 정보들을 효율적으로 저장하기 위해 데이터베이스의 테이블을 설계해야 합니다.

정말 간단한 필수 요소만 이용해서 mysql의 eworks 테이블을 만들었습니다.


2. 사용자 인증


전자결재 시스템은 보안적인 측면에서 매우 중요합니다. 

사용자의 인증을 위해서는 로그인 페이지를 구현하고, 로그인 정보를 검증하는 기능이 필요합니다. 

이 기능을 구현할 때는 적절한 암호화 방법을 사용하여 보안성을 높이는 것이 좋습니다.

 

그럼 이제 실전으로 진행합니다. 작성함 - 내가 쓴 전자결재를 보는 부분을 작성할 것입니다. 나의 작성함이 되겠네요.


1)  작성함


작성함은 문서를 작성하는 기능입니다. 

사용자는 웹 페이지에서 문서를 작성하고, 필요한 정보를 입력합니다. 

이 정보는 데이터베이스에 저장되며, 결재 라인 정보도 함께 생성됩니다.


2) 상신함


작성한 문서는 상신함에서 결재를 요청하게 됩니다. 

결재자는 상신된 문서를 검토하고, 승인 또는 반려를 결정합니다. 

이 결재 과정은 결재 라인에 따라 진행됩니다.


미결함


결재자가 승인 또는 반려를 결정하지 않은 문서는 미결함에 보관됩니다. 결재자는 미결함에서 결재할 문서를 선택하고, 승인 또는 반려를 결정합니다.


가결함


결재가 완료된 문서는 가결함에 보관됩니다.

가결함에서는 결재 내역을 확인할 수 있습니다.


부결함


결재자가 문서를 반려할 경우, 해당 문서는 부결함에 보관됩니다. 부결된 문서는 수정되어 다시 상신할 수 있습니다.


대기함


결재자가 아직 결재할 수 없는 상황에서는 대기함에 보관됩니다.

예를 들어, 다른 결재자의 작성 중 잠시 중지하고 다른 일을 할때 대기함에 넣는다고 생각하면 좋을 것 같네요.

 

<?php
// MySQL 데이터베이스 연결
$conn = mysqli_connect('localhost', 'username', 'password', 'database_name');

// 상신함: 문서 작성 폼
if(isset($_POST['submit'])) {
  $title = $_POST['title'];
  $content = $_POST['content'];
  $author = $_POST['author'];

  // 문서를 데이터베이스에 저장
  $query = "INSERT INTO documents (title, content, author) VALUES ('$title', '$content', '$author')";
  $result = mysqli_query($conn, $query);

  // 문서 작성 완료 메시지 출력
  echo "문서 작성이 완료되었습니다.";
}
?>

<!-- 상신함: 문서 작성 폼 -->
<form method="post" action="">
  <label for="title">제목:</label>
  <input type="text" name="title" id="title"><br>

  <label for="content">내용:</label>
  <textarea name="content" id="content"></textarea><br>

  <label for="author">작성자:</label>
  <input type="text" name="author" id="author"><br>

  <input type="submit" name="submit" value="상신">
</form>

<?php
// 미결함: 결재 대기중인 문서 목록
$query = "SELECT * FROM documents WHERE status = 'pending'";
$result = mysqli_query($conn, $query);
?>

<!-- 미결함: 결재 대기중인 문서 목록 -->
<h3>미결함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
    <th></th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
    <td><a href="approve.php?id=<?php echo $row['id']; ?>">결재</a></td>
  </tr>
  <?php } ?>
</table>

<?php
// 부결함: 반려된 문서 목록
$query = "SELECT * FROM documents WHERE status = 'rejected'";
$result = mysqli_query($conn, $query);
?>
$current_user = "홍길동"; // 현재 로그인한 사용자 이름

$query = "SELECT * FROM documents WHERE status = 'pending' AND approver = '$current_user'";
$result = mysqli_query($conn, $query);
?>

<!-- 대기함: 본인이 결재할 차례인 문서 목록 -->
<h3>대기함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
    <th></th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
    <td><a href="approve.php?id=<?php echo $row['id']; ?>">결재</a></td>
  </tr>
  <?php } ?>
</table>

$query = "SELECT * FROM documents WHERE status = 'referenced'";
$result = mysqli_query($conn, $query);
?>

<!-- 참조함: 참조할 문서 목록 -->
<h3>참조함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
  </tr>
  <?php } ?>
</table>

$query = "SELECT * FROM documents WHERE status = 'rejected'";
$result = mysqli_query($conn, $query);
?>

<!-- 부결함: 반려된 문서 목록 -->
<h3>부결함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
  </tr>
  <?php } ?>
</table>

if(isset($_GET['menu']) && $_GET['menu'] == 'submit') {
  include('submit.php');
} else if(isset($_GET['menu']) && $_GET['menu'] == 'approved') {
  include('approved.php');
} else if(isset($_GET['menu']) && $_GET['menu'] == 'pending') {
  include('pending.php');
} else if(isset($_GET['menu']) && $_GET['menu'] == 'referenced') {
  include('referenced.php');
} else if(isset($_GET['menu']) && $_GET['menu'] == 'rejected') {
  include('rejected.php');
} else {
  include('submit.php');
}

$query = "SELECT * FROM documents WHERE status = 'approved'";
$result = mysqli_query($conn, $query);
?>

<!-- 가결함: 승인된 문서 목록 -->
<h3>가결함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
  </tr>
  <?php } ?>
</table>


<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 문서 상태가 'pending'인 문서 목록을 가져옴
$query = "SELECT * FROM documents WHERE status = 'pending'";
$result = mysqli_query($conn, $query);
?>

<!-- 대기함: 처리 대기 중인 문서 목록 -->
<h3>대기함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
  </tr>
  <?php } ?>
</table>


<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 참조한 문서 목록을 가져옴
$query = "SELECT * FROM documents WHERE reference != ''";
$result = mysqli_query($conn, $query);
?>

<!-- 참조함: 참조된 문서 목록 -->
<h3>참조함</h3>
<table>
  <tr>
    <th>문서 제목</th>
    <th>작성자</th>
    <th>작성일</th>
  </tr>
  <?php while($row = mysqli_fetch_array($result)) { ?>
  <tr>
    <td><?php echo $row['title']; ?></td>
    <td><?php echo $row['author']; ?></td>
    <td><?php echo $row['date']; ?></td>
  </tr>
  <?php } ?>
</table>

 

위의 코드를 첫 화면의 순서대로 정리한다면 아래와 같이 할 수 있겠네요.

eworks라는 서버 디렉토리를 만든 후

거기 php파일을 집어 넣는 것이죠.

1. 작성함

- 일단 작성함을 누르면 목록이 나와야 하니 목록이 나오게 한 후 작성하는 write버튼을 만드는 것이 순서일 것 같아요.

파일명 : create.php - 리스트를 출력하는 파일

전자결재 작성함 리스트 출력화면

<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 모든 문서 정보 가져오기
$query = "SELECT * FROM documents";
$result = mysqli_query($conn, $query);

// 문서 목록 출력
echo "<h3>문서 목록</h3>";
echo "<table border='1'>";
echo "<tr><th>ID</th><th>제목</th><th>작성자</th><th>작성일자</th><th>상태</th></tr>";
while ($row = mysqli_fetch_assoc($result)) {
  echo "<tr>";
  echo "<td>".$row['id']."</td>";
  echo "<td>".$row['title']."</td>";
  echo "<td>".$row['author']."</td>";
  echo "<td>".$row['date']."</td>";
  echo "<td>".$row['status']."</td>";
  echo "</tr>";
}
echo "</table>";
?>

 

'작성' 버튼을 만들어서 누른다면 동작하는 코드 : 내용을 넣는 부분이겠죠?

<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 문서를 작성하는 페이지
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  // POST 데이터 처리
  $title = $_POST['title'];
  $content = $_POST['content'];
  $author = $_POST['author'];
  $date = date('Y-m-d H:i:s'); // 현재 시간

  // 데이터베이스에 새로운 문서 추가
  $query = "INSERT INTO documents (title, content, author, date, status)
            VALUES ('$title', '$content', '$author', '$date', 'draft')";
  $result = mysqli_query($conn, $query);

  // 문서 추가 성공 시, 메시지 출력 후 목록 페이지로 이동
  if ($result) {
    echo "<p>새로운 문서가 추가되었습니다.</p>";
    header("Location: index.php");
  } else {
    echo "<p>문서 추가에 실패했습니다.</p>";
  }
}
?>

<!-- 새 문서 작성 페이지 -->
<h3>새 문서 작성</h3>
<form method="POST" action="">
  <label>제목:</label><br>
  <input type="text" name="title" required><br><br>
  <label>내용:</label><br>
  <textarea name="content" required></textarea><br><br>
  <label>작성자:</label><br>
  <input type="text" name="author" required><br><br>
  <input type="submit" value="작성 완료">
</form>

문서를 작성하는 화면

이런식으로 계속 자료를 넣으면 쌓여간다.

$host부터 $dbname까지는 실제 사용하는 정보를 넣어주세요. 저는 제 서버의 정보를 넣어서 얻은 결과물을

위에 보여주는 것입니다. 참고로 mysql에서 컬럼과 테이블도 생성하는 것 잊지마시구요~

실제 서버에 컬럼을 작성한 화면

<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 문서를 작성하는 페이지
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  // POST 데이터 처리
  $title = $_POST['title'];
  $content = $_POST['content'];
  $author = $_POST['author'];
  $date = date('Y-m-d H:i:s'); // 현재 시간

  // 데이터베이스에 새로운 문서 추가
  $query = "INSERT INTO documents (title, content, author, date, status)
            VALUES ('$title', '$content', '$author', '$date', 'draft')";
  $result = mysqli_query($conn, $query);

  // 문서 추가 성공 시, 메시지 출력 후 목록 페이지로 이동
  if ($result) {
    echo "<p>새로운 문서가 추가되었습니다.</p>";
    header("Location: index.php");
  } else {
    echo "<p>문서 추가에 실패했습니다.</p>";
  }
}
?>

<!-- 새 문서 작성 페이지 -->
<h3>새 문서 작성</h3>
<form method="POST" action="">
  <label>제목:</label><br>
  <input type="text" name="title" required><br><br>
  <label>내용:</label><br>
  <textarea name="content" required></textarea><br><br>
  <label>작성자:</label><br>
  <input type="text" name="author" required><br><br>
  <input type="submit" value="작성 완료">
</form>

 

2) 상신함 구현

상신함 기능은 사용자가 작성한 문서 중에서 상태가 "작성중"인 문서를 출력하는 기능입니다. 따라서 raiseApproval.php 파일에 상신함 기능을 구현하려면, SELECT 쿼리에 조건을 추가하여 상태가 "작성중"인 문서만 가져오도록 해야 합니다. 아래 코드는 이를 구현한 예시입니다.

<?php
// 데이터베이스 연결 정보
$host = "localhost"; // 호스트 이름
$username = "username"; // MySQL 계정 아이디
$password = "password"; // MySQL 계정 패스워드
$dbname = "dbname";   // 데이터베이스 이름

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $dbname);

// MySQL 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
  die("Failed to connect to MySQL: " . mysqli_connect_error());
}

// 작성중인 문서 정보 가져오기
$query = "SELECT * FROM documents WHERE status='작성중'";
$result = mysqli_query($conn, $query);

// 문서 목록 출력
echo "<h3>상신함</h3>";
echo "<table border='1'>";
echo "<tr><th>ID</th><th>제목</th><th>작성자</th><th>작성일자</th><th>상태</th></tr>";
while ($row = mysqli_fetch_assoc($result)) {
  echo "<tr>";
  echo "<td>".$row['id']."</td>";
  echo "<td>".$row['title']."</td>";
  echo "<td>".$row['author']."</td>";
  echo "<td>".$row['date']."</td>";
  echo "<td>".$row['status']."</td>";
  echo "</tr>";
}
echo "</table>";
?>

 

위의 코드는 사실 1차원적인 PHP코드일 것입니다.

실무에서는 javascript의 동작을 구현할때 ajax로 비동기 방식으로 개발하는 것이 보통입니다.

기회가 된다면 ajax를 활용한 것도 올려보고 싶네요~

나머지 항목들은 사실

$query = "SELECT * FROM documents WHERE status='작성중'";

위의 코리의 where 구문에 값을 대입함으로서 여러가지 만들 수 있는 것입니다.

대기함, 참조함, 부결함, 가결함....

이제 분류하는 것만 남겠네요^^

 

반응형
댓글