Add Expenses support (#1235)

This commit is contained in:
FrancescoUK committed 2017-11-26 20:45:57 +00:00
1 parent b5b2d4f62f
commit 2cde603949
36 files changed
+1648 -70

No files matched your search

+1 -1
View File
@@ -132,4 +132,4 @@ $autoload['language'] = array();
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array('Appconfig', 'Person', 'Customer', 'Employee', 'Module', 'Item', 'Item_taxes', 'Sale', 'Supplier', 'Inventory', 'Receiving', 'Giftcard', 'Item_kit', 'Item_kit_items', 'Stock_location', 'Item_quantity', 'Dinner_table', 'Customer_rewards', 'Rewards', 'Tax');
$autoload['model'] = array('Appconfig', 'Person', 'Customer', 'Employee', 'Module', 'Item', 'Item_taxes', 'Sale', 'Supplier', 'Inventory', 'Receiving', 'Giftcard', 'Item_kit', 'Item_kit_items', 'Stock_location', 'Item_quantity', 'Dinner_table', 'Customer_rewards', 'Rewards', 'Tax', 'Expense_category', 'Expense' );
+1 -1
View File
@@ -69,7 +69,7 @@ $config['migration_auto_latest'] = FALSE;
| be upgraded / downgraded to.
|
*/
$config['migration_version'] = 20170924150000;
$config['migration_version'] = 20171126100000;
/*
|--------------------------------------------------------------------------
+8 -1
View File
@@ -53,13 +53,19 @@ defined('BASEPATH') OR exit('No direct script access allowed');
$route['default_controller'] = 'login';
$route['no_access/([^/]+)'] = 'no_access/index/$1';
$route['no_access/([^/]+)/([^/]+)'] = 'no_access/index/$1/$2';
$route['sales/index/([^/]+)'] = 'sales/manage/$1';
$route['sales/index/([^/]+)/([^/]+)'] = 'sales/manage/$1/$2';
$route['sales/index/([^/]+)/([^/]+)/([^/]+)'] = 'sales/manage/$1/$2/$3';
$route['reports/(summary_:any)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/summary_expenses_categories'] = 'reports/date_input_only';
$route['reports/summary_:any'] = 'reports/date_input';
$route['reports/(graphical_:any)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/graphical_summary_expenses_categories'] = 'reports/date_input_only';
$route['reports/graphical_:any'] = 'reports/date_input';
$route['reports/(inventory_:any)/([^/]+)'] = 'reports/$1/$2';
$route['reports/inventory_summary'] = 'reports/inventory_summary_input';
$route['reports/(inventory_summary)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2';
@@ -68,10 +74,11 @@ $route['reports/(detailed_sales)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3$/
$route['reports/detailed_sales'] = 'reports/date_input_sales';
$route['reports/(detailed_receivings)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/detailed_receivings'] = 'reports/date_input_recv';
$route['reports/(specific_:any)/([^/]+)/([^/]+)/([^/]+)'] = 'reports/$1/$2/$3/$4';
$route['reports/specific_customer'] = 'reports/specific_customer_input';
$route['reports/specific_employee'] = 'reports/specific_employee_input';
$route['reports/specific_discount'] = 'reports/specific_discount_input';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['translate_uri_dashes'] = FALSE;
+173
View File
@@ -0,0 +1,173 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Expenses extends Secure_Controller
{
public function __construct()
{
parent::__construct('expenses');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_expenses_manage_table_headers());
// filters that will be loaded in the multiselect dropdown
$data['filters'] = array('only_cash' => $this->lang->line('expenses_cash_filter'),
'only_due' => $this->lang->line('expenses_due_filter'),
'only_check' => $this->lang->line('expenses_check_filter'),
'only_credit' => $this->lang->line('expenses_credit_filter'),
'only_debit' => $this->lang->line('expenses_debit_filter'),
'is_deleted' => $this->lang->line('expenses_is_deleted'));
$this->load->view('expenses/manage', $data);
}
public function search()
{
$payments = 0;
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$filters = array(
'start_date' => $this->input->get('start_date'),
'end_date' => $this->input->get('end_date'),
'only_cash' => FALSE,
'only_due' => FALSE,
'only_check' => FALSE,
'only_credit' => FALSE,
'only_debit' => FALSE,
'is_deleted' => FALSE);
// check if any filter is set in the multiselect dropdown
$filledup = array_fill_keys($this->input->get('filters'), TRUE);
$filters = array_merge($filters, $filledup);
$expenses = $this->Expense->search($search, $filters, $limit, $offset, $sort, $order);
$total_rows = $this->Expense->get_found_rows($search, $filters);
$payments = $this->Expense->get_payments_summary($search, $filters);
$payment_summary = get_expenses_manage_payments_summary($payments, $expenses);
$data_rows = array();
foreach($expenses->result() as $expense)
{
$data_rows[] = $this->xss_clean(get_expenses_data_row($expense));
}
if($total_rows > 0)
{
$data_rows[] = $this->xss_clean(get_expenses_data_last_row($expenses));
}
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary));
}
public function view($expense_id = -1)
{
$data = array();
$data['employees'] = array();
foreach($this->Employee->get_all()->result() as $employee)
{
foreach(get_object_vars($employee) as $property => $value)
{
$employee->$property = $this->xss_clean($value);
}
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
}
$data['expenses_info'] = $this->Expense->get_info($expense_id);
$data['expense_categories'] = array();
foreach($this->Expense_category->get_all(0, 0, TRUE)->result_array() as $row)
{
$expense_categories[$row['expense_category_id']] = $row['category_name'];
}
$data['expense_categories'] = $expense_categories;
$expense_id = $data['expenses_info']->expense_id;
if(empty($expense_id))
{
$data['expenses_info']->date = date('Y-m-d H:i:s');
$data['expenses_info']->employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
}
$data['payments'] = array();
foreach($this->Expense->get_expense_payment($expense_id)->result() as $payment)
{
foreach(get_object_vars($payment) as $property => $value)
{
$payment->$property = $this->xss_clean($value);
}
$data['payments'][] = $payment;
}
// don't allow gift card to be a payment option in a sale transaction edit because it's a complex change
$data['payment_options'] = $this->xss_clean($this->Expense->get_payment_options(FALSE));
$this->load->view("expenses/form", $data);
}
public function get_row($row_id)
{
$expense_info = $this->Expense->get_info($row_id);
$data_row = $this->xss_clean(get_expenses_data_row($expense_info));
echo json_encode($data_row);
}
public function save($expense_id = -1)
{
$newdate = $this->input->post('date');
$date_formatter = date_create_from_format($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), $newdate);
$expense_data = array(
'date' => $date_formatter->format('Y-m-d H:i:s'),
'amount' => $this->input->post('amount'),
'payment_type' => $this->input->post('payment_type'),
'expense_category_id' => $this->input->post('expense_category_id'),
'description' => $this->input->post('description'),
'employee_id' => $this->input->post('employee_id'),
'deleted' => $this->input->post('deleted') != NULL
);
if($this->Expense->save($expense_data, $expense_id))
{
$expense_data = $this->xss_clean($expense_data);
//New expense_id
if($expense_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_successful_adding'), 'id' => $expense_data['expense_id']));
}
else // Existing Expense
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_successful_updating'), 'id' => $expense_id));
}
}
else//failure
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('expenses_error_adding_updating'), 'id' => -1));
}
}
public function delete()
{
$expenses_to_delete = $this->input->post('ids');
if($this->Expense->delete_list($expenses_to_delete))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_successful_deleted') . ' ' . count($expenses_to_delete) . ' ' . $this->lang->line('expenses_one_or_multiple'), 'ids' => $expenses_to_delete));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('expenses_cannot_be_deleted'), 'ids' => $expenses_to_delete));
}
}
}
?>
@@ -0,0 +1,97 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Secure_Controller.php");
class Expenses_categories extends Secure_Controller
{
public function __construct()
{
parent::__construct('expenses_categories');
}
public function index()
{
$data['table_headers'] = $this->xss_clean(get_expense_category_manage_table_headers());
$this->load->view('expenses_categories/manage', $data);
}
/*
Returns expense_category_manage table data rows. This will be called with AJAX.
*/
public function search()
{
$search = $this->input->get('search');
$limit = $this->input->get('limit');
$offset = $this->input->get('offset');
$sort = $this->input->get('sort');
$order = $this->input->get('order');
$expense_categories = $this->Expense_category->search($search, $limit, $offset, $sort, $order);
$total_rows = $this->Expense_category->get_found_rows($search);
$data_rows = array();
foreach($expense_categories->result() as $expense_category)
{
$data_rows[] = $this->xss_clean(get_expense_category_data_row($expense_category));
}
echo json_encode(array('total' => $total_rows, 'rows' => $data_rows));
}
public function get_row($row_id)
{
$data_row = $this->xss_clean(get_expense_category_data_row($this->Expense_category->get_info($row_id)));
echo json_encode($data_row);
}
public function view($expense_category_id = -1)
{
$data['category_info'] = $this->Expense_category->get_info($expense_category_id);
$this->load->view("expenses_categories/form", $data);
}
public function save($expense_category_id = -1)
{
$expense_category_data = array(
'category_name' => $this->input->post('category_name'),
'category_description' => $this->input->post('category_description')
);
if($this->Expense_category->save($expense_category_data, $expense_category_id))
{
$expense_category_data = $this->xss_clean($expense_category_data);
// New expense_category_id
if($expense_category_id == -1)
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_categories_successful_adding'), 'id' => $expense_category_data['expense_category_id']));
}
else // Existing Expense Category
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_categories_successful_updating'), 'id' => $expense_category_id));
}
}
else//failure
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('expenses_categories_error_adding_updating') . ' ' . $expense_category_data['category_name'], 'id' => -1));
}
}
public function delete()
{
$expense_category_to_delete = $this->input->post('ids');
if ($this->Expense_category->delete_list($expense_category_to_delete))
{
echo json_encode(array('success' => TRUE, 'message' => $this->lang->line('expenses_categories_successful_deleted') . ' ' . count($expense_category_to_delete) . ' ' . $this->lang->line('expenses_categories_one_or_multiple')));
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('expenses_categories_cannot_be_deleted')));
}
}
}
?>
+84 -10
View File
@@ -29,7 +29,7 @@ class Reports extends Secure_Controller
$this->load->helper('report');
}
//Initial report listing screen
//Initial Report listing screen
public function index()
{
$data['grants'] = $this->xss_clean($this->Employee->get_employee_grants($this->session->userdata('person_id')));
@@ -73,7 +73,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary categories report
//Summary Categories report
public function summary_categories($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -108,8 +108,40 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary Expenses by Categories report
public function summary_expenses_categories($start_date, $end_date, $sale_type)
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type);
//Summary customers report
$this->load->model('reports/Summary_expenses_categories');
$model = $this->Summary_expenses_categories;
$report_data = $model->getData($inputs);
$summary = $this->xss_clean($model->getSummaryData($inputs));
$tabular_data = array();
foreach($report_data as $row)
{
$tabular_data[] = $this->xss_clean(array(
'category_name' => $row['category_name'],
'count' => $row['count'],
'total_amount' => to_currency($row['total_amount'])
));
}
$data = array(
'title' => $this->lang->line('reports_expenses_categories_summary_report'),
'subtitle' => $this->_get_subtitle_report(array('start_date' => $start_date, 'end_date' => $end_date)),
'headers' => $this->xss_clean($model->getDataColumns()),
'data' => $tabular_data,
'summary_data' => $summary
);
$this->load->view('reports/tabular', $data);
}
//Summary Customers report
public function summary_customers($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -145,7 +177,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary suppliers report
//Summary Suppliers report
public function summary_suppliers($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -181,7 +213,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary items report
//Summary Items report
public function summary_items($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -217,7 +249,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary employees report
//Summary Employees report
public function summary_employees($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -253,7 +285,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary taxes report
//Summary Taxes report
public function summary_taxes($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -287,7 +319,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary discounts report
//Summary Discounts report
public function summary_discounts($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -318,7 +350,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular', $data);
}
//Summary payments report
//Summary Payments report
public function summary_payments($start_date, $end_date, $sale_type, $location_id = 'all')
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type, 'location_id' => $location_id);
@@ -363,6 +395,14 @@ class Reports extends Secure_Controller
$this->load->view('reports/date_input', $data);
}
//Input for reports that require only a date range. (see routes.php to see that all graphical summary reports route here)
public function date_input_only()
{
$data = array();
$this->load->view('reports/date_input', $data);
}
//Input for reports that require only a date range. (see routes.php to see that all graphical summary reports route here)
public function date_input_sales()
{
@@ -387,6 +427,40 @@ class Reports extends Secure_Controller
$this->load->view('reports/date_input', $data);
}
//Graphical Expenses by Categories report
public function graphical_summary_expenses_categories($start_date, $end_date, $sale_type)
{
$inputs = array('start_date' => $start_date, 'end_date' => $end_date, 'sale_type' => $sale_type);
$this->load->model('reports/Summary_expenses_categories');
$model = $this->Summary_expenses_categories;
$report_data = $model->getData($inputs);
$summary = $this->xss_clean($model->getSummaryData($inputs));
$labels = array();
$series = array();
foreach($report_data as $row)
{
$row = $this->xss_clean($row);
$labels[] = $row['category_name'];
$series[] = array('meta' => $row['category_name'] . ' ' . round($row['total_amount'] / $summary['expenses_total_amount'] * 100, 2) . '%', 'value' => $row['total_amount']);
}
$data = array(
'title' => $this->lang->line('reports_expenses_categories_summary_report'),
'subtitle' => $this->_get_subtitle_report(array('start_date' => $start_date, 'end_date' => $end_date)),
'chart_type' => 'reports/graphs/pie',
'labels_1' => $labels,
'series_data_1' => $series,
'summary_data_1' => $summary,
'show_currency' => TRUE
);
$this->load->view('reports/graphical', $data);
}
//Graphical summary sales report
public function graphical_summary_sales($start_date, $end_date, $sale_type, $location_id = 'all')
{
@@ -882,7 +956,7 @@ class Reports extends Secure_Controller
$data['specific_input_name'] = $this->lang->line('reports_discount');
$discounts = array();
for ($i = 0; $i <= 100; $i += 10)
for($i = 0; $i <= 100; $i += 10)
{
$discounts[$i] = $i . '%';
}
+2 -2
View File
@@ -580,8 +580,6 @@ class Sales extends Secure_Controller
$override_invoice_number = $candidate_invoice_number;
}
}
}
else
{
@@ -1174,7 +1172,9 @@ class Sales extends Secure_Controller
public function save($sale_id = -1)
{
$newdate = $this->input->post('date');
$date_formatter = date_create_from_format($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), $newdate);
$sale_data = array(
'sale_time' => $date_formatter->format('Y-m-d H:i:s'),
'customer_id' => $this->input->post('customer_id') != '' ? $this->input->post('customer_id') : NULL,
+111 -1
View File
@@ -20,7 +20,9 @@ function get_sales_manage_table_headers()
$headers[] = array('invoice' => '&nbsp', 'sortable' => FALSE);
}
return transform_headers(array_merge($headers, array(array('receipt' => '&nbsp', 'sortable' => FALSE))));
$headers[] = array('receipt' => '&nbsp', 'sortable' => FALSE);
return transform_headers($headers);
}
/*
@@ -450,4 +452,112 @@ function get_item_kit_data_row($item_kit)
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
function get_expense_category_manage_table_headers()
{
$CI =& get_instance();
$headers = array(
array('expense_category_id' => $CI->lang->line('expenses_categories_category_id')),
array('category_name' => $CI->lang->line('expenses_categories_name')),
array('category_description' => $CI->lang->line('expenses_categories_description'))
);
return transform_headers($headers);
}
/*
Gets the html data rows for the expenses categories.
*/
function get_expense_category_data_row($expense_category)
{
$CI =& get_instance();
$controller_name = strtolower(get_class($CI));
return array (
'expense_category_id' => $expense_category->expense_category_id,
'category_name' => $expense_category->category_name,
'category_description' => $expense_category->category_description,
'edit' => anchor($controller_name."/view/$expense_category->expense_category_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
function get_expenses_manage_table_headers()
{
$CI =& get_instance();
$headers = array(
array('expense_id' => $CI->lang->line('expenses_expense_id')),
array('date' => $CI->lang->line('expenses_date')),
array('amount' => $CI->lang->line('expenses_amount')),
array('payment_type' => $CI->lang->line('expenses_payment')),
array('category_name' => $CI->lang->line('expenses_categories_name')),
array('description' => $CI->lang->line('expenses_description')),
array('createdBy' => $CI->lang->line('expenses_employee'))
);
return transform_headers($headers);
}
/*
Gets the html data rows for the expenses.
*/
function get_expenses_data_row($expense)
{
$CI =& get_instance();
$controller_name = strtolower(get_class($CI));
return array (
'expense_id' => $expense->expense_id,
'date' => date($CI->config->item('dateformat') . ' ' . $CI->config->item('timeformat'), strtotime($expense->date)),
'amount' => to_currency($expense->amount),
'payment_type' => $expense->payment_type,
'category_name' => $expense->category_name,
'description' => $expense->description,
'createdBy' => $expense->first_name.' '. $expense->last_name,
'edit' => anchor($controller_name."/view/$expense->expense_id", '<span class="glyphicon glyphicon-edit"></span>',
array('class'=>'modal-dlg', 'data-btn-submit' => $CI->lang->line('common_submit'), 'title'=>$CI->lang->line($controller_name.'_update'))
));
}
function get_expenses_data_last_row($expense)
{
$CI =& get_instance();
$table_data_rows = '';
$sum_amount_expense = 0;
foreach($expense->result() as $key=>$expense)
{
$sum_amount_expense += $expense->amount;
}
return array(
'expense_id' => '-',
'date' => '<b>'.$CI->lang->line('sales_total').'</b>',
'amount' => '<b>'. to_currency($sum_amount_expense).'</b>'
);
}
/*
Get the expenses payments summary
*/
function get_expenses_manage_payments_summary($payments, $expenses)
{
$CI =& get_instance();
$table = '<div id="report_summary">';
foreach($payments as $key=>$payment)
{
$amount = $payment['amount'];
$table .= '<div class="summary_row">' . $payment['payment_type'] . ': ' . to_currency($amount) . '</div>';
}
$table .= '</div>';
return $table;
}
?>
@@ -0,0 +1,20 @@
<?php
$lang["expenses_categories_add_item"] = "Add Category";
$lang["expenses_categories_cannot_be_deleted"] = "Could not delete Category Expense(s)";
$lang["expenses_categories_confirm_delete"] = "Are you sure you want to delete the selected Expense Category?";
$lang["expenses_categories_description"] = "Category Description";
$lang["expenses_categories_error_adding_updating"] = "Error adding/updating Expense Category";
$lang["expenses_categories_info"] = "Category Expense Info";
$lang["expenses_categories_category_id"] = "Id";
$lang["expenses_categories_name"] = "Category Name";
$lang["expenses_categories_new"] = "New Category";
$lang["expenses_categories_no_expenses_categories_to_display"] = "No Category to display";
$lang["expenses_categories_none_selected"] = "You have not selected any Category Expense";
$lang["expenses_categories_one_or_multiple"] = "Category Expense";
$lang["expenses_categories_quantity"] = "Quantity";
$lang["expenses_categories_successful_adding"] = "Expense Category add successful";
$lang["expenses_categories_successful_deleted"] = "Expense Category delete successful";
$lang["expenses_categories_successful_updating"] = "Expense Category update successful";
$lang["expenses_categories_update"] = "Update Expense Category";
$lang["category_name_required"] = "Expense Category name required";
@@ -0,0 +1,42 @@
<?php
$lang["expenses_add_item"] = "Add Expense";
$lang["expenses_cannot_be_deleted"] = "Could not delete Category Expense(s)";
$lang["expenses_confirm_delete"] = "Are you sure you want to delete the selected Expense?";
$lang["expenses_description"] = "Description";
$lang["expenses_error_adding_updating"] = "Error adding/updating Expense";
$lang["expenses_info"] = "Expense Info";
$lang["expenses_expense_id"] = "Id";
$lang["expenses_expenses_employee"] = "Employee";
$lang["expenses_date"] = "Date";
$lang["expenses_amount"] = "Amount";
$lang["expenses_categories_name"] = "Category";
$lang["expenses_new"] = "New Expense";
$lang["expenses_no_expenses_to_display"] = "There are no Expenses to display";
$lang["expenses_none_selected"] = "You have not selected any Expense";
$lang["expenses_one_or_multiple"] = "Expense(s)";
$lang["expenses_successful_adding"] = "Expense add successful";
$lang["expenses_successful_deleted"] = "Expense delete successful";
$lang["expenses_successful_updating"] = "Expense update successful";
$lang["expenses_update"] = "Update Expense";
$lang["expenses_name_required"] = "Expense Name required";
$lang["expenses_amount_required"] = "Expense Amount required";
$lang["expenses_employee"] = "Created By";
$lang["expenses_amount_number"] = "Amount must be a number";
$lang["expenses_amount_required"] = "Amount is a required field";
$lang["expenses_date_number"] = "date must be a number";
$lang["expenses_date_required"] = "date is a required field";
$lang["expenses_category_required"] = "category is a required field";
$lang["expenses_by_category"] = "Category";
$lang["expenses_payment"] = "Payment Type";
$lang["expenses_debit"] = "Debit Card";
$lang["expenses_debit_filter"] = "Debit Card";
$lang["expenses_credit"] = "Credit Card";
$lang["expenses_credit_filter"] = "Credit Card";
$lang["expenses_cash"] = "Cash";
$lang["expenses_cash_filter"] = "Cash";
$lang["expenses_check"] = "Check";
$lang["expenses_check_filter"] = "Check";
$lang["expenses_due"] = "Due";
$lang["expenses_due_filter"] = "Due";
$lang["expenses_is_deleted"] = "Deleted";
+5 -1
View File
@@ -2,11 +2,15 @@
$lang["module_both"] = "Both";
$lang["module_config"] = "Configuration";
$lang["module_config_desc"] = "Change the OSPOS's Configuration";
$lang["module_config_desc"] = "Change OSPOS's Configuration";
$lang["module_customers"] = "Customers";
$lang["module_customers_desc"] = "Add, Update, Delete, and Search Customers";
$lang["module_employees"] = "Employees";
$lang["module_employees_desc"] = "Add, Update, Delete, and Search Employees";
$lang["module_expenses"] = "Expenses";
$lang["module_expenses_desc"] = "Add, Update, Delete, and Search Expenses";
$lang["module_expenses_categories"] = "Expenses Categories";
$lang["module_expenses_categories_desc"] = "Add, Update, and Delete Expenses Categories";
$lang["module_giftcards"] = "Gift Cards";
$lang["module_giftcards_desc"] = "Add, Update, Delete and Search Gift Cards";
$lang["module_home"] = "Home";
@@ -35,6 +35,11 @@ $lang["reports_earned"] = "Points Earned";
$lang["reports_employee"] = "Employee";
$lang["reports_employees"] = "Employees";
$lang["reports_employees_summary_report"] = "Employees Summary Report";
$lang["reports_expenses_categories"] = "Expenses";
$lang["reports_expenses_categories_summary_report"] = "Expense Categories Summary Report";
$lang["reports_expenses_category"] = "Category";
$lang["reports_expenses_amount"] = "Amount";
$lang["reports_expenses_total_amount"] = "Total Amount";
$lang["reports_graphical_reports"] = "Graphical Reports";
$lang["reports_inventory"] = "Inventory";
$lang["reports_inventory_low"] = "Low Inventory";
@@ -3,7 +3,7 @@
$lang["suppliers_account_number"] = "Account #";
$lang["suppliers_agency_name"] = "Agency Name";
$lang["suppliers_cannot_be_deleted"] = "Could not delete the selected Supplier(s). One or more have Sales";
$lang["suppliers_company_name"] = "Company Name is a required field";
$lang["suppliers_company_name"] = "Company Name";
$lang["suppliers_company_name_required"] = "Company Name is a required field";
$lang["suppliers_confirm_delete"] = "Are you sure you want to delete the selected Supplier(s)?";
$lang["suppliers_error_adding_updating"] = "Supplier update or add failed";
@@ -0,0 +1,20 @@
<?php
$lang["expenses_categories_add_item"] = "Add Category";
$lang["expenses_categories_cannot_be_deleted"] = "Could not delete Category Expense(s)";
$lang["expenses_categories_confirm_delete"] = "Are you sure you want to delete the selected Expense Category?";
$lang["expenses_categories_description"] = "Category Description";
$lang["expenses_categories_error_adding_updating"] = "Error adding/updating Expense Category";
$lang["expenses_categories_info"] = "Category Expense Info";
$lang["expenses_categories_category_id"] = "Id";
$lang["expenses_categories_name"] = "Category Name";
$lang["expenses_categories_new"] = "New Category";
$lang["expenses_categories_no_expenses_categories_to_display"] = "No Category to display";
$lang["expenses_categories_none_selected"] = "You have not selected any Category Expense";
$lang["expenses_categories_one_or_multiple"] = "Category Expense";
$lang["expenses_categories_quantity"] = "Quantity";
$lang["expenses_categories_successful_adding"] = "Expense Category add successful";
$lang["expenses_categories_successful_deleted"] = "Expense Category delete successful";
$lang["expenses_categories_successful_updating"] = "Expense Category update successful";
$lang["expenses_categories_update"] = "Update Category";
$lang["category_name_required"] = "Expense Category name required";
@@ -0,0 +1,42 @@
<?php
$lang["expenses_add_item"] = "Add Expense";
$lang["expenses_cannot_be_deleted"] = "Could not delete Category Expense(s)";
$lang["expenses_confirm_delete"] = "Are you sure you want to delete the selected Expense?";
$lang["expenses_description"] = "Description";
$lang["expenses_error_adding_updating"] = "Error adding/updating Expense";
$lang["expenses_info"] = "Expense Info";
$lang["expenses_expense_id"] = "Id";
$lang["expenses_expenses_employee"] = "Employee";
$lang["expenses_date"] = "Date";
$lang["expenses_amount"] = "Amount";
$lang["expenses_categories_name"] = "Category";
$lang["expenses_new"] = "New Expense";
$lang["expenses_no_expenses_to_display"] = "There are no Expenses to display";
$lang["expenses_none_selected"] = "You have not selected any Expense";
$lang["expenses_one_or_multiple"] = "Expense(s)";
$lang["expenses_successful_adding"] = "Expense add successful";
$lang["expenses_successful_deleted"] = "Expense delete successful";
$lang["expenses_successful_updating"] = "Expense update successful";
$lang["expenses_update"] = "Update Expense";
$lang["expenses_name_required"] = "Expense Name required";
$lang["expenses_amount_required"] = "Expense Amount required";
$lang["expenses_employee"] = "Created By";
$lang["expenses_amount_number"] = "Amount must be a number";
$lang["expenses_amount_required"] = "Amount is a required field";
$lang["expenses_date_number"] = "date must be a number";
$lang["expenses_date_required"] = "date is a required field";
$lang["expenses_category_required"] = "category is a required field";
$lang["expenses_by_category"] = "Category";
$lang["expenses_payment"] = "Payment Type";
$lang["expenses_debit"] = "Debit Card";
$lang["expenses_debit_filter"] = "Debit Card";
$lang["expenses_credit"] = "Credit Card";
$lang["expenses_credit_filter"] = "Credit Card";
$lang["expenses_cash"] = "Cash";
$lang["expenses_cash_filter"] = "Cash";
$lang["expenses_check"] = "Check";
$lang["expenses_check_filter"] = "Check";
$lang["expenses_due"] = "Due";
$lang["expenses_due_filter"] = "Due";
$lang["expenses_is_deleted"] = "Deleted";
+6 -2
View File
@@ -1,12 +1,16 @@
<?php
$lang["module_both"] = "Both";
$lang["module_config"] = "Store Config";
$lang["module_config_desc"] = "Change the store's configuration";
$lang["module_config"] = "Configuration";
$lang["module_config_desc"] = "Change OSPOS's Configuration.";
$lang["module_customers"] = "Customers";
$lang["module_customers_desc"] = "Add, Update, Delete, and Search Customers.";
$lang["module_employees"] = "Employees";
$lang["module_employees_desc"] = "Add, Update, Delete, and Search Employees.";
$lang["module_expenses"] = "Expenses";
$lang["module_expenses_desc"] = "Add, Update, Delete, and Search Expenses.";
$lang["module_expenses_categories"] = "Expenses Categories";
$lang["module_expenses_categories_desc"] = "Add, Update, and Delete Expenses Categories.";
$lang["module_giftcards"] = "Gift Cards";
$lang["module_giftcards_desc"] = "Add, Update, Delete and Search Gift Cards.";
$lang["module_home"] = "Home";
@@ -35,6 +35,11 @@ $lang["reports_earned"] = "Points Earned";
$lang["reports_employee"] = "Employee";
$lang["reports_employees"] = "Employees";
$lang["reports_employees_summary_report"] = "Employees Summary Report";
$lang["reports_expenses_categories"] = "Expenses";
$lang["reports_expenses_categories_summary_report"] = "Expense Categories Summary Report";
$lang["reports_expenses_category"] = "Category";
$lang["reports_expenses_amount"] = "Amount";
$lang["reports_expenses_total_amount"] = "Total Amount";
$lang["reports_graphical_reports"] = "Graphical Reports";
$lang["reports_inventory"] = "Inventory";
$lang["reports_inventory_low"] = "Low Inventory";
@@ -112,3 +112,89 @@ WHERE `name_lang_key` = 'module_office';
UPDATE `ospos_modules`
SET `sort` = 98
WHERE `name_lang_key` = 'module_messages';
--
-- Add support for expenses tracking
--
INSERT INTO `ospos_modules` (`name_lang_key`, `desc_lang_key`, `sort`, `module_id`) VALUES
('module_expenses', 'module_expenses_desc', 108, 'expenses'),
('module_expenses_categories', 'module_expenses_categories_desc', 109, 'expenses_categories');
INSERT INTO `ospos_permissions` (`permission_id`, `module_id`) VALUES
('expenses_categories', 'expenses_categories'),
('expenses', 'expenses'),
('reports_expenses_categories', 'reports');
INSERT INTO `ospos_grants` (`permission_id`, `person_id`) VALUES
('expenses', 1),
('expenses_categories', 1),
('reports_expenses_categories', 1);
-- Table structure for table `ospos_expense_categories`
CREATE TABLE IF NOT EXISTS `ospos_expense_categories` (
`expense_category_id` int(10) NOT NULL,
`category_name` varchar(255) DEFAULT NULL,
`category_description` varchar(255) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `ospos_expense_categories` (`expense_category_id`, `category_name`, `category_description`) VALUES
(1, 'Utilities', 'Water');
-- Table structure for table `ospos_expenses`
CREATE TABLE IF NOT EXISTS `ospos_expenses` (
`expense_id` int(10) NOT NULL,
`date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`amount` decimal(15,2) NOT NULL,
`payment_type` varchar(40) NOT NULL,
`expense_category_id` int(11) NOT NULL,
`description` varchar(255) NOT NULL,
`employee_id` int(10) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Dumping data for table `ospos_expenses`
INSERT INTO `ospos_expenses` (`expense_id`, `date`, `amount`, `expense_category_id`, `description`, `employee_id`) VALUES
(1, '2017-04-20 07:00:00', '15.00', 1, 'Water', 1);
-- Indexes for table `ospos_expense_categories`
ALTER TABLE `ospos_expense_categories`
ADD PRIMARY KEY (`expense_category_id`),
ADD UNIQUE KEY `category_name` (`category_name`);
-- Indexes for table `ospos_expenses`
ALTER TABLE `ospos_expenses`
ADD PRIMARY KEY (`expense_id`),
ADD KEY `expense_category_id` (`expense_category_id`),
ADD KEY `employee_id` (`employee_id`);
-- AUTO_INCREMENT for table `ospos_expense_categories`
ALTER TABLE `ospos_expense_categories`
MODIFY `expense_category_id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
-- AUTO_INCREMENT for table `ospos_expenses`
ALTER TABLE `ospos_expenses`
MODIFY `expense_id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
-- Constraints for table `ospos_expenses`
ALTER TABLE `ospos_expenses`
ADD CONSTRAINT `ospos_expenses_ibfk_1` FOREIGN KEY (`expense_category_id`) REFERENCES `ospos_expense_categories` (`expense_category_id`),
ADD CONSTRAINT `ospos_expenses_ibfk_2` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`);
+314
View File
@@ -0,0 +1,314 @@
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Expense class
*/
class Expense extends CI_Model
{
/*
Determines if a given Expense_id is an Expense
*/
public function exists($expense_id)
{
$this->db->from('expenses');
$this->db->where('expense_id', $expense_id);
return ($this->db->get()->num_rows() == 1);
}
/*
Gets category info
*/
public function get_expense_category($expense_id)
{
$this->db->from('expenses');
$this->db->where('expense_id', $expense_id);
return $this->Expense_category->get_info($this->db->get()->row()->expense_category_id);
}
/*
Gets employee info
*/
public function get_employee($expense_id)
{
$this->db->from('expenses');
$this->db->where('expense_id', $expense_id);
return $this->Employee->get_info($this->db->get()->row()->employee_id);
}
public function get_multiple_info($expense_ids)
{
$this->db->from('expenses');
$this->db->where_in('expenses.expense_id', $expense_ids);
$this->db->order_by('expense_id', 'asc');
return $this->db->get();
}
/*
Gets rows
*/
public function get_found_rows($search, $filters)
{
return $this->search($search, $filters)->num_rows();
}
/*
Searches expenses
*/
public function search($search, $filters, $rows = 0, $limit = 0, $sort = 'expense_id', $order = 'asc')
{
$this->db->select('
expenses.expense_id,
MAX(expenses.date) AS date,
MAX(expenses.amount) AS amount,
MAX(expenses.payment_type) AS payment_type,
MAX(expenses.description) AS description,
MAX(employees.first_name) AS first_name,
MAX(employees.last_name) AS last_name,
MAX(expense_categories.category_name) AS category_name
');
$this->db->from('expenses AS expenses');
$this->db->join('people AS employees', 'employees.person_id = expenses.employee_id', 'LEFT');
$this->db->join('expense_categories AS expense_categories', 'expense_categories.expense_category_id = expenses.expense_category_id', 'LEFT');
$this->db->group_start();
$this->db->like('employees.first_name', $search);
$this->db->or_like('expenses.date', $search);
$this->db->or_like('employees.last_name', $search);
$this->db->or_like('expenses.payment_type', $search);
$this->db->or_like('expenses.amount', $search);
$this->db->or_like('expense_categories.category_name', $search);
$this->db->or_like('CONCAT(employees.first_name, " ", employees.last_name)', $search);
$this->db->group_end();
$this->db->where('expenses.deleted', $filters['is_deleted']);
if(empty($this->config->item('date_or_time_format')))
{
$this->db->where('DATE_FORMAT(expenses.date, "%Y-%m-%d") BETWEEN ' . $this->db->escape($filters['start_date']) . ' AND ' . $this->db->escape($filters['end_date']));
}
else
{
$this->db->where('expenses.date BETWEEN ' . $this->db->escape(rawurldecode($filters['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($filters['end_date'])));
}
if($filters['only_debit'] != FALSE)
{
$this->db->like('expenses.payment_type', $this->lang->line('expenses_debit'));
}
if($filters['only_credit'] != FALSE)
{
$this->db->like('expenses.payment_type', $this->lang->line('expenses_credit'));
}
if($filters['only_cash'] != FALSE)
{
$this->db->group_start();
$this->db->like('expenses.payment_type', $this->lang->line('expenses_cash'));
$this->db->or_where('expenses.payment_type IS NULL');
$this->db->group_end();
}
if($filters['only_due'] != FALSE)
{
$this->db->like('expenses.payment_type', $this->lang->line('expenses_due'));
}
if($filters['only_check'] != FALSE)
{
$this->db->like('expenses.payment_type', $this->lang->line('expenses_check'));
}
$this->db->group_by('expense_id');
$this->db->order_by($sort, $order);
if($rows > 0)
{
$this->db->limit($rows, $limit);
}
return $this->db->get();
}
/*
Gets information about a particular expense
*/
public function get_info($expense_id)
{
$this->db->select('
expenses.expense_id AS expense_id,
expenses.date AS date,
expenses.amount AS amount,
expenses.payment_type AS payment_type,
expenses.description AS description,
expenses.employee_id AS employee_id,
expenses.deleted AS deleted,
employees.first_name AS first_name,
employees.last_name AS last_name,
expense_categories.expense_category_id AS expense_category_id,
expense_categories.category_name AS category_name
');
$this->db->from('expenses AS expenses');
$this->db->join('people AS employees', 'employees.person_id = expenses.employee_id', 'LEFT');
$this->db->join('expense_categories AS expense_categories', 'expense_categories.expense_category_id = expenses.expense_category_id', 'LEFT');
$this->db->where('expense_id', $expense_id);
$query = $this->db->get();
if($query->num_rows() == 1)
{
return $query->row();
}
else
{
//Get empty base parent object
$expenses_obj = new stdClass();
//Get all the fields from expenses table
foreach($this->db->list_fields('expenses') as $field)
{
$expenses_obj->$field = '';
}
return $expenses_obj;
}
}
/*
Inserts or updates an expense
*/
public function save(&$expense_data, $expense_id = FALSE)
{
//$expense_id = $expense_data['expense_id'];
if(!$expense_id == -1 || !$this->exists($expense_id))
{
if($this->db->insert('expenses', $expense_data))
{
$expense_data['expense_id'] = $this->db->insert_id();
return TRUE;
}
return FALSE;
}
$this->db->where('expense_id', $expense_id);
return $this->db->update('expenses', $expense_data);
}
/*
Deletes a list of expense_category
*/
public function delete_list($expense_ids)
{
$success = FALSE;
//Run these queries as a transaction, we want to make sure we do all or nothing
$this->db->trans_start();
$this->db->where_in('expense_id', $expense_ids);
$success = $this->db->update('expenses', array('deleted'=>1));
$this->db->trans_complete();
return $success;
}
/*
Gets the payment summary for the expenses (expenses/manage) view
*/
public function get_payments_summary($search, $filters)
{
// get payment summary
$this->db->select('payment_type, COUNT(amount) AS count, SUM(amount) AS amount');
$this->db->from('expenses');
$this->db->where('deleted', $filters['is_deleted']);
if(empty($this->config->item('date_or_time_format')))
{
$this->db->where('DATE_FORMAT(date, "%Y-%m-%d") BETWEEN ' . $this->db->escape($filters['start_date']) . ' AND ' . $this->db->escape($filters['end_date']));
}
else
{
$this->db->where('date BETWEEN ' . $this->db->escape(rawurldecode($filters['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($filters['end_date'])));
}
if($filters['only_cash'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('expenses_cash'));
}
if($filters['only_due'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('expenses_due'));
}
if($filters['only_check'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('expenses_check'));
}
if($filters['only_credit'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('expenses_credit'));
}
if($filters['only_debit'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('expenses_debit'));
}
$this->db->group_by('payment_type');
$payments = $this->db->get()->result_array();
return $payments;
}
/*
Gets the payment options to show in the expense forms
*/
public function get_payment_options()
{
$payments = array();
if($this->config->item('payment_options_order') == 'debitcreditcash')
{
$payments[$this->lang->line('sales_debit')] = $this->lang->line('sales_debit');
$payments[$this->lang->line('sales_credit')] = $this->lang->line('sales_credit');
$payments[$this->lang->line('sales_cash')] = $this->lang->line('sales_cash');
}
elseif($this->config->item('payment_options_order') == 'debitcashcredit')
{
$payments[$this->lang->line('sales_debit')] = $this->lang->line('sales_debit');
$payments[$this->lang->line('sales_cash')] = $this->lang->line('sales_cash');
$payments[$this->lang->line('sales_credit')] = $this->lang->line('sales_credit');
}
else // default: if($this->config->item('payment_options_order') == 'cashdebitcredit')
{
$payments[$this->lang->line('sales_cash')] = $this->lang->line('sales_cash');
$payments[$this->lang->line('sales_debit')] = $this->lang->line('sales_debit');
$payments[$this->lang->line('sales_credit')] = $this->lang->line('sales_credit');
}
$payments[$this->lang->line('sales_due')] = $this->lang->line('sales_due');
$payments[$this->lang->line('sales_check')] = $this->lang->line('sales_check');
return $payments;
}
/*
Gets the expense payment
*/
public function get_expense_payment($expense_id)
{
$this->db->from('expenses');
$this->db->where('expense_id', $expense_id);
return $this->db->get();
}
}
?>
+158
View File
@@ -0,0 +1,158 @@
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Expense_category class
*/
class Expense_category extends CI_Model
{
/*
Determines if a given Expense_id is an Expense category
*/
public function exists($expense_category_id)
{
$this->db->from('expense_categories');
$this->db->where('expense_category_id', $expense_category_id);
return ($this->db->get()->num_rows() == 1);
}
/*
Gets total of rows
*/
public function get_total_rows()
{
$this->db->from('expense_categories');
$this->db->where('deleted', 0);
return $this->db->count_all_results();
}
/*
Gets information about a particular category
*/
public function get_info($expense_category_id)
{
$this->db->from('expense_categories');
$this->db->where('expense_category_id', $expense_category_id);
$this->db->where('deleted', 0);
$query = $this->db->get();
if($query->num_rows()==1)
{
return $query->row();
}
else
{
//Get empty base parent object, as $item_kit_id is NOT an item kit
$expense_obj = new stdClass();
//Get all the fields from items table
foreach($this->db->list_fields('expense_categories') as $field)
{
$expense_obj->$field = '';
}
return $expense_obj;
}
}
/*
Returns all the expense_categories
*/
public function get_all($rows = 0, $limit_from = 0, $no_deleted = FALSE)
{
$this->db->from('expense_categories');
$this->db->order_by('category_name', 'asc');
if($no_deleted == TRUE)
{
$this->db->where('deleted', 0);
}
if($rows > 0)
{
$this->db->limit($rows, $limit_from);
}
return $this->db->get();
}
/*
Gets information about multiple expense_category_id
*/
public function get_multiple_info($expense_category_ids)
{
$this->db->from('expense_categories');
$this->db->where_in('expense_category_id', $expense_category_ids);
$this->db->order_by('category_name', 'asc');
return $this->db->get();
}
/*
Inserts or updates an expense_category
*/
public function save(&$expense_category_data, $expense_category_id = FALSE)
{
if(!$expense_category_id || !$this->exists($expense_category_id))
{
if($this->db->insert('expense_categories', $expense_category_data))
{
$expense_category_data['expense_category_id'] = $this->db->insert_id();
return TRUE;
}
return FALSE;
}
$this->db->where('expense_category_id', $expense_category_id);
return $this->db->update('expense_categories', $expense_category_data);
}
/*
Deletes a list of expense_category
*/
public function delete_list($expense_category_ids)
{
$this->db->where_in('expense_category_id', $expense_category_ids);
return $this->db->update('expense_categories', array('deleted' => 1));
}
/*
Perform a search on expense_category
*/
public function search($search, $rows = 0, $limit_from = 0, $sort = 'category_name', $order='asc')
{
$this->db->from('expense_categories');
$this->db->group_start();
$this->db->like('category_name', $search);
$this->db->or_like('category_description', $search);
$this->db->group_end();
$this->db->where('deleted', 0);
$this->db->order_by($sort, $order);
if($rows > 0)
{
$this->db->limit($rows, $limit_from);
}
return $this->db->get();
}
public function get_found_rows($search)
{
$this->db->from('expense_categories');
$this->db->group_start();
$this->db->like('category_name', $search);
$this->db->or_like('category_description', $search);
$this->db->group_end();
$this->db->where('deleted', 0);
return $this->db->get()->num_rows();
}
}
?>
-1
View File
@@ -29,7 +29,6 @@ class Giftcard extends CI_Model
$this->db->order_by("giftcard_number","desc");
$this->db->limit(1);
return $this->db->get()->row();
}
+1
View File
@@ -40,6 +40,7 @@ class Inventory extends CI_Model
);
}
}
return TRUE;
}
@@ -0,0 +1,57 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once("Summary_report.php");
class Summary_expenses_categories extends Summary_report
{
protected function _get_data_columns()
{
return array(
array('category_name' => $this->lang->line('reports_expenses_category')),
array('count' => $this->lang->line('reports_count'), 'sorter' => 'number_sorter'),
array('total_amount' => $this->lang->line('reports_expenses_amount'), 'sorter' => 'number_sorter'));
}
public function getData(array $inputs)
{
$this->db->select('expense_categories.category_name AS category_name, COUNT(expenses.expense_id) AS count, SUM(expenses.amount) AS total_amount');
$this->db->from('expenses AS expenses');
$this->db->join('expense_categories AS expense_categories', 'expense_categories.expense_category_id = expenses.expense_category_id', 'LEFT');
if(empty($this->config->item('date_or_time_format')))
{
$this->db->where('DATE(expenses.date) BETWEEN ' . $this->db->escape($inputs['start_date']) . ' AND ' . $this->db->escape($inputs['end_date']));
}
else
{
$this->db->where('expenses.date BETWEEN ' . $this->db->escape(rawurldecode($inputs['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($inputs['end_date'])));
}
$this->db->where('expenses.deleted', 0);
$this->db->group_by('expense_categories.category_name');
$this->db->order_by('expense_categories.category_name');
return $this->db->get()->result_array();
}
public function getSummaryData(array $inputs)
{
$this->db->select('SUM(expenses.amount) AS expenses_total_amount');
$this->db->from('expenses AS expenses');
if(empty($this->config->item('date_or_time_format')))
{
$this->db->where('DATE(expenses.date) BETWEEN ' . $this->db->escape($inputs['start_date']) . ' AND ' . $this->db->escape($inputs['end_date']));
}
else
{
$this->db->where('expenses.date BETWEEN ' . $this->db->escape(rawurldecode($inputs['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($inputs['end_date'])));
}
$this->db->where('expenses.deleted', 0);
return $this->db->get()->row_array();
}
}
?>
+8 -10
View File
@@ -5,7 +5,7 @@ require_once("Report.php");
abstract class Summary_report extends Report
{
/**
* Private interface
* Private interface implementing the core basic functionality for all reports
*/
private function _common_select(array $inputs)
@@ -94,17 +94,17 @@ abstract class Summary_report extends Report
{
$this->db->where('sale_status', COMPLETED);
$this->db->group_start();
$this->db->where('sale_type', SALE_TYPE_POS);
$this->db->or_where('sale_type', SALE_TYPE_INVOICE);
$this->db->or_where('sale_type', SALE_TYPE_RETURN);
$this->db->where('sale_type', SALE_TYPE_POS);
$this->db->or_where('sale_type', SALE_TYPE_INVOICE);
$this->db->or_where('sale_type', SALE_TYPE_RETURN);
$this->db->group_end();
}
elseif($inputs['sale_type'] == 'sales')
{
$this->db->where('sale_status', COMPLETED);
$this->db->group_start();
$this->db->where('sale_type', SALE_TYPE_POS);
$this->db->or_where('sale_type', SALE_TYPE_INVOICE);
$this->db->where('sale_type', SALE_TYPE_POS);
$this->db->or_where('sale_type', SALE_TYPE_INVOICE);
$this->db->group_end();
}
elseif($inputs['sale_type'] == 'quotes')
@@ -126,12 +126,10 @@ abstract class Summary_report extends Report
$this->db->where('sale_status', COMPLETED);
$this->db->where('sale_type', SALE_TYPE_RETURN);
}
}
/**
* Protected class interface implemented by derived classes
* Protected class interface implemented by derived classes if necessary
*/
abstract protected function _get_data_columns();
@@ -142,7 +140,7 @@ abstract class Summary_report extends Report
protected function _group_order() {}
/**
* Public interface implementing the base abstract class, in general it should not be extended unless there is a valid reason
* Public interface implementing the base abstract class, in general it should not be extended unless there is a valid reason like a non sale report (e.g. expenses)
*/
public function getDataColumns()
+175
View File
@@ -0,0 +1,175 @@
<div id="required_fields_message"><?php echo $this->lang->line('common_fields_required_message'); ?></div>
<ul id="error_message_box" class="error_message_box"></ul>
<?php echo form_open('expenses/save/'.$expenses_info->expense_id, array('id'=>'expenses_edit_form', 'class'=>'form-horizontal')); ?>
<fieldset id="item_basic_info">
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_info'), 'expenses_info', array('class'=>'control-label col-xs-3')); ?>
<?php echo form_label(!empty($expenses_info->expense_id) ? $this->lang->line('expenses_expense_id') . ' ' . $expenses_info->expense_id : '', 'expenses_info_id', array('class'=>'control-label col-xs-8', 'style'=>'text-align:left')); ?>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_date'), 'date', array('class'=>'required control-label col-xs-3')); ?>
<div class='col-xs-6'>
<div class="input-group">
<span class="input-group-addon input-sm"><span class="glyphicon glyphicon-calendar"></span></span>
<?php echo form_input(array(
'name'=>'date',
'id'=>'datetime',
'class'=>'form-control input-sm datepicker',
'value'=>date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($expenses_info->date)))
);?>
</div>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_amount'), 'amount', array('class'=>'required control-label col-xs-3')); ?>
<div class='col-xs-6'>
<div class="input-group input-group-sm">
<?php if (!currency_side()): ?>
<span class="input-group-addon input-sm"><b><?php echo $this->config->item('currency_symbol'); ?></b></span>
<?php endif; ?>
<?php echo form_input(array(
'name'=>'amount',
'id'=>'amount',
'class'=>'form-control input-sm',
'value'=>to_currency_no_money($expenses_info->amount))
);?>
<?php if (currency_side()): ?>
<span class="input-group-addon input-sm"><b><?php echo $this->config->item('currency_symbol'); ?></b></span>
<?php endif; ?>
</div>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_payment'), 'payment_type', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-6'>
<?php echo form_dropdown('payment_type', $payment_options, $expenses_info->payment_type, array('class'=>'form-control', 'id'=>'payment_type'));?>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_categories_name'), 'category', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-6'>
<?php echo form_dropdown('expense_category_id', $expense_categories, $expenses_info->expense_category_id, array('class'=>'form-control', 'id'=>'category')); ?>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_employee'), 'employee', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-6'>
<?php echo form_dropdown('employee_id', $employees, $expenses_info->employee_id, 'id="employee_id" class="form-control"');?>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_description'), 'description', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-6'>
<?php echo form_textarea(array(
'name'=>'description',
'id'=>'description',
'class'=>'form-control input-sm',
'value'=>$expenses_info->description)
);?>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_is_deleted').':', 'deleted', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-5'>
<?php echo form_checkbox(array(
'name'=>'deleted',
'id'=>'deleted',
'value'=>1,
'checked'=>($expenses_info->deleted) ? 1 : 0)
);?>
</div>
</div>
</fieldset>
<?php echo form_close(); ?>
<script type='text/javascript'>
//validation and submit handling
$(document).ready(function()
{
<?php $this->load->view('partial/datepicker_locale'); ?>
$('#datetime').datetimepicker({
format: "<?php echo dateformat_bootstrap($this->config->item('dateformat')) . ' ' . dateformat_bootstrap($this->config->item('timeformat'));?>",
startDate: "<?php echo date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), mktime(0, 0, 0, 1, 1, 2010));?>",
<?php
$t = $this->config->item('timeformat');
$m = $t[strlen($t)-1];
if( strpos($this->config->item('timeformat'), 'a') !== false || strpos($this->config->item('timeformat'), 'A') !== false )
{
?>
showMeridian: true,
<?php
}
else
{
?>
showMeridian: false,
<?php
}
?>
minuteStep: 1,
autoclose: true,
todayBtn: true,
todayHighlight: true,
bootcssVer: 3,
language: '<?php echo current_language_code(); ?>'
});
var submit_form = function()
{
$(this).ajaxSubmit(
{
success: function(response)
{
dialog_support.hide();
table_support.handle_submit('<?php echo site_url('expenses'); ?>', response);
},
dataType: 'json'
});
};
$('#expenses_edit_form').validate($.extend(
{
submitHandler: function(form)
{
submit_form.call(form);
},
rules:
{
category: 'required',
date:
{
required: true
},
amount:
{
required: true,
number: true
}
},
messages:
{
category: '<?php echo $this->lang->line('expenses_category_required'); ?>',
date:
{
required: '<?php echo $this->lang->line('expenses_date_required'); ?>'
},
amount:
{
required: '<?php echo $this->lang->line('expenses_amount_required'); ?>',
number: '<?php echo $this->lang->line('expenses_amount_number'); ?>'
}
}
}, form_support.error));
});
</script>
+72
View File
@@ -0,0 +1,72 @@
<?php $this->load->view("partial/header"); ?>
<script type="text/javascript">
$(document).ready(function()
{
// when any filter is clicked and the dropdown window is closed
$('#filters').on('hidden.bs.select', function(e) {
table_support.refresh();
});
// load the preset datarange picker
<?php $this->load->view('partial/daterangepicker'); ?>
$("#daterangepicker").on('apply.daterangepicker', function(ev, picker) {
table_support.refresh();
});
<?php $this->load->view('partial/bootstrap_tables_locale'); ?>
table_support.init({
resource: '<?php echo site_url($controller_name);?>',
headers: <?php echo $table_headers; ?>,
pageSize: <?php echo $this->config->item('lines_per_page'); ?>,
uniqueId: 'expense_id',
onLoadSuccess: function(response) {
if($("#table tbody tr").length > 1) {
$("#payment_summary").html(response.payment_summary);
$("#table tbody tr:last td:first").html("");
}
},
queryParams: function() {
return $.extend(arguments[0], {
start_date: start_date,
end_date: end_date,
filters: $("#filters").val() || [""]
});
}
});
});
</script>
<?php $this->load->view('partial/print_receipt', array('print_after_sale'=>false, 'selected_printer'=>'takings_printer')); ?>
<div id="title_bar" class="print_hide btn-toolbar">
<button onclick="javascript:printdoc()" class='btn btn-info btn-sm pull-right'>
<span class="glyphicon glyphicon-print">&nbsp;</span><?php echo $this->lang->line('common_print'); ?>
</button>
<button class='btn btn-info btn-sm pull-right modal-dlg' data-btn-submit='<?php echo $this->lang->line('common_submit') ?>' data-href='<?php echo site_url($controller_name."/view"); ?>'
title='<?php echo $this->lang->line($controller_name.'_new'); ?>'>
<span class="glyphicon glyphicon-tags">&nbsp</span><?php echo $this->lang->line($controller_name . '_new'); ?>
</button>
</div>
<div id="toolbar">
<div class="pull-left form-inline" role="toolbar">
<button id="delete" class="btn btn-default btn-sm print_hide">
<span class="glyphicon glyphicon-trash">&nbsp</span><?php echo $this->lang->line("common_delete");?>
</button>
<?php echo form_input(array('name'=>'daterangepicker', 'class'=>'form-control input-sm', 'id'=>'daterangepicker')); ?>
<?php echo form_multiselect('filters[]', $filters, '', array('id'=>'filters', 'data-none-selected-text'=>$this->lang->line('common_none_selected_text'), 'class'=>'selectpicker show-menu-arrow', 'data-selected-text-format'=>'count > 1', 'data-style'=>'btn-default btn-sm', 'data-width'=>'fit')); ?>
</div>
</div>
<div id="table_holder">
<table id="table"></table>
</div>
<div id="payment_summary">
</div>
<?php $this->load->view("partial/footer"); ?>
@@ -0,0 +1,67 @@
<div id="required_fields_message"><?php echo $this->lang->line('common_fields_required_message'); ?></div>
<ul id="error_message_box" class="error_message_box"></ul>
<?php echo form_open('expenses_categories/save/'.$category_info->expense_category_id, array('id'=>'expense_category_edit_form', 'class'=>'form-horizontal')); ?>
<fieldset id="expenses_categories">
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_categories_name'), 'category_name', array('class'=>'required control-label col-xs-3')); ?>
<div class='col-xs-8'>
<?php echo form_input(array(
'name'=>'category_name',
'id'=>'category_name',
'class'=>'form-control input-sm',
'value'=>$category_info->category_name)
);?>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('expenses_categories_description'), 'category_description', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>
<?php echo form_textarea(array(
'name'=>'category_description',
'id'=>'category_description',
'class'=>'form-control input-sm',
'value'=>$category_info->category_description)
);?>
</div>
</div>
</fieldset>
<?php echo form_close(); ?>
<script type='text/javascript'>
//validation and submit handling
$(document).ready(function()
{
var submit_form = function()
{
$(this).ajaxSubmit(
{
success: function(response)
{
dialog_support.hide();
table_support.handle_submit('<?php echo site_url('expenses_categories'); ?>', response);
},
dataType: 'json'
});
};
$('#expense_category_edit_form').validate($.extend(
{
submitHandler: function(form)
{
submit_form.call(form);
},
rules:
{
category_name: 'required'
},
messages:
{
category_name: '<?php echo $this->lang->line('category_name_required'); ?>'
}
}, form_support.error));
});
</script>
@@ -0,0 +1,45 @@
<?php $this->load->view("partial/header"); ?>
<script type="text/javascript">
$(document).ready(function()
{
<?php $this->load->view('partial/bootstrap_tables_locale'); ?>
table_support.init({
resource: '<?php echo site_url($controller_name);?>',
headers: <?php echo $table_headers; ?>,
pageSize: <?php echo $this->config->item('lines_per_page'); ?>,
uniqueId: 'expense_category_id',
});
// when any filter is clicked and the dropdown window is closed
$('#filters').on('hidden.bs.select', function(e)
{
table_support.refresh();
});
});
</script>
<div id="title_bar" class="btn-toolbar">
<button class='btn btn-info btn-sm pull-right modal-dlg' data-btn-submit='<?php echo $this->lang->line('common_submit') ?>' data-href='<?php echo site_url($controller_name."/view"); ?>'
title='<?php echo $this->lang->line($controller_name.'_new'); ?>'>
<span class="glyphicon glyphicon-list">&nbsp</span><?php echo $this->lang->line($controller_name . '_new'); ?>
</button>
</div>
<div id="toolbar">
<div class="pull-left form-inline" role="toolbar">
<button id="delete" class="btn btn-default btn-sm print_hide">
<span class="glyphicon glyphicon-trash">&nbsp</span><?php echo $this->lang->line("common_delete");?>
</button>
<!--<?php echo form_multiselect('filters[]', $filters, '', array('id'=>'filters', 'class'=>'selectpicker show-menu-arrow', 'data-selected-text-format'=>'count > 1', 'data-style'=>'btn-default btn-sm', 'data-width'=>'fit')); ?>-->
</div>
</div>
<div id="table_holder">
<table id="table"></table>
</div>
<?php $this->load->view("partial/footer"); ?>
@@ -114,8 +114,8 @@
{
?>
$('#daterangepicker').css("width","305");
var start_date = "<?php echo date('Y-m-d H:i:s',mktime(0,0,0,date("m"),date("d"),date("Y")))?>";
var end_date = "<?php echo date('Y-m-d H:i:s',mktime(23,59,59,date("m"),date("d"),date("Y")))?>";
var start_date = "<?php echo date('Y-m-d H:i:s', mktime(0,0,0,date("m"),date("d"),date("Y")))?>";
var end_date = "<?php echo date('Y-m-d H:i:s', mktime(23,59,59,date("m"),date("d"),date("Y")))?>";
$('#daterangepicker').daterangepicker({
"ranges": {
"<?php echo $this->lang->line("datepicker_today"); ?>": [
+2 -4
View File
@@ -25,9 +25,7 @@ $(document).ready(function()
});
location.href = "mailto:" + recipients.join(",");
});
});
</script>
<div id="title_bar" class="btn-toolbar">
@@ -43,8 +41,8 @@ $(document).ready(function()
}
?>
<button class='btn btn-info btn-sm pull-right modal-dlg' data-btn-submit='<?php echo $this->lang->line('common_submit') ?>' data-href='<?php echo site_url($controller_name."/view"); ?>'
title='<?php echo $this->lang->line($controller_name. '_new'); ?>'>
<span class="glyphicon glyphicon-user">&nbsp</span><?php echo $this->lang->line($controller_name. '_new'); ?>
title='<?php echo $this->lang->line($controller_name . '_new'); ?>'>
<span class="glyphicon glyphicon-user">&nbsp</span><?php echo $this->lang->line($controller_name . '_new'); ?>
</button>
</div>
+1 -1
View File
@@ -12,7 +12,7 @@
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('receivings_date'), 'date', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>
<?php echo form_input(array('name'=>'date','value'=>date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($receiving_info['receiving_time'])), 'id'=>'datetime', 'class'=>'form-control input-sm', 'readonly'=>'true'));?>
<?php echo form_input(array('name'=>'date','value'=>date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($receiving_info['receiving_time'])), 'id'=>'datetime', 'class'=>'form-control input-sm'));?>
</div>
</div>
+33 -26
View File
@@ -22,31 +22,38 @@ if(isset($error))
</div>
</div>
<div class="form-group form-group-sm">
<?php
if($mode == 'sale')
{
?>
<?php echo form_label($this->lang->line('reports_sale_type'), 'reports_sale_type_label', array('class'=>'required control-label col-xs-2')); ?>
<div id='report_sale_type' class="col-xs-3">
<?php echo form_dropdown('sale_type', $sale_type_options, 'complete', array('id'=>'input_type', 'class'=>'form-control')); ?>
</div>
<?php
}
elseif($mode == 'receiving')
{
?>
<?php echo form_label($this->lang->line('reports_receiving_type'), 'reports_receiving_type_label', array('class'=>'required control-label col-xs-2')); ?>
<div id='report_receiving_type' class="col-xs-3">
<?php echo form_dropdown('receiving_type', array('all' => $this->lang->line('reports_all'),
'receiving' => $this->lang->line('reports_receivings'),
'returns' => $this->lang->line('reports_returns'),
'requisitions' => $this->lang->line('reports_requisitions')), 'all', array('id'=>'input_type', 'class'=>'form-control')); ?>
</div>
<?php
}
?>
</div>
<?php
if(!empty($mode))
{
?>
<div class="form-group form-group-sm">
<?php
if($mode == 'sale')
{
?>
<?php echo form_label($this->lang->line('reports_sale_type'), 'reports_sale_type_label', array('class'=>'required control-label col-xs-2')); ?>
<div id='report_sale_type' class="col-xs-3">
<?php echo form_dropdown('sale_type', $sale_type_options, 'complete', array('id'=>'input_type', 'class'=>'form-control')); ?>
</div>
<?php
}
elseif($mode == 'receiving')
{
?>
<?php echo form_label($this->lang->line('reports_receiving_type'), 'reports_receiving_type_label', array('class'=>'required control-label col-xs-2')); ?>
<div id='report_receiving_type' class="col-xs-3">
<?php echo form_dropdown('receiving_type', array('all' => $this->lang->line('reports_all'),
'receiving' => $this->lang->line('reports_receivings'),
'returns' => $this->lang->line('reports_returns'),
'requisitions' => $this->lang->line('reports_requisitions')), 'all', array('id'=>'input_type', 'class'=>'form-control')); ?>
</div>
<?php
}
?>
</div>
<?php
}
?>
<?php
if (!empty($stock_locations) && count($stock_locations) > 1)
@@ -84,4 +91,4 @@ $(document).ready(function()
window.location = [window.location, start_date, end_date, $("#input_type").val() || 0, $("#location_id").val()].join("/");
});
});
</script>
</script>
+4 -6
View File
@@ -12,7 +12,7 @@
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('sales_date'), 'date', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>
<?php echo form_input(array('name'=>'date','value'=>date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($sale_info['sale_time'])), 'id'=>'datetime', 'class'=>'form-control input-sm', 'readonly'=>'true'));?>
<?php echo form_input(array('name'=>'date','value'=>date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), strtotime($sale_info['sale_time'])), 'id'=>'datetime', 'class'=>'form-control input-sm'));?>
</div>
</div>
@@ -91,7 +91,6 @@
</div>
</fieldset>
<?php echo form_close(); ?>
<script type="text/javascript">
$(document).ready(function()
@@ -112,7 +111,7 @@ $(document).ready(function()
<?php $this->load->view('partial/datepicker_locale'); ?>
$('#datetime').datetimepicker({
format: "<?php echo dateformat_bootstrap($this->config->item("dateformat")) . ' ' . dateformat_bootstrap($this->config->item("timeformat"));?>",
format: "<?php echo dateformat_bootstrap($this->config->item('dateformat')) . ' ' . dateformat_bootstrap($this->config->item('timeformat'));?>",
startDate: "<?php echo date($this->config->item('dateformat') . ' ' . $this->config->item('timeformat'), mktime(0, 0, 0, 1, 1, 2010));?>",
<?php
$t = $this->config->item('timeformat');
@@ -135,7 +134,7 @@ $(document).ready(function()
todayBtn: true,
todayHighlight: true,
bootcssVer: 3,
language: "<?php echo current_language_code(); ?>"
language: '<?php echo current_language_code(); ?>'
});
var fill_value = function(event, ui) {
@@ -180,7 +179,7 @@ $(document).ready(function()
$('#sales_edit_form').validate($.extend(
{
submitHandler : function(form)
submitHandler: function(form)
{
submit_form.call(form);
},
@@ -208,6 +207,5 @@ $(document).ready(function()
invoice_number: '<?php echo $this->lang->line("sales_invoice_number_duplicate"); ?>'
}
}, form_support.error));
});
</script>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB