mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-21 23:47:57 +00:00
333 lines
11 KiB
PHP
Executable File
333 lines
11 KiB
PHP
Executable File
<?php
|
|
/**
|
|
*
|
|
* SugarCRM Community Edition is a customer relationship management program developed by
|
|
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
|
|
*
|
|
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
|
|
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License version 3 as published by the
|
|
* Free Software Foundation with the addition of the following permission added
|
|
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
|
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
|
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along with
|
|
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA.
|
|
*
|
|
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
|
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of this program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU Affero General Public License version 3.
|
|
*
|
|
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
|
* these Appropriate Legal Notices must retain the display of the "Powered by
|
|
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
|
|
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
|
|
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
|
|
*/
|
|
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
|
|
require_once("modules/Calendar/CalendarUtils.php");
|
|
|
|
#[\AllowDynamicProperties]
|
|
class CalendarController extends SugarController
|
|
{
|
|
|
|
/**
|
|
* Bean that is being handled by the Calendar's current action.
|
|
* @var SugarBean $currentBean
|
|
*/
|
|
protected $currentBean = null;
|
|
|
|
|
|
/**
|
|
* Action SaveActivity
|
|
*/
|
|
protected function action_saveactivity()
|
|
{
|
|
$this->view = 'json';
|
|
|
|
if (!$this->retrieveCurrentBean('Save')) {
|
|
return;
|
|
}
|
|
|
|
$module = $this->currentBean->module_dir;
|
|
$bean = $this->currentBean;
|
|
|
|
if (empty($_REQUEST['edit_all_recurrences'])) {
|
|
$repeat_fields = array('type', 'interval', 'count', 'until', 'dow', 'parent_id');
|
|
foreach ($repeat_fields as $suffix) {
|
|
unset($_POST['repeat_' . $suffix]);
|
|
}
|
|
} elseif (!empty($_REQUEST['repeat_type']) && !empty($_REQUEST['date_start'])) {
|
|
$params = array(
|
|
'type' => $_REQUEST['repeat_type'],
|
|
'interval' => $_REQUEST['repeat_interval'],
|
|
'count' => $_REQUEST['repeat_count'],
|
|
'until' => $_REQUEST['repeat_until'],
|
|
'dow' => $_REQUEST['repeat_dow'],
|
|
);
|
|
|
|
$repeatArr = CalendarUtils::build_repeat_sequence($_REQUEST['date_start'], $params);
|
|
$limit = SugarConfig::getInstance()->get('calendar.max_repeat_count', 1000);
|
|
|
|
if (count($repeatArr) > ($limit - 1)) {
|
|
ob_clean();
|
|
$jsonData = array(
|
|
'access' => 'yes',
|
|
'limit_error' => 'true',
|
|
'limit' => $limit,
|
|
);
|
|
$this->view_object_map['jsonData'] = $jsonData;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$path = "modules/{$bean->module_dir}/{$bean->object_name}FormBase.php";
|
|
if (!file_exists($path)) {
|
|
$GLOBALS['log']->fatal("File {$bean->object_name}FormBase.php doesn't exist");
|
|
sugar_cleanup(true);
|
|
}
|
|
|
|
require_once($path);
|
|
|
|
$FBObjectName = "{$bean->object_name}FormBase";
|
|
|
|
if (!class_exists($FBObjectName)) {
|
|
$GLOBALS['log']->fatal("Class {$bean->object_name}FormBase doesn't exist");
|
|
sugar_cleanup(true);
|
|
}
|
|
|
|
$formBase = new $FBObjectName();
|
|
$bean = $formBase->handleSave('', false, false);
|
|
unset($_REQUEST['send_invites'], $_POST['send_invites']); // prevent invites sending for recurring activities
|
|
|
|
if ($record = $bean->id) {
|
|
if ($module == "Meetings" || $module == "Calls") {
|
|
if (!empty($_REQUEST['edit_all_recurrences'])) {
|
|
CalendarUtils::markRepeatDeleted($bean);
|
|
}
|
|
if (isset($repeatArr) && is_array($repeatArr) && count($repeatArr) > 0) {
|
|
$repeatCreated = CalendarUtils::save_repeat_activities($bean, $repeatArr);
|
|
}
|
|
}
|
|
|
|
$bean->retrieve($record);
|
|
$jsonData = CalendarUtils::get_sendback_array($bean);
|
|
|
|
if (isset($repeatCreated) && is_array($repeatCreated)) {
|
|
$jsonData = array_merge($jsonData, array('repeat' => $repeatCreated));
|
|
}
|
|
|
|
if (!empty($_REQUEST['edit_all_recurrences'])) {
|
|
$jsonData['edit_all_recurrences'] = 'true';
|
|
}
|
|
if (!empty($jsonData['duration_hours']) && $jsonData['duration_hours'] %24 === 0) {
|
|
$jsonData['allDay'] = 'true';
|
|
}
|
|
} else {
|
|
$jsonData = array(
|
|
'access' => 'no',
|
|
);
|
|
}
|
|
|
|
$this->view_object_map['jsonData'] = $jsonData;
|
|
}
|
|
|
|
|
|
/**
|
|
* Action QuickEdit
|
|
*/
|
|
protected function action_quickedit()
|
|
{
|
|
$this->view = 'quickedit';
|
|
|
|
if (!$this->retrieveCurrentBean('Detail')) {
|
|
return;
|
|
}
|
|
|
|
$this->view_object_map['currentModule'] = $this->currentBean->module_dir;
|
|
$this->view_object_map['currentBean'] = $this->currentBean;
|
|
}
|
|
|
|
protected function action_getUser()
|
|
{
|
|
$bean = BeanFactory::getBean("Users", $_REQUEST['record']);
|
|
echo json_encode(array("user_name" => $bean->user_name, "full_name" => $bean->full_name));
|
|
die();
|
|
}
|
|
/**
|
|
* Action Reschedule
|
|
* Used for drag & drop
|
|
*/
|
|
protected function action_reschedule()
|
|
{
|
|
$this->view = 'json';
|
|
|
|
$commit = true;
|
|
|
|
if (!$this->retrieveCurrentBean('Save')) {
|
|
return;
|
|
}
|
|
|
|
$_REQUEST['parent_name'] = $this->currentBean->parent_name;
|
|
|
|
$dateField = "date_start";
|
|
if ($this->currentBean->module_dir == "Tasks") {
|
|
$dateField = "date_due";
|
|
}
|
|
if ($_REQUEST['allDay'] == true) {
|
|
$endDateField = "date_end";
|
|
list($tmp, $time) = explode(" ", $this->currentBean->$endDateField);
|
|
list($date, $tmp) = explode(" ", $_REQUEST['enddatetime']);
|
|
$_REQUEST[ $endDateField ] = $date . " " . $tmp;
|
|
$_POST[$endDateField] = $_REQUEST[ $endDateField ];
|
|
}
|
|
|
|
if (!empty($_REQUEST['calendar_style']) && $_REQUEST['calendar_style'] == "basic") {
|
|
list($tmp, $time) = explode(" ", $this->currentBean->$dateField);
|
|
list($date, $tmp) = explode(" ", $_REQUEST['datetime']);
|
|
$_POST['datetime'] = $date . " " . $tmp;
|
|
}
|
|
$_POST[$dateField] = $_REQUEST['datetime'];
|
|
|
|
if ($this->currentBean->module_dir == "Tasks" && !empty($this->currentBean->date_start)) {
|
|
if ($GLOBALS['timedate']->fromUser($_POST['date_due'])->ts < $GLOBALS['timedate']->fromUser($this->currentBean->date_start)->ts) {
|
|
$this->view_object_map['jsonData'] = array(
|
|
'access' => 'no',
|
|
'errorMessage' => $GLOBALS['mod_strings']['LBL_DATE_END_ERROR'],
|
|
);
|
|
$commit = false;
|
|
}
|
|
}
|
|
|
|
if ($commit) {
|
|
require_once('include/formbase.php');
|
|
$this->currentBean = populateFromPost("", $this->currentBean);
|
|
$this->currentBean->save();
|
|
$this->currentBean->retrieve($_REQUEST['record']);
|
|
|
|
$this->view_object_map['jsonData'] = CalendarUtils::get_sendback_array($this->currentBean);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Action Remove
|
|
*/
|
|
protected function action_remove()
|
|
{
|
|
$this->view = 'json';
|
|
|
|
if (!$this->retrieveCurrentBean('Delete')) {
|
|
return;
|
|
}
|
|
|
|
if ($this->currentBean->module_dir == "Meetings" || $this->currentBean->module_dir == "Calls") {
|
|
if (!empty($_REQUEST['remove_all_recurrences']) && $_REQUEST['remove_all_recurrences']) {
|
|
CalendarUtils::markRepeatDeleted($this->currentBean);
|
|
}
|
|
}
|
|
|
|
$this->currentBean->mark_deleted($_REQUEST['record']);
|
|
|
|
$this->view_object_map['jsonData'] = array(
|
|
'access' => 'yes',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Action Resize
|
|
* Used for drag & drop resizing
|
|
*/
|
|
protected function action_resize()
|
|
{
|
|
$this->view = 'json';
|
|
|
|
if (!$this->retrieveCurrentBean('Save')) {
|
|
return;
|
|
}
|
|
|
|
require_once('include/formbase.php');
|
|
$this->currentBean = populateFromPost("", $this->currentBean);
|
|
$this->currentBean->save();
|
|
|
|
$this->view_object_map['jsonData'] = array(
|
|
'access' => 'yes',
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieves current activity bean and checks access to action
|
|
*
|
|
* @param string $actionToCheck
|
|
* @return bool Result of check
|
|
*/
|
|
protected function retrieveCurrentBean($actionToCheck = false)
|
|
{
|
|
$module = $_REQUEST['current_module'];
|
|
$record = null;
|
|
if (!empty($_REQUEST['record'])) {
|
|
$record = $_REQUEST['record'];
|
|
}
|
|
|
|
require_once("data/BeanFactory.php");
|
|
$this->currentBean = BeanFactory::getBean($module, $record);
|
|
|
|
if (!empty($actionToCheck)) {
|
|
if (!$this->currentBean->ACLAccess($actionToCheck)) {
|
|
$this->view = 'json';
|
|
$jsonData = array(
|
|
'access' => 'no',
|
|
);
|
|
$this->view_object_map['jsonData'] = $jsonData;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
protected function action_getActivities()
|
|
{
|
|
$this->view = 'json';
|
|
|
|
if (!ACLController::checkAccess('Calendar', 'list', true)) {
|
|
ACLController::displayNoAccess(true);
|
|
}
|
|
|
|
require_once('modules/Calendar/Calendar.php');
|
|
$cal = new Calendar($_REQUEST['view']);
|
|
|
|
if (in_array($cal->view, array('day', 'week', 'month'))) {
|
|
$cal->add_activities($GLOBALS['current_user']);
|
|
} elseif ($cal->view == 'shared') {
|
|
$cal->init_shared();
|
|
$sharedUser = BeanFactory::newBean('Users');
|
|
foreach ($cal->shared_ids as $member) {
|
|
$sharedUser->retrieve($member);
|
|
$cal->add_activities($sharedUser);
|
|
}
|
|
}
|
|
$cal->load_activities();
|
|
$this->view_object_map['jsonData'] = $cal->items;
|
|
}
|
|
}
|