<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0">
  <classes>
    <class id="Attachment" _delta="define">
      <parent>DBObject</parent>
      <properties>
        <comment><![CDATA[/**
 * Module attachments
 * 
 * A quick and easy way to upload and attach files to *any* (see Configuration below) object in the CMBD in one click
 *
 * Configuration: the list of classes for which the "Attachments" tab is visible is defined via the module's 'allowed_classes'
 * configuration parameter. By default the tab is active for all kind of Tickets.
 *
 * @copyright   Copyright (C) 2010-2021 Combodo SARL
 * @license     http://opensource.org/licenses/AGPL-3.0
 */]]></comment>
        <category>addon,bizmodel</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>attachment</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field/>
        <naming>
          <attributes>
            <attribute id="item_class"/>
            <attribute id="temp_id"/>
          </attributes>
        </naming>
        <icon/>
        <reconciliation>
          <attributes>
            <attribute id=""/>
          </attributes>
        </reconciliation>
        <indexes>
          <index id="1">
            <attributes>
              <attribute id="temp_id"/>
            </attributes>
          </index>
          <index id="2">
            <attributes>
              <attribute id="item_class"/>
              <attribute id="item_id"/>
            </attributes>
          </index>
          <index id="3">
            <attributes>
              <attribute id="item_org_id"/>
            </attributes>
          </index>
        </indexes>
      </properties>
      <fields>
	      <field id="expire" xsi:type="AttributeDateTime">
		      <sql>expire</sql>
		      <default_value/>
		      <is_null_allowed>false</is_null_allowed>
	      </field>
	      <field id="temp_id" xsi:type="AttributeString">
		      <sql>temp_id</sql>
		      <default_value/>
		      <is_null_allowed>true</is_null_allowed>
	      </field>
	      <field id="item_class" xsi:type="AttributeString">
		      <sql>item_class</sql>
		      <default_value/>
		      <is_null_allowed>false</is_null_allowed>
	      </field>
	      <field id="item_id" xsi:type="AttributeObjectKey">
		      <sql>item_id</sql>
		      <is_null_allowed>true</is_null_allowed>
		      <class_attcode>item_class</class_attcode>
	      </field>
	      <field id="item_org_id" xsi:type="AttributeInteger">
		      <sql>item_org_id</sql>
		      <default_value>0</default_value>
		      <is_null_allowed>true</is_null_allowed>
	      </field>
	      <field id="contents" xsi:type="AttributeBlob"/>
	      <field id="creation_date" xsi:type="AttributeDateTime">
		      <sql>creation_date</sql>
		      <default_value/>
		      <is_null_allowed>true</is_null_allowed>
	      </field>
	      <field id="user_id" xsi:type="AttributeExternalKey">
		      <sql>user_id</sql>
		      <is_null_allowed>true</is_null_allowed>
		      <on_target_delete>DEL_MANUAL</on_target_delete>
		      <target_class>User</target_class>
		      <allow_target_creation>false</allow_target_creation>
	      </field>
	      <field id="contact_id" xsi:type="AttributeExternalField">
		      <extkey_attcode>user_id</extkey_attcode>
		      <target_attcode>contactid</target_attcode>
		      <dependencies>
			      <attribute id="user_id"></attribute>
		      </dependencies>
	      </field>
      </fields>
      <methods>
        <method id="MapContextParam">
          <comment><![CDATA[/**
	 * Maps the given context parameter name to the appropriate filter/search code for this class
	 * @param string $sContextParam Name of the context parameter, e.g. 'org_id'
	 * @return string Filter code, e.g. 'customer_id'
	 */]]></comment>
          <static>true</static>
          <access>public</access>
          <type>Overload-ExNihilo</type>
          <code><![CDATA[	public static function MapContextParam($sContextParam)
	{
		if ($sContextParam == 'org_id')
		{
			return 'item_org_id';
		}
		else
		{
			return null;
		}
	}]]></code>
        </method>
        <method id="SetItem">
          <comment><![CDATA[/**
	 * Set/Update all of the '_item' fields
	 * @param object $oItem Container item
	 * @return void
	 */]]></comment>
          <static>false</static>
          <access>public</access>
          <type>Overload-ExNihilo</type>
          <code><![CDATA[	public function SetItem($oItem, $bUpdateOnChange = false)
	{
		$sClass = get_class($oItem);
		$iItemId = $oItem->GetKey();

 		$this->Set('item_class', $sClass);
 		$this->Set('item_id', $iItemId);

		$aCallSpec = array($sClass, 'MapContextParam');
		if (is_callable($aCallSpec))
		{
			$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter					
			if (MetaModel::IsValidAttCode($sClass, $sAttCode))
			{
				$iOrgId = $oItem->Get($sAttCode);
				if ($iOrgId > 0)
				{
					if ($iOrgId != $this->Get('item_org_id'))
					{
						$this->Set('item_org_id', $iOrgId);
						if ($bUpdateOnChange)
						{
							$this->DBUpdate();
						}
					}
				}
			}
		}
	}]]></code>
        </method>
        <method id="SetDefaultOrgId">
          <comment>/**
	 * Give a default value for item_org_id (if relevant...)
	 * @return void
	 */</comment>
          <static>false</static>
          <access>public</access>
          <type>Overload-ExNihilo</type>
          <code><![CDATA[	public function SetDefaultOrgId()
	{
		// First check that the organization CAN be fetched from the target class
		//
		$sClass = $this->Get('item_class');
		$aCallSpec = array($sClass, 'MapContextParam');
		if (is_callable($aCallSpec))
		{
			$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter					
			if (MetaModel::IsValidAttCode($sClass, $sAttCode))
			{
				// Second: check that the organization CAN be fetched from the current user
				//
				if (MetaModel::IsValidClass('Person'))
				{
					$aCallSpec = array($sClass, 'MapContextParam');
					if (is_callable($aCallSpec))
					{
						$sAttCode = call_user_func($aCallSpec, 'org_id'); // Returns null when there is no mapping for this parameter					
						if (MetaModel::IsValidAttCode($sClass, $sAttCode))
						{
							// OK - try it
							//
							$oCurrentPerson = MetaModel::GetObject('Person', UserRights::GetContactId(), false);
							if ($oCurrentPerson)
							{
						 		$this->Set('item_org_id', $oCurrentPerson->Get($sAttCode));
						 	}
						}
					}
				}
			}
		}
	}]]></code>
        </method>
      </methods>
      <presentation>
        <details>
          <items>
            <item id="temp_id">
              <rank>10</rank>
            </item>
            <item id="item_class">
              <rank>20</rank>
            </item>
            <item id="item_id">
              <rank>30</rank>
            </item>
            <item id="item_org_id">
              <rank>40</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="temp_id">
              <rank>10</rank>
            </item>
            <item id="item_class">
              <rank>20</rank>
            </item>
            <item id="item_id">
              <rank>30</rank>
            </item>
          </items>
        </search>
	      <list>
		      <items>
			      <item id="temp_id">
				      <rank>10</rank>
			      </item>
			      <item id="item_class">
				      <rank>20</rank>
			      </item>
			      <item id="item_id">
				      <rank>30</rank>
			      </item>
			      <item id="creation_date">
				      <rank>40</rank>
			      </item>
		      </items>
	      </list>
      </presentation>
    </class>
  </classes>
</itop_design>
