Untitled
unknown
swift
2 years ago
10 kB
14
Indexable
class SelectCalendarVM {
var data : [BigLeaveModel] = []
var dataAPI: [LeaveModel] = []
var api = APIManager();
func getDayMonthYear(dateString: String) -> (String, String, String) {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
guard let date = formatter.date(from: dateString) else {
return ("","","")
}
formatter.dateFormat = "yyyy"
let year = formatter.string(from: date)
formatter.dateFormat = "MM"
let month = formatter.string(from: date)
formatter.dateFormat = "dd"
let day = formatter.string(from: date)
print("Get Day Month Year: ", year, month, day) // 2018 12 24
return (day, month, year)
}
func initData() {
api.getLeaveCalendar { [weak self] result in
switch result {
case .success(let apiResponse):
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
let leaveModel = LeaveModel(
year: String(apiResponse.data.year),
list_of_history_leave: apiResponse.data.listOfHistoryLeave.map { monthlyLeaveInfo in
return MonthlyLeaveInfo(
month: String(monthlyLeaveInfo.month),
leave_date: monthlyLeaveInfo.leaveDate.map { leaveDateInfo in
return LeaveDateInfo(
leavedID: String(leaveDateInfo.leaveID),
startDate: leaveDateInfo.startDate,
startType: leaveDateInfo.startType,
endDate: leaveDateInfo.endDate,
endType: leaveDateInfo.endType
)
}
)
}
)
self.dataAPI = [leaveModel]
self.processData2()
}
case .failure(let error):
print("Error: \(error)")
}
}
}
func processData2() {
// Config data to display on UI
for year in dataAPI {
// Save next month leave that related to current month. Example 30-10-2023 to 2-11-2023
var nextMonthRec : [SelectCalendarModel] = []
var nextMonthLeave : [PermissionDayInfo] = []
// Find monthly leave in a year
for month in year.list_of_history_leave {
// Array of each leave in a month
var leavesInMonth : [PermissionDayInfo] = []
// find each leave in a month
for leave in month.leave_date {
// Get date components : day, month, year
let startDate = getDayMonthYear(dateString: leave.startDate)
let endDate = getDayMonthYear(dateString: leave.endDate)
// .0: day
// .1: month
// .2: year
let startMonth = startDate.1
let endMonth = endDate.1
// SINGLE DAY LEAVE
// if end date = "", -> user take leave only 1 or half day
if leave.startDate == leave.endDate {
let startDate = getDayMonthYear(dateString: leave.startDate)
let startDay = Int(startDate.0) ?? 1
// get real day
var leaveType : PermissionType
if leave.startType == leave.endType {
// start: morning + end: morninjg = half
leaveType = .SingleDayHalf
} else {
leaveType = .SingleDay
}
let leaveUI = PermissionDayInfo(day: startDay, permission_type: leaveType)
leavesInMonth.append(leaveUI)
// MULTIPLE DAY LEAVE
} else {
// ករណីឈប់តែក្នុងខែ
if startMonth == endMonth {
let startDay = Int(startDate.0) ?? 1
let endDay = Int(endDate.0) ?? 1
for obj in startDay...endDay {
// Left Border
if obj == startDay {
let startType : PermissionType = leave.startType == "morning" ? .StartRange : .StartRangeHalf
let leaveUI = PermissionDayInfo(day: obj, permission_type: startType)
leavesInMonth.append(leaveUI)
} // Right border
else if obj == endDay {
let endType : PermissionType = leave.endType == "afternoon" ? .EndRange : .EndRangeHalf
let leaveUI = PermissionDayInfo(day: obj, permission_type: endType)
leavesInMonth.append(leaveUI)
} else {
// Middle
let leaveUI = PermissionDayInfo(day: obj, permission_type: .MiddleRange)
leavesInMonth.append(leaveUI)
}
}
} else {
// ករណីឈប់ឆ្លងខែ, Example 30-10-2023 to 2-11-2023
// Get days count of a month
let dateComponents = NSDateComponents()
dateComponents.year = Int(year.year) ?? 0
dateComponents.month = Int(startMonth) ?? 0
let calendar = NSCalendar.current
let date = calendar.date(from: dateComponents as DateComponents)// dateFromComponents(dateComponents)!
let range = calendar.range(of: .day, in: .month, for: date!)!
let numDays = range.count
// Arrange leave days of first month
let startDay = Int(startDate.0) ?? 0
for obj in startDay...numDays {
// Left Border
if obj == startDay {
let startType : PermissionType = leave.startType == "morning" ? .StartRange : .StartRangeHalf
let leave1 = PermissionDayInfo(day: obj, permission_type: startType)
leavesInMonth.append(leave1)
} else {
// Middle
let leave1 = PermissionDayInfo(day: obj, permission_type: .MiddleRange)
leavesInMonth.append(leave1)
}
}
// Arrange leave days of second month
let endDay = Int(endDate.0) ?? 0
for obj in 1...endDay {
// Right Border
if obj == endDay {
let endType : PermissionType = leave.endType == "afternoon" ? .EndRange : .EndRangeHalf
let leave1 = PermissionDayInfo(day: obj, permission_type: endType)
nextMonthLeave.append(leave1)
} else {
// Middle
let leave1 = PermissionDayInfo(day: obj, permission_type: .MiddleRange)
nextMonthLeave.append(leave1)
}
}
nextMonthRec.append(SelectCalendarModel(month: Int(endMonth) ?? 1, permission_rec: nextMonthLeave))
}
}
}
let nextMonthData = nextMonthRec.first(where: { $0.month == Int(month.month)})
if let rec = nextMonthData?.permission_rec {
for obj in rec {
leavesInMonth.append(obj)
}
}
let monthly_leave = SelectCalendarModel(month: Int(month.month) ?? 0, permission_rec: leavesInMonth)
data.append(BigLeaveModel(year: Int(year.year),monththly_leave: [monthly_leave]))
}
}
}
}
extension UIViewController {
func getMonth(dateString: String) -> (String, String, String) {
let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
guard let date = formatter.date(from: dateString) else {
return ("","","")
}
formatter.dateFormat = "yyyy"
let year = formatter.string(from: date)
formatter.dateFormat = "MM"
let month = formatter.string(from: date)
formatter.dateFormat = "dd"
let day = formatter.string(from: date)
print(year, month, day) // 2018 12 24
return (day, month, year)
}
}Editor is loading...
Leave a Comment