Home > Enterprise >  CodeIgniter Datatables Server Side Date Range using Datepicker
CodeIgniter Datatables Server Side Date Range using Datepicker

Time:12-17

I am in desperate need of help. For a few weeks, I have tried all the codes possible from the internet to get the Datatables serverside date range using the date picker in Codeigniter but no luck. If the dates are the same then I can get the range but if the range is between the day/month/year day I get a range of all the months or years that the day as. Please advise. Below is my codes for Codeigniter View, Controller and Model:-

View Section

    var table = $('.xtable').DataTable( {
     scrollY:        "400px",
    scrollX:        true,
     scrollCollapse: true,
    autoWidth:      true,
    paging:         false,
   fixedHeader: true,
   processing : true,
   serverSide : true,
   responsive: true,
    stateSave : true,
    deferRender: true,
    ajax: {
   "url": "<?php echo base_url(); ?>getallbillinglist",
   "type": "POST",
   "data": function ( data ) {
      console.log(data);
     data.startdate = $('#startdate').val();//$.trim(fdate1[0]);
      data.enddate = $('#enddate').val();//$.trim(fdate1[1]);
     console.log(data.startdate);
     console.log(data.enddate);
      return data;
    }
     }, ... code continues if not too long
  
   $('#startdate').datepicker({
      autoclose: true
    })

 $('#enddate').datepicker({
  autoclose: true
 })
 $('#startdate, #enddate').change(function () {
    console.log(this.value);
    table.draw();
    //table.columns(12).search(this.value ? '^' this.value '$' : '', true, false).draw(); 
    document.getElementById("sdate").value = document.getElementById("startdate").value;
    document.getElementById("edate").value = document.getElementById("enddate").value;
 });
 
 

Controller Section

       public function getallbillinglist()
        {
        if (!$this->ion_auth->logged_in())
         {
            redirect('/');
        }
         $startdate = $this->input->post('startdate');
       $enddate = $this->input->post('enddate');
       $data['data']=$this->Job->get_allbillinglist($startdate,$enddate);
        echo json_encode($data);    
        }

Model Section

          function get_allbillinglist($startdate,$enddate)
{
    $data = array();
    $multipleWhere = ['invoices.Approved' => 1,'invoices.xero' => 0];
    $this->db->select('Client_Name, Invoice_No, Invoice_Date, Due_Date, Item_Descript, Quantity, UCost, Amt, TAmt, Tax, Total, AccCode, AccName, Ship_Name');
    $this->db->from("invoices");
    // $this->db->where('Approved',1);
    $this->db->where($multipleWhere);
    if($startdate!='' && $enddate!=''){
        //$this->db->where('invoices.Invoice_Date BETWEEN "'.$startdate.'" AND "'.$enddate.'"');
        $this->db->where('invoices.Invoice_Date >=', $startdate);
        $this->db->where('invoices.Invoice_Date <=', $enddate);
    }
    $this->db->get();  
    $query1 = $this->db->last_query();
    $multipleWhere1 = ['cninvoices.Approved' => 1, 'cninvoices.xero' => 0];
    $this->db->select('Client_Name, Credit_No, Credit_Date, "", Item_Descript, Quantity, UCost, TISubTotal, TIGST, Tax, TITotal, AccCode, AccName, Ship_Name');
    $this->db->from("cninvoices");
    // $this->db->where('Approved',1);
    $this->db->where($multipleWhere1);
    if($startdate!='' && $enddate!=''){
        // $this->db->where('cninvoices.Credit_Date BETWEEN "'.$startdate.'" AND "'.$enddate.'"');
        $this->db->where('cninvoices.Credit_Date >=', $startdate);
        $this->db->where('cninvoices.Credit_Date <=', $enddate);
    }
    $this->db->get(); 
    $query2 =  $this->db->last_query();
    $Q = $this->db->query($query1." UNION ".$query2." ORDER BY Invoice_No ASC");
    
    if ($Q->num_rows() > 0){
        foreach ($Q->result_array() as $row){
            $data[] = $row;
        }
    }
    $Q->free_result();
    return $data;
}

CodePudding user response:

Sounds like a problem with datepicker to me

Please change datepicker initializations like below

$('#startdate').datepicker({
  autoclose: true,
  format: 'dd.mm.yyyy'
});
$('#enddate').datepicker({
  autoclose: true,
  format: 'dd.mm.yyyy'
})

You can get values using jQuery like below

$('input[name=startdate]').val()
$('input[name=enddate]').val()

You can get POST values on the server side like below

$startdate = date('Y-m-d', strtotime($this->input->post('startdate')));

$enddate = date('Y-m-d', strtotime($this->input->post('enddate')));

If your DB is MSSQL, you can use those variables in your model query like below

$this->db->where('FORMAT(invoices.Invoice_Date, "yyyy-MM-dd") BETWEEN "'.$startdate.'" AND "'.$enddate.'"');

Please try and feedback

UPDATE

This might help you

FRONT END

HTML Markup

<input id="start_date" name="start_date" type="text"  placeholder="<?php echo START_DATE; ?>" autocomplete="off" />

<input id="start_date" name="start_date" type="text"  placeholder="<?php echo START_DATE; ?>" autocomplete="off" />

Datetimepicker Initialization

$('#start_date').datetimepicker({
  autoclose: true,
  format : 'dd.mm.yyyy',
  dateFormat: 'dd.mm.YYYY',
  todayHighlight: true,
  language: 'tr',
  startView:2,
  minView:2
});

$('#end_date').datetimepicker({
  autoclose: true,
  format : 'dd.mm.yyyy',
  dateFormat: 'dd.mm.YYYY',
  todayHighlight: true,
  language: 'tr',
  startView:2,
  minView:2
});

Reformatting Function

function reformatDateString(s) {
  var b = s.split(/\D/);
  return b.reverse().join('-');
}

Ajax Post Data

var data = {
  start_date: reformatDateString($('#start_date').val()),
  end_date: reformatDateString($('#end_date').val()),
  csrf_test_name: csrfTokenHash
};

BACKEND

Controller

public function featured_meetings_list_json() {
  $data = array(
    'company_uid' => $this->session->userdata('COMPANY_UID'),
    'start_date' => $this->input->post('start_date'),
    'end_date' => $this->input->post('end_date'),
  );
  $result['data'] = $this->reports_model->get_featured_meetings($data);
  
  echo json_encode($result);
}

Model

public function get_featured_meetings($data) {
  $dataArr = array(
    $data['company_uid']
  );

  $sql = "SELECT CONCAT(m.document_no, '-', md.no) price_offer_no, m.document_no, m.document_date, e.name enterprise_name, CONCAT(u.name, ' ', u.lastname) sales_representative_name, p.name product_name, "
            ."md.quantity, CASE WHEN p.product_class = 0 and p.color = 0 THEN p.price WHEN p.product_class = 0 AND p.color = 1 THEN p.price   0.50 WHEN p.product_class = 1 AND p.color = 0 THEN p.price   0.20 WHEN p.product_class = 1 AND p.color = 1 THEN p.price   0.70 WHEN p.product_class = 2 THEN p.price   1.20 END list_price, p.currency_name list_price_currency_name, md.price, v.name vat_name, CAST(ROUND(((md.quantity)*(md.price)*(100   v.rate)/100), 2) AS NUMERIC(36,2)) total_price, c.name currency_name, pt.name payment_type_name "
            ."FROM meetings m "
            ."LEFT JOIN meeting_details md ON(m.company_uid = md.company_uid AND m.uid = md.meeting_uid) "
            ."LEFT JOIN enterprises e ON (m.company_uid = e.company_uid AND m.enterprise_uid = e.uid) "
            ."LEFT JOIN (SELECT p.uid, p.company_uid, p.name, p.color, p.product_class, pc.price, pc.currency_uid, c.name currency_name, c.sign FROM products p LEFT JOIN product_categories pc ON (p.product_category_uid = pc.uid) LEFT JOIN currencies c ON (pc.currency_uid = c.uid)) AS p ON (md.company_uid = p.company_uid AND md.product_uid = p.uid) "
            ."LEFT JOIN users u ON (m.company_uid = u.company_uid AND m.sales_representative_uid = u.uid) "
            ."LEFT JOIN currencies c ON (md.currency_uid = c.uid) "
            ."LEFT JOIN vats v ON (md.vat_uid = v.uid) "
            ."LEFT JOIN payment_types pt ON (md.company_uid = pt.company_uid AND md.payment_type_uid = pt.uid) "
            ."WHERE m.company_uid = ?";

  if($data['start_date'] != '' && $data['end_date'] != '') {
    array_push($dataArr, $data['start_date']);
    array_push($dataArr, $data['end_date']);
    $sql .= " AND FORMAT(m.document_date, 'yyyy-MM-dd') between ? AND ?";
  }

  $sql .= " ORDER BY total_price DESC";
  //Here you can check your query and variables and run the query in console to catch potential issues, e.x. error_log(print_r($dataArr, true));error_log($sql);
  $query = $this->db->query($sql, $dataArr);
  return (array)$query->result_array();
}

CodePudding user response:

The problem is resolved. I had to change the column type in my MYSQL table in PHPMyAdmin from varchar to date in order to get the date range.

  • Related