diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 2acfd9f41..0d4ec9275 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -3439,8 +3439,18 @@ EOF } $sInputType = ''; $sInputId = 'att_'.$iFieldIndex; + $value = $this->Get($sAttCode); + $sDisplayValue = $this->GetEditValue($sAttCode); + if ($oAttDef instanceof AttributeDateTime && !$oAttDef->IsNullAllowed() && $value === $oAttDef->GetNullValue()) { + $value = $oAttDef->GetDefaultValue($this); + if ($value !== $oAttDef->GetNullValue()) { + // Set default date + $this->Set($sAttCode, $value); + $sDisplayValue = $this->GetEditValue($sAttCode); + } + } $sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, - $this->Get($sAttCode), $this->GetEditValue($sAttCode), $sInputId, '', $iExpectCode, + $value, $sDisplayValue, $sInputId, '', $iExpectCode, $aArgs, true, $sInputType); $aAttrib = array( 'label' => ''.$oAttDef->GetLabel().'', diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index 26e3095b2..c90328426 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -6347,7 +6347,11 @@ class AttributeDateTime extends AttributeDBField $oFormField = parent::MakeFormField($oObject, $oFormField); // After call to the parent as it sets the current value - $oFormField->SetCurrentValue($this->GetFormat()->Format($oObject->Get($this->GetCode()))); + $oValue = $oObject->Get($this->GetCode()); + if ($oValue === $this->GetNullValue()) { + $oValue = $this->GetDefaultValue($oObject); + } + $oFormField->SetCurrentValue($this->GetFormat()->Format($oValue)); return $oFormField; } @@ -6433,8 +6437,20 @@ class AttributeDateTime extends AttributeDBField public function GetDefaultValue(DBObject $oHostObject = null) { - if (!$this->IsNullAllowed()) { - return date($this->GetInternalFormat()); + $sDefaultValue = $this->Get('default_value'); + if (!$this->IsNullAllowed() && $sDefaultValue !== '') { + try { + $oDate = new DateTimeImmutable($sDefaultValue); + } + catch (Exception $e) { + IssueLog::Error($e->getMessage(), null, [ + 'class' => get_class($this), + 'name' => $this->GetCode(), + 'stack' => $e->getTraceAsString()]); + return $this->GetNullValue(); + } + + return $oDate->format($this->GetInternalFormat()); } return $this->GetNullValue(); } diff --git a/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php b/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php index b3dccfc54..e875fbacb 100644 --- a/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php +++ b/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php @@ -2,6 +2,8 @@ namespace Combodo\iTop\Test\UnitTest\Core; +use AttributeDate; +use AttributeDateTime; use Change; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; @@ -229,7 +231,7 @@ PHP $this->assertEquals($bComputationExpected, $oAttDef->HasPHPComputation(), "Standard DataModel should be configured with property 'has_php_computation'=$sComputationExpected for $sClass:$sAttCode"); } - public function WithConstraintParameterProvider() + public static function WithConstraintParameterProvider() { return [ ['User', 'profile_list', true, true], @@ -238,4 +240,109 @@ PHP ['Ticket', 'functionalcis_list', false, true], ]; } + + public function testDateTimeEmptyDefaultReturnsNullAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDateTime('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => '', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + self::assertNull($defaultValue, 'Empty default value for DateTime attribute should give null default value'); + self::assertEmpty($oField->GetCurrentValue(), 'Empty default value for DateTime attribute should give empty form field'); + } + + public function testDateEmptyDefaultReturnsNullAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDate('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => '', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + self::assertNull($defaultValue, 'Empty default value for Date attribute should give null default value'); + self::assertEmpty($oField->GetCurrentValue(), 'Empty default value for DateTime attribute should give empty form field'); + } + + + public function testDateTimeNowAsDefaultGivesCurrentDateAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDateTime('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => 'now', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + $sNow = date($oDateAttribute->GetInternalFormat()); + self::assertEquals($sNow, $defaultValue, 'Now as default value for DateTime attribute should give current date as default value'); + self::assertEquals($sNow, $oField->GetCurrentValue(), 'Now as default value for DateTime attribute should give current date as form field'); + } + + + public function testDateNowAsDefaultGivesCurrentDateAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDate('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => 'now', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + $sNow = date($oDateAttribute->GetInternalFormat()); + self::assertEquals($sNow, $defaultValue, 'Now as default value for Date attribute should give current date as default value'); + self::assertEquals($sNow, $oField->GetCurrentValue(), 'Now as default value for Date attribute should give current date as form field'); + } + + public function testDateTimeIntervalAsDefaultGivesCorrectDateAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDateTime('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => '+1day', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + $oDate = new \DateTimeImmutable('+1day'); + $sExpected = $oDate->format($oDateAttribute->GetInternalFormat()); + self::assertEquals($sExpected, $defaultValue, 'Interval as default value for DateTime attribute should give correct date as default value'); + self::assertEquals($sExpected, $oField->GetCurrentValue(), 'Interval as default value for DateTime attribute should give correct date as form field'); + } + + public function testDateIntervalAsDefaultGivesCorrectDateAsDefaultValue() + { + // Given + $oDateAttribute = new AttributeDate('start_date', ['sql' => 'start_date', 'is_null_allowed' => false, 'default_value' => '+1day', 'allowed_values' => null, 'depends_on' => [], 'always_load_in_tables' => false]); + $oDateAttribute->SetHostClass('WorkOrder'); + $oWorkOrder = MetaModel::NewObject('WorkOrder'); + + //When + $defaultValue = $oDateAttribute->GetDefaultValue(); + $oField = $oDateAttribute->MakeFormField($oWorkOrder); + + // Then + $oDate = new \DateTimeImmutable('+1day'); + $sExpected = $oDate->format($oDateAttribute->GetInternalFormat()); + self::assertEquals($sExpected, $defaultValue, 'Interval as default value for Date attribute should give correct date as default value'); + self::assertEquals($sExpected, $oField->GetCurrentValue(), 'Interval as default value for Date attribute should give correct date as form field'); + } + } \ No newline at end of file