infolog_merge::show_replacements()   F
last analyzed

Complexity

Conditions 19
Paths 2400

Size

Total Lines 94
Code Lines 65

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 19
eloc 65
nc 2400
nop 0
dl 0
loc 94
rs 0.3499
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Infolog - document merge
4
 *
5
 * @link http://www.egroupware.org
6
 * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
7
 * @author Nathan Gray
8
 * @package infolog
9
 * @copyright (c) 2007-16 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
10
 * @copyright 2011 Nathan Gray
11
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
12
 * @version $Id$
13
 */
14
15
use EGroupware\Api;
16
use EGroupware\Api\Link;
17
18
/**
19
 * Infolog - document merge object
20
 */
21
class infolog_merge extends Api\Storage\Merge
22
{
23
	/**
24
	 * Functions that can be called via menuaction
25
	 *
26
	 * @var array
27
	 */
28
	var $public_functions = array(
29
		'download_by_request'	=> true,
30
		'show_replacements'		=> true,
31
	);
32
33
	/**
34
	 * Business object to pull records from
35
	 */
36
	protected $bo = null;
37
38
	/**
39
	 * Constructor
40
	 *
41
	 */
42
	function __construct()
43
	{
44
		parent::__construct();
45
		$this->bo = new infolog_bo();
46
47
		$this->date_fields += array(
48
			'info_startdate',
49
			'info_enddate',
50
			'info_datecompleted',
51
			'info_datemodified',
52
			'info_created',
53
		);
54
55
		// switch of handling of Api\Html formated content, if Api\Html is not used
56
		$this->parse_html_styles = Api\Storage\Customfields::use_html('infolog');
57
	}
58
59
	/**
60
	 * Get infolog replacements
61
	 *
62
	 * @param int $id id of entry
63
	 * @param string &$content=null content to create some replacements only if they are use
64
	 * @return array|boolean
65
	 */
66
	protected function get_replacements($id,&$content=null)
67
	{
68
		if (!($replacements = $this->infolog_replacements($id, '', $content)))
69
		{
70
			return false;
71
		}
72
		return $replacements;
73
	}
74
75
	/**
76
	 * Get infolog replacements
77
	 *
78
	 * @param int $id id of entry
79
	 * @param string $prefix='' prefix like eg. 'erole'
80
	 * @return array|boolean
81
	 */
82
	public function infolog_replacements($id,$prefix='', &$content = '')
83
	{
84
		$record = new infolog_egw_record($id);
85
		$info = array();
86
87
		// Convert to human friendly values
88
		$types = infolog_egw_record::$types;
89
		$_selects = $this->bo->enums + array('status' => $this->bo->status[$record->info_type]);
0 ignored issues
show
Bug Best Practice introduced by
The property info_type does not exist on infolog_egw_record. Since you implemented __get, consider adding a @property annotation.
Loading history...
90
		foreach($_selects as $name => $value)
91
		{
92
			$selects['info_'.$name] = $value;
93
			if(!in_array('info_'.$name, $types['select'])) $types['select'][] = 'info_'.$name;
94
		}
95
96
		if($content && strpos($content, '$$#') !== FALSE)
97
		{
98
			$this->cf_link_to_expand($record->get_record_array(), $content, $info);
99
		}
100
101
		importexport_export_csv::convert($record, $types, 'infolog', $selects);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $selects seems to be defined by a foreach iteration on line 90. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
102
103
		$array = $record->get_record_array();
104
		if($record->info_contact)
105
		{
106
			$array['info_contact'] = $array['info_link']['title'];
107
		}
108
109
		// Set any missing custom fields, or the marker will stay
110
		foreach($this->bo->customfields as $name => $field)
111
		{
112
			if(!$array['#'.$name])
113
			{
114
				$array['#'.$name] = '';
115
			}
116
			// Format date cfs per user Api\Preferences
117
			if($array['#'.$name] && ($field['type'] == 'date' || $field['type'] == 'date-time'))
118
			{
119
				$this->date_fields[] = '#'.$name;
120
				$array['#'.$name] = Api\DateTime::to($array['#'.$name], $field['type'] == 'date' ? true : '');
121
			}
122
		}
123
124
		// Timesheet time
125
		if(strpos($content, 'info_sum_timesheets'))
126
		{
127
			$links = Link::get_links('infolog',$id,'timesheet');
128
			$sum = ExecMethod('timesheet.timesheet_bo.sum',$links);
0 ignored issues
show
Deprecated Code introduced by
The function ExecMethod() has been deprecated: use autoloadable class-names, instanciate and call method or use static methods ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

128
			$sum = /** @scrutinizer ignore-deprecated */ ExecMethod('timesheet.timesheet_bo.sum',$links);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
129
			$info['$$info_sum_timesheets$$'] = $sum['duration'];
130
		}
131
132
		// Check for linked project ID
133
		$links = Link::get_links('infolog', $id, 'projectmanager');
134
		foreach($links as $app_id)
135
		{
136
			$array['pm_id'] = $app_id;
137
			$array['project'] = Link::title('projectmanager', $app_id);
138
			break;
139
		}
140
		if (strpos($content, '$$project/') !== false && $array['pm_id'] && class_exists('projectmanager_merge'))
141
		{
142
			$pm_merge = new projectmanager_merge($array['pm_id']);
0 ignored issues
show
Bug introduced by
The type projectmanager_merge was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
143
			$info += $pm_merge->projectmanager_replacements($array['pm_id'],'project',$content);
144
		}
145
146
		// Add markers
147
		foreach($array as $key => &$value)
148
		{
149
			if(!$value) $value = '';
150
			$info['$$'.($prefix ? $prefix.'/':'').$key.'$$'] = $value;
151
		}
152
153
		// Links
154
		$info += $this->get_all_links('infolog', $id, $prefix, $content);
155
156
		// Add contact fields
157
		if($array['info_link'] && $array['info_link']['app'] && $array['info_link']['id'])
158
		{
159
			$info+=$this->get_app_replacements($array['info_link']['app'], $array['info_link']['id'], $content, 'info_contact');
160
		}
161
162
		// Add parent
163
		if($record->info_id_parent)
164
		{
165
			$info += $this->infolog_replacements($record->info_id_parent, 'info_id_parent', $content);
166
		}
167
		return $info;
168
	}
169
170
	/**
171
	 * Generate table with replacements for the Api\Preferences
172
	 *
173
	 */
174
	public function show_replacements()
175
	{
176
		$GLOBALS['egw_info']['flags']['app_header'] = lang('infolog').' - '.lang('Replacements for inserting entries into documents');
177
		$GLOBALS['egw_info']['flags']['nonavbar'] = false;
178
		echo $GLOBALS['egw']->framework->header();
179
180
		echo "<table width='90%' align='center'>\n";
181
		echo '<tr><td colspan="4"><h3>'.lang('Infolog fields:')."</h3></td></tr>";
182
183
		$n = 0;
184
		$tracking = new infolog_tracking($this->bo);
185
		$fields = array('info_id' => lang('Infolog ID'), 'pm_id' => lang('Project ID'), 'project' => lang('Project name')) + $tracking->field2label + array('info_sum_timesheets' => lang('Used time'));
186
		Api\Translation::add_app('projectmanager');
187
		foreach($fields as $name => $label)
188
		{
189
			if (in_array($name,array('custom'))) continue;	// dont show them
190
191
			if (in_array($name,array('info_subject', 'info_des')) && $n&1)		// main values, which should be in the first column
192
			{
193
				echo "</tr>\n";
194
				$n++;
195
			}
196
			if (!($n&1)) echo '<tr>';
197
			echo '<td>{{'.$name.'}}</td><td>'.lang($label).'</td>';
198
			if ($n&1) echo "</tr>\n";
199
			$n++;
200
		}
201
202
		echo '<tr><td colspan="4"><h3>'.lang('Custom fields').":</h3></td></tr>";
203
		$contact_custom = false;
204
		foreach($this->bo->customfields as $name => $field)
205
		{
206
			echo '<tr><td>{{#'.$name.'}}</td><td colspan="3">'.$field['label'].($field['type'] == 'select-account' ? '*':'')."</td></tr>\n";
207
			if($field['type'] == 'select-account') $contact_custom = true;
208
		}
209
		if($contact_custom)
210
		{
211
			echo '<tr><td /><td colspan="3">* '.lang('Addressbook placeholders available'). '</td></tr>';
212
		}
213
214
		echo '<tr><td colspan="4"><h3>'.lang('Parent').":</h3></td></tr>";
215
		echo '<tr><td>{{info_id_parent/info_subject}}</td><td colspan="3">'.lang('All other %1 fields are valid',lang('infolog'))."</td></tr>\n";
0 ignored issues
show
Unused Code introduced by
The call to lang() has too many arguments starting with lang('infolog'). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

215
		echo '<tr><td>{{info_id_parent/info_subject}}</td><td colspan="3">'./** @scrutinizer ignore-call */ lang('All other %1 fields are valid',lang('infolog'))."</td></tr>\n";

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
216
217
		echo '<tr><td colspan="4"><h3>'.lang('Contact fields').':</h3></td></tr>';
218
		$i = 0;
219
		foreach($this->contacts->contact_fields as $name => $label)
220
		{
221
			if (in_array($name,array('tid','label','geo'))) continue;       // dont show them, as they are not used in the UI atm.
222
223
			if (in_array($name,array('email','org_name','tel_work','url')) && $n&1)         // main values, which should be in the first column
224
			{
225
					echo "</tr>\n";
226
					$i++;
227
			}
228
			if (!($i&1)) echo '<tr>';
229
			echo '<td>{{info_contact/'.$name.'}}</td><td>'.$label.'</td>';
230
			if ($i&1) echo "</tr>\n";
231
			$i++;
232
		}
233
234
		echo '<tr><td colspan="4"><h3>'.lang('Custom fields').":</h3></td></tr>";
235
		foreach($this->contacts->customfields as $name => $field)
236
		{
237
			echo '<tr><td>{{info_contact/#'.$name.'}}</td><td colspan="3">'.$field['label']."</td></tr>\n";
238
		}
239
240
		echo '<tr><td colspan="4"><h3>'.lang('General fields:')."</h3></td></tr>";
241
		foreach(array(
242
			'link' => lang('HTML link to the current record'),
243
			'links' => lang('Titles of any entries linked to the current record, excluding attached files'),
244
			'attachments' => lang('List of files linked to the current record'),
245
			'links_attachments' => lang('Links and attached files'),
246
			'links/[appname]' => lang('Links to specified application.  Example: {{links/infolog}}'),
247
			'links/href' => lang('Links wrapped in an HREF tag with download link'),
248
			'links/link' => lang('Download url for links'),
249
			'date' => lang('Date'),
250
			'user/n_fn' => lang('Name of current user, all other contact fields are valid too'),
251
			'user/account_lid' => lang('Username'),
252
			'pagerepeat' => lang('For serial letter use this tag. Put the content, you want to repeat between two Tags.'),
253
			'label' => lang('Use this tag for addresslabels. Put the content, you want to repeat, between two tags.'),
254
			'labelplacement' => lang('Tag to mark positions for address labels'),
255
			'IF fieldname' => lang('Example {{IF n_prefix~Mr~Hello Mr.~Hello Ms.}} - search the field "n_prefix", for "Mr", if found, write Hello Mr., else write Hello Ms.'),
256
			'NELF' => lang('Example {{NELF role}} - if field role is not empty, you will get a new line with the value of field role'),
257
			'NENVLF' => lang('Example {{NENVLF role}} - if field role is not empty, set a LF without any value of the field'),
258
			'LETTERPREFIX' => lang('Example {{LETTERPREFIX}} - Gives a letter prefix without double spaces, if the title is emty for example'),
259
			'LETTERPREFIXCUSTOM' => lang('Example {{LETTERPREFIXCUSTOM n_prefix title n_family}} - Example: Mr Dr. James Miller'),
260
			) as $name => $label)
261
		{
262
			echo '<tr><td>{{'.$name.'}}</td><td colspan="3">'.$label."</td></tr>\n";
263
		}
264
265
		echo "</table>\n";
266
267
		echo $GLOBALS['egw']->framework->footer();
268
	}
269
}
270