/**
  * Finish the installation - create owner company and administrator
  *
  * @param void
  * @return null
  */
 function complete_installation()
 {
     if (Companies::getOwnerCompany() instanceof Company) {
         die('Owner company already exists');
         // Somebody is trying to access this method even if the user already exists
     }
     // if
     $this->setLayout('complete_install');
     $form_data = array_var($_POST, 'form');
     tpl_assign('form_data', $form_data);
     if (array_var($form_data, 'submitted') == 'submitted') {
         try {
             $admin_password = trim(array_var($form_data, 'admin_password'));
             $admin_password_a = trim(array_var($form_data, 'admin_password_a'));
             if (trim($admin_password) == '') {
                 throw new Error(lang('password value required'));
             }
             // if
             if ($admin_password != $admin_password_a) {
                 throw new Error(lang('passwords dont match'));
             }
             // if
             DB::beginWork();
             Users::delete();
             // clear users table
             Companies::delete();
             // clear companies table
             // Create the administrator user
             $administrator = new User();
             $administrator->setId(1);
             $administrator->setUsername(array_var($form_data, 'admin_username'));
             $administrator->setEmail(array_var($form_data, 'admin_email'));
             $administrator->setPassword($admin_password);
             $administrator->setIsAdmin(true);
             $administrator->setAutoAssign(true);
             $administrator->save();
             // Create the contact for administrator
             $administrator_contact = new Contact();
             $administrator_contact->setId(1);
             $administrator_contact->setCompanyId(1);
             $administrator_contact->setEmail(array_var($form_data, 'admin_email'));
             $administrator_contact->setUserId($administrator->getId());
             $administrator_contact->setDisplayName($administrator->getUsername());
             $administrator_contact->save();
             // Create a company
             $company = new Company();
             $company->setId(1);
             $company->setClientOfId(0);
             $company->setName(array_var($form_data, 'company_name'));
             $company->setCreatedById(1);
             $company->save();
             DB::commit();
             $this->redirectTo('access', 'login');
         } catch (Exception $e) {
             tpl_assign('error', $e);
             DB::rollback();
         }
         // try
     }
     // if
 }
 /**
  * Add contact
  *
  * @access public
  * @param void
  * @return null
  */
 function add()
 {
     $this->setTemplate('add_contact');
     $company_id = get_id('company_id', null, 0);
     $company = Companies::findById($company_id);
     if (!Contact::canAdd(logged_user(), $company)) {
         flash_error(lang('no access permissions'));
         $this->redirectToReferer(get_url('dashboard', 'index'));
     }
     // if
     $contact = new Contact();
     $im_types = ImTypes::findAll(array('order' => '`id`'));
     $contact_data = array_var($_POST, 'contact');
     if (!is_array($contact_data)) {
         $contact_data = array('company_id' => $company_id);
         // array
     }
     // if
     $user_data = array_var($contact_data, 'user');
     if (!is_array($user_data)) {
         $user_data = array('password_generator' => 'random');
         // array
     }
     // if
     tpl_assign('contact', $contact);
     tpl_assign('company', $company);
     tpl_assign('contact_data', $contact_data);
     tpl_assign('user_data', $user_data);
     tpl_assign('im_types', $im_types);
     $avatar = array_var($_FILES, 'new_avatar');
     if (is_array($avatar) && isset($avatar['size']) && $avatar['size'] != 0) {
         try {
             if (!isset($avatar['name']) || !isset($avatar['type']) || !isset($avatar['size']) || !isset($avatar['tmp_name']) || !is_readable($avatar['tmp_name'])) {
                 throw new InvalidUploadError($avatar, lang('error upload file'));
             }
             // if
             $valid_types = array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
             $max_width = config_option('max_avatar_width', 50);
             $max_height = config_option('max_avatar_height', 50);
             if ($avatar['size']) {
                 if (!in_array($avatar['type'], $valid_types) || !($image = getimagesize($avatar['tmp_name']))) {
                     throw new InvalidUploadError($avatar, lang('invalid upload type', 'JPG, GIF, PNG'));
                 } elseif (!$contact->setAvatar($avatar['tmp_name'], $max_width, $max_height, false)) {
                     throw new Error($avatar, lang('error edit avatar'));
                     $contact->setAvatarFile('');
                 }
                 // if
             }
             // if
         } catch (Exception $e) {
             flash_error($e->getMessage());
         }
     } else {
         $contact->setAvatarFile('');
     }
     // if
     if (is_array(array_var($_POST, 'contact'))) {
         $contact->setFromAttributes($contact_data);
         try {
             // Company info
             if ($_POST['contact']['company']['what'] == 'existing') {
                 $company_id = $_POST['contact']['company_id'];
             } else {
                 $company = new Company();
                 $company->setName($_POST['contact']['company']['name']);
                 $company->setTimezone($_POST['contact']['company']['timezone']);
                 $company->setClientOfId(owner_company()->getId());
                 $company->save();
                 $company_id = $company->getId();
             }
             // if
             $contact->setCompanyId($company_id);
             $contact->setUserId(0);
             $contact->save();
             if (plugin_active('tags')) {
                 $contact->setTagsFromCSV(array_var($contact_data, 'tags'));
             }
             $contact->clearImValues();
             foreach ($im_types as $im_type) {
                 $value = trim(array_var($contact_data, 'im_' . $im_type->getId()));
                 if ($value != '') {
                     $contact_im_value = new ContactImValue();
                     $contact_im_value->setContactId($contact->getId());
                     $contact_im_value->setImTypeId($im_type->getId());
                     $contact_im_value->setValue($value);
                     $contact_im_value->setIsDefault(array_var($contact_data, 'default_im') == $im_type->getId());
                     $contact_im_value->save();
                 }
                 // if
             }
             // foreach
             ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_ADD);
             DB::commit();
             flash_success(lang('success add contact', $contact->getDisplayName()));
             $this->redirectToUrl($contact->getCardUrl());
             // Translate to profile page
         } catch (Exception $e) {
             DB::rollback();
             tpl_assign('error', $e);
         }
         // try
     }
     // if
 }
 function import_from_vcard()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     @set_time_limit(0);
     ini_set('auto_detect_line_endings', '1');
     if (isset($_GET['from_menu']) && $_GET['from_menu'] == 1) {
         unset($_SESSION['go_back']);
     }
     if (isset($_SESSION['go_back'])) {
         unset($_SESSION['go_back']);
         ajx_current("start");
     }
     tpl_assign('import_type', 'contact');
     if (!Contact::canAdd(logged_user(), active_or_personal_project())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $this->setTemplate('vcard_import');
     $filedata = array_var($_FILES, 'vcard_file');
     if (is_array($filedata) && !array_var($_GET, 'step2')) {
         $filename = ROOT . '/tmp/' . logged_user()->getId() . 'temp.vcf';
         copy($filedata['tmp_name'], $filename);
         //ajx_current("empty");
     } else {
         if (array_var($_GET, 'step2')) {
             $filename = ROOT . '/tmp/' . logged_user()->getId() . 'temp.vcf';
             $result = $this->read_vcard_file($filename);
             unlink($filename);
             $import_result = array('import_ok' => array(), 'import_fail' => array());
             foreach ($result as $contact_data) {
                 try {
                     DB::beginWork();
                     if (isset($contact_data['photo_tmp_filename'])) {
                         $file_id = FileRepository::addFile($contact_data['photo_tmp_filename'], array('public' => true));
                         $contact_data['picture_file'] = $file_id;
                         unlink($contact_data['photo_tmp_filename']);
                         unset($contact_data['photo_tmp_filename']);
                     }
                     if (isset($contact_data['company_name'])) {
                         $company = Companies::findOne(array("conditions" => "`name` = '" . mysql_real_escape_string($contact_data['company_name']) . "'"));
                         if ($company == null) {
                             $company = new Company();
                             $company->setName($contact_data['company_name']);
                             $company->setClientOfId(logged_user()->getCompanyId());
                             $company->save();
                             ApplicationLogs::createLog($company, null, ApplicationLogs::ACTION_ADD);
                         }
                         $contact_data['company_id'] = $company->getId();
                         unset($contact_data['company_name']);
                     }
                     $contact_data['import_status'] = '(' . lang('updated') . ')';
                     $fname = mysql_real_escape_string(array_var($contact_data, "firstname"));
                     $lname = mysql_real_escape_string(array_var($contact_data, "lastname"));
                     $contact = Contacts::findOne(array("conditions" => "firstname = '" . $fname . "' AND lastname = '" . $lname . "' OR email <> '' AND email = '" . array_var($contact_data, "email") . "'"));
                     $log_action = ApplicationLogs::ACTION_EDIT;
                     if (!$contact) {
                         $contact = new Contact();
                         $contact_data['import_status'] = '(' . lang('new') . ')';
                         $log_action = ApplicationLogs::ACTION_ADD;
                         $can_import = active_project() != null ? $contact->canAdd(logged_user(), active_project()) : can_manage_contacts(logged_user());
                     } else {
                         $can_import = $contact->canEdit(logged_user());
                     }
                     if ($can_import) {
                         $contact->setFromAttributes($contact_data);
                         $contact->save();
                         ApplicationLogs::createLog($contact, null, $log_action);
                         $contact->setTagsFromCSV(array_var($_GET, 'tags'));
                         if (active_project() instanceof Project) {
                             $pc = ProjectContacts::findOne(array("conditions" => "contact_id = " . $contact->getId() . " AND project_id = " . active_project()->getId()));
                             if (!$pc) {
                                 $pc = new ProjectContact();
                                 $pc->setContactId($contact->getId());
                                 $pc->setProjectId(active_project()->getId());
                                 $pc->setRole(array_var($contact_data, 'role'));
                                 $pc->save();
                             }
                             $contact->addToWorkspace(active_project());
                         }
                         $import_result['import_ok'][] = array('firstname' => $fname, 'lastname' => $lname, 'email' => $contact_data['email'], 'import_status' => $contact_data['import_status']);
                     } else {
                         throw new Exception(lang('no access permissions'));
                     }
                     DB::commit();
                 } catch (Exception $e) {
                     DB::rollback();
                     $fail_msg = substr_utf($e->getMessage(), strpos_utf($e->getMessage(), "\r\n"));
                     $import_result['import_fail'][] = array('firstname' => $fname, 'lastname' => $lname, 'email' => $contact_data['email'], 'import_status' => $contact_data['import_status'], 'fail_message' => $fail_msg);
                 }
             }
             $_SESSION['go_back'] = true;
             tpl_assign('import_result', $import_result);
         }
     }
 }
 /**
  * Adds contact to project (as a PageAttachment)
  *
  * @param void
  * @return null
  */
 function add_contact()
 {
     if (!active_project()->canChangePermissions(logged_user())) {
         flash_error(lang('no access permissions'));
         $this->redirectToReferer(active_project()->getOverviewUrl());
     }
     // if
     $already_attached_contacts = PageAttachments::getAttachmentsByTypeAndProject(array('Contacts'), active_project());
     $already_attached_contacts_ids = null;
     if (is_array($already_attached_contacts)) {
         $already_attached_contacts_ids = array();
         foreach ($already_attached_contacts as $already_attached_contact) {
             $already_attached_contacts_ids[] = $already_attached_contact->getRelObjectId();
         }
         // foreach
     }
     // if
     $this->setTemplate('add_contact');
     $contact = new Contact();
     $im_types = ImTypes::findAll(array('order' => '`id`'));
     $contact_data = array_var($_POST, 'contact');
     if (!is_array($contact_data)) {
         $contact_data = array();
         // array
     }
     // if
     $existing_contact_data = array_var($contact_data, 'existing');
     if (!is_array($existing_contact_data)) {
         $existing_contact_data = array();
         // array
     }
     // if
     $new_contact_data = array_var($contact_data, 'new');
     if (!is_array($new_contact_data)) {
         $new_contact_data = array();
         // array
     }
     // if
     $company_data = array_var($new_contact_data, 'company');
     if (!is_array($company_data)) {
         $company_data = array();
         // array
     }
     // if
     $user_data = array_var($new_contact_data, 'user');
     if (!is_array($user_data)) {
         $user_data = array();
         // array
     }
     // if
     $project_init = array_var($_GET, 'project_init');
     tpl_assign('already_attached_contacts_ids', $already_attached_contacts_ids);
     tpl_assign('contact', $contact);
     tpl_assign('contact_data', $contact_data);
     tpl_assign('existing_contact_data', $existing_contact_data);
     tpl_assign('new_contact_data', $new_contact_data);
     tpl_assign('company_data', $company_data);
     tpl_assign('user_data', $user_data);
     tpl_assign('project_init', $project_init);
     tpl_assign('im_types', $im_types);
     tpl_assign('project', active_project());
     if (is_array(array_var($_POST, 'contact'))) {
         if (array_var($contact_data, 'what') == 'existing') {
             if (!Contacts::findById(array_var($existing_contact_data, 'rel_object_id')) instanceof Contact) {
                 tpl_assign('error', new FormSubmissionErrors(array(lang('existing contact required'))));
             } else {
                 $page_attachment = new PageAttachment();
                 $page_attachment->setFromAttributes($existing_contact_data);
                 $page_attachment->setRelObjectManager('Contacts');
                 $page_attachment->setProjectId(active_project()->getId());
                 $page_attachment->setPageName('people');
                 $page_attachment->save();
                 PageAttachments::reorder('people', active_project());
                 flash_success(lang('success add contact', $page_attachment->getObject()->getDisplayName()));
                 if ($project_init) {
                     $this->redirectToUrl(active_project()->getAddContactUrl(array('project_init' => '1')));
                 } else {
                     $this->redirectToUrl(get_url('project', 'people'));
                 }
                 // if
             }
             // if
         } else {
             // New contact
             // Save avatar
             $avatar = array_var($_FILES, 'new_avatar');
             if (is_array($avatar) && isset($avatar['size']) && $avatar['size'] != 0) {
                 try {
                     if (!isset($avatar['name']) || !isset($avatar['type']) || !isset($avatar['size']) || !isset($avatar['tmp_name']) || !is_readable($avatar['tmp_name'])) {
                         throw new InvalidUploadError($avatar, lang('error upload file'));
                     }
                     // if
                     $valid_types = array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
                     $max_width = config_option('max_avatar_width', 50);
                     $max_height = config_option('max_avatar_height', 50);
                     if ($avatar['size']) {
                         if (!in_array($avatar['type'], $valid_types) || !($image = getimagesize($avatar['tmp_name']))) {
                             throw new InvalidUploadError($avatar, lang('invalid upload type', 'JPG, GIF, PNG'));
                         } elseif (!$contact->setAvatar($avatar['tmp_name'], $max_width, $max_height, false)) {
                             throw new Error($avatar, lang('error edit avatar'));
                             $contact->setAvatarFile('');
                         }
                         // if
                     }
                     // if
                 } catch (Exception $e) {
                     flash_error($e->getMessage());
                 }
             } else {
                 $contact->setAvatarFile('');
             }
             // if
             try {
                 DB::beginWork();
                 $contact->setFromAttributes($new_contact_data);
                 if (array_var($company_data, 'what') == 'existing') {
                     $company_id = $new_contact_data['company_id'];
                 } else {
                     $company = new Company();
                     $company->setName(array_var($company_data, 'name'));
                     $company->setTimezone(array_var($company_data, 'timezone'));
                     $company->setClientOfId(owner_company()->getId());
                     $company->save();
                     $company_id = $company->getId();
                 }
                 // if
                 $contact->setCompanyId($company_id);
                 // User account info
                 if (array_var($user_data, 'add_account') == "yes") {
                     $user = new User();
                     $user->setFromAttributes($user_data);
                     if (array_var($user_data, 'password_generator') == 'random') {
                         // Generate random password
                         $password = substr(sha1(uniqid(rand(), true)), rand(0, 25), 13);
                     } else {
                         // Validate user input
                         $password = array_var($user_data, 'password');
                         if (trim($password) == '') {
                             throw new Error(lang('password value required'));
                         }
                         // if
                         if ($password != array_var($user_data, 'password_a')) {
                             throw new Error(lang('passwords dont match'));
                         }
                         // if
                     }
                     // if
                     $user->setPassword($password);
                     $user->save();
                     $contact->setUserId($user->getId());
                 } else {
                     $contact->setUserId(0);
                 }
                 // if
                 $contact->save();
                 if (plugin_active('tags')) {
                     $contact->setTagsFromCSV(array_var($new_contact_data, 'tags'));
                 }
                 $contact->clearImValues();
                 foreach ($im_types as $im_type) {
                     $value = trim(array_var($new_contact_data, 'im_' . $im_type->getId()));
                     if ($value != '') {
                         $contact_im_value = new ContactImValue();
                         $contact_im_value->setContactId($contact->getId());
                         $contact_im_value->setImTypeId($im_type->getId());
                         $contact_im_value->setValue($value);
                         $contact_im_value->setIsDefault(array_var($new_contact_data, 'default_im') == $im_type->getId());
                         $contact_im_value->save();
                     }
                     // if
                 }
                 // foreach
                 ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_ADD);
                 $page_attachment = new PageAttachment();
                 $page_attachment->setFromAttributes($new_contact_data);
                 $page_attachment->setRelObjectId($contact->getId());
                 $page_attachment->setRelObjectManager('Contacts');
                 $page_attachment->setProjectId(active_project()->getId());
                 $page_attachment->setPageName('people');
                 $page_attachment->save();
                 PageAttachments::reorder('people', active_project());
                 DB::commit();
                 // Send notification...
                 try {
                     if (array_var($user_data, 'add_account') == "yes" && array_var($user_data, 'send_email_notification')) {
                         Notifier::newUserAccount($user, $password);
                     }
                     // if
                 } catch (Exception $e) {
                 }
                 // try
                 flash_success(lang('success add contact', $contact->getDisplayName()));
                 if ($project_init) {
                     $this->redirectToUrl(active_project()->getAddContactUrl(array('project_init' => '1')));
                 } else {
                     $this->redirectToUrl(get_url('project', 'people'));
                 }
                 // if
             } catch (Exception $e) {
                 DB::rollback();
                 tpl_assign('error', $e);
             }
             // try
         }
         // if
     }
     // if
 }
 /**
  * Finish the installation - create owner company and administrator
  *
  * @param void
  * @return null
  */
 function complete_installation()
 {
     if (Companies::getOwnerCompany() instanceof Company) {
         die('Owner company already exists');
         // Somebody is trying to access this method even if the user already exists
     }
     // if
     $form_data = array_var($_POST, 'form');
     tpl_assign('form_data', $form_data);
     if (array_var($form_data, 'submited') == 'submited') {
         try {
             $admin_password = trim(array_var($form_data, 'admin_password'));
             $admin_password_a = trim(array_var($form_data, 'admin_password_a'));
             if (trim($admin_password) == '') {
                 throw new Error(lang('password value required'));
             }
             // if
             if ($admin_password != $admin_password_a) {
                 throw new Error(lang('passwords dont match'));
             }
             // if
             DB::beginWork();
             Users::delete();
             // clear users table
             Companies::delete();
             // clear companies table
             // Create the administrator user
             $administrator = new User();
             $administrator->setId(1);
             $administrator->setCompanyId(1);
             $administrator->setUsername(array_var($form_data, 'admin_username'));
             $administrator->setEmail(array_var($form_data, 'admin_email'));
             $administrator->setPassword($admin_password);
             $administrator->setCanEditCompanyData(true);
             $administrator->setCanManageConfiguration(true);
             $administrator->setCanManageSecurity(true);
             $administrator->setCanManageWorkspaces(true);
             $administrator->setCanManageContacts(true);
             $administrator->setCanManageTemplates(true);
             $administrator->setCanManageReports(true);
             $administrator->setCanManageTime(true);
             $administrator->setCanAddMailAccounts(true);
             $administrator->setAutoAssign(false);
             $administrator->setPersonalProjectId(1);
             $administrator->setType('admin');
             $administrator->save();
             $group = new Group();
             $group->setName('administrators');
             $group->setAllPermissions(true);
             $group->setId(Group::CONST_ADMIN_GROUP_ID);
             $group->save();
             $group_user = new GroupUser();
             $group_user->setGroupId(Group::CONST_ADMIN_GROUP_ID);
             $group_user->setUserId($administrator->getId());
             $group_user->save();
             $project = new Project();
             $project->setId(1);
             $project->setP1(1);
             $project->setName(new_personal_project_name($administrator->getUsername()));
             $project->setDescription(lang('files'));
             $project->setCreatedById($administrator->getId());
             $project->save();
             $project_user = new ProjectUser();
             $project_user->setProjectId($project->getId());
             $project_user->setUserId($administrator->getId());
             $project_user->setCreatedById($administrator->getId());
             $project_user->setAllPermissions(true);
             $project_user->save();
             // Create a company
             $company = new Company();
             $company->setId(1);
             $company->setClientOfId(0);
             $company->setName(array_var($form_data, 'company_name'));
             $company->setCreatedById(1);
             $company->save();
             DB::commit();
             $this->redirectTo('access', 'login');
         } catch (Exception $e) {
             tpl_assign('error', $e);
             DB::rollback();
         }
         // try
     }
     // if
 }