diff --git a/application/controllers/Expenses.php b/application/controllers/Expenses.php index 6fc3f5d55..272814737 100644 --- a/application/controllers/Expenses.php +++ b/application/controllers/Expenses.php @@ -128,7 +128,7 @@ class Expenses extends Secure_Controller $expense_data = array( 'date' => $date_formatter->format('Y-m-d H:i:s'), - 'supplier_name' => $this->input->post('supplier_name'), + 'supplier_id' => $this->input->post('supplier_id'), 'supplier_tax_code' => $this->input->post('supplier_tax_code'), 'amount' => parse_decimals($this->input->post('amount')), 'tax_amount' => parse_decimals($this->input->post('tax_amount')), diff --git a/application/language/en-US/expenses_lang.php b/application/language/en-US/expenses_lang.php index 939a76705..7bb3b54f2 100644 --- a/application/language/en-US/expenses_lang.php +++ b/application/language/en-US/expenses_lang.php @@ -43,3 +43,5 @@ $lang["expenses_supplier_name"] = "Supplier"; $lang["expenses_supplier_tax_code"] = "Tax Code"; $lang["expenses_tax_amount"] = "Tax"; $lang["expenses_update"] = "Update Expense"; +$lang["expenses_start_typing_supplier_name"] = "Start Typing Supplier's name..."; +$lang["expenses_supplier_required"] = "Please select a valid Supplier"; diff --git a/application/language/es/expenses_lang.php b/application/language/es/expenses_lang.php index ef80582a4..d2f3c2201 100644 --- a/application/language/es/expenses_lang.php +++ b/application/language/es/expenses_lang.php @@ -43,3 +43,5 @@ $lang["expenses_supplier_name"] = "Proveedor"; $lang["expenses_supplier_tax_code"] = "Codigo Imp"; $lang["expenses_tax_amount"] = "Imp"; $lang["expenses_update"] = "Actualizar Gasto"; +$lang["expenses_start_typing_supplier_name"] = "Empieza a escribir el nombre del proveedor..."; +$lang["expenses_supplier_required"] = "Selecciona un Proveedor vĂ¡lido"; diff --git a/application/migrations/20180819195000_expenses_supplier_id.php b/application/migrations/20180819195000_expenses_supplier_id.php new file mode 100644 index 000000000..5a3338a65 --- /dev/null +++ b/application/migrations/20180819195000_expenses_supplier_id.php @@ -0,0 +1,97 @@ +add_supplier_id(); + $this->link_suppliers(); + if($this->there_are_unknown_suppliers()) { + $this->save_name_in_description(); + $unknown_supplier_id = $this->create_unknown_supplier(); + $this->link_unknown_supplier($unknown_supplier_id); + } + $this->create_foreign_key(); + $this->delete_supplier_name(); + } + + public function down() + { + + } + + private function add_supplier_id() + { + $query = "ALTER TABLE `ospos_expenses` "; + $query .= "ADD COLUMN `supplier_id` int(10) NOT NULL;"; + $this->db->query($query); + } + + private function link_suppliers() + { + $query = "UPDATE `ospos_expenses` "; + $query .= "INNER JOIN `ospos_suppliers` "; + $query .= "ON `ospos_expenses`.`supplier_name` = `ospos_suppliers`.`company_name` "; + $query .= "SET `ospos_expenses`.`supplier_id` = `ospos_suppliers`.`person_id`;"; + $this->db->query($query); + } + + private function there_are_unknown_suppliers() + { + $query = "SELECT COUNT(*) AS amount "; + $query .= "FROM `ospos_expenses` "; + $query .= "WHERE `supplier_id` = 0;"; + $result = $this->db->query($query); + $amount = $result->row()->amount; + return $amount > 0; + } + + private function save_name_in_description() + { + $query = "UPDATE `ospos_expenses` "; + $query .= "SET `description` = CONCAT(`description`, CONCAT('\nSupplier name: ', `supplier_name`)) "; + $query .= "WHERE `supplier_id` = 0;"; + $this->db->query($query); + } + + private function create_unknown_supplier() + { + $query = "INSERT INTO `ospos_people` (`first_name`, `last_name`, `comments`) "; + $query .= "VALUES ('Unknown', 'Supplier', 'This supplier was added automatically by OSPOS. It is associated with expenses whose supplier is unknown. Before deleting this supplier, correct the expenses associated with it by heading to the Expenses section and selecting the appropriate supplier for each expense. In order to determine the original supplier, you can look at the supplier\'s name in each expense\'s description field.');"; + $this->db->query($query); + $id = $this->db->insert_id(); + $query = "INSERT INTO `ospos_suppliers` (`person_id`, `company_name`) "; + $query .= "VALUES (" . $id . ", 'Unknown Supplier');"; + $this->db->query($query); + return $id; + } + + private function link_unknown_supplier($unknown_supplier_id) + { + $query = "UPDATE `ospos_expenses` "; + $query .= "SET `supplier_id` = " . $unknown_supplier_id . " "; + $query .= "WHERE `supplier_id`= 0;"; + $this->db->query($query); + } + + private function create_foreign_key() + { + $query = "ALTER TABLE `ospos_expenses` "; + $query .= "ADD CONSTRAINT `ospos_expenses_ibfk_3` FOREIGN KEY (`supplier_id`) REFERENCES `ospos_suppliers` (`person_id`);"; + $this->db->query($query); + } + + private function delete_supplier_name() + { + $query = "ALTER TABLE `ospos_expenses` "; + $query .= "DROP COLUMN `supplier_name`;"; + $this->db->query($query); + } + +} +?> diff --git a/application/models/Expense.php b/application/models/Expense.php index 73a750952..4e543231c 100644 --- a/application/models/Expense.php +++ b/application/models/Expense.php @@ -71,7 +71,7 @@ class Expense extends CI_Model $this->db->select(' expenses.expense_id, MAX(expenses.date) AS date, - MAX(expenses.supplier_name) AS supplier_name, + MAX(suppliers.company_name) AS supplier_name, MAX(expenses.supplier_tax_code) AS supplier_tax_code, MAX(expenses.amount) AS amount, MAX(expenses.tax_amount) AS tax_amount, @@ -86,6 +86,7 @@ class Expense extends CI_Model $this->db->from('expenses AS expenses'); $this->db->join('people AS employees', 'employees.person_id = expenses.employee_id', 'LEFT'); $this->db->join('expense_categories AS expense_categories', 'expense_categories.expense_category_id = expenses.expense_category_id', 'LEFT'); + $this->db->join('suppliers AS suppliers', 'suppliers.person_id = expenses.supplier_id', 'INNER'); $this->db->group_start(); $this->db->like('employees.first_name', $search); @@ -162,7 +163,8 @@ class Expense extends CI_Model $this->db->select(' expenses.expense_id AS expense_id, expenses.date AS date, - expenses.supplier_name AS supplier_name, + suppliers.company_name AS supplier_name, + expenses.supplier_id AS supplier_id, expenses.supplier_tax_code AS supplier_tax_code, expenses.amount AS amount, expenses.tax_amount AS tax_amount, @@ -178,6 +180,7 @@ class Expense extends CI_Model $this->db->from('expenses AS expenses'); $this->db->join('people AS employees', 'employees.person_id = expenses.employee_id', 'LEFT'); $this->db->join('expense_categories AS expense_categories', 'expense_categories.expense_category_id = expenses.expense_category_id', 'LEFT'); + $this->db->join('suppliers AS suppliers', 'suppliers.person_id = expenses.supplier_id', 'INNER'); $this->db->where('expense_id', $expense_id); $query = $this->db->get(); @@ -196,6 +199,8 @@ class Expense extends CI_Model $expenses_obj->$field = ''; } + $expenses_obj->supplier_name = ''; + return $expenses_obj; } } diff --git a/application/views/expenses/form.php b/application/views/expenses/form.php index 1a6ed1df0..d0b0be5d1 100644 --- a/application/views/expenses/form.php +++ b/application/views/expenses/form.php @@ -25,15 +25,25 @@
- lang->line('expenses_supplier_name'), 'supplier_name', array('class'=>'control-label col-xs-3')); ?> + lang->line('expenses_supplier_name'), 'supplier_name', array('class'=>'control-label col-xs-3 required')); ?>
'supplier_name', 'id'=>'supplier_name', 'class'=>'form-control input-sm', - 'value'=>$expenses_info->supplier_name) + 'value'=>$this->lang->line('expenses_start_typing_supplier_name')) + ); + echo form_input(array( + 'type'=>'hidden', + 'name'=>'supplier_id', + 'id'=>'supplier_id') );?>
+
+ + + +
@@ -160,6 +170,46 @@ $(document).ready(function() } } + $('#supplier_name').click(function() { + $(this).attr('value',''); + }); + + $('#supplier_name').autocomplete({ + source: '', + minChars:0, + delay:10, + select: function (event, ui) { + $('#supplier_id').val(ui.item.value); + $(this).val(ui.item.label); + $(this).attr('readonly', 'readonly'); + $('#remove_supplier_button').css('display', 'inline-block'); + return false; + } + }); + + $('#supplier_name').blur(function() { + $(this).attr('value',"lang->line('expenses_start_typing_supplier_name'); ?>"); + }); + + $('#remove_supplier_button').css('display', 'none'); + + $('#remove_supplier_button').click(function() { + $('#supplier_id').val(''); + $('#supplier_name').removeAttr('readonly'); + $('#supplier_name').val(''); + $(this).css('display', 'none'); + }); + + expense_id)) { + ?> + $('#supplier_id').val('supplier_id ?>'); + $('#supplier_name').val('supplier_name ?>'); + $('#supplier_name').attr('readonly', 'readonly'); + $('#remove_supplier_button').css('display', 'inline-block'); + $('#expenses_edit_form').validate($.extend({ submitHandler: function(form) { $(form).ajaxSubmit({ @@ -174,6 +224,8 @@ $(document).ready(function() errorLabelContainer: '#error_message_box', + ignore: '', + rules: { category: 'required', @@ -181,6 +233,7 @@ $(document).ready(function() { required: true }, + supplier_id: 'required', amount: { required: true, @@ -200,6 +253,7 @@ $(document).ready(function() required: "lang->line('expenses_date_required'); ?>" }, + supplier_id: "lang->line('expenses_supplier_required'); ?>", amount: { required: "lang->line('expenses_amount_required'); ?>", diff --git a/public/css/bootstrap.autocomplete.css b/public/css/bootstrap.autocomplete.css index 02ce097c3..5a7dcc6d9 100644 --- a/public/css/bootstrap.autocomplete.css +++ b/public/css/bootstrap.autocomplete.css @@ -3,7 +3,7 @@ position: absolute; top: 100%; left: 0; - z-index: 1000; + z-index: 1050; float: left; display: none; min-width: 160px; @@ -50,4 +50,4 @@ -webkit-border-radius: 0px; -moz-border-radius: 0px; background-image: none; -} \ No newline at end of file +}