[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Noalyss-commit] [noalyss] 117/151: Indent properly
From: |
Dany De Bontridder |
Subject: |
[Noalyss-commit] [noalyss] 117/151: Indent properly |
Date: |
Sat, 4 Feb 2017 17:14:33 +0000 (UTC) |
sparkyx pushed a commit to branch master
in repository noalyss.
commit 99c79bf60ddae376ea5b2adb45b38809a8822fda
Author: Dany De Bontridder <address@hidden>
Date: Sat Jan 14 09:58:26 2017 +0100
Indent properly
---
include/lib/class_manage_table_sql.php | 746 +++++++++++++++++---------------
1 file changed, 389 insertions(+), 357 deletions(-)
diff --git a/include/lib/class_manage_table_sql.php
b/include/lib/class_manage_table_sql.php
index 99af349..f91d4bb 100644
--- a/include/lib/class_manage_table_sql.php
+++ b/include/lib/class_manage_table_sql.php
@@ -1,4 +1,5 @@
<?php
+
/*
* This file is part of NOALYSS.
*
@@ -21,379 +22,410 @@
//@brief Definition Manage_Table_SQL
/**
- address@hidden Purpose is to propose a librairy to display a table content
+ * @brief Purpose is to propose a librairy to display a table content
* and allow to update and delete row , handle also the ajax call
* thanks the script managetable.js
- address@hidden ManageTable
+ * @see ManageTable
*/
-class Manage_Table_SQL
+class Manage_Table_SQL
{
- private $table ; //!< Object Noalyss_SQL
- private $a_label_displaid; //!< Label of the col. of the datarow
+
+ private $table; //!< Object Noalyss_SQL
+ private $a_label_displaid; //!< Label of the col. of the datarow
private $a_order; //!< order of the col
- private $a_prop ; //!< property for each col.
- private $object_name; //!< Object_name is used for the javascript
- private $row_delete; //!< Flag to indicate if rows can be deleted
- private $row_update; //!< Flag to indicate if rows can be updated
+ private $a_prop; //!< property for each col.
+ private $object_name; //!< Object_name is used for the javascript
+ private $row_delete; //!< Flag to indicate if rows can be deleted
+ private $row_update; //!< Flag to indicate if rows can be updated
+
const UPDATABLE=1;
const VISIBLE=2;
- /**
- address@hidden Constructor : set the label to the column name,
+
+ /**
+ * @brief Constructor : set the label to the column name,
* the order of the column , set the properties and the
* permission for updating or deleting row
- */
- function __construct(Noalyss_SQL $p_table)
- {
- $this->table=$p_table;
- $order=0;
- foreach ($this->table->name as $key=> $value)
- {
-
- $this->a_label_displaid[$value]=$value;
- $this->a_order[$order]=$value;
- $this->a_prop[$value]=self::UPDATABLE|self::VISIBLE;
- $order++;
- }
- $this->object_name=uniqid("tbl");
- $this->row_delete=TRUE;
- $this->row_update=TRUE;
-
- }
- /**
- address@hidden set the callback function that is passed to javascript
- address@hidden $p_file : callback file by default ajax.php
- */
- function set_callback($p_file)
- {
- $this->callback=$p_file;
- }
- /**
- address@hidden we must create first the javascript if we want to update
or delete
- * row. It is the default script .
- */
- function create_js_script() {
- echo "
+ */
+ function __construct(Noalyss_SQL $p_table)
+ {
+ $this->table=$p_table;
+ $order=0;
+ foreach ($this->table->name as $key=> $value)
+ {
+
+ $this->a_label_displaid[$value]=$value;
+ $this->a_order[$order]=$value;
+ $this->a_prop[$value]=self::UPDATABLE|self::VISIBLE;
+ $order++;
+ }
+ $this->object_name=uniqid("tbl");
+ $this->row_delete=TRUE;
+ $this->row_update=TRUE;
+ }
+
+ /**
+ * @brief set the callback function that is passed to javascript
+ * @param $p_file : callback file by default ajax.php
+ */
+ function set_callback($p_file)
+ {
+ $this->callback=$p_file;
+ }
+
+ /**
+ * @brief we must create first the javascript if we want to update or
delete
+ * row. It is the default script .
+ */
+ function create_js_script()
+ {
+ echo "
<script>
var {$this->object_name}=new
ManageTable(\"{$this->table->tablename}\");
{$this->object_name}.set_callback(\"{$this->callback}\");
</script>
";
- }
- /**
- address@hidden set a column of the data row updatable or not
- address@hidden string $p_key data column
- address@hidden bool $p_value Boolean False or True
- */
- function set_property_updatable($p_key,$p_value)
- {
- if ( ! $this->a_prop[$p_key] )
- throw new Exception (__FILE__.":".__LINE__."$p_key
invalid index");
- if ( $p_value==False )
-
$this->a_prop[$p_key]=$this->a_prop[$p_key]-self::UPDATABLE;
- elseif ( $p_value==True)
-
$this->a_prop[$p_key]=$this->a_prop[$p_key]|self::UPDATABLE;
- else
- throw new Exception ("set_property_updatable [ $p_value
] incorrect";
- }
- /**
- address@hidden return false if the update of the row is forbidden
- */
- function can_update_row() {
-
- return $this->row_update;
- }
- /**
- address@hidden Enable or disable the updating of rows
- address@hidden $p_value Boolean : true enable the row to be updated
- */
- function set_update_row($p_value) {
- if ( $p_value !== True && $p_value !== False ) throw new
Exception ("Valeur invalide set_update_row [$p_value]");
- $this->row_update=$p_value;
- }
- /**
- address@hidden return false if the delete of the row is forbidden
- */
- function can_delete_row() {
- return $this->row_delete;
-
- }
- /**
- address@hidden Enable or disable the deleting of rows
- address@hidden $p_value Boolean : true enable the row to be deleted
- */
- function set_delete_row($p_value) {
- if ( $p_value !== True && $p_value !== False ) throw new
Exception ("Valeur invalide set_delete_row [$p_value]");
- $this->row_delete=$p_value;
- }
- /**
- address@hidden return True if the column is updatable otherwise false
- address@hidden $p_key data column
- */
- function get_property_updatable($p_key)
- {
- if ( $this->a_prop[$p_key] & self:UPDATABLE == 1) return true;
- return false;
-
- }
- /**
- address@hidden set a column of the data row visible or not
- address@hidden string $p_key data column
- address@hidden bool $p_value Boolean False or True
- */
- function set_property_visible($p_key,$p_value)
- {
- if ( ! $this->a_prop[$p_key] )
- throw new Exception (__FILE__.":".__LINE__."$p_key
invalid index");
- if ( $p_value==False )
-
$this->a_prop[$p_key]=$this->a_prop[$p_key]-self::VISIBLE;
- elseif ( $p_value==True)
-
$this->a_prop[$p_key]=$this->a_prop[$p_key]|self::VISIBLE;
- else
- throw new Exception ("set_property_updatable [ $p_value
] incorrect";
-
- }
- /**
- address@hidden return True if the column is visible otherwise false
- address@hidden $p_key data column
- */
- function get_property_visible($p_key)
- {
- if ( $this->a_prop[$p_key] & self:VISIBLE == 1) return true;
- return false;
-
- }
- /**
- address@hidden set the name to display for a column
- address@hidden string $p_key data column
- address@hidden string $p_display Label to display
- *
- */
- function set_col_label($p_key,$p_display)
- {
- $this->a_label_displaid[$p_key]=$p_display;
- }
- /**
- address@hidden get the position of a column
- address@hidden $p_key data column
- */
- function get_current_pos($p_key)
- {
- $nb_order=count($this->a_order);
- for ($i=0;$i<$nb_order;$i++)
- if ( $this->a_order[$i]==$p_key) return $i;
- throw new Exception ("COL INVAL ".$p_key);
-
- }
- /**
- address@hidden if we change a column order , the order
- * of the other columns is impacted.
- *
- * With a_order[0,1,2,3]=[x,y,z,a]
- * if we move the column x (idx=0) to 2
- * we must obtain [y,z,x,a]
- address@hidden string $p_key data column
- address@hidden integer $p_idx new location
- */
- function move($p_key,$p_idx)
- {
- // get current position of p_key
- $cur_pos=$this->get_current_pos($p_key);
-
- if ( $cur_pos == $p_idx ) return ;
-
- if ( $cur_pos < $p_idx )
- {
- $nb_order=count($this->a_order);
- for ($i=0;$i<$nb_order;$i++) {
- // if col_name is not the searched one we
continue
- if ( $this->a_order[$i] != $p_key ) continue;
- if ( $p_idx == $i ) continue;
- // otherwise we swap with i+1
- $old=$this->a_order[$i+1];
- $this->a_order[$i]=$this->a_order[$i+1];
- $this->a_order[$i+1]=$p_key;
- }
- } else {
-
- $nb_order=count($this->a_order)-1;
- for ($i=$nb_order;$i>0;$i--) {
- // if col_name is not the searched one we
continue
- if ( $this->a_order[$i] != $p_key ) continue;
- if ( $p_idx == $i ) continue;
- // otherwise we swap with i+1
- $old=$this->a_order[$i-1];
- $this->a_order[$i]=$this->a_order[$i-1];
- $this->a_order[$i-1]=$p_key;
- }
-
- }
-
- }
-
- /**
- address@hidden display the data of the table
- */
- function display_table()
- {
- $ret=$this->table->seek();
- $nb=Database::num_count($ret);
- printf ('<table id="tb%s">',$this->object_name);
- for ($i=0;$i< $nb ; $i++ )
- {
- if ( $i == 0 ) {
- $this->display_table_header();
- }
- $row=Database::fetch_array($ret,$i);
- $this->display_row($row);
- }
- }
- /**
- address@hidden display the column header excepted the not visible one
- * and in the order defined with $this->a_order
- */
-
- function display_table_header()
- {
- $nb=count($this->a_order);
- echo "<tr>";
-
- for ($i=0;$i < $nb ; $i++ ) {
-
- $key=$this->a_order[$i];
- if ( $this->get_property_visible($key) )
- echo th($this->a_label_displaid[$key]);
- }
- echo "</tr>";
-
- }
- /**
- address@hidden set the id value of a data row
- */
- function set_pk($p_id)
- {
- $this->table->set_pk_value($p_id);
- }
- /**
- address@hidden get the data from http request
- */
- function from_request()
- {
- $nb=count($this->a_order);
- for ($i=0;$i < $nb ; $i++ ) {
-
$v=HtmlInput::default_value_request($this->a_order[$i],"");
- $key=$this->a_order[$i];
- $this->table->$key=$v;
- }
-
- }
- /**
- address@hidden display a data row in the table, with the order defined
- * in a_order and depending of the visibility of the column
- address@hidden display_table
- */
- private function display_row($p_row)
- {
-
- printf ('<tr id="%s_%s">',
- $this->object_name,
+ }
+
+ /**
+ * @brief set a column of the data row updatable or not
+ * @param string $p_key data column
+ * @param bool $p_value Boolean False or True
+ */
+ function set_property_updatable($p_key, $p_value)
+ {
+ if (!$this->a_prop[$p_key])
+ throw new Exception(__FILE__.":".__LINE__."$p_key invalid index");
+ if ($p_value==False)
+ $this->a_prop[$p_key]=$this->a_prop[$p_key]-self::UPDATABLE;
+ elseif ($p_value==True)
+ $this->a_prop[$p_key]=$this->a_prop[$p_key]|self::UPDATABLE;
+ else
+ throw new Exception ("set_property_updatable [ $p_value ]
incorrect";
+ }
+
+ /**
+ * @brief return false if the update of the row is forbidden
+ */
+ function can_update_row()
+ {
+
+ return $this->row_update;
+ }
+
+ /**
+ * @brief Enable or disable the updating of rows
+ * @param $p_value Boolean : true enable the row to be updated
+ */
+ function set_update_row($p_value)
+ {
+ if ($p_value!==True&&$p_value!==False)
+ throw new Exception("Valeur invalide set_update_row [$p_value]");
+ $this->row_update=$p_value;
+ }
+
+ /**
+ * @brief return false if the delete of the row is forbidden
+ */
+ function can_delete_row()
+ {
+ return $this->row_delete;
+ }
+
+ /**
+ * @brief Enable or disable the deleting of rows
+ * @param $p_value Boolean : true enable the row to be deleted
+ */
+ function set_delete_row($p_value)
+ {
+ if ($p_value!==True&&$p_value!==False)
+ throw new Exception("Valeur invalide set_delete_row [$p_value]");
+ $this->row_delete=$p_value;
+ }
+
+ /**
+ * @brief return True if the column is updatable otherwise false
+ * @param $p_key data column
+ */
+ function get_property_updatable($p_key)
+ {
+ if ( $this->a_prop[$p_key] & self:UPDATABLE == 1) return true;
+ return false;
+ }
+
+ /**
+ * @brief set a column of the data row visible or not
+ * @param string $p_key data column
+ * @param bool $p_value Boolean False or True
+ */
+ function set_property_visible($p_key, $p_value)
+ {
+ if (!$this->a_prop[$p_key])
+ throw new Exception(__FILE__.":".__LINE__."$p_key invalid index");
+ if ($p_value==False)
+ $this->a_prop[$p_key]=$this->a_prop[$p_key]-self::VISIBLE;
+ elseif ($p_value==True)
+ $this->a_prop[$p_key]=$this->a_prop[$p_key]|self::VISIBLE;
+ else
+ throw new Exception ("set_property_updatable [ $p_value ]
incorrect";
+ }
+
+ /**
+ * @brief return True if the column is visible otherwise false
+ * @param $p_key data column
+ */
+ function get_property_visible($p_key)
+ {
+ if ( $this->a_prop[$p_key] & self:VISIBLE == 1) return true;
+ return false;
+ }
+
+ /**
+ * @brief set the name to display for a column
+ * @param string $p_key data column
+ * @param string $p_display Label to display
+ *
+ */
+ function set_col_label($p_key, $p_display)
+ {
+ $this->a_label_displaid[$p_key]=$p_display;
+ }
+
+ /**
+ * @brief get the position of a column
+ * @param $p_key data column
+ */
+ function get_current_pos($p_key)
+ {
+ $nb_order=count($this->a_order);
+ for ($i=0; $i<$nb_order; $i++)
+ if ($this->a_order[$i]==$p_key)
+ return $i;
+ throw new Exception("COL INVAL ".$p_key);
+ }
+
+ /**
+ * @brief if we change a column order , the order
+ * of the other columns is impacted.
+ *
+ * With a_order[0,1,2,3]=[x,y,z,a]
+ * if we move the column x (idx=0) to 2
+ * we must obtain [y,z,x,a]
+ * @param string $p_key data column
+ * @param integer $p_idx new location
+ */
+ function move($p_key, $p_idx)
+ {
+ // get current position of p_key
+ $cur_pos=$this->get_current_pos($p_key);
+
+ if ($cur_pos==$p_idx)
+ return;
+
+ if ($cur_pos<$p_idx)
+ {
+ $nb_order=count($this->a_order);
+ for ($i=0; $i<$nb_order; $i++)
+ {
+ // if col_name is not the searched one we continue
+ if ($this->a_order[$i]!=$p_key)
+ continue;
+ if ($p_idx==$i)
+ continue;
+ // otherwise we swap with i+1
+ $old=$this->a_order[$i+1];
+ $this->a_order[$i]=$this->a_order[$i+1];
+ $this->a_order[$i+1]=$p_key;
+ }
+ } else
+ {
+
+ $nb_order=count($this->a_order)-1;
+ for ($i=$nb_order; $i>0; $i--)
+ {
+ // if col_name is not the searched one we continue
+ if ($this->a_order[$i]!=$p_key)
+ continue;
+ if ($p_idx==$i)
+ continue;
+ // otherwise we swap with i+1
+ $old=$this->a_order[$i-1];
+ $this->a_order[$i]=$this->a_order[$i-1];
+ $this->a_order[$i-1]=$p_key;
+ }
+ }
+ }
+
+ /**
+ * @brief display the data of the table
+ */
+ function display_table()
+ {
+ $ret=$this->table->seek();
+ $nb=Database::num_count($ret);
+ printf('<table id="tb%s">', $this->object_name);
+ for ($i=0; $i<$nb; $i++)
+ {
+ if ($i==0)
+ {
+ $this->display_table_header();
+ }
+ $row=Database::fetch_array($ret, $i);
+ $this->display_row($row);
+ }
+ }
+
+ /**
+ * @brief display the column header excepted the not visible one
+ * and in the order defined with $this->a_order
+ */
+ function display_table_header()
+ {
+ $nb=count($this->a_order);
+ echo "<tr>";
+
+ for ($i=0; $i<$nb; $i++)
+ {
+
+ $key=$this->a_order[$i];
+ if ($this->get_property_visible($key))
+ echo th($this->a_label_displaid[$key]);
+ }
+ echo "</tr>";
+ }
+
+ /**
+ * @brief set the id value of a data row
+ */
+ function set_pk($p_id)
+ {
+ $this->table->set_pk_value($p_id);
+ }
+
+ /**
+ * @brief get the data from http request
+ */
+ function from_request()
+ {
+ $nb=count($this->a_order);
+ for ($i=0; $i<$nb; $i++)
+ {
+ $v=HtmlInput::default_value_request($this->a_order[$i], "");
+ $key=$this->a_order[$i];
+ $this->table->$key=$v;
+ }
+ }
+
+ /**
+ * @brief display a data row in the table, with the order defined
+ * in a_order and depending of the visibility of the column
+ * @see display_table
+ */
+ private function display_row($p_row)
+ {
+
+ printf('<tr id="%s_%s">', $this->object_name,
$p_row[$this->table->primary_key])
;
- $nb_order=count($this->a_order);
- for ($i=0;$i < $nb_order ; $i++)
- {
- $v=$this->a_order($i);
- if ( $this->get_property_visible($v) )
- echo td($p_row[$v]);
- }
- echo "<td>";
- if ( $this->can_update_row() ) {
- $js=printf ("ManageTable.input('%s','%s');",
- $p_row[$this->table->primary_key],
- $this->object_name
- );
- }
- echo "</td>";
- echo "<td>";
- if ( $this->can_delete_row() ) {
- $js=printf ("ManageTable.delete('%s','%s');",
- $p_row[$this->table->primary_key],
- $this->object_name
-
- );
-
- }
- echo "</td>";
- echo '</tr>';
- }
- /**
- address@hidden display into a dialog box the datarow in order
- * to be appended or modified
- */
- function input()
- {
- $nb_order=count($this->a_order);
- echo "<table>";
- echo "<tr>";
- for ( $i=0; $i <$nb_order ; $i++ )
- {
- $key=$this->a_order[$i];
- $label=$this->a_label_displaid[$key];
- $value=$this->table->get($key);
-
- // Label
- echo "<td> {$label} </td>";
- printf('<input type="text" label="%s" value="%s"
name="%s" id="%s">',
- $label,
- $value,
- $key,
- $key
- );
- }
- echo "</tr>";
- echo "</table>";
- }
- /**
- address@hidden delete a datarow , the id must be have set before
- address@hidden from_request
- */
- function delete() {
- $this->table->delete();
- }
- /**
- address@hidden save the Noalyss_SQL Object
- *The noalyss_SQL is not empty
- address@hidden from_request
- */
- function save() {
- $this->table->save();
- }
- /**
- address@hidden insert a new value
- address@hidden set_pk_value
- address@hidden from_request
- */
- function insert() {
- $this->table->insert();
- }
- /**
- address@hidden
- address@hidden set_pk_value
- address@hidden from_request
- */
- function update() {
- $this->table->update();
- }
- /**
- address@hidden
- address@hidden set_pk_value
- address@hidden from_request
- */
- function set_value($p_key,$p_value)
- {
- $this->table->set($p_key,$p_value);
- }
-
-}
+ $nb_order=count($this->a_order);
+ for ($i=0; $i<$nb_order; $i++)
+ {
+ $v=$this->a_order($i);
+ if ($this->get_property_visible($v))
+ echo td($p_row[$v]);
+ }
+ echo "<td>";
+ if ($this->can_update_row())
+ {
+ $js=printf("ManageTable.input('%s','%s');",
+ $p_row[$this->table->primary_key], $this->object_name
+ );
+ }
+ echo "</td>";
+ echo "<td>";
+ if ($this->can_delete_row())
+ {
+ $js=printf("ManageTable.delete('%s','%s');",
+ $p_row[$this->table->primary_key], $this->object_name
+ );
+ }
+ echo "</td>";
+ echo '</tr>';
+ }
+
+ /**
+ * @brief display into a dialog box the datarow in order
+ * to be appended or modified
+ */
+ function input()
+ {
+ $nb_order=count($this->a_order);
+ echo "<table>";
+ echo "<tr>";
+ for ($i=0; $i<$nb_order; $i++)
+ {
+ $key=$this->a_order[$i];
+ $label=$this->a_label_displaid[$key];
+ $value=$this->table->get($key);
+
+ // Label
+ echo "<td> {$label} </td>";
+ printf('<input type="text" label="%s" value="%s" name="%s"
id="%s">',
+ $label, $value, $key, $key
+ );
+ }
+ echo "</tr>";
+ echo "</table>";
+ }
+
+ /**
+ * @brief delete a datarow , the id must be have set before
+ * @see from_request
+ */
+ function delete()
+ {
+ $this->table->delete();
+ }
+
+ /**
+ * @brief save the Noalyss_SQL Object
+ * The noalyss_SQL is not empty
+ * @see from_request
+ */
+ function save()
+ {
+ $this->table->save();
+ }
+ /**
+ * @brief insert a new value
+ * @see set_pk_value
+ * @see from_request
+ */
+ function insert()
+ {
+ $this->table->insert();
+ }
+
+ /**
+ * @brief
+ * @see set_pk_value
+ * @see from_request
+ */
+ function update()
+ {
+ $this->table->update();
+ }
+
+ /**
+ * @brief
+ * @see set_pk_value
+ * @see from_request
+ */
+ function set_value($p_key, $p_value)
+ {
+ $this->table->set($p_key, $p_value);
+ }
+
+}
- [Noalyss-commit] [noalyss] 126/151: Correct js : this of the object is not callable from a nested function, (continued)
- [Noalyss-commit] [noalyss] 126/151: Correct js : this of the object is not callable from a nested function, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 135/151: Fix bug : duplicate doesn't take in account the TVA_ID, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 148/151: Missing col in ANC_TABLE, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 111/151: Improve Manage_Table_SQL : add functions for javascript , update or visible flag ..., Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 147/151: Return must be after throw, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 141/151: ManageTable colorize the row in alternate, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 150/151: Improve Doxygen setting, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 133/151: Correct Manage Table , finish implementing, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 03/151: CSS : Update style mobile, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 57/151: CSS : Update style mobile, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 117/151: Indent properly,
Dany De Bontridder <=
- [Noalyss-commit] [noalyss] 89/151: remove debug info, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 114/151: Move class_table_sql to lib , since it is usable without Noalyss, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 127/151: Add the noalyss version in the info page, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 121/151: Fix several issue in JS, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 98/151: Correct simul.py remove old file, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 146/151: Merge branch 'master' of ns3:/srv/git/noalyss, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 142/151: Doc : complete documentation, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 119/151: correct syntax, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 151/151: Improve description, Dany De Bontridder, 2017/02/04
- [Noalyss-commit] [noalyss] 145/151: change name alternate_row_color, Dany De Bontridder, 2017/02/04