Newer
Older
<?php
/*********************************************************************
class.organization.php
Peter Rotich <peter@osticket.com>
Jared Hancock <jared@osticket.com>
Copyright (c) 2014 osTicket
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/
require_once(INCLUDE_DIR . 'class.orm.php');
require_once(INCLUDE_DIR . 'class.forms.php');
require_once(INCLUDE_DIR . 'class.dynamic_forms.php');
require_once(INCLUDE_DIR . 'class.user.php');
class OrganizationModel extends VerySimpleModel {
static $meta = array(
'table' => ORGANIZATION_TABLE,
'pk' => array('id'),
'joins' => array(
'users' => array(
'reverse' => 'User.org',
const COLLAB_ALL_MEMBERS = 0x0001;
const COLLAB_PRIMARY_CONTACT = 0x0002;
const ASSIGN_AGENT_MANAGER = 0x0004;
function getId() {
return $this->id;
}
function getName() {
return $this->name;
}
function getAccountManager() {
if (!isset($this->_manager)) {
if ($this->manager[0] == 't')
$this->_manager = Team::lookup(substr($this->manager, 1));
$this->_manager = Staff::lookup(substr($this->manager, 1));
else
$this->_manager = ''; // None.
function getAccountManagerId() {
function autoAddCollabs() {
return $this->check(self::COLLAB_ALL_MEMBERS | self::COLLAB_PRIMARY_CONTACT);
}
function autoAddPrimaryContactsAsCollabs() {
return $this->check(self::COLLAB_PRIMARY_CONTACT);
}
function autoAddMembersAsCollabs() {
return $this->check(self::COLLAB_ALL_MEMBERS);
}
function getUpdateDate() {
return $this->updated;
}
function getCreateDate() {
return $this->created;
}
function check($flag) {
return 0 !== ($this->status & $flag);
}
protected function clearStatus($flag) {
return $this->set('status', $this->get('status') & ~$flag);
}
protected function setStatus($flag) {
return $this->set('status', $this->get('status') | $flag);
}
function allMembers() {
return $this->users;
}
}
class Organization extends OrganizationModel {
var $_entries;
var $_forms;
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
function addDynamicData($data) {
$of = OrganizationForm::getInstance($this->id);
foreach ($of->getFields() as $f)
if (isset($data[$f->get('name')]))
$of->setAnswer($f->get('name'), $data[$f->get('name')]);
$of->save();
return $of;
}
function getDynamicData() {
if (!isset($this->_entries)) {
$this->_entries = DynamicFormEntry::forOrganization($this->id)->all();
if (!$this->_entries) {
$g = OrganizationForm::getInstance($this->id);
$g->save();
$this->_entries[] = $g;
}
}
return $this->_entries;
}
function getForms($data=null) {
if (!isset($this->_forms)) {
$this->_forms = array();
foreach ($this->getDynamicData() as $cd) {
$cd->addMissingFields();
if(!$data
&& ($form = $cd->getForm())
&& $form->get('type') == 'O' ) {
foreach ($cd->getFields() as $f) {
if ($f->get('name') == 'name')
$f->value = $this->getName();
}
}
$this->_forms[] = $cd->getForm();
}
}
return $this->_forms;
}
function getInfo() {
$base = $this->ht;
foreach (array(
'collab-all-flag' => Organization::COLLAB_ALL_MEMBERS,
'collab-pc-flag' => Organization::COLLAB_PRIMARY_CONTACT,
'assign-am-flag' => Organization::ASSIGN_AGENT_MANAGER,
) as $ck=>$flag) {
if ($this->check($flag))
$base[$ck] = true;
}
return $base;
}
function isMappedToDomain($domain) {
foreach (explode(',', $this->domain) as $d) {
$d = trim($d);
if ($d[0] == '.') {
// Subdomain syntax (.osticket.com accepts all subdomains of
// osticket.com)
if (strcasecmp(mb_substr($domain, -mb_strlen($d)), $d) === 0)
return true;
}
elseif (strcasecmp($domain, $d) === 0) {
return true;
}
}
return false;
}
static function forDomain($domain) {
foreach (static::objects()
->filter(array('domain__contains'=>$domain)) as $org) {
if ($org->isMappedToDomain($domain)) {
return $org;
}
}
}
function addForm($form, $sort=1) {
$form = $form->instanciate();
$form->set('sort', $sort);
$form->set('object_type', 'O');
$form->set('object_id', $this->getId());
$form->save();
}
function getFilterData() {
$vars = array();
foreach ($this->getDynamicData() as $entry) {
if ($entry->getForm()->get('type') != 'O')
continue;
foreach ($entry->getFields() as $f)
$vars['field.'.$f->get('id')] = $f->toString($f->getClean());
// Add special `name` field
$f = $entry->getForm()->getField('name');
$vars['field.'.$f->get('id')] = $this->getName();
}
return $vars;
}
function to_json() {
$info = array(
'id' => $this->getId(),
'name' => (string) $this->getName()
);
return JsonDataEncoder::encode($info);
}
function __toString() {
return (string) $this->getName();
}
function update($vars, &$errors) {
$valid = true;
$forms = $this->getForms($vars);
foreach ($forms as $cd) {
if (!$cd->isValid())
$valid = false;
if ($cd->get('type') == 'O'
&& ($form= $cd->getForm($vars))
&& ($f=$form->getField('name'))
&& $f->getClean()
&& ($o=Organization::lookup(array('name'=>$f->getClean())))
&& $o->id != $this->getId()) {
$valid = false;
$f->addError('Organization with the same name already exists');
}
}
if ($vars['domain']) {
foreach (explode(',', $vars['domain']) as $d) {
if (!Validator::is_email('t@' . trim($d))) {
$errors['domain'] = 'Enter a valid email domain, like domain.com';
}
}
}
if ($vars['manager']) {
switch ($vars['manager'][0]) {
case 's':
if ($staff = Staff::lookup(substr($vars['manager'], 1)))
break;
case 't':
if ($vars['manager'][0] == 't'
&& $team = Team::lookup(substr($vars['manager'], 1)))
break;
default:
$errors['manager'] = 'Select a staff member or team from the list';
}
}
if (!$valid || $errors)
return false;
foreach ($this->getDynamicData() as $cd) {
if (($f=$cd->getForm())
&& ($f->get('type') == 'O')
&& ($name = $f->getField('name'))) {
$this->name = $name->getClean();
$this->save();
}
$cd->save();
}
// Set flags
foreach (array(
'collab-all-flag' => Organization::COLLAB_ALL_MEMBERS,
'collab-pc-flag' => Organization::COLLAB_PRIMARY_CONTACT,
'assign-am-flag' => Organization::ASSIGN_AGENT_MANAGER,
) as $ck=>$flag) {
if ($vars[$ck])
$this->setStatus($flag);
else
$this->clearStatus($flag);
}
// Set staff and primary contacts
$this->set('domain', $vars['domain']);
$this->set('manager', $vars['manager'] ?: '');
if ($vars['contacts'] && is_array($vars['contacts'])) {
foreach ($this->allMembers() as $u) {
$u->setPrimaryContact(array_search($u->id, $vars['contacts']) !== false);
$u->save();
}
}
return $this->save();
static function fromVars($vars) {
if (!($org = Organization::lookup(array('name' => $vars['name'])))) {
$org = Organization::create(array(
'name' => $vars['name'],
'created' => new SqlFunction('NOW'),
'updated' => new SqlFunction('NOW'),
));
$org->save(true);
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
}
return $org;
}
static function fromForm($form) {
if(!$form) return null;
//Validate the form
$valid = true;
if (!$form->isValid())
$valid = false;
//Make sure the email is not in-use
if (($field=$form->getField('name'))
&& $field->getClean()
&& Organization::lookup(array('name' => $field->getClean()))) {
$field->addError('Organization with the same name already exists');
$valid = false;
}
return $valid ? self::fromVars($form->getClean()) : null;
}
}
class OrganizationForm extends DynamicForm {
static $instance;
static $form;
static function objects() {
$os = parent::objects();
return $os->filter(array('type'=>'O'));
}
static function getDefaultForm() {
if (!isset(static::$form)) {
if (($o = static::objects()) && $o[0])
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
static::$form = $o[0];
else //TODO: Remove the code below and move it to task??
static::$form = self::__loadDefaultForm();
}
return static::$form;
}
static function getInstance($object_id=0) {
if (!isset(static::$instance))
static::$instance = static::getDefaultForm()->instanciate();
static::$instance->object_type = 'O';
if ($object_id)
static::$instance->object_id = $object_id;
return static::$instance;
}
static function __loadDefaultForm() {
require_once(INCLUDE_DIR.'class.i18n.php');
$i18n = new Internationalization();
$tpl = $i18n->getTemplate('form.yaml');
foreach ($tpl->getData() as $f) {
if ($f['type'] == 'O') {
$form = DynamicForm::create($f);
$form->save();
break;
}
}
$o =static::objects();
return $o[0];
}
}
Filter::addSupportedMatches('Organization Data', function() {
$matches = array();
foreach (OrganizationForm::getInstance()->getFields() as $f) {
if (!$f->hasData())
continue;
$matches['field.'.$f->get('id')] = 'Organization / '.$f->getLabel();
}
return $matches;
});
Organization::_inspect();