From 0ae6470b35ef159f8b218a943eedb71f858195d1 Mon Sep 17 00:00:00 2001 From: jekkos Date: Tue, 4 Jun 2019 23:59:18 +0200 Subject: [PATCH] Migrate attribute datetime to date (#2441) --- application/helpers/locale_helper.php | 15 +++------ application/helpers/tabular_helper.php | 10 +++--- application/libraries/Token_lib.php | 2 +- .../20190602182900_fix_attribute_datetime.php | 20 ++++++++++++ .../3.3.0_fix_attribute_datetime.sql | 1 + application/models/Attribute.php | 32 ++++++++----------- application/models/Item.php | 8 ++--- .../models/reports/Detailed_receivings.php | 2 +- application/models/reports/Detailed_sales.php | 2 +- application/models/tokens/Token.php | 16 +++++----- application/views/attributes/form.php | 10 ++++-- application/views/attributes/item.php | 8 ++--- application/views/customers/form.php | 2 +- application/views/expenses/form.php | 2 +- .../views/partial/datepicker_locale.php | 10 +++--- application/views/sales/form.php | 2 +- 16 files changed, 78 insertions(+), 64 deletions(-) create mode 100644 application/migrations/20190602182900_fix_attribute_datetime.php create mode 100644 application/migrations/sqlscripts/3.3.0_fix_attribute_datetime.sql diff --git a/application/helpers/locale_helper.php b/application/helpers/locale_helper.php index f530f860d..fe68a7c3c 100644 --- a/application/helpers/locale_helper.php +++ b/application/helpers/locale_helper.php @@ -3,7 +3,7 @@ const DEFAULT_LANGUAGE = 'english'; const DEFAULT_LANGUAGE_CODE = 'en-US'; -define('DEFAULT_DATETIME', mktime(0, 0, 0, 1, 1, 2010)); +define('DEFAULT_DATE', mktime(0, 0, 0, 1, 1, 2010)); /** * Currency locale helper @@ -310,11 +310,11 @@ function tax_decimals() return $config->item('tax_decimals') ? $config->item('tax_decimals') : 0; } -function to_datetime($datetime) +function to_date($date) { $config = get_instance()->config; - return date($config->item('dateformat') . ' ' . $config->item('timeformat'), $datetime); + return date($config->item('dateformat'), $date); } function to_currency($number) @@ -460,7 +460,7 @@ function dateformat_momentjs($php_format) function dateformat_mysql() { $config = get_instance()->config; - $php_format = $config->item('dateformat') . ' ' . $config->item('timeformat'); + $php_format = $config->item('dateformat'); $SYMBOLS_MATCHING = array( // Day @@ -491,7 +491,7 @@ function dateformat_mysql() 'B' => '', 'g' => '%l', 'G' => '%k', - 'h' => '', + 'h' => '%H', 'H' => '%k', 'i' => '%i', 's' => '%S', @@ -542,11 +542,6 @@ function dateformat_bootstrap($php_format) return strtr($php_format, $SYMBOLS_MATCHING); } -function valid_datetime($datetime) -{ - return preg_match('/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])(?:( [0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/', $datetime); -} - function valid_decimal($decimal) { return preg_match('/^(\d*\.)?\d+$/', $decimal); diff --git a/application/helpers/tabular_helper.php b/application/helpers/tabular_helper.php index 8ab99dafd..2b3569920 100644 --- a/application/helpers/tabular_helper.php +++ b/application/helpers/tabular_helper.php @@ -90,7 +90,7 @@ function get_sale_data_row($sale) $row = array ( 'sale_id' => $sale->sale_id, - 'sale_time' => to_datetime(strtotime($sale->sale_time)), + 'sale_time' => to_date(strtotime($sale->sale_time)), 'customer_name' => $sale->customer_name, 'amount_due' => to_currency($sale->amount_due), 'amount_tendered' => to_currency($sale->amount_tendered), @@ -444,7 +444,7 @@ function get_item_data_row($item) ); $attribute_values = (property_exists($item, 'attribute_values')) ? $item->attribute_values : ""; - $attribute_values = (property_exists($item, 'attribute_dtvalues')) ? $attribute_values . $item->attribute_dtvalues : $attribute_values; + $attribute_values = (property_exists($item, 'attribute_dtvalues')) ? $attribute_values . '|' . $item->attribute_dtvalues : $attribute_values; return $columns + expand_attribute_values($definition_names, $attribute_values) + $icons; } @@ -659,7 +659,7 @@ function get_expenses_data_row($expense) $controller_name = strtolower(get_class($CI)); return array ( 'expense_id' => $expense->expense_id, - 'date' => to_datetime(strtotime($expense->date)), + 'date' => to_date(strtotime($expense->date)), 'supplier_name' => $expense->supplier_name, 'supplier_tax_code' => $expense->supplier_tax_code, 'amount' => to_currency($expense->amount), @@ -750,11 +750,11 @@ function get_cash_up_data_row($cash_up) $controller_name = strtolower(get_class($CI)); return array ( 'cashup_id' => $cash_up->cashup_id, - 'open_date' => to_datetime(strtotime($cash_up->open_date)), + 'open_date' => to_date(strtotime($cash_up->open_date)), 'open_employee_id' => $cash_up->open_first_name . ' ' . $cash_up->open_last_name, 'open_amount_cash' => to_currency($cash_up->open_amount_cash), 'transfer_amount_cash' => to_currency($cash_up->transfer_amount_cash), - 'close_date' => to_datetime(strtotime($cash_up->close_date)), + 'close_date' => to_date(strtotime($cash_up->close_date)), 'close_employee_id' => $cash_up->close_first_name . ' ' . $cash_up->close_last_name, 'closed_amount_cash' => to_currency($cash_up->closed_amount_cash), 'note' => $cash_up->note ? '' : '', diff --git a/application/libraries/Token_lib.php b/application/libraries/Token_lib.php index b16e92398..483ff563c 100644 --- a/application/libraries/Token_lib.php +++ b/application/libraries/Token_lib.php @@ -1,6 +1,6 @@ diff --git a/application/migrations/sqlscripts/3.3.0_fix_attribute_datetime.sql b/application/migrations/sqlscripts/3.3.0_fix_attribute_datetime.sql new file mode 100644 index 000000000..981af1176 --- /dev/null +++ b/application/migrations/sqlscripts/3.3.0_fix_attribute_datetime.sql @@ -0,0 +1 @@ +ALTER TABLE `ospos_attribute_values` CHANGE `attribute_datetime` `attribute_date` DATE DEFAULT NULL; \ No newline at end of file diff --git a/application/models/Attribute.php b/application/models/Attribute.php index cb087dfc8..31bf7448c 100644 --- a/application/models/Attribute.php +++ b/application/models/Attribute.php @@ -3,10 +3,10 @@ define('GROUP', 'GROUP'); define('DROPDOWN', 'DROPDOWN'); define('DECIMAL', 'DECIMAL'); -define('DATETIME', 'DATETIME'); +define('DATE', 'DATE'); define('TEXT', 'TEXT'); -const DEFINITION_TYPES = [GROUP, DROPDOWN, DECIMAL, TEXT, DATETIME]; +const DEFINITION_TYPES = [GROUP, DROPDOWN, DECIMAL, TEXT, DATE]; /** * Attribute class @@ -270,11 +270,11 @@ class Attribute extends CI_Model $this->db->where('definition_id',$definition); $success = TRUE; - if($to === DATETIME) + if($to === DATE) { foreach($this->db->get()->result_array() as $row) { - if(valid_datetime($row['attribute_value']) === FALSE) + if(valid_date($row['attribute_value']) === FALSE) { log_message('ERROR', 'item_id: ' . $row['item_id'] . ' with attribute_value: ' . $row['attribute_value'] . ' cannot be converted to datetime'); $success = FALSE; @@ -303,9 +303,9 @@ class Attribute extends CI_Model //From TEXT to DATETIME if($from_type === TEXT) { - if($to_type === DATETIME || $to_type === DECIMAL) + if($to_type === DATE || $to_type === DECIMAL) { - $field = ($to_type === DATETIME ? 'attribute_datetime' : 'attribute_decimal'); + $field = ($to_type === DATETIME ? 'attribute_date' : 'attribute_decimal'); if($this->check_data_validity($definition_id, $from_type, $to_type)) { @@ -454,7 +454,7 @@ class Attribute extends CI_Model { $format = $this->db->escape(dateformat_mysql()); $this->db->select("GROUP_CONCAT(attribute_value SEPARATOR ', ') AS attribute_values"); - $this->db->select("GROUP_CONCAT(DATE_FORMAT(attribute_datetime, $format) SEPARATOR ', ') AS attribute_dtvalues"); + $this->db->select("GROUP_CONCAT(DATE_FORMAT(attribute_date, $format) SEPARATOR ', ') AS attribute_dtvalues"); $this->db->from('attribute_links'); $this->db->join('attribute_values', 'attribute_values.attribute_id = attribute_links.attribute_id'); $this->db->join('attribute_definitions', 'attribute_definitions.definition_id = attribute_links.definition_id'); @@ -521,21 +521,18 @@ class Attribute extends CI_Model public function save_value($attribute_value, $definition_id, $item_id = FALSE, $attribute_id = FALSE, $definition_type = DROPDOWN) { - $this->db->trans_start(); + $this->db->trans_start(); if(empty($attribute_id) || empty($item_id)) { if($definition_type == TEXT || $definition_type == DROPDOWN) { - $attribute_id_check = $this->value_exists($attribute_value); - if(empty($attribute_id_check)) + $attribute_id = $this->value_exists($attribute_value); + + if(empty($attribute_id)) { $this->db->insert('attribute_values', array('attribute_value' => $attribute_value)); } - else - { - $attribute_id = $attribute_id_check; - } } else if($definition_type == DECIMAL) { @@ -543,19 +540,16 @@ class Attribute extends CI_Model } else { - $this->db->insert('attribute_values', array('attribute_datetime' => date('Y-m-d H:i:s', strtotime($attribute_value)))); + $this->db->insert('attribute_values', array('attribute_date' => date('Y-m-d', strtotime($attribute_value)))); } - $attribute_id = $this->db->insert_id(); + $attribute_id = $attribute_id ? $attribute_id : $this->db->insert_id(); $this->db->insert('attribute_links', array( 'attribute_id' => empty($attribute_id) ? NULL : $attribute_id, 'item_id' => empty($item_id) ? NULL : $item_id, 'definition_id' => $definition_id)); } - else - { - $this->db->where('attribute_id', $attribute_id); $this->db->trans_complete(); diff --git a/application/models/Item.php b/application/models/Item.php index 0bcf9a89b..a8d916f70 100644 --- a/application/models/Item.php +++ b/application/models/Item.php @@ -194,7 +194,7 @@ class Item extends CI_Model { $format = $this->db->escape(dateformat_mysql()); $this->db->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\'_\', definition_id, attribute_value) ORDER BY definition_id SEPARATOR \'|\') AS attribute_values'); - $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_datetime, $format)) SEPARATOR '|') AS attribute_dtvalues"); + $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_date, $format)) SEPARATOR '|') AS attribute_dtvalues"); $this->db->join('attribute_links', 'attribute_links.item_id = items.item_id AND attribute_links.receiving_id IS NULL AND attribute_links.sale_id IS NULL AND definition_id IN (' . implode(',', $filters['definition_ids']) . ')', 'left'); $this->db->join('attribute_values', 'attribute_values.attribute_id = attribute_links.attribute_id', 'left'); } @@ -281,7 +281,7 @@ class Item extends CI_Model { $this->db->select('items.*'); $this->db->select('GROUP_CONCAT(attribute_value SEPARATOR \'|\') AS attribute_values'); - $this->db->select('GROUP_CONCAT(attribute_datetime SEPARATOR \'|\') AS attribute_dtvalues'); + $this->db->select('GROUP_CONCAT(attribute_date SEPARATOR \'|\') AS attribute_dtvalues'); $this->db->select('suppliers.company_name'); $this->db->from('items'); $this->db->join('suppliers', 'suppliers.person_id = items.supplier_id', 'left'); @@ -379,8 +379,8 @@ class Item extends CI_Model { $this->db->select('items.*'); $this->db->select('company_name'); - $this->db->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\':\', definition_id, attribute_value) ORDER BY definition_id SEPARATOR \'|\') AS attribute_values'); - $this->db->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\':\', definition_id, attribute_datetime) ORDER BY definition_id SEPARATOR \'|\') AS attribute_dtvalues'); + $this->db->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\'_\', definition_id, attribute_value) ORDER BY definition_id SEPARATOR \'|\') AS attribute_values'); + $this->db->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\'_\', definition_id, attribute_date) ORDER BY definition_id SEPARATOR \'|\') AS attribute_dtvalues'); $this->db->select('quantity'); $this->db->from('items'); $this->db->join('suppliers', 'suppliers.person_id = items.supplier_id', 'left'); diff --git a/application/models/reports/Detailed_receivings.php b/application/models/reports/Detailed_receivings.php index dfb8f645a..e00c67083 100644 --- a/application/models/reports/Detailed_receivings.php +++ b/application/models/reports/Detailed_receivings.php @@ -104,7 +104,7 @@ class Detailed_receivings extends Report { $format = $this->db->escape(dateformat_mysql()); $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, attribute_value) ORDER BY definition_id SEPARATOR '|') AS attribute_values"); - $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_datetime, $format)) SEPARATOR '|') AS attribute_dtvalues"); + $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_date, $format)) SEPARATOR '|') AS attribute_dtvalues"); $this->db->join('attribute_links', 'attribute_links.item_id = items.item_id AND attribute_links.receiving_id = receivings_items_temp.receiving_id AND definition_id IN (' . implode(',', $inputs['definition_ids']) . ')', 'left'); $this->db->join('attribute_values', 'attribute_values.attribute_id = attribute_links.attribute_id', 'left'); $this->db->group_by('receivings_items_temp.receiving_id, receivings_items_temp.item_id'); diff --git a/application/models/reports/Detailed_sales.php b/application/models/reports/Detailed_sales.php index b53306413..6121fb4b7 100644 --- a/application/models/reports/Detailed_sales.php +++ b/application/models/reports/Detailed_sales.php @@ -150,7 +150,7 @@ class Detailed_sales extends Report { $format = $this->db->escape(dateformat_mysql()); $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, attribute_value) ORDER BY definition_id SEPARATOR '|') AS attribute_values"); - $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_datetime, $format)) SEPARATOR '|') AS attribute_datetimevalues"); + $this->db->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_date, $format)) SEPARATOR '|') AS attribute_dtvalues"); $this->db->join('attribute_links', 'attribute_links.item_id = sales_items_temp.item_id AND attribute_links.sale_id = sales_items_temp.sale_id AND definition_id IN (' . implode(',', $inputs['definition_ids']) . ')', 'left'); $this->db->join('attribute_values', 'attribute_values.attribute_id = attribute_links.attribute_id', 'left'); $this->db->group_by('sales_items_temp.sale_id, sales_items_temp.item_id'); diff --git a/application/models/tokens/Token.php b/application/models/tokens/Token.php index e4c652c07..d482de0e4 100644 --- a/application/models/tokens/Token.php +++ b/application/models/tokens/Token.php @@ -1,13 +1,13 @@ lang->line('attributes_attribute_value_invalid_chars'); ?>"); + $('form').bind('submit', function () { + $(this).find(':input').prop('disabled', false); + }); + $('#attribute_form').validate($.extend({ submitHandler: function(form) { @@ -217,4 +221,4 @@ $(document).ready(function() } }, form_support.error)); }); - \ No newline at end of file + diff --git a/application/views/attributes/item.php b/application/views/attributes/item.php index b0a99accc..df0f1a236 100644 --- a/application/views/attributes/item.php +++ b/application/views/attributes/item.php @@ -22,12 +22,12 @@ foreach($definition_values as $definition_id => $definition_value) echo form_hidden("attribute_ids[$definition_id]", $definition_value['attribute_id']); $attribute_value = $definition_value['attribute_value']; - if ($definition_value['definition_type'] == DATETIME) + if ($definition_value['definition_type'] == DATE) { - $value = (empty($attribute_value) || empty($attribute_value->attribute_datetime)) ? DEFAULT_DATETIME : strtotime($attribute_value->attribute_datetime); + $value = (empty($attribute_value) || empty($attribute_value->attribute_date)) ? DEFAULT_DATE : strtotime($attribute_value->attribute_date); echo form_input(array( 'name' => "attribute_links[$definition_id]", - 'value' => to_datetime($value), + 'value' => to_date($value), 'class' => 'form-control input-sm datetime', 'data-definition-id' => $definition_id, 'readonly' => 'true')); @@ -59,7 +59,7 @@ foreach($definition_values as $definition_id => $definition_value)