# Chia công việc đồ án TKPM
## 1. Backend: Quân
- https://hackmd.io/@MLuUNJpmRT2YJV4EgHbBFg/HyNlgJRwq
## 2. Frontend Staff: Minh
- Tạo nhánh GitHub là `minh`
### 2.1. Màn hình Ticket
#### a) Bối cảnh:
- Trong model Ticket vừa có thêm thuộc tính `approvedTime`
#### b) Giải thích:
- `bookedTime` là thời điểm khách đặt vé, `approvedTime` là thời điểm staff duyệt vé
- 3 hàm `isBooked`, `isPending`, `isApproved`
#### c) Cần làm:
- Xem lại logic 3 tab **Pending**, **Sold**, **Not sold** đã đúng chưa và sửa lại
- Thêm cột **Approval time** cho bảng dữ liệu
- Thiết kế detail card cho mỗi ticket (tham khảo Flight)
#### d) Deadline: 20:00 ngày 31/05/2022
### 2.2. Ngôn ngữ
#### c) Cần làm:
- Xem bên `intl_en.arb` để việt hóa cho file `intl_vi.arb`
#### d) Deadline: 20:00 ngày 1/6/2022
### 2.3. Màn hình Report
#### c) Cần làm:
- Xử lý nút in PDF, nghiên cứu thư viện `pdf` hoặc `syncfusion_flutter_pdf`
#### d) Deadline: 20:00 ngày 2/6/2022
---
## 3. Frontend Staff/Manager: Minh + Nam
- Tạo nhánh GitHub là `minh2`
- Xóa project trên máy, clone code client: https://github.com/phuongnam195/simplane-client-admin
- Clone code server: https://github.com/phuongnam195/simplane-server
- Dùng IntelliJ để chạy server
- Tài khoản Manager: lehongquan 123456
- Tài khoản Staff: nam195 123456 (hoặc tự đăng ký)
### 3.1. Xuất PDF report cho người dùng Manager
- Độ ưu tiên: 2/5
- Thêm cột số chuyến bay
- Check manager:
```
if (UserManager.instance.getUser()?.isAdmin == true)
```
### 3.2. Làm đẹp form Booking UI
- Độ ưu tiên: 5/5
- Tham khảo add flight bên Manager
### 3.3. Xây dựng trang Nhân viên cho Manager
- Độ ưu tiên: 3/5
- StaffPage, StaffBloc
- Thêm page vô HomeScreen (tham khảo TicketPage)
- UserRepository -> getStaffs
- Hiện bảng gồm các cột: ID, Tên đăng nhập, Tên nhân viên, Số vé bán được, Doanh thu nhân viên
- Long press dòng nào thì xóa nhân viên (nếu được thì làm dialog confirm): Tham khảo dòng 227 của flight_page.dart
- Số vé và doanh thu đã có API trong ReportRepository: lưu ý cần sửa lại dummy data để đồng nhất ID nhân viên (reportsDummy và staffsDummy)
### 3.4. Xây dựng trang Sân bay cho Manager
- Độ ưu tiên: 4/5
- AirportPage, AirportBloc
- Thêm page vô HomeScreen (tham khảo TicketPage)
- Không dùng dạng bảng nữa, mà tạo các Card (vì hiện 3 thuộc tính thôi)
- Ví dụ: https://miro.medium.com/max/1344/0*LTEDsGZPpgai4Boe
https://medium.com/dlt-labs-publication/how-to-build-a-flutter-card-list-in-less-than-10-minutes-9839f79a6c08
- Click vào 1 card (sân bay) thì hiện form sửa thông tin sân bay đó và có nút xóa (nghĩa là 2 nút Xóa và Cập nhật)
- Nút (+) để thêm sân bay (tham khảo FlightPage)
- Việc quản lý sân bay chỉ dùng dummy
## 4. Tài liệu: Minh + Nam + Quân
- https://studenthcmusedu-my.sharepoint.com/:f:/g/personal/19120591_student_hcmus_edu_vn/ErIO_4pKVWRDkODOHq8UQjcBQqJaEOSKSyGsdS_XZkB7sw?e=Je0Yz8
- **A.Minh chọn tối thiểu 8 điểm ưu tiên nha**
### 4.1. Thông tin chung [Nam]
- Độ ưu tiên: 1/5
### 4.2. Phát biểu bài toán [Nam]
- Độ ưu tiên: 2/5
### 4.3. Mô hình Use Case [Minh]
- Độ ưu tiên: 5/5
### 4.4. Phân tích [Minh]
- Độ ưu tiên: 3/5
### 4.5. Thiết kế dữ liệu [Quân]
- Độ ưu tiên: 3/5
### 4.6. Thiết kế kiến trúc [Nam]
- Độ ưu tiên: 2/5
### 4.7. Thiết kế giao diện
- Độ ưu tiên: 1/5
### 4.8. Kết quả thực hiện
- Độ ưu tiên: 1/5
## 5. Backend: Quân
### 5.1. Token [x]
- Thống nhất tất cả các attribute về **token** hoặc **accessToken**
### 5.2. DateTime
- Thống nhất format chung cho datetime là `yyyy-MM-ddTHH:mm:ss.mmmuuuZ`
- Nếu trong request không thể set format thì để dạng long và ghi tên hàm/phương thức Java tại đây:
- T tự sửa code nhưng không cho merge (conflict quá nặng) nên m sửa lại nha
```java=
package hcmus.nmq.utils;
/**
* 2:14 PM 4/17/2022
* LeHongQuan
*/
public class Constants {
public static final String AUTHORIZATION = "AUTHORIZATION";
public static final String AUTHORIZATION_HEADER = "#hcmus";
public static final String HEADER_TOKEN_NAME = "accessToken";
// public static final String API_VERSION = "v1";
public static final String AUTH_SERVICE_URL = "/auth";
public static final String FLIGHT_SERVICE_URL = "/flight";
public static final String STAFF_SERVICE_URL = "/staff";
public static final String AIRPORT_SERVICE_URL = "/air-port";
public static final String TICKET_SERVICE_URL = "/ticket";
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm";
}
```
### 5.3. Delete flight [x]
- Thêm method DELETE cho flight, tham số query là id
### 5.4 Làm api Report
### 5.5 Thêm model Staff [x]
- https://hackmd.io/i_SWoYlvSryHckH4mN0fFA?both#Staff-only-Manager
- totalTicket và totalRevenue là tính của toàn bộ, tất cả các tháng, các năm
### 5.6 Xóa các record Flight không có seatAmount, bookedAmount [x]
### 5.7 Thêm tài khoản Manager (admin) [x]
- admin
- admin
### 5.8 Lưu password dưới dạng hash [x]
- Không lưu raw
- Không trả password về sau khi sign-in và sign-up
### 5.9 Thêm attribute `ticketClassPrice` cho Flight
```json=
"ticketClassPrice":
{
"P": 1000000.0,
"L": 2000000.0,
"C": 3000000.0,
}
```
### 5.10 Fix lỗi get list Ticket thiếu
- ITicketRepositoryImpl.searchTicket chỉ trả về 2 record
---
### 5.11 Sửa lại Airport
- method GET không require code => get all airports
- Thêm thuộc tính id (chắc là database có rồi), chỉ là trả về thôi
- id
- code
- name
- address
- Thêm api update Airport, request có đủ 4 thuộc tính, update code, name, address dựa vào id
### 5.12 API method DELETE cho User
### 5.13 Bảng Rule gồm 6 thuộc tính
```java=
double minFlightDuration; // default = 25 minutes
double maxMiddleAirport; // default = 3
double minStopDuration; // default = 5 minutes
double maxStopDuration; // default = 25 minutes
double latestTimeBooking; // default = 720 minutes
double latestTimeCancelBooking; // default = 1440 minutes
```
- GET: lấy về json gồm 6 thuộc tính này
- POST: cập nhật 1 lần cả 6 thuộc tính (gửi json 6 thuộc tính)