Changes to support Item Kits, support for MySQL 5.7, and a tweak for PHP 7

This commit is contained in:
Steve Ireland
2017-01-19 22:03:32 -05:00
parent 4b1d5456cc
commit dd6bd1cf11
30 changed files with 1447 additions and 941 deletions

View File

@@ -9,6 +9,7 @@ class Config extends Secure_Controller
parent::__construct('config');
$this->load->library('barcode_lib');
$this->load->library('Sale_lib');
}
/*
@@ -194,7 +195,8 @@ class Config extends Secure_Controller
$data['stock_locations'] = $this->Stock_location->get_all()->result_array();
$data['support_barcode'] = $this->barcode_lib->get_list_barcodes();
$data['logo_exists'] = $this->config->item('company_logo') != '';
$data['line_sequence_options'] = $this->sale_lib->get_line_sequence_options();
$data = $this->xss_clean($data);
// load all the license statements, they are already XSS cleaned in the private function
@@ -372,7 +374,6 @@ class Config extends Secure_Controller
private function _clear_session_state()
{
$this->load->library('sale_lib');
$this->sale_lib->clear_sale_location();
$this->sale_lib->clear_all();
$this->load->library('receiving_lib');
@@ -414,9 +415,9 @@ class Config extends Secure_Controller
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_barcode()
{
$batch_save_data = array(
public function save_barcode()
{
$batch_save_data = array(
'barcode_type' => $this->input->post('barcode_type'),
'barcode_quality' => $this->input->post('barcode_quality'),
'barcode_width' => $this->input->post('barcode_width'),
@@ -431,17 +432,17 @@ class Config extends Secure_Controller
'barcode_page_cellspacing' => $this->input->post('barcode_page_cellspacing'),
'barcode_generate_if_empty' => $this->input->post('barcode_generate_if_empty') != NULL,
'barcode_content' => $this->input->post('barcode_content')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_receipt()
{
$batch_save_data = array (
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_receipt()
{
$batch_save_data = array (
'receipt_template' => $this->input->post('receipt_template'),
'receipt_show_taxes' => $this->input->post('receipt_show_taxes') != NULL,
'receipt_show_total_discount' => $this->input->post('receipt_show_total_discount') != NULL,
@@ -456,27 +457,28 @@ class Config extends Secure_Controller
'print_right_margin' => $this->input->post('print_right_margin')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function save_invoice()
{
$batch_save_data = array (
public function save_invoice()
{
$batch_save_data = array (
'invoice_enable' => $this->input->post('invoice_enable') != NULL,
'sales_invoice_format' => $this->input->post('sales_invoice_format'),
'recv_invoice_format' => $this->input->post('recv_invoice_format'),
'invoice_default_comments' => $this->input->post('invoice_default_comments'),
'invoice_email_message' => $this->input->post('invoice_email_message')
'invoice_email_message' => $this->input->post('invoice_email_message'),
'line_sequence' => $this->input->post('line_sequence')
);
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
$result = $this->Appconfig->batch_save($batch_save_data);
$success = $result ? TRUE : FALSE;
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
echo json_encode(array('success' => $success, 'message' => $this->lang->line('config_saved_' . ($success ? '' : 'un') . 'successfully')));
}
public function remove_logo()
{
@@ -484,22 +486,22 @@ class Config extends Secure_Controller
echo json_encode(array('success' => $result));
}
private function _handle_logo_upload()
{
$this->load->helper('directory');
// load upload library
$config = array('upload_path' => './uploads/',
'allowed_types' => 'gif|jpg|png',
'max_size' => '1024',
'max_width' => '800',
'max_height' => '680',
'file_name' => 'company_logo');
$this->load->library('upload', $config);
$this->upload->do_upload('company_logo');
private function _handle_logo_upload()
{
$this->load->helper('directory');
return strlen($this->upload->display_errors()) == 0 || !strcmp($this->upload->display_errors(), '<p>'.$this->lang->line('upload_no_file_selected').'</p>');
// load upload library
$config = array('upload_path' => './uploads/',
'allowed_types' => 'gif|jpg|png',
'max_size' => '1024',
'max_width' => '800',
'max_height' => '680',
'file_name' => 'company_logo');
$this->load->library('upload', $config);
$this->upload->do_upload('company_logo');
return strlen($this->upload->display_errors()) == 0 || !strcmp($this->upload->display_errors(), '<p>'.$this->lang->line('upload_no_file_selected').'</p>');
}
private function _check_encryption()
@@ -556,35 +558,35 @@ class Config extends Secure_Controller
return TRUE;
}
public function backup_db()
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
if($this->Employee->has_module_grant('config', $employee_id))
{
$this->load->dbutil();
$prefs = array(
public function backup_db()
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
if($this->Employee->has_module_grant('config', $employee_id))
{
$this->load->dbutil();
$prefs = array(
'format' => 'zip',
'filename' => 'ospos.sql'
);
$backup = $this->dbutil->backup($prefs);
$file_name = 'ospos-' . date("Y-m-d-H-i-s") .'.zip';
$save = 'uploads/' . $file_name;
$this->load->helper('download');
while(ob_get_level())
{
ob_end_clean();
}
);
force_download($file_name, $backup);
}
else
{
redirect('no_access/config');
}
}
$backup = $this->dbutil->backup($prefs);
$file_name = 'ospos-' . date("Y-m-d-H-i-s") .'.zip';
$save = 'uploads/' . $file_name;
$this->load->helper('download');
while(ob_get_level())
{
ob_end_clean();
}
force_download($file_name, $backup);
}
else
{
redirect('no_access/config');
}
}
}
?>

View File

@@ -84,23 +84,35 @@ class Item_kits extends Secure_Controller
public function view($item_kit_id = -1)
{
$info = $this->Item_kit->get_info($item_kit_id);
if($item_kit_id == -1)
{
$info->price_option = '0';
$info->print_option = '0';
}
foreach(get_object_vars($info) as $property => $value)
{
$info->$property = $this->xss_clean($value);
}
$data['item_kit_info'] = $info;
$items = array();
foreach($this->Item_kit_items->get_info($item_kit_id) as $item_kit_item)
{
$item['kit_sequence'] = $this->xss_clean($item_kit_item['kit_sequence']);
$item['name'] = $this->xss_clean($this->Item->get_info($item_kit_item['item_id'])->name);
$item['item_id'] = $this->xss_clean($item_kit_item['item_id']);
$item['quantity'] = $this->xss_clean($item_kit_item['quantity']);
$items[] = $item;
}
$data['item_kit_items'] = $items;
$data['selected_kit_item_id'] = $info->kit_item_id;
$data['selected_kit_item'] = ($item_kit_id > 0 && isset($info->kit_item_id)) ? $info->item_name : '';
$this->load->view("item_kits/form", $data);
}
@@ -108,36 +120,51 @@ class Item_kits extends Secure_Controller
{
$item_kit_data = array(
'name' => $this->input->post('name'),
'item_id' => $this->input->post('kit_item_id'),
'kit_discount_percent' => $this->input->post('kit_discount_percent'),
'price_option' => $this->input->post('price_option'),
'print_option' => $this->input->post('print_option'),
'description' => $this->input->post('description')
);
if($this->Item_kit->save($item_kit_data, $item_kit_id))
{
$success = TRUE;
$new_item = FALSE;
//New item kit
if ($item_kit_id == -1)
{
$item_kit_id = $item_kit_data['item_kit_id'];
$new_item = TRUE;
}
if($this->input->post('item_kit_item') != NULL)
if($this->input->post('item_kit_qty') != NULL)
{
$item_kit_items = array();
foreach($this->input->post('item_kit_item') as $item_id => $quantity)
foreach($this->input->post('item_kit_qty') as $item_id => $quantity)
{
$seq = $this->input->post('item_kit_seq[' . $item_id . ']');
$item_kit_items[] = array(
'item_id' => $item_id,
'quantity' => $quantity
'quantity' => $quantity,
'kit_sequence' => $seq
);
}
$success = $this->Item_kit_items->save($item_kit_items, $item_kit_id);
}
$success = $this->Item_kit_items->save($item_kit_items, $item_kit_id);
$item_kit_data = $this->xss_clean($item_kit_data);
echo json_encode(array('success' => $success,
'message' => $this->lang->line('item_kits_successful_adding').' '.$item_kit_data['name'], 'id' => $item_kit_id));
if($new_item) {
echo json_encode(array('success' => $success,
'message' => $this->lang->line('item_kits_successful_adding').' '.$item_kit_data['name'], 'id' => $item_kit_id));
} else {
echo json_encode(array('success' => $success,
'message' => $this->lang->line('item_kits_successful_updating').' '.$item_kit_data['name'], 'id' => $item_kit_id));
}
}
else//failure
{
@@ -182,7 +209,7 @@ class Item_kits extends Secure_Controller
}
$data['items'] = $result;
$barcode_config = $this->barcode_lib->get_barcode_config();
$barcode_config = $this->barcode_lib->get_barcode_config();
// in case the selected barcode type is not Code39 or Code128 we set by default Code128
// the rationale for this is that EAN codes cannot have strings as seed, so 'KIT ' is not allowed
if($barcode_config['barcode_type'] != 'Code39' && $barcode_config['barcode_type'] != 'Code128')

View File

@@ -87,8 +87,8 @@ class Items extends Secure_Controller
$config['create_thumb'] = TRUE;
$config['width'] = 52;
$config['height'] = 32;
$this->image_lib->initialize($config);
$image = $this->image_lib->resize();
$this->image_lib->initialize($config);
$image = $this->image_lib->resize();
$thumb_path = $this->image_lib->full_dst_path;
}
$this->output->set_content_type(get_mime_by_extension($thumb_path));
@@ -174,9 +174,11 @@ class Items extends Secure_Controller
{
$data['default_tax_1_rate'] = $this->config->item('default_tax_1_rate');
$data['default_tax_2_rate'] = $this->config->item('default_tax_2_rate');
$item_info->receiving_quantity = 0;
$item_info->reorder_level = 0;
$item_info->item_type = '0'; // standard
$item_info->stock_type = '0'; // stock
}
$data['item_info'] = $item_info;
@@ -197,19 +199,19 @@ class Items extends Secure_Controller
}
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$quantity = ($item_id == -1) ? 0 : $quantity;
$location_array[$location['location_id']] = array('location_name' => $location['location_name'], 'quantity' => $quantity);
$data['stock_locations'] = $location_array;
}
}
$this->load->view('items/form', $data);
}
public function inventory($item_id = -1)
{
$item_info = $this->Item->get_info($item_id);
@@ -219,16 +221,16 @@ class Items extends Secure_Controller
}
$data['item_info'] = $item_info;
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$this->load->view('items/form_inventory', $data);
}
@@ -242,16 +244,16 @@ class Items extends Secure_Controller
}
$data['item_info'] = $item_info;
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$data['stock_locations'] = array();
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$location = $this->xss_clean($location);
$quantity = $this->xss_clean($this->Item_quantity->get_item_quantity($item_id, $location['location_id'])->quantity);
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$data['stock_locations'][$location['location_id']] = $location['location_name'];
$data['item_quantities'][$location['location_id']] = $quantity;
}
$this->load->view('items/form_count_details', $data);
}
@@ -323,6 +325,8 @@ class Items extends Secure_Controller
'name' => $this->input->post('name'),
'description' => $this->input->post('description'),
'category' => $this->input->post('category'),
'item_type' => $this->input->post('item_type'),
'stock_type' => $this->input->post('stock_type'),
'supplier_id' => $this->input->post('supplier_id') == '' ? NULL : $this->input->post('supplier_id'),
'item_number' => $this->input->post('item_number') == '' ? NULL : $this->input->post('item_number'),
'cost_price' => parse_decimals($this->input->post('cost_price')),
@@ -380,45 +384,45 @@ class Items extends Secure_Controller
}
}
$success &= $this->Item_taxes->save($items_taxes_data, $item_id);
//Save item quantity
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$updated_quantity = parse_decimals($this->input->post('quantity_' . $location['location_id']));
$location_detail = array('item_id' => $item_id,
'location_id' => $location['location_id'],
'quantity' => $updated_quantity);
$item_quantity = $this->Item_quantity->get_item_quantity($item_id, $location['location_id']);
if($item_quantity->quantity != $updated_quantity || $new_item)
{
$success &= $this->Item_quantity->save($location_detail, $item_id, $location['location_id']);
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $location['location_id'],
'trans_comment' => $this->lang->line('items_manually_editing_of_quantity'),
'trans_inventory' => $updated_quantity - $item_quantity->quantity
);
$success &= $this->Inventory->insert($inv_data);
}
}
//Save item quantity
$stock_locations = $this->Stock_location->get_undeleted_all()->result_array();
foreach($stock_locations as $location)
{
$updated_quantity = parse_decimals($this->input->post('quantity_' . $location['location_id']));
$location_detail = array('item_id' => $item_id,
'location_id' => $location['location_id'],
'quantity' => $updated_quantity);
$item_quantity = $this->Item_quantity->get_item_quantity($item_id, $location['location_id']);
if($item_quantity->quantity != $updated_quantity || $new_item)
{
$success &= $this->Item_quantity->save($location_detail, $item_id, $location['location_id']);
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $location['location_id'],
'trans_comment' => $this->lang->line('items_manually_editing_of_quantity'),
'trans_inventory' => $updated_quantity - $item_quantity->quantity
);
$success &= $this->Inventory->insert($inv_data);
}
}
if($success && $upload_success)
{
$message = $this->xss_clean($this->lang->line('items_successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name']);
{
$message = $this->xss_clean($this->lang->line('items_successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name']);
echo json_encode(array('success' => TRUE, 'message' => $message, 'id' => $item_id));
}
else
{
$message = $this->xss_clean($upload_success ? $this->lang->line('items_error_adding_updating') . ' ' . $item_data['name'] : strip_tags($this->upload->display_errors()));
echo json_encode(array('success' => TRUE, 'message' => $message, 'id' => $item_id));
}
else
{
$message = $this->xss_clean($upload_success ? $this->lang->line('items_error_adding_updating') . ' ' . $item_data['name'] : strip_tags($this->upload->display_errors()));
echo json_encode(array('success' => FALSE, 'message' => $message, 'id' => $item_id));
}
echo json_encode(array('success' => FALSE, 'message' => $message, 'id' => $item_id));
}
}
else//failure
{
@@ -433,7 +437,23 @@ class Items extends Secure_Controller
$exists = $this->Item->item_number_exists($this->input->post('item_number'), $this->input->post('item_id'));
echo !$exists ? 'true' : 'false';
}
/*
If adding a new item check to see if an item kit with the same name as the item already exists.
*/
public function check_kit_exists()
{
if ($this->input->post('item_number') === -1)
{
$exists = $this->Item_kit->item_kit_exists_for_name($this->input->post('name'));
}
else
{
$exists = false;
}
echo !$exists ? 'true' : 'false';
}
private function _handle_image_upload()
{
$this->load->helper('directory');
@@ -466,7 +486,7 @@ class Items extends Secure_Controller
{
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->Item->get_info($item_id);
$location_id = $this->input->post('stock_location');
$location_id = $this->input->post('stock_location');
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
@@ -579,133 +599,133 @@ class Items extends Secure_Controller
$this->load->view('items/form_excel_import', NULL);
}
public function do_excel_import()
{
if($_FILES['file_path']['error'] != UPLOAD_ERR_OK)
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_failed')));
}
else
public function do_excel_import()
{
if($_FILES['file_path']['error'] != UPLOAD_ERR_OK)
{
if(($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== FALSE)
{
// Skip the first row as it's the table description
fgetcsv($handle);
$i = 1;
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_failed')));
}
else
{
if(($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== FALSE)
{
// Skip the first row as it's the table description
fgetcsv($handle);
$i = 1;
$failCodes = array();
while(($data = fgetcsv($handle)) !== FALSE)
{
while(($data = fgetcsv($handle)) !== FALSE)
{
// XSS file data sanity check
$data = $this->xss_clean($data);
if(sizeof($data) >= 23)
{
$item_data = array(
'name' => $data[1],
'description' => $data[11],
'category' => $data[2],
'cost_price' => $data[4],
'unit_price' => $data[5],
'reorder_level' => $data[10],
'supplier_id' => $this->Supplier->exists($data[3]) ? $data[3] : NULL,
'allow_alt_description' => $data[12] != '' ? '1' : '0',
'is_serialized' => $data[13] != '' ? '1' : '0',
'custom1' => $data[14],
'custom2' => $data[15],
'custom3' => $data[16],
'custom4' => $data[17],
'custom5' => $data[18],
'custom6' => $data[19],
'custom7' => $data[20],
'custom8' => $data[21],
'custom9' => $data[22],
'custom10' => $data[23]
);
$item_number = $data[0];
$invalidated = FALSE;
if($item_number != '')
{
$item_data['item_number'] = $item_number;
$invalidated = $this->Item->item_number_exists($item_number);
}
$item_data = array(
'name' => $data[1],
'description' => $data[11],
'category' => $data[2],
'cost_price' => $data[4],
'unit_price' => $data[5],
'reorder_level' => $data[10],
'supplier_id' => $this->Supplier->exists($data[3]) ? $data[3] : NULL,
'allow_alt_description' => $data[12] != '' ? '1' : '0',
'is_serialized' => $data[13] != '' ? '1' : '0',
'custom1' => $data[14],
'custom2' => $data[15],
'custom3' => $data[16],
'custom4' => $data[17],
'custom5' => $data[18],
'custom6' => $data[19],
'custom7' => $data[20],
'custom8' => $data[21],
'custom9' => $data[22],
'custom10' => $data[23]
);
$item_number = $data[0];
$invalidated = FALSE;
if($item_number != '')
{
$item_data['item_number'] = $item_number;
$invalidated = $this->Item->item_number_exists($item_number);
}
}
else
{
$invalidated = TRUE;
}
if(!$invalidated && $this->Item->save($item_data))
{
$items_taxes_data = NULL;
//tax 1
if(is_numeric($data[7]) && $data[6] != '')
{
$items_taxes_data[] = array('name' => $data[6], 'percent' => $data[7] );
}
if(!$invalidated && $this->Item->save($item_data))
{
$items_taxes_data = NULL;
//tax 1
if(is_numeric($data[7]) && $data[6] != '')
{
$items_taxes_data[] = array('name' => $data[6], 'percent' => $data[7] );
}
//tax 2
if(is_numeric($data[9]) && $data[8] != '')
{
$items_taxes_data[] = array('name' => $data[8], 'percent' => $data[9] );
}
//tax 2
if(is_numeric($data[9]) && $data[8] != '')
{
$items_taxes_data[] = array('name' => $data[8], 'percent' => $data[9] );
}
// save tax values
if(count($items_taxes_data) > 0)
{
$this->Item_taxes->save($items_taxes_data, $item_data['item_id']);
}
// save tax values
if(count($items_taxes_data) > 0)
{
$this->Item_taxes->save($items_taxes_data, $item_data['item_id']);
}
// quantities & inventory Info
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$emp_info = $this->Employee->get_info($employee_id);
$comment ='Qty CSV Imported';
// quantities & inventory Info
$employee_id = $this->Employee->get_logged_in_employee_info()->person_id;
$emp_info = $this->Employee->get_info($employee_id);
$comment ='Qty CSV Imported';
$cols = count($data);
$cols = count($data);
// array to store information if location got a quantity
$allowed_locations = $this->Stock_location->get_allowed_locations();
for ($col = 24; $col < $cols; $col = $col + 2)
{
$location_id = $data[$col];
if(array_key_exists($location_id, $allowed_locations))
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => $data[$col + 1],
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $location_id);
// array to store information if location got a quantity
$allowed_locations = $this->Stock_location->get_allowed_locations();
for ($col = 24; $col < $cols; $col = $col + 2)
{
$location_id = $data[$col];
if(array_key_exists($location_id, $allowed_locations))
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => $data[$col + 1],
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $location_id);
$excel_data = array(
'trans_items' => $item_data['item_id'],
'trans_user' => $employee_id,
'trans_comment' => $comment,
'trans_location' => $data[$col],
'trans_inventory' => $data[$col + 1]
);
$excel_data = array(
'trans_items' => $item_data['item_id'],
'trans_user' => $employee_id,
'trans_comment' => $comment,
'trans_location' => $data[$col],
'trans_inventory' => $data[$col + 1]
);
$this->Inventory->insert($excel_data);
unset($allowed_locations[$location_id]);
}
}
$this->Inventory->insert($excel_data);
unset($allowed_locations[$location_id]);
}
}
/*
* now iterate through the array and check for which location_id no entry into item_quantities was made yet
* those get an entry with quantity as 0.
* unfortunately a bit duplicate code from above...
*/
foreach($allowed_locations as $location_id => $location_name)
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => 0,
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $data[$col]);
/*
* now iterate through the array and check for which location_id no entry into item_quantities was made yet
* those get an entry with quantity as 0.
* unfortunately a bit duplicate code from above...
*/
foreach($allowed_locations as $location_id => $location_name)
{
$item_quantity_data = array(
'item_id' => $item_data['item_id'],
'location_id' => $location_id,
'quantity' => 0,
);
$this->Item_quantity->save($item_quantity_data, $item_data['item_id'], $data[$col]);
$excel_data = array(
$excel_data = array(
'trans_items' => $item_data['item_id'],
'trans_user' => $employee_id,
'trans_comment' => $comment,
@@ -713,16 +733,16 @@ class Items extends Secure_Controller
'trans_inventory' => 0
);
$this->Inventory->insert($excel_data);
}
}
else //insert or update item failure
{
$failCodes[] = $i;
}
$this->Inventory->insert($excel_data);
}
}
else //insert or update item failure
{
$failCodes[] = $i;
}
++$i;
}
}
if(count($failCodes) > 0)
{
@@ -737,9 +757,9 @@ class Items extends Secure_Controller
}
else
{
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_nodata_wrongformat')));
echo json_encode(array('success' => FALSE, 'message' => $this->lang->line('items_excel_import_nodata_wrongformat')));
}
}
}
}
}
?>

View File

@@ -369,21 +369,21 @@ class Reports extends Secure_Controller
$stock_locations = $data = $this->xss_clean($this->Stock_location->get_allowed_locations('sales'));
$stock_locations['all'] = $this->lang->line('reports_all');
$data['stock_locations'] = array_reverse($stock_locations, TRUE);
$data['mode'] = 'sale';
$data['mode'] = 'sale';
$this->load->view('reports/date_input', $data);
}
public function date_input_recv()
{
$data = array();
public function date_input_recv()
{
$data = array();
$stock_locations = $data = $this->xss_clean($this->Stock_location->get_allowed_locations('receivings'));
$stock_locations['all'] = $this->lang->line('reports_all');
$data['stock_locations'] = array_reverse($stock_locations, TRUE);
$data['mode'] = 'receiving';
$data['mode'] = 'receiving';
$this->load->view('reports/date_input', $data);
}
$this->load->view('reports/date_input', $data);
}
//Graphical summary sales report
public function graphical_summary_sales($start_date, $end_date, $sale_type, $location_id = 'all')
@@ -893,7 +893,7 @@ class Reports extends Secure_Controller
$this->load->view('reports/tabular_details', $data);
}
public function get_detailed_sales_row($sale_id)
public function get_detailed_sales_row($sale_id)
{
$inputs = array('sale_id' => $sale_id);
@@ -931,10 +931,11 @@ class Reports extends Secure_Controller
$this->load->model('reports/Detailed_sales');
$model = $this->Detailed_sales;
$model->create($inputs);
$headers = $this->xss_clean($model->getDataColumns());
$report_data = $model->getData($inputs);
$summary_data = array();
@@ -1041,6 +1042,7 @@ class Reports extends Secure_Controller
'employee_name' => $row['employee_name'],
'supplier_name' => $row['supplier_name'],
'total' => to_currency($row['total']),
'profit' => to_currency($row['profit']),
'payment_type' => $row['payment_type'],
'reference' => $row['reference'],
'comment' => $row['comment'],

View File

@@ -176,7 +176,7 @@ class Sales extends Secure_Controller
public function set_email_receipt()
{
$this->sale_lib->set_email_receipt($this->input->post('email_receipt'));
$this->sale_lib->set_email_receipt($this->input->post('email_receipt'));
}
// Multiple Payments
@@ -248,7 +248,7 @@ class Sales extends Secure_Controller
public function add()
{
$data = array();
$discount = 0;
// check if any discount is assigned to the selected customer
@@ -280,10 +280,36 @@ class Sales extends Secure_Controller
}
elseif($this->Item_kit->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt))
{
// Add kit item to order if one is assigned
$pieces = explode(' ', $item_id_or_number_or_item_kit_or_receipt);
$item_kit_id = $pieces[1];
$item_kit_info = $this->Item_kit->get_info($item_kit_id);
$kit_item_id = $item_kit_info->kit_item_id;
if ($kit_item_id !== '' && $kit_item_id != 0)
{
if ($item_kit_info->kit_discount_percent != 0 && $item_kit_info->kit_discount_percent > $discount)
{
$discount = $item_kit_info->kit_discount_percent;
}
if(!$this->sale_lib->add_item($kit_item_id, $quantity, $item_location, $discount))
{
$data['error'] = $this->lang->line('sales_unable_to_add_item');
}
else
{
$data['warning'] = $this->sale_lib->out_of_stock($item_id_or_number_or_item_kit_or_receipt, $item_location);
}
}
// Add kit items to order
if(!$this->sale_lib->add_item_kit($item_id_or_number_or_item_kit_or_receipt, $item_location, $discount))
{
$data['error'] = $this->lang->line('sales_unable_to_add_item');
}
}
else
{

View File

@@ -103,6 +103,7 @@ $lang["config_language"] = "Language";
$lang["config_left"] = "Left";
$lang["config_license"] = "License";
$lang["config_license_configuration"] = "License Statement";
$lang["config_line_sequence"] = "Line Sequence";
$lang["config_lines_per_page"] = "Lines Per Page";
$lang["config_lines_per_page_number"] = "";
$lang["config_lines_per_page_required"] = "The lines per page is a required field";

View File

@@ -1,21 +1,31 @@
<?php
$lang["item_kits_add_item"] = "Add Item";
$lang["item_kits_all"] = "All";
$lang["item_kits_components_only"] = "Components Only";
$lang["item_kits_cannot_be_deleted"] = "Could not delete item kit(s)";
$lang["item_kits_confirm_delete"] = "Are you sure you want to delete the selected item kits?";
$lang["item_kits_description"] = "Item Kit Description";
$lang["item_kits_discount_percent"] = "Discount Percent";
$lang["item_kits_error_adding_updating"] = "Error adding/updating Item Kit";
$lang["item_kits_find_kit_item"] = "Kit Item";
$lang["item_kits_info"] = "Item Kit Info";
$lang["item_kits_item"] = "Item";
$lang["item_kits_items"] = "Items";
$lang["item_kits_kit"] = "Kit Id";
$lang["item_kits_kit_and_stock"] = "Kit and Stock";
$lang["item_kits_kit_only"] = "Kit Only";
$lang["item_kits_name"] = "Item Kit Name";
$lang["item_kits_new"] = "New Item Kit";
$lang["item_kits_no_item_kits_to_display"] = "No item kits to display";
$lang["item_kits_none_selected"] = "You have not selected any item kits";
$lang["item_kits_one_or_multiple"] = "Item Kit(s)";
$lang["item_kits_priced_only"] = "Priced Only";
$lang["item_kits_price_option"] = "Price Option";
$lang["item_kits_print_option"] = "Print Option";
$lang["item_kits_quantity"] = "Quantity";
$lang["item_kits_successful_adding"] = "You have successfully added Item Kit";
$lang["item_kits_successful_deleted"] = "You have successfully deleted";
$lang["item_kits_successful_updating"] = "You have successfully updated Item Kit";
$lang["item_kits_update"] = "Update Item Kit";
$lang["item_kits_sequence"] = "Sequence";

View File

@@ -43,6 +43,7 @@ $lang["items_is_serialized"] = "Item has Serial Number";
$lang["items_item"] = "Item";
$lang["items_item_number"] = "UPC/EAN/ISBN";
$lang["items_item_number_duplicate"] = "The item number is already present in the database";
$lang["items_kit"] = "Kit";
$lang["items_location"] = "Location";
$lang["items_empty_upc_items"] = "Empty UPC Items";
$lang["items_low_inventory_items"] = "Out Of Stock Items";
@@ -54,6 +55,7 @@ $lang["items_no_description_items"] = "No Description Items";
$lang["items_no_items_to_display"] = "No Items to display";
$lang["items_none"] = "None";
$lang["items_none_selected"] = "You have not selected any items to edit";
$lang["items_nonstock"] = "Non-stock";
$lang["items_number_information"] = "Item Number";
$lang["items_number_required"] = "UPC/EAN/ISBN is a required field";
$lang["items_one_or_multiple"] = "item(s)";
@@ -69,6 +71,9 @@ $lang["items_sales_tax_1"] = "Sales Tax";
$lang["items_sales_tax_2"] = "Sales Tax 2";
$lang["items_search_custom_items"] = "Search Custom Fields";
$lang["items_serialized_items"] = "Serialized Items";
$lang["items_standard"] = "Standard";
$lang["items_stock"] = "Stock";
$lang["items_stock_type"] = "Stock Type";
$lang["items_stock_location"] = "Stock location";
$lang["items_successful_adding"] = "You have successfully added item";
$lang["items_successful_bulk_edit"] = "You have successfully updated the selected items";
@@ -80,6 +85,7 @@ $lang["items_tax_2"] = "Tax 2";
$lang["items_tax_percent"] = "Tax Percent";
$lang["items_tax_percent_required"] = "Tax Percent is a required field";
$lang["items_tax_percents"] = "Tax Percent(s)";
$lang["items_type"] = "Item Type";
$lang["items_unit_price"] = "Retail Price";
$lang["items_unit_price_number"] = "Unit price must be a number";
$lang["items_unit_price_required"] = "Retail Price is a required field";

View File

@@ -3,12 +3,19 @@
class Sale_lib
{
private $CI;
private $line_sequence_options = array('0' => 'Standard', '1' => 'Entry', '2' => 'Group by Type', '3' => 'Group by Category');
public function __construct()
public function __construct()
{
$this->CI =& get_instance();
}
public function get_line_sequence_options()
{
return $this->line_sequence_options;
}
public function get_cart()
{
if(!$this->CI->session->userdata('sales_cart'))
@@ -34,7 +41,7 @@ class Sale_lib
// avoid returning a NULL that results in a 0 in the comment if nothing is set/available
$comment = $this->CI->session->userdata('sales_comment');
return empty($comment) ? '' : $comment;
return empty($comment) ? '' : $comment;
}
public function set_comment($comment)
@@ -177,7 +184,7 @@ class Sale_lib
$subtotal = 0;
foreach($this->get_payments() as $payments)
{
$subtotal = bcadd($payments['payment_amount'], $subtotal);
$subtotal = bcadd($payments['payment_amount'], $subtotal);
}
return $subtotal;
@@ -192,7 +199,7 @@ class Sale_lib
$precision = $this->CI->config->item('currency_decimals');
$rounded_due = bccomp(round($amount_due, $precision, PHP_ROUND_HALF_EVEN), 0, $precision);
// take care of rounding error introduced by round tripping payment amount to the browser
return $rounded_due == 0 ? 0 : $amount_due;
return $rounded_due == 0 ? 0 : $amount_due;
}
public function get_customer()
@@ -255,40 +262,40 @@ class Sale_lib
$this->CI->session->unset_userdata('sales_mode');
}
public function get_sale_location()
{
if(!$this->CI->session->userdata('sales_location'))
{
public function get_sale_location()
{
if(!$this->CI->session->userdata('sales_location'))
{
$this->set_sale_location($this->CI->Stock_location->get_default_location_id());
}
}
return $this->CI->session->userdata('sales_location');
}
return $this->CI->session->userdata('sales_location');
}
public function set_sale_location($location)
{
$this->CI->session->set_userdata('sales_location', $location);
}
public function clear_sale_location()
{
$this->CI->session->unset_userdata('sales_location');
}
public function set_giftcard_remainder($value)
{
$this->CI->session->set_userdata('sales_giftcard_remainder', $value);
}
public function get_giftcard_remainder()
{
return $this->CI->session->userdata('sales_giftcard_remainder');
}
public function clear_giftcard_remainder()
{
$this->CI->session->unset_userdata('sales_giftcard_remainder');
}
public function set_sale_location($location)
{
$this->CI->session->set_userdata('sales_location', $location);
}
public function clear_sale_location()
{
$this->CI->session->unset_userdata('sales_location');
}
public function set_giftcard_remainder($value)
{
$this->CI->session->set_userdata('sales_giftcard_remainder', $value);
}
public function get_giftcard_remainder()
{
return $this->CI->session->userdata('sales_giftcard_remainder');
}
public function clear_giftcard_remainder()
{
$this->CI->session->unset_userdata('sales_giftcard_remainder');
}
public function add_item(&$item_id, $quantity = 1, $item_location, $discount = 0, $price = NULL, $description = NULL, $serialnumber = NULL, $include_deleted = FALSE)
{
@@ -298,7 +305,7 @@ class Sale_lib
if(empty($item_info))
{
$item_id = -1;
return FALSE;
return FALSE;
}
$item_id = $item_info->item_id;
@@ -308,20 +315,20 @@ class Sale_lib
//Get all items in the cart so far...
$items = $this->get_cart();
//We need to loop through all items in the cart.
//If the item is already there, get it's key($updatekey).
//We also need to get the next key that we are going to use in case we need to add the
//item to the cart. Since items can be deleted, we can't use a count. we use the highest key + 1.
//We need to loop through all items in the cart.
//If the item is already there, get it's key($updatekey).
//We also need to get the next key that we are going to use in case we need to add the
//item to the cart. Since items can be deleted, we can't use a count. we use the highest key + 1.
$maxkey = 0; //Highest key so far
$itemalreadyinsale = FALSE; //We did not find the item yet.
$maxkey = 0; //Highest key so far
$itemalreadyinsale = FALSE; //We did not find the item yet.
$insertkey = 0; //Key to use for new entry.
$updatekey = 0; //Key to use to update(quantity)
foreach($items as $item)
{
//We primed the loop so maxkey is 0 the first time.
//Also, we have stored the key in the element itself so we can compare.
//We primed the loop so maxkey is 0 the first time.
//Also, we have stored the key in the element itself so we can compare.
if($maxkey <= $item['line'])
{
@@ -332,10 +339,10 @@ class Sale_lib
{
$itemalreadyinsale = TRUE;
$updatekey = $item['line'];
if(!$item_info->is_serialized)
{
$quantity = bcadd($quantity, $items[$updatekey]['quantity']);
}
if(!$item_info->is_serialized)
{
$quantity = bcadd($quantity, $items[$updatekey]['quantity']);
}
}
}
@@ -343,39 +350,39 @@ class Sale_lib
//array/cart records are identified by $insertkey and item_id is just another field.
$price = $price != NULL ? $price : $item_info->unit_price;
$total = $this->get_item_total($quantity, $price, $discount);
$discounted_total = $this->get_item_total($quantity, $price, $discount, TRUE);
$discounted_total = $this->get_item_total($quantity, $price, $discount, TRUE);
//Item already exists and is not serialized, add to quantity
if(!$itemalreadyinsale || $item_info->is_serialized)
{
$item = array($insertkey => array(
'item_id' => $item_id,
'item_location' => $item_location,
'stock_name' => $this->CI->Stock_location->get_location_name($item_location),
'line' => $insertkey,
'name' => $item_info->name,
'item_number' => $item_info->item_number,
'description' => $description != NULL ? $description : $item_info->description,
'serialnumber' => $serialnumber != NULL ? $serialnumber : '',
'allow_alt_description' => $item_info->allow_alt_description,
'is_serialized' => $item_info->is_serialized,
'quantity' => $quantity,
'discount' => $discount,
'in_stock' => $this->CI->Item_quantity->get_item_quantity($item_id, $item_location)->quantity,
'price' => $price,
'total' => $total,
'discounted_total' => $discounted_total,
)
);
$item = array($insertkey => array(
'item_id' => $item_id,
'item_location' => $item_location,
'stock_name' => $this->CI->Stock_location->get_location_name($item_location),
'line' => $insertkey,
'name' => $item_info->name,
'item_number' => $item_info->item_number,
'description' => $description != NULL ? $description : $item_info->description,
'serialnumber' => $serialnumber != NULL ? $serialnumber : '',
'allow_alt_description' => $item_info->allow_alt_description,
'is_serialized' => $item_info->is_serialized,
'quantity' => $quantity,
'discount' => $discount,
'in_stock' => $this->CI->Item_quantity->get_item_quantity($item_id, $item_location)->quantity,
'price' => $price,
'total' => $total,
'discounted_total' => $discounted_total,
)
);
//add to existing array
$items += $item;
}
else
{
$line = &$items[$updatekey];
$line['quantity'] = $quantity;
$line['total'] = $total;
$line['discounted_total'] = $discounted_total;
}
else
{
$line = &$items[$updatekey];
$line['quantity'] = $quantity;
$line['total'] = $total;
$line['discounted_total'] = $discounted_total;
}
$this->set_cart($items);
@@ -387,16 +394,20 @@ class Sale_lib
//make sure item exists
if($item_id != -1)
{
$item_quantity = $this->CI->Item_quantity->get_item_quantity($item_id, $item_location)->quantity;
$quantity_added = $this->get_quantity_already_added($item_id, $item_location);
$item_info = $this->CI->Item->get_info_by_id_or_number($item_id);
if($item_quantity - $quantity_added < 0)
{
return $this->CI->lang->line('sales_quantity_less_than_zero');
}
elseif($item_quantity - $quantity_added < $this->CI->Item->get_info_by_id_or_number($item_id)->reorder_level)
{
return $this->CI->lang->line('sales_quantity_less_than_reorder_level');
if ($item_info->stock_type === 0) {
$item_quantity = $this->CI->Item_quantity->get_item_quantity($item_id, $item_location)->quantity;
$quantity_added = $this->get_quantity_already_added($item_id, $item_location);
if($item_quantity - $quantity_added < 0)
{
return $this->CI->lang->line('sales_quantity_less_than_zero');
}
elseif($item_quantity - $quantity_added < $item_info->reorder_level)
{
return $this->CI->lang->line('sales_quantity_less_than_reorder_level');
}
}
}
@@ -468,7 +479,7 @@ class Sale_lib
$this->empty_cart();
$this->remove_customer();
foreach($this->CI->Sale->get_sale_items($sale_id)->result() as $row)
foreach($this->CI->Sale->get_sale_items_ordered($sale_id)->result() as $row)
{
$this->add_item($row->item_id, -$row->quantity_purchased, $row->item_location, $row->discount_percent, $row->item_unit_price, $row->description, $row->serialnumber, TRUE);
}
@@ -496,7 +507,7 @@ class Sale_lib
$this->empty_cart();
$this->remove_customer();
foreach($this->CI->Sale->get_sale_items($sale_id)->result() as $row)
foreach($this->CI->Sale->get_sale_items_ordered($sale_id)->result() as $row)
{
$this->add_item($row->item_id, $row->quantity_purchased, $row->item_location, $row->discount_percent, $row->item_unit_price, $row->description, $row->serialnumber, TRUE);
}
@@ -704,7 +715,6 @@ class Sale_lib
return $total;
}
}
?>

View File

@@ -60,13 +60,58 @@ class Item extends CI_Model
*/
public function search($search, $filters, $rows = 0, $limit_from = 0, $sort = 'items.name', $order = 'asc')
{
$this->db->from('items');
$this->db->join('suppliers', 'suppliers.person_id = items.supplier_id', 'left');
$this->db->join('inventory', 'inventory.trans_items = items.item_id');
$this->db->select('max(items.name) as name');
$this->db->select('max(items.category) as category');
$this->db->select('max(items.supplier_id) as supplier_id');
$this->db->select('max(items.item_number) as item_number');
$this->db->select('max(items.description) as description');
$this->db->select('max(items.cost_price) as cost_price');
$this->db->select('max(items.unit_price) as unit_price');
$this->db->select('max(items.reorder_level) as reorder_level');
$this->db->select('max(items.receiving_quantity) as receiving_quantity');
$this->db->select('items.item_id as item_id');
$this->db->select('max(items.pic_id) as pic_id');
$this->db->select('max(items.allow_alt_description) as allow_alt_description');
$this->db->select('max(items.is_serialized) as is_serialized');
$this->db->select('max(items.deleted) as deleted');
$this->db->select('max(items.custom1) as custom1');
$this->db->select('max(items.custom2) as custom2');
$this->db->select('max(items.custom3) as custom3');
$this->db->select('max(items.custom4) as custom4');
$this->db->select('max(items.custom5) as custom5');
$this->db->select('max(items.custom6) as custom6');
$this->db->select('max(items.custom7) as custom7');
$this->db->select('max(items.custom8) as custom8');
$this->db->select('max(items.custom9) as custom9');
$this->db->select('max(items.custom10) as custom10');
$this->db->select('max(suppliers.person_id) as person_id');
$this->db->select('max(suppliers.company_name) as company_name');
$this->db->select('max(suppliers.agency_name) as agency_name');
$this->db->select('max(suppliers.account_number) as account_number');
$this->db->select('max(suppliers.deleted) as deleted');
$this->db->select('max(inventory.trans_id) as trans_id');
$this->db->select('max(inventory.trans_items) as trans_items');
$this->db->select('max(inventory.trans_user) as trans_user');
$this->db->select('max(inventory.trans_date) as trans_date');
$this->db->select('max(inventory.trans_comment) as trans_comment');
$this->db->select('max(inventory.trans_location) as trans_location');
$this->db->select('max(inventory.trans_inventory) as trans_inventory');
if($filters['stock_location_id'] > -1) {
$this->db->select('max(item_quantities.item_id) as qty_item_id');
$this->db->select('max(item_quantities.location_id) as location_id');
$this->db->select('sum(item_quantities.quantity) as quantity');
}
$this->db->from('items as items');
$this->db->join('suppliers as suppliers', 'suppliers.person_id = items.supplier_id', 'left');
$this->db->join('inventory as inventory', 'inventory.trans_items = items.item_id');
if($filters['stock_location_id'] > -1)
{
$this->db->join('item_quantities', 'item_quantities.item_id = items.item_id');
$this->db->join('item_quantities as item_quantities', 'item_quantities.item_id = items.item_id');
$this->db->where('location_id', $filters['stock_location_id']);
}
@@ -122,18 +167,18 @@ class Item extends CI_Model
// avoid duplicated entries with same name because of inventory reporting multiple changes on the same item in the same date range
$this->db->group_by('items.item_id');
// order by name of item
$this->db->order_by($sort, $order);
if($rows > 0)
{
if($rows > 0)
{
$this->db->limit($rows, $limit_from);
}
return $this->db->get();
}
/*
Returns all the items
*/
@@ -192,7 +237,7 @@ class Item extends CI_Model
return $item_obj;
}
}
/*
Gets information about a particular item by item id or number
*/
@@ -200,17 +245,17 @@ class Item extends CI_Model
{
$this->db->from('items');
if (ctype_digit($item_id))
{
$this->db->group_start();
$this->db->where('item_id', (int) $item_id);
$this->db->or_where('items.item_number', $item_id);
$this->db->group_end();
}
else
{
$this->db->where('item_number', $item_id);
}
if (ctype_digit($item_id))
{
$this->db->group_start();
$this->db->where('item_id', (int) $item_id);
$this->db->or_where('items.item_number', $item_id);
$this->db->group_end();
}
else
{
$this->db->where('item_number', $item_id);
}
$this->db->where('items.deleted', 0);
@@ -236,7 +281,7 @@ class Item extends CI_Model
{
$this->db->where('items.deleted', $deleted);
}
$query = $this->db->get();
if($query->num_rows() == 1)
@@ -277,7 +322,7 @@ class Item extends CI_Model
return FALSE;
}
$this->db->where('item_id', $item_id);
return $this->db->update('items', $item_data);
@@ -305,14 +350,14 @@ class Item extends CI_Model
$this->Item_quantity->reset_quantity($item_id);
$this->db->where('item_id', $item_id);
$success = $this->db->update('items', array('deleted'=>1));
$this->db->trans_complete();
$success &= $this->db->trans_status();
return $success;
}
/*
Undeletes one item
*/
@@ -335,13 +380,13 @@ class Item extends CI_Model
$this->Item_quantity->reset_quantity_list($item_ids);
$this->db->where_in('item_id', $item_ids);
$success = $this->db->update('items', array('deleted'=>1));
$this->db->trans_complete();
$success &= $this->db->trans_status();
return $success;
}
}
public function get_search_suggestions($search, $filters = array('is_deleted' => FALSE, 'search_custom' => FALSE), $unique = FALSE, $limit = 25)
{
@@ -350,6 +395,7 @@ class Item extends CI_Model
$this->db->select('item_id, name');
$this->db->from('items');
$this->db->where('deleted', $filters['is_deleted']);
$this->db->where("item_type = '0'"); // standard, exclude kit items since kits will be picked up later
$this->db->like('name', $search);
$this->db->order_by('name', 'asc');
foreach($this->db->get()->result() as $row)
@@ -458,7 +504,7 @@ class Item extends CI_Model
return $suggestions;
}
public function get_location_suggestions($search)
{
$suggestions = array();
@@ -472,7 +518,7 @@ class Item extends CI_Model
{
$suggestions[] = array('label' => $row->location);
}
return $suggestions;
}
@@ -490,7 +536,7 @@ class Item extends CI_Model
$row_array = (array) $row;
$suggestions[] = array('label' => $row_array['custom'.$field_no]);
}
return $suggestions;
}

View File

@@ -46,7 +46,41 @@ class Item_kit extends CI_Model
*/
public function get_info($item_kit_id)
{
$this->db->from('item_kits');
$this->db->select('
item_kit_id,
item_kits.name as name,
items.name as item_name,
item_kits.description,
items.description as item_description,
item_kits.item_id as kit_item_id,
kit_discount_percent,
price_option,
print_option,
category,
supplier_id,
item_number,
cost_price,
unit_price,
reorder_level,
receiving_quantity,
pic_id,
allow_alt_description,
is_serialized,
deleted,
custom1,
custom2,
custom3,
custom4,
custom5,
custom6,
custom7,
custom8,
custom9,
custom10,
item_type');
$this->db->from('item_kits');
$this->db->join('items', 'item_kits.item_id = items.item_id', 'left');
$this->db->where('item_kit_id', $item_kit_id);
$query = $this->db->get();
@@ -120,7 +154,7 @@ class Item_kit extends CI_Model
$this->db->where_in('item_kit_id', $item_kit_ids);
return $this->db->delete('item_kits');
}
}
public function get_search_suggestions($search, $limit = 25)
{

View File

@@ -8,29 +8,44 @@ class Item_kit_items extends CI_Model
{
$this->db->from('item_kit_items');
$this->db->where('item_kit_id', $item_kit_id);
$this->db->order_by('kit_sequence', 'asc');
//return an array of item kit items for an item
return $this->db->get()->result_array();
}
/*
Gets item kit items for a particular item kit
*/
public function get_info_for_sale($item_kit_id)
{
$this->db->from('item_kit_items');
$this->db->where('item_kit_id', $item_kit_id);
$this->db->order_by('kit_sequence', 'desc');
//return an array of item kit items for an item
return $this->db->get()->result_array();
}
/*
Inserts or updates an item kit's items
*/
public function save(&$item_kit_items_data, $item_kit_id)
{
$success = TRUE;
//Run these queries as a transaction, we want to make sure we do all or nothing
$this->db->trans_start();
$this->delete($item_kit_id);
foreach($item_kit_items_data as $row)
{
$row['item_kit_id'] = $item_kit_id;
$success &= $this->db->insert('item_kit_items', $row);
if ($item_kit_items_data != NULL) {
foreach ($item_kit_items_data as $row) {
$row['item_kit_id'] = $item_kit_id;
$success &= $this->db->insert('item_kit_items', $row);
}
}
$this->db->trans_complete();
$success &= $this->db->trans_status();

View File

@@ -2,7 +2,7 @@
class Receiving extends CI_Model
{
public function get_info($receiving_id)
{
{
$this->db->from('receivings');
$this->db->join('people', 'people.person_id = receivings.supplier_id', 'LEFT');
$this->db->join('suppliers', 'suppliers.person_id = receivings.supplier_id', 'LEFT');
@@ -30,7 +30,7 @@ class Receiving extends CI_Model
{
return $this->exists($pieces[1]);
}
else
else
{
return $this->get_receiving_by_reference($receipt_receiving_id)->num_rows() > 0;
}
@@ -46,7 +46,7 @@ class Receiving extends CI_Model
return ($this->db->get()->num_rows() == 1);
}
public function update($receiving_data, $receiving_id)
{
$this->db->where('receiving_id', $receiving_id);
@@ -106,8 +106,8 @@ class Receiving extends CI_Model
//Update stock quantity
$item_quantity = $this->Item_quantity->get_item_quantity($item['item_id'], $item['item_location']);
$this->Item_quantity->save(array('quantity' => $item_quantity->quantity + $items_received, 'item_id' => $item['item_id'],
'location_id' => $item['item_location']), $item['item_id'], $item['item_location']);
$this->Item_quantity->save(array('quantity' => $item_quantity->quantity + $items_received, 'item_id' => $item['item_id'],
'location_id' => $item['item_location']), $item['item_id'], $item['item_location']);
$recv_remarks = 'RECV ' . $receiving_id;
$inv_data = array(
@@ -125,7 +125,7 @@ class Receiving extends CI_Model
}
$this->db->trans_complete();
if($this->db->trans_status() === FALSE)
{
return -1;
@@ -133,7 +133,7 @@ class Receiving extends CI_Model
return $receiving_id;
}
public function delete_list($receiving_ids, $employee_id, $update_inventory = TRUE)
{
$success = TRUE;
@@ -153,7 +153,7 @@ class Receiving extends CI_Model
return $success;
}
public function delete($receiving_id, $employee_id, $update_inventory = TRUE)
{
// start a transaction to assure data integrity
@@ -233,33 +233,32 @@ class Receiving extends CI_Model
{
$where = 'WHERE receivings_items.receiving_id = ' . $this->db->escape($inputs['receiving_id']);
}
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('receivings_items_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('receivings_items_temp') .
' (INDEX(receiving_date), INDEX(receiving_id))
(
SELECT
DATE(receiving_time) AS receiving_date,
receiving_time,
( SELECT
MAX(DATE(receiving_time)) AS receiving_date,
MAX(receiving_time) AS receiving_time,
receivings_items.receiving_id,
comment,
item_location,
reference,
payment_type,
employee_id,
MAX(comment) AS comment,
MAX(item_location) AS item_location,
MAX(reference) AS reference,
MAX(payment_type) AS payment_type,
MAX(employee_id) AS employee_id,
items.item_id,
receivings.supplier_id,
quantity_purchased,
receivings_items.receiving_quantity,
item_cost_price,
item_unit_price,
discount_percent,
MAX(receivings.supplier_id) AS supplier_id,
SUM(quantity_purchased) AS quantity_purchased,
SUM(receivings_items.receiving_quantity) AS receiving_quantity,
MAX(item_cost_price) AS item_cost_price,
MAX(item_unit_price) AS item_unit_price,
MAX(discount_percent) AS discount_percent,
receivings_items.line,
serialnumber,
receivings_items.description,
(item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) AS subtotal,
(item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) AS total,
(item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) - (item_cost_price * quantity_purchased) AS profit,
(item_cost_price * quantity_purchased) AS cost
MAX(serialnumber) AS serialnumber,
MAX(receivings_items.description) AS description,
SUM(item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) AS subtotal,
SUM(item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) AS total,
SUM((item_unit_price * quantity_purchased - item_unit_price * quantity_purchased * discount_percent / 100) - (item_cost_price * quantity_purchased)) AS profit,
SUM(item_cost_price * quantity_purchased) AS cost
FROM ' . $this->db->dbprefix('receivings_items') . ' AS receivings_items
INNER JOIN ' . $this->db->dbprefix('receivings') . ' AS receivings
ON receivings_items.receiving_id = receivings.receiving_id

View File

@@ -5,7 +5,7 @@ class Sale extends CI_Model
{
// NOTE: temporary tables are created to speed up searches due to the fact that are ortogonal to the main query
// create a temporary table to contain all the payments per sale item
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
'(
SELECT payments.sale_id AS sale_id,
IFNULL(SUM(payments.payment_amount), 0) AS sale_payment_amount,
@@ -19,7 +19,7 @@ class Sale extends CI_Model
);
// create a temporary table to contain all the sum of taxes per sale item
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_taxes_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_taxes_temp') .
'(
SELECT sales_items_taxes.sale_id AS sale_id,
sales_items_taxes.item_id AS item_id,
@@ -51,23 +51,23 @@ class Sale extends CI_Model
$this->db->select('
sales.sale_id AS sale_id,
DATE(sales.sale_time) AS sale_date,
sales.sale_time AS sale_time,
sales.comment AS comment,
sales.invoice_number AS invoice_number,
sales.employee_id AS employee_id,
sales.customer_id AS customer_id,
CONCAT(customer_p.first_name, " ", customer_p.last_name) AS customer_name,
customer_p.first_name AS first_name,
customer_p.last_name AS last_name,
customer_p.email AS email,
customer_p.comments AS comments,
MAX(DATE(sales.sale_time)) AS sale_date,
MAX(sales.sale_time) AS sale_time,
MAX(sales.comment) AS comment,
MAX(sales.invoice_number) AS invoice_number,
MAX(sales.employee_id) AS employee_id,
MAX(sales.customer_id) AS customer_id,
MAX(CONCAT(customer_p.first_name, " ", customer_p.last_name)) AS customer_name,
MAX(customer_p.first_name) AS first_name,
MAX(customer_p.last_name) AS last_name,
MAX(customer_p.email) AS email,
MAX(customer_p.comments) AS comments,
' . "
IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals)) AS amount_due,
payments.sale_payment_amount AS amount_tendered,
(payments.sale_payment_amount - IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals))) AS change_due,
SUM(payments.sale_payment_amount) AS amount_tendered,
(SUM(payments.sale_payment_amount) - IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals))) AS change_due,
" . '
payments.payment_type AS payment_type
MAX(payments.payment_type) AS payment_type
');
$this->db->from('sales_items AS sales_items');
@@ -100,7 +100,7 @@ class Sale extends CI_Model
{
// NOTE: temporary tables are created to speed up searches due to the fact that are ortogonal to the main query
// create a temporary table to contain all the payments per sale item
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
' (PRIMARY KEY(sale_id), INDEX(sale_id))
(
SELECT payments.sale_id AS sale_id,
@@ -115,7 +115,7 @@ class Sale extends CI_Model
);
// create a temporary table to contain all the sum of taxes per sale item
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_taxes_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_taxes_temp') .
' (INDEX(sale_id), INDEX(item_id))
(
SELECT sales_items_taxes.sale_id AS sale_id,
@@ -150,12 +150,12 @@ class Sale extends CI_Model
$this->db->select('
sales.sale_id AS sale_id,
DATE(sales.sale_time) AS sale_date,
sales.sale_time AS sale_time,
sales.invoice_number AS invoice_number,
MAX(DATE(sales.sale_time)) AS sale_date,
MAX(sales.sale_time) AS sale_time,
MAX(sales.invoice_number) AS invoice_number,
SUM(sales_items.quantity_purchased) AS items_purchased,
CONCAT(customer_p.first_name, " ", customer_p.last_name) AS customer_name,
customer.company_name AS company_name,
MAX(CONCAT(customer_p.first_name, " ", customer_p.last_name)) as customer_name,
MAX(customer.company_name) AS company_name,
' . "
ROUND($sale_subtotal, $decimals) AS subtotal,
IFNULL(ROUND($sale_tax, $decimals), 0) AS tax,
@@ -163,10 +163,10 @@ class Sale extends CI_Model
ROUND($sale_cost, $decimals) AS cost,
ROUND($sale_total - IFNULL($sale_tax, 0) - $sale_cost, $decimals) AS profit,
IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals)) AS amount_due,
payments.sale_payment_amount AS amount_tendered,
(payments.sale_payment_amount - IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals))) AS change_due,
SUM(payments.sale_payment_amount) AS amount_tendered,
(SUM(payments.sale_payment_amount) - IFNULL(ROUND($sale_total, $decimals), ROUND($sale_subtotal, $decimals))) AS change_due,
" . '
payments.payment_type AS payment_type
MAX(payments.payment_type) AS payment_type
');
$this->db->from('sales_items AS sales_items');
@@ -186,7 +186,7 @@ class Sale extends CI_Model
$this->db->where('sales.sale_id', $pieces[1]);
}
else
{
{
$this->db->group_start();
// customer last name
$this->db->like('customer_p.last_name', $search);
@@ -206,13 +206,13 @@ class Sale extends CI_Model
}
if($filters['sale_type'] == 'sales')
{
$this->db->where('sales_items.quantity_purchased > 0');
}
elseif($filters['sale_type'] == 'returns')
{
$this->db->where('sales_items.quantity_purchased < 0');
}
{
$this->db->where('sales_items.quantity_purchased > 0');
}
elseif($filters['sale_type'] == 'returns')
{
$this->db->where('sales_items.quantity_purchased < 0');
}
if($filters['only_invoices'] != FALSE)
{
@@ -287,7 +287,7 @@ class Sale extends CI_Model
{
$this->db->where('invoice_number IS NOT NULL');
}
if($filters['only_cash'] != FALSE)
{
$this->db->like('payment_type', $this->lang->line('sales_cash'), 'after');
@@ -378,7 +378,7 @@ class Sale extends CI_Model
return $this->db->get();
}
public function get_invoice_number_for_year($year = '', $start_from = 0)
public function get_invoice_number_for_year($year = '', $start_from = 0)
{
$year = $year == '' ? date('Y') : $year;
$this->db->select('COUNT( 1 ) AS invoice_number_year');
@@ -389,7 +389,7 @@ class Sale extends CI_Model
return ($start_from + $result['invoice_number_year']);
}
public function is_valid_receipt(&$receipt_sale_id)
{
if(!empty($receipt_sale_id))
@@ -434,7 +434,7 @@ class Sale extends CI_Model
{
//Run these queries as a transaction, we want to make sure we do all or nothing
$this->db->trans_start();
// first delete all payments
$this->db->delete('sales_payments', array('sale_id' => $sale_id));
@@ -449,12 +449,12 @@ class Sale extends CI_Model
$success = $this->db->insert('sales_payments', $sales_payments_data);
}
$this->db->trans_complete();
$success &= $this->db->trans_status();
}
return $success;
}
@@ -516,33 +516,40 @@ class Sale extends CI_Model
$this->db->insert('sales_items', $sales_items_data);
// Update stock quantity
$item_quantity = $this->Item_quantity->get_item_quantity($item['item_id'], $item['item_location']);
$this->Item_quantity->save(array('quantity' => $item_quantity->quantity - $item['quantity'],
'item_id' => $item['item_id'],
'location_id' => $item['item_location']), $item['item_id'], $item['item_location']);
if ($cur_item_info->stock_type === '0')
{
// Update stock quantity if item type is not non-stock
$item_quantity = $this->Item_quantity->get_item_quantity($item['item_id'], $item['item_location']);
$this->Item_quantity->save(array('quantity' => $item_quantity->quantity - $item['quantity'],
'item_id' => $item['item_id'],
'location_id' => $item['item_location']), $item['item_id'], $item['item_location']);
}
// if an items was deleted but later returned it's restored with this rule
if($item['quantity'] < 0)
{
$this->Item->undelete($item['item_id']);
}
// Inventory Count Details
$sale_remarks = 'POS '.$sale_id;
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item['item_id'],
'trans_user' => $employee_id,
'trans_location' => $item['item_location'],
'trans_comment' => $sale_remarks,
'trans_inventory' => -$item['quantity']
);
$this->Inventory->insert($inv_data);
if ($cur_item_info->stock_type === '0')
{
// Inventory Count Details
$sale_remarks = 'POS ' . $sale_id;
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item['item_id'],
'trans_user' => $employee_id,
'trans_location' => $item['item_location'],
'trans_comment' => $sale_remarks,
'trans_inventory' => -$item['quantity']
);
$this->Inventory->insert($inv_data);
}
$customer = $this->Customer->get_info($customer_id);
if($customer_id == -1 || $customer->taxable)
{
if($customer_id == -1 || $customer->taxable)
{
foreach($this->Item_taxes->get_info($item['item_id']) as $row)
{
$this->db->insert('sales_items_taxes', array(
@@ -557,16 +564,16 @@ class Sale extends CI_Model
}
$this->db->trans_complete();
if($this->db->trans_status() === FALSE)
{
return -1;
}
return $sale_id;
}
public function delete_list($sale_ids, $employee_id, $update_inventory = TRUE)
public function delete_list($sale_ids, $employee_id, $update_inventory = TRUE)
{
$result = TRUE;
@@ -578,7 +585,7 @@ class Sale extends CI_Model
return $result;
}
public function delete($sale_id, $employee_id, $update_inventory = TRUE)
public function delete($sale_id, $employee_id, $update_inventory = TRUE)
{
// start a transaction to assure data integrity
$this->db->trans_start();
@@ -595,20 +602,24 @@ class Sale extends CI_Model
$items = $this->get_sale_items($sale_id)->result_array();
foreach($items as $item)
{
// create query to update inventory tracking
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item['item_id'],
'trans_user' => $employee_id,
'trans_comment' => 'Deleting sale ' . $sale_id,
'trans_location' => $item['item_location'],
'trans_inventory' => $item['quantity_purchased']
);
// update inventory
$this->Inventory->insert($inv_data);
$cur_item_info = $this->Item->get_info($item['item_id']);
// update quantities
$this->Item_quantity->change_quantity($item['item_id'], $item['item_location'], $item['quantity_purchased']);
if ($cur_item_info->stock_type === '0') {
// create query to update inventory tracking
$inv_data = array(
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item['item_id'],
'trans_user' => $employee_id,
'trans_comment' => 'Deleting sale ' . $sale_id,
'trans_location' => $item['item_location'],
'trans_inventory' => $item['quantity_purchased']
);
// update inventory
$this->Inventory->insert($inv_data);
// update quantities
$this->Item_quantity->change_quantity($item['item_id'], $item['item_location'], $item['quantity_purchased']);
}
}
}
@@ -619,7 +630,7 @@ class Sale extends CI_Model
// execute transaction
$this->db->trans_complete();
return $this->db->trans_status();
}
@@ -631,6 +642,59 @@ class Sale extends CI_Model
return $this->db->get();
}
/*
* Used by the invoice and receipt programs
*/
public function get_sale_items_ordered($sale_id)
{
$this->db->select('
sale_id,
sales_items.item_id,
sales_items.description,
serialnumber,
line,
quantity_purchased,
item_cost_price,
item_unit_price,
discount_percent,
item_location,
items.name as name,
category,
item_type');
$this->db->from('sales_items as sales_items');
$this->db->join('items as items', 'sales_items.item_id = items.item_id');
$this->db->where('sale_id', $sale_id);
// Entry sequence (this will render kits in the expected sequence)
if($this->config->item('line_sequence') == '1')
{
$this->db->order_by('line', 'asc');
}
// Group by Stock Type (nonstock first - type 1, stock next - type 0)
elseif($this->config->item('line_sequence') == '2')
{
$this->db->order_by('stock_type', 'desc');
$this->db->order_by('sales_items.description', 'asc');
$this->db->order_by('items.name', 'asc');
}
// Group by Item Category
elseif($this->config->item('line_sequence') == '3')
{
$this->db->order_by('category', 'asc');
$this->db->order_by('sales_items.description', 'asc');
$this->db->order_by('items.name', 'asc');
}
// Group by entry sequence in descending sequence (the Standard)
else
{
$this->db->order_by('line', 'desc');
}
return $this->db->get();
}
public function get_sale_payments($sale_id)
{
$this->db->from('sales_payments');
@@ -642,7 +706,7 @@ class Sale extends CI_Model
public function get_payment_options($giftcard = TRUE)
{
$payments = array();
if($this->config->item('payment_options_order') == 'debitcreditcash')
{
$payments[$this->lang->line('sales_debit')] = $this->lang->line('sales_debit');
@@ -696,7 +760,7 @@ class Sale extends CI_Model
{
$this->db->where('sale_id !=', $sale_id);
}
return ($this->db->get()->num_rows() == 1);
}
@@ -706,7 +770,7 @@ class Sale extends CI_Model
{
return 0;
}
$this->db->from('giftcards');
$this->db->where('giftcard_number', $giftcardNumber);
@@ -743,7 +807,7 @@ class Sale extends CI_Model
}
// create a temporary table to contain all the payment types and amount
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_payments_temp') .
' (PRIMARY KEY(sale_id), INDEX(sale_id))
(
SELECT payments.sale_id AS sale_id,
@@ -759,38 +823,38 @@ class Sale extends CI_Model
)'
);
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_temp') .
$this->db->query('CREATE TEMPORARY TABLE IF NOT EXISTS ' . $this->db->dbprefix('sales_items_temp') .
' (INDEX(sale_date), INDEX(sale_id))
(
SELECT
DATE(sales.sale_time) AS sale_date,
sales.sale_time,
MAX(DATE(sales.sale_time)) AS sale_date,
MAX(sales.sale_time) AS sale_time,
sales.sale_id,
sales.comment,
sales.invoice_number,
sales.customer_id,
CONCAT(customer_p.first_name, " ", customer_p.last_name) AS customer_name,
customer_p.first_name AS customer_first_name,
customer_p.last_name AS customer_last_name,
customer_p.email AS customer_email,
customer_p.comments AS customer_comments,
customer.company_name AS customer_company_name,
sales.employee_id,
CONCAT(employee.first_name, " ", employee.last_name) AS employee_name,
MAX(sales.comment) AS comment,
MAX(sales.invoice_number) AS invoice_number,
MAX(sales.customer_id) AS customer_id,
MAX(CONCAT(customer_p.first_name, " ", customer_p.last_name)) AS customer_name,
MAX(customer_p.first_name) AS customer_first_name,
MAX(customer_p.last_name) AS customer_last_name,
MAX(customer_p.email) AS customer_email,
MAX(customer_p.comments) AS customer_comments,
MAX(customer.company_name) AS customer_company_name,
MAX(sales.employee_id) AS employee_id,
MAX(CONCAT(employee.first_name, " ", employee.last_name)) AS employee_name,
items.item_id,
items.name,
items.category,
items.supplier_id,
sales_items.quantity_purchased,
sales_items.item_cost_price,
sales_items.item_unit_price,
sales_items.discount_percent,
MAX(items.name) AS name,
MAX(items.category) AS category,
MAX(items.supplier_id) AS supplier_id,
SUM(sales_items.quantity_purchased) AS quantity_purchased,
MAX(sales_items.item_cost_price) AS item_cost_price,
MAX(sales_items.item_unit_price) AS item_unit_price,
MAX(sales_items.discount_percent) AS discount_percent,
sales_items.line,
sales_items.serialnumber,
sales_items.item_location,
sales_items.description,
payments.payment_type,
payments.sale_payment_amount,
MAX(sales_items.serialnumber) AS serialnumber,
MAX(sales_items.item_location) AS item_location,
MAX(sales_items.description) AS description,
MAX(payments.payment_type) AS payment_type,
SUM(payments.sale_payment_amount) AS sale_payment_amount,
IFNULL(SUM(sales_items_taxes.percent), 0) AS item_tax_percent,
' . "
ROUND($sale_subtotal, $decimals) AS subtotal,

View File

@@ -14,7 +14,7 @@ class Detailed_receivings extends Report
//Create our temp tables to work with the data in our report
$this->Receiving->create_temp_table($inputs);
}
public function getDataColumns()
{
$columns = array(
@@ -26,8 +26,8 @@ class Detailed_receivings extends Report
array('supplier' => $this->lang->line('reports_supplied_by')),
array('total' => $this->lang->line('reports_total'), 'sorter' => 'number_sorter'),
array('payment_type' => $this->lang->line('reports_payment_type')),
array('reference' => $this->lang->line('receivings_reference')),
array('comment' => $this->lang->line('reports_comments'))),
array('comment' => $this->lang->line('reports_comments')),
array('reference' => $this->lang->line('receivings_reference'))),
'details' => array(
$this->lang->line('reports_item_number'),
$this->lang->line('reports_name'),
@@ -39,24 +39,45 @@ class Detailed_receivings extends Report
return $columns;
}
public function getDataByReceivingId($receiving_id)
{
$this->db->select('receiving_id, receiving_date, SUM(quantity_purchased) AS items_purchased, CONCAT(employee.first_name, " ", employee.last_name) AS employee_name, supplier.company_name AS supplier_name, SUM(subtotal) AS subtotal, SUM(total) AS total, SUM(profit) AS profit, payment_type, comment, reference');
$this->db->select('receiving_id,
MAX(receiving_date) as receiving_date,
SUM(quantity_purchased) AS items_purchased,
MAX(CONCAT(employee.first_name, " ", employee.last_name)) AS employee_name,
MAX(supplier.company_name) AS supplier_name,
SUM(subtotal) AS subtotal,
SUM(total) AS total,
SUM(profit) AS profit,
MAX(payment_type) as payment_type,
MAX(comment) as comment,
MAX(reference) as reference');
$this->db->from('receivings_items_temp');
$this->db->join('people AS employee', 'receivings_items_temp.employee_id = employee.person_id');
$this->db->join('suppliers AS supplier', 'receivings_items_temp.supplier_id = supplier.person_id', 'left');
$this->db->where('receiving_id', $receiving_id);
$this->db->group_by('receiving_id');
return $this->db->get()->row_array();
}
public function getData(array $inputs)
{
$this->db->select('receiving_id, receiving_date, SUM(quantity_purchased) AS items_purchased, CONCAT(employee.first_name," ",employee.last_name) AS employee_name, supplier.company_name AS supplier_name, SUM(total) AS total, SUM(profit) AS profit, payment_type, comment, reference');
$this->db->from('receivings_items_temp');
$this->db->join('people AS employee', 'receivings_items_temp.employee_id = employee.person_id');
$this->db->join('suppliers AS supplier', 'receivings_items_temp.supplier_id = supplier.person_id', 'left');
return $this->db->get()->row_array();
}
public function getData(array $inputs)
{
$this->db->select('receiving_id,
MAX(receiving_date) as receiving_date,
SUM(quantity_purchased) AS items_purchased,
MAX(CONCAT(employee.first_name," ",employee.last_name)) AS employee_name,
MAX(supplier.company_name) AS supplier_name,
SUM(total) AS total,
SUM(profit) AS profit,
MAX(payment_type) AS payment_type,
MAX(comment) AS comment,
MAX(reference) AS reference');
$this->db->from('receivings_items_temp AS receivings_items_temp');
$this->db->join('people AS employee', 'receivings_items_temp.employee_id = employee.person_id');
$this->db->join('suppliers AS supplier', 'receivings_items_temp.supplier_id = supplier.person_id', 'left');
if($inputs['location_id'] != 'all')
{
@@ -74,13 +95,13 @@ class Detailed_receivings extends Report
{
$this->db->having('items_purchased = 0');
}
$this->db->group_by('receiving_id');
$this->db->order_by('receiving_date');
$this->db->group_by('receiving_id', 'receiving_date');
$this->db->order_by('receiving_id');
$data = array();
$data['summary'] = $this->db->get()->result_array();
$data['details'] = array();
foreach($data['summary'] as $key=>$value)
{
$this->db->select('name, item_number, category, quantity_purchased, serialnumber,total, discount_percent, item_location, receivings_items_temp.receiving_quantity');
@@ -89,10 +110,10 @@ class Detailed_receivings extends Report
$this->db->where('receiving_id = '.$value['receiving_id']);
$data['details'][$key] = $this->db->get()->result_array();
}
return $data;
}
public function getSummaryData(array $inputs)
{
$this->db->select('SUM(total) AS total');

View File

@@ -25,8 +25,8 @@ class Detailed_sales extends Report
array('employee_name' => $this->lang->line('reports_sold_by')),
array('customer_name' => $this->lang->line('reports_sold_to')),
array('subtotal' => $this->lang->line('reports_subtotal'), 'sorter' => 'number_sorter'),
array('total' => $this->lang->line('reports_total'), 'sorter' => 'number_sorter'),
array('tax' => $this->lang->line('reports_tax'), 'sorter' => 'number_sorter'),
array('total' => $this->lang->line('reports_total'), 'sorter' => 'number_sorter'),
array('cost' => $this->lang->line('reports_cost'), 'sorter' => 'number_sorter'),
array('profit' => $this->lang->line('reports_profit'), 'sorter' => 'number_sorter'),
array('payment_type' => $this->lang->line('sales_amount_tendered')),
@@ -43,7 +43,7 @@ class Detailed_sales extends Report
$this->lang->line('reports_cost'),
$this->lang->line('reports_profit'),
$this->lang->line('reports_discount'))
);
);
}
public function getDataBySaleId($sale_id)
@@ -57,7 +57,18 @@ class Detailed_sales extends Report
public function getData(array $inputs)
{
$this->db->select('sale_id, sale_date, SUM(quantity_purchased) AS items_purchased, employee_name, customer_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, payment_type, comment');
$this->db->select('sale_id,
MAX(sale_date) AS sale_date,
SUM(quantity_purchased) AS items_purchased,
MAX(employee_name) AS employee_name,
MAX(customer_name) AS customer_name,
SUM(subtotal) AS subtotal,
SUM(tax) AS tax,
SUM(total) AS total,
SUM(cost) AS cost,
SUM(profit) AS profit,
MAX(payment_type) AS payment_type,
MAX(comment) AS comment');
$this->db->from('sales_items_temp');
if($inputs['location_id'] != 'all')
@@ -66,16 +77,16 @@ class Detailed_sales extends Report
}
if($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
$this->db->group_by('sale_id');
$this->db->order_by('sale_date');
$this->db->order_by('MAX(sale_date)');
$data = array();
$data['summary'] = $this->db->get()->result_array();
@@ -99,17 +110,17 @@ class Detailed_sales extends Report
if($inputs['location_id'] != 'all')
{
$this->db->where('item_location', $inputs['location_id']);
$this->db->where('item_location', $inputs['location_id']);
}
if($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
return $this->db->get()->row_array();
}

View File

@@ -8,13 +8,13 @@ class Specific_customer extends Report
{
parent::__construct();
}
public function create(array $inputs)
{
//Create our temp tables to work with the data in our report
$this->Sale->create_temp_table($inputs);
}
public function getDataColumns()
{
return array(
@@ -44,29 +44,29 @@ class Specific_customer extends Report
$this->lang->line('reports_discount'))
);
}
public function getData(array $inputs)
{
$this->db->select('sale_id, sale_date, SUM(quantity_purchased) AS items_purchased, employee_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, payment_type, comment');
$this->db->select('sale_id, MAX(sale_date) AS sale_date, SUM(quantity_purchased) AS items_purchased, MAX(employee_name) AS employee_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, MAX(payment_type) AS payment_type, MAX(comment) AS comment');
$this->db->from('sales_items_temp');
$this->db->where('customer_id', $inputs['customer_id']);
if ($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
$this->db->group_by('sale_id');
$this->db->order_by('sale_date');
$this->db->order_by('MAX(sale_date)');
$data = array();
$data['summary'] = $this->db->get()->result_array();
$data['details'] = array();
foreach($data['summary'] as $key=>$value)
{
$this->db->select('name, category, serialnumber, description, quantity_purchased, subtotal, tax, total, cost, profit, discount_percent');
@@ -77,7 +77,7 @@ class Specific_customer extends Report
return $data;
}
public function getSummaryData(array $inputs)
{
$this->db->select('SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit');
@@ -85,13 +85,13 @@ class Specific_customer extends Report
$this->db->where('customer_id', $inputs['customer_id']);
if ($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
return $this->db->get()->row_array();
}

View File

@@ -8,13 +8,13 @@ class Specific_discount extends Report
{
parent::__construct();
}
public function create(array $inputs)
{
//Create our temp tables to work with the data in our report
$this->Sale->create_temp_table($inputs);
}
public function getDataColumns()
{
return array(
@@ -40,12 +40,12 @@ class Specific_discount extends Report
$this->lang->line('reports_tax'),
$this->lang->line('reports_profit'),
$this->lang->line('reports_discount'))
);
);
}
public function getData(array $inputs)
{
$this->db->select('sale_id, sale_date, SUM(quantity_purchased) AS items_purchased, customer_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, payment_type, comment');
$this->db->select('sale_id, MAX(sale_date) AS sales_date, SUM(quantity_purchased) AS items_purchased, MAX(customer_name) AS customer_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, MAX(payment_type) AS payment_type, MAX(comment) AS comment');
$this->db->from('sales_items_temp');
$this->db->where('discount_percent >=', $inputs['discount']);
@@ -59,12 +59,12 @@ class Specific_discount extends Report
}
$this->db->group_by('sale_id');
$this->db->order_by('sale_date');
$this->db->order_by('MAX(sale_date)');
$data = array();
$data['summary'] = $this->db->get()->result_array();
$data['details'] = array();
foreach($data['summary'] as $key=>$value)
{
$this->db->select('name, serialnumber, category, description, quantity_purchased, subtotal, tax, total, cost, profit, discount_percent');
@@ -75,13 +75,13 @@ class Specific_discount extends Report
return $data;
}
public function getSummaryData(array $inputs)
{
$this->db->select('SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit');
$this->db->from('sales_items_temp');
$this->db->where('discount_percent >=', $inputs['discount']);
if ($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');

View File

@@ -8,13 +8,13 @@ class Specific_employee extends Report
{
parent::__construct();
}
public function create(array $inputs)
{
//Create our temp tables to work with the data in our report
$this->Sale->create_temp_table($inputs);
}
public function getDataColumns()
{
return array(
@@ -42,31 +42,31 @@ class Specific_employee extends Report
$this->lang->line('reports_cost'),
$this->lang->line('reports_profit'),
$this->lang->line('reports_discount'))
);
);
}
public function getData(array $inputs)
{
$this->db->select('sale_id, sale_date, SUM(quantity_purchased) AS items_purchased, customer_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, payment_type, comment');
$this->db->select('sale_id, MAX(sale_date) AS sale_date, SUM(quantity_purchased) AS items_purchased, MAX(customer_name) AS customer_name, SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit, MAX(payment_type) AS payment_type, MAX(comment) AS comment');
$this->db->from('sales_items_temp');
$this->db->where('employee_id', $inputs['employee_id']);
if ($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
$this->db->group_by('sale_id');
$this->db->order_by('sale_date');
$this->db->order_by('MAX(sale_date)');
$data = array();
$data['summary'] = $this->db->get()->result_array();
$data['details'] = array();
foreach($data['summary'] as $key=>$value)
{
$this->db->select('name, category, serialnumber, description, quantity_purchased, subtotal, tax, total, cost, profit, discount_percent');
@@ -74,10 +74,10 @@ class Specific_employee extends Report
$this->db->where('sale_id', $value['sale_id']);
$data['details'][$key] = $this->db->get()->result_array();
}
return $data;
}
public function getSummaryData(array $inputs)
{
$this->db->select('SUM(subtotal) AS subtotal, SUM(tax) AS tax, SUM(total) AS total, SUM(cost) AS cost, SUM(profit) AS profit');
@@ -85,13 +85,13 @@ class Specific_employee extends Report
$this->db->where('employee_id', $inputs['employee_id']);
if ($inputs['sale_type'] == 'sales')
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
{
$this->db->where('quantity_purchased > 0');
}
elseif ($inputs['sale_type'] == 'returns')
{
$this->db->where('quantity_purchased < 0');
}
return $this->db->get()->row_array();
}

View File

@@ -8,7 +8,7 @@ class Summary_discounts extends Summary_report
{
parent::__construct();
}
protected function _get_data_columns()
{
return array(
@@ -18,18 +18,18 @@ class Summary_discounts extends Summary_report
public function getData(array $inputs)
{
$this->db->select('CONCAT(sales_items.discount_percent, "%") AS discount_percent, count(*) AS count');
$this->db->select('MAX(CONCAT(sales_items.discount_percent, "%")) AS discount_percent, count(*) AS count');
$this->db->from('sales_items AS sales_items');
$this->db->join('sales AS sales', 'sales_items.sale_id = sales.sale_id', 'inner');
$this->db->where('discount_percent > 0');
$this->_where($inputs);
$this->db->group_by('sales_items.discount_percent');
$this->db->order_by('sales_items.discount_percent');
return $this->db->get()->result_array();
return $this->db->get()->result_array();
}
}
?>

View File

@@ -8,7 +8,7 @@ class Summary_employees extends Summary_report
{
parent::__construct();
}
protected function _get_data_columns()
{
return array(
@@ -26,7 +26,7 @@ class Summary_employees extends Summary_report
parent::_select($inputs);
$this->db->select('
CONCAT(employee_p.first_name, " ", employee_p.last_name) AS employee,
MAX(CONCAT(employee_p.first_name, " ", employee_p.last_name)) AS employee,
SUM(sales_items.quantity_purchased) AS quantity_purchased
');
}

View File

@@ -26,7 +26,7 @@ class Summary_items extends Summary_report
parent::_select($inputs);
$this->db->select('
items.name AS name,
MAX(items.name) AS name,
SUM(sales_items.quantity_purchased) AS quantity_purchased
');
}
@@ -41,7 +41,7 @@ class Summary_items extends Summary_report
protected function _group_order()
{
$this->db->group_by('items.item_id');
$this->db->order_by('items.name');
$this->db->order_by('name');
}
}
?>

View File

@@ -26,11 +26,11 @@ class Summary_sales extends Summary_report
parent::_select($inputs);
$this->db->select('
DATE(sales.sale_time) AS sale_date,
DATE(sales.sale_time) AS sale_date,
SUM(sales_items.quantity_purchased) AS quantity_purchased
');
}
protected function _group_order()
{
$this->db->group_by('sale_date');

View File

@@ -26,7 +26,7 @@ class Summary_suppliers extends Summary_report
parent::_select($inputs);
$this->db->select('
CONCAT(supplier_c.company_name, " (", supplier_p.first_name, " ", supplier_p.last_name, ")") AS supplier,
MAX(CONCAT(supplier_c.company_name, " (", supplier_p.first_name, " ", supplier_p.last_name, ")")) AS supplier,
SUM(sales_items.quantity_purchased) AS quantity_purchased
');
}
@@ -35,15 +35,15 @@ class Summary_suppliers extends Summary_report
{
parent::_from();
$this->db->join('items AS items', 'sales_items.item_id = items.item_id', 'inner');
$this->db->join('suppliers AS supplier_c', 'supplier_c.person_id = items.supplier_id');
$this->db->join('people AS supplier_p', 'supplier_c.person_id = supplier_p.person_id');
$this->db->join('items AS items', 'sales_items.item_id = items.item_id');
$this->db->join('suppliers AS supplier_c', 'items.supplier_id = supplier_c.person_id ');
$this->db->join('people AS supplier_p', 'items.supplier_id = supplier_p.person_id');
}
protected function _group_order()
{
$this->db->group_by('items.supplier_id');
$this->db->order_by('supplier_p.last_name');
$this->db->order_by('MAX(CONCAT(supplier_c.company_name, " (", supplier_p.first_name, " ", supplier_p.last_name, ")"))');
}
}
?>

View File

@@ -59,6 +59,13 @@
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('config_line_sequence'), 'line_sequence', array('class' => 'control-label col-xs-2')); ?>
<div class='col-xs-2'>
<?php echo form_dropdown('line_sequence', $line_sequence_options, $this->config->item('line_sequence'), array('class' => 'form-control input-sm')); ?>
</div>
</div>
<?php echo form_submit(array(
'name' => 'submit_form',
'id' => 'submit_form',

View File

@@ -16,6 +16,109 @@
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('item_kits_find_kit_item'), 'item_name', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>
<div class="input-group input-group-sm">
<?php echo form_input(array(
'name'=>'item_name',
'id'=>'item_name',
'class'=>'form-control input-sm',
'size'=>'50',
'value'=>$selected_kit_item)
); ?>
<?php echo form_hidden('kit_item_id', $selected_kit_item_id);?>
</div>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('item_kits_discount_percent'), 'kit_discount_percent', array('class' => 'control-label col-xs-3')); ?>
<div class='col-xs-3'>
<div class="input-group input-group-sm">
<?php echo form_input(array(
'name'=>'kit_discount_percent',
'size'=>'5',
'maxlength'=>'5',
'id'=>'kit_discount_percent',
'class'=>'form-control input-sm',
'value'=>$item_kit_info->kit_discount_percent)
);?>
<span class="input-group-addon input-sm"><b>%</b></span>
</div>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('item_kits_price_option'), 'price_option', !empty($basic_version) ? array('class'=>'required control-label col-xs-3') : array('class'=>'control-label col-xs-3')); ?>
<div class="col-xs-8">
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'price_option',
'type'=>'radio',
'id'=>'price_option',
'value'=>0,
'checked'=>$item_kit_info->price_option === '0')
); ?> <?php echo $this->lang->line('item_kits_components_only'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'price_option',
'type'=>'radio',
'id'=>'price_option',
'value'=>1,
'checked'=>$item_kit_info->price_option === '1')
); ?> <?php echo $this->lang->line('item_kits_kit_only'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'price_option',
'type'=>'radio',
'id'=>'price_option',
'value'=>2,
'checked'=>$item_kit_info->price_option === '2')
); ?> <?php echo $this->lang->line('item_kits_kit_and_stock'); ?>
</label>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('item_kits_print_option'), 'print_option', !empty($basic_version) ? array('class'=>'required control-label col-xs-3') : array('class'=>'control-label col-xs-3')); ?>
<div class="col-xs-8">
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'print_option',
'type'=>'radio',
'id'=>'print_option',
'value'=>0,
'checked'=>$item_kit_info->print_option === '0')
); ?> <?php echo $this->lang->line('item_kits_all'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'print_option',
'type'=>'radio',
'id'=>'print_option',
'value'=>1,
'checked'=>$item_kit_info->print_option === '1')
); ?> <?php echo $this->lang->line('item_kits_priced_only'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'print_option',
'type'=>'radio',
'id'=>'print_option',
'value'=>2,
'checked'=>$item_kit_info->print_option === '2')
); ?> <?php echo $this->lang->line('item_kits_kit_only'); ?>
</label>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('item_kits_description'), 'description', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>
@@ -43,7 +146,8 @@
<thead>
<tr>
<th width="10%"><?php echo $this->lang->line('common_delete'); ?></th>
<th width="70%"><?php echo $this->lang->line('item_kits_item'); ?></th>
<th width="10%"><?php echo $this->lang->line('item_kits_sequence'); ?></th>
<th width="60%"><?php echo $this->lang->line('item_kits_item'); ?></th>
<th width="20%"><?php echo $this->lang->line('item_kits_quantity'); ?></th>
</tr>
</thead>
@@ -54,8 +158,9 @@
?>
<tr>
<td><a href='#' onclick='return delete_item_kit_row(this);'><span class='glyphicon glyphicon-trash'></span></a></td>
<td><input class='quantity form-control input-sm' id='item_seq_<?php echo $item_kit_item['item_id'] ?>' name=item_kit_seq[<?php echo $item_kit_item['item_id'] ?>] value='<?php echo to_quantity_decimals($item_kit_item['kit_sequence']) ?>'/></td>
<td><?php echo $item_kit_item['name']; ?></td>
<td><input class='quantity form-control input-sm' id='item_kit_item_<?php echo $item_kit_item['item_id'] ?>' name=item_kit_item[<?php echo $item_kit_item['item_id'] ?>] value='<?php echo to_quantity_decimals($item_kit_item['quantity']) ?>'/></td>
<td><input class='quantity form-control input-sm' id='item_qty_<?php echo $item_kit_item['item_id'] ?>' name=item_kit_qty[<?php echo $item_kit_item['item_id'] ?>] value='<?php echo to_quantity_decimals($item_kit_item['quantity']) ?>'/></td>
</tr>
<?php
}
@@ -63,6 +168,7 @@
</tbody>
</table>
</fieldset>
<?php echo form_close(); ?>
<script type="text/javascript">
@@ -70,50 +176,79 @@
//validation and submit handling
$(document).ready(function()
{
$("#item").autocomplete({
source: '<?php echo site_url("items/suggest"); ?>',
minChars:0,
autoFocus: false,
delay:10,
appendTo: ".modal-content",
select: function(e, ui) {
if ($("#item_kit_item_" + ui.item.value).length == 1)
{
$("#item_kit_item_" + ui.item.value).val(parseFloat( $("#item_kit_item_" + ui.item.value).val()) + 1);
}
else
{
$("#item_kit_items").append("<tr><td><a href='#' onclick='return delete_item_kit_row(this);'><span class='glyphicon glyphicon-trash'></span></a></td><td>" + ui.item.label + "</td><td><input class='quantity form-control input-sm' id='item_kit_item_" + ui.item.value + "' type='text' name=item_kit_item[" + ui.item.value + "] value='1'/></td></tr>");
}
$("#item").val("");
return false;
}
});
$('#item_kit_form').validate($.extend({
submitHandler:function(form)
{
$(form).ajaxSubmit({
success:function(response)
{
dialog_support.hide();
table_support.handle_submit('<?php echo site_url('item_kits'); ?>', response);
},
dataType:'json'
});
$("#item").autocomplete({
source: '<?php echo site_url("items/suggest"); ?>',
minChars:0,
autoFocus: false,
delay:10,
appendTo: ".modal-content",
select: function(e, ui) {
if ($("#item_kit_item_" + ui.item.value).length == 1)
{
$("#item_kit_item_" + ui.item.value).val(parseFloat( $("#item_kit_item_" + ui.item.value).val()) + 1);
}
else
{
$("#item_kit_items").append("<tr>" +
"<td><a href='#' onclick='return delete_item_kit_row(this);'><span class='glyphicon glyphicon-trash'></span></a></td>" +
"<td><input class='quantity form-control input-sm' id='item_seq_" + ui.item.value + "' name=item_kit_seq[" + ui.item.value + "] value='0'/></td>" +
"<td>" + ui.item.label + "</td>" +
"<td><input class='quantity form-control input-sm' id='item_qty_" + ui.item.value + "' name=item_kit_qty[" + ui.item.value + "] value='1'/></td>" +
"</tr>");
}
$("#item").val("");
return false;
}
});
},
rules:
{
name:"required",
category:"required"
},
messages:
{
name:"<?php echo $this->lang->line('items_name_required'); ?>",
category:"<?php echo $this->lang->line('items_category_required'); ?>"
}
}, form_support.error));
$("input[name='item_name']").change(function() {
if( ! $("input[name='item_name']").val() ) {
$("input[name='kit_item_id']").val('');
}
});
var fill_value = function(event, ui) {
event.preventDefault();
$("input[name='kit_item_id']").val(ui.item.value);
$("input[name='item_name']").val(ui.item.label);
};
$("#item_name").autocomplete({
source: '<?php echo site_url("items/suggest"); ?>',
minChars: 0,
delay: 15,
cacheLength: 1,
appendTo: '.modal-content',
select: fill_value,
focus: fill_value
});
$('#item_kit_form').validate($.extend({
submitHandler:function(form)
{
$(form).ajaxSubmit({
success:function(response)
{
dialog_support.hide();
table_support.handle_submit('<?php echo site_url('item_kits'); ?>', response);
},
dataType:'json'
});
},
rules:
{
name:"required",
category:"required"
},
messages:
{
name:"<?php echo $this->lang->line('items_name_required'); ?>",
category:"<?php echo $this->lang->line('items_category_required'); ?>"
}
}, form_support.error));
});
function delete_item_kit_row(link)

View File

@@ -46,6 +46,54 @@
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('items_stock_type'), 'stock_type', !empty($basic_version) ? array('class'=>'required control-label col-xs-3') : array('class'=>'control-label col-xs-3')); ?>
<div class="col-xs-8">
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'stock_type',
'type'=>'radio',
'id'=>'stock_type',
'value'=>0,
'checked'=>$item_info->stock_type === '0')
); ?> <?php echo $this->lang->line('items_stock'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'stock_type',
'type'=>'radio',
'id'=>'stock_type',
'value'=>1,
'checked'=>$item_info->stock_type === '1')
); ?> <?php echo $this->lang->line('items_nonstock'); ?>
</label>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('items_type'), 'item_type', !empty($basic_version) ? array('class'=>'required control-label col-xs-3') : array('class'=>'control-label col-xs-3')); ?>
<div class="col-xs-8">
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'item_type',
'type'=>'radio',
'id'=>'item_type',
'value'=>0,
'checked'=>$item_info->item_type === '0')
); ?> <?php echo $this->lang->line('items_standard'); ?>
</label>
<label class="radio-inline">
<?php echo form_radio(array(
'name'=>'item_type',
'type'=>'radio',
'id'=>'item_type',
'value'=>1,
'checked'=>$item_info->item_type === '1')
); ?> <?php echo $this->lang->line('items_kit'); ?>
</label>
</div>
</div>
<div class="form-group form-group-sm">
<?php echo form_label($this->lang->line('items_supplier'), 'supplier', array('class'=>'control-label col-xs-3')); ?>
<div class='col-xs-8'>

View File

@@ -17,7 +17,7 @@ if(isset($error))
<?php
foreach($grants as $grant)
{
if (!preg_match('/reports_(inventory|receivings)/', $grant['permission_id']))
if (preg_match('/reports_/', $grant['permission_id']) && !preg_match('/(inventory|receivings)/', $grant['permission_id']))
{
show_report('graphical_summary', $grant['permission_id']);
}
@@ -36,7 +36,7 @@ if(isset($error))
<?php
foreach($grants as $grant)
{
if (!preg_match('/reports_(inventory|receivings)/', $grant['permission_id']))
if (preg_match('/reports_/', $grant['permission_id']) && !preg_match('/(inventory|receivings)/', $grant['permission_id']))
{
show_report('summary', $grant['permission_id']);
}

15
database/2.4_to_3.1.0.sql Normal file
View File

@@ -0,0 +1,15 @@
-- alter quantity fields to be all decimal
ALTER TABLE `ospos_items`
ADD COLUMN `stock_type` TINYINT(2) NOT NULL DEFAULT 0,
ADD COLUMN `item_type` TINYINT(2) NOT NULL DEFAULT 0;
ALTER TABLE `ospos_item_kits`
ADD COLUMN `item_id` INT(10) NOT NULL DEFAULT 0,
ADD COLUMN `kit_discount_percent` DECIMAL(15,2) NOT NULL DEFAULT 0.00,
ADD COLUMN `price_option` TINYINT(2) NOT NULL DEFAULT 0,
ADD COLUMN `print_option` TINYINT(2) NOT NULL DEFAULT 0;
ALTER TABLE `ospos_item_kit_items`
ADD COLUMN `kit_sequence` INT(3) NOT NULL DEFAULT 0;

View File

@@ -4,9 +4,9 @@
--
CREATE TABLE `ospos_app_config` (
`key` varchar(50) NOT NULL,
`value` varchar(500) NOT NULL,
PRIMARY KEY (`key`)
`key` varchar(50) NOT NULL,
`value` varchar(500) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -92,14 +92,14 @@ INSERT INTO `ospos_app_config` (`key`, `value`) VALUES
--
CREATE TABLE `ospos_customers` (
`person_id` int(10) NOT NULL,
`company_name` varchar(255) DEFAULT NULL,
`account_number` varchar(255) DEFAULT NULL,
`taxable` int(1) NOT NULL DEFAULT '1',
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`deleted` int(1) NOT NULL DEFAULT '0',
UNIQUE KEY `account_number` (`account_number`),
KEY `person_id` (`person_id`)
`person_id` int(10) NOT NULL,
`company_name` varchar(255) DEFAULT NULL,
`account_number` varchar(255) DEFAULT NULL,
`taxable` int(1) NOT NULL DEFAULT '1',
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`deleted` int(1) NOT NULL DEFAULT '0',
UNIQUE KEY `account_number` (`account_number`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -114,13 +114,13 @@ CREATE TABLE `ospos_customers` (
--
CREATE TABLE `ospos_employees` (
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`person_id` int(10) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`hash_version` int(1) NOT NULL DEFAULT '2',
UNIQUE KEY `username` (`username`),
KEY `person_id` (`person_id`)
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`person_id` int(10) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`hash_version` int(1) NOT NULL DEFAULT '2',
UNIQUE KEY `username` (`username`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -137,15 +137,15 @@ INSERT INTO `ospos_employees` (`username`, `password`, `person_id`, `deleted`, `
--
CREATE TABLE `ospos_giftcards` (
`record_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`giftcard_id` int(11) NOT NULL AUTO_INCREMENT,
`giftcard_number` int(10) NOT NULL,
`value` decimal(15,2) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`person_id` INT(10) DEFAULT NULL,
PRIMARY KEY (`giftcard_id`),
UNIQUE KEY `giftcard_number` (`giftcard_number`),
KEY `person_id` (`person_id`)
`record_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`giftcard_id` int(11) NOT NULL AUTO_INCREMENT,
`giftcard_number` int(10) NOT NULL,
`value` decimal(15,2) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`person_id` INT(10) DEFAULT NULL,
PRIMARY KEY (`giftcard_id`),
UNIQUE KEY `giftcard_number` (`giftcard_number`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -160,17 +160,17 @@ CREATE TABLE `ospos_giftcards` (
--
CREATE TABLE `ospos_inventory` (
`trans_id` int(11) NOT NULL AUTO_INCREMENT,
`trans_items` int(11) NOT NULL DEFAULT '0',
`trans_user` int(11) NOT NULL DEFAULT '0',
`trans_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`trans_comment` text NOT NULL,
`trans_location` int(11) NOT NULL,
`trans_inventory` decimal(15,3) NOT NULL DEFAULT '0',
PRIMARY KEY (`trans_id`),
KEY `trans_items` (`trans_items`),
KEY `trans_user` (`trans_user`),
KEY `trans_location` (`trans_location`)
`trans_id` int(11) NOT NULL AUTO_INCREMENT,
`trans_items` int(11) NOT NULL DEFAULT '0',
`trans_user` int(11) NOT NULL DEFAULT '0',
`trans_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`trans_comment` text NOT NULL,
`trans_location` int(11) NOT NULL,
`trans_inventory` decimal(15,3) NOT NULL DEFAULT '0',
PRIMARY KEY (`trans_id`),
KEY `trans_items` (`trans_items`),
KEY `trans_user` (`trans_user`),
KEY `trans_location` (`trans_location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -185,33 +185,35 @@ CREATE TABLE `ospos_inventory` (
--
CREATE TABLE `ospos_items` (
`name` varchar(255) NOT NULL,
`category` varchar(255) NOT NULL,
`supplier_id` int(11) DEFAULT NULL,
`item_number` varchar(255) DEFAULT NULL,
`description` varchar(255) NOT NULL,
`cost_price` decimal(15,2) NOT NULL,
`unit_price` decimal(15,2) NOT NULL,
`reorder_level` decimal(15,3) NOT NULL DEFAULT '0',
`receiving_quantity` decimal(15,3) NOT NULL DEFAULT '1',
`item_id` int(10) NOT NULL AUTO_INCREMENT,
`pic_id` int(10) DEFAULT NULL,
`allow_alt_description` tinyint(1) NOT NULL,
`is_serialized` tinyint(1) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`custom1` VARCHAR(25) NOT NULL,
`custom2` VARCHAR(25) NOT NULL,
`custom3` VARCHAR(25) NOT NULL,
`custom4` VARCHAR(25) NOT NULL,
`custom5` VARCHAR(25) NOT NULL,
`custom6` VARCHAR(25) NOT NULL,
`custom7` VARCHAR(25) NOT NULL,
`custom8` VARCHAR(25) NOT NULL,
`custom9` VARCHAR(25) NOT NULL,
`custom10` VARCHAR(25) NOT NULL,
PRIMARY KEY (`item_id`),
UNIQUE KEY `item_number` (`item_number`),
KEY `supplier_id` (`supplier_id`)
`name` varchar(255) NOT NULL,
`category` varchar(255) NOT NULL,
`supplier_id` int(11) DEFAULT NULL,
`item_number` varchar(255) DEFAULT NULL,
`description` varchar(255) NOT NULL,
`cost_price` decimal(15,2) NOT NULL,
`unit_price` decimal(15,2) NOT NULL,
`reorder_level` decimal(15,3) NOT NULL DEFAULT '0',
`receiving_quantity` decimal(15,3) NOT NULL DEFAULT '1',
`item_id` int(10) NOT NULL AUTO_INCREMENT,
`pic_id` int(10) DEFAULT NULL,
`allow_alt_description` tinyint(1) NOT NULL,
`item_type` TINYINT(2) NOT NULL DEFAULT 0,
`stock_type` TINYINT(2) NOT NULL DEFAULT 0,
`is_serialized` tinyint(1) NOT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
`custom1` VARCHAR(25) NOT NULL,
`custom2` VARCHAR(25) NOT NULL,
`custom3` VARCHAR(25) NOT NULL,
`custom4` VARCHAR(25) NOT NULL,
`custom5` VARCHAR(25) NOT NULL,
`custom6` VARCHAR(25) NOT NULL,
`custom7` VARCHAR(25) NOT NULL,
`custom8` VARCHAR(25) NOT NULL,
`custom9` VARCHAR(25) NOT NULL,
`custom10` VARCHAR(25) NOT NULL,
PRIMARY KEY (`item_id`),
UNIQUE KEY `item_number` (`item_number`),
KEY `supplier_id` (`supplier_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -226,10 +228,10 @@ CREATE TABLE `ospos_items` (
--
CREATE TABLE `ospos_items_taxes` (
`item_id` int(10) NOT NULL,
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`item_id`,`name`,`percent`)
`item_id` int(10) NOT NULL,
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`item_id`,`name`,`percent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -244,10 +246,14 @@ CREATE TABLE `ospos_items_taxes` (
--
CREATE TABLE `ospos_item_kits` (
`item_kit_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
PRIMARY KEY (`item_kit_id`)
`item_kit_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`item_id` INT(10) NOT NULL DEFAULT 0,
`kit_discount_percent` DECIMAL(15,2) NOT NULL DEFAULT 0.00,
`price_option` TINYINT(2) NOT NULL DEFAULT 0,
`print_option` TINYINT(2) NOT NULL DEFAULT 0,
PRIMARY KEY (`item_kit_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -262,11 +268,12 @@ CREATE TABLE `ospos_item_kits` (
--
CREATE TABLE `ospos_item_kit_items` (
`item_kit_id` int(11) NOT NULL,
`item_id` int(11) NOT NULL,
`quantity` decimal(15,3) NOT NULL,
PRIMARY KEY (`item_kit_id`,`item_id`,`quantity`),
KEY `ospos_item_kit_items_ibfk_2` (`item_id`)
`item_kit_id` int(11) NOT NULL,
`item_id` int(11) NOT NULL,
`quantity` decimal(15,3) NOT NULL,
`kit_sequence` INT(3) NOT NULL DEFAULT 0,
PRIMARY KEY (`item_kit_id`,`item_id`,`quantity`),
KEY `ospos_item_kit_items_ibfk_2` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -280,12 +287,12 @@ CREATE TABLE `ospos_item_kit_items` (
--
CREATE TABLE IF NOT EXISTS `ospos_item_quantities` (
`item_id` int(11) NOT NULL,
`location_id` int(11) NOT NULL,
`quantity` decimal(15,3) NOT NULL DEFAULT '0',
PRIMARY KEY (`item_id`,`location_id`),
KEY `item_id` (`item_id`),
KEY `location_id` (`location_id`)
`item_id` int(11) NOT NULL,
`location_id` int(11) NOT NULL,
`quantity` decimal(15,3) NOT NULL DEFAULT '0',
PRIMARY KEY (`item_id`,`location_id`),
KEY `item_id` (`item_id`),
KEY `location_id` (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
-- --------------------------------------------------------
@@ -295,13 +302,13 @@ CREATE TABLE IF NOT EXISTS `ospos_item_quantities` (
--
CREATE TABLE `ospos_modules` (
`name_lang_key` varchar(255) NOT NULL,
`desc_lang_key` varchar(255) NOT NULL,
`sort` int(10) NOT NULL,
`module_id` varchar(255) NOT NULL,
PRIMARY KEY (`module_id`),
UNIQUE KEY `desc_lang_key` (`desc_lang_key`),
UNIQUE KEY `name_lang_key` (`name_lang_key`)
`name_lang_key` varchar(255) NOT NULL,
`desc_lang_key` varchar(255) NOT NULL,
`sort` int(10) NOT NULL,
`module_id` varchar(255) NOT NULL,
PRIMARY KEY (`module_id`),
UNIQUE KEY `desc_lang_key` (`desc_lang_key`),
UNIQUE KEY `name_lang_key` (`name_lang_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -328,20 +335,20 @@ INSERT INTO `ospos_modules` (`name_lang_key`, `desc_lang_key`, `sort`, `module_i
--
CREATE TABLE `ospos_people` (
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
`gender` int(1) DEFAULT NULL,
`phone_number` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`address_1` varchar(255) NOT NULL,
`address_2` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`state` varchar(255) NOT NULL,
`zip` varchar(255) NOT NULL,
`country` varchar(255) NOT NULL,
`comments` text NOT NULL,
`person_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`person_id`)
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
`gender` int(1) DEFAULT NULL,
`phone_number` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`address_1` varchar(255) NOT NULL,
`address_2` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`state` varchar(255) NOT NULL,
`zip` varchar(255) NOT NULL,
`country` varchar(255) NOT NULL,
`comments` text NOT NULL,
`person_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -358,11 +365,11 @@ INSERT INTO `ospos_people` (`first_name`, `last_name`, `phone_number`, `email`,
--
CREATE TABLE `ospos_permissions` (
`permission_id` varchar(255) NOT NULL,
`module_id` varchar(255) NOT NULL,
`location_id` int(10) DEFAULT NULL,
PRIMARY KEY (`permission_id`),
KEY `module_id` (`module_id`)
`permission_id` varchar(255) NOT NULL,
`module_id` varchar(255) NOT NULL,
`location_id` int(10) DEFAULT NULL,
PRIMARY KEY (`permission_id`),
KEY `module_id` (`module_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -405,9 +412,9 @@ INSERT INTO `ospos_permissions` (`permission_id`, `module_id`, `location_id`) VA
--
CREATE TABLE `ospos_grants` (
`permission_id` varchar(255) NOT NULL,
`person_id` int(10) NOT NULL,
PRIMARY KEY (`permission_id`,`person_id`)
`permission_id` varchar(255) NOT NULL,
`person_id` int(10) NOT NULL,
PRIMARY KEY (`permission_id`,`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -447,17 +454,17 @@ INSERT INTO `ospos_grants` (`permission_id`, `person_id`) VALUES
--
CREATE TABLE `ospos_receivings` (
`receiving_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`supplier_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`receiving_id` int(10) NOT NULL AUTO_INCREMENT,
`payment_type` varchar(20) DEFAULT NULL,
`reference` varchar(32) DEFAULT NULL,
PRIMARY KEY (`receiving_id`),
KEY `supplier_id` (`supplier_id`),
KEY `employee_id` (`employee_id`),
KEY `reference` (`reference`)
`receiving_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`supplier_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`receiving_id` int(10) NOT NULL AUTO_INCREMENT,
`payment_type` varchar(20) DEFAULT NULL,
`reference` varchar(32) DEFAULT NULL,
PRIMARY KEY (`receiving_id`),
KEY `supplier_id` (`supplier_id`),
KEY `employee_id` (`employee_id`),
KEY `reference` (`reference`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -472,19 +479,19 @@ CREATE TABLE `ospos_receivings` (
--
CREATE TABLE `ospos_receivings_items` (
`receiving_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL,
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
`receiving_quantity` decimal(15,3) NOT NULL DEFAULT '1',
PRIMARY KEY (`receiving_id`,`item_id`,`line`),
KEY `item_id` (`item_id`)
`receiving_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL,
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
`receiving_quantity` decimal(15,3) NOT NULL DEFAULT '1',
PRIMARY KEY (`receiving_id`,`item_id`,`line`),
KEY `item_id` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -499,17 +506,17 @@ CREATE TABLE `ospos_receivings_items` (
--
CREATE TABLE `ospos_sales` (
`sale_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`customer_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`invoice_number` varchar(32) DEFAULT NULL,
`sale_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sale_id`),
KEY `customer_id` (`customer_id`),
KEY `employee_id` (`employee_id`),
KEY `sale_time` (`sale_time`),
UNIQUE KEY `invoice_number` (`invoice_number`)
`sale_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`customer_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`invoice_number` varchar(32) DEFAULT NULL,
`sale_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sale_id`),
KEY `customer_id` (`customer_id`),
KEY `employee_id` (`employee_id`),
KEY `sale_time` (`sale_time`),
UNIQUE KEY `invoice_number` (`invoice_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -524,20 +531,20 @@ CREATE TABLE `ospos_sales` (
--
CREATE TABLE `ospos_sales_items` (
`sale_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`),
KEY `item_location` (`item_location`)
`sale_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`),
KEY `item_location` (`item_location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -552,14 +559,14 @@ CREATE TABLE `ospos_sales_items` (
--
CREATE TABLE `ospos_sales_items_taxes` (
`sale_id` int(10) NOT NULL,
`item_id` int(10) NOT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`,`name`,`percent`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`)
`sale_id` int(10) NOT NULL,
`item_id` int(10) NOT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`,`name`,`percent`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -574,11 +581,11 @@ CREATE TABLE `ospos_sales_items_taxes` (
--
CREATE TABLE `ospos_sales_payments` (
`sale_id` int(10) NOT NULL,
`payment_type` varchar(40) NOT NULL,
`payment_amount` decimal(15,2) NOT NULL,
PRIMARY KEY (`sale_id`,`payment_type`),
KEY `sale_id` (`sale_id`)
`sale_id` int(10) NOT NULL,
`payment_type` varchar(40) NOT NULL,
`payment_amount` decimal(15,2) NOT NULL,
PRIMARY KEY (`sale_id`,`payment_type`),
KEY `sale_id` (`sale_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -593,15 +600,15 @@ CREATE TABLE `ospos_sales_payments` (
--
CREATE TABLE `ospos_sales_suspended` (
`sale_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`customer_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`invoice_number` varchar(32) DEFAULT NULL,
`sale_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sale_id`),
KEY `customer_id` (`customer_id`),
KEY `employee_id` (`employee_id`)
`sale_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`customer_id` int(10) DEFAULT NULL,
`employee_id` int(10) NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`invoice_number` varchar(32) DEFAULT NULL,
`sale_id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sale_id`),
KEY `customer_id` (`customer_id`),
KEY `employee_id` (`employee_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -616,19 +623,19 @@ CREATE TABLE `ospos_sales_suspended` (
--
CREATE TABLE `ospos_sales_suspended_items` (
`sale_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`)
`sale_id` int(10) NOT NULL DEFAULT '0',
`item_id` int(10) NOT NULL DEFAULT '0',
`description` varchar(30) DEFAULT NULL,
`serialnumber` varchar(30) DEFAULT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`quantity_purchased` decimal(15,3) NOT NULL DEFAULT '0',
`item_cost_price` decimal(15,2) NOT NULL,
`item_unit_price` decimal(15,2) NOT NULL,
`discount_percent` decimal(15,2) NOT NULL DEFAULT '0',
`item_location` int(11) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`),
KEY `sale_id` (`sale_id`),
KEY `item_id` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -643,13 +650,13 @@ CREATE TABLE `ospos_sales_suspended_items` (
--
CREATE TABLE `ospos_sales_suspended_items_taxes` (
`sale_id` int(10) NOT NULL,
`item_id` int(10) NOT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`,`name`,`percent`),
KEY `item_id` (`item_id`)
`sale_id` int(10) NOT NULL,
`item_id` int(10) NOT NULL,
`line` int(3) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`percent` decimal(15,3) NOT NULL,
PRIMARY KEY (`sale_id`,`item_id`,`line`,`name`,`percent`),
KEY `item_id` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -664,10 +671,10 @@ CREATE TABLE `ospos_sales_suspended_items_taxes` (
--
CREATE TABLE `ospos_sales_suspended_payments` (
`sale_id` int(10) NOT NULL,
`payment_type` varchar(40) NOT NULL,
`payment_amount` decimal(15,2) NOT NULL,
PRIMARY KEY (`sale_id`,`payment_type`)
`sale_id` int(10) NOT NULL,
`payment_type` varchar(40) NOT NULL,
`payment_amount` decimal(15,2) NOT NULL,
PRIMARY KEY (`sale_id`,`payment_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -682,11 +689,11 @@ CREATE TABLE `ospos_sales_suspended_payments` (
--
CREATE TABLE `ospos_sessions` (
`id` varchar(40) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
`data` blob NOT NULL,
KEY `ci_sessions_timestamp` (`timestamp`)
`id` varchar(40) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
`data` blob NOT NULL,
KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -700,10 +707,10 @@ CREATE TABLE `ospos_sessions` (
--
CREATE TABLE `ospos_stock_locations` (
`location_id` int(11) NOT NULL AUTO_INCREMENT,
`location_name` varchar(255) DEFAULT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`location_id`)
`location_id` int(11) NOT NULL AUTO_INCREMENT,
`location_name` varchar(255) DEFAULT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
--
@@ -719,13 +726,13 @@ INSERT INTO `ospos_stock_locations` ( `deleted`, `location_name` ) VALUES ('0',
--
CREATE TABLE `ospos_suppliers` (
`person_id` int(10) NOT NULL,
`company_name` varchar(255) NOT NULL,
`agency_name` varchar(255) NOT NULL,
`account_number` varchar(255) DEFAULT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
UNIQUE KEY `account_number` (`account_number`),
KEY `person_id` (`person_id`)
`person_id` int(10) NOT NULL,
`company_name` varchar(255) NOT NULL,
`agency_name` varchar(255) NOT NULL,
`account_number` varchar(255) DEFAULT NULL,
`deleted` int(1) NOT NULL DEFAULT '0',
UNIQUE KEY `account_number` (`account_number`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -741,141 +748,141 @@ CREATE TABLE `ospos_suppliers` (
-- Constraints for table `ospos_customers`
--
ALTER TABLE `ospos_customers`
ADD CONSTRAINT `ospos_customers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
ADD CONSTRAINT `ospos_customers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_employees`
--
ALTER TABLE `ospos_employees`
ADD CONSTRAINT `ospos_employees_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
ADD CONSTRAINT `ospos_employees_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_inventory`
--
ALTER TABLE `ospos_inventory`
ADD CONSTRAINT `ospos_inventory_ibfk_1` FOREIGN KEY (`trans_items`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_2` FOREIGN KEY (`trans_user`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_3` FOREIGN KEY (`trans_location`) REFERENCES `ospos_stock_locations` (`location_id`);
ADD CONSTRAINT `ospos_inventory_ibfk_1` FOREIGN KEY (`trans_items`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_2` FOREIGN KEY (`trans_user`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_inventory_ibfk_3` FOREIGN KEY (`trans_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_items`
--
ALTER TABLE `ospos_items`
ADD CONSTRAINT `ospos_items_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
ADD CONSTRAINT `ospos_items_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_items_taxes`
--
ALTER TABLE `ospos_items_taxes`
ADD CONSTRAINT `ospos_items_taxes_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
ADD CONSTRAINT `ospos_items_taxes_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_item_kit_items`
--
ALTER TABLE `ospos_item_kit_items`
ADD CONSTRAINT `ospos_item_kit_items_ibfk_1` FOREIGN KEY (`item_kit_id`) REFERENCES `ospos_item_kits` (`item_kit_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_item_kit_items_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
ADD CONSTRAINT `ospos_item_kit_items_ibfk_1` FOREIGN KEY (`item_kit_id`) REFERENCES `ospos_item_kits` (`item_kit_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_item_kit_items_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_permissions`
--
ALTER TABLE `ospos_permissions`
ADD CONSTRAINT `ospos_permissions_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `ospos_modules` (`module_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_permissions_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`) ON DELETE CASCADE;
ADD CONSTRAINT `ospos_permissions_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `ospos_modules` (`module_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_permissions_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_grants`
--
ALTER TABLE `ospos_grants`
ADD CONSTRAINT `ospos_grants_ibfk_1` foreign key (`permission_id`) references `ospos_permissions` (`permission_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_grants_ibfk_2` foreign key (`person_id`) references `ospos_employees` (`person_id`) ON DELETE CASCADE;
ADD CONSTRAINT `ospos_grants_ibfk_1` foreign key (`permission_id`) references `ospos_permissions` (`permission_id`) ON DELETE CASCADE,
ADD CONSTRAINT `ospos_grants_ibfk_2` foreign key (`person_id`) references `ospos_employees` (`person_id`) ON DELETE CASCADE;
--
-- Constraints for table `ospos_receivings`
--
ALTER TABLE `ospos_receivings`
ADD CONSTRAINT `ospos_receivings_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_receivings_ibfk_2` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
ADD CONSTRAINT `ospos_receivings_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_receivings_ibfk_2` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);
--
-- Constraints for table `ospos_receivings_items`
--
ALTER TABLE `ospos_receivings_items`
ADD CONSTRAINT `ospos_receivings_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_receivings_items_ibfk_2` FOREIGN KEY (`receiving_id`) REFERENCES `ospos_receivings` (`receiving_id`);
ADD CONSTRAINT `ospos_receivings_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_receivings_items_ibfk_2` FOREIGN KEY (`receiving_id`) REFERENCES `ospos_receivings` (`receiving_id`);
--
-- Constraints for table `ospos_sales`
--
ALTER TABLE `ospos_sales`
ADD CONSTRAINT `ospos_sales_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
ADD CONSTRAINT `ospos_sales_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_items`
--
ALTER TABLE `ospos_sales_items`
ADD CONSTRAINT `ospos_sales_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
ADD CONSTRAINT `ospos_sales_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_items_taxes`
--
ALTER TABLE `ospos_sales_items_taxes`
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_items` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_items` (`sale_id`),
ADD CONSTRAINT `ospos_sales_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_payments`
--
ALTER TABLE `ospos_sales_payments`
ADD CONSTRAINT `ospos_sales_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`);
ADD CONSTRAINT `ospos_sales_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales` (`sale_id`);
--
-- Constraints for table `ospos_sales_suspended`
--
ALTER TABLE `ospos_sales_suspended`
ADD CONSTRAINT `ospos_sales_suspended_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_suspended_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
ADD CONSTRAINT `ospos_sales_suspended_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `ospos_employees` (`person_id`),
ADD CONSTRAINT `ospos_sales_suspended_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `ospos_customers` (`person_id`);
--
-- Constraints for table `ospos_sales_suspended_items`
--
ALTER TABLE `ospos_sales_suspended_items`
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_2` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_ibfk_3` FOREIGN KEY (`item_location`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_sales_suspended_items_taxes`
--
ALTER TABLE `ospos_sales_suspended_items_taxes`
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended_items` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended_items` (`sale_id`),
ADD CONSTRAINT `ospos_sales_suspended_items_taxes_ibfk_2` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`);
--
-- Constraints for table `ospos_sales_suspended_payments`
--
ALTER TABLE `ospos_sales_suspended_payments`
ADD CONSTRAINT `ospos_sales_suspended_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`);
ADD CONSTRAINT `ospos_sales_suspended_payments_ibfk_1` FOREIGN KEY (`sale_id`) REFERENCES `ospos_sales_suspended` (`sale_id`);
--
-- Constraints for table `ospos_item_quantities`
--
ALTER TABLE `ospos_item_quantities`
ADD CONSTRAINT `ospos_item_quantities_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_item_quantities_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`);
ADD CONSTRAINT `ospos_item_quantities_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `ospos_items` (`item_id`),
ADD CONSTRAINT `ospos_item_quantities_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `ospos_stock_locations` (`location_id`);
--
-- Constraints for table `ospos_suppliers`
--
ALTER TABLE `ospos_suppliers`
ADD CONSTRAINT `ospos_suppliers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
ADD CONSTRAINT `ospos_suppliers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
--
-- Constraints for table `ospos_giftcards`
--
ALTER TABLE `ospos_giftcards`
ADD CONSTRAINT `ospos_giftcards_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);
ADD CONSTRAINT `ospos_giftcards_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `ospos_people` (`person_id`);