<?php
/**
 * i-doit - Documentation and CMDB solution for IT environments
 *
 * This file is part of the i-doit framework. Modify at your own risk.
 *
 * Please visit http://www.i-doit.com/license for a full copyright and license information.
 *
 * @version     1.10
 * @package     i-doit
 * @author      synetics GmbH
 * @copyright   synetics GmbH
 * @url         http://www.i-doit.com
 * @license     http://www.i-doit.com/license
 */

/**
 * i-doit
 *
 * DAO: goup list
 *
 * @package    i-doit
 * @subpackage Contact
 * @copyright  synetics GmbH
 * @license    http://www.i-doit.com/license
 */
class isys_contact_dao_person extends isys_contact_dao
{
    /**
     * @param   string  $p_strSqlFilter
     * @param   integer $p_nRecStatus
     *
     * @return  isys_component_dao_result
     * @author  Niclas Potthast <npotthast@i-doit.org>
     */
    public function get_data($p_strSqlFilter = null, $p_nRecStatus = C__RECORD_STATUS__NORMAL)
    {
        $l_strSQL = "SELECT *, mail_person.isys_catg_mail_addresses_list__title AS isys_cats_person_list__mail_address, mail_pgroup.isys_catg_mail_addresses_list__title AS isys_cats_person_list__mail_address
			FROM isys_cats_person_list
			INNER JOIN isys_obj ON isys_obj__id = isys_cats_person_list__isys_obj__id
			LEFT JOIN isys_person_2_group ON isys_person_2_group__isys_obj__id__person = isys_cats_person_list__isys_obj__id
			LEFT JOIN isys_cats_person_group_list ON isys_person_2_group__isys_obj__id__group = isys_cats_person_group_list__isys_obj__id
			LEFT JOIN isys_catg_mail_addresses_list AS mail_person ON mail_person.isys_catg_mail_addresses_list__isys_obj__id = isys_cats_person_list__isys_obj__id AND mail_person.isys_catg_mail_addresses_list__primary = 1
			LEFT JOIN isys_catg_mail_addresses_list AS mail_pgroup ON mail_pgroup.isys_catg_mail_addresses_list__isys_obj__id = isys_cats_person_group_list__isys_obj__id AND mail_pgroup.isys_catg_mail_addresses_list__primary = 1
			WHERE TRUE ";

        if ($p_nRecStatus > 0)
        {
            $l_strSQL .= " AND isys_obj__status = " . $this->convert_sql_int($p_nRecStatus);
        }

        if ($p_strSqlFilter !== null)
        {
            $l_strSQL .= " AND (" . $p_strSqlFilter . ") ";
        }

        return $this->retrieve($l_strSQL . " GROUP BY isys_cats_person_list__id;");
    } // function

    /**
     * Returns a person dao by its username.
     *
     * @param   string $p_username
     *
     * @return  isys_component_dao_result
     * @author  Dennis Stücken <dstuecken@synetics.de>
     */
    public function get_person_by_username($p_username)
    {
        $l_sql = "SELECT *, isys_catg_mail_addresses_list__title AS isys_cats_person_list__mail_address
			FROM isys_cats_person_list
			LEFT JOIN isys_catg_mail_addresses_list ON isys_catg_mail_addresses_list__isys_obj__id = isys_cats_person_list__isys_obj__id AND isys_catg_mail_addresses_list__primary = 1
			WHERE isys_cats_person_list__title = " . $this->convert_sql_text($p_username) . ";";

        return $this->retrieve($l_sql);
    } // function

    /**
     * Checks if a username already exists.
     *
     * @param   string $p_title
     *
     * @return  boolean
     * @author  Dennis Stücken <dstuecken@synetics.de>
     */
    public function exists($p_title)
    {
        return (count($this->get_person_by_username($p_title)) > 0) ? true : false;
    } // function

    /**
     * Get GroupData by groupID.
     *
     * @param   integer $p_intPersonID
     *
     * @return  isys_component_dao_result
     */
    public function get_data_by_id($p_intPersonID)
    {
        return $this->get_data("isys_cats_person_list__isys_obj__id = " . $this->convert_sql_id($p_intPersonID));
    } // function

    /**
     * Get userid by ldap_dn.
     *
     * @param   string $p_ldap_dn
     *
     * @return  integer
     */
    public function get_user_id_by_ldap_dn($p_ldap_dn)
    {
        if (!is_null($p_ldap_dn))
        {
            $l_data = $this->get_data("isys_cats_person_list__ldap_dn = '$p_ldap_dn'")
                ->__to_array();

            return $l_data["isys_cats_person_list__id"];
        }
        else
        {
            return false;
        } // if
    } // function

    /**
     * Get all GroupRecords for one (internal) Person by PersonID.
     *
     * @param   integer $p_intPersonID
     *
     * @return  isys_component_dao_result
     */
    public function get_groups_by_id($p_intPersonID)
    {
        $l_strSQL = "SELECT *
			FROM isys_cats_person_group_list
			LEFT JOIN isys_person_2_group ON isys_person_2_group__isys_obj__id__group = isys_cats_person_group_list__isys_obj__id
			WHERE TRUE
			AND isys_person_2_group__isys_obj__id__person = " . $this->convert_sql_id($p_intPersonID) . ";";

        return $this->retrieve($l_strSQL);
    } // function

    /**
     * Return the organisationID (or null if not assigned) by PersonID.
     *
     * @param   integer $p_intPersonID
     *
     * @return  integer  OrganisationID or null if not assigned or not found
     */
    public function get_organisation_by_id_as_int($p_intPersonID)
    {
        $l_intOrganisationId = null;

        $l_result = $this->get_data_by_id($p_intPersonID);

        if (count($l_result) > 0)
        {
            $l_data = $l_result->get_row();

            $l_dao = new isys_cmdb_dao_connection($this->get_database_component());
            $l_res = $l_dao->get_connection($l_data["isys_cats_person_list__isys_connection__id"]);
            $l_row = $l_res->get_row();

            $l_intOrganisationId = $l_row["isys_connection__isys_obj__id"];
        } // if

        return $l_intOrganisationId;
    } // function

    /**
     * Assign an organisation to a person.
     *
     * @param   integer $p_intPersonID
     * @param   mixed   $p_intOrganisationID
     *
     * @return  boolean
     * @author  Niclas Potthast <npotthast@i-doit.org>
     */
    public function set_organisation_by_id($p_intPersonID, $p_intOrganisationID)
    {
        $l_dao = new isys_cmdb_dao_connection($this->get_database_component());
        $l_id  = $l_dao->add_connection($p_intOrganisationID);

        $l_strSql = "UPDATE isys_cats_person_list
			SET isys_cats_person_list__isys_connection__id = " . $this->convert_sql_id($l_id) . "
			WHERE isys_cats_person_list__isys_obj__id = " . $this->convert_sql_id($p_intPersonID) . ";";

        return ($this->update($l_strSql) && $this->apply_update());
    } // function
} // class