Untitled

mail@pastecode.io avatar
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