class AccessLogger():
    """
    Class: AccessLogger
    -------------------
    Logs all the sorce ip, method an route for each requets
    Return: Function
    """
    def __init__(self):
        self.logger = Logger()

    def log_request(self, f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            self.logger.write_log(
                "ACCESS", "{} | {} | {}".format(request.remote_addr,
                                                request.method, request.url))
            return f(*args, **kwargs)

        return wrapper
Esempio n. 2
0
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = LogModel(user)
        self.logger = Logger()

        self.access_file = os.path.abspath(ACCESS_LOG_PATH)
        self.event_file = os.path.abspath(EVENT_LOG_PATH)
        self.error_file = os.path.abspath(ERROR_LOG_PATH)
        self.upload_file = os.path.abspath(UPLOAD_LOG_PATH)
        self.process_upload_file = os.path.abspath(PROCESS_UPLOAD_LOG_PATH)
        self.cs_req_file = os.path.abspath(CS_REQ_LOG_PATH)
        self.ad_req_file = os.path.abspath(AD_REQ_LOG_PATH)
        self.ad_access_file = os.path.abspath(USER_ACCESS_LOG_PATH)
Esempio n. 3
0
# -*- coding: utf-8 -*-
# Created by #chuyong, on 2020/1/20.
# Copyright (c) 2019 3KWan.
# Description :

import pymysql

from app.libs.logger import Logger

logger = Logger("MysqlDB")


class MysqlDB:
    """  mysql数据库操作类 """

    # 数据库配置信息
    _db_info = {
        "host": "",
        "user": "",
        "password": "",
        "database": "",
        "port": 3306
    }

    def __init__(self, host, user, password, database, port=3306):
        """
            ps: 进行数据库操作,需手动建立连接和断开连接

        :param host:
        :param user:
        :param password:
 def __init__(self, user):
     self.lang = {}
     self.lang = getattr(language, config.DEFAULT_LANG)
     self.user = user
     self.model = Vouchers(user)
     self.logger = Logger()
class vouchersServices(object):
    """
        Class contains functions and attributes for authtentication
        Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Vouchers(user)
        self.logger = Logger()


    def getAllVouchers(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {'page': 0, 'fromdate': '', 'todate': ''}
        else:
            pass

        print(request_data)
 
        self.logger.write_to_console("EVENT", "loading all vouchers for {0}".format(self.user['username']))
        
        if request_data == {}:
            request_data = {'offset':0, 'records':10, 'fromdate':'', 'todate':'', 'status':''}
        else:
            request_data['offset'] = int(request_data['page'])*10
            request_data['records'] = 10

        if self.user.get('branch_code',"").lower()!='all':
            request_data['branch']=self.user.get('branch')
        customer_data = self.model.getAllVouchers(request_data)
        print(customer_data)

        branch_data = self.model.getBranches()

        for result in customer_data[0]:

            result["date_uploaded"] = result["date_uploaded"].strftime("%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]

        pages = math.ceil(customer_data[1][0]['count']/12)
        print(pages)

        self.logger.write_to_console("EVENT", "Administrators gotten | Success.")
        return {"code":language.CODES['SUCCESS'], "msg":self.lang['data_retrived'], "data":customer_data[0], "pages": pages, "branches": branch_data}
        return customer_data

    def getAllvouchersExport(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        request_data['offset'] = 0
        request_data['records'] = 1000000

        print(request_data)
 
        self.logger.write_to_console("EVENT", "loading all bulkpay uploads for {0}".format(self.user['username']))
        
        export_list = [['ACCOUNT', 'FIRST NAME', 'LAST NAME', 'MIDDLE NAME','GENDER','PHONE NUMBER', 'BRANCH', 'STATUS', 'DATE REGISTERED']]

        # if self.user['access_level_id'] == 4:
        merchant_data = self.model.getAllvouchers(request_data)
        # else:
        #     merchant_data = self.model.getAllvouchersByBranch(request_data)

        print(merchant_data)
        for result in merchant_data[0]:

            result["join_date"] = result["join_date"].strftime("%Y-%m-%d %H:%M:%S")

            if result["status"] == 1:
                result["status"] = self.lang["active"]
            else:
                result["status"] = self.lang["inactive"]

            export_list.append([result['id'], result['first_name'], result['last_name'], result['middle_name'], result['gender'], result['status'], result['join_date']])

        print(export_list)
        return export_list


    def addVoucher(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console("EVENT", "{0} Adding Customer {1}".format(self.user['username'], str(request_data)))

        request_data['requested_by'] = self.user['username']
        request_data['branch'] = request_data['customer_account'][:3]

        print(request_data)
        result = self.model.addNewRegistrationRequest(request_data)
        result = self.model.addCustomerRequest({'requested_by': self.user['username'], 'request_type': '0', 'customer_msisdn': request_data['customer_msisdn'], 'customer_account': request_data['customer_account'], 'branch': self.user['branch_id'] })
        self.logger.write_log("CUSTOMER", "Customer registration Request | {} | {} | {} | ".format(request_data['customer_msisdn'], request_data['customer_account'], self.user['username']))
        # return customer_data
        return {'code': '00', 'msg': 'Customer registration request sent successfully'}

    def getVoucherDetials(self, request_data):
        """
            This function handles all logic related to login on the platform
            @Params : void
        """       
        self.logger.write_to_console("EVENT", "Getting voucher details: {}".format(request_data))
        # print(request_data.get('msisdn'))
        request_keys  = request_data.keys()
        validation_keys = ["mno","msisdn","apikey","serial_no"]
        for item in validation_keys: 
            if item  not in request_data:
               return {'code': '01', 'msg': 'Wrong parameters sent.', 'data':[]}

        if request_data['apikey'] != "500cdd1b531d83e00a5a4":
            return {'code': '01', 'msg': 'Unauthorised request.', 'data':[]}

        # if 'serial_no' not in request_data or 'sticker_no' not in request_data or 'msisdn' not in request_data or 'mno' not in request_data:
        #     return {'code': '01', 'msg': 'Wrong parameters sent.', 'data':[]}

        # vhash = hashlib.sha256((request_data['serial_no'] +":"+ request_data['sticker_no']).encode())
        vhash = hashlib.sha256((request_data['serial_no']).encode())
        vhash = vhash.hexdigest()
        print(vhash)

        voucher_data = self.model.getVoucherByHash(vhash)
        for result in voucher_data:
            result["date_uploaded"] = result["date_uploaded"].strftime("%Y-%m-%d %H:%M:%S")
            if result["date_validated"] != None:
                result["date_validated"] = result["date_validated"].strftime("%Y-%m-%d %H:%M:%S")

        if voucher_data == []:
            return {'code': '01', 'msg': 'Serial number is invalid.', 'data':[]}
        else:
            return {'code': '00', 'msg': 'Serial number is valid.', 'data':[]}

    def getVoucherDetialsValidate(self, request_data):
        """
            This function handles all logic related to login on the platform
            @Params : void
        """       
        self.logger.write_to_console("EVENT", "Getting voucher details: {}".format(request_data))

        if request_data['apikey'] != "500cdd1b531d83e00a5a4":
            return {'code': '01', 'msg': 'Unauthorised request.', 'data':[]}

        if 'serial_no' not in request_data or 'sticker_no' not in request_data or 'msisdn' not in request_data or 'mno' not in request_data:
            return {'code': '01', 'msg': 'Wrong parameters sent.', 'data':[]}

        vhash = hashlib.sha256((request_data['serial_no'] +":"+ request_data['sticker_no']).encode())
        vhash = vhash.hexdigest()
        print(vhash)

        voucher_data = self.model.getVoucherByHash(vhash)
        for result in voucher_data:
            result["date_uploaded"] = result["date_uploaded"].strftime("%Y-%m-%d %H:%M:%S")
            if result["date_validated"] != None:
                result["date_validated"] = result["date_validated"].strftime("%Y-%m-%d %H:%M:%S")

        if voucher_data == []:
            use_data = { "user_msisdn": request_data['msisdn'], "serial_no": request_data['serial_no'], "sticker_no": request_data['sticker_no'], 'status': "NON-EXISTENT", 'status_details': "Sticker does not exist.", 'user_mno': request_data['mno'], }
            self.model.add_user_activity(use_data)
            blacklist_res = self.report_user(use_data)
            return {'code': '02', 'msg': 'Voucher is invalid.', 'data':[], "blacklisted": blacklist_res}
        else:
            if voucher_data[0]['is_used'] == "USED":
                use_data = { "user_msisdn": request_data['msisdn'], "serial_no": request_data['serial_no'], "sticker_no": request_data['sticker_no'], 'status': "USED STICKER", 'status_details': "Sticker already used.", 'user_mno': request_data['mno'], }
                self.model.add_user_activity(use_data)
                blacklist_res = self.report_user(use_data)
                return {'code': '01', 'msg': 'Voucher is used', 'data': voucher_data[0], "blacklisted": blacklist_res}
            elif voucher_data[0]['is_used'] == "UNUSED":
                use_data = { "user_msisdn": request_data['msisdn'], "serial_no": request_data['serial_no'], "sticker_no": request_data['sticker_no'], 'status': "VALID STICKER", 'status_details': "Sticker is valid.", 'user_mno': request_data['mno'], }
                self.model.add_user_activity(use_data)
                return {'code': '00', 'msg': 'Voucher is not used', 'data':[]}
            else:
                use_data = { "user_msisdn": request_data['msisdn'], "serial_no": request_data['serial_no'], "sticker_no": request_data['sticker_no'], 'status': "NON-EXISTENT", 'status_details': "Sticker does not exist.", 'user_mno': request_data['mno'], }
                self.model.add_user_activity(use_data)
                blacklist_res = self.report_user(use_data)
                return {'code': '02', 'msg': 'Voucher is invalid.', 'data':[], "blacklisted": blacklist_res}

    def getSerialDetialsValidate(self, request_data):
        """
            This function handles all logic related to login on the platform
            @Params : void
        """       
        self.logger.write_to_console("EVENT", "Getting voucher details: {}".format(request_data))

        if request_data['apikey'] != "500cdd1b531d83e00a5a4":
            return {'code': '01', 'msg': 'Unauthorised request.', 'data':[]}

        if 'serial_no' not in request_data or 'msisdn' not in request_data or 'mno' not in request_data:
            return {'code': '01', 'msg': 'Wrong parameters sent.', 'data':[]}


        escaped_serial_no = re.sub("\ |\?|\.|\!|\/|\;|\:|\%|\@|\#|\*|\)|\(", '', request_data['serial_no'])
        vhash = hashlib.sha256((escaped_serial_no.encode()))
        vhash = vhash.hexdigest()
        print(vhash)

        voucher_data = self.model.getSerialByHash(vhash)
        validators = self.model.getValidatorByMsisdn(request_data['msisdn'])

        
        if voucher_data == []:
            if validators == []:
                use_data = { "user_msisdn": request_data['msisdn'], "user_type": "gen_public", "user_name": "unknown", "serial_no": request_data['serial_no'], 'status': "NON EXISTENT", 'status_details': "Serial does not exist", 'user_mno': request_data['mno'], }
                self.model.add_user_activity(use_data)
            else:
                use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "FAILED", 'status_details': "Serial does not exist", 'user_mno': request_data['mno'], }
                self.model.add_user_activity(use_data)
            return {'code': '02', 'msg': 'Your serial is invalid.', 'data':[]}
        else:
            #identify who is initiating the validation (a user or a validator)
            #validators = self.model.getValidatorByMsisdn(request_data['msisdn'])

            if validators == []:
                #if no validator data is found, then user is a public user
                if voucher_data[0]['serial_status'] == "NOT VALIDATED":
                    use_data = { "user_msisdn": request_data['msisdn'], "user_type": "gen_public", "user_name": "unknown", "serial_no": request_data['serial_no'], 'status': "NOT VALIDATED", 'status_details': "Serial is not validated", 'user_mno': request_data['mno'], }
                    self.model.add_user_activity(use_data)
                    return {'code': '01', 'msg': 'Your serial is not validated', 'data': []}
                elif voucher_data[0]['serial_status'] == "VALIDATED":
                    voucher_data[0]["expiry_date"] = voucher_data[0]["expiry_date"].strftime("%Y-%m-%d")
                    expiry_date = voucher_data[0]["expiry_date"]
                    use_data = { "user_msisdn": request_data['msisdn'], "user_type": "gen_public", "user_name": "unknown", "serial_no": request_data['serial_no'], 'status': "VALIDATED", 'status_details': 'Serial is validated but expires on ' + voucher_data[0]["expiry_date"], 'user_mno': request_data['mno'], }
                    self.model.add_user_activity(use_data)
                    return {'code': '00', 'msg': 'Your serial is valid but expires on ' + voucher_data[0]["expiry_date"], 'data':[]}
                else:
                    use_data = { "user_msisdn": request_data['msisdn'], "user_type": "gen_public", "user_name": "unknown", "serial_no": request_data['serial_no'], 'status': "NO ACTION", 'status_details': "No action performed", 'user_mno': request_data['mno'], }
                    self.model.add_user_activity(use_data)
                    return {'code': '02', 'msg': 'No action to perform', 'data':[]}

            else:
                    #ok now we know its a validator, lets proceed to validate a serial number if not validated yet
                if voucher_data[0]['serial_status'] == "NOT VALIDATED":
                    #All serials must be assigned to branch before validation can be successful so check here
                    if voucher_data[0]['branch_assigned'] == "None":
                        use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "FAILED", 'status_details': "Serial not assigned to a branch", 'user_mno': request_data['mno'], }
                        self.model.add_user_activity(use_data)
                        return {'code': '01', 'msg': 'Serial must be assigned to a branch', 'data': []}

                    else:
                        expiry_date = self.addDaysToDate(addDays = 90)
                        update_params = {
                            "serial_id": voucher_data[0]['serial_id'],
                            "serial_status": "VALIDATED",
                            "validator_msisdn": validators[0]["msisdn"],
                            "date_validated": "NOW()",
                            "expiry_date": expiry_date
                        }
                        update_response = self.model.updateSerial(update_params)
                        if update_response == True:
                            use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "SUCCESS", 'status_details': "Successful serial validation", 'user_mno': request_data['mno'], }
                            self.model.add_user_activity(use_data)
                            return {'code': '00', 'msg': 'Serial successfully validated', 'data': []}
                        else:
                            use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "FAILED", 'status_details': "Failed to validate serial ", 'user_mno': request_data['mno'], }
                            self.model.add_user_activity(use_data)
                            return {'code': '01', 'msg': 'Failed to validate Serial', 'data': []}

                elif voucher_data[0]['serial_status'] == "VALIDATED":
                    use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "DUPLICATE", 'status_details': "Serial already validated", 'user_mno': request_data['mno'], }
                    self.model.add_user_activity(use_data)
                    return {'code': '00', 'msg': 'Serial is already validated', 'data':[]}

                else:
                    use_data = { "user_msisdn": request_data['msisdn'], "user_type": "validator", "user_name": validators[0]["first_name"], "user_branch": validators[0]["branch"], "serial_no": request_data['serial_no'], 'status': "NO ACTION", 'status_details': "No action performed", 'user_mno': request_data['mno'], }
                    self.model.add_user_activity(use_data)
                    return {'code': '02', 'msg': 'Nothing for admin to perform', 'data':[]}

    def report_user(self, use_data):
        today_start = str(datetime.datetime.today().date())+' 00:00:00'
        today_end = str(datetime.datetime.today().date())+' 23:59:59'

        request_data = {'offset':0, 'records':1000, 'fromdate': today_start, 'todate': today_end, 'status':'', 'user_msisdn': use_data["user_msisdn"]}
        act = Activities({})
        vdata = act.getAllActivities(request_data)
        print(vdata)
        if len(vdata[0]) >=3:
            self.model.addBlacklist({"msisdn": use_data["user_msisdn"], "reason": "Too many wrong tries"})
            return True
        else:
            return False

    def useVoucher(self, request_data):
        """
            This function handles all logic related to login on the platform
            @Params : void
        """       
        self.logger.write_to_console("EVENT", "Getting voucher details: {}".format(request_data))

        if request_data['apikey'] != "500cdd1b531d83e00a5a4":
            return {'code': '01', 'msg': 'Unautorised request.', 'data':[]}

        if 'serial_no' not in request_data or 'sticker_no' not in request_data or 'msisdn' not in request_data or 'mno' not in request_data or 'car_no' not in request_data:
            return {'code': '01', 'msg': 'Wrong parameters sent.', 'data':[]}

        vhash = hashlib.sha256((request_data['serial_no'] +":"+ request_data['sticker_no']).encode())
        vhash = vhash.hexdigest()
        print(vhash)

        voucher_data = self.model.getVoucherByHash(vhash)
        if voucher_data == []:
            return {'code': '01', 'msg': 'Voucher is invalid.', 'data':[]}
        else:
            if voucher_data[0]['is_used'] == "USED":
                return {'code': '01', 'msg': 'Voucher is already used', 'data': []}
            elif voucher_data[0]['is_used'] == "UNUSED":
                vcode = ''.join(random.SystemRandom().choice(string.digits) for _ in range(8))
                sms_status = 'SENT'
                use_data = {
                            "unique_id": voucher_data[0]['unique_id'],
                            "is_used": "USED",
                            "car_no": request_data['car_no'],
                            'user_msisdn': request_data['msisdn'],
                            'user_mno': request_data['mno'],
                            'serial_no': request_data['serial_no'],
                            'sticker_no': request_data['sticker_no'],
                            'sms_status': sms_status,
                            'verification_code': vcode,
                            'date_validated': 'NOW()'
                            }
                print(use_data)
                result = self.model.updateVoucher(use_data)
                if result == True:
                    return {'code': '00', 'msg': 'Voucher validation completed.', 'data':{"car_no": request_data['car_no'], 'use_msisdn': request_data['msisdn'],'serial_no': request_data['serial_no'], 'sticker_no': request_data['sticker_no'], 'verification_code': vcode }}
                else:
                    return {'code': '01', 'msg': 'Failed: Kindly try again.', 'data':[]}
            else:
                return {'code': '01', 'msg': 'Voucher is invalid.', 'data':[]}


    def updateVoucher(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console("EVENT", "{0} Customer Reset Pin {1}".format(self.user['username'], str(request_data)))

        pending_requests = self.model.getCustomerRequests(request_data['id'])

        if request_data['msisdn'] != request_data['id']:     
            if len(pending_requests) > 0:
                for reques in pending_requests:
                    if reques['request_type'] == 2:
                        return {'code': '01', 'msg': 'Change phone number request for customer is already pending.'}
                    else:
                        result = self.model.addCustomerRequest({'requested_by': self.user['username'], 'request_type': '2', 'customer_msisdn': request_data['id'], 'customer_account': request_data['id'], 'branch': self.user['branch_id'], 'change_from': request_data['id'], 'change_to': request_data['msisdn'] })
                        self.logger.write_log("CUSTOMER", "Change Customer Phone Number Request | {} | {} | {} ".format(request_data['customer_id'], request_data['id'], self.user['username']))
                        break

        result = self.model.updatevouchers({ 'id': request_data['id'], 'first_name': request_data['first_name'], 'middle_name': request_data['middle_name'], 'last_name': request_data['last_name'], 'gender': request_data['gender'] })
        
        self.logger.write_log("CUSTOMER", "Update Customer Details | {} | {} ".format(request_data['id'], self.user['username']))
        
        return {'code': '00', 'msg': 'Request sent.'}


    def searchvouchers(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)
 
        self.logger.write_to_console("EVENT", "Searching vouchers for {0}".format(request_data['search_param']))

        customer_data = self.model.searchvouchers(request_data)

        for result in customer_data:

            result["join_date"] = result["join_date"].strftime("%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]
        
        return customer_data

    def getAllUploadsRequests(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {'page': 0, 'fromdate': '', 'todate': ''}
        else:
            pass

        print(request_data)
 
        self.logger.write_to_console("EVENT", "loading all uploads for {0}".format(self.user['username']))
        
        if request_data == {}:
            request_data = {'offset':0, 'records':10, 'fromdate':'', 'todate':'', 'request_type':''}
        else:
            request_data['offset'] = int(request_data['page'])*10
            request_data['records'] = 10
            
        if self.user.get('branch_code',"").lower()!='all':
                request_data['branch']=self.user.get('branch_code')
                print("branch ##################{}".format(self.user))

        customer_data = self.model.getAllUploads(request_data)
        print(customer_data)

        for result in customer_data[0]:

            result["upload_date"] = result["upload_date"].strftime("%Y-%m-%d %H:%M:%S")

            if result["processed_date"] != None:
                result["processed_date"] = result["processed_date"].strftime("%Y-%m-%d %H:%M:%S")

            if result["approved_date"] != None:
                result["approved_date"] = result["approved_date"].strftime("%Y-%m-%d %H:%M:%S")


        pages = math.ceil(customer_data[1][0]['count']/10)
        print(pages)

        self.logger.write_to_console("EVENT", "Administrators gotten | Success.")
        return {"code":language.CODES['SUCCESS'], "msg":self.lang['data_retrived'], "data":customer_data[0], "pages": pages}
        return customer_data


    def record_uploaded_file(self, file_obl):
        self.logger.write_to_console("EVENT", "Recording Uploaded file | {}".format(file_obl.filename))


        file_extension = file_obl.filename.split(".")
        # filetype = file_extension[-1]
        if file_extension[-1] != "csv":
            return {"code":language.CODES['FAIL'], "msg":self.lang['wrong_file_format'], "data":[]}
        
        bulk_id = self.generate_id(self.user['branch_code'])
        # file_obl.save(secure_filename(file_obl.filename))
        file_obl.save(os.path.join(config.UPLOAD_DIRECTORY, bulk_id+".csv"))
        # fileChecksum = self.md5Checksum(bulk_id+".csv")
        fileSize = os.stat(os.path.join(config.UPLOAD_DIRECTORY, bulk_id+".csv")).st_size

        fields = {"bulk_id":bulk_id,
                      "filename": file_obl.filename,
                      "filesize": fileSize,
                      "fileType": file_extension[-1],
                      # "file_checksum": fileChecksum,
                      "branch": self.user['branch_code'],
                      "uploaded_by": self.user['username']
                }

        self.logger.write_to_console("EVENT", "Uploaded File Details | {}".format(fields))
        result = self.model.insertBulkUpload(fields)
        print(result)
        if result == True:
            # self.logger.write_to_console("EVENT", "Starting processing Thread for | {}".format(file_obl.filename))
            # processing_thread = Thread(target=self.process_csv, args=(os.path.join(config.UPLOAD_DIRECTORY, bulk_id+".csv"), file_obl.filename, self.user['username']))
            # processing_thread.start()
            # self.logger.write_to_console("EVENT", "Thread started for | {}".format(file_obl.filename))
            self.logger.write_log("UPLOAD", "Uploaded Bulk Serials | {} | {} ".format(fields['bulk_id'] + ".csv", self.user['username']) + " | Successful")
            return {"code":language.CODES['SUCCESS'], "msg":self.lang['file_recorded'], "data":[]}
        else:
            self.logger.write_log("UPLOAD", "Uploaded Bulk Serials | {} | {} ".format(fields['bulk_id']+ ".csv", self.user['username']) + " | Failed")
            return {"code":language.CODES['FAIL'], "msg":self.lang['wrong_file_format'], "data":[]}

    def approve_uploaded_file(self, request_data):
        self.logger.write_to_console("EVENT", "Recording Uploaded file | {}".format(request_data['bulk_id']))

        #bulk_details = self.model.getBulkUploadDetails(request_data['bulk_id'])

        fields = {"bulk_id": request_data['bulk_id'],
                  # "file_checksum": fileChecksum,
                  "approval_status": "Approved",
                  "processing_status": "Processing",
                  "approved_by": self.user['username'],
                  "approved_date": "NOW()"
                }

        self.logger.write_to_console("EVENT", "Uploaded File Details | {}".format(fields))

        result = self.model.updateBulkUpload(fields)
        print(result)
        if result == True:
            bulk_details = self.model.getBulkUploadDetails(request_data['bulk_id'])
            self.logger.write_to_console("EVENT", "Starting processing Thread for | {}".format(request_data['bulk_id']))
            processing_thread = Thread(target=self.process_csv_new, args=(os.path.join(config.UPLOAD_DIRECTORY, request_data['bulk_id']+".csv"), bulk_details[0]['approved_date'],self.user['username'],bulk_details[0]['branch'], request_data['bulk_id']))
            processing_thread.start()
            self.logger.write_to_console("EVENT", "Thread started for | {}".format(request_data['bulk_id']))

            self.logger.write_log("PROCESS_UPLOAD", "Approve Bulk Serials | {} | {} ".format(request_data['bulk_id']+ ".csv", self.user['username']) + " | Successful")
            return {"code":language.CODES['SUCCESS'], "msg": "File processing approved.", "data":[]}

        else:
            self.logger.write_log("PROCESS_UPLOAD", "Approve Bulk Serials | {} | {} ".format(request_data['bulk_id']+ ".csv", self.user['username']) + " | Failed")
            return {"code":language.CODES['FAIL'], "msg":self.lang['wrong_file_format'], "data":[]}


    def decline_uploaded_file(self, request_data):
        self.logger.write_to_console("EVENT", "Recording Uploaded file | {}".format(request_data['bulk_id']))

        fields = {"bulk_id": request_data['bulk_id'],
                  # "file_checksum": fileChecksum,
                  "approval_status": "Declined",
                  "processing_status": "Processing",
                  "approved_by": self.user['username'],
                  "approved_date": "NOW()"
                }

        self.logger.write_to_console("EVENT", "Uploaded File Details | {}".format(request_data['bulk_id']))

        result = self.model.updateBulkUpload(fields)
        print(result)
        if result == True:
            self.logger.write_log("PROCESS_UPLOAD", "Decline Bulk Serials | {} | {} ".format(request_data['bulk_id']+ ".csv", self.user['username']) + " | Successful")
            return {"code":language.CODES['SUCCESS'], "msg": "File processing declined.", "data":[]}
        else:
            self.logger.write_log("PROCESS_UPLOAD", "Decline Bulk Serials | {} | {} ".format(request_data['bulk_id']+ ".csv", self.user['username']) + " | Failed")
            return {"code":language.CODES['FAIL'], "msg":self.lang['wrong_file_format'], "data":[]}


    def process_csv(self, filename, uploaded_by,approved_by,branch, bulk_id):

        try:
            res=[]
            unique_id = ""
            voucher_hash = ""
            print("processing csv")

            with open(filename, "rb") as f:
                reader= unicodecsv.DictReader(f)
                #file upload is being read in a group in a dictionary{}
                print(reader)
                res=[x for x in reader]
            #     self.log.write_to_file(msg="In process_csv_reader {}".format(res),filename="event")
            # print(res)

            #reading the file in a format way for processing
            counter=1
            for trans in res:
                try:
                    #Converting the data in a dictionary form
                    trans = dict(trans)
                    self.logger.write_to_console("EVENT", "Processing: {}".format(trans))
                    print(trans)
                    #Converting the header of the file in lowercase for processing in key-value pair
                    for key, value in trans.items():

                        try:

                            print(key)
                            print(value)

                            if key.lower() == "id":
                                unique_id = bulk_id +"--"+ value

                            if key.lower() == "serial":
                                vhash = hashlib.sha256((value.encode()))
                                vhash = vhash.hexdigest()
                                voucher_hash = vhash

                        except Exception as e:
                            raise e
                            print(e)
                            error = str(e)
                            return error
                    
                    #sending request to the tups_portal(etienee' portal)
                    request_data = {
                          "unique_id": unique_id,
                          "voucher_hash": voucher_hash,
                          "uploaded_by":uploaded_by,
                          "approved_by":approved_by,
                          "branch":branch
                        }

                    self.logger.write_to_console("EVENT", "Adding voucher | {}".format(request_data))
                    api_response = self.model.add_voucher_new(request_data)
                    print(api_response)
                    # api_response = {"code": "00", "msg": "Response"}
                    self.logger.write_to_console("EVENT", "Adding serials response | {}".format(api_response))
                    #response from tups portal(etienne's portal) successfully save to tbl_bulk_transaction
                    
                    if api_response == True:
                        self.logger.write_to_console("EVENT", "Serial Adding Successful | {}".format(request_data))

                    #api_response from tups portal(etienne's portal) failed to be processed which is save to tbl_bulk_transaction
                    else:
                        self.logger.write_to_console("EVENT", "Registration Failed | {}".format(request_data))
                
                except Exception as e:
                    raise e
                    print(e)
                    error = str(e)
                    self.log.write_to_file(msg="In process_csv_error_exception {}".format(error),filename="error")
                    return error

            data = {"processing_status": "Completed", "processed_date": "NOW()", "bulk_id": bulk_id}
            result = self.model.updateBulkUpload(data)

            #####
            # Send Mail 
            #####
        

        except Exception as e:
            raise e
            error = "Processing of file failed"
            self.log.write_to_file(msg="In process_csv_exeception_raised_error {}".format(error),filename="error")
            return error


    def process_csv_new(self, filename, date_approved,approved_by,branch, bulk_id):

        try:
            res=[]
            unique_id = ""
            voucher_hash = ""
            print("processing csv")

            with open(filename, "rb") as f:
                reader= unicodecsv.DictReader(f)
                #file upload is being read in a group in a dictionary{}
                print(reader)
                res=[x for x in reader]
            #     self.log.write_to_file(msg="In process_csv_reader {}".format(res),filename="event")
            # print(res)

            #reading the file in a format way for processing
            counter=1
            for trans in res:
                try:
                    #Converting the data in a dictionary form
                    trans = dict(trans)
                    self.logger.write_to_console("EVENT", "Processing: {}".format(trans))
                    print(trans)
                    #Converting the header of the file in lowercase for processing in key-value pair
                    for key, value in trans.items():

                        try:

                            print(key)
                            print(value)

                            if key.lower() == "id":
                                unique_id = bulk_id +"--"+ value

                            if key.lower() == "serial":
                                vhash = hashlib.sha256((value.encode()))
                                vhash = vhash.hexdigest()
                                voucher_hash = vhash

                        except Exception as e:
                            raise e
                            print(e)
                            error = str(e)
                            return error
                    
                    #sending request to the tups_portal(etienee' portal)
                    request_data = {
                          "bulk_id": bulk_id,
                          "hashed_serial_number": voucher_hash,
                          "date_approved":date_approved,
                          "approved_by":approved_by,
                          "raw_serial_number":value,
                          "serial_status": "NOT VALIDATED",
                          "batch_id": counter
                        }
                    counter+=1

                    self.logger.write_to_console("EVENT", "Adding voucher | {}".format(request_data))
                    api_response = self.model.add_voucher_new(request_data)
                    print(api_response)
                    # api_response = {"code": "00", "msg": "Response"}
                    self.logger.write_to_console("EVENT", "Adding serials response | {}".format(api_response))
                    #response from tups portal(etienne's portal) successfully save to tbl_bulk_transaction
                    
                    if api_response == True:
                        self.logger.write_to_console("EVENT", "Serial Adding Successful | {}".format(request_data))

                    #api_response from tups portal(etienne's portal) failed to be processed which is save to tbl_bulk_transaction
                    else:
                        self.logger.write_to_console("EVENT", "Registration Failed | {}".format(request_data))
                
                except Exception as e:
                    raise e
                    print(e)
                    error = str(e)
                    self.log.write_to_file(msg="In process_csv_error_exception {}".format(error),filename="error")
                    return error

            data = {"processing_status": "Completed", "processed_date": "NOW()", "bulk_id": bulk_id}
            result = self.model.updateBulkUpload(data)

            #####
            # Send Mail 
            #####
        

        except Exception as e:
            raise e
            error = "Processing of file failed"
            self.log.write_to_file(msg="In process_csv_exeception_raised_error {}".format(error),filename="error")
            return error


    def searchvouchersRequests(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)
 
        self.logger.write_to_console("EVENT", "Searching vouchers for {0}".format(request_data['search_param']))

        customer_data = self.model.searchvouchersReq(request_data)

        for result in customer_data:

            result["request_date"] = result["request_date"].strftime("%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]
        
        return customer_data


    def generate_id(self, preamb):
        """
        Generate unique id
        Parameters: preamb => string to be used at the start of the id
        """
        t_id = preamb + str(hash(str(uuid.uuid1())) % 100000000000)
        return t_id


    def md5Checksum(self, fileName):
        filePath = os.path.join(config.UPLOAD_DIRECTORY, fileName)

        with open(filePath, 'rb') as fh:
            m = hashlib.md5()
            while True:
                data = fh.read()
                if not data:
                    break
                m.update(data)
        return m.hexdigest()
    
    def getVoucherByBulkId(self, bulk_id, request_data):
        if request_data == {}:
            request_data = {'offset':0, 'records':10}
        else:
            request_data['offset'] = int(request_data['page'])*10
            request_data['records'] = 10

        filter_data={}
        voucher_bulk_data = self.model.getVoucherByBulkId(bulk_id, request_data)
        filter_data['voucher_details'] = voucher_bulk_data[0]
        filter_data['pages'] = math.ceil(voucher_bulk_data[1][0]['count']/10)
        filter_data['branches'] = branch_data = self.model.getBranches()
        print(filter_data)
        return filter_data
    
    def updateBulkAssignSerialBranch(self, data):
        request_data = {
            "branch_assigned": data["branch_assigned"]
        }
        result = self.model.updateBulkAssignSerialBranch(request_data, data["bulk_id"], data["minRange"], data["maxRange"])
        if result == True:
            return {"code":language.CODES['SUCCESS'], "msg":"Serials successfully assigned to branch", "data":[]}
        else:
            return {"code":language.CODES['FAIL'], "msg":"Failed to assign serials to branch", "data":[]}
    
    def addDaysToDate(self, dateFormat="%Y-%m-%d %H:%M:%S", addDays=0):
        timeNow = datetime.datetime.now()
        anotherTime = timeNow + datetime.timedelta(days=addDays)
        return anotherTime.strftime(dateFormat)
    
    def getVerificationHistory(self, request_data):
        filter_data = {}

        if request_data == {}:
            request_data = {'offset':0, 'records':10, 'user_type': 'gen_public'}
        else:
            request_data['offset'] = int(request_data['page'])*10
            request_data['records'] = 10
            request_data['user_type'] = 'gen_public'
            print(str(request_data))

        all_data =  self.model.getVerificationHistory(request_data)    
        filter_data['history'] =  all_data[0]
        filter_data['pages'] = math.ceil(all_data[1][0]['count']/10)

        return filter_data

    def searchVerifiedVouchers(self, request_data):
        self.logger.write_to_console("EVENT", "Searching vouchers for {0}".format(request_data['search_param']))
        request_data['user_type'] = 'gen_public'
        voucher_data = self.model.searchVerifiedVouchers(request_data)
        print(voucher_data)
        
        return voucher_data
Esempio n. 6
0
class DashboardServices(object):
    """
    Class contains functions and attributes for authtentication
    Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Dashboard(user)
        self.logger = Logger()

    def getValidationInfo(self):
        self.logger.write_to_console(
            "EVENT",
            "{0} Getting Statistics {1}".format(self.user['username'],
                                                str(self.user['username'])))

        filter_data = {}
        validation_query = "SELECT COUNT(*) AS total, SUM(serial_status = 'VALIDATED') AS validated, SUM(serial_status = 'NOT VALIDATED') AS non_validated FROM tbl_serials"
        uploads_query = "SELECT COUNT(*) AS total, SUM(approval_status = 'Approved') AS approved, SUM(approval_status = 'Not Approved') AS pending, SUM(approval_status = 'Declined') AS declined FROM tbl_uploads"
        verification_query = "SELECT COUNT(*) AS total, SUM(status = 'VALIDATED') AS validated, SUM(status = 'NOT VALIDATED' OR status = 'NON EXISTENT') AS failed FROM tbl_activity_log WHERE user_type = 'gen_public'"
        filter_data['validation'] = self.model.getSerialsValidationInfo(
            validation_query)
        filter_data['uploads'] = self.model.getSerialsValidationInfo(
            uploads_query)
        filter_data['verification'] = self.model.getSerialsValidationInfo(
            verification_query)

        print(filter_data)
        return filter_data

    def generateSerialsReport(self, request_data):
        """
            This function generates report to be used in the chart
            @Params : void
        """
        start_date = datetime.datetime.now().strftime("%Y-%m-%d")
        #if no data is supplied, return weekly report
        if 'get_chart' in request_data:
            end_date = self.addDaysToDate(addDays=6)
            request_data = {
                'filter_type': 'weekly',
                'from_date': end_date,
                'end_date': start_date,
                'user_type': request_data['get_chart']
            }
        else:
            #check filter and apply necessary date range
            if request_data['filter_type'] == "daily":
                request_data['from_date'] = start_date
                request_data['end_date'] = start_date
            elif request_data['filter_type'] == "weekly":
                request_data['from_date'] = self.addDaysToDate(addDays=6)
                request_data['end_date'] = start_date
            elif request_data['filter_type'] == "monthly":
                request_data['from_date'] = self.addDaysToDate(addDays=30)
                request_data['end_date'] = start_date
            else:
                return []

        report_data = self.model.generateSerialsReport(request_data)

        #process weekly days in order
        if request_data['filter_type'] == "weekly":
            week_days = [
                "Monday", "Tuesday", "Wednessday", "Thursday", "Friday",
                "Saturday", "Sunday"
            ]
            i = 0
            for days in report_data:
                days["days"] = week_days[i]
                i += 1

        #process monthly days in order
        elif request_data['filter_type'] == "monthly":
            days_list = self.getDaysList()
            #length = len(days_list)
            formatted_date = [
                "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th",
                "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th",
                "18th", "19th", "20th", "21st", "22nd", "23rd", "24th", "25th",
                "26th", "27th", "28th", "29th", "30th", "31st"
            ]

            for days in report_data:
                day = days["days"]
                total = days["total"]

                #if day is in list
                if day in days_list:
                    index = days_list.index(day)
                    tempDict = {
                        "days": formatted_date[day - 1],
                        "total": total
                    }
                    days_list[index] = tempDict
            return days_list

        return report_data

    def addDaysToDate(self, dateFormat="%Y-%m-%d", addDays=0):
        timeNow = datetime.datetime.now()
        anotherTime = timeNow - datetime.timedelta(days=addDays)
        return anotherTime.strftime(dateFormat)

    def getDaysList(self):
        cur_date = datetime.date.today()
        days_ago = cur_date - datetime.timedelta(31)  #get 30days ago
        date_difference = cur_date - days_ago
        daysList = []
        for i in range(date_difference.days + 1):
            tempDate = cur_date - datetime.timedelta(i)
            daysList.append(tempDate.day)
        return daysList
Esempio n. 7
0
from app.libs.decorators import AccessLogger
from app.home.services import DashboardServices
from app.libs.logger import Logger

# Define the account blueprint object
home = Blueprint('home',
                 __name__,
                 url_prefix='/home',
                 template_folder='templates')

# Set language variable
lang = {}
lang = getattr(language, config.DEFAULT_LANG)

# Initiate logger an decorators
log = Logger()
log_access = AccessLogger()


# Set the route and accepted methods
@home.route('/', methods=['GET', 'POST'])
@log_access.log_request
def home_page():
    try:
        print("In login page")
        # access session data (session['k']=v)
        try:
            cookie_id = request.cookies.get('{0}'.format(
                config.COOKIE_VALUE))  # GET previous cookies
        except Exception as e:
            cookie_id = None
 def __init__(self):
     self.logger = Logger()
Esempio n. 9
0
class validatorServices(object):
    """
    Class contains functions and attributes for authtentication
    Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Validator(user)
        self.logger = Logger()

    def getAllValidators(self, request_data):
        filter_data = {}
        if request_data == {}:
            request_data = {'offset': 0, 'records': 10, 'branch': 'None'}
        else:
            request_data['offset'] = int(request_data['page']) * 10
            request_data['records'] = 10

        validator_data = self.model.getAllValidators(request_data)
        filter_data['validators'] = validator_data[0]
        filter_data['pages'] = math.ceil(validator_data[1][0]['count'] / 10)
        filter_data['branches'] = self.model.getBranches()
        print(filter_data)
        return filter_data

    def getValidatorsHistory(self, request_data):

        self.logger.write_to_console(
            "EVENT", "{0} Getting Validators History {1}".format(
                self.user['username'], str(request_data)))
        filter_data = {}
        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 10,
                'user_type': 'validator'
            }
        else:
            request_data['offset'] = int(request_data['page']) * 10
            request_data['records'] = 10
            request_data['user_type'] = 'validator'
        print(str(request_data))

        all_data = self.model.getValidatorsHistory(request_data)
        filter_data['history'] = all_data[0]
        filter_data['pages'] = math.ceil(all_data[1][0]['count'] / 10)
        return filter_data

    def addValidator(self, request_data):
        """
            This function handles the adding of a new validator
            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Adding Validator {1}".format(self.user['username'],
                                                       str(request_data)))
        request_data['msisdn'] = "233" + request_data['msisdn'][-9:]
        request_data['email'] = request_data['email'].strip()

        admin_data = self.model.getValidatorByMsisdn(request_data['msisdn'])
        if admin_data == []:
            admin_data = self.model.getValidatorByEmail(request_data['email'])
            if admin_data == []:
                self.logger.write_to_console("EVENT", "Preparing data")

                res = self.model.addValidator(request_data)
                if res == True:
                    #Utilites.send_mail(Utilites, "SSNIT PORTAL", "<p>Hi {0}</p><p>Welcome SSNIT, below are your login credentials.<br><br>Username: {1}<br>Password: {2}<br><br><br> Regards</p><p>FUSION PLATFORM</p>".format(request_data['first_name'], request_data['username'], raw_password), [request_data['email']])
                    return {
                        "code": language.CODES['SUCCESS'],
                        "msg": self.lang['validator_added'],
                        "data": []
                    }
                else:
                    return {
                        "code": language.CODES['FAIL'],
                        "msg": self.lang['validator_add_fail'],
                        "data": []
                    }
            else:
                self.logger.write_to_console(
                    "EVENT", "Existing validator email " +
                    request_data['email'] + " | Blocked User.")
                return {
                    "code": language.CODES['FAIL'],
                    "msg": "Email is already registered to another validator.",
                    "data": []
                }
        else:
            self.logger.write_to_console(
                "EVENT", "Existing validator phone " + request_data['msisdn'] +
                " | Blocked User.")
            return {
                "code": language.CODES['FAIL'],
                "msg":
                "Phone number is already registered to another validator.",
                "data": []
            }

    def deleteValidator(self, request_data):
        self.logger.write_to_console(
            "EVENT", "{0} Deleting Validator {1}".format(
                self.user['username'], str(request_data['validator_id'])))
        res = self.model.deleteValidator(request_data['validator_id'])
        if res == True:
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['validator_deleted'],
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['validator_delete_fail'],
                "data": []
            }

    def getValidatorDetails(self, request_data):

        self.logger.write_to_console(
            "EVENT", "Getting Details for " + self.user['username'])

        validator_data = self.model.getValidatorByEmail(request_data['email'])
        if validator_data == []:
            self.logger.write_to_console(
                "EVENT", "Failed to get validator " + self.user['username'] +
                " | Non-Existing User.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_username'],
                "data": []
            }
        else:
            self.logger.write_to_console(
                "EVENT", "Validator Data retreived successfully " +
                self.user['username'] + " | Success.")
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['record_successful'],
                "data": validator_data[0]
            }

    def updateValidator(self, request_data):

        self.logger.write_to_console(
            "EVENT",
            "{0} Updating Validator {1}".format(self.user['username'],
                                                str(request_data)))

        request_data['msisdn'] = "233" + request_data['msisdn'][-9:]

        res = self.model.updateValidator(request_data)
        if res == True:
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['validator_updated'],
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['validator_update_fail'],
                "data": []
            }

    def searchValidatoinHistory(self, request_data):

        self.logger.write_to_console(
            "EVENT",
            "Searching vouchers for {0}".format(request_data['search_param']))
        request_data['user_type'] = 'validator'
        voucher_data = self.model.searchValidatoinHistory(request_data)
        print(voucher_data)
        for result in voucher_data:

            result["date_created"] = result["date_created"].strftime(
                "%Y-%m-%d %H:%M:%S")

        return voucher_data
Esempio n. 10
0
# Import project dependencies
from app import config
from app.libs.utils import Utilites
from app.libs.logger import Logger
from app.libs.decorators import AccessLogger

# Import a module / component using its blueprint handler variable
from app.home.controllers import home
from app.dashboard.controllers import dashboard
from app.activities.controllers import activities
from app.admins.controllers import admins
from app.vouchers.controllers import vouchers
from app.validators.controllers import validators
from app.logs.controllers import logs

log = Logger()
log_access = AccessLogger()

# Creating flask application instance
app = Flask(__name__)
socketio = SocketIO(app, async_mode=None)
excel.init_excel(app)
# Configurations
app.config['SESSION_TYPE'] = config.SESSION_TYPE
app.config['SECRET_KEY'] = config.SECRET_KEY
app.config['PROPAGATE_EXCEPTIONS'] = True
Session(app)
app.config.from_object(__name__)


# Sample HTTP error handling
Esempio n. 11
0
class adminServices(object):
    """
    Class contains functions and attributes for authtentication
    Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Administrator(user)
        self.logger = Logger()

    def adminlogin(self, request_data, try_var):
        """
        This function handles all logic related to login on the platform
        @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Login request for " + request_data['username'])

        admin_data = self.model.getAdminByUsernameLogin(
            request_data['username'])
        if admin_data == []:
            self.logger.write_log(
                "USER_ACCESS", "Login request | " + request_data['username'] +
                " | Failed | Non-Existing User.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_username'],
                "data": []
            }
        else:
            print(try_var)
            if try_var != None and try_var >= 3:
                self.model.updateAdministrator({
                    "active":
                    "2",
                    "last_login":
                    "******",
                    "username":
                    request_data['username']
                })
                if try_var == 3:
                    return {
                        "code": language.CODES['FAIL'],
                        "msg":
                        "Sorry your account has been blocked. Kindly contact your administrator.",
                        "data": 2,
                        "username": request_data['username']
                    }
                else:
                    return {
                        "code": language.CODES['FAIL'],
                        "msg":
                        "Sorry your account has been blocked. Kindly contact your administrator.",
                        "data": []
                    }

            else:
                if admin_data[0]['active'] == 1:
                    print(admin_data[0])
                    verify_pass = sha256_crypt.verify(
                        request_data['password'], admin_data[0]['password'])
                    self.logger.write_to_console(
                        "EVENT", "varify Password | " + str(verify_pass))

                    if verify_pass == True:
                        self.model.updateAdministrator({
                            "status":
                            "1",
                            "last_login":
                            "******",
                            "username":
                            request_data['username']
                        })
                        self.logger.write_log(
                            "USER_ACCESS",
                            "Login request | " + request_data['username'] +
                            " | Successful | Login Successful")
                        return {
                            "code": language.CODES['SUCCESS'],
                            "msg": self.lang['login_successful'],
                            "data": admin_data[0],
                            "username": request_data['username']
                        }
                    else:
                        self.logger.write_to_console(
                            "EVENT", "Login request failed for " +
                            request_data['username'] +
                            " | Failed | Wrong Password.")
                        return {
                            "code": language.CODES['FAIL'],
                            "msg": self.lang['wrong_username'],
                            "data": 1,
                            "username": request_data['username']
                        }

                else:
                    self.logger.write_to_console(
                        "EVENT", "Login request failed for " +
                        request_data['username'] + " | Failed | Blocked User")
                    return {
                        "code": language.CODES['FAIL'],
                        "msg":
                        "Sorry your account has been blocked. Kindly contact your administrator.",
                        "data": 2,
                        "username": request_data['username']
                    }

    def adminLogout(self):
        result = self.model.updateAdministrator({
            "status":
            "0",
            "username":
            self.user['username']
        })
        return result

    def getAllAdministrators(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 11,
                'fromdate': '',
                'user_right_id': '',
                "branch": '',
                'active': ''
            }
        else:
            request_data['offset'] = int(request_data['page']) * 11
            request_data['records'] = 11

        self.logger.write_to_console(
            "EVENT", "Getting administrator list for {} -> {}".format(
                self.user['username'], request_data))

        if self.user['branch_code'] == "All":
            administrators_data = self.model.getAllAdministrators(request_data)
            admin_groups_data = self.model.getAdminGroups()
            branches_data = self.model.getBranches({
                'offset': 0,
                'records': 11
            })
        else:
            administrators_data = self.model.getAllAdministratorsByBranch(
                request_data)
            admin_groups_data = self.model.getAdminGroups()
            branches_data = self.model.getBranches({
                'offset': 0,
                'records': 11
            })

        for result in administrators_data:
            result["created"] = result["created"].strftime("%Y-%m-%d %H:%M:%S")
            result["last_login"] = result["last_login"].strftime(
                "%Y-%m-%d %H:%M:%S")

            if "pass_date" in result:
                result["pass_date"] = result["pass_date"].strftime(
                    "%Y-%m-%d %H:%M:%S")

        self.logger.write_to_console(
            "EVENT", "Administrators list gotten successfully for {}".format(
                self.user['username']))
        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": administrators_data,
            'admin_group': admin_groups_data,
            'branches': branches_data
        }

    def getAllAdministratorsExport(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        request_data['offset'] = 0
        request_data['records'] = 10000

        self.logger.write_to_console(
            "EVENT", "Getting administrator list for {} -> {}".format(
                self.user['username'], request_data))

        export_list = [[
            'USERNAME', 'FIRST NAME', 'LAST NAME', 'EMAIL', 'PHONE NUMBER',
            'BRANCH', 'GROUP', 'STATUS', 'DATE CREATED'
        ]]

        if self.user['branch_code'] == "All":
            administrators_data = self.model.getAllAdministrators(request_data)
            admin_groups_data = self.model.getAdminGroups()
            branches_data = self.model.getBranches()
        else:
            administrators_data = self.model.getAllAdministratorsByBranch(
                request_data)
            admin_groups_data = self.model.getAdminGroups()
            branches_data = self.model.getBranches()

        for result in administrators_data:
            result["created"] = result["created"].strftime("%Y-%m-%d %H:%M:%S")
            result["last_login"] = result["last_login"].strftime(
                "%Y-%m-%d %H:%M:%S")
            if "pass_date" in result:
                result["pass_date"] = result["pass_date"].strftime(
                    "%Y-%m-%d %H:%M:%S")

            if result["active"] == 1:
                result["active"] = self.lang["active"]
            else:
                result["active"] = self.lang["inactive"]

            export_list.append([
                result['username'], result['first_name'], result['last_name'],
                result['email'], result['email'], result['branch_code'],
                result['name'], result['active'], result['created']
            ])

        self.logger.write_to_console(
            "EVENT",
            "Administrators Export list gotten successfully for {}".format(
                self.user['username']))
        return export_list

    def addAdmin(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Adding Admin {1}".format(self.user['username'],
                                                   str(request_data)))
        request_data['msisdn'] = "233" + request_data['msisdn'][-9:]
        request_data['email'] = request_data['email'].strip()

        admin_data = self.model.getAdminByUsername(request_data['username'])
        if admin_data == []:
            admin_data = self.model.getAdminByMsisdn(request_data['msisdn'])
            if admin_data == []:
                admin_data = self.model.getAdminByEmail(request_data['email'])
                if admin_data == []:
                    self.logger.write_to_console("EVENT", "Preparing data")
                    # raw_password = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(8))
                    utl = Utilites()
                    raw_password = utl.generate_password(10)
                    password = sha256_crypt.encrypt(raw_password)
                    self.logger.write_to_console(
                        "EVENT",
                        "Generated password: {0} \n Hashed Password: {1} \n".
                        format(raw_password, password))

                    # request_data['msisdn'] = "233" + request_data['msisdn'][-9:]
                    request_data['password'] = password
                    request_data['last_login'] = "******"

                    res = self.model.addAdministrator(request_data)
                    if res == True:
                        Utilites.send_mail(
                            Utilites, "SSNIT PORTAL",
                            "<p>Hi {0}</p><p>Welcome SSNIT, below are your login credentials.<br><br>Username: {1}<br>Password: {2}<br><br><br> Regards</p><p>FUSION PLATFORM</p>"
                            .format(request_data['first_name'],
                                    request_data['username'],
                                    raw_password), [request_data['email']])
                        return {
                            "code": language.CODES['SUCCESS'],
                            "msg": self.lang['admin_added'],
                            "data": []
                        }
                    else:
                        return {
                            "code": language.CODES['FAIL'],
                            "msg": self.lang['admin_add_fail'],
                            "data": []
                        }
                else:
                    self.logger.write_to_console(
                        "EVENT", "Existing Admin Username " +
                        request_data['username'] + " | Blocked User.")
                    return {
                        "code": language.CODES['FAIL'],
                        "msg":
                        "Email is already registered to another administrator.",
                        "data": []
                    }
            else:
                self.logger.write_to_console(
                    "EVENT", "Existing Admin Username " +
                    request_data['username'] + " | Blocked User.")
                return {
                    "code": language.CODES['FAIL'],
                    "msg":
                    "Phone number is already registered to another administrator.",
                    "data": []
                }

        else:
            self.logger.write_to_console(
                "EVENT", "Existing Admin Username " +
                request_data['username'] + " | Blocked User.")
            return {
                "code": language.CODES['FAIL'],
                "msg":
                "Username is already registered to another administrator.",
                "data": []
            }

    def addAdminGroup(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Adding Admin Group {1}".format(self.user['username'],
                                                str(request_data)))

        res = self.model.addAdministratorGroup(request_data)
        if res == True:
            return {
                "code": language.CODES['SUCCESS'],
                "msg": "New group added successfully.",
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": "Failed to add group.",
                "data": []
            }

    def updateAdminGroup(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Updating Admin Group {1}".format(self.user['username'],
                                                  str(request_data)))

        res = self.model.updateAdministratorGroup(request_data)
        if res == True:
            return {
                "code": language.CODES['SUCCESS'],
                "msg": "Group updated successfully.",
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": "Failed to update group.",
                "data": []
            }

    def getAdmin(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Login request for " + request_data['username'])

        admin_data = self.model.getAdminByUsername(request_data['username'])
        if admin_data == []:
            self.logger.write_to_console(
                "EVENT", "Failed to get admin " + request_data['username'] +
                " | Non-Existing User.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_username'],
                "data": []
            }
        else:
            self.logger.write_to_console(
                "EVENT", "Administor Data retreived successfully " +
                request_data['username'] + " | Success.")
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['login_successful'],
                "data": admin_data[0]
            }

    def getAdminInstDetails(self):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Getting Details for " + self.user['username'])

        admin_data = self.model.getAdminByUsername(self.user['username'])
        if admin_data == []:
            self.logger.write_to_console(
                "EVENT", "Failed to get admin " + self.user['username'] +
                " | Non-Existing User.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_username'],
                "data": []
            }
        else:
            self.logger.write_to_console(
                "EVENT", "Administor Data retreived successfully " +
                self.user['username'] + " | Success.")
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['login_successful'],
                "data": admin_data[0]
            }

    def updateAdmin(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Updating Admin {1}".format(self.user['username'],
                                                     str(request_data)))

        self.logger.write_to_console("EVENT", "Preparing data")

        request_data['msisdn'] = "233" + request_data['msisdn'][-9:]

        res = self.model.updateAdministrator(request_data)
        if res == True:
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['admin_updated'],
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['admin_update_failed'],
                "data": []
            }

    def changeAdminPassword(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} changing Admin password {1}".format(self.user['username'],
                                                     str(request_data)))

        if request_data['newPassword'] == request_data['oldPassword']:
            return {
                "code": language.CODES['FAIL'],
                "msg": "New password can not be the same as the old password.",
                "data": []
            }

        utl = Utilites()
        comple = utl.password_complexity_check(request_data['newPassword'])
        print(comple)
        if comple['strength'] < 10:
            self.logger.write_to_console(
                "EVENT", "password_weak_password" + self.user['username'] +
                " | Password change.")
            return {
                "code": language.CODES['FAIL'],
                "msg":
                "The password entered is weak. Kindly make sure the password length is 8 and above and contains a a least one digit symbol uppercase and lowercase",
                "data": []
            }

        if request_data['newPassword'] == request_data['newPasswordRep']:
            admin_data = self.model.getAdminByUsername_chg(
                self.user['username'])
            if admin_data == []:
                self.logger.write_to_console(
                    "EVENT", "User does not exit " + self.user['username'] +
                    " | Non-Existing User.")
                return {
                    "code": language.CODES['FAIL'],
                    "msg": self.lang['wrong_username'],
                    "data": []
                }
            else:
                verify_pass = sha256_crypt.verify(request_data['oldPassword'],
                                                  admin_data[0]['password'])
                self.logger.write_to_console(
                    "EVENT", "varify Password | " + str(verify_pass))

                if verify_pass == True:
                    password = sha256_crypt.encrypt(
                        request_data['newPassword'])
                    res = self.model.updateAdministrator({
                        "password":
                        password,
                        "username":
                        self.user['username'],
                        "pass_date":
                        "NOW()"
                    })
                    if res == True:
                        admin_data = self.model.getAdminByUsernameLogin(
                            self.user['username'])
                        try:
                            Utilites.send_mail(
                                Utilites, "SSNIT PASSWORD CHANGE",
                                "<p>Hi {0}</p><p>Your SSNIT password has been changed. If you are not aware of this change kindly send a mail to <a>[email protected]</a>.<br><br>Best Regards</p><p>FUSION PLATFORM</p>"
                                .format(admin_data[0]['first_name']),
                                [admin_data[0]['email']])
                        except Exception as e:
                            pass
                        return {
                            "code": language.CODES['SUCCESS'],
                            "msg": self.lang['admin_sucessful_pass_change'],
                            "data": admin_data[0]
                        }
                    else:
                        return {
                            "code": language.CODES['FAIL'],
                            "msg": self.lang['admin_update_failed'],
                            "data": []
                        }
                else:
                    self.logger.write_to_console(
                        "EVENT", "wrong previous password " +
                        self.user['username'] + " | Password change.")
                    return {
                        "code": language.CODES['FAIL'],
                        "msg": self.lang['wrong_old_password'],
                        "data": []
                    }

        else:
            self.logger.write_to_console(
                "EVENT", "password_mismatch " + self.user['username'] +
                " | Password change.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['password_mismatch'],
                "data": []
            }

    def resetAdminPassword(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} resting Admin password {1}".format(request_data['username'],
                                                    str(request_data)))

        admin_data = self.model.getAdminByUsername(request_data['username'])
        if admin_data == []:
            self.logger.write_to_console(
                "EVENT", "Login request failed for " +
                request_data['username'] + " | Non-Existing User.")
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_username'],
                "data": []
            }
        else:
            utl = Utilites()
            raw_password = utl.generate_password(10)
            # raw_password = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(8))
            password = sha256_crypt.encrypt(raw_password)
            self.logger.write_to_console(
                "EVENT",
                "Generated password: {0} \n Hashed Password: {1} \n".format(
                    raw_password, password))

            res = self.model.updateAdministrator({
                "password":
                password,
                "username":
                request_data['username']
            })
            if res == True:
                Utilites.send_mail(
                    Utilites, "SSNIT PASSWORD RESET",
                    "<p>Hi {0}</p><p>Your SSNIT password has been changed to <strong>{1}</strong>.<br>Keeping your password safe is your responsibility.<br><br><br><br>Regards</p><p>FUSION PLATFORM</p>"
                    .format(request_data['username'],
                            raw_password), [admin_data[0]['email']])
                return {
                    "code":
                    language.CODES['SUCCESS'],
                    "msg": (self.lang['admin_pass_reset_successful'] +
                            admin_data[0]['email']),
                    "data": []
                }
            else:
                return {
                    "code": language.CODES['FAIL'],
                    "msg": self.lang['admin_pass_reset_failed'],
                    "data": []
                }

    def searchAdmins(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)

        self.logger.write_to_console(
            "EVENT", "Searching Transactions for {0}".format(
                request_data['search_param']))
        admin_data = []
        if self.user['branch_code'] == "All":
            admin_data = self.model.searchAdmins(request_data)
        else:
            admin_data = self.model.searchAdminsBranch(request_data)

        for result in admin_data:
            result["created"] = result["created"].strftime("%Y-%m-%d %H:%M:%S")
            result["last_login"] = result["last_login"].strftime(
                "%Y-%m-%d %H:%M:%S")

            if "pass_date" in result and result['pass_date'] is not None:
                result["pass_date"] = result["pass_date"].strftime(
                    "%Y-%m-%d %H:%M:%S")

            if result["active"] == 1:
                result["active"] = self.lang["active"]
            else:
                result["active"] = self.lang["inactive"]

        return admin_data

    def getAllBranches(self, request_data):
        """
            This function gets branches in the db

            @Params : void
        """
        print("inside get branches route ", str(request_data))
        if request_data == {}:
            request_data = {'offset': 0, 'records': 11}
        else:
            request_data['offset'] = int(request_data['page']) * 11
            request_data['records'] = 11

        #self.logger.write_to_console("EVENT", "Getting branches list for {0} -> {1}".format(self.user['username'], request_data))

        branches_data = self.model.getBranches(request_data)
        print(branches_data)
        self.logger.write_to_console(
            "EVENT", "Branches list gotten successfully for {}".format(
                self.user['username']))
        return branches_data

    def getAllBranchesFully(self):
        filter_data = {}
        filter_data['branches'] = self.model.dbconn.select_from_table(
            "tbl_branches")
        print(filter_data)
        return filter_data

    def getAllBranchesExport(self):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        request_data = {}
        request_data['offset'] = 0
        request_data['records'] = 10000

        # inst_model = Institution(self.user)

        self.logger.write_to_console(
            "EVENT", "Getting administrator list for {} -> {}".format(
                self.user['username'], request_data))

        export_list = [['BRANCH ID', 'ACRONYM', 'BRANCH NAME', 'BRANCH CODE']]

        branches_data = self.model.getBranches()
        for result in branches_data:
            export_list.append([
                result['branch_id'], result['acronym'], result['branch_name'],
                result['branch_code']
            ])

        self.logger.write_to_console(
            "EVENT", "Branches Export list gotten successfully for {}".format(
                self.user['username']))
        return export_list

    def searchBranches(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)

        self.logger.write_to_console(
            "EVENT", "Searching Transactions for {0}".format(
                request_data['search_param']))
        admin_data = []

        admin_data = self.model.searchBranches(request_data)

        return admin_data

    def addBranch(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Adding Branch {1}".format(self.user['username'],
                                                    str(request_data)))
        branch_codes = self.model.getBranchByCode(request_data['branch_code'])
        if branch_codes == []:
            res = self.model.addAdminBranch(request_data)
            if res == True:
                self.logger.write_log(
                    "ADMIN", "ADDED BRANCH | {} | SUCESSFUL | {}".format(
                        str(request_data), self.user['username']))
                return {
                    "code": language.CODES['SUCCESS'],
                    "msg": "New branch added successfully.",
                    "data": []
                }
            else:
                return {
                    "code": language.CODES['FAIL'],
                    "msg": "Failed to add branch.",
                    "data": []
                }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": "Branch code already exist",
                "data": []
            }

    def removeBranch(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Adding Branch {1}".format(self.user['username'],
                                                    str(request_data)))

        res = self.model.removeAdminBranch(request_data)
        if res == True:
            self.logger.write_log(
                "ADMIN", "REMOVED BRANCH | {} | SUCESSFUL | {}".format(
                    str(request_data), self.user['username']))
            return {
                "code": language.CODES['SUCCESS'],
                "msg": "New branch removed successfully.",
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": "Failed to remove branch.",
                "data": []
            }
class activitiesServices(object):
    """
        Class contains functions and attributes for authtentication
        Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Activities(user)
        self.logger = Logger()

    def getAllactivities(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        request_data['page'] = int(request_data['page']) - 1
        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 12,
                'fromdate': '',
                'todate': '',
                'status': '',
                'branch': '',
                'destination': '',
                'tag': '',
                'type': ''
            }
        else:
            request_data['offset'] = int(request_data['page']) * 12
            request_data['records'] = 12

        print(request_data)

        self.logger.write_to_console(
            "EVENT",
            "loading all transactions for {0}".format(self.user['username']))

        if request_data['fromdate'] != "":
            request_data['start_date'] = request_data['fromdate'] + " 00:00:00"

        if request_data['todate'] != "":
            request_data['end_date'] = request_data['todate'] + " 23:59:59"

        # transaction_data = api_calls.request_api_json(api_calls, request)
        # if self.user['name'] == "Administrator":
        transaction_data = self.model.getAllTransactions(request_data)
        # else:
        #     transaction_data = self.model.getAllTransactionsByBranch(request_data)

        for transaction in transaction_data[0]:
            transaction['amount'] = str(transaction['amount'])
            transaction['request_time'] = str(transaction['request_time'])
            transaction['response_time'] = str(transaction['response_time'])

        transaction_data[1][0]['count'] = int(
            round(transaction_data[1][0]['count'] / 12))

        return transaction_data

    def searchActivities(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)

        self.logger.write_to_console(
            "EVENT", "Searching Activities for {0}".format(
                request_data['search_param']))

        transaction_data = self.model.searchTransactions(request_data)

        # print(transaction_data)

        for transaction in transaction_data:
            transaction['amount'] = str(transaction['amount'])
            transaction['request_time'] = str(transaction['request_time'])
            transaction['response_time'] = str(transaction['response_time'])

        return transaction_data

    def getAllActivitiesExport(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 12,
                'fromdate': '',
                'todate': '',
                'status': '',
                'branch': '',
                'destination': '',
                'tag': '',
                'type': ''
            }
        else:
            request_data['offset'] = 0
            request_data['records'] = 100000

        print(request_data)

        self.logger.write_to_console(
            "EVENT",
            "Exporting transactions for {0}".format(self.user['username']))

        if self.user['name'] == 'Administrator':
            transaction_data = self.model.getAllTransactions(request_data)
        else:
            transaction_data = self.model.getAllTransactions(request_data)

        export_list = [[
            'TRANSACTION ID', 'REFERENCE', 'SOURCE ACCOUNT', 'BRANCH',
            'DESTINATION ACCOUNT', 'DESTINATION', 'MSISDN', 'AMOUNT', 'TYPE',
            'TAG', 'STATUS', 'REQUEST DATE', 'RESPONSE DATE'
        ]]

        for result in transaction_data[0]:
            result["request_time"] = result["request_time"].strftime(
                "%Y-%m-%d %H:%M:%S")
            result["response_time"] = result["response_time"].strftime(
                "%Y-%m-%d %H:%M:%S")

            result["amount"] = str(result["amount"])

            export_list.append([
                result['xref'], result['reference'], result['account_number'],
                result['account_branch'], result['des_act'],
                result['destination'], result['msisdn'], result['amount'],
                result['type'], result['fusion_tag'], result['msg_stat'],
                result['request_time'], result['response_time']
            ])

        print(export_list)
        return export_list

    def getActivitiesfilter(self):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        self.logger.write_to_console(
            "EVENT", "loading all transaction filter options for {0}".format(
                self.user['username']))

        # transaction_data = api_calls.request_api_json(api_calls, request)
        if self.user['branch_code'] == "All":
            filter_data = self.model.getAllTransactionsfilter()
        else:
            filter_data = self.model.getAllTransactionsfilter()

        return filter_data

    def getUploadDetails(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Getting details for {0}".format(request_data['bulk_id']))

        detailed_data = self.model.getBulkUploadDetailsByBulkId(
            request_data['bulk_id'])

        print(detailed_data)
        for result in detailed_data:
            result["date_processed"] = result["date_processed"].strftime(
                "%Y-%m-%d %H:%M:%S")
            result["date_upload"] = result["date_upload"].strftime(
                "%Y-%m-%d %H:%M:%S")

            if result["approval_status"] == 0:
                result["approval_status"] = self.lang["not_submitted"]
            elif result["approval_status"] == 1:
                result["approval_status"] = self.lang["submitted"]
            elif result["approval_status"] == 2:
                result["approval_status"] = self.lang["Declined"]
            elif result["approval_status"] == 3:
                result["approval_status"] = self.lang["approved"]
            elif result["approval_status"] == 4:
                result["approval_status"] = self.lang["corrupt_file"]
            else:
                result["processing_status"] = self.lang["unknown"]

            if result["processing_status"] == 0:
                result["processing_status"] = self.lang["not_processed"]
            elif result["processing_status"] == 1:
                result["processing_status"] = self.lang["initiated"]
            elif result["processing_status"] == 2:
                result["processing_status"] = self.lang["failed"]
            elif result["processing_status"] == 3:
                result["processing_status"] = self.lang["success"]
            else:
                result["processing_status"] = self.lang["unknown"]
            pass

        self.logger.write_to_console("EVENT",
                                     "BulkPay Uploads gotten | Success.")
        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": detailed_data
        }

    def record_uploaded_file(self, file_obl):
        self.logger.write_to_console(
            "EVENT",
            "BulkPay Recording Uploaded file | {}".format(file_obl.filename))

        file_extension = file_obl.filename.split(".")
        # filetype = file_extension[-1]
        if file_extension[-1] != "csv":
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

        bulk_id = self.generate_id(self.user['institution_shortName'])
        # file_obl.save(secure_filename(file_obl.filename))
        file_obl.save(os.path.join(config.UPLOAD_DIRECTORY, bulk_id + ".csv"))
        fileChecksum = self.md5Checksum(bulk_id + ".csv")
        fileSize = os.stat(
            os.path.join(config.UPLOAD_DIRECTORY, bulk_id + ".csv")).st_size

        fields = {"bulk_id":bulk_id, \
                      "filename": file_obl.filename, \
                      "filesize": fileSize, \
                      "fileType": file_extension[-1], \
                      "file_checksum": fileChecksum, \
                      "merchant_id": self.user['institution_data']['id'], \
                      "merchant_admin_id": self.user['id'], \
                      "approval_status": '1', \
                      "date_upload": "NOW()", \
                }

        self.logger.write_to_console(
            "EVENT", "BulkPay File Details | {}".format(fields))

        result = self.model.insertBulkUpload(fields)
        if result == True:
            result = self.model.insertBulkUploadXtraDetails(
                {"bulk_id": bulk_id})
            if result == True:
                return {
                    "code": language.CODES['SUCCESS'],
                    "msg": self.lang['file_recorded'],
                    "data": []
                }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

    def md5Checksum(self, fileName):
        filePath = os.path.join(config.UPLOAD_DIRECTORY, fileName)

        with open(filePath, 'rb') as fh:
            m = hashlib.md5()
            while True:
                data = fh.read()
                if not data:
                    break
                m.update(data)
        return m.hexdigest()

    def generate_id(self, preamb):
        """
        Generate unique id
        Parameters: preamb => string to be used at the start of the id
        """
        t_id = preamb + str(hash(str(uuid.uuid1())) % 100000000000)
        return t_id
class activitiesServices(object):
    """
        Class contains functions and attributes for authtentication
        Function: * getCampainge(sel)
    """
    def __init__(self, user):
        self.lang = {}
        self.lang = getattr(language, config.DEFAULT_LANG)
        self.user = user
        self.model = Activities(user)
        self.logger = Logger()

    def getAllActivities(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {'page': 0, 'fromdate': '', 'todate': ''}
        else:
            pass

        print(request_data)

        self.logger.write_to_console(
            "EVENT", "loading all bulkpay uploads for {0}".format(
                self.user['username']))

        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 11,
                'fromdate': '',
                'todate': '',
                'status': ''
            }
        else:
            request_data['offset'] = int(request_data['page']) * 11
            request_data['records'] = 11

        customer_data = self.model.getAllActivities(request_data)
        print(customer_data)

        branch_data = self.model.getBranches()

        for result in customer_data[0]:

            result["date_created"] = result["date_created"].strftime(
                "%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]

        pages = math.ceil(customer_data[1][0]['count'] / 12)
        print(pages)

        self.logger.write_to_console("EVENT",
                                     "Administrators gotten | Success.")
        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": customer_data[0],
            "pages": pages,
            "branches": branch_data
        }
        return customer_data

    def getAllBlacklist(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {'page': 0, 'fromdate': '', 'todate': ''}
        else:
            pass

        print(request_data)

        self.logger.write_to_console(
            "EVENT", "loading all customer request uploads for {0}".format(
                self.user['username']))

        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 11,
                'fromdate': '',
                'todate': '',
                'branch': '',
                'request_type': ''
            }
        else:
            request_data['offset'] = int(request_data['page']) * 11
            request_data['records'] = 11

        customer_data = self.model.getAllBlack(request_data)
        print(customer_data)

        for result in customer_data[0]:

            result["date_blacklisted"] = result["date_blacklisted"].strftime(
                "%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]

        pages = math.ceil(customer_data[1][0]['count'] / 12)
        print(pages)

        self.logger.write_to_console("EVENT",
                                     "Administrators gotten | Success.")
        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": customer_data[0],
            "pages": pages
        }
        return customer_data

    def getAllvouchersExport(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        request_data['offset'] = 0
        request_data['records'] = 1000000

        print(request_data)

        self.logger.write_to_console(
            "EVENT", "loading all bulkpay uploads for {0}".format(
                self.user['username']))

        export_list = [[
            'ACCOUNT', 'FIRST NAME', 'LAST NAME', 'MIDDLE NAME', 'GENDER',
            'PHONE NUMBER', 'BRANCH', 'STATUS', 'DATE REGISTERED'
        ]]

        # if self.user['access_level_id'] == 4:
        merchant_data = self.model.getAllvouchers(request_data)
        # else:
        #     merchant_data = self.model.getAllvouchersByBranch(request_data)

        print(merchant_data)
        for result in merchant_data[0]:

            result["join_date"] = result["join_date"].strftime(
                "%Y-%m-%d %H:%M:%S")

            if result["status"] == 1:
                result["status"] = self.lang["active"]
            else:
                result["status"] = self.lang["inactive"]

            export_list.append([
                result['id'], result['first_name'], result['last_name'],
                result['middle_name'], result['gender'], result['status'],
                result['join_date']
            ])

        print(export_list)
        return export_list

    def addCustomer(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Adding Customer {1}".format(self.user['username'],
                                                      str(request_data)))

        request_data['requested_by'] = self.user['username']
        request_data['branch'] = request_data['customer_account'][:3]

        print(request_data)
        result = self.model.addNewRegistrationRequest(request_data)
        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '0',
            'customer_msisdn':
            request_data['customer_msisdn'],
            'customer_account':
            request_data['customer_account'],
            'branch':
            self.user['branch_id']
        })
        self.logger.write_log(
            "CUSTOMER",
            "Customer registration Request | {} | {} | {} | ".format(
                request_data['customer_msisdn'],
                request_data['customer_account'], self.user['username']))
        # return customer_data
        return {
            'code': '00',
            'msg': 'Customer registration request sent successfully'
        }

    def getUserActivities(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Getting customer request: {}".format(request_data))
        customer_data = self.model.getCustomerActivities(request_data)
        # self.logger.write_to_console("EVENT", "Get customer reponse: {}".format(customer_data))
        return customer_data

    def getCustomerDetials(self, customer_id):
        """
            This function handles all logic related to login on the platform
            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Getting customer request: {}".format(customer_id))
        customer_data = self.model.getCustomer(customer_id)
        cust_accs_data = self.model.getCustomerAccounts(customer_id)
        cust_transactions_data = []

        for account in cust_accs_data:
            cust_transactions_data = cust_transactions_data + self.model.getCustomerTransactions(
                account['account_number'])

        cust_requests_data = self.model.getCustomerRequests(customer_id)
        cust_branches = self.model.getBranches()

        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": customer_data,
            "accounts": cust_accs_data,
            "transactions": cust_transactions_data,
            "requests": cust_requests_data,
            "branches": cust_branches
        }

    def getCustomerReqDetails(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "Getting customer request: {}".format(request_data))
        customer_data = self.model.getCustomerRequestsByRequestId(
            request_data['request_id'])
        request_details = self.model.getNewCustomerRegistration(
            customer_data[0])
        # self.logger.write_to_console("EVENT", "Get customer reponse: {}".format(customer_data))
        for result in request_details:
            result["dob"] = result["dob"].strftime("%Y-%m-%d %H:%M:%S")
            result["request_date"] = result["request_date"].strftime(
                "%Y-%m-%d %H:%M:%S")

        return request_details[0]

    def blockCustomerRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Block Customer {1}".format(self.user['username'],
                                                     str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 7:
                    return {
                        'code': '01',
                        'msg': 'Block request for user is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '7',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'branch':
            self.user['branch_id']
        })
        self.logger.write_log(
            "CUSTOMER", "Block Customer Request | {} | {} ".format(
                request_data['customer_id'], self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def enableCustomerRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Activate user Customer {1}".format(self.user['username'],
                                                    str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 8:
                    return {
                        'code': '01',
                        'msg':
                        'Unblock user request for user is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '8',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'branch':
            self.user['branch_id']
        })

        self.logger.write_log(
            "CUSTOMER", "Unblock Customer Request | {} | {} ".format(
                request_data['customer_id'], self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def resetPinRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Customer Reset Pin {1}".format(self.user['username'],
                                                str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 1:
                    return {
                        'code': '01',
                        'msg':
                        'Reset pin request for customer is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '1',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'branch':
            self.user['branch_id']
        })

        self.logger.write_log(
            "CUSTOMER",
            "Reset Pin Request | {} | {} ".format(request_data['customer_id'],
                                                  self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def deactivateCustomerAccountRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT", "{0} Deactivate Customer Account {1}".format(
                self.user['username'], str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 4:
                    return {
                        'code':
                        '01',
                        'msg':
                        'Account Deactivation request for user is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '4',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'change_to':
            request_data['account_req'],
            'branch':
            self.user['branch_id']
        })

        self.logger.write_log(
            "CUSTOMER",
            "Deactivate Customer Account Request | {} | {} | {} ".format(
                request_data['customer_id'], request_data['account_req'],
                self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def activateCustomerAccountRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Activate Customer Account {1}".format(self.user['username'],
                                                       str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 5:
                    return {
                        'code':
                        '01',
                        'msg':
                        'Account Deactivation request for user is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '5',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'change_to':
            request_data['account_req'],
            'branch':
            self.user['branch_id']
        })

        self.logger.write_log(
            "CUSTOMER",
            "Activate Customer Account Request | {} | {} | {} ".format(
                request_data['customer_id'], request_data['account_req'],
                self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def addCustomerAccountRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Add Customer Account {1}".format(self.user['username'],
                                                  str(request_data)))

        pending_requests = self.model.getCustomerRequests(
            request_data['customer_id'])

        if len(pending_requests) > 0:
            for reques in pending_requests:
                if reques['request_type'] == 6 and reques[
                        'change_to'] == request_data['new_account']:
                    return {
                        'code': '01',
                        'msg':
                        'Add account request for user is already pending.'
                    }

        result = self.model.addCustomerRequest({
            'requested_by':
            self.user['username'],
            'request_type':
            '6',
            'customer_msisdn':
            request_data['customer_id'],
            'customer_account':
            request_data['customer_id'],
            'change_to':
            request_data['new_account'],
            'branch':
            self.user['branch_id']
        })

        self.logger.write_log(
            "CUSTOMER", "Add Customer Account Request | {} | {} | {} ".format(
                request_data['customer_id'], request_data['new_account'],
                self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def updateCustomer(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Customer Reset Pin {1}".format(self.user['username'],
                                                str(request_data)))

        pending_requests = self.model.getCustomerRequests(request_data['id'])

        if request_data['msisdn'] != request_data['id']:
            if len(pending_requests) > 0:
                for reques in pending_requests:
                    if reques['request_type'] == 2:
                        return {
                            'code':
                            '01',
                            'msg':
                            'Change phone number request for customer is already pending.'
                        }
                    else:
                        result = self.model.addCustomerRequest({
                            'requested_by':
                            self.user['username'],
                            'request_type':
                            '2',
                            'customer_msisdn':
                            request_data['id'],
                            'customer_account':
                            request_data['id'],
                            'branch':
                            self.user['branch_id'],
                            'change_from':
                            request_data['id'],
                            'change_to':
                            request_data['msisdn']
                        })
                        self.logger.write_log(
                            "CUSTOMER",
                            "Change Customer Phone Number Request | {} | {} | {} "
                            .format(request_data['customer_id'],
                                    request_data['id'], self.user['username']))
                        break

        result = self.model.updatevouchers({
            'id':
            request_data['id'],
            'first_name':
            request_data['first_name'],
            'middle_name':
            request_data['middle_name'],
            'last_name':
            request_data['last_name'],
            'gender':
            request_data['gender']
        })

        self.logger.write_log(
            "CUSTOMER", "Update Customer Details | {} | {} ".format(
                request_data['id'], self.user['username']))

        return {'code': '00', 'msg': 'Request sent.'}

    def searchvouchers(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)

        self.logger.write_to_console(
            "EVENT",
            "Searching vouchers for {0}".format(request_data['search_param']))

        customer_data = self.model.searchvouchers(request_data)

        for result in customer_data:

            result["join_date"] = result["join_date"].strftime(
                "%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]

        return customer_data

    def declineCustomerRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Add Customer Account {1}".format(self.user['username'],
                                                  str(request_data)))

        pending_requests = self.model.getCustomerRequestsByRequestId(
            request_data['request_id'])
        print(pending_requests)
        if len(pending_requests) > 0:
            if pending_requests[0]['request_type'] == 0:
                #Remove from tbl_customer
                self.model.deleteCustomerNewCustomer(
                    pending_requests[0]['customer_account'],
                    pending_requests[0]['customer_msisdn'])
                #Remove from tbl_user_requests
                self.model.deleteCustomerRequest(request_data['request_id'])
                self.logger.write_log(
                    "CUSTOMER",
                    "Customer Registration Declined | {} | {} | {} ".format(
                        pending_requests[0]['customer_msisdn'],
                        pending_requests[0]['customer_account'],
                        self.user['username']))
                return {
                    'code': '00',
                    'msg': 'Registration request declined successfully.'
                }
            else:
                #Remove from tbl_user_requests
                self.model.deleteCustomerRequest(request_data['request_id'])
                return {'code': '00', 'msg': 'Request declined successfully.'}
        else:
            self.model.deleteCustomerRequest(request_data['request_id'])
            return {'code': '01', 'msg': 'No request for found.'}

    def approveCustomerRequest(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        self.logger.write_to_console(
            "EVENT",
            "{0} Add Customer Account {1}".format(self.user['username'],
                                                  str(request_data)))

        pending_requests = self.model.getCustomerRequestsByRequestId(
            request_data['request_id'])
        print(pending_requests)

        if len(pending_requests) > 0:
            if pending_requests[0]['request_type'] == 0:
                return self.registerNewUser(pending_requests[0])

            elif pending_requests[0]['request_type'] == 1:
                return self.changeUserPin(pending_requests[0])

            elif pending_requests[0]['request_type'] == 2:
                return self.changeUserPhoneNumber(pending_requests[0])

            elif pending_requests[0]['request_type'] == 3:
                return self.changeUserAccountNumber(pending_requests[0])

            elif pending_requests[0]['request_type'] == 4:
                return self.deactivateUserAccountNumber(pending_requests[0])

            elif pending_requests[0]['request_type'] == 5:
                return self.activateUserAccountNumber(pending_requests[0])

            elif pending_requests[0]['request_type'] == 6:
                return self.addUserAccountNumber(pending_requests[0])

            elif pending_requests[0]['request_type'] == 7:
                return self.deactivateUser(pending_requests[0])

            elif pending_requests[0]['request_type'] == 8:
                return self.activateUser(pending_requests[0])
            else:
                self.model.deleteCustomerRequest(request_data['request_id'])
                return {'code': '01', 'msg': 'No request for found.'}
        else:
            self.model.deleteCustomerRequest(request_data['request_id'])
            return {'code': '01', 'msg': 'No request for found.'}

    def registerNewUser(self, request_data):
        # GET User data
        customer_data = self.model.getNewCustomerRegistration(request_data)
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_register_customer(customer_data[0])

        if result['code'] == '00':
            self.model.deleteCustomerNewCustomer(
                customer_data[0]['customer_account'],
                customer_data[0]['customer_msisdn'])
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER",
                "Customer Registration Approved | {} | {} | {} ".format(
                    customer_data[0]['customer_msisdn'],
                    customer_data[0]['customer_account'],
                    self.user['username']))
            return {'code': '00', 'msg': "Customer registration approved"}
        else:
            return {'code': '01', 'msg': result['msg']}

    def changeUserPin(self, request_data):
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_reset_customer_pin(customer_data[0])

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER", "Approved Change Pin | {} | {} ".format(
                    customer_data[0]['id'], self.user['username']))
            return {'code': '00', 'msg': "Customer pin reset sucessful."}
        else:
            return {'code': '01', 'msg': result['msg']}

    def changeUserPhoneNumber(self, request_data):
        # GET User data
        res = False
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        customer_accs = self.model.getCustomerAccounts(
            request_data['customer_account'])
        print(customer_data)
        print(customer_accs)

        for account in customer_accs:
            # Send to Dari API to register
            result = self.model.fusion_deactivate_customer({
                'msisdn':
                customer_data[0]['msisdn'],
                'uniqueID':
                customer_data[0]['account']
            })
            print(result)
            if result['code'] == '00':
                reg_result = self.model.fusion_register_customer({
                    'msisdn':
                    request_data['change_to'],
                    'uniqueID':
                    customer_data[0]['account']
                })
                print(reg_result)
                if reg_result['code'] == '00':
                    res = True
            else:
                pass

        if res == True:
            self.model.updatevouchers({
                'id': customer_data['id'],
                'msisdn': request_data['change_to']
            })
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER",
                "Approved Change Phone Number | {} | from: {} | to: {} | {} ".
                format(customer_data[0]['msisdn'], customer_data[0]['msisdn'],
                       request_data['change_to'], self.user['username']))
            return {
                'code': '00',
                'msg': "Customer phone number change sucessful."
            }
        else:
            self.model.deleteCustomerRequest(request_data['id'])
            return {
                'code': '01',
                'msg': "Customer phone number change failed."
            }

    def changeUserAccountNumber(self, request_data):
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        # result = self.model.sic_reset_customer_pin(customer_data[0])

        # if result['code'] == '00':
        self.model.deleteCustomerRequest(request_data['id'])
        return {'code': '00', 'msg': "Customer account changed successfully."}
        # else:
        #     return {'code': '01', 'msg': result['msg']}

    def deactivateUserAccountNumber(self, request_data):
        # GET User data
        # customer_data = self.model.getCustomer(request_data['customer_account'])
        # customer_accs = self.model.getCustomerAccounts(request_data['customer_account'])
        # print(customer_data)
        # print(customer_accs)
        # result = None
        # acc_id = None

        # # Send to Dari API to register
        # for account in customer_accs:
        #     if account['account_number'] == request_data['change_to']:
        #         acc_id = account['id']
        #         result = self.model.fusion_deactivate_customer({'msisdn': request_data['change_to'], 'uniqueID': customer_data[0]['account']})
        #         break

        # if result['code'] == '00':
        #     self.model.updateCustomerAccount({'id': acc_id, 'status': 'INACTIVE'})
        #     self.model.deleteCustomerRequest(request_data['id'])
        #     return {'code': '00', 'msg':"Customer deactivation successful."}
        # else:
        #     return {'code': '01', 'msg': result['msg']}
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_change_customer_account_status(
            request_data, "INACTIVE")

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER", "Approved Change Pin | {} | {} ".format(
                    customer_data[0]['id'], self.user['username']))
            return {'code': '00', 'msg': "Customer account has been blocked."}
        else:
            return {'code': '01', 'msg': result['msg']}

    def activateUserAccountNumber(self, request_data):
        # GET User data
        # customer_data = self.model.getCustomer(request_data['customer_account'])
        # customer_accs = self.model.getCustomerAccounts(request_data['customer_account'])
        # print(customer_data)
        # print(customer_accs)
        # result = None
        # acc_id = None

        # Send to Dari API to register
        # for account in customer_accs:
        #     if account['account_number'] == request_data['change_to']:
        #         acc_id = account['id']
        #         result = self.model.fusion_activate_customer({'msisdn': request_data['change_to'], 'uniqueID': customer_data[0]['account']})
        #         break

        # if result['code'] == '00':
        #     self.model.updateCustomerAccount({'id': acc_id, 'status': 'ACTIVE'})
        #     self.model.deleteCustomerRequest(request_data['id'])
        #     return {'code': '00', 'msg':"Customer account activation successful."}
        # else:
        #     return {'code': '01', 'msg': result['msg']}
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_change_customer_account_status(
            request_data, "ACTIVE")

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER",
                "Approved Account Activation | {} | {} | {} ".format(
                    customer_data[0]['id'], request_data['change_to'],
                    self.user['username']))
            return {'code': '00', 'msg': "Customer account has been blocked."}
        else:
            return {'code': '01', 'msg': result['msg']}

    def addUserAccountNumber(self, request_data):
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.fusion_register_customer({
            'msisdn':
            customer_data[0]['msisdn'],
            'uniqueID':
            request_data[0]['change_to']
        })

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER",
                "Approved Account Activation | {} | {} | {} ".format(
                    customer_data[0]['id'], request_data['change_to'],
                    self.user['username']))
            return {'code': '00', 'msg': "Customer account added sucessfully."}
        else:
            return {'code': '01', 'msg': result['msg']}

    def deactivateUser(self, request_data):
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_change_customer_status(customer_data[0],
                                                       "INACTIVE")

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            self.logger.write_log(
                "CUSTOMER",
                "Approved Account Deactivation | {} | {} | {} ".format(
                    customer_data[0]['id'], request_data['change_to'],
                    self.user['username']))
            return {'code': '00', 'msg': "Customer account has been blocked."}
        else:
            return {'code': '01', 'msg': result['msg']}

    def activateUser(self, request_data):
        # GET User data
        customer_data = self.model.getCustomer(
            request_data['customer_account'])
        print(customer_data)
        # Send to Dari API to register
        result = self.model.sic_change_customer_status(customer_data[0],
                                                       "ACTIVE")

        if result['code'] == '00':
            self.model.deleteCustomerRequest(request_data['id'])
            return {
                'code': '00',
                'msg': "Customer account has been unblocked."
            }
        else:
            return {'code': '01', 'msg': result['msg']}

    def getAllUploadsRequests(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """

        if request_data == {}:
            request_data = {'page': 0, 'fromdate': '', 'todate': ''}
        else:
            pass

        print(request_data)

        self.logger.write_to_console(
            "EVENT",
            "loading all uploads for {0}".format(self.user['username']))

        if request_data == {}:
            request_data = {
                'offset': 0,
                'records': 11,
                'fromdate': '',
                'todate': '',
                'request_type': ''
            }
        else:
            request_data['offset'] = int(request_data['page']) * 11
            request_data['records'] = 11

        customer_data = self.model.getAllUploads(request_data)
        print(customer_data)

        for result in customer_data[0]:

            result["upload_date"] = result["upload_date"].strftime(
                "%Y-%m-%d %H:%M:%S")

            if result["processed_date"] != None:
                result["processed_date"] = result["processed_date"].strftime(
                    "%Y-%m-%d %H:%M:%S")

            if result["approved_date"] != None:
                result["approved_date"] = result["approved_date"].strftime(
                    "%Y-%m-%d %H:%M:%S")

        pages = math.ceil(customer_data[1][0]['count'] / 12)
        print(pages)

        self.logger.write_to_console("EVENT",
                                     "Administrators gotten | Success.")
        return {
            "code": language.CODES['SUCCESS'],
            "msg": self.lang['data_retrived'],
            "data": customer_data[0],
            "pages": pages
        }
        return customer_data

    def record_uploaded_file(self, file_obl):
        self.logger.write_to_console(
            "EVENT", "Recording Uploaded file | {}".format(file_obl.filename))

        file_extension = file_obl.filename.split(".")
        # filetype = file_extension[-1]
        if file_extension[-1] != "csv":
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

        bulk_id = self.generate_id(self.user['branch_code'])
        # file_obl.save(secure_filename(file_obl.filename))
        file_obl.save(os.path.join(config.UPLOAD_DIRECTORY, bulk_id + ".csv"))
        # fileChecksum = self.md5Checksum(bulk_id+".csv")
        fileSize = os.stat(
            os.path.join(config.UPLOAD_DIRECTORY, bulk_id + ".csv")).st_size

        fields = {
            "bulk_id": bulk_id,
            "filename": file_obl.filename,
            "filesize": fileSize,
            "fileType": file_extension[-1],
            # "file_checksum": fileChecksum,
            "branch": self.user['branch_code'],
            "uploaded_by": self.user['username']
        }

        self.logger.write_to_console(
            "EVENT", "Uploaded File Details | {}".format(fields))

        result = self.model.insertBulkUpload(fields)
        print(result)
        if result == True:
            # self.logger.write_to_console("EVENT", "Starting processing Thread for | {}".format(file_obl.filename))
            # processing_thread = Thread(target=self.process_csv, args=(os.path.join(config.UPLOAD_DIRECTORY, bulk_id+".csv"), file_obl.filename, self.user['username']))
            # processing_thread.start()
            # self.logger.write_to_console("EVENT", "Thread started for | {}".format(file_obl.filename))
            self.logger.write_log(
                "CUSTOMER", "Uploaded Bulk Registration | {} | {} ".format(
                    fields['bulk_id'], self.user['username']))
            return {
                "code": language.CODES['SUCCESS'],
                "msg": self.lang['file_recorded'],
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

    def approve_uploaded_file(self, request_data):
        self.logger.write_to_console(
            "EVENT",
            "Recording Uploaded file | {}".format(request_data['bulk_id']))

        bulk_details = self.model.getBulkUploadDetails(request_data['bulk_id'])

        fields = {
            "bulk_id": request_data['bulk_id'],
            # "file_checksum": fileChecksum,
            "approval_status": "Approved",
            "processing_status": "Processing",
            "approved_by": self.user['username'],
            "approved_date": "NOW()"
        }

        self.logger.write_to_console(
            "EVENT", "Uploaded File Details | {}".format(fields))

        result = self.model.updateBulkUpload(fields)
        print(result)
        if result == True:
            self.logger.write_to_console(
                "EVENT", "Starting processing Thread for | {}".format(
                    request_data['bulk_id']))
            processing_thread = Thread(
                target=self.process_csv,
                args=(os.path.join(config.UPLOAD_DIRECTORY,
                                   request_data['bulk_id'] + ".csv"),
                      request_data['bulk_id'], self.user['username'],
                      bulk_details[0]['uploaded_by'], request_data['bulk_id']))
            processing_thread.start()
            self.logger.write_to_console(
                "EVENT",
                "Thread started for | {}".format(request_data['bulk_id']))

            self.logger.write_log(
                "CUSTOMER", "Approved Bulk Registration | {} | {} ".format(
                    request_data['bulk_id'], self.user['username']))
            return {
                "code": language.CODES['SUCCESS'],
                "msg": "File processing approved.",
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

    def decline_uploaded_file(self, request_data):
        self.logger.write_to_console(
            "EVENT",
            "Recording Uploaded file | {}".format(request_data['bulk_id']))

        fields = {
            "bulk_id": request_data['bulk_id'],
            # "file_checksum": fileChecksum,
            "approval_status": "Declined",
            "processing_status": "Processing",
            "approved_by": self.user['username'],
            "approved_date": "NOW()"
        }

        self.logger.write_to_console(
            "EVENT",
            "Uploaded File Details | {}".format(request_data['bulk_id']))

        result = self.model.updateBulkUpload(fields)
        print(result)
        if result == True:
            self.logger.write_log(
                "CUSTOMER", "Decline Bulk Registration | {} | {} ".format(
                    request_data['bulk_id'], self.user['username']))
            return {
                "code": language.CODES['SUCCESS'],
                "msg": "File processing declined.",
                "data": []
            }
        else:
            return {
                "code": language.CODES['FAIL'],
                "msg": self.lang['wrong_file_format'],
                "data": []
            }

    def process_csv(self, upload_id, filename, username, uploaded_by, bulk_id):

        try:
            res = []
            first_name = ""
            last_name = ""
            middle_name = ""
            dob = ""
            gender = ""
            region = ""
            city = ""
            msisdn = ""
            uniqueid = ""
            registered_by = username
            print("processing csv")

            with open(upload_id, "rb") as f:
                reader = unicodecsv.DictReader(f)
                #file upload is being read in a group in a dictionary{}
                print(reader)
                res = [x for x in reader]
            #     self.log.write_to_file(msg="In process_csv_reader {}".format(res),filename="event")
            # print(res)

            #reading the file in a format way for processing
            for trans in res:
                try:
                    #Converting the data in a dictionary form
                    trans = dict(trans)
                    self.logger.write_to_console(
                        "EVENT", "Processing: {}".format(trans))
                    print(trans)
                    #Converting the header of the file in lowercase for processing in key-value pair
                    for key, value in trans.items():

                        try:

                            print(key)
                            print(value)

                            if key.lower() == "first_name":
                                first_name = value

                            if key.lower() == "last_name":
                                last_name = value

                            if key.lower() == "middle_name":
                                middle_name = value

                            if key.lower() == "dob":
                                dob = value

                            if key.lower() == "gender":
                                gender = value

                            if key.lower() == "region":
                                region = value

                            if key.lower() == "city":
                                city = value

                            if key.lower() == "msisdn":
                                msisdn = value

                            if key.lower() == "uniqueid":
                                uniqueid = value

                        except Exception as e:
                            raise e
                            print(e)
                            error = str(e)
                            return error

                    #sending request to the tups_portal(etienee' portal)
                    request_data = {
                        "action": "register",
                        "uniqueid": uniqueid,
                        "msisdn": msisdn,
                        "firstname": first_name,
                        "lastname": last_name,
                        "middlename": middle_name,
                        "dob": dob,
                        "gender": gender,
                        "region": region,
                        "city": city,
                        "requestedBy": uploaded_by,
                        "requestBranch": uniqueid[:3]
                    }

                    self.logger.write_to_console(
                        "EVENT", "Sending registrations request | {}".format(
                            request_data))
                    api_response = self.model.sic_bulk_register_customer(
                        request_data)
                    print(api_response)
                    # api_response = {"code": "00", "msg": "Response"}
                    self.logger.write_to_console(
                        "EVENT",
                        "Registration response | {}".format(api_response))
                    #response from tups portal(etienne's portal) successfully save to tbl_bulk_transaction

                    if api_response["code"] == "00":
                        self.logger.write_to_console(
                            "EVENT", "Registration Successful | {}".format(
                                request_data))

                    #api_response from tups portal(etienne's portal) failed to be processed which is save to tbl_bulk_transaction
                    else:
                        self.logger.write_to_console(
                            "EVENT",
                            "Registration Failed | {}".format(request_data))

                except Exception as e:
                    raise e
                    print(e)
                    error = str(e)
                    self.log.write_to_file(
                        msg="In process_csv_error_exception {}".format(error),
                        filename="error")
                    return error

            data = {
                "processing_status": "Completed",
                "processed_date": "NOW()",
                "bulk_id": bulk_id
            }
            result = self.model.updateBulkUpload(data)

            #####
            # Send Mail
            #####

        except Exception as e:
            raise e
            error = "Processing of file failed"
            self.log.write_to_file(
                msg="In process_csv_exeception_raised_error {}".format(error),
                filename="error")
            return error

    def searchvouchersRequests(self, request_data):
        """
            This function handles all logic related to login on the platform

            @Params : void
        """
        print(request_data)

        self.logger.write_to_console(
            "EVENT",
            "Searching vouchers for {0}".format(request_data['search_param']))

        customer_data = self.model.searchvouchersReq(request_data)

        for result in customer_data:

            result["request_date"] = result["request_date"].strftime(
                "%Y-%m-%d %H:%M:%S")

            # if result["status"] == 1:
            #     result["status"] = self.lang["active"]
            # else:
            #     result["status"] = self.lang["inactive"]

        return customer_data

    def generate_id(self, preamb):
        """
        Generate unique id
        Parameters: preamb => string to be used at the start of the id
        """
        t_id = preamb + str(hash(str(uuid.uuid1())) % 100000000000)
        return t_id

    def md5Checksum(self, fileName):
        filePath = os.path.join(config.UPLOAD_DIRECTORY, fileName)

        with open(filePath, 'rb') as fh:
            m = hashlib.md5()
            while True:
                data = fh.read()
                if not data:
                    break
                m.update(data)
        return m.hexdigest()