public function getAssociationType()
 {
     if (!isset($this->_associationType)) {
         $this->_associationType = X2Model::getAssociationType(get_class($this->model));
     }
     return $this->_associationType;
 }
예제 #2
0
 /**
  * Add note to model 
  * @param X2Model $model model to which note should be added
  * @param string $note
  */
 public static function associateAction(X2Model $model, array $attributes)
 {
     $now = time();
     $action = new Actions();
     $action->setAttributes(array_merge(array('assignedTo' => $model->assignedTo, 'visibility' => '1', 'associationType' => X2Model::getAssociationType(get_class($model)), 'associationId' => $model->id, 'associationName' => $model->name, 'createDate' => $now, 'lastUpdated' => $now, 'completeDate' => $now, 'complete' => 'Yes', 'updatedBy' => 'admin'), $attributes), false);
     return $action->save();
 }
예제 #3
0
 /**
  * Like getModelTypes () except that only types of models which support workflow are 
  * returned
  * @param boolean $assoc
  * @return array 
  */
 public static function getModelTypesWhichSupportWorkflow($assoc = false, $associationTypes = false)
 {
     $modelTypes = self::getModelTypes($assoc);
     $tmp = $assoc ? array_flip($modelTypes) : $modelTypes;
     $tmp = array_filter($tmp, function ($a) use($assoc) {
         return X2Model::Model($a)->supportsWorkflow;
     });
     $tmp = $assoc ? array_flip($tmp) : $tmp;
     $tmp = array_intersect($modelTypes, $tmp);
     if ($associationTypes) {
         $arr = array();
         foreach ($tmp as $k => $v) {
             if ($assoc) {
                 $arr[X2Model::getAssociationType($k)] = $v;
             } else {
                 $arr[] = X2Model::getAssociationType($v);
             }
         }
         $tmp = $arr;
     }
     return $tmp;
 }
예제 #4
0
 /**
  * Creates a new model.
  *
  * If creation is successful, the browser will be redirected to the 'view' page.
  *
  * @param bool $quick If true, this indicates the action is being requested via AJAX
  */
 public function actionCreate($quick = false, $duplicate = false)
 {
     $model = new Quote();
     if ($duplicate && !isset($_POST['Quote'])) {
         $copiedModel = Quote::model()->findByPk($duplicate);
         if (!empty($copiedModel)) {
             foreach ($copiedModel->attributes as $name => $value) {
                 if ($name != 'id') {
                     $model->{$name} = $value;
                 }
             }
             $model->setLineItems($this->duplicateLineItems($copiedModel), false, true);
         }
     }
     $users = User::getNames();
     if ($quick && !Yii::app()->request->isAjaxRequest) {
         throw new CHttpException(400);
     }
     $currency = Yii::app()->params->currency;
     // Uncomment the following line if AJAX validation is needed
     // $this->performAjaxValidation($model);
     if (isset($_POST['Quote'])) {
         $model->setX2Fields($_POST['Quote']);
         $model->currency = $currency;
         $model->createDate = time();
         $model->lastUpdated = $model->createDate;
         $model->createdBy = Yii::app()->user->name;
         $model->updatedBy = $model->createdBy;
         if (empty($model->name)) {
             $model->name = '';
         }
         if (isset($_POST['lineitem'])) {
             $model->lineItems = $_POST['lineitem'];
         }
         if (!$model->hasLineItemErrors) {
             if ($model->save()) {
                 $model->createEventRecord();
                 $model->createActionRecord();
                 $model->saveLineItems();
                 if (!$quick) {
                     $this->redirect(array('view', 'id' => $model->id));
                 } else {
                     if (isset($_GET['recordId']) && isset($_GET['recordType'])) {
                         $recordId = $_GET['recordId'];
                         $recordType = $_GET['recordType'];
                         $relatedModel = X2Model::model($_GET['recordType'])->findByPk($recordId);
                         // tie record to quote
                         if ($relatedModel) {
                             $relate = new Relationships();
                             $relate->firstId = $model->id;
                             $relate->firstType = "Quote";
                             $relate->secondId = $relatedModel->id;
                             $relate->secondType = $recordType;
                             $relate->save();
                             $model->createAssociatedAction(X2Model::getAssociationType(get_class($relatedModel)), $relatedModel->id);
                         }
                     }
                     return;
                 }
             }
         }
     }
     // get products
     $products = Product::activeProducts();
     $viewData = array('model' => $model, 'users' => $users, 'products' => $products, 'quick' => $quick);
     if (!$quick) {
         $this->render('create', $viewData);
     } else {
         if ($model->hasErrors() || $model->hasLineItemErrors) {
             // Sneak into the response that validation failed via setting
             // the response code manually:
             header('HTTP/1.1 400 Validation Error');
         }
         $this->renderPartial('create', $viewData, false, true);
     }
 }
예제 #5
0
 /**
  * @return object Data provider object to be used for the grid view
  */
 public function getDataProvider()
 {
     if (!isset($this->_dataProvider)) {
         $resultsPerPage = $this->getWidgetProperty('resultsPerPage');
         $historyCmd = History::getCriteria($this->model->id, X2Model::getAssociationType(get_class($this->model)), Yii::app()->params->profile->historyShowRels, $this->historyType);
         $this->_dataProvider = new CSqlDataProvider($historyCmd['cmd'], array('totalItemCount' => $historyCmd['count'], 'params' => $historyCmd['params'], 'pagination' => array('pageSize' => $resultsPerPage)));
         //            $this->_dataProvider = $this->getSearchModel()->search(
         //                    History::getCriteria(
         //                            $this->model->id, X2Model::getAssociationType(get_class($this->model)), $this->getWidgetProperty('showRelatedRecords'), $this->historyType), $resultsPerPage
         //            );
         // clear order set by Actions::search and History::getCriteria
         //$this->_dataProvider->criteria->order = '';
     }
     return $this->_dataProvider;
 }
예제 #6
0
 * 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 X2ENGINE, X2ENGINE 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 X2Engine, Inc. P.O. Box 66752, Scotts Valley,
 * California 95067, USA. or at email address contact@x2engine.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
 * X2Engine" logo. If the display of the logo is not reasonably feasible for
 * technical reasons, the Appropriate Legal Notices must display the words
 * "Powered by X2Engine".
 *****************************************************************************************/
$associationType = X2Model::getAssociationType(get_class($model));
$this->widget('Publisher', array('associationType' => $associationType, 'associationId' => $model->id, 'assignedTo' => Yii::app()->user->getName(), 'calendar' => false));
$this->widget('History', array('associationType' => $associationType, 'associationId' => $model->id));
예제 #7
0
 /**
  * Magic getter for {@link actionHeader}
  *
  * Composes an informative header for the action record.
  *
  * @return type
  */
 public function getActionHeader()
 {
     if (!isset($this->_actionHeader)) {
         $recipientContacts = $this->recipientContacts;
         // Add email headers to the top of the action description's body
         // so that the resulting recorded action has all the info of the
         // original email.
         $fromString = $this->from['address'];
         if (!empty($this->from['name'])) {
             $fromString = '"' . $this->from['name'] . '" <' . $fromString . '>';
         }
         $header = CHtml::tag('strong', array(), Yii::t('app', 'Subject: ')) . CHtml::encode($this->subject) . '<br />';
         $header .= CHtml::tag('strong', array(), Yii::t('app', 'From: ')) . CHtml::encode($fromString) . '<br />';
         // Put in recipient lists, and if any correspond to contacts, make links
         // to them in place of their names.
         foreach (array('to', 'cc', 'bcc') as $recList) {
             if (!empty($this->mailingList[$recList])) {
                 $header .= CHtml::tag('strong', array(), ucfirst($recList) . ': ');
                 foreach ($this->mailingList[$recList] as $target) {
                     if ($recipientContacts[$target[1]] != null) {
                         $header .= $recipientContacts[$target[1]]->link;
                     } else {
                         $header .= CHtml::encode("\"{$target[0]}\"");
                     }
                     $header .= CHtml::encode(" <{$target[1]}>,");
                 }
                 $header = rtrim($header, ', ') . '<br />';
             }
         }
         // Include special quote information if it's a quote being issued or emailed to a random contact
         if ($this->modelName == 'Quote') {
             $header .= '<br /><hr />';
             $header .= CHtml::tag('strong', array(), Yii::t('quotes', $this->targetModel->type == 'invoice' ? 'Invoice' : 'Quote')) . ':';
             $header .= ' ' . $this->targetModel->link . ($this->targetModel->status ? ' (' . $this->targetModel->status . '), ' : ' ') . Yii::t('app', 'Created') . ' ' . $this->targetModel->renderAttribute('createDate') . ';';
             $header .= ' ' . Yii::t('app', 'Updated') . ' ' . $this->targetModel->renderAttribute('lastUpdated') . ' by ' . $this->userProfile->fullName . '; ';
             $header .= ' ' . Yii::t('quotes', 'Expires') . ' ' . $this->targetModel->renderAttribute('expirationDate');
             $header .= '<br />';
         }
         // Attachments info
         if (!empty($this->attachments)) {
             $header .= '<br /><hr />';
             $header .= CHtml::tag('strong', array(), Yii::t('media', 'Attachments:')) . "<br />";
             $i = 0;
             foreach ($this->attachments as $attachment) {
                 if ($i++) {
                     $header .= '<br />';
                 }
                 if ($attachment['type'] === 'temp') {
                     // attempt to convert temporary file to media record
                     if ($this->modelId && $this->modelName) {
                         $associationId = $this->modelId;
                         $associationType = X2Model::getAssociationType($this->modelName);
                     } elseif ($contact = reset($recipientContacts)) {
                         $associationId = $contact->id;
                         $associationType = 'contacts';
                     }
                     if (isset($associationId) && ($media = $attachment['model']->convertToMedia(array('associationType' => $associationType, 'associationId' => $associationId)))) {
                         $attachment['type'] = 'media';
                         $attachment['id'] = $media->id;
                     }
                 }
                 if ($attachment['type'] === 'media' && ($media = Media::model()->findByPk($attachment['id']))) {
                     $header .= $media->getLink() . '&nbsp;|&nbsp;' . $media->getDownloadLink();
                 } else {
                     $header .= CHtml::tag('span', array('class' => 'email-attachment-text'), $attachment['filename']) . '<br />';
                 }
             }
         }
         $this->_actionHeader = $header . '<br /><hr />';
     }
     return $this->_actionHeader;
 }
예제 #8
0
 /**
  * Transfers all related Actions from $model to $this->owner
  */
 public function mergeActions(X2Model $model, $logMerge = false)
 {
     $ret = array();
     $associationType = X2Model::getAssociationType(get_class($model));
     $tartgetAssociationType = X2Model::getAssociationType(get_class($this->owner));
     if ($logMerge) {
         $ids = Yii::app()->db->createCommand()->select('id')->from('x2_actions')->where('associationType = :type AND associationId = :id', array(':type' => $associationType, ':id' => $model->id))->queryColumn();
         $ret = $ids;
     }
     X2Model::model('Actions')->updateAll(array('associationType' => $tartgetAssociationType, 'associationId' => $this->owner->id), 'associationType = :type AND associationId = :id', array(':type' => $associationType, ':id' => $model->id));
     return $ret;
 }
 public function getAction()
 {
     if (!isset($this->_action)) {
         $action = new Actions();
         $action->setAttributes(array('associationType' => X2Model::getAssociationType($this->secondModelName), 'associationId' => $this->secondModelId, 'assignedTo' => Yii::app()->user->getName()), true);
         $this->_action = $action;
     }
     return $this->_action;
 }
echo Yii::t('workflow', 'Please summarize how this stage was completed.');
?>
</div>
        <div class="row">
            <?php 
echo CHtml::textArea('workflowComment', '', array('style' => 'width:260px;height:80px;'));
echo CHtml::hiddenField('workflowCommentWorkflowId', '', array('id' => 'workflowCommentWorkflowId'));
echo CHtml::hiddenField('workflowCommentStageNumber', '', array('id' => 'workflowCommentStageNumber'));
?>
        </div>
    </form>
</div>

<!-- dialog to contain Workflow Stage Details-->
<div id="workflowStageDetails"></div>

<div class="row">
    <div id="workflow-diagram">
        <?php 
// true = include dropdowns
$workflowStatus = Workflow::getWorkflowStatus($currentWorkflow, $model->id, X2Model::getAssociationType(get_class($model)));
//echo Workflow::renderWorkflow($workflowStatus);
if (sizeof($workflowStatus['stages']) > 1) {
    $workflow = Workflow::model()->findByPk($workflowStatus['id']);
    $colors = $workflow->getWorkflowStageColors(sizeof($workflowStatus['stages']));
    Yii::app()->controller->renderPartial('application.modules.workflow.views.workflow._inlineFunnel', array('workflowStatus' => $workflowStatus, 'stageCount' => sizeof($workflowStatus['stages']), 'colors' => $colors));
}
?>
    </div>
</div>