EveryUniv/student-council-homepage-backend

[귀향버스] 기획 및 api 개발 관련

Closed this issue · 9 comments

Due to: 06/20 ~ 07/31
단, 우선 순위는 client 부분부터 이다. (~07/05)
이후 관리자 부분 구현
Test DB에 Test Data 삽입

임시 디자인(와이어 프레임 정도로 생각하면 편함):
https://www.figma.com/file/aB9v57EOxklZVnsP6z63Oz/%EA%B7%80%ED%96%A5%EB%B2%84%EC%8A%A4-%EB%B0%8F-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%B0%BE%EA%B8%B0?type=design&t=gnWFlPmq3uQ8q8CZ-0

Client

귀향버스 페이지

기본적으로 1인 1개의 승차권은 default이다.
죽전캠퍼스만, 재학생 + 교직원, 대학원생 만 신청가능하다.
대학원생 구분은 학번의 시작이 7이다.

  • 해당 페이지에서 필요한 정보
    호차, 경로, 종착지, 잔여석, 신청가능여부

  • 신청가능여부
    승차권이 없는 경우에 모든 승차권을 신청이 가능하며, 잔여석이 여유가 있을 경우 신청이 가능하다.
    image

  • 승차권 신청

  1. 승차권은 신청하면, 우선적으로 "승차권 발급 승인 단계" 에 진입하게된다. 잔여석을 판단할 때는 전체 좌석 수에서 승차권 발급 승인 단계에 있는 인원 + 승차권 발급이 완료된 인원을 뺀 숫자로 판단을 진행하여야함 따라서 신청버튼을 눌럿을때 "현재 승차권 발급 승인 단계에 있는 인원이 꽉 차 신청이 불가능 합니다. 매주 월요일, 수요일, 금요일 18시(오후 6시) 에 일괄 처리됩니다."으로 메세지를 보내주어야 한다. 승차권 발급 완료인원으로 인해 잔여석이 0인 경우는 신청 버튼이 비활성화가 되어야 한다.
  2. 승차권 신청이 완료될 경우 안내사항에 대해서 해당 유저에게 메세지를 보내야한다.
  • 메세지 내용: "추후 결정"
  1. 1번의 승차권 신청이 불가능한 상태로 진입하였을때 총학생회 담당자(번호를 넘길 것 같음) 에게 알림 문자가 가야한다.
  2. 잔여석은 승차권 발급이 완료된 인원만 고려한다.
  • 승차권 자동 취소
    승차권을 신청해두고 특정계좌로 입금되어지지 않아, 관리자가 처리하지않는다면, 신청한지 48시간이 지나면, 자동으로 해당 신청내역은 사라져야한다. (관리자에서도 마찬가지이며, 신청이 취소될 경우 다시 신청이 가능해진다.)
    또한, 신청이 자동으로 취소가되었을 경우 문자로 자동취소된 내용을 보내주어야한다.( 메세지 내용 추후 결정)

신청이 불가능한 경우

승차권이 이미 있는 경우(승인이 완료됨)

  • 취소만 가능함
    image

이 경우 취소를 원할 때에 필요한 폼
image
예금주명, 입금받을 계좌, 입금 받을 은행명, 입금시간(날짜와 시간)
위 정보는 모두 필수 데이터이다.

승차권 승인단계에 있는 경우
승차권 취소단계에 있는 경우
image

위와 같이 아무것도 신청이 안되어야함. 단, client 측에선 승인단계인지 취소단계인지 알 수 있어야 합니다.

잔여석이 없는 경우
해당 버튼은 비활성화가 되어야 합니다.

귀향버스 티켓페이지

image
필요한 정보: 각 경로, 호차 번호, 티켓 QR 번호

  • 승차권을 열람할 수 있는 권한
    티켓이 있는 사람만 열람할 수 있습니다.

  • 승차권이 없을 경우

  1. 현재 승차권을 취소하고 있는 취소 단계입니다. 매주 월요일, 수요일, 금요일 18시에 업데이트 됩니다. 이벤트메세지
  2. 현재 보증금 입금 확인 및 승차권을 승인하고 있는 승인 단계입니다. 매주 월요일, 수요일, 금요일 18시에 업데이트 됩니다. 이벤트메세지
  3. 티켓이 없습니다. 이벤트메세지

관리자

  • 관리자는 관리자페이지에서 모든 작업을 진행한다.

버스추가

  • 관리자는 버스정보를 추가 할 수 있다.
    버스정보에 해당 할 수 있는 것은
    호차번호, 경로들(n개), 전체 좌석개수(n개), 종착지

  • 관리자는 버스정보를 수정 할 수 있다.
    단, 전체 좌석 개수를 잔여석보다 적게 설정하는 경우는 불가능 하다.

  • 관리자는 버스를 삭제 할 수 있다.
    단, 이미 승차권을 발급받은 사람이 있을 경우 삭제가 불가능 하다.

승차권 발급 순서

  1. 사용자가 특정 승차권을 신청한다.
  2. 관리자가 사용자 정보를 확인하고 승차권 등록을 완료한다.
  3. 현재 신청 완료된 좌석수에 1을 더한다.
  • 관리자는 승차권 발급을 최종 승인하여야한다.
    관리자는 "승차권 발급 관리자 페이지" 에서 현재 승차권 확인이 되어야하는 목록을 "호차"별로 모아볼 수 있어야하며, 해당 건들은 1개씩 확인 버튼을 눌러 확인완료 버튼으로 변하게된다. 이후 "중간 업로드" 같은 버튼을 통해 확인완료 목록을 한번에 업로드 할 수 있어야한다. -> 이렇게 업로드가 완료될 때 안내문자를 발송한다.. 또한, 업로드 시에는 담당자 명을 적어서 추후에 실수가 낫을때 담당자를 찾을 수 있어야한다.

  • 관리자는 해당 페이지에서 신청한 사람의 이름, 전화번호, 학번을 확인 할 수 있어야하며, 이름또는 학번으로 검색할 수 있어야한다. (호차별로)

  • 개발자가 임의로 승차권 발급신청을 취소 시킬 수 있다. (DB 적으로만 가이드라인을 잡아두면 될 듯 합니다.)

  • 승차권 일괄 발급 완료(월,수,금 오후 18시 쯤 관리자가 수동으로 진행) 가 된 경우에 유저에게 발급 완료에 대한 안내 문자를 발송해야한다.(문자내용 추후 결정)

  • 만일을 대비하여, 학번과 호차를 입력하여, 강제로 발급완료를 진행할 수 있는 란이 있어야한다.

[승차권 등록이 완료된 사용자는 더이상 승차권을 신청할 수 없지만, 취소 신청은 가능하다.]

승차권 취소 순서

  1. 사용자가 자신의 승차권을 취소한다. 이때, 사용자는 예금주명, 입금받을 계좌, 은행명, 입금시간(필수는 아님) 의 데이터를 입력해야한다.
  2. 관리자는 해당 사용자를 확인하여, 환불을 진행한 뒤 승차권 취소 완료를 진행 할 수 있다.
  • 관리자는 사용자의 승차권 취소 신청 정보를 확인하고, 승차권 취소를 완료한다.
    관리자는 "승차권 취소 관리자 페이지" 에서 현재 승차권 확인이 되어야하는 목록을 "호차"별로 모아볼 수 있어야하며, 해당 건들은 1개씩 확인 버튼을 눌러 처리완료 버튼으로 변하게된다. 이후 "중간 업로드" 같은 버튼을 통해 확인완료 목록을 한번에 업로드 할 수 있어야한다. -> 이렇게 업로드가 완료될 때 안내문자를 발송한다. 또한, 업로드 시에는 담당자 명을 적어서 추후에 실수가 낫을때 담당자를 찾을 수 있어야한다.

  • 관리자는 해당 페이지에서 학번 이름 예금주명 입금받을 은행명 입금받을계좌 입금 시간대를 확인 할 수 있어야하며, 각각 처리완료 버튼을 통해 처리 및 구분할 수 있어야한다.

  • 승차권이 일괄 취소가 완료된(월, 수, 금 18시쯤 관리자가 수동으로 진행) 경우 해당 유저에게 승차권 취소 완료 안내 문자를 발송하여야한다..(문자내용 추후 결정)

승차권 목록 확인

-관리자는 "승차권 목록 페이지" 를 통해서 승차권 발급 현황에 대해서 목록으로 "호차"별로 볼 수 있어야한다.

승차권 취소, 발급 확정 목록

  • 관리자는 승차권을 취소, 발급 한 내역에 대해서 날짜별 및 호차별로 조회해 볼 수 있어야한다.
    해당 페이지에 포함될 정보는 신청시에 들어간 모든 내용이다.

요약

  • 귀향버스 승차권 신청, 취소, 승인 플로우를 관리하는 기능
  • 대상자: 죽전캠퍼스 재학생, 교직원, 대학원생
  • 1인 1신청만 가능
  • 사용자: 버스 목록 조회, 승차권 신청, 취소
  • 관리자: 버스 추가, 승차권 승인, 취소 처리, 목록 조회
자세히 보기

사용자 API

귀향버스 조회

  • 버스 호차, 경로, 종착지, 잔여석, 상태 목록을 반환
    • 잔여석: 신청가능한 좌석 수 / 총 좌석 수
    • 상태: 신청가능, 승인대기중, 취소가능, 환불대기중

귀향버스 티켓 조회

티켓 조회

  • 신청하고 승인받은 승차권의 자세한 정보 조회
    • 경로, 버스 호차, 티켓 QR 번호
    • 승차권을 보유해야 한다.
      • 승인까지 완료
      • 그리고 취소 신청하지 않은 경우

승차권 신청

신청 과정

  1. 사용자가 승차권 신청
  2. 사용자가 계좌로 승차권 비용 입금
  3. 관리자가 승인
  4. 승인 완료 메시지를 SMS로 사용자에게 전송

신청 조건

  1. 죽전캠퍼스 재학생, 교직원, 대학원생
  2. 승인 완료된 사람 + 승인 대기중인 사람 < 총 좌석 수
    1. 신청자가 꽉찬 경우에는 관리자에게 따로 SMS 알림
  3. 다른 버스 승차권을 가지고 있지 않아야 한다.

승차권 취소

취소 과정

  1. 사용자가 승차권 취소 요청 (예금주명, 입금 받을 계좌, 은행 기입)
  2. 관리자가 환불금 입금 후 취소 완료 처리
  3. 환불 완료 메시지를 SMS로 사용자에게 전송

자동 취소

  1. 승차권 신청후 입금하지않아 48시간 이내에 승인되지 않으면 자동 취소
  2. 자동 취소시 사용자에게 SMS 발송

관리자 API (관리자 페이지)

버스 추가, 수정, 삭제

  • 승차권을 신청할 수 있는 버스를 추가, 수정, 삭제할 수 있다.

승인된 승차권 조회

  • 승인된 모든 승차권을 버스 호차별로 볼 수 있다.

요청 목록 조회, 승인

  • 승차권 신청, 취소 요청들을 볼 수 있다.
  • 신청 승인, 취소 완료를 할 수 있다.
  • 모든 신청은 기록이 남아야 한다.

승차권 강제 발급

  • 학번과 호차를 직접 입력해 승차권을 추가할 수 있다.

추가 질문

  1. 잔여석은 신청자까지 포함해서 표시하는건 어떤가요? 사용자가 잔여석을 확인하는 이유는 신청 가능한지를 판단하기 위함인데, 승인 완료된 사람만 고려해서 잔여석을 보여주면 혼란이 생길 것 같습니다. 예를 들어 66/100인데 신청되지 않는다면 사용하는 입장에서는 이질감이 들 것 같네요.
  2. 자동 취소 기능은 관리자가 승인하지 않으면 자동으로 48시간 이후에 취소되는 기능으로 이해했습니다. 그런데 승인하는 시점이 월, 수, 금 18시인데, 금요일 19시에 신청하면 무조건 자동으로 취소되지않나요? (금 19시 + 48시간 = 일 19시)
  3. 그리고 혹시나 입금까지 되었는데 (실수로 승인안해서) 자동 취소된다면 환불 처리가 누락될 가능성이 생길 것 같습니다. 소프트웨어적으로 방어할 수는 있지만, 쉽게 가기위해 자동 취소 기능은 빼는 게 어떠신가요??

그것이 사용자편에서 더 좋을 것 같습니다.
2,3
3일이상된 신청자들을 모아서 신청취소 시키는버튼이 있는 페이지를 만들면 좋을 것 같습니다.
호차별정리 및 일괄처라버튼
경과된 날짜 학번 학과 이름 휴대전화번호 취소상태

아키텍처

image

프로그램 아키텍처는 간단합니다. 대략 위와 같은 구성이 될 것 같습니다. 사용자, 관리자 api를 구분지어서 따로 controller와 service를 구현합니다.

HomeBus, HomeBusTicket, HomeBusCancelRequest는 사용자와 관리자에서 공통으로 사용하는 데이터 모델들입니다. 이 세 가지 모델만 미리 서로 약속하면 좋을 것 같아요. 각각 어떤 역할을 하는지는 아래 공통 데이터 모델 ERD 파트에서 설명하겠습니다.

그 외에 티켓 승인/취소 로그를 저장하는 TicketLog나 승인 작업을 임시로 저장하는 AcceptTask등은 각자 필요에 따라 만들어 사용하면 될 것 같습니다. 이것들은 공통으로 사용하는 모델이 아니어서 각자 알아서 만들어쓰면 됩니다.

공통 데이터 모델 ERD

image
※ 보기 편하게 User는 간소화했고, createdAt, modifiedAt은 제외했습니다.
※ HomeBus에 총 좌석 개수도 포함되어야 합니다.

공통 데이터 모델은 이런 식으로 정의해보았습니다. 제 개인적인 의견이며 얼마든지 바뀔 수 있습니다.

HomeBus

image

귀향 버스 목록을 저장합니다. 위의 사진처럼 버스 목록을 저장합니다. 관리자가 추가, 삭제, 수정할 수 있습니다.
잔여석은 DB에 저장하지 않더라도 사용자가 신청한 티켓을 카운트해서 구할 수 있습니다. 물론 매 요청마다 카운트하진 않고 Redis 등에 캐싱해서 사용할 것 같아요.

HomeBusTicket

사용자의 티켓을 저장합니다. 이 티켓에는 승인 대기중인 티켓, 승인된 티켓, 취소 대기중인 티켓 모두 포함됩니다.
status는 Enum타입으로, 승인대기, 승인됨, 취소승인대기 가 들어갈 수 있습니다.

예시) 사용자가 처음 티켓을 신청하면 승인대기 상태로 HomeBusTicket에 저장됩니다. 관리자가 승인하면 승인됨 상태로 바뀌게 됩니다.

HomeBusCancelRequest

사용자의 취소 요청을 저장합니다. 취소할 때는 입금자 명, 은행 이름, 계좌번호가 추가로 필요하므로 따로 DB에 테이블로 저장해야합니다.

신청할 때는 아무런 추가 정보가 필요하지 않으므로 따로 테이블을 만들지는 않았습니다. 만약 신청할 때도 추가 정보가 필요하다면 HomeBusTicketRequest과 같이 신청 정보를 따로 저장할 수 있습니다.

모든 버스가 총 좌석이 고정된 갯수인가요?
모든 버스의 좌석이 동일하지 않다면 HomeBus 테이블에 총 좌석 갯수정도는 관리하는건 어떠신가요?
(거의 모든 버스가 45석정도 될 것 같지만...ㅎ)

모든 버스가 총 좌석이 고정된 갯수인가요? 모든 버스의 좌석이 동일하지 않다면 HomeBus 테이블에 총 좌석 갯수정도는 관리하는건 어떠신가요? (거의 모든 버스가 45석정도 될 것 같지만...ㅎ)

총 좌석 개수를 빼먹었네요. 그것까지 저장해서 관리해야하는게 맞습니다!

각종 메세지 정리, 4번과 5번은 추가된 사항같음

  1. 승인신청할때.

(언제언제언제 기준으로 처리되고, 몇 일내로 입금안할시 신청이 취소된다 라는 정보가 들가면좋음)
=> 2023 귀향버스 신청이 완료되었습니다. 월요일 수요일 금요일 18시에 신청 완료가 일괄적으로 진행됩니다. 신청일을 기준으로 이틀 이내로 입금하지 않을 시 신청이 취소됩니다. 입금기한을 준수해주시기 바랍니다. 또한 신청인 명의와 송금인의 명의가 다를 경우 신청 완료가 지연됩니다. 신청과정에서 실수가 있었다면 담다 소통창구로 연락 바랍니다.
(토스뱅크 1000 - 1518 - 7651 예금주: 유현수)

  1. 승인 완료되고, 발급될때

(출발정보, 호차 정보, 모이는 장소, 승인 완료 및 발권되어서 홈페이지에서 확인하라는 메세지로 들가면 좋음)
=> x호차(대구 – 부산) 노선 신청이 완료되었습니다. 총학생회 신청홈페이지에서 승차권 확인 부탁드립니다. 그리고 탑승 당일 원활한 진행을 위해 스태프에게 승차권을 제시해주세요.

  1. 취소 완료되었을때

(언제 몇시에 누구이름으로 돈이 입금된 사실 전달 및 입금되어지지 않았다면, 어떤 번호로 연락 및 확인 작업)
=> 취소가 완료되었습니다. x시xx분 예금주:ooo님 계좌로 10,000원 환불 완료되었습니다. 추가 문의사항이 있다면 담다 소통창구로 연락 부탁드립니다.

  1. 승인 신청이 취소되었을때(오랜기간 입금을 안했을때)

(귀향버스 신청 규칙에 의해 언제언제 들어간 데이터에 대해서 신청이 취소되었습니다. 입금을 하였거나, 이의가 있는경우 어디로 연락 이라는 정보가 잇으면 좋음)
=> x월 x일 귀향버스 신청해주신 xxx학우님. X월 X일 X시 X분 신청 후 이틀 동안 입금이 확인되지 않아 신청 취소처리되었습니다.

  1. 승인 신청 취소가 머지 않았을 때 (입금 확인 안 되어서 취소하기 1시간 전)

(일단 취소되면 에타에 불날까봐 보내는게 좋을거 같음)
=> x월 x일 귀향버스 신청해주신 xxx학우님. 신청 후 이틀 동안 입금이 확인되지 않아 신청 취소 예정입니다.

  1. 출발 하루 전 알림문자

(호차정보 시간정보, 다음날 모이는 장소, 와서 행동요령 등이 들어가면 좋을 듯)
=> x호차 xx시 내일 운행예정입니다. (오셔서 ~~행동해주시고 – 아직 미정), 각 호차별 대기 장소는 아래 사진을 참고해주시기 바랍니다.

셔틀버스 신청 취소에 대해서 사진이랑 글내용이랑 달라서 다시 말씀드리면
날짜 및 시간대까지 받으며, 관리자는 해당 내용을 확인할 수 있어야합니다.