]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/Campaigns/Campaign.php
Release 6.5.0
[Github/sugarcrm.git] / modules / Campaigns / Campaign.php
1 <?php
2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4  * SugarCRM Community Edition is a customer relationship management program developed by
5  * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
6  * 
7  * This program is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU Affero General Public License version 3 as published by the
9  * Free Software Foundation with the addition of the following permission added
10  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13  * 
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
17  * details.
18  * 
19  * You should have received a copy of the GNU Affero General Public License along with
20  * this program; if not, see http://www.gnu.org/licenses or write to the Free
21  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301 USA.
23  * 
24  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26  * 
27  * The interactive user interfaces in modified source and object code versions
28  * of this program must display Appropriate Legal Notices, as required under
29  * Section 5 of the GNU Affero General Public License version 3.
30  * 
31  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32  * these Appropriate Legal Notices must retain the display of the "Powered by
33  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34  * technical reasons, the Appropriate Legal Notices must display the words
35  * "Powered by SugarCRM".
36  ********************************************************************************/
37
38 /*********************************************************************************
39
40  * Description:
41  ********************************************************************************/
42
43 class Campaign extends SugarBean {
44         var $field_name_map;
45
46         // Stored fields
47         var $id;
48         var $date_entered;
49         var $date_modified;
50         var $modified_user_id;
51         var $assigned_user_id;
52         var $created_by;
53         var $created_by_name;
54     var $currency_id;
55         var $modified_by_name;
56         var $name;
57         var $start_date;
58         var $end_date;
59         var $status;
60         var $expected_cost;
61         var $budget;
62         var $actual_cost;
63         var $expected_revenue;
64         var $campaign_type;
65         var $objective;
66         var $content;
67         var $tracker_key;
68         var $tracker_text;
69         var $tracker_count;
70         var $refer_url;
71     var $impressions;
72
73         // These are related
74         var $assigned_user_name;
75
76         // module name definitions and table relations
77         var $table_name = "campaigns";
78         var $rel_prospect_list_table = "prospect_list_campaigns";
79         var $object_name = "Campaign";
80         var $module_dir = 'Campaigns';
81         var $importable = true;
82
83         // This is used to retrieve related fields from form posts.
84         var $additional_column_fields = array(
85                                 'assigned_user_name', 'assigned_user_id',
86         );
87
88         var $relationship_fields = Array('prospect_list_id'=>'prospect_lists');
89
90         var $new_schema = true;
91
92         function list_view_parse_additional_sections(&$listTmpl) {
93                 global $locale;
94
95                 // take $assigned_user_id and get the Username value to assign
96                 $assId = $this->getFieldValue('assigned_user_id');
97
98                 $query = "SELECT first_name, last_name FROM users WHERE id = '".$assId."'";
99                 $result = $this->db->query($query);
100                 $user = $this->db->fetchByAssoc($result);
101
102                 //_ppd($user);
103                 if(!empty($user)) {
104                         $fullName = $locale->getLocaleFormattedName($user->first_name, $user->last_name);
105                         $listTmpl->assign('ASSIGNED_USER_NAME', $fullName);
106                 }
107         }
108
109
110         function get_summary_text()
111         {
112                 return $this->name;
113         }
114
115         function create_export_query(&$order_by, &$where, $relate_link_join='')
116         {
117                 $custom_join = $this->custom_fields->getJOIN(true, true,$where);
118                         if($custom_join)
119                                 $custom_join['join'] .= $relate_link_join;
120             $query = "SELECT
121             campaigns.*,
122             users.user_name as assigned_user_name ";
123                 if($custom_join){
124                                 $query .=  $custom_join['select'];
125                         }
126                 $query .= " FROM campaigns ";
127                         $query .= "LEFT JOIN users
128                       ON campaigns.assigned_user_id=users.id";
129                 if($custom_join){
130                                 $query .=  $custom_join['join'];
131                         }
132
133                 $where_auto = " campaigns.deleted=0";
134
135         if($where != "")
136                 $query .= " where $where AND ".$where_auto;
137         else
138                 $query .= " where ".$where_auto;
139
140         if($order_by != "")
141                 $query .= " ORDER BY $order_by";
142         else
143                 $query .= " ORDER BY campaigns.name";
144         return $query;
145     }
146
147
148
149         function clear_campaign_prospect_list_relationship($campaign_id, $prospect_list_id='')
150         {
151                 if(!empty($prospect_list_id))
152                         $prospect_clause = " and prospect_list_id = '$prospect_list_id' ";
153                 else
154                         $prospect_clause = '';
155
156                 $query = "DELETE FROM $this->rel_prospect_list_table WHERE campaign_id='$campaign_id' AND deleted = '0' " . $prospect_clause;
157                 $this->db->query($query, true, "Error clearing campaign to prospect_list relationship: ");
158         }
159
160
161
162         function mark_relationships_deleted($id)
163         {
164                 $this->clear_campaign_prospect_list_relationship($id);
165         }
166
167         function fill_in_additional_list_fields()
168         {
169                 parent::fill_in_additional_list_fields();
170         }
171
172         function fill_in_additional_detail_fields()
173         {
174         parent::fill_in_additional_detail_fields();
175                 //format numbers.
176
177                 //don't need additional formatting here.
178                 //$this->budget=format_number($this->budget);
179                 //$this->expected_cost=format_number($this->expected_cost);
180                 //$this->actual_cost=format_number($this->actual_cost);
181                 //$this->expected_revenue=format_number($this->expected_revenue);
182         }
183
184
185         function update_currency_id($fromid, $toid){
186         }
187
188
189         function get_list_view_data(){
190
191                 $temp_array = $this->get_list_view_array();
192                 if ($this->campaign_type != 'Email') {
193                         $temp_array['OPTIONAL_LINK']="display:none";
194                 }
195                 $temp_array['TRACK_CAMPAIGN_TITLE'] = translate("LBL_TRACK_BUTTON_TITLE",'Campaigns');
196                 $temp_array['TRACK_CAMPAIGN_IMAGE'] = SugarThemeRegistry::current()->getImageURL('view_status.gif');
197                 $temp_array['LAUNCH_WIZARD_TITLE'] = translate("LBL_TO_WIZARD_TITLE",'Campaigns');
198                 $temp_array['LAUNCH_WIZARD_IMAGE'] = SugarThemeRegistry::current()->getImageURL('edit_wizard.gif');
199         $temp_array['TRACK_VIEW_ALT_TEXT'] = translate("LBL_TRACK_BUTTON_TITLE",'Campaigns');
200         $temp_array['LAUNCH_WIZ_ALT_TEXT'] = translate("LBL_TO_WIZARD_TITLE",'Campaigns');
201
202                 return $temp_array;
203         }
204         /**
205                 builds a generic search based on the query string using or
206                 do not include any $this-> because this is called on without having the class instantiated
207         */
208         function build_generic_where_clause ($the_query_string)
209         {
210                 $where_clauses = Array();
211                 $the_query_string = $this->db->quote($the_query_string);
212                 array_push($where_clauses, "campaigns.name like '$the_query_string%'");
213
214                 $the_where = "";
215                 foreach($where_clauses as $clause)
216                 {
217                         if($the_where != "") $the_where .= " or ";
218                         $the_where .= $clause;
219                 }
220
221
222                 return $the_where;
223         }
224
225         function save($check_notify = FALSE) {
226
227                         //US DOLLAR
228                         if(isset($this->amount) && !empty($this->amount)){
229
230                                 $currency = new Currency();
231                                 $currency->retrieve($this->currency_id);
232                                 $this->amount_usdollar = $currency->convertToDollar($this->amount);
233
234                         }
235
236                 $this->unformat_all_fields();
237
238                 return parent::save($check_notify);
239
240         }
241
242
243         function mark_deleted($id){
244         $query = "update contacts set campaign_id = null where campaign_id = '{$id}' ";
245         $this->db->query($query);
246         $query = "update accounts set campaign_id = null where campaign_id = '{$id}' ";
247         $this->db->query($query);
248         // bug49632 - delete campaign logs for the campaign as well
249         $query = "update campaign_log set deleted = 1 where campaign_id = '{$id}' ";
250         $this->db->query($query);
251                 return parent::mark_deleted($id);
252         }
253
254         function set_notification_body($xtpl, $camp)
255         {
256                 $xtpl->assign("CAMPAIGN_NAME", $camp->name);
257                 $xtpl->assign("CAMPAIGN_AMOUNT", $camp->budget);
258                 $xtpl->assign("CAMPAIGN_CLOSEDATE", $camp->end_date);
259                 $xtpl->assign("CAMPAIGN_STATUS", $camp->status);
260                 $xtpl->assign("CAMPAIGN_DESCRIPTION", $camp->content);
261
262                 return $xtpl;
263         }
264
265     function track_log_leads()
266     {
267         $this->load_relationship('log_entries');
268         $query_array = $this->log_entries->getQuery(true);
269
270         $query_array['select'] = 'SELECT campaign_log.* ';
271         $query_array['where']  = $query_array['where']. " AND activity_type = 'lead' AND archived = 0 AND target_id IS NOT NULL";
272
273         return implode(' ', $query_array);
274     }
275
276         function track_log_entries($type=array()) {
277         //get arguments being passed in
278         $args = func_get_args();
279         $mkt_id ='';
280
281                 $this->load_relationship('log_entries');
282                 $query_array = $this->log_entries->getQuery(true);
283
284         //if one of the arguments is marketing ID, then we need to filter by it
285         foreach($args as $arg){
286             if(isset($arg['EMAIL_MARKETING_ID_VALUE'])){
287                 $mkt_id = $arg['EMAIL_MARKETING_ID_VALUE'];
288             }
289
290             if(isset($arg['group_by'])) {
291                 $query_array['group_by'] = $arg['group_by'];
292             }
293         }
294
295
296
297                 if (empty($type))
298                         $type[0]='targeted';
299
300                 $query_array['select'] ="SELECT campaign_log.* ";
301                 $query_array['where'] = $query_array['where']. " AND activity_type='{$type[0]}' AND archived=0";
302         //add filtering by marketing id, if it exists
303         if (!empty($mkt_id)) $query_array['where'] = $query_array['where']. " AND marketing_id ='$mkt_id' ";
304
305         //B.F. #37943
306         if( isset($query_array['group_by']))
307         {
308                         //perform the inner join with the group by if a marketing id is defined, which means we need to filter out duplicates.
309                         //if no marketing id is specified then we are displaying results from multiple marketing emails and it is understood there might be duplicate target entries
310                         if (!empty($mkt_id)){
311                                 $group_by = str_replace("campaign_log", "cl", $query_array['group_by']);
312                                 $join_where = str_replace("campaign_log", "cl", $query_array['where']);
313                                 $query_array['from'] .= " INNER JOIN (select min(id) as id from campaign_log cl $join_where GROUP BY $group_by  ) secondary
314                                         on campaign_log.id = secondary.id       ";
315                         }
316             unset($query_array['group_by']);
317         } else if(isset($query_array['group_by'])) {
318            $query_array['where'] = $query_array['where'] . ' GROUP BY ' . $query_array['group_by'];
319            unset($query_array['group_by']);
320         }
321
322         $query = (implode(" ",$query_array));
323         return $query;
324         }
325
326
327         function get_queue_items() {
328         //get arguments being passed in
329         $args = func_get_args();
330         $mkt_id ='';
331
332         $this->load_relationship('queueitems');
333                 $query_array = $this->queueitems->getQuery(true);
334
335         //if one of the arguments is marketing ID, then we need to filter by it
336         foreach($args as $arg){
337             if(isset($arg['EMAIL_MARKETING_ID_VALUE'])){
338                 $mkt_id = $arg['EMAIL_MARKETING_ID_VALUE'];
339             }
340
341             if(isset($arg['group_by'])) {
342                 $query_array['group_by'] = $arg['group_by'];
343             }
344         }
345
346         //add filtering by marketing id, if it exists, and if where key is not empty
347         if (!empty($mkt_id) && !empty($query_array['where'])){
348              $query_array['where'] = $query_array['where']. " AND marketing_id ='$mkt_id' ";
349         }
350
351                 //get select query from email man
352                 $man = new EmailMan();
353                 $listquery= $man->create_queue_items_query('',str_replace(array("WHERE","where"),"",$query_array['where']),null,$query_array);
354                 return $listquery;
355
356         }
357 //      function get_prospect_list_entries() {
358 //              $this->load_relationship('prospectlists');
359 //              $query_array = $this->prospectlists->getQuery(true);
360 //
361 //              $query=<<<EOQ
362 //                      SELECT distinct prospect_lists.*,
363 //                      (case  when (email_marketing.id is null) then default_message.id else email_marketing.id end) marketing_id,
364 //                      (case  when  (email_marketing.id is null) then default_message.name else email_marketing.name end) marketing_name
365 //
366 //                      FROM prospect_lists
367 //
368 //                      INNER JOIN prospect_list_campaigns ON (prospect_lists.id=prospect_list_campaigns.prospect_list_id AND prospect_list_campaigns.campaign_id='{$this->id}')
369 //
370 //                      LEFT JOIN email_marketing on email_marketing.message_for = prospect_lists.id and email_marketing.campaign_id = '{$this->id}'
371 //                      and email_marketing.deleted =0 and email_marketing.status='active'
372 //
373 //                      LEFT JOIN email_marketing default_message on default_message.message_for = prospect_list_campaigns.campaign_id and
374 //                      default_message.campaign_id = '{$this->id}' and default_message.deleted =0
375 //                      and default_message.status='active'
376 //
377 //                      WHERE prospect_list_campaigns.deleted=0 AND prospect_lists.deleted=0
378 //
379 //EOQ;
380 //              return $query;
381 //      }
382
383          function bean_implements($interface){
384                 switch($interface){
385                         case 'ACL':return true;
386                 }
387                 return false;
388         }
389
390
391         /**
392          * create_list_count_query
393          * Overrode this method from SugarBean to handle the distinct parameter used to filter out
394          * duplicate entries for some of the subpanel listivews.  Without the distinct filter, the
395          * list count would be inaccurate because one-to-many email_marketing entries may be associated
396          * with a campaign.
397      *
398      * @param string $query Select query string
399      * @param array $param array of arguments
400      * @return string count query
401      *
402          */
403     function create_list_count_query($query, $params=array())
404     {
405                 //include the distinct filter if a marketing id is defined, which means we need to filter out duplicates by the passed in group by.
406                 //if no marketing id is specified, it is understood there might be duplicate target entries so no need to filter out
407                 if((strpos($query,'marketing_id') !== false )&& isset($params['distinct'])) {
408                    $pattern = '/SELECT(.*?)(\s){1}FROM(\s){1}/is';  // ignores the case
409            $replacement = 'SELECT COUNT(DISTINCT ' . $params['distinct'] . ') c FROM ';
410            $query = preg_replace($pattern, $replacement, $query, 1);
411            return $query;
412                 }
413
414                 //If distinct parameter not found, default to SugarBean's function
415         return parent::create_list_count_query($query);
416     }
417
418     /**
419      * Returns count of deleted leads,
420      * which were created through generated lead form
421      *
422      * @return integer
423      */
424     function getDeletedCampaignLogLeadsCount()
425     {
426         $query = "SELECT COUNT(*) AS count FROM campaign_log WHERE campaign_id = '" . $this->getFieldValue('id') . "' AND target_id IS NULL AND activity_type = 'lead'";
427         $result = $this->db->fetchOne($query);
428
429         return (int)$result['count'];
430     }
431 }
432 ?>