Proyectos de Subversion Iphone Microlearning - Inconcert

Rev

Rev 2 | Rev 17 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

//
//  DataService.swift
//  twogetskills
//
//  Created by Efrain Yanez Recanatini on 2/27/22.
//

import Foundation
import SwiftyJSON

class DataService
{
    private let database = Database.sharedInstance
    private var appData = AppData.sharedInstance

    
    
    func complete(topicModel : TopicModel, capsuleModel : CapsuleModel)
    {
        let now = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
        let dateOn = dateFormatter.string(from: now)
        

        let userUuid = appData.userUuid
        var json : [String: Any]
        var sync : SyncModel
        var userLog : UserLogModel

        let db = database.open()
        
        
        let syncDao = SyncDao(db : db)
        let progressDao = ProgressDao(db : db)
        let userLogDao = UserLogDao(db : db)
            
        var progressCapsule = progressDao.selectByCapsuleUuidAndUserUuid(capsuleUuid: capsuleModel.uuid, userUuid: userUuid)
        
        if progressCapsule.id > 0 && progressCapsule.progress >= 100 {
            progressCapsule.completed = 1
            progressCapsule.updatedOn = dateOn
            progressDao.update(record: progressCapsule)
            
            json = progressCapsule.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_PROGRESS
                        
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
               let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
            
            userLog = UserLogModel()
            userLog.userUuid = userUuid
            userLog.companyUuid = topicModel.companyUuid
            userLog.topicUuid = topicModel.uuid
            userLog.capsuleUuid = capsuleModel.uuid
            userLog.activity = Constants.USER_LOG_ACTIVITY_COMPLETED_CAPSULE
            userLog.addedOn = dateOn
            userLogDao.insert(record: userLog)
            
            json = userLog.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
                let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
        }

        var progressTopic = progressDao.selectByTopicUuidAndUserUuid(topicUuid: topicModel.uuid, userUuid: userUuid)
        
        if progressTopic.id > 0 && progressTopic.progress >= 100 {
            progressTopic.completed = 1
            progressTopic.updatedOn = dateOn
            progressDao.update(record: progressTopic)

            json = progressTopic.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_PROGRESS
                        
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
               let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
            
            userLog = UserLogModel()
            userLog.userUuid = userUuid
            userLog.companyUuid = topicModel.companyUuid
            userLog.topicUuid = topicModel.uuid
            userLog.activity = Constants.USER_LOG_ACTIVITY_COMPLETED_TOPIC
            userLog.addedOn = dateOn
            userLogDao.insert(record: userLog)
            
            json = userLog.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
                let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
        }
        
        database.close()
    }
    
    func incompleteSlide (slide: SlideModel)
    {
        //print("Notification: \(Constants.NOTIFICATION_NAME_INCOMPLETED_SLIDE) ")
       // NotificationCenter.default.post(name:Constants.NOTIFICATION_NAME_INCOMPLETED_SLIDE,
       //                                 object: nil, userInfo: ["slideUuid": slide.uuid])
    }
    
    func completeSlide( slide : SlideModel)
    {
        let db = database.open()
        let slideDao = SlideDao(db: db)
        let capsuleDao = CapsuleDao(db: db)
        let topicDao = TopicDao(db: db)
        let syncDao = SyncDao(db: db)
        let progressDao = ProgressDao(db: db)
        let userLogDao = UserLogDao(db: db)
        
        
        var updateCapsuleAndTopics = false
        let now = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
        let dateOn = dateFormatter.string(from: now)
        
        let capsule = capsuleDao.selectByUuid(uuid: slide.capsuleUuid)
        let topic = topicDao.selectByUuid(uuid: slide.topicUuid)
 
        let userUuid = appData.userUuid
        var json : [String: Any]
        var sync : SyncModel
        var userLog : UserLogModel

        
        
            
        var progressSlide = progressDao.selectBySlideUuidAndUserUuid(slideUuid: slide.uuid, userUuid: userUuid)
        var progressCapsule = progressDao.selectByCapsuleUuidAndUserUuid(capsuleUuid: slide.capsuleUuid, userUuid: userUuid)
        var progressTopic = progressDao.selectByTopicUuidAndUserUuid(topicUuid: slide.topicUuid, userUuid: userUuid)
        
        if progressTopic.id == 0 {
            userLog = UserLogModel()
            userLog.userUuid = userUuid
            userLog.companyUuid = topic.companyUuid
            userLog.topicUuid = topic.uuid
            userLog.activity = Constants.USER_LOG_ACTIVITY_START_TOPIC
            userLog.addedOn = dateOn
            userLogDao.insert(record: userLog)
            
            json = userLog.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
                let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
        }
        
        if progressCapsule.id == 0 {
            userLog = UserLogModel()
            userLog.userUuid = userUuid
            userLog.companyUuid = topic.companyUuid
            userLog.topicUuid = topic.uuid
            userLog.capsuleUuid = capsule.uuid
            userLog.activity = Constants.USER_LOG_ACTIVITY_START_CAPSULE
            userLog.addedOn = dateOn
            userLogDao.insert(record: userLog)
            
            json = userLog.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
                let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                      
            syncDao.insert(record : sync);
        }

        if progressSlide.id == 0 {
            progressSlide.userUuid = userUuid
            progressSlide.companyUuid = topic.companyUuid
            progressSlide.topicUuid = topic.uuid
            progressSlide.capsuleUuid = capsule.uuid
            progressSlide.slideUuid = slide.uuid
            progressSlide.viewSlides = 0
            progressSlide.totalSlides = 0
            progressSlide.progress = 0
            progressSlide.type = Constants.PROGRESS_TYPE_SLIDE
            progressSlide.returning = 0
            progressSlide.returningAfterCompleted = 0
            progressSlide.completed = 1
            progressSlide.addedOn = dateOn
            progressSlide.updatedOn = dateOn
            progressDao.insert(record: progressSlide)
            
            updateCapsuleAndTopics = true
        } else {
            if  progressCapsule.completed == 1 && appData.capsuleUuidActive != appData.capsuleUuidOld {
                updateCapsuleAndTopics = true
            }
        }
        /*
        else {
            
            if progressCapsule.id > 0 && progressCapsule.completed == 1 {
            
                progressSlide.returningAfterCompleted = progressSlide.returningAfterCompleted + 1
                    
                progressSlide.updatedOn = dateOn
                progressDao.update(record: progressSlide)
            }
        }*/
               
        json = progressSlide.toJson()
        json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_PROGRESS
                    
        sync = SyncModel();
        sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
        if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
           let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                sync.data = data
            }
                  
        syncDao.insert(record : sync);
                
        userLog = UserLogModel()
        userLog.userUuid = userUuid
        userLog.companyUuid = topic.companyUuid
        userLog.topicUuid = topic.uuid
        userLog.capsuleUuid = capsule.uuid
        userLog.slideUuid = slide.uuid
        userLog.activity = slide.type == Constants.SLIDE_TYPE_QUIZ ? Constants.USER_LOG_ACTIVITY_APPROVED_TEST :  Constants.USER_LOG_ACTIVITY_VIEW_SLIDE
        userLog.addedOn = dateOn
        userLogDao.insert(record: userLog)
                    
                    
        json = userLog.toJson()
        json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
                
        sync = SyncModel();
        sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
        if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
            let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                sync.data = data
            }
                  
        syncDao.insert(record : sync);
        
        if updateCapsuleAndTopics {
        
            var totalSlides = slideDao.getCountByCapsuleUuid(capsuleUuid: slide.capsuleUuid)
            var totalViews = progressDao.getCountSlideCompletedByCapsuleUuidAndUserUuid(capsuleUuid: slide.capsuleUuid, userUuid: userUuid)
            var progress = totalSlides > 0 ? ((totalViews * 100) / totalSlides) : 0

            
            if progressCapsule.id == 0 {
         
                progressCapsule = ProgressModel()
                progressCapsule.userUuid = userUuid
                progressCapsule.companyUuid = topic.companyUuid
                progressCapsule.topicUuid = slide.topicUuid
                progressCapsule.capsuleUuid = slide.capsuleUuid
                progressCapsule.type = Constants.PROGRESS_TYPE_CAPSULE
                
                progressCapsule.addedOn = dateOn
                progressCapsule.updatedOn = dateOn
                progressCapsule.viewSlides = totalViews
                progressCapsule.totalSlides = totalSlides
                progressCapsule.progress = Double(progress)
                
                progressDao.insert(record: progressCapsule)
                
 
                
            } else {
                progressCapsule.updatedOn = dateOn
                progressCapsule.viewSlides = totalViews
                progressCapsule.totalSlides = totalSlides
                progressCapsule.progress = Double(progress)
                

                
                if progressCapsule.completed == 1 && appData.capsuleUuidActive != appData.capsuleUuidOld {
                    progressCapsule.returningAfterCompleted = progressCapsule.returningAfterCompleted + 1
                }
                progressDao.update(record: progressCapsule)

            }
        
           appData.capsuleUuidOld = appData.capsuleUuidActive
           appData.save()
            
            

                
            json = progressCapsule.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_PROGRESS
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
               let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                    sync.data = data
                }
                  
            syncDao.insert(record : sync);
                    
            totalSlides = slideDao.getCountByTopicUuid(topicUuid: slide.topicUuid)
            totalViews = progressDao.getCountSlideCompletedByTopicUuidAndUserUuid(topicUuid: slide.topicUuid, userUuid: userUuid)
            progress = totalSlides > 0 ? ((totalViews * 100) / totalSlides) : 0


            if progressTopic.id == 0 {
                progressTopic = ProgressModel()
                progressTopic.userUuid = userUuid
                progressTopic.companyUuid = topic.companyUuid
                progressTopic.topicUuid = slide.topicUuid
                progressTopic.type = Constants.PROGRESS_TYPE_TOPIC
                
                progressTopic.addedOn = dateOn
                progressTopic.updatedOn = dateOn
                progressTopic.viewSlides = totalViews
                progressTopic.totalSlides = totalSlides
                progressTopic.progress = Double(progress)
                
                progressDao.insert(record: progressTopic)
                
            } else {
            
                progressTopic.updatedOn = dateOn
                progressTopic.viewSlides = totalViews
                progressTopic.totalSlides = totalSlides
                progressTopic.progress = Double(progress)
                progressDao.update(record: progressTopic)
            }
                

                
            json = progressTopic.toJson()
            json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_PROGRESS
                    
            sync = SyncModel();
            sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
            if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
               let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
                   sync.data = data
                }
                  
            syncDao.insert(record : sync);
        }
        
        
        
        if slide.completed == 1 {
        
            print("Notification: \(Constants.NOTIFICATION_NAME_COMPLETED_SLIDE) ")
            NotificationCenter.default.post(name:Constants.NOTIFICATION_NAME_COMPLETED_SLIDE,  object: nil, userInfo: ["slideUuid": slide.uuid])
        }
        
        if ( updateCapsuleAndTopics ) {
            
            print("Notification: \(Constants.NOTIFICATION_NAME_CHANGE_PERCENTAJE_COMPLETED_CAPSULE) ")
            NotificationCenter.default.post(name: Constants.NOTIFICATION_NAME_CHANGE_PERCENTAJE_COMPLETED_CAPSULE, object: nil, userInfo:["capsuleUuid": slide.capsuleUuid])
            
            
            print("Notification: \(Constants.NOTIFICATION_NAME_CHANGE_PERCENTAJE_COMPLETED_TOPIC) ")
            NotificationCenter.default.post(name: Constants.NOTIFICATION_NAME_CHANGE_PERCENTAJE_COMPLETED_TOPIC, object: nil, userInfo:["topicUuid": slide.topicUuid])
            
        }
        
        database.close()
          
    }

    
    
    
    public func syncFromServer(json : JSON?, refresh : Bool = false) -> Bool
    {
        let db = database.open()
        let companyDao = CompanyDao(db: db)
        let topicDao = TopicDao(db: db)
        let capsuleDao = CapsuleDao(db: db)
        let slideDao = SlideDao(db: db)
        let quizDao = QuizDao(db: db)
        let questionDao = QuestionDao(db: db)
        let answerDao = AnswerDao(db: db)
        let userLogDao = UserLogDao(db: db)
        let progressDao = ProgressDao(db: db)
        let userExtendedDao = UserExtendedDao(db: db)
        let userNotificationDao = UserNotificationDao(db: db)

        answerDao.removeAll()
        questionDao.removeAll()
        quizDao.removeAll()
                                
        slideDao.removeAll()
        capsuleDao.removeAll()
        topicDao.removeAll()
        companyDao.removeAll()
                        
        userExtendedDao.removeAll()
        
        //userLogDao.removeAll()
        //progressDao.removeAll()
        //userNotificationDao.removeAll()

        var companyModel : CompanyModel
        let now = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
        let dateOn = dateFormatter.string(from: now)
            
        if json?["data"]["max_date_changes"] != ""  {
            let maxDateChanges = json?["data"]["max_date_changes"].string ?? ""
            
            //print("maxDateChanges : \(maxDateChanges)")
            appData.maxDateChanges = maxDateChanges
        } 
        
        if !refresh  && json?["data"]["device"] != "" {
            let deviceAes = json?["data"]["device"]["aes"].string ?? ""
            let devicePassword = json?["data"]["device"]["password"].string ?? ""
            
            //print("deviceAes: \(deviceAes)")
           // print("devicePassword: \(devicePassword)")
            appData.deviceAes = deviceAes
            appData.devicePassword = devicePassword
            
        }
        if json?["data"]["user"] != "" {
            let userUuid = json?["data"]["user"]["uuid"].string ?? ""
            let userFirstName = json?["data"]["user"]["first_name"].string ?? ""
            let userLastName = json?["data"]["user"]["last_name"].string ?? ""
            let userEmail = json?["data"]["user"]["email"].string ?? ""
            let userImage = json?["data"]["user"]["image"].string ?? ""
   
            //print("userUuid : \(userUuid)")
            //print("userFirstName : \(userFirstName)")
            //print("userLastName: \(userLastName)")
            //print("userEmail : \(userEmail)")
            //print("userImage : \(userImage)")
                 
            appData.userUuid = userUuid
            appData.userFirstname = userFirstName
            appData.userLastname =  userLastName
            appData.userEmail = userEmail
            appData.userImage = userImage
        }
    
        appData.lastCheckChanges = dateOn
        appData.topicUuidActive = ""
        appData.capsuleUuidActive = ""
        appData.capsuleUuidOld = ""
        appData.slideUuidActive = ""
        appData.save()
        
        userLogDao.removeAllUserUuidNotEqual(userUuid: appData.userUuid)
        progressDao.removeAllUserUuidNotEqual(userUuid: appData.userUuid)
        userNotificationDao.removeAllUserUuidNotEqual(userUuid: appData.userUuid)
                                    
        if json?["data"]["topics"] != "" {
            var topicModel : TopicModel
            var capsuleModel : CapsuleModel
            var slideModel : SlideModel
            
            for topic in json!["data"]["topics"]
            {
                                    
                companyModel = CompanyModel()
                companyModel.uuid = topic.1["company_uuid"].string ?? ""
                companyModel.name = topic.1["company_name"].string ?? ""
                companyModel.image = topic.1["company_image"].string ?? ""
                
               // print("companyUuid : \(companyModel.uuid)")
               // print("companyName : \(companyModel.name)")
               // print("companyImage : \(companyModel.image)")
                
                let company = companyDao.selectByUuid(uuid:  companyModel.uuid)
                if(company.uuid.isEmpty) {
                    companyDao.insert(company: companyModel)
                } else {
                    companyDao.update(company: companyModel)
                }
                                        
                topicModel = TopicModel()
                topicModel.companyUuid = companyModel.uuid
                topicModel.uuid = topic.1["uuid"].string ?? ""
                topicModel.name  = topic.1["name"].string ?? ""
                topicModel.description = topic.1["description"].string ?? ""
                topicModel.image = topic.1["image"].string ?? ""
                topicModel.position = Int(topic.1["position"].string ?? "") ?? 1
                topicModel.addedOn = topic.1["added_on"].string ?? ""
                topicModel.updatedOn = topic.1["updated_on"].string ?? ""
                
                
               // print("topiccompanyUuid: \(topicModel.companyUuid)")
                //print("topicUuid: \(topicModel.uuid)")//
               // print("topicName: \(topicModel.name)")
                //print("topicDescription: \(topicModel.description)")//
                //print("topicImage: \(topicModel.image)")
                //print("topicPosition: \(topicModel.position)")

                                        
                  
                // Insert Topics in DB
                topicDao.insert(topic: topicModel)
                                        
                for capsule in topic.1["capsules"]
                {
                                            
                    capsuleModel = CapsuleModel()
                    capsuleModel.topicUuid = topicModel.uuid
                    capsuleModel.uuid = capsule.1["uuid"].string ?? ""
                    capsuleModel.name = capsule.1["name"].string ?? ""
                    capsuleModel.description = capsule.1["description"].string ?? ""
                    capsuleModel.image = capsule.1["image"].string ?? ""
                    capsuleModel.position = Int(capsule.1["position"].string ?? "") ?? 1
                    capsuleModel.linkComments = capsule.1["link_comments"].string ?? ""
                    capsuleModel.linkCommentAdd = capsule.1["link_comment_add"].string ?? ""
                    capsuleModel.totalComments = Int(capsule.1["total_comments"].string ?? "") ?? 0
                    capsuleModel.totalRating = Decimal(Double(capsule.1["total_rating"].string ?? "") ?? 0)
                    capsuleModel.addedOn = capsule.1["added_on"].string ?? ""
                    capsuleModel.updatedOn = capsule.1["updated_on"].string ?? ""
                    
                    //print("capsuletopicUuid: \(capsuleModel.topicUuid)")
                    //print("capsuleUuid: \(capsuleModel.uuid)")
                    //print("capsuleName: \(capsuleModel.name)")
                    //print("capsuleDescription: \(capsuleModel.description)")
                    //print("capsuleImage: \(capsuleModel.image)")
                    //print("capsulePosition: \(capsuleModel.position)")
                    //print("capsuleLinkComments: \(capsuleModel.linkComments)")
                    //print("capsuleLinkCommentAdd: \(capsuleModel.linkCommentAdd)")
                    //print("capsuleTotalComments: \(capsuleModel.totalComments)")
                    //print("capsuleTotalRating: \(capsuleModel.totalRating)")

                                            
                    // Insert Capsules in DB
                    capsuleDao.insert(capsule: capsuleModel)
                                            
                    for slide in capsule.1["slides"]
                    {
                        slideModel = SlideModel()
                        slideModel.topicUuid = capsuleModel.topicUuid
                        slideModel.capsuleUuid = capsuleModel.uuid
                        slideModel.uuid = slide.1["uuid"].string ?? ""
                        slideModel.quizUuid = slide.1["quiz_uuid"].string ?? ""
                        slideModel.name = slide.1["name"].string ?? ""
                        slideModel.description = slide.1["description"].string ?? ""
                        slideModel.position = Int(slide.1["position"].string ?? "") ?? 1
                        slideModel.background = slide.1["background"].string ?? ""
                        slideModel.file = slide.1["file"].string ?? ""
                        slideModel.type = slide.1["type"].string ?? ""
                        slideModel.addedOn = slide.1["added_on"].string ?? ""
                        slideModel.updatedOn = slide.1["updated_on"].string ?? ""
                        
                        
                        //print("slidetopicUuid: \(slideModel.topicUuid)")
                        //print("slidecapsuleUuid: \(slideModel.capsuleUuid)")
                        //print("slideUuid: \(slideModel.uuid)")
                        //print("slideQuizUuid: \(slideModel.quizUuid)")
                        //print("slideName: \(slideModel.name)")
                        //print("slideDescription: \(slideModel.description)")
                        //print("slidePosition: \(slideModel.position)")
                        //print("slideBackground: \(slideModel.background)")
                        //print("slideFile: \(slideModel.file)")
                        //print("slideTye: \(slideModel.type)")
                                                
                        // Insert Slides in DB
                        slideDao.insert(slide: slideModel)
                    }
                }
            }
        }
        
        if json?["data"]["quizzes"] != "" {
            var quizModel : QuizModel
            var questionModel : QuestionModel
            var answerModel  : AnswerModel
            for quiz in json!["data"]["quizzes"]
            {
                

                companyModel = CompanyModel()
                companyModel.uuid = quiz.1["company_uuid"].string ?? ""
                companyModel.name = quiz.1["company_name"].string ?? ""
                companyModel.image =  quiz.1["company_image"].string ?? ""
                
                //print("companyUuid : \(companyModel.uuid)")
                //print("companyName : \(companyModel.name)")
                //print("companyImage : \(companyModel.image)")
                
                let company = companyDao.selectByUuid(uuid:  companyModel.uuid)
                if(company.uuid.isEmpty) {
                    companyDao.insert(company: companyModel)
                } else {
                    companyDao.update(company: companyModel)
                }
                
                quizModel = QuizModel()
                quizModel.companyUuid = company.uuid
                quizModel.uuid = quiz.1["uuid"].string ?? ""
                quizModel.name = quiz.1["name"].string ?? ""
                quizModel.text = quiz.1["text"].string ?? ""
                quizModel.failed = quiz.1["failed"].string ?? ""
                quizModel.points = Int(quiz.1["points"].string ?? "") ?? 0
                quizModel.minimumPointsRequired = Int(quiz.1["minimum_points_required"].string ?? "") ?? 0
                quizModel.maxTime = Int(quiz.1["max_time"].string ?? "") ?? 0
                quizModel.addedOn = quiz.1["added_on"].string ?? ""
                quizModel.updatedOn = quiz.1["updated_on"].string ?? ""
                                        
               
                //print("quizcompanyUuid: \(quizModel.companyUuid)")
                //print("quizUuid: \(quizModel.uuid)")
                //print("quizName: \(quizModel.name)")
                //print("quizText: \(quizModel.text)")
                //print("quizFailed: \(quizModel.failed)")
                //print("quizPoints: \(quizModel.points)")
                //print("quizMinimumPointsRequired: \(quizModel.minimumPointsRequired)")
                //print("quizMaxTime: \(quizModel.maxTime)")

                
                quizDao.insert(quiz: quizModel)
                
                for question in quiz.1["questions"]
                {
                    questionModel = QuestionModel()
                    questionModel.quizUuid = quizModel.uuid
                    questionModel.uuid = question.1["uuid"].string ?? ""
                    questionModel.text  = question.1["text"].string ?? ""
                    questionModel.type = question.1["type"].string ?? ""
                    questionModel.points  = Int(question.1["points"].string ?? "") ?? 0
                    questionModel.max_length = Int(question.1["maxlength"].string ?? "") ?? 0
                    questionModel.addedOn = question.1["added_on"].string ?? ""
                    questionModel.updatedOn = question.1["updated_on"].string ?? ""
                    
                    //print("questionQuizUuid: \(questionModel.quizUuid)")
                    //print("questionId: \(questionModel.uuid)")
                    //print("questionText: \(questionModel.text)")
                    //print("questionType: \(questionModel.type)")
                    //print("questionPoints: \(questionModel.points)")
                    //print("questionMaxLength: \(questionModel.max_length)")

                    
                    questionDao.insert(question: questionModel)
                    
                    for answer in question.1["answers"]
                    {
                        answerModel = AnswerModel()
                        answerModel.questionUuid = questionModel.uuid
                        answerModel.uuid  = answer.1["uuid"].string ?? ""
                        answerModel.text = answer.1["text"].string ?? ""
                        answerModel.correct = Int(answer.1["correct"].string ?? "") ?? 0
                        answerModel.points = Int(answer.1["points"].string ?? "") ?? 0
                        answerModel.addedOn = answer.1["added_on"].string ?? ""
                        answerModel.updatedOn = answer.1["updated_on"].string ?? ""
                        
                        //print("answerQuestionUuid: \(answerModel.questionUuid)")
                        //print("answerId: \(answerModel.uuid)")
                        //print("answerText: \(answerModel.text)")
                        //print("answerCorrect: \(answerModel.correct)")

                        
                        
                        answerDao.insert(answer: answerModel)

                    }
                    
                    
                }
                
            }
        }
        
        if json?["data"]["userlog"] != "" {

            var userLogModel : UserLogModel
            for userlog in json!["data"]["userlog"]
            {
                userLogModel = UserLogModel()
                userLogModel.companyUuid = userlog.1["company_uuid"].string ?? ""
                userLogModel.userUuid = userlog.1["user_uuid"].string ?? ""
                userLogModel.topicUuid = userlog.1["topic_uuid"].string ?? ""
                userLogModel.capsuleUuid = userlog.1["capsule_uuid"].string ?? ""
                userLogModel.slideUuid = userlog.1["slide_uuid"].string ?? ""
                userLogModel.activity = userlog.1["activity"].string ?? ""
                userLogModel.addedOn = userlog.1["added_on"].string ?? ""
                
                userLogDao.insert(record: userLogModel)
            }
        }
 
        if json?["data"]["extended"] != "" {

            var userExtendedModel : UserExtendedModel
            for userExtended in json!["data"]["extended"]
            {
                companyModel = CompanyModel()
                companyModel.uuid = userExtended.1["company_uuid"].string ?? ""
                companyModel.name = userExtended.1["company_name"].string ?? ""
                companyModel.image =  userExtended.1["company_image"].string ?? ""
                
                print("companyUuid : \(companyModel.uuid)")
                print("companyName : \(companyModel.name)")
                print("companyImage : \(companyModel.image)")
                
                let company = companyDao.selectByUuid(uuid: companyModel.uuid)
                if(company.uuid.isEmpty) {
                    companyDao.insert(company: companyModel)
                } else {
                    companyDao.update(company: companyModel)
                }
                
                for detail in userExtended.1["details"]
                {
                    userExtendedModel = UserExtendedModel()
                    userExtendedModel.companyUuid = companyModel.uuid
                    userExtendedModel.uuid = detail.1["uuid"].string ?? ""
                    userExtendedModel.label = detail.1["label"].string ?? ""
                    userExtendedModel.value = detail.1["value"].string ?? ""
                    
                    userExtendedDao.insert(record: userExtendedModel)
                }
            }
        }
        
        if json?["data"]["progress"] != "" {
            
            var progressModel : ProgressModel
            for progress in json!["data"]["progress"] {
                
                
                let userUuid = progress.1["user_uuid"].string ?? ""
                let topicUuid = progress.1["topic_uuid"].string ?? ""
                let capsuleUuid = progress.1["capsule_uuid"].string ?? ""
                let slideUuid = progress.1["slide_uuid"].string ?? ""
                let type = progress.1["type"].string ?? ""
                
                
                switch type {
                    case Constants.PROGRESS_TYPE_TOPIC:
                        progressModel = progressDao.selectByTopicUuidAndUserUuid(topicUuid: topicUuid, userUuid: userUuid)
                        break
                        
                    case Constants.PROGRESS_TYPE_CAPSULE:
                        progressModel = progressDao.selectByCapsuleUuidAndUserUuid(capsuleUuid: capsuleUuid, userUuid: userUuid)
                        break
                        
                    case Constants.PROGRESS_TYPE_SLIDE:
                        progressModel = progressDao.selectBySlideUuidAndUserUuid(slideUuid: slideUuid, userUuid: userUuid)
                        break
                    default:
                        continue
                    }
     
                
                if progressModel.id == 0 {
                    progressModel = ProgressModel()
                    progressModel.userUuid = userUuid
                    progressModel.topicUuid = topicUuid
                    progressModel.capsuleUuid = capsuleUuid
                    progressModel.slideUuid = slideUuid
                    progressModel.type = type
                    progressModel.companyUuid = progress.1["company_uuid"].string ?? ""
                    progressModel.progress = Double(progress.1["progress"].string ?? "") ?? 0.0
                    progressModel.totalSlides = Int(progress.1["total_slides"].string ?? "") ?? 0
                    progressModel.viewSlides = Int(progress.1["view_slides"].string ?? "") ?? 0
                    progressModel.returning = Int(progress.1["returning"].string ?? "") ?? 0
                    progressModel.returningAfterCompleted = Int(progress.1["returning_after_completed"].string ?? "") ?? 0
                    progressModel.completed = Int(progress.1["completed"].string ?? "") ?? 0
                    progressModel.addedOn = progress.1["added_on"].string ?? ""
                    progressModel.updatedOn = progress.1["updated_on"].string ?? ""
                        
                    progressDao.insert(record: progressModel)
                }

            }
        }
         
        database.close()
        return true;
    }
    
    
}