Untitled
unknown
swift
17 days ago
10 kB
3
Indexable
Never
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) } }
Leave a Comment