- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / collaborationhandlers / ezapprove / ezapprovecollaborationhandler.php
1 <?php
2 //
3 // Definition of eZApproveCollaborationHandler class
4 //
5 // Created on: <23-Jan-2003 11:57:11 amos>
6 //
7 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
8 // SOFTWARE NAME: eZ Publish
9 // SOFTWARE RELEASE: 4.1.x
10 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
11 // SOFTWARE LICENSE: GNU General Public License v2.0
12 // NOTICE: >
13 //   This program is free software; you can redistribute it and/or
14 //   modify it under the terms of version 2.0  of the GNU General
15 //   Public License as published by the Free Software Foundation.
16 //
17 //   This program is distributed in the hope that it will be useful,
18 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
19 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 //   GNU General Public License for more details.
21 //
22 //   You should have received a copy of version 2.0 of the GNU General
23 //   Public License along with this program; if not, write to the Free
24 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 //   MA 02110-1301, USA.
26 //
27 //
28 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
29 //
30
31 /*! \file
32 */
33
34 /*!
35   \class eZApproveCollaborationHandler ezapprovecollaborationhandler.php
36   \brief Handles approval communication using the collaboration system
37
38   The handler uses the fields data_int1, data_int2 and data_int3 to store
39   information on the contentobject and the approval status.
40
41   - data_int1 - The content object ID
42   - data_int2 - The content object version
43   - data_int3 - The status of the approval, see defines.
44
45 */
46
47 class eZApproveCollaborationHandler extends eZCollaborationItemHandler
48 {
49     /// Approval message type
50     const MESSAGE_TYPE_APPROVE = 1;
51
52     /// Default status, no approval decision has been made
53     const STATUS_WAITING = 0;
54
55     /// The contentobject was approved and will be published.
56     const STATUS_ACCEPTED = 1;
57
58     /// The contentobject was denied and will be archived.
59     const STATUS_DENIED = 2;
60
61     /// The contentobject was deferred and will be a draft again for reediting.
62     const STATUS_DEFERRED = 3;
63
64     /*!
65      Initializes the handler
66     */
67     function eZApproveCollaborationHandler()
68     {
69         $this->eZCollaborationItemHandler( 'ezapprove',
70                                            ezpI18n::translate( 'kernel/classes', 'Approval' ),
71                                            array( 'use-messages' => true,
72                                                   'notification-types' => true,
73                                                   'notification-collection-handling' => eZCollaborationItemHandler::NOTIFICATION_COLLECTION_PER_PARTICIPATION_ROLE ) );
74     }
75
76     function title( $collaborationItem )
77     {
78         return ezpI18n::translate( 'kernel/classes', 'Approval' );
79     }
80
81     function content( $collaborationItem )
82     {
83         return array( "content_object_id" => $collaborationItem->attribute( "data_int1" ),
84                       "content_object_version" => $collaborationItem->attribute( "data_int2" ),
85                       "approval_status" => $collaborationItem->attribute( "data_int3" ) );
86     }
87
88     function notificationParticipantTemplate( $participantRole )
89     {
90         if ( $participantRole == eZCollaborationItemParticipantLink::ROLE_APPROVER )
91         {
92             return 'approve.tpl';
93         }
94         else if ( $participantRole == eZCollaborationItemParticipantLink::ROLE_AUTHOR )
95         {
96             return 'author.tpl';
97         }
98         else
99             return false;
100     }
101
102     /*!
103      \return the content object version object for the collaboration item \a $collaborationItem
104     */
105     static function contentObjectVersion( $collaborationItem )
106     {
107         $contentObjectID = $collaborationItem->contentAttribute( 'content_object_id' );
108         $contentObjectVersion = $collaborationItem->contentAttribute( 'content_object_version' );
109         return eZContentObjectVersion::fetchVersion( $contentObjectVersion, $contentObjectID );
110     }
111
112     /*!
113      Updates the last_read for the participant link.
114     */
115     function readItem( $collaborationItem, $viewMode = false )
116     {
117         $collaborationItem->setLastRead();
118     }
119
120     /*!
121      \return the number of messages for the approve item.
122     */
123     function messageCount( $collaborationItem )
124     {
125         return eZCollaborationItemMessageLink::fetchItemCount( array( 'item_id' => $collaborationItem->attribute( 'id' ) ) );
126     }
127
128     /*!
129      \return the number of unread messages for the approve item.
130     */
131     function unreadMessageCount( $collaborationItem )
132     {
133         $lastRead = 0;
134         $status = $collaborationItem->attribute( 'user_status' );
135         if ( $status )
136             $lastRead = $status->attribute( 'last_read' );
137         return eZCollaborationItemMessageLink::fetchItemCount( array( 'item_id' => $collaborationItem->attribute( 'id' ),
138                                                                       'conditions' => array( 'modified' => array( '>', $lastRead ) ) ) );
139     }
140
141     /*!
142      \static
143      \return the status of the approval collaboration item \a $approvalID.
144     */
145     static function checkApproval( $approvalID )
146     {
147         $collaborationItem = eZCollaborationItem::fetch( $approvalID );
148         if ( $collaborationItem !== null )
149         {
150             return $collaborationItem->attribute( 'data_int3' );
151         }
152         return false;
153     }
154
155     /*!
156      \static
157      \return makes sure the approval item is activated for all participants \a $approvalID.
158     */
159     static function activateApproval( $approvalID )
160     {
161         $collaborationItem = eZCollaborationItem::fetch( $approvalID );
162         if ( $collaborationItem !== null )
163         {
164             $collaborationItem->setAttribute( 'data_int3', self::STATUS_WAITING );
165             $collaborationItem->setAttribute( 'status', eZCollaborationItem::STATUS_ACTIVE );
166             $timestamp = time();
167             $collaborationItem->setAttribute( 'modified', $timestamp );
168             $collaborationItem->store();
169             $participantList = eZCollaborationItemParticipantLink::fetchParticipantList( array( 'item_id' => $approvalID ) );
170             foreach( $participantList as $participantLink )
171             {
172                 $collaborationItem->setIsActive( true, $participantLink->attribute( 'participant_id' ) );
173             }
174             return true;
175         }
176         return false;
177     }
178
179     /*!
180      Creates a new approval collaboration item which will approve the content object \a $contentObjectID
181      with version \a $contentObjectVersion.
182      The item will be added to the author \a $authorID and the approver array \a $approverIDArray.
183      \return the collaboration item.
184     */
185     static function createApproval( $contentObjectID, $contentObjectVersion, $authorID, $approverIDArray )
186     {
187         $collaborationItem = eZCollaborationItem::create( 'ezapprove', $authorID );
188         $collaborationItem->setAttribute( 'data_int1', $contentObjectID );
189         $collaborationItem->setAttribute( 'data_int2', $contentObjectVersion );
190         $collaborationItem->setAttribute( 'data_int3', false );
191         $collaborationItem->store();
192         $collaborationID = $collaborationItem->attribute( 'id' );
193
194         $participantList = array( array( 'id' => array( $authorID ),
195                                          'role' => eZCollaborationItemParticipantLink::ROLE_AUTHOR ),
196                                   array( 'id' => $approverIDArray,
197                                          'role' => eZCollaborationItemParticipantLink::ROLE_APPROVER ) );
198         foreach ( $participantList as $participantItem )
199         {
200             foreach( $participantItem['id'] as $participantID )
201             {
202                 $participantRole = $participantItem['role'];
203                 $link = eZCollaborationItemParticipantLink::create( $collaborationID, $participantID,
204                                                                     $participantRole, eZCollaborationItemParticipantLink::TYPE_USER );
205                 $link->store();
206
207                 $profile = eZCollaborationProfile::instance( $participantID );
208                 $groupID = $profile->attribute( 'main_group' );
209                 eZCollaborationItemGroupLink::addItem( $groupID, $collaborationID, $participantID );
210             }
211         }
212
213         // Create the notification
214         $collaborationItem->createNotificationEvent();
215         return $collaborationItem;
216     }
217
218     /*!
219      Adds a new comment, approves the item or denies the item.
220     */
221     function handleCustomAction( $module, $collaborationItem )
222     {
223         $redirectView = 'item';
224         $redirectParameters = array( 'full', $collaborationItem->attribute( 'id' ) );
225         $addComment = false;
226
227         if ( $this->isCustomAction( 'Comment' ) )
228         {
229             $addComment = true;
230         }
231         else if ( $this->isCustomAction( 'Accept' ) or
232                   $this->isCustomAction( 'Deny' ) or
233                   $this->isCustomAction( 'Defer' ) )
234         {
235             // check user's rights to approve
236             $user = eZUser::currentUser();
237             $userID = $user->attribute( 'contentobject_id' );
238             $participantList = eZCollaborationItemParticipantLink::fetchParticipantList( array( 'item_id' => $collaborationItem->attribute( 'id' ) ) );
239
240             $approveAllowed = false;
241             foreach( $participantList as $participant )
242             {
243                 if ( $participant->ParticipantID == $userID &&
244                      $participant->ParticipantRole == eZCollaborationItemParticipantLink::ROLE_APPROVER )
245                 {
246                     $approveAllowed = true;
247                     break;
248                 }
249             }
250             if ( !$approveAllowed )
251             {
252                 return $module->redirectToView( $redirectView, $redirectParameters );
253             }
254
255             $contentObjectVersion = $this->contentObjectVersion( $collaborationItem );
256             $status = self::STATUS_DENIED;
257             if ( $this->isCustomAction( 'Accept' ) )
258                 $status = self::STATUS_ACCEPTED;
259 //             else if ( $this->isCustomAction( 'Defer' ) )
260 //                 $status = self::STATUS_DEFERRED;
261 //             else if ( $this->isCustomAction( 'Deny' ) )
262 //                 $status = self::STATUS_DENIED;
263             else if ( $this->isCustomAction( 'Defer' ) or
264                       $this->isCustomAction( 'Deny' ) )
265                 $status = self::STATUS_DENIED;
266             $collaborationItem->setAttribute( 'data_int3', $status );
267             $collaborationItem->setAttribute( 'status', eZCollaborationItem::STATUS_INACTIVE );
268             $timestamp = time();
269             $collaborationItem->setAttribute( 'modified', $timestamp );
270             $collaborationItem->setIsActive( false );
271             $redirectView = 'view';
272             $redirectParameters = array( 'summary' );
273             $addComment = true;
274         }
275         if ( $addComment )
276         {
277             $messageText = $this->customInput( 'ApproveComment' );
278             if ( trim( $messageText ) != '' )
279             {
280                 $message = eZCollaborationSimpleMessage::create( 'ezapprove_comment', $messageText );
281                 $message->store();
282                 eZCollaborationItemMessageLink::addMessage( $collaborationItem, $message, self::MESSAGE_TYPE_APPROVE );
283             }
284         }
285         $collaborationItem->sync();
286         return $module->redirectToView( $redirectView, $redirectParameters );
287     }
288
289 }
290
291 ?>