logger->info("Donor: Listing In admin role . BID = ".$session_bid); $where = ['isactive' => 1, 'business_id' => (int)$session_bid]; } else { $this->logger->info("Donor: Listing In Super-admin role ."); $where = ['isactive != ' => NULL]; } $CustomerModel = new CustomerModel(); $data['page_name'] = 'Donor Details'; $data['customer'] = $CustomerModel->where($where)->orderBy('doner_id', 'DESC')->findAll(); // print_r($data); die(); $this->render_page('customer_list', $data); } else { return redirect()->to('login'); } } ## To Load Donor Form (Add/Update) public function new_Donor($id) { helper('session'); $session_bid = get_business_id(); if ($id === '0') { // Add Donor $data['page_name'] = 'Add Donor Details'; $data['customer'] = []; } else if ($id !== '0') { // Edit Donor $data['page_name'] = 'Edit Donor Details'; $customerModel = new CustomerModel(); // Retrieve customer details by customer ID $edit_user_details = $customerModel->where(['doner_id' => $id])->first(); $data['customer'] = $edit_user_details; } $data['session_bid'] = $session_bid; $data['country_details'] = $this->get_country_details(); $data['state_details'] = $this->get_state_details(); // echo '
';
        // print_r($data); die;

        $this->render_page('customer_form', $data);
    }


    ## For inserting/updating details of customer
    public function insert_customer()
    {
        $requestData = $this->request->getPost();
        // print_r($requestData);die;
        $this->logger->info("Donor: Inserting/Updating Details");
        try {
            helper('session');
            $session_bid = get_business_id();
            $session_uid = get_logged_user_id();
            $session_role = get_user_role();
            $model = new CustomerModel();
            $dob = $this->request->getPost('dob');
            $dob = (isset($dob) && $dob != "") ? $dob : NULL ;
            $data = [
                'first_name'    => $this->request->getPost('cfname'),
                'last_name'     => $this->request->getPost('csname'),
                'mobile_no'     => $this->request->getPost('cmobile'),
                'email'         => $this->request->getPost('cmail'),
                'date_of_birth' => $dob,
                'pan_no'        => $this->request->getPost('pan_no'),
                'doner_type'    => $this->request->getPost('DonorType'),
                'org_name'      => $this->request->getPost('org_name') !== '' ||  $this->request->getPost('org_name') !== null  ? $this->request->getPost('org_name') : NULL,
                'address'       => $this->request->getPost('address'),
                'city'          => $this->request->getPost('city'),
                'state'         => $this->request->getPost('state') ? $this->request->getPost('state') : $this->request->getPost('state_text'),
                'postal_code'   => $this->request->getPost('zip'),
                'country'       => $this->request->getPost('country'),
                'business_id'   => $this->request->getPost('business_id'),
                
            ];
            
            // print_r($data); die();

            $doner_id = $this->request->getPost('doner_id'); // Get the business ID for update
            if (empty($doner_id)) {

                // It's an insert operation
                $data['isactive'] = 1;
                $data['created_by'] = $session_uid;
                if ($model->insert($data)) {
                    session()->setFlashdata('success', 'Donor successfully created.');
                    $this->logger->info("Donor : has been added successfully. Inserted ID = " . $model->insertID());
                    $doner_id_for_addresses = $model->insertID();// for Donor ADDRESS Table
                } else {
                    session()->setFlashdata('error', 'Donor could not be added. Please try again..');
                    $this->logger->error("Donor: Err could not be added. Please try again.");
                    $doner_id_for_addresses = "";
                }
            } else {
                // It's an update operation
                if ($session_role !== 'manager') {
                    $isactive = $this->request->getPost('isactive');
                    $data['isactive'] = ($isactive == 'on') ? 1 : 0;
                }
                $data['updated_by'] = $session_uid;
                $doner_id_for_addresses = $doner_id; // for Customer ADDRESS Table
                if ($model->update($doner_id, $data)) {
                    session()->setFlashdata('success', 'Donor successfully updated');
                    $this->logger->info("Donor: has been updated successfully. Updated Donor ID = " . $doner_id_for_addresses);
                } else {
                    session()->setFlashdata('error', 'Donor updation failed. Please try again.');
                    $this->logger->error("Donor: Err Failed to update ID =" . $doner_id_for_addresses);
                }
            }
            
            // if($doner_id_for_addresses != ""){
            //     $this->logger->info("Donor: i got Donor id for addresses = " . $doner_id_for_addresses);
            //     $requestData = $this->request->getPost();
            //     $bill_addr = $this->save_customer_addresses($doner_id_for_addresses, $requestData, 'b');
            //     $this->logger->info("Customer: bill addr final message = " .implode(" ",$bill_addr));
            //     $ship_addr = $this->save_customer_addresses($doner_id_for_addresses, $requestData, 's');
            //     $this->logger->info("Donor: Ship addr final message = " . implode(" ",$ship_addr));
            // }
            
        } catch (\Exception $e) {
            $this->logger->error("Donor : Err Occur =" . $e->getMessage());
            session()->setFlashdata('error', 'Message: ' . $e->getMessage());
        }
        return redirect()->route('Donor_list');
    }



    ## For delete the customer details (Which means inactive the details)
    public function delete_customer($id)
    {
        try {
            helper('session');
            $session_uid = get_logged_user_id();
            $CustomerModel = new CustomerModel();
            $where = ['doner_id' => (int)$id, 'isactive =' => 1];

            // Check if the business ID exists
            $existingCustomer = $CustomerModel->where($where)->find($id);
            if ($existingCustomer) {
                $this->logger->Info("Donor: Going to Inactive ID = ".$id);
                $data = ['isactive' => 0 , 'updated_by' => $session_uid];
                // Delete the business record
                if ($CustomerModel->update($id, $data)) {
                    session()->setFlashdata('success', 'Donor successfully deleted.');
                    $this->logger->info("Donor: has been Inactived successfully. Inactived ID = " . $id);
                } else {
                    $this->logger->error("Donor: Not able to Inactive ID =" . $id);
                    throw new \Exception("Data Not able to Deleted");
                }
            }
        } catch (\Exception $e) {
            $this->logger->error("Customer: Err Occur = " . $e->getMessage());
            session()->setFlashdata('error', 'Message: ' . $e->getMessage());
        }
        return redirect()->route('Donor_list');
    }

    public function get_customer_address($id,$type){
        $model = new CustomerModel();
        $model->setTable('customer_addresses');
        $where = ['isactive' => 1, 'doner_id' => (int)$id,'address_type'=>(int)$type];
        $address_details = $model->where($where)->findAll();
        return $address_details;
    }

    public function get_country_details()
    {
        $model = new CustomerModel();
        $model->setTable('countries');
        $country_details = $model->orderBy('country_id', 'ASC')->findAll();
        return $country_details;
    }

    public function get_state_details()
    {
        $model = new CustomerModel();
        $model->setTable('states');
        $state_details = $model->orderBy('state_id', 'ASC')->findAll();
        return $state_details;
    }

    public function customer_group(){

        $session_bid = get_business_id();
        $data['page_name'] = 'Donor Group Details';
        $model = new CustomerModel();
        $data['customer_group'] = $model->getGroupDetails($session_bid);
        $this->render_page('customer_group', $data);
    }


    public function view_customer_group($id){ 

        helper('session');
        $session_bid = get_business_id();
        
        $data['field'] = [
            ['value'=>'',               'fieldflag'=>1, 'text'=> 'Choose the Field', 'disable' => false],
            ['value'=>'C.doner_type',   'fieldflag'=>1, 'text'=> 'Donor Type',       'disable' => false],
            ['value'=>'C.city',         'fieldflag'=>1, 'text'=> 'City',             'disable' => false],
            ['value'=>'C.postal_code',  'fieldflag'=>1, 'text'=> 'Postal Code',      'disable' => false],
            ['value'=>'I.receipt_date', 'fieldflag'=>2, 'text'=> 'Receipt Date',     'disable' => false],
      ];

        $data['operator'] = [
            '' => 'Choose the operator',
            'equal' => 'Equal to (=)',
            'not equal' => 'Not Equal (!=)',
            'like' => 'Like (%)',
            'greater than' => 'Greater than (>)',
            'greater than or equal to' => 'Greater than or Equal to (>=)',
            'less than' => 'Less than (<)',
            'less than or equal to' => 'Less than or Equal to (<=)',
            'contain' => 'Contain (in)',
            'not contain' => 'Not Contain (not in)',
            'between' => 'Between',
            'is null' => 'Is NULL',
            'is not null' => 'Is Not NULL',
        ];
        $data['customer_group'] = [];

        if ($id === '0') {
            // Add Customer
            $data['page_name'] = 'Add Donor Group';
        } else if ($id !== '0') {
            // Edit Customer
            $data['page_name'] = 'Edit Donor Group';
    
            // Load your Customer Model
          $model = new CustomerModel();
          $model->setTable('customer_groups');
          $where = ['group_id'=>$id];
          $result = $model->where($where)->findAll();
          
          if (!empty($result)) {
            $data['customer_group']['groupname'] = $result[0]['group_name'];
            $data['customer_group']['column'] = $result[0]['column'] ? unserialize($result[0]['column']) : [];
            $data['customer_group']['operator'] = $result[0]['operator'] ? unserialize($result[0]['operator']) : [];
            $data['customer_group']['values'] = $result[0]['value'] ? unserialize($result[0]['value']) : [];
            $data['customer_group']['group_id'] =  $result[0]['group_id'];
            $data['customer_group']['isactive'] =  $result[0]['isactive'];
         } 
        }
        $this->render_page('customer_group_form', $data);
    }


    public function preview_customer_group($id){
        try {
        helper('session');
        $model = new CustomerModel();
        $model->setTable('customer_groups');
        $where = ['isactive' => 1,'group_id'=>$id];
        $result = $model->where($where)->findAll();
        $db = \Config\Database::connect();            
        $sql = (string)$result[0]['group_query'];

        if($sql){
            $query = $db->query($sql);
            $results = $query->getResultArray();
            if(empty($results)){
                throw new \Exception("Data Not Available");    
            }else{
                return $this->response->setJSON($results);
            }
        }else{
            return $this->response->setJSON([]);
        }
        
      } catch (\Exception $e) {
            $this->logger->error("Donor Group: Err Occur = ".$e->getMessage()." File = ". $e->getFile() . " Line = " . $e->getLine());
            session()->setFlashdata('error', 'Message: ' . $e->getMessage());
      }
    }
    public function delete_customer_group($id){ 
        try {
            helper('session');
            $session_uid = get_logged_user_id();
            $model = new CustomerModel();
            $model->setTable('customer_groups');
            $where = ['isactive' => 1,'group_id'=>(int)$id];
            $result = $model->where($where)->findAll();
            if ($result) {
                $this->logger->Info("Donor Group: Going to Inactive ID = ".$id);
                $data = ['isactive' => 0 , 'updated_by' => $session_uid,'group_id'=>(int)$id];
                $statement = $model->saveGroupDetails($data);// just updating Inactive status only.
                if ($statement['success']) {
                    session()->setFlashdata('success', $statement['success'] ? 'Deleted successfully.' : "" );
                    $this->logger->info($statement['log']);    
                } else if ($statement['error']) { 
                    session()->setFlashdata('error', $statement['error']);
                    $this->logger->error($statement['log']);
                }else{
                    throw new \Exception("Donor Group: Err Occur on data the Donor Group Inactive");    
                }
            }
        } catch (\Exception $e) {
            $this->logger->error("Donor Group: Err Occur = ".$e->getMessage()." File = ". $e->getFile() . " Line = " . $e->getLine());
            session()->setFlashdata('error', 'Message: ' . $e->getMessage());
        }
        return redirect()->route('customer_group');
        
    }
    public function insert_customer_group(){        
        try {
            $this->logger->info("Donor Group: Inserting/Updating Details");
            helper('session');
            $session_uid = get_logged_user_id();
            $request_data = $this->request->getPost();
            $string_flag = $request_data['string_flag'];
            // $this->logger->info("Customer Group: Request data = ".json_encode($request_data));
            
            $session_bid = get_business_id();
            $model = new CustomerModel();
            // Array ( [groupname] => nil [column] => Array ( [0] => city [1] => state ) [operator] => Array ( [0] => not contain [1] => not equal ) [values] => Array ( [0] => 2 [1] => 3 ) )
            $data = [
                'group_name'  => $request_data['groupname'],
                'column'      => serialize($request_data['column']),
                'operator'    => serialize($request_data['operator']),
                'value'       => serialize($request_data['values']),
            ];

            $data['business_id'] = $session_bid;

            // Initialize an empty array to store the conditions
            $conditions = array();

            // Loop through the elements and build the conditions
            for ($i = 0; $i < count($request_data['column']); $i++) {
                $column = $request_data['column'][$i];
                $operator = $request_data['operator'][$i];
                $value = $request_data['values'][$i];
                // Handle different operators and build corresponding conditions
                switch ($operator) {
                    case 'equal':
                        $conditionStrings[] = "LOWER($column) = LOWER('$value') ";
                        break;
                    case 'not equal':
                        $conditionStrings[] = "LOWER($column) <> LOWER('$value') ";
                        break;
                    case 'like':
                        $conditionStrings[] = "LOWER($column) LIKE '%$value%'";
                        break;
                    case 'contain':
                    case 'in':
                        $values = explode(',', $value);
                        $conditionStrings[] = "LOWER($column) IN ('" . implode("', '", $values) . "')";
                        break;
                    case 'not contain':
                    case 'not in':
                        $values = explode(',', $value);
                        $conditionStrings[] = "LOWER($column) NOT IN ('" . implode("', '", $values) . "')";
                        break;
                    case 'between':
                        $dates = explode(',', $value);
                        $conditionStrings[] = "$column BETWEEN '$dates[0]' AND '$dates[1]'";
                        break;
                    case 'greater than':
                        $conditionStrings[] = "$column > $value";
                        break;
                    case 'greater than or equal to':
                        $conditionStrings[] = "$column >= $value";
                        break;
                    case 'less than':
                        $conditionStrings[] = "$column < $value";
                        break;
                    case 'less than or equal to':
                        $conditionStrings[] = "$column <= $value";
                        break;
                    case 'is null':
                        $conditionStrings[] = "$column IS NULL";
                        break;
                    case 'is not null':
                        $conditionStrings[] = "$column IS NOT NULL";
                        break;
                }
            }

            // Join the conditions with 'AND'
            $whereCondition = implode(' AND ', $conditionStrings);
            // echo "*************** whereCondition =>>> ";
            // echo $whereCondition;
            // If a groupname is specified, include it in the condition
            // if ($conditionsArray['groupname'] !== 'nil') {
            //     $whereCondition = "($whereCondition) AND groupname = '{$conditionsArray['groupname']}'";
            // }

            // Now you can use $whereCondition in your SQL query
            $db = \Config\Database::connect();
            // $sql = "SELECT doner_id,CONCAT(first_name,'',last_name) as customer_name,email,mobile_no FROM customers WHERE ".$whereCondition;
            $sql = "SELECT C.city, C.state, I.receipt_date, C.doner_id, CONCAT(C.first_name, ' ', C.last_name) as customer_name, C.email, C.mobile_no, C.isactive, COUNT(I.receipt_id) as invoice_count_raised_by_customer FROM customers as C
            LEFT JOIN receipt I ON I.doner_id = C.doner_id and I.isactive = 1
            WHERE C.isactive = 1 AND " . $whereCondition . "
            GROUP BY C.doner_id";

            $this->logger->info("Customer Group: SQL = ".$sql);
             
            // echo "$sql"; die;

            // Execute the query
            $query = $db->query($sql);

            // Get the result
            $results = $query->getResult();
            $this->logger->info("Customer Group: ".json_encode($results));
            $group_id = $request_data['group_id']; // Get the ID for update
            $isactive = $group_id != "" ? $request_data['isactive'] : 'on';
            if($string_flag == "save"){
                $data['group_query'] = $sql;
                $data['group_id'] = $group_id;
                $data['isactive'] = (($isactive == 'on') ? 1 : 0);
                $data['created_by'] = $session_uid;
                $data['updated_by'] = $session_uid;
                $statement = $model->saveGroupDetails($data);
                if ($statement['success']) {
                    session()->setFlashdata('success', $statement['success']);
                    $this->logger->info($statement['log']);
                    
                } else if ($statement['error']) { 
                    session()->setFlashdata('error', $statement['error']);
                    $this->logger->error($statement['log']);
                }else{
                    throw new \Exception("Donor Group: Err Occur on data the Save");    
                }

            }else if($string_flag == "preview"){
                return $this->response->setJSON($results);
            }else{
                throw new \Exception("Data Not Found");
            }
        } catch (\Exception $e) {
            $this->logger->error("Donor Group: Err Occur = ".$e->getMessage()." File = ". $e->getFile() . " Line = " . $e->getLine());
            session()->setFlashdata('error', 'Message: ' . $e->getMessage());
        }
        return redirect()->route('customer_group');
    }
    
}