paymentModel = new PaymentStatusModel(); } ## For Invoice Listing.. public function index() { helper('session'); if (is_session_active()) { $session_role = get_user_role(); $session_bid = get_business_id(); if (!empty($session_role) && $session_role !== "sadmin") { $this->logger->info("Invoice: Listing In Admin BID = " . $session_bid); $where = ['I.business_id' => (int)$session_bid, 'I.isactive' => 1, 'I.invoice_type' => 1]; } else { $this->logger->info("Invoice: Listing In the Super-Admin "); $where = ['I.business_id != ' => NULL, 'I.isactive != ' => NULL, 'I.invoice_type' => 1]; } $model = new InvoiceModel(); $data['page_name'] = 'Online Invoice Details'; $data['invoice'] = $model->getJoinedData($where, ['I.invoice_date', 'DESC']); $this->logger->info("Invoice: Listing Count ." . count($data['invoice'])); $this->render_page('invoice_list', $data); } else { return redirect()->to('login'); } } public function offline_invoice() { helper('session'); if (is_session_active()) { $session_role = get_user_role(); $session_bid = get_business_id(); if (!empty($session_role) && $session_role !== "sadmin") { $this->logger->info("Invoice: Listing In Admin BID = " . $session_bid); $where = ['I.business_id' => (int)$session_bid, 'I.isactive' => 1, 'I.invoice_type' => 1]; } else { $this->logger->info("Invoice: Listing In the Super-Admin "); $where = ['I.business_id != ' => NULL, 'I.isactive != ' => NULL, 'I.invoice_type' => 1]; } $model = new InvoiceModel(); $data['page_name'] = 'Offline Invoice Details'; $data['invoice'] = $model->getJoinedData($where, ['I.invoice_date', 'DESC']); $this->logger->info("Invoice: Listing Count ." . count($data['invoice'])); $this->render_page('offline_invoice_list', $data); } else { return redirect()->to('login'); } } ## To Load Invoice ADD/EDIT page... public function new_book_invoice($id = '0') { helper('session'); helper('financial_year_helper'); $model = new InvoiceModel(); $where = ['business_id' => (int)get_business_id(),'isactive' =>1]; // Get customer names for the dropdown, events details, and books details $data['customers'] = $model->getData('customers', $where); $data['events'] = $model->getData('events', $where); $data['financial_year'] = get_financial_year(); $data['invoice_number_formatting'] = $model->getData('invoice_number_formatting', $where); $data['books'] = $model->getCategoryBooks(1); // Invocie type = 2 (invoice) $data['customers'] = array_reverse($data['customers']); if ($id === '0') { $this->logger->info("Book Invoice: In Add Details"); $data['page_name'] = 'Add Book Invoice Details'; $data['invoice_type'] = '1'; $data['invoice_details'] = []; $data['invoice_item_details'] = []; } elseif ($id !== '0') { $this->logger->info("Book Invoice: In Edit Details ID =" . $id); $data['page_name'] = 'Edit Book Invoice Details'; $data['invoice_type'] = '1'; $data['invoice_details'] = $model->where(['invoice_id' => $id, 'isactive' => 1])->first(); $select = ["customer_address_id", "CONCAT(address_1,' ',address_2) as address"]; $where = ['address_type' => 2, 'customer_addresses.isactive' => 1, 'customer_addresses.customer_id' => (int)$data['invoice_details']['customer_id']]; $data['customer_shipping_arr'] = $this->get_customer_address($where, $select); $data['invoice_item_details'] = $this->get_invoice_item($id); } $country = new Customer(); $data['country_details'] = $country->get_country_details(); // print_r($data['invoice_details']);die; $this->render_page('invoice_form', $data); } public function new_subscription_invoice($id = '0') { helper('session'); helper('financial_year_helper'); $data['financial_year'] = get_financial_year(); $model = new InvoiceModel(); $where = ['business_id' => (int)get_business_id()]; // Get customer names for the dropdown, events details, and subscription books details $data['customers'] = $model->getData('customers', $where); $data['events'] = $model->getData('events', array_merge($where, ['isactive' => 1])); $data['books'] = $model->getCategoryBooks(2); // Invocie type = 2 (subscription) $data['invoice_number_formatting'] = $model->getData('invoice_number_formatting', $where); $data['customers'] = array_reverse($data['customers']); if ($id === '0') { $this->logger->info("Subscription Invoice: In Add Page"); $data['page_name'] = 'Add Subscription Invoice Details'; $data['invoice_type'] = '2'; $data['invoice_details'] = []; $data['invoice_item_details'] = []; } elseif ($id !== '0') { $this->logger->info("Subscription Invoice: In Edit Page ID =" . $id); $data['page_name'] = 'Edit Subscription Invoice Details'; $data['invoice_type'] = '2'; $data['invoice_details'] = $model->where(['invoice_id' => $id, 'isactive' => 1])->first(); $select = ["customer_address_id", "CONCAT(address_1,' ',address_2) as address"]; $where = ['address_type' => 2, 'customer_addresses.isactive' => 1, 'customer_addresses.customer_id' => (int)$data['invoice_details']['customer_id']]; $data['customer_shipping_arr'] = $this->get_customer_address($where, $select); $data['invoice_item_details'] = $this->get_invoice_item($id); } $this->render_page('invoice_form', $data); } ## For Ajax Call To Fetch/Retrive Membership Details Only Based On Customer... public function get_customer_membership_details() { $customer_id = $this->request->getPost('customer_id'); $data['customer_membership'] = $this->get_customer_membership("membership", (int)$customer_id); $bookModel = new BooksModel(); $book_id = env('RENEWAL_SCHEME_ID'); $scheme = $bookModel->select('book_id,short_code,price')->where('book_id',$book_id)->where('isactive',1)->first(); $data['scheme'] = $scheme; return $this->response->setJSON(['data' => $data]); } ## For Ajax Call To Fetch/Retrive Billing Address Details Only Based On Customer... public function get_customer_billing_details() { $id = $this->request->getPost('customer_id'); $where = ['customer_addresses.isactive' => 1, 'customer_addresses.customer_id' => (int)$id]; $where['address_type'] = 1; $data['customer_billing'] = $this->get_customer_address($where, []); $select = ["customer_address_id", "CONCAT(address_1,' ',address_2) as address","first_name"]; $where['address_type'] = 2; $data['customer_shipping'] = $this->get_customer_address($where, $select); return $this->response->setJSON(['data' => $data]); } ## For Ajax Call To Fetch/Retrive Shipping Address Details Only Based On Customer... public function get_customer_shipping_details() { $customer_id = $this->request->getPost('customer_id'); $address_id = $this->request->getPost('shipping_address_id'); $where = ['customer_addresses.isactive' => 1, 'customer_addresses.customer_id' => (int)$customer_id, 'address_type' => 2, 'customer_address_id' => (int)$address_id]; $data['customer_shipping'] = $this->get_customer_address($where, []); return $this->response->setJSON(['data' => $data]); } ## For Gethering Address Details... public function get_customer_address($where, $select) { $model = new CustomerModel(); $model->setTable('customer_addresses'); if (empty($select)) { $select = ["customer_addresses.customer_id", "customer_addresses.customer_address_id", "customer_addresses.first_name", "customer_addresses.last_name ", "customer_addresses.company", "customer_addresses.email", "customer_addresses.mobile_no", "customer_addresses.address_type", "customer_addresses.address_1", "customer_addresses.address_2", "customer_addresses.city", "customer_addresses.state", "customer_addresses.postal_code", "customer_addresses.country", "states.state_name", "countries.country_name"]; } $address_details = $model->select($select)->join('states', 'states.state_short_name = customer_addresses.state AND customer_addresses.country = "IN"', 'left')->join('countries', 'countries.country_short_name = customer_addresses.country', 'left')->where($where)->findAll(); return $address_details; } public function get_customer_membership($category, $id) { $model = new InvoiceModel(); $result = $model->getMembershipListForCustomer($category, $id); return $result; } ## To insert or update the details of the invoice // public function save_invoice() // { // // echo "
";
    //     // print_r($this->request->getPost());die;
    //     $this->logger->info("Invoice: Insert/Update Details");
    //     try {

    //         ## Declarions
    //         helper('session');
    //         helper('financial_year_helper');

    //         $model = new InvoiceModel();
    //         $duedate = $this->request->getVar('due_date');
    //         $invdate = $this->request->getVar('invoice_date');
    //         $invoice_status = $this->request->getPost('status');
    //         $invoice_id = (!empty($this->request->getPost('invoice_id'))) ? $this->request->getPost('invoice_id') : "";
    //         $customer_id = (int)$this->request->getPost('customer_name');
    //         $invoiceType = $this->request->getPost('invoice_type');
    //         $msg_flag_name = ((int)$invoiceType === 1)  ? "Invoice " : "Subscription ";
    //         $renewal = 0;
    //         if ((int)$invoiceType === 2 && $invoice_status == 'Approved') {
    //             $requestData = $this->request->getPost();
    //             $itemid = $requestData['invoice_child_id'];
    //             $count = count($itemid);
    //             $scheme_id = null;
    //             if ($count > 0) {
    //                 for ($x = 0; $x < $count; $x++) {
    //                     if (!empty($requestData['item_details'][$x])) {
    //                         $scheme_id = (int)$requestData['item_details'][$x];
    //                     }
    //                 }
    //             }
    //             // $now = date('Y-m-d');
    //             // $get_exists_subscription_where = ['S.customer_id' => (int)$customer_id,'S.scheme_id' => $scheme_id,'I.status' => 'Approved','I.isactive' => 1,"S.to_subscription <= "=>$now];
    //             $get_exists_subscription_where = ['S.customer_id' => (int)$customer_id, 'S.scheme_id' => $scheme_id, 'I.status' => 'Approved', 'I.isactive' => 1];
    //             $get_exists_subscription_dtls = $model->existsSubscriptionDetails($get_exists_subscription_where);

    //             if ($get_exists_subscription_dtls) {
    //                 // session()->setFlashdata('success', 'This Scheme Already Existing in this Customer.');
    //                 $this->logger->info($msg_flag_name . ": This Scheme Already Existing in this Customer. ");
    //                 $renewal = 1;
    //             }
    //         }
    //         $invdate_dbformat = (!empty($invdate)) ? \DateTime::createFromFormat('d/m/Y', $invdate)->format('Y-m-d') : NULL;
    //         $duedate_dbformat = (!empty($duedate)) ? \DateTime::createFromFormat('d/m/Y', $duedate)->format('Y-m-d') : NULL;
    //         ## Array Formation For Invoice Details.. 
    //         $data = [
    //             'invoice_number' => $this->request->getPost('invoice_number'),
    //             'invoice_type' => $this->request->getPost('invoice_type'),
    //             'customer_id' => $customer_id,
    //             'billing_address_id' => (int)$this->request->getPost('billing_address_id'),
    //             'billing_address' => $this->request->getPost('billing_address'),
    //             'shipping_address_id' => (int)$this->request->getPost('shipping_address_id'),
    //             'shipping_address' => $this->request->getPost('shipping_address'),
    //             'notes' => $this->request->getPost('notes'),
    //             'invoice_date' => $invdate_dbformat,
    //             'due_date' => $duedate_dbformat,
    //             'subtotal' => (float)$this->request->getPost('sub_total'),
    //             'tax' => (float)$this->request->getPost('invoice_tax'),
    //             'dis_type' => $this->request->getPost('dis_type'),
    //             'discount' => (float)$this->request->getPost('discount'),
    //             'exact_total_amount' => (float)$this->request->getPost('exact_total_amount'),
    //             'total_amount' => (int)$this->request->getPost('grand_total'),
    //             'shipping_charge' => ((int)$invoiceType === 1)  ? (float)$this->request->getPost('shippingCharges') : NULL,
    //             'shipping_label' => ((int)$invoiceType === 1)  ? $this->request->getPost('shippingChargesLabel') : NULL,
    //             'order_number' => $this->request->getPost('order_number'),
    //             'payment_method' => $invoice_status !== 'Draft' ? $this->request->getPost('payment_method') : NULL, // "Credit Card," "Cash on Delivery," "PayPal","PayTm","Gpay"
    //             'payment_status' => 'Pending', //"Paid," "Pending," "Failed," "Refunded," "Canceled," "Authorized," and "Completed."
    //             'payment_note' => $this->request->getPost('payment_note'),
    //             'event_id' => (int)$this->request->getPost('event_id'),
    //             'business_id' => (int)get_business_id(),
    //             'status' => $invoice_status,
    //             'isactive' => 1,
    //         ];

    //         ## Based on the invoice ID, we designated Insert or Update on Details...
    //         if (empty($invoice_id)) {
    //             $data['created_by'] = (int)get_logged_user_id();
    //             if ($model->insert($data, 'invoices')) {
    //                 $invoice_id = $model->insertID();
    //                 session()->setFlashdata('success', $msg_flag_name . 'has been added successfully.');
    //                 $this->logger->info($msg_flag_name . ": has been added successfully. Inserted ID = " . $invoice_id);
    //                 // If it's a subscription invoice, also store data in the 'subscription' table

    //             } else {
    //                 session()->setFlashdata('error', $msg_flag_name . 'could not be added. Please try again.');
    //                 $this->logger->error($msg_flag_name . ": Err Occur could not be added. Please try again.");
    //             }
    //         } else {
    //             $data['updated_by'] = (int)get_logged_user_id();
    //             if ($model->update($invoice_id, $data)) {
    //                 // echo $model->getLastQuery();die;
    //                 session()->setFlashdata('success', $msg_flag_name . 'has been updated successfully.');
    //                 $this->logger->info($msg_flag_name . ": has been updated successfully. Updated ID = " . $invoice_id);
    //             } else {
    //                 session()->setFlashdata('error', $msg_flag_name . 'update failed. Please try again.');
    //                 $this->logger->error($msg_flag_name . ": Err Failed to update ID =" . $invoice_id);
    //             }
    //         }

    //         $requestData = $this->request->getPost();

    //         if ($this->request->getPost('next_id')) {
    //             ## Array Formation For Invoice Numbering Format Details.. 
    //             $update_invoice_numbering = [
    //                 'id' => 1,
    //                 'id_formating' => get_financial_year(),
    //                 'next_id' => (int)$this->request->getPost('next_id'),
    //                 'business_id' => (int)get_business_id(),
    //                 'updated_by' => get_logged_user_id()
    //             ];
    //             $this->update_number_formatting($update_invoice_numbering);
    //         }

    //         ## For Invoice Item Details Insert/Update.. 
    //         $this->save_invoice_item($invoice_id, $requestData, (int)$this->request->getVar('product'));

    //         ## Subscription.. 
    //         if ((int)$invoiceType === 2) {

    //             // Loop through invoice items and store them in the 'subscription' table
    //             $subscriptionModel = new InvoiceModel(); // Replace with your actual model
    //             $invoiceItems = $this->get_invoice_item($invoice_id);
    //             foreach ($invoiceItems as $item) {

    //                 $product_id = $item['product'];
    //                 $from_sub_date = $item['from_subscription'];
    //                 $to_sub_date = $item['to_subscription'];


    //                 $subscription_data = [
    //                     'customer_id' => (int)$customer_id,
    //                     'invoice_id' => $invoice_id,
    //                     'scheme_id' => $product_id,
    //                     'from_subscription' => $from_sub_date,
    //                     'to_subscription' => $to_sub_date,
    //                     'business_id' => get_business_id(),
    //                     'created_by' => get_logged_user_id(),
    //                     'is_renew' => $renewal
    //                 ];
    //                 if ($invoice_status == 'Draft') {
    //                     $get_subscription_draft_dtl_where = ['S.customer_id' => $customer_id, 'I.status' => $invoice_status];
    //                     // $get_subscription_draft_dtl_id = $model->InactiveSubscriptionDraftDetails($get_subscription_draft_dtl_where,get_logged_user_id()); 
    //                     // $this->logger->info($msg_flag_name.": has been Inactived. Inv ID = ".implode(", ", $get_subscription_draft_dtl_id));      
    //                     $get_subscription_draft_dtl_id = $model->deleteSubscriptionDraftDetails($get_subscription_draft_dtl_where, get_logged_user_id());
    //                     $this->logger->info($msg_flag_name . ": has been Deleted. Inv ID = " . implode(", ", $get_subscription_draft_dtl_id));
    //                     // $subscriptionModel->insertSubscriptionData($subscription_data);
    //                 } else {
    //                     // Check if there is a draft entry for the customer_id and scheme_id
    //                     $get_subscription_draft_dtl_where = [
    //                         'S.customer_id' => $customer_id,
    //                         'S.scheme_id' => $scheme_id, // Assuming scheme_id is available here
    //                         'I.status' => 'Draft'
    //                     ];

    //                     $get_subscription_draft_dtl_id = $model->deleteSubscriptionDraftDetails($get_subscription_draft_dtl_where, get_logged_user_id());

    //                     $this->logger->info($msg_flag_name . ": Draft entry has been deleted. Inv ID = " . implode(", ", $get_subscription_draft_dtl_id));

    //                     // Now insert the new entry

    //                 }
    //             }
    //             $subscriptionModel->insertSubscriptionData($subscription_data);
    //         }


    //         ## Notification For Approve.. 
    //         $this->logger->info($msg_flag_name . ": ID = " . $invoice_id . ", Status =" . $invoice_status);
    //         if ($invoice_status == 'Approved' && $invoice_id != "") {
    //             $this->logger->info($msg_flag_name . ": in " . $invoice_status . ". ID = " . $invoice_id);
    //             $this->approve_notifications((int)$invoice_id);
    //         }
    //     } catch (\Exception $e) {
    //         $this->logger->error($msg_flag_name . ": Err Occur =" . $e->getMessage());
    //         session()->setFlashdata('error', 'Message: ' . $e->getMessage());
    //     }


    //     if ($invoiceType === '2') {
    //         $this->logger->info(session()->getFlashdata());
    //         // If the invoice_type is 2 (subscription invoice), redirect to the subscription list.
    //         return redirect()->route('subscribers_list'); // Adjust the route name as needed.
    //     } else {
    //         // For other invoice types, redirect to the invoice list.
    //         $this->logger->info(session()->getFlashdata());
    //         return redirect()->route('offline_invoice'); // Adjust the route name as needed.
    //     }
    // }
    public function save_invoice()
{
    helper('session');
    helper('financial_year_helper');
    $this->logger->info("Invoice: Insert/Update Details");
    try {
        // Retrieve form data
        $invoice_status = $this->request->getPost('status');
        $invoice_id = (!empty($this->request->getPost('invoice_id'))) ? $this->request->getPost('invoice_id') : "";
        $invoiceType = $this->request->getPost('invoice_type');
        $msg_flag_name = ((int)$invoiceType === 1) ? "Invoice " : "Subscription ";

        // Handle invoice creation or update
        $invoice_id = $this->create_or_update_invoice($invoice_id, $msg_flag_name);
        // Handle invoice items creation or update
        $this->create_or_update_invoice_items($invoice_id);
        $update_invoice_numbering = [
                            'id' => 1,
                            'id_formating' => get_financial_year(),
                            'next_id' => (int)$this->request->getPost('next_id'),
                            'business_id' => (int)get_business_id(),
                            'updated_by' => get_logged_user_id()
        ];
        $this->update_number_formatting($update_invoice_numbering);


        // Handle subscription if invoice type is subscription
        if ((int)$invoiceType === 2) {
            $membership = (!empty($this->request->getPost('membership_id'))) ? $this->request->getPost('membership_id') : "";
            $membership_id = substr($membership,0,6);
            log_message('error','Membership id : '.$membership != null && $membership != ''? $membership : "");
            $this->create_or_update_subscription($invoice_id,$invoice_status, $msg_flag_name,$membership_id);
        }

        // Send notification if invoice is approved
        $this->logger->info($msg_flag_name . ": ID = " . $invoice_id . ", Status =" . $invoice_status);
        if ($invoice_status == 'Approved' && $invoice_id != "") {
            log_message('info', '[PAYMENT] Approved ' . trim($msg_flag_name) . ' saved with payment — invoice ID ' . $invoice_id);
            
            if(null!=($this->request->getPost('contact_method_mail'))){
                $contact_method['msg_mail'] = 1;
            }
            if(null!=($this->request->getPost('contact_method_whatsapp'))){
                $contact_method['msg_whatsapp'] = 1;
            }
            $this->logger->info($msg_flag_name . ": in " . $invoice_status . ". ID = " . $invoice_id);
            $this->approve_notifications((int)$invoice_id,isset($contact_method)?$contact_method:null);
        }

        // Redirect to the appropriate route based on the invoice type
        if ($invoiceType === '2') {
            return redirect()->route('subscribers_list');
        } else {
            return redirect()->route('offline_invoice');
        }

    } catch (\Exception $e) {
        $this->logger->error("Error Occurred: " . $e->getMessage());
        log_message('error', '[PAYMENT] Invoice save failed: ' . $e->getMessage());
        session()->setFlashdata('error', 'Message: ' . $e->getMessage());
    }
}
public function create_or_update_invoice($invoice_id, $msg_flag_name)
{
    $model = new InvoiceModel();
    $invoice_status = $this->request->getPost('status');
    $customer_id = (int)$this->request->getPost('customer_name');
    $invoiceType = $this->request->getPost('invoice_type');
    // Prepare invoice data
    $data = $this->prepare_invoice_data($invoice_id, $msg_flag_name);
    // Insert or update invoice based on ID
    if (empty($invoice_id)) {
        $data['created_by'] = (int)get_logged_user_id();
        if ($model->insert($data, 'invoices')) {
            $invoice_id = $model->insertID();
            $this->logInvoicePayment('created', $data, (int) $invoice_id);
            if($data['status'] == 'Approved'){
                session()->setFlashdata('success', $msg_flag_name . 'has been added successfully.');
                $this->logger->info($msg_flag_name . ": Added successfully. ID = " . $invoice_id);
            }else{
                session()->setFlashdata('success',$msg_flag_name . 'has been added to draft successfully');
            }
            
        } else {
            session()->setFlashdata('error', $msg_flag_name . 'could not be added. Please try again.');
            $this->logger->error($msg_flag_name . ": Could not be added.");
        }
    } else {
        $data['updated_by'] = (int)get_logged_user_id();
        if ($model->update($invoice_id, $data)) {
            $this->logInvoicePayment('updated', $data, (int) $invoice_id);
            session()->setFlashdata('success', $msg_flag_name . 'has been updated successfully.');
            $this->logger->info($msg_flag_name . ": Updated successfully. ID = " . $invoice_id);
        } else {
            session()->setFlashdata('error', $msg_flag_name . 'update failed. Please try again.');
            $this->logger->error($msg_flag_name . ": Failed to update ID = " . $invoice_id);
        }
    }

    return $invoice_id;
}

public  function prepare_invoice_data($invoice_id, $msg_flag_name)
{

    $invdate = $this->request->getVar('invoice_date');
    $duedate = $this->request->getVar('due_date');
    $invoice_status = $this->request->getPost('status');
    $invoiceType = $this->request->getPost('invoice_type');

    // Convert dates to database format
    $invdate_dbformat = (!empty($invdate)) ? \DateTime::createFromFormat('d/m/Y', $invdate)->format('Y-m-d') : NULL;
    $duedate_dbformat = (!empty($duedate)) ? \DateTime::createFromFormat('d/m/Y', $duedate)->format('Y-m-d') : NULL;

    // Prepare invoice data array
    return [
        'invoice_number' => $this->request->getPost('invoice_number'),
        'invoice_type' => $invoiceType,
        'customer_id' => (int)$this->request->getPost('customer_name'),
        'billing_address_id' => (int)$this->request->getPost('billing_address_id'),
        'billing_address' => $this->request->getPost('billing_address'),
        'shipping_address_id' => (int)$this->request->getPost('shipping_address_id'),
        'shipping_address' => $this->request->getPost('shipping_address'),
        'notes' => $this->request->getPost('notes'),
        'invoice_date' => $invdate_dbformat,
        'due_date' => $duedate_dbformat,
        'subtotal' => (float)$this->request->getPost('sub_total'),
        'tax' => (float)$this->request->getPost('invoice_tax'),
        'dis_type' => $this->request->getPost('dis_type'),
        'discount' => (float)$this->request->getPost('discount'),
        'exact_total_amount' => (float)$this->request->getPost('exact_total_amount'),
        'total_amount' => (int)$this->request->getPost('grand_total'),
        'shipping_charge' => ((int)$invoiceType === 1) ? (float)$this->request->getPost('shippingCharges') : NULL,
        'shipping_label' => ((int)$invoiceType === 1) ? $this->request->getPost('shippingChargesLabel') : NULL,
        'order_number' => $this->request->getPost('order_number'),
        'payment_method' => $invoice_status !== 'Draft' ? $this->request->getPost('payment_method') : NULL, 
        'payment_status' => $invoice_status !== 'Draft'?'Paid':'Pending',
        'payment_note' => $this->request->getPost('payment_note'),
        'event_id' => (int)$this->request->getPost('event_id'),
        'business_id' => (int)get_business_id(),
        'status' => $invoice_status,
        'isactive' => 1,
    ];
}
public function create_or_update_invoice_items($invoice_id)
{
    $this->save_invoice_item($invoice_id, $this->request->getPost(), (int)$this->request->getVar('product'));
}

public function generate_membership_id($length = 6) {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    
    for ($i = 0; $i < $length; $i++) {
        $randomIndex = random_int(0, $charactersLength - 1);
        $randomString .= $characters[$randomIndex];
    }
    
    return $randomString;
}

public function create_or_update_subscription($invoice_id,$invoice_status, $msg_flag_name = null,$membership_id = null)
{
    $model = new InvoiceModel();
    $subModel = new SubscriptionModel();
    $customer_id = (int)$this->request->getPost('customer_name');
    $invoiceItems = $this->get_invoice_item($invoice_id);
    $renewal = 0;
    if (!empty($membership_id)){
        $sub_id = $subModel->select('sub_id')->where('membership_id',$membership_id)->first();
        $this->checkPaymentStatus($membership_id);
    }
    foreach ($invoiceItems as $item) {
        $product_id = $item['product'];
        $from_sub_date = $item['from_subscription'];
        $to_sub_date = $item['to_subscription'];
        //check if membership id is already set for the customer
        
       
            $membership_id = $this->generate_membership_id(6);
            // To check if the generated membership is already created for another customer
            $result = $subModel->where('membership_id',$membership_id)->findAll();
                if (count($result)>0){
                    $membership_id = $this->generate_membership_id(6);
                }
        

        // Prepare subscription data
        $subscription_data = [
            'customer_id' => $customer_id,
            'invoice_id' => $invoice_id,
            'scheme_id' => $product_id,
            'from_subscription' => $from_sub_date,
            'to_subscription' => $to_sub_date,
            'business_id' => get_business_id(),
            'created_by' => get_logged_user_id(),
            'updated_by' => get_logged_user_id(),
            'is_renew' => isset($sub_id)?$sub_id['sub_id']:$renewal,
            'membership_id'=>$membership_id,
            'status'    =>1,
            'isactive' =>$invoice_status === 'Approved' ? 1 :  0 
        ];
        
        $check_existing_customer_id = $subModel->where('invoice_id',$invoice_id)->findAll();
        //dd($check_existing_customer_id);
        // if($check_existing_customer_id){
        //     unset($data['created_by']);
        //     log_message('info',json_encode($subscription_data));
        //     $where = ['invoice_id'=>$invoice_id];
        //     $subModel->updateData($subscription_data,$where);//update the data
        // }
        // else{
        //     //insert the data
        //     unset($data['updated_by']);
            $model->insertupdateSubscriptionData($subscription_data,$invoice_status);
        // }
       
    }
}

    public function checkPaymentStatus($membership_id){
        try {
            $paymentRow = $this->paymentModel->where('membership_id', $membership_id)->where('payment_status','Not Received')->first();
            if ($paymentRow) {
                $this->paymentModel->update($paymentRow['id'], [
                    'status'         => 999999,
                    'payment_status' => 'Approved',
                    'updated_by'     => (int) get_logged_user_id(),
                ]);
                log_message('info', '[PAYMENT] Staff recorded offline renewal for membership ' . $membership_id . ' — linked Paytm order ' . ($paymentRow['order_id'] ?? '') . ' marked as Approved by user ' . get_logged_user_id());
            } else {
                log_message('debug', '[PAYMENT] No pending Paytm payment found to approve for membership ' . $membership_id);
            }
        } catch (\Exception $e) {
            log_message('warning', '[PAYMENT] Could not update payment status for membership ' . $membership_id . ': ' . $e->getMessage());
        }
    }

    private function logInvoicePayment(string $action, array $invoiceData, int $invoiceId): void
    {
        $type   = ((int) ($invoiceData['invoice_type'] ?? 0) === 2) ? 'Subscription' : 'Invoice';
        $status = $invoiceData['status'] ?? 'Unknown';
        $method = $invoiceData['payment_method'] ?? 'Not specified';
        $amount = $invoiceData['exact_total_amount'] ?? ($invoiceData['total_amount'] ?? 0);
        $number = $invoiceData['invoice_number'] ?? (string) $invoiceId;
        $customerId = $invoiceData['customer_id'] ?? '';

        if ($status === 'Draft') {
            log_message('info', '[PAYMENT] ' . $type . ' draft saved — invoice ' . $number . ', customer ' . $customerId . ', amount Rs.' . $amount . '. Payment not recorded yet.');
            return;
        }

        log_message('info', '[PAYMENT] ' . $type . ' ' . $action . ' — invoice ' . $number . ', customer ' . $customerId . ', amount Rs.' . $amount . ', method ' . $method . ', payment status ' . ($invoiceData['payment_status'] ?? ''));
    }
  

    ## For Updating Events Details .. 
    public function update_number_formatting($update_events)
    {
        // `id``event_name``business_id``updated_by``updated_on``next_id`
        $model = new InvoiceModel();
        $model->setTable('invoice_number_formatting');
        $where = ['isactive' => 1, 'id' => (int)$update_events['id'], 'business_id' => (int)$update_events['business_id'], 'next_id' => $update_events['next_id']];
        $details = $model->where($where)->findAll();
        if (empty($details)) {
            $update_where = ['id' => (int)$update_events['id'], 'business_id' => (int)$update_events['business_id']];
            $update_data = ['next_id' => $update_events['next_id'], 'updated_by' => $update_events['updated_by']];
            $model->updateData('invoice_number_formatting', $update_data, $update_where);
        }
        log_message('debug',"inside update_number_formatting");
    }

    ## To insert or update invoice item details based on invoice ID
    public function save_invoice_item($id, $requestData)
    {

        ## Get Invoice item details (to checking purpose exist or not based on invoice ID)
        $getInvoiceItemDetails = $this->get_invoice_item($id);

        ## Declaration
        $statement = "";
        $model = new InvoiceModel();
        $itemid = $requestData['invoice_child_id'];

        ## IF Any Missing value Means that values are Inactive here....
        if (!empty($itemid)) {
            $filteringInvoiceItemIds = [];
            for ($y = 0; $y < count($getInvoiceItemDetails); $y++) {
                $filteringInvoiceItemIds[$y] = $getInvoiceItemDetails[$y]['invoice_child_id'];
            }

            if (!empty($filteringInvoiceItemIds)) {
                $A = $filteringInvoiceItemIds;
                $B = $itemid;
                $missingValues = array_diff($A, $B);

                if (!empty($missingValues)) {
                    $where = ['isactive' => 1, 'invoice_id' => (int)$id];
                    // $model->inactiveMissingInvoiceItemDetails($where, $missingValues);
                    $model->deleteMissingInvoiceItemDetails($where, $missingValues);
                    $this->logger->info("Child Item Details : has been Deleted. Inv Child ID = " . implode(", ", $missingValues));
                }
            }
        }
        // echo "
...................."; //var_dump($itemid);die(); $count = count($itemid); log_message('info','the count is '.$count); log_message('debug','request data = '.json_encode($requestData)); $invoiceitem_arr = []; if ($count > 0) { for ($x = 0; $x < $count; $x++) { log_message('info','inside the for loop'); if (!empty($requestData['item_details'][$x])) { log_message('debug','inside 1'); $invoiceitem_arr[$x]['invoice_id'] = $id; $invoiceitem_arr[$x]['product'] = (int)$requestData['item_details'][$x]; $invoiceitem_arr[$x]['description'] = $requestData['description'][$x]; $invoiceitem_arr[$x]['quantity'] = (int)$requestData['quantity'][$x]; $invoiceitem_arr[$x]['tax'] = (float)$requestData['tax'][$x]; $invoiceitem_arr[$x]['unit_price'] = (float)$requestData['rate'][$x]; $invoiceitem_arr[$x]['subtotal'] = (float)$requestData['amount'][$x]; $invoiceitem_arr[$x]['discount_amount'] = (float)$requestData['discount_amount'][$x]; $invoiceitem_arr[$x]['discount_type'] = $requestData['discount_type'][$x]; if (!empty($requestData['from_subscription'])) { $invoiceitem_arr[0]['from_subscription'] = \DateTime::createFromFormat('d/m/Y', $requestData['from_subscription'])->format('Y-m-d'); } if (!empty($requestData['to_subscription'])) { $invoiceitem_arr[0]['to_subscription'] = \DateTime::createFromFormat('d/m/Y', $requestData['to_subscription'])->format('Y-m-d'); } $invoiceitem_arr[$x]['created_by'] = (int)get_logged_user_id(); $invoiceitem_arr[$x]['updated_by'] = (int)get_logged_user_id(); $invoiceitem_arr[$x]['isactive'] = 1; $invoiceitem_arr[$x]['invoice_child_id'] = $itemid[$x]; } else{ log_message('info','inside else'); } } log_message('info','this is inside the save_invoice_item'.json_encode($invoiceitem_arr)); $statement = $model->saveInvoiceItemDetails($invoiceitem_arr); } return $statement; } ## To Retrive Invoice item details based on invoice ID public function get_invoice_item($id) { $model = new InvoiceModel(); $model->setTable('invoiceitems'); $where = ['isactive' => 1, 'invoice_id' => $id]; $details = $model->where($where)->findAll(); return $details; } ## To Inactive Invoice details based on invoice ID Including Invoice Item Details also public function delete_invoice($id) { helper('session'); $session_uid = get_logged_user_id(); try { $model = new InvoiceModel(); $where = ['isactive' => 1, 'business_id' => (int)get_business_id(), 'invoice_id' => (int)$id]; $existed = $model->where($where)->findAll(); $this->logger->Info("Invoice : Going to Inactive ID = " . $id); if ($existed) { $invoiceRow = $model->select('invoice_number, payment_method, payment_status, total_amount') ->where('invoice_id', (int) $id)->first(); $data['isactive'] = 0; $data['updated_by'] = get_logged_user_id(); if ($model->update($id, $data)) { session()->setFlashdata('success', 'Deleted successfully.'); $this->logger->info("Invoice: has been Inactived successfully. Inactived ID = " . $id); if ($invoiceRow && ($invoiceRow['payment_status'] ?? '') === 'Paid') { log_message('warning', '[PAYMENT] Paid invoice ' . ($invoiceRow['invoice_number'] ?? '') . ' was deleted (ID ' . $id . '), method ' . ($invoiceRow['payment_method'] ?? '')); } } else { $this->logger->error("Invoice: Not able to Inactive ID =" . $id); throw new \Exception("Data Not able to Deleted"); } $getInvoiceItemDetails = $this->get_invoice_item($id); if ($getInvoiceItemDetails) { $update_where = ['invoice_id' => (int)$id]; $model->updateData('invoiceitems', $data, $update_where); } } else { $this->logger->error("Invoice: Does Not Exist To Inactive, ID = " . $id); throw new \Exception("Invoice Already Deleted"); } } catch (\Exception $e) { $this->logger->error("Invoice: Err Occur = " . $e->getMessage()); session()->setFlashdata('error', 'Message: ' . $e->getMessage()); } return redirect()->route('offline_invoice'); } ## To Approve Invoice details based on invoice ID public function approve_invoice($id) { try { if (!$id) { throw new \Exception("Invoice can't able to Approved. Because ID can't Found"); } $model = new InvoiceModel(); helper('session'); $where = ['isactive' => 1, 'status' => 'Approved', 'invoice_id' => (int)$id]; $details = $model->where($where)->findAll(); if (empty($details)) { // Array Empty Means allow to Approve. $invoiceRow = $model->select('invoice_number, customer_id, total_amount, exact_total_amount, payment_method, payment_status, invoice_type') ->where('invoice_id', (int) $id)->first(); $data = ['status' => 'Approved', 'updated_by' => get_logged_user_id()]; if ($model->update($id, $data)) { if ($invoiceRow) { $this->logInvoicePayment('approved', array_merge($invoiceRow, ['status' => 'Approved']), (int) $id); } $this->approve_notifications((int)$id); session()->setFlashdata('success', 'Invoice has been Approved Successfully.'); $this->logger->info("Invoice: has been Approved successfully. ID = " . $id); } else { $this->logger->error("Invoice: Does Not Exist To Approved"); throw new \Exception("Invoice can't Approved"); } } else { $this->logger->error("Invoice: already Approved ID = " . $id); throw new \Exception("Invoice already Approved"); } } catch (\Exception $e) { $this->logger->error("Invoice: Err Occur = " . $e->getMessage()); session()->setFlashdata('error', 'Message: ' . $e->getMessage()); } // Redirect back to the invoice list return redirect()->route('offline_invoice'); } public function subscription_inactive() { $model = new InvoiceModel(); $details = $model->subscription_inactive(); $now = date('d-m-Y'); if (strtolower(gettype($details)) == "string") { $this->logger->info("Subscription Inactive : " . $details); $result = $details; } else { $this->logger->info("Subscription Inactive : " . count($details) . " Subscription Records " . json_encode($details)); $success_rating = isset($details['success_rating']) ? $details['success_rating'] : 0; $error_rating = isset($details['error_rating']) ? $details['error_rating'] : 0; $result = "Total " . count($details) . " Subscription Records.\n success rating = " . $success_rating . "\n fail rating = " . $error_rating . "\n Note : Check Your Log File"; } return $now . " " . $result; } public function approve_notifications($invoice_id,$contact_method = null) { log_message('info',"Approve Notifications : ID " . $invoice_id); $model = new InvoiceModel(); $where = ['I.business_id' => (int)get_business_id(), 'I.invoice_id' => $invoice_id, 'I.isactive' => 1]; $details = $model->getDetailForApproveNotifications($where); $records = []; $reference_number = ""; $invoice_serial_number = ""; $recipient_name = ""; $approval_date = ""; $approved_by = ""; $recipient_email = ""; $recipient_mobile = ""; $subtotal = ""; $tax = ""; $total_amount = ""; $payment_method = ""; $business_name = ""; $business_address = ""; $business_city = ""; $business_state = ""; $business_postal_code = ""; $business_email = ""; $business_mobile_no = ""; if (isset($details)) { log_message('info',"Invoice: approve notification Request data type = " . gettype($details)); } helper('notification'); $notification = new NotificationHelper(); foreach ($details['invoice'] as $rec) { $reference_number = $rec['order_number']; $invoice_serial_number = $rec['invoice_number']; $recipient_name = $rec['customer_name']; $approval_date = $rec['status'] == 'Approved' && $rec['updated_by'] !== NULL ? $rec['updated_on_format'] : $rec['created_on_format']; $approved_by = $rec['status'] == 'Approved' && $rec['updated_by'] !== NULL ? $rec['updated_by_name'] : $rec['created_by_name']; $recipient_email = $rec['customer_email']; $recipient_mobile = $rec['customer_mobile']; $subtotal = $rec['subtotal']; $tax = $rec['tax']; $invoiceDate = $rec['invoice_date']; $total_amount = $rec['total_amount']; $payment_method = $rec['payment_method']; $business_name = $rec['business_name']; $business_address = $rec['business_address']; $business_city = $rec['business_city']; $business_state = $rec['business_state']; $business_postal_code = $rec['business_postal_code']; $business_email = $rec['business_email']; $business_mobile_no = $rec['business_mobile_no']; } if (!isset($recipient_email)){ log_message('error','Email Id not set for customer'); return; } $records['invoice_order_number'] = $reference_number; $records['invoice_serial_number'] = $invoice_serial_number; $records['recipient_name'] = $recipient_name; $records['recipient_email'] = $recipient_email ? $recipient_email : $business_email; $records['subtotal'] = $subtotal; $records['tax'] = $tax; $records['total_amount'] = $total_amount; $records['payment_method'] = $payment_method; $records['favicon'] = base_url("public/uploads/default.ico"); $records['browser_title'] = "bbb-bp | Approve Template"; $records['page_name'] = 'Approve Template'; // view('approve_template',$records); // $this->logger->info("Approve : Request data = ".json_encode($records)); // view('approve_template',$records); $records['template_name'] = 'approve_template'; $records['item'] = $details['item']; // print_r($records['item']);die; $lineitem_html = ""; foreach ($records['item'] as $inv) { // print_r($item->title);die; $lineitem_html .= '

' . $inv->title . ' x ' . $inv->quantity . ' => ' . $inv->subtotal . '

'; } // print_r($title);die; $records['subject'] = $invoice_serial_number . " - Invoice Notification"; $records['description'] = "

Company Logo

THANKS FOR YOUR ORDER!!

Invoice Number:#$invoice_serial_number

Total Amount:$total_amount

Download Invoice

Thank you for choosing us!

  • $business_name
  • $business_address $business_city $business_state - $business_postal_code
  • Call Us: +91 $business_mobile_no
  • Email Us: $business_email
"; // print_r($records['description']);die; $url = base_url("download_invoice_pdf/" . md5($invoice_id)); $encodedUrl = urlencode($url); if(isset($contact_method['msg_whatsapp'])){ $template = "Dear " . $recipient_name . ",\r\r\n\nYour Invoice has been generated.\n\nDetails:\r\n- Invoice Date: " . $invoiceDate . "\r\n- Invoice Number: " . $invoice_serial_number . "\r\n- Click here to download the Invoice: " . $url; $params = (object) Null; $params->number = (int)'91' . $recipient_mobile; $params->type = "text"; $params->message = $template; $params->instance_id = $_ENV['WAAI_INSTANCE']; $params->access_token = $_ENV['WAAI_TOKEN']; } $records['cc'] = getenv('BuisnessCCMail'); if(isset($contact_method['msg_mail'])){ log_message('info',"Approve notification Email Request data = " . json_encode($records)); $email_result = $notification->sendEmail($records); log_message('info',"Approve notification Email Response = " . json_encode($email_result)); } // $this->logger->info("Approve notification Whatsapp Request data = " . json_encode($params)); // $whatsapp_result = $notification->sendWhatsAppMessage(SEND_WAAI_URL, "POST", $params); // $this->logger->info("Approve notification Whatsapp Response = " . json_encode($whatsapp_result)); } ## To Generate Invoice PDF based on invoice ID public function generate_invoice_pdf($id) { $model = new InvoiceModel(); $data = $model->getInvoiceData($id); $invoiceItems = $model->getInvoiceItems($id, 'groupby'); foreach ($invoiceItems as $index => $singleItem) { $productImgs = $model->getProductImgs($singleItem->product); $invoiceItems[$index]->imgs = $productImgs; } $invoice_type = $data[0]->invoice_type; // Create an mPDF object ob_clean(); $mpdf = new Mpdf([ 'mode' => '', 'format' => [148, 210], // Set custom width and height in millimeters 'default_font_size' => 0, 'default_font' => '', 'margin_left' => 2, 'margin_right' => 2, 'margin_top' => 6, 'margin_bottom' => 6, 'margin_header' => 6, 'margin_footer' => -30, 'orientation' => 'P', ]); $mpdf->autoLangToFont = true; $mpdf->autoScriptToLang = true; // Set PDF properties $mpdf->SetTitle('Invoice'); $mpdf->SetAuthor($data[0]->company_name); $mpdf->SetCreator(''); $htmlFooter = '
'; $mpdf->setHTMLFooter($htmlFooter); // Generate the PDF content (HTML) if ($data[0]->status === 'Draft') { // Set the watermark text and options $mpdf->SetWatermarkText('Draft'); $mpdf->showWatermarkText = true; } if ($data[0]->status === 'Cancelled') { // Set the watermark text and options $mpdf->SetWatermarkText('Cancelled'); $mpdf->showWatermarkText = true; } if ($data[0]->status === 'Void') { // Set the watermark text and options $mpdf->SetWatermarkText('Void'); $mpdf->showWatermarkText = true; } $BusinessModel = new BusinessModel(); $business = $BusinessModel->where('business_id',$data[0]->business_id)->first(); // Generate the PDF content (HTML) with data $html = view('invoice_pdf_template', ['data' => $data, 'invoiceItems' => $invoiceItems,'business' => $business, 'invoice_type' => $invoice_type, 'invoiceTerms' => $data]); // echo $html;die; // Load HTML into the mPDF instance // print_r($html);die; $mpdf->WriteHTML($html); // Output the PDF to the browser for download // $mpdf->Output('invoice_' . date('Y-m-d H-i-s') . '.pdf', 'D'); //$mpdf->Output("invoice_" . $data[0]->invoice_number . '.pdf', 'D'); $filename = 'invoice_' . $data[0]->invoice_number.'.pdf'; // Filename based on invoice number // $mpdf->Output($filename . '.pdf', 'D'); // Generate and download the PDF with the specified filename $mpdf->Output($filename, 'D'); // Generate and download the PDF with the specified filename // header('Content-Type: application/pdf'); // header('Content-Disposition: inline; filename="invoice_' . $data[0]->invoice_number . '.pdf"'); // header('Content-Transfer-Encoding: binary'); // header('Accept-Ranges: bytes'); // header('Cache-Control: private'); // header('Pragma: private'); exit(); // Set headers to force download with the correct filename } public function generate_invoice_pdf_preview($id) { // Load required model $model = new InvoiceModel(); $BusinessModel = new BusinessModel(); $data = $model->getInvoiceData($id); $business = $BusinessModel->where('business_id',$data[0]->business_id)->first(); $invoiceItems = $model->getInvoiceItems($id, 'groupby'); foreach ($invoiceItems as $index => $singleItem) { $productImgs = $model->getProductImgs($singleItem->product); $invoiceItems[$index]->imgs = $productImgs; } $invoice_type = $data[0]->invoice_type; // Get status data $status = $data[0]->status; // Load view with data $html = view('invoice_pdf_template', ['data' => $data, 'invoiceItems' => $invoiceItems, 'invoice_type' => $invoice_type,'business' => $business, 'invoiceTerms' => $data, 'status' => $status]); // Return HTML content echo $html; } public function generate_invoice_print_preview($id) { // Load required model $model = new InvoiceModel(); $data = $model->getInvoiceData($id); $BusinessModel = new BusinessModel(); $business = $BusinessModel->where('business_id',$data[0]->business_id)->first(); // print_r($data);die; $invoiceItems = $model->getInvoiceItems($id, 'groupby'); foreach ($invoiceItems as $index => $singleItem) { $productImgs = $model->getProductImgs($singleItem->product); $invoiceItems[$index]->imgs = $productImgs; } $invoice_type = $data[0]->invoice_type; // Get status data $status = $data[0]->status; // Load view with data // $html = view('invoice_print_preview_template', ['data' => $data, 'invoiceItems' => $invoiceItems,'business'=>$business, 'invoice_type' => $invoice_type, 'invoiceTerms' => $data, 'status' => $status]); $html = view('invoice_pdf_template', ['data' => $data, 'invoiceItems' => $invoiceItems, 'invoice_type' => $invoice_type,'business' => $business, 'invoiceTerms' => $data, 'status' => $status]); // dd($html);die; // Return HTML content echo $html; } public function print_address($id) { // Fetch the invoice data based on $id $model = new InvoiceModel(); $invoiceData = $model->getInvoiceData($id); // print_r($invoiceData);die(); // Initialize an empty PDF with custom paper size (4x6 inches) $config = [ 'mode' => 'utf-8', 'format' => [101.6, 152.4], 'default_font_size' => 12, 'default_font' => 'Arial', 'margin_left' => 0, 'margin_right' => 0, 'margin_top' => 0, 'margin_bottom' => 0, 'margin_header' => 0, 'margin_footer' => 0, 'orientation' => 'P', // Portrait ]; $mpdf = new Mpdf($config); $mpdf->SetTitle('Customer Address'); $mpdf->SetAuthor($invoiceData[0]->company_name); $mpdf->SetCreator(''); // Generate the PDF content (HTML) with customer and address data $html = view('address_pdf_template', ['invoiceData' => $invoiceData]); // Load the mPDF library // Set PDF properties // Load HTML content into mPDF $mpdf->WriteHTML($html); // Output the PDF for download $pdfFileName = 'customer_address_' . date('Y-m-d H-i-s') . '.pdf'; $mpdf->Output($pdfFileName, 'D'); } public function print_address_landscape($id) { $model = new InvoiceModel(); $invoiceData = $model->getInvoiceData($id); // print_r($invoiceData);die(); $config = [ 'mode' => 'utf-8', 'format' => 'A5-L', // A5 landscape format 'default_font_size' => 12, 'default_font' => 'Arial', 'margin_left' => 10, 'margin_right' => 10, 'margin_top' => 10, 'margin_bottom' => 10, 'orientation' => 'L', // Landscape orientation ]; // $mpdf = new \Mpdf\Mpdf($config); $mpdf = new Mpdf($config); $mpdf->SetTitle('Customer Address'); $mpdf->SetAuthor($invoiceData[0]->company_name); // Generate the PDF content (HTML) with customer and address data $html = view('address_pdf_landscape_template', ['invoiceData' => $invoiceData]); // echo $html;die; $mpdf->WriteHTML($html); // $pdfFileName = 'customer_address_' . date('Y-m-d_H-i-s') . '.pdf'; $pdfFileName = $invoiceData[0]->invoice_number.'.pdf'; $mpdf->Output($pdfFileName, 'D'); } public function general_inv_rp() { $model = new InvoiceModel(); if ($this->request->is('get')) { $data['report_data'] = $model->get_general_invoice_data(); $data['selected_data'] = ""; } else { $dateParts = explode(' - ', $this->request->getVar('date')); $fromDate = $dateParts[0]; $toDate = $dateParts[1]; // Update date conversion format using the global namespace $fromDate = \DateTime::createFromFormat('d/m/Y', $dateParts[0])->format('Y-m-d'); $toDate = \DateTime::createFromFormat('d/m/Y', $dateParts[1])->format('Y-m-d'); // Debugging statements for date range // var_dump($fromDate, $toDate);die; $data['report_data'] = $model->get_general_invoice_data($fromDate, $toDate); $data['selected_data'] = ($this->request->getVar('date')) ? $this->request->getVar('date') : ''; // var_dump( $data['selected_data']);die; } // Debugging statement for report data // print_r($data['selected_data']);die; $data['page_name'] = 'Sales Report'; $this->render_page('report_general_invoice', $data); } public function general_membership_inv_rp() { if ($this->request->getmethod() == 'get') { $model = new InvoiceModel(); $data['report_data'] = $model->get_mem_invoice_data(); $this->logger->info("Membership Invoice Report "); $data['page_name'] = 'Membership Invoice Report'; $this->render_page('report_mem_invoice', $data); } else { $dateParts = explode(' - ', $this->request->getVar('date')); $fromDate = $dateParts[0]; $toDate = $dateParts[1]; $dateTime = \DateTime::createFromFormat('m/d/Y', $fromDate); $dateTime1 = \DateTime::createFromFormat('m/d/Y', $toDate); $model = new InvoiceModel(); $data['report_data'] = $model->get_mem_invoice_data($dateTime->format('Y-m-d'), $dateTime1->format('Y-m-d')); $this->logger->info("Membership Invoice Report "); $data['page_name'] = 'Membership Invoice Report'; $data['selected_data'] = $this->request->getVar('date'); $this->render_page('report_mem_invoice', $data); } } public function expired_customer_report() { $model = new InvoiceModel(); if ($this->request->getmethod() == 'get') { $data['expired_customers'] = $model->getExpiredCustomers(); $data['selected_data'] = ""; } else { $dateParts = explode(' - ', $this->request->getVar('date')); $dates = datePicker($dateParts); // $fromDate = $dateParts[0]; // $toDate = $dateParts[1]; // $dateTime = \DateTime::createFromFormat('d/m/Y', $fromDate); // $dateTime1 = \DateTime::createFromFormat('d/m/Y', $toDate); $model = new InvoiceModel(); $data['expired_customers'] = $model->getExpiredCustomers($dates['dateTime']->format('Y-m-d'), $dates['dateTime1']->format('Y-m-d')); $data['selected_data'] = $this->request->getVar('date'); $this->logger->info("Itemwise Report "); } if (empty($data['selected_data'])){ //dd($data['selected_data']); $data['page_name'] = 'Membership Renewal Report (30 days)'; }else{ list($fromDate, $toDate) = explode(" - ", $data['selected_data']); $data['page_name'] = 'Membership Renewal Report -
(From '.$fromDate.' To '.$toDate.')'; } $this->render_page('report_expired_customers', $data); } public function itemwise_report() { $model = new InvoiceModel(); if ($this->request->getmethod() == 'get') { $data['report_data'] = $model->itemwise_report_data(); $this->logger->info("Itemwise Report getMETHOD "); $data['selected_data'] = ""; } else { $value = $this->request->getPost('value'); if (isset($value)){ // Handle CSV export $this->exportCsv(); $this->logger->info("Itemwise Report CSV "); } else{ // Handle date range filter $this->logger->info("Itemwise Report getPOST "); $dateParts = explode(' - ', $this->request->getVar('date')); $dates = datePicker($dateParts); // $fromDate = $dateParts[0]; // $toDate = $dateParts[1]; // $dateTime = \DateTime::createFromFormat('d/m/Y', $fromDate); // $dateTime1 = \DateTime::createFromFormat('d/m/Y', $toDate); $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data($dates['dateTime']->format('Y-m-d'), $dates['dateTime1']->format('Y-m-d')); $data['selected_data'] = $this->request->getVar('date'); $this->logger->info('dsvawvsd'); $this->logger->info("Itemwise Report2 "); } } $data['page_name'] = 'Bookswise Report'; $this->render_page('report_itemwise', $data); } public function userwise_eventwise_report(){ $model = new InvoiceModel(); if ($this->request->getMethod() == 'get'){ $data['report_data'] = $model->userwise_eventwise_report(); $data['selected_data'] = ''; $this->logger->info("Inside GEt method"); } else{ $dateParts = explode(' - ', $this->request->getVar('date')); $dates = datePicker($dateParts); $model = new InvoiceModel(); $data['report_data'] = $model->userwise_eventwise_report($dates['dateTime']->format('Y-m-d'), $dates['dateTime1']->format('Y-m-d')); $data['selected_data'] = $this->request->getVar('date'); $this->logger->info('dsvawvsd'); $this->logger->info("Itemwise Report2 "); } $data['page_name'] = 'User and Event wise Report'; $this->render_page('report_userwise_and_eventwise',$data); } public function received_payments_report(){ $model = new InvoiceModel(); if ($this->request->getMethod() == 'get'){ $data['payment_data'] = $model->getPaymentReport(); $data['selected_data'] = ""; $this->logger->info("Inside the get method"); } else{ $dateParts = explode(' - ',$this->request->getVar(('date'))); $dates = datePicker($dateParts); // $fromDate = $dateParts[0]; // $toDate = $dateParts[1]; // $dateTime = \DateTime::createFromFormat('d/m/Y',$fromDate); // $dateTime1 = \DateTime::createFromFormat('d/m/Y',$toDate); $data['payment_data'] = $model->getPaymentReport($dates['dateTime']->format('Y-m-d'), $dates['dateTime1']->format('Y-m-d')); $data['selected_data'] = $this->request->getVar('date'); } $data['page_name'] = 'Received Payments Report'; // log_message('info',json_encode($data)); $this->render_page('received_payments_report',$data); } public function itemwise_report_with_payment_method(){ $model = new InvoiceModel(); if ($this->request->getMethod() == 'get'){ $data['report_data'] = $model->itemwise_report_data_with_payment_method(); $data['selected_data'] = ""; $this->logger->info("Inside the get method"); } else{ $dateParts = explode(' - ',$this->request->getVar(('date'))); $dates = datePicker($dateParts); // $fromDate = $dateParts[0]; // $toDate = $dateParts[1]; // $dateTime = \DateTime::createFromFormat('d/m/Y',$fromDate); // $dateTime1 = \DateTime::createFromFormat('d/m/Y',$toDate); $data['report_data'] = $model->itemwise_report_data_with_payment_method($dates['dateTime']->format('Y-m-d'), $dates['dateTime1']->format('Y-m-d')); $data['selected_data'] = $this->request->getVar('date'); } $data['page_name'] = 'Sales By Books'; // dd($data); $this->render_page('itemwise_report_with_payment_method',$data); } private function exportCsv() { $model = new InvoiceModel(); $reportData = $model->itemwise_report_data(); $csvFileName = 'itemwise_report.csv'; // Set appropriate headers for CSV download header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $csvFileName . '"'); header('Pragma: no-cache'); header('Expires: 0'); // Open a PHP output stream for writing CSV data $output = fopen('php://output', 'w'); // Add UTF-8 BOM to the CSV file fprintf($output, chr(0xEF) . chr(0xBB) . chr(0xBF)); // Write the CSV headers fputcsv($output, ['Publisher Code', 'Book Name', 'Item Count', 'Total Cost']); // Write the CSV data foreach ($reportData as $row) { foreach ($row->books as $book) { $rowData = [ $row->publisher_code, $book->book_name, $book->item_count, $book->total_cost, ]; // Convert each field to UTF-8 using iconv $rowData = array_map(function ($field) { return iconv('UTF-8', 'UTF-8//IGNORE', $field); }, $rowData); fputcsv($output, $rowData); } } // Close the PHP output stream fclose($output); // Terminate the script to prevent further output exit(); } private function calculateTotalBookQuantity(&$reportData) { // Calculate the total book quantity for each publisher foreach ($reportData as &$row) { $totalBookQuantity = array_sum(array_column($row->books, 'quantity')); $row->total_book_quantity = $totalBookQuantity; } } public function book_publishwise_Report() { if ($this->request->getmethod() == 'get') { $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data_with_publish_code(); $data['selected_data'] = ""; $this->logger->info("Itemwise Report "); $data['page_name'] = 'Books Published'; // print_r($data);die; $this->render_page('report_book_publish', $data); } else { $dateParts = explode(' - ', $this->request->getVar('date')); $fromDate = $dateParts[0]; $toDate = $dateParts[1]; $dateTime = \DateTime::createFromFormat('d/m/Y', $fromDate); $dateTime1 = \DateTime::createFromFormat('d/m/Y', $toDate); $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data_with_publish_code($dateTime->format('Y-m-d'), $dateTime1->format('Y-m-d')); $this->logger->info("Itemwise Report "); $data['page_name'] = 'Books Published'; $data['selected_data'] = $this->request->getVar('date'); $this->render_page('report_book_publish', $data); } } ## Child Function Called in approve_notifications public function download_invoice_pdf($md5Hash) { $model = new InvoiceModel(); $invoice_id = $model->getInvoiceIdByMd5($md5Hash); if ($invoice_id) { $this->generate_invoice_pdf($invoice_id); } else { echo "no code works"; } } public function saveBook() { // Retrieve book details from POST data $bookName = $this->request->getPost('bookName'); $publication_date = $this->request->getPost('publication_date'); $publication_code = $this->request->getPost('publishers_code'); $isbn_code = $this->request->getPost('isbn_code'); $bookPrice = $this->request->getPost('bookPrice'); $publisher_name = $this->request->getPost('publisher'); // Load the model $model = new BooksModel(); // Call the model function to save the book $bookId = $model->saveBook($bookName, $bookPrice, $isbn_code, $publication_date, $publication_code, $publisher_name); // Return a response (e.g., JSON response) $response = array(); if ($bookId) { $response['success'] = true; $response['message'] = 'Book Added Successfully'; $response['book_id'] = $bookId; // Include the book ID in the response $response['title'] = $bookName; // $response['tax'] = $bookId; $response['price'] = $bookPrice; } else { $response['success'] = false; $response['message'] = 'Failed to save book.'; } // Send JSON response return $this->response->setJSON($response); } // Your controller method to handle updating status and reason public function updateInvoiceStatus() { // Retrieve data from the request $invoiceId = $this->request->getPost('invoice_id'); $voidReason = $this->request->getPost('void_reason'); // Perform any validation if needed // Update the invoice status and void reason in the database $model = new InvoiceModel(); // Assuming you have a model named InvoiceModel $updated = $model->updateInvoiceStatus($invoiceId, $voidReason); // Prepare the response $response = []; if ($updated) { $response['success'] = true; $response['message'] = 'Invoice status updated successfully.'; } else { $response['success'] = false; $response['message'] = 'Failed to update invoice status.'; } if ($updated) { } // Return the response as JSON return $this->response->setJSON($response); } public function updateInvoiceCancelStatus() { // Retrieve data from the request $invoiceIds = $this->request->getPost('invoice_id'); $cancelReason = $this->request->getPost('cancel_reason'); // Perform any validation if needed // Update the invoice status and cancel reason in the database $model = new InvoiceModel(); // Assuming you have a model named InvoiceModel $updated = $model->updateInvoiceCancelStatus($invoiceIds, $cancelReason); // Prepare the response $response = []; if ($updated) { $response['success'] = true; $response['message'] = 'Invoice status updated successfully.'; // Redirect to the invoice_list page upon successful cancellation // return redirect()->to('invoice_list'); } else { $response['success'] = false; $response['message'] = 'Failed to update invoice status.'; } // Return the response as JSON return $this->response->setJSON($response); } ## update approval subscription details of the invoice public function update_approval_subscription() { $response = []; ## Declarions helper(['session', 'financial_year_helper']); try{ // Initialize models and variables $model = new InvoiceModel(); $invdate = $this->request->getVar('invoice_date'); $invoice_status = $this->request->getPost('status'); $invoice_id = $this->request->getPost('invoice_id'); $customer_id = (int)$this->request->getPost('customer_name'); $requestData = $this->request->getPost(); $invdate_dbformat = !empty($invdate) ? \DateTime::createFromFormat('d/m/Y', $invdate)->format('Y-m-d') : null; $invoice_data = [ 'invoice_number' => $requestData['invoice_number'], 'invoice_type' => $requestData['invoice_type'], 'customer_id' => $customer_id, 'billing_address_id' => (int)$requestData['billing_address_id'], 'billing_address' => $requestData['billing_address'], 'shipping_address_id' => (int)$requestData['shipping_address_id'], 'shipping_address' => $requestData['shipping_address'], 'notes' => $requestData['notes'], 'invoice_date' => $invdate_dbformat, 'subtotal' => (float)$requestData['sub_total'], 'tax' => (float)$requestData['invoice_tax'], 'dis_type' => isset($requestData['dis_type'])?$requestData['dis_type']:NULL, 'discount' => (float)$requestData['discount'], 'exact_total_amount' => (float)$requestData['exact_total_amount'], 'total_amount' => (int)$requestData['grand_total'], 'payment_note' => $requestData['payment_note'], 'event_id' => (int)$requestData['event_id'], 'business_id' => (int)get_business_id(), 'invoice_id' => $invoice_id, 'updated_by' => (int)get_logged_user_id() ]; $invoice_where = ['customer_id' => $customer_id, 'invoice_id' => $invoice_id]; $invoice_aff_row = $model->updateData('invoice', $invoice_data, $invoice_where); if ($invoice_aff_row) { $response['invoice']['message'] = 'Subscription Master (Invoice) Changes Updated successfully'; $this->logger->info("Update Approval Subscription Master (Invoice) has been updated successfully. Updated ID = " . $invoice_id); } else { $response['invoice']['message'] = 'Subscription Master (Invoice) There Is No Changes to Updated'; $this->logger->error("Update Approval Subscription Master (Invoice) Err Failed to update ID =" . $invoice_id); } ## Invoice Line Item.. $invoice_child_id = $requestData['invoice_child_id']; $count = count($invoice_child_id); if ($count > 0) { for ($x = 0; $x < $count; $x++) { if (!empty($requestData['item_details'][$x])) { $invoiceitem_arr[$x]['invoice_id'] = $invoice_id; $invoiceitem_arr[$x]['product'] = (int)$requestData['item_details'][$x]; $invoiceitem_arr[$x]['description'] = $requestData['description'][$x]; $invoiceitem_arr[$x]['quantity'] = (int)$requestData['quantity'][$x]; $invoiceitem_arr[$x]['tax'] = (float)$requestData['tax'][$x]; $invoiceitem_arr[$x]['unit_price'] = (float)$requestData['rate'][$x]; $invoiceitem_arr[$x]['subtotal'] = (float)$requestData['amount'][$x]; $invoiceitem_arr[$x]['discount_amount'] = (float)$requestData['discount_amount'][$x]; $invoiceitem_arr[$x]['discount_type'] = $requestData['discount_type'][$x]; if (!empty($requestData['from_subscription'])) { $invoiceitem_arr[0]['from_subscription'] = \DateTime::createFromFormat('d/m/Y', $requestData['from_subscription'])->format('Y-m-d'); } if (!empty($requestData['to_subscription'])) { $invoiceitem_arr[0]['to_subscription'] = \DateTime::createFromFormat('d/m/Y', $requestData['to_subscription'])->format('Y-m-d'); } $invoiceitem_arr[$x]['created_by'] = (int)get_logged_user_id(); $invoiceitem_arr[$x]['updated_by'] = (int)get_logged_user_id(); $invoiceitem_arr[$x]['invoice_child_id'] = $invoice_child_id[$x]; } } $statement = $model->saveInvoiceItemDetails($invoiceitem_arr); $response['item']['message'] = 'Subscription Item (Invoice Item)'.implode( ',' , $statement); $this->logger->error("Update Approval Subscription Child (1st Child) =" .implode( ',' , $statement)); ## Subscription.. for ($x = 0; $x < $count; $x++) { $product_id =(int)$requestData['item_details'][$x]; $from_sub_date = \DateTime::createFromFormat('d/m/Y', $requestData['from_subscription'])->format('Y-m-d'); $to_sub_date = \DateTime::createFromFormat('d/m/Y', $requestData['to_subscription'])->format('Y-m-d'); $subscription_data = [ 'customer_id' => $customer_id, 'invoice_id' => $invoice_id, 'scheme_id' => $product_id, 'from_subscription' => $from_sub_date, 'to_subscription' => $to_sub_date, 'business_id' => (int)get_business_id(), 'updated_by' => (int)get_logged_user_id() ]; $subscription_where = [ 'customer_id' => $customer_id, 'invoice_id' => $invoice_id, 'isactive' => 1 ]; } $subs_aff_row = $model->updateData('subscription', $subscription_data, $subscription_where); if ($subs_aff_row) { $response['subscription']['message'] = 'Subscription has been updated successfully.'; $this->logger->info("Subscription updated successfully. ID = $invoice_id"); } else { $response['subscription']['message'] = 'Subscription update failed. Please try again.'; $this->logger->error("Failed to update subscription. ID = $invoice_id"); } }else{ $response['item']['message'] = 'Subscription Item (Invoice Item) There Is No Changes to Updated'; $response['subscription']['message'] = 'Subscription There Is No Changes to Updated'; } $response['success'] = true; $response['message'] = "Successfully Updated"; } catch (\Exception $e) { $response['success'] = false; $response['message'] = 'Error: ' . $e->getMessage(); $this->logger->error("Error updating subscription: " . $e->getMessage()); } return $this->response->setJSON($response); } public function getActiveMembers(){ $Invoice_Model = new InvoiceModel(); $response['data'] = $Invoice_Model->getActiveMembers(); return $this->response->setJSON($response); } public function walkin_customer($id = '0'){ helper('session'); helper('financial_year_helper'); $model = new InvoiceModel(); $where = ['business_id' => (int)get_business_id()]; // Get customer names for the dropdown, events details, and books details $data['customers'] = $model->getData('customers', $where); $data['events'] = $model->getData('events', $where); $data['financial_year'] = get_financial_year(); $data['invoice_number_formatting'] = $model->getData('invoice_number_formatting', $where); $data['books'] = $model->getCategoryBooks(1); // Invocie type = 2 (invoice) if ($id === '0') { $this->logger->info("Book Invoice: In Add Details"); $data['page_name'] = 'Walkin Customers'; $data['invoice_type'] = '1'; $data['invoice_details'] = []; $data['invoice_item_details'] = []; } elseif ($id !== '0') { $data['page_name'] = 'Edit Walkin Customers'; $data['invoice_type'] = '1'; $data['invoice_details'] = $model->where(['invoice_id' => $id, 'isactive' => 1])->first(); $select = ["customer_address_id", "CONCAT(address_1,' ',address_2) as address"]; $where = ['address_type' => 2, 'customer_addresses.isactive' => 1, 'customer_addresses.customer_id' => (int)$data['invoice_details']['customer_id']]; $data['customer_shipping_arr'] = $this->get_customer_address($where, $select); $data['invoice_item_details'] = $this->get_invoice_item($id); } $country = new Customer(); $data['country_details'] = $country->get_country_details(); $this->render_page('invoice_form', $data); } }