root/contributed_modules/modules/cdrcost/functions.inc.php

Revision 5074, 19.3 kB (checked in by p_lindheimer, 6 years ago)

#1209 add cdrcost to contributed module repository

Line 
1 <?php /* $Id */
2 //Copyright (C) 2006 Lenux Inc. (info@lenux.eu)
3 //
4 //This program is free software; you can redistribute it and/or
5 //modify it under the terms of the GNU General Public License
6 //as published by the Free Software Foundation; either version 2
7 //of the License, or (at your option) any later version.
8 //
9 //This program is distributed in the hope that it will be useful,
10 //but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //GNU General Public License for more details.
13
14
15 function configpageinit($mydisplay, $mytype) {
16     global $currentcomponent;
17     if ( $currentcomponent->isequal($mydisplay, $mytype) ) {
18         $currentcomponent->addguifunc('cdrcost_'.$mydisplay.'_configpageload');
19         $currentcomponent->addprocessfunc('cdrcost_'.$mydisplay.'_configprocess');
20         return true;
21     }
22     return false;
23 }
24
25 function configpageload($menu) {
26     global $currentcomponent;
27     extract($_REQUEST);
28     //error_log(date("H:i:s").": configpageload menu: ".$menu." action: ".$action." extdisplay: ".$extdisplay."\n",3,"/tmp/php.log");
29     if ( $action == 'del' ) { // Deleted
30         $currentcomponent->addguielem('_top', new gui_subheading('del', $extdisplay.' '._("deleted"), false));
31         return false;
32     } else {
33         if ( $extdisplay == '' ) { // Adding
34             $currentcomponent->addguielem('_top', new gui_pageheading('title', 'Add '.$menu, false), 0);
35             $currentcomponent->addguielem('_top', new gui_hidden('action', 'add'));
36         } elseif ( is_string($extdisplay) ) { // Editing
37             $currentcomponent->addguielem('_top', new gui_pageheading('title', "$menu: $extdisplay", false), 0);
38             $currentcomponent->addguielem('_top', new gui_hidden('action', 'edit'));
39             $delURL = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&action=del';
40             $currentcomponent->addguielem('_top', new gui_link('del', _("Delete ")." $menu $extdisplay", $delURL, true, false), 0);
41         }
42         $currentcomponent->addguielem('_top', new gui_hidden('extdisplay', $extdisplay));
43         return true;
44     }
45 }
46
47 function cdrcost_configprocess($addfun, $delfun, $editfun) {
48     extract($_REQUEST);
49     switch ($action) {
50         case "add":
51             $addfun($_REQUEST);
52             //needreload();
53             break;
54         case "del":
55             $delfun($extdisplay);
56             //needreload();
57             break;
58         case "edit":
59             $editfun($extdisplay,$_REQUEST);
60             //needreload();
61             break;
62     }
63 }
64
65 // returns a associative arrays with keys 'destination' and 'description'
66 function cdrcost_destinations() {
67     return null;
68 }
69
70 /*     Generates dialplan for conferences
71 We call this with retrieve_conf
72 */
73 function cdrcost_get_config($engine) {
74     global $ext// is this the best way to pass this?
75     switch($engine) {
76         case "asterisk":
77         break;
78     }
79     sql("SET CHARACTER SET utf8","query");
80 }
81
82 /* begin page.zonegroup.php functions */
83
84 function cdrcost_zonegroup_add($vars) {
85     extract($vars);
86     $sql = "INSERT INTO call_zone_group (name) VALUES ('".$name."');";
87     sql($sql,"query");
88 }
89
90 function cdrcost_zonegroup_del($id) {
91 error_log(date("H:i:s").": torol id: ".$id."\n",3,"/tmp/php.log");
92     $sql = "DELETE FROM call_zone_group WHERE id = '".$id."'";
93     sql($sql,"query");
94 }
95
96 function cdrcost_zonegroup_edit($id,$vars) {
97     extract($vars);
98     $sql = "UPDATE call_zone_group SET name = '".$name."' WHERE id = '".$id."'";
99     sql($sql,"query");
100 }
101
102 function cdrcost_zonegroup_get($id) {
103     $sql = "SELECT * FROM call_zone_group WHERE id = '".$id."'";
104     return sql($sql,"getAll",DB_FETCHMODE_ASSOC);
105 }
106
107 function cdrcost_zonegroup_list() {
108     $sql = "SELECT id, name FROM call_zone_group ORDER BY name";
109     return sql($sql,"getAll");
110 }
111
112 function cdrcost_zonegroup_configpageinit($dispnum) {
113     configpageinit('zonegroup', 'tool');
114 }
115
116 function cdrcost_zonegroup_configpageload() {
117     global $currentcomponent;
118     extract($_REQUEST);
119     $disppart = 'Zone Group';
120     if ( configpageload($disppart) ) {
121         $zonegroup = cdrcost_zonegroup_get($extdisplay);
122         if ( is_array($zonegroup) && count($zonegroup) == 1 )
123             extract($zonegroup[0], EXTR_PREFIX_ALL, 'zonegroup');
124         $section = $disppart.' Options';
125         $currentcomponent->addguielem($section, new gui_textbox('name', $zonegroup_name, 'Name', 'The name of this Zone Group.', 'isEmpty()', 'Please enter a valid Name'));
126     }
127 }
128
129 function cdrcost_zonegroup_configprocess() {
130     cdrcost_configprocess(cdrcost_zonegroup_add, cdrcost_zonegroup_del, cdrcost_zonegroup_edit);
131 }
132
133 /* end page.zonegroup.php functions */
134
135 /* begin page.zone.php functions */
136
137 function cdrcost_zone_add($vars) {
138     extract($vars);
139     $sql = "INSERT INTO call_zone (group_id, name, pattern) VALUES (";
140     $sql .= "'".$group_id."',";
141     $sql .= "'".$name."',";
142     $sql .= "'".$pattern."');";
143     sql($sql,"query");
144 }
145
146 function cdrcost_zone_del($id) {
147     $sql = "DELETE FROM call_zone WHERE id = '".$id."'";
148     sql($sql,"query");
149 }
150
151 function cdrcost_zone_edit($id,$vars) {
152     extract($vars);
153     $sql = "UPDATE call_zone SET group_id = '".$group_id."', name = '".$name."', pattern = '".$pattern."' WHERE id = '".$id."'";
154     sql($sql,"query");
155 }
156
157 function cdrcost_zone_get($id) {
158     $sql = "SELECT * FROM call_zone WHERE id = '".$id."'";
159     return sql($sql,"getAll",DB_FETCHMODE_ASSOC);
160 }
161
162 function cdrcost_zone_list() {
163     $sql = "SELECT id, name FROM call_zone ORDER BY name";
164     return sql($sql,"getAll");
165 }
166
167 function cdrcost_zone_configpageinit($dispnum) {
168     global $currentcomponent;
169     if ( configpageinit('zone', 'tool') ) {
170         $item = 'grouplist';
171         $currentcomponent->addoptlist($item, false);
172         $list = cdrcost_zonegroup_list();
173         if (is_array($list) && count($list) > 0) {
174             foreach ($list as $temp) {
175                 $currentcomponent->addoptlistitem($item, $temp[0], $temp[1]);
176             }
177         }
178     }
179 }
180
181 function cdrcost_zone_configpageload() {
182     global $currentcomponent;
183     extract($_REQUEST);
184     $disppart = 'Zone';
185     if ( configpageload($disppart) ) {
186         $zone = cdrcost_zone_get($extdisplay);
187         if ( is_array($zone) && count($zone) == 1 )
188             extract($zone[0], EXTR_PREFIX_ALL, 'zone');
189         $section = $disppart.' Options';
190         $currentcomponent->addguielem($section, new gui_textbox('name', $zone_name, 'Name', 'The name of this Zone.', 'isEmpty()', 'Please enter a valid Name'));
191         $currentcomponent->addguielem($section, new gui_selectbox('group_id', $currentcomponent->getoptlist('grouplist'), $zone_group_id, 'Group', 'The group of this zone', false));
192         $currentcomponent->addguielem($section, new gui_textbox('pattern', $zone_pattern, 'Pattern', 'The regex pattern of this Zone.', 'isEmpty()', 'Please enter a valid Pattern'));
193     }
194 }
195
196 function cdrcost_zone_configprocess() {
197     cdrcost_configprocess(cdrcost_zone_add, cdrcost_zone_del, cdrcost_zone_edit);
198 }
199
200 /* end page.zone.php functions */
201
202 /* begin page.schedule.php functions */
203
204 function cdrcost_schedule_add($vars) {
205     extract($vars);
206     $sql = "INSERT INTO call_schedule (name) VALUES ('".$name."');";
207     sql($sql,"query");
208 }
209
210 function cdrcost_schedule_del($id) {
211     $sql = "DELETE FROM call_schedule WHERE id = '".$id."'";
212     sql($sql,"query");
213 }
214
215 function cdrcost_schedule_edit($id,$vars) {
216     extract($vars);
217     $sql = "UPDATE call_schedule SET name = '".$name."' WHERE id = '".$id."'";
218     sql($sql,"query");
219 }
220
221 function cdrcost_schedule_get($id) {
222     $sql = "SELECT * FROM call_schedule WHERE id = '".$id."'";
223     return sql($sql,"getAll",DB_FETCHMODE_ASSOC);
224 }
225
226 function cdrcost_schedule_list() {
227     $sql = "SELECT id, name FROM call_schedule ORDER BY name";
228     return sql($sql,"getAll");
229 }
230
231 function cdrcost_schedule_configpageinit($dispnum) {
232     configpageinit('schedule', 'tool');
233 }
234
235 function cdrcost_schedule_configpageload() {
236     global $currentcomponent;
237     extract($_REQUEST);
238     $disppart = 'Schedule';
239     if ( configpageload($disppart) ) {
240         $schedule = cdrcost_schedule_get($extdisplay);
241         if ( is_array($schedule) && count($schedule) == 1 )
242             extract($schedule[0], EXTR_PREFIX_ALL, 'schedule');
243         $section = $disppart.' Options';
244         $currentcomponent->addguielem($section, new gui_textbox('name', $schedule_name, 'Name', 'The name of this Schedule.', 'isEmpty()', 'Please enter a valid Name'));
245     }
246 }
247
248 function cdrcost_schedule_configprocess() {
249     cdrcost_configprocess(cdrcost_schedule_add, cdrcost_schedule_del, cdrcost_schedule_edit);
250 }
251
252 /* end page.schedule.php functions */
253
254 /* begin page.schedulepart.php functions */
255
256 function cdrcost_schedulepart_add($vars) {
257     extract($vars);
258     $sql = "INSERT INTO call_schedule_part (name, schedule_id, weekday, begin, end) VALUES (";
259     $sql .= "'".$name."',";
260     $sql .= "'".$schedule_id."',";
261     $sql .= "'".$weekday."',";
262     $sql .= "'".$begin."',";
263     $sql .= "'".$end."');";
264     sql($sql,"query");
265 }
266
267 function cdrcost_schedulepart_del($id) {
268     $sql = "DELETE FROM call_schedule_part WHERE id = '".$id."'";
269     sql($sql,"query");
270 }
271
272 function cdrcost_schedulepart_edit($id,$vars) {
273     extract($vars);
274     $sql = "UPDATE call_schedule_part SET ";
275     $sql .= "name = '".$name;
276     $sql .= "', schedule_id = '".$schedule_id;
277     $sql .= "', weekday = '".$weekday;
278     $sql .= "', begin = '".$begin;
279     $sql .= "', end = '".$end."' WHERE id = '".$id."'";
280     sql($sql,"query");
281 }
282
283 function cdrcost_schedulepart_get($id) {
284     $sql = "SELECT * FROM call_schedule_part WHERE id = '".$id."'";
285     return sql($sql,"getAll",DB_FETCHMODE_ASSOC);
286 }
287
288 function cdrcost_schedulepart_list() {
289     $sql = "SELECT id, name FROM call_schedule_part ORDER BY name";
290     return sql($sql,"getAll");
291 }
292
293 function cdrcost_schedulepart_configpageinit($dispnum) {
294     global $currentcomponent;
295     if ( configpageinit('schedulepart', 'tool') ) {
296         $item = 'schedulelist';
297         $currentcomponent->addoptlist($item, false);
298         $list = cdrcost_schedule_list();
299         if (is_array($list) && count($list) > 0) {
300             foreach ($list as $temp) {
301                 $currentcomponent->addoptlistitem($item, $temp[0], $temp[1]);
302             }
303         }
304     }
305 }
306
307 function cdrcost_schedulepart_configpageload() {
308     global $currentcomponent;
309     extract($_REQUEST);
310     $disppart = 'Schedule Part';
311     if ( configpageload($disppart) ) {
312         $schedulepart_weekday = -1;
313         $schedulepart_begin = '00:00:00';
314         $schedulepart_end   = '23:59:59';
315         $schedulepart = cdrcost_schedulepart_get($extdisplay);
316         if ( is_array($schedulepart) && count($schedulepart) == 1 )
317             extract($schedulepart[0], EXTR_PREFIX_ALL, 'schedulepart');
318         $section = $disppart.' Options';
319         $currentcomponent->addguielem($section, new gui_textbox('name', $schedulepart_name, 'Name', 'The name of this Schedule part.', 'isEmpty()', 'Please enter a valid Name'));
320         $currentcomponent->addguielem($section, new gui_selectbox('schedule_id', $currentcomponent->getoptlist('schedulelist'), $schedulepart_schedule_id, 'Schedule', 'The schedule for this part belong to.', false));
321         $currentcomponent->addguielem($section, new gui_textbox('weekday', $schedulepart_weekday, 'Weekday', 'On which weekday this part valid (0 and 7 is sunday, negativ value means always.', '!checkNumber()', 'Please enter a valid value'));
322         $currentcomponent->addguielem($section, new gui_textbox('begin', $schedulepart_begin, 'From', 'From which time this part valid (format is: hh:mm:ss.', 'isEmpty()', 'Please enter a valid from'));
323         $currentcomponent->addguielem($section, new gui_textbox('end', $schedulepart_end, 'To', 'Until which time this part valid (format is: hh:mm:ss.', 'isEmpty()', 'Please enter a valid to'));
324     }
325 }
326
327 function cdrcost_schedulepart_configprocess() {
328     cdrcost_configprocess(cdrcost_schedulepart_add, cdrcost_schedulepart_del, cdrcost_schedulepart_edit);
329 }
330
331 /* end page.schedule_part.php functions */
332
333 /* begin page.rate.php functions */
334
335 function cdrcost_rate_add($vars) {
336     extract($vars);
337     $sql = "INSERT INTO call_rate (";
338     $sql .= "accountcode, name, begin, end, trunk, zone_id, rate, min_duration, block_size, connect, disconnect, schedule_id";
339     $sql .= ") VALUES (";
340     $sql .= "'".$accountcode."',";
341     $sql .= "'".$name."',";
342     $sql .= "'".$begin."',";
343     $sql .= "'".$end."',";
344     $sql .= "'".$trunk."',";
345     $sql .= "'".$zone_id."',";
346     $sql .= "'".$rate."',";
347     $sql .= "'".$min_duration."',";
348     $sql .= "'".$block_size."',";
349     $sql .= "'".$connect."',";
350     $sql .= "'".$disconnect."',";
351     $sql .= "'".$schedule_id."');";
352     sql($sql,"query");
353 }
354
355 function cdrcost_rate_del($id) {
356     $sql = "DELETE FROM call_rate WHERE id = '".$id."'";
357     sql($sql,"query");
358 }
359
360 function cdrcost_rate_edit($id,$vars) {
361     extract($vars);
362     $sql = "UPDATE call_rate SET ";
363     $sql .= "accountcode = '".$accountcode."', ";
364     $sql .= "name = '".$name."', ";
365     $sql .= "begin = '".$begin."', ";
366     $sql .= "end = '".$end."', ";
367     $sql .= "trunk = '".$trunk."', ";
368     $sql .= "zone_id = '".$zone_id."', ";
369     $sql .= "rate = '".$rate."', ";
370     $sql .= "min_duration = '".$min_duration."', ";
371     $sql .= "block_size = '".$block_size."', ";
372     $sql .= "connect = '".$connect."', ";
373     $sql .= "disconnect = '".$disconnect."', ";
374     $sql .= "schedule_id = '".$schedule_id."';";
375     sql($sql,"query");
376 }
377
378 function cdrcost_rate_get($id) {
379     $sql = "SELECT * FROM call_rate WHERE id = '".$id."'";
380     return sql($sql,"getAll",DB_FETCHMODE_ASSOC);
381 }
382
383 function cdrcost_rate_list() {
384     $sql = "SELECT id, name FROM call_rate ORDER BY name";
385     return sql($sql,"getAll");
386 }
387
388 function cdrcost_rate_configpageinit($dispnum) {
389     global $currentcomponent;
390     if ( configpageinit('rate', 'tool') ) {
391         $item = 'zonelist';
392         $currentcomponent->addoptlist($item, false);
393         $list = cdrcost_zone_list();
394         if (is_array($list) && count($list) > 0) {
395             foreach ($list as $temp) {
396                 $currentcomponent->addoptlistitem($item, $temp[0], $temp[1]);
397             }
398         }
399         $item = 'schedulelist';
400         $currentcomponent->addoptlist($item, false);
401         $list = cdrcost_schedule_list();
402         if (is_array($list) && count($list) > 0) {
403             foreach ($list as $temp) {
404                 $currentcomponent->addoptlistitem($item, $temp[0], $temp[1]);
405             }
406         }
407     }
408 }
409
410 function cdrcost_rate_configpageload() {
411     global $currentcomponent;
412     extract($_REQUEST);
413     $disppart = 'Rate';
414     if ( configpageload($disppart) ) {
415         $rate_begin = '1900-01-01 00:00:00';
416         $rate_end   = '2100-01-01 00:00:00';
417         $rate_rate  = 0;
418         $rate_min_duration = 0;
419         $rate_block_size = 1;
420         $rate_connect = 0;
421         $rate_disconnect = 0;
422         $rate = cdrcost_rate_get($extdisplay);
423         if ( is_array($rate) && count($rate) == 1 )
424             extract($rate[0], EXTR_PREFIX_ALL, 'rate');
425         $section = $disppart.' Options';
426         $currentcomponent->addguielem($section, new gui_textbox('name', $rate_name, 'Name', 'The name of this Rate.', 'isEmpty()', 'Please enter a valid Name'));
427         $currentcomponent->addguielem($section, new gui_textbox('accountcode', $rate_accountcode, 'Account Code', 'The accountcode used in the extension config. If empty then this rate is for all accountcode.', '!isAlphanumeric()', 'Please enter a valid account code'));
428         $currentcomponent->addguielem($section, new gui_textbox('begin', $rate_begin, 'Valid from', "This rate is valid from this time. The format is '1979-10-30 01:02:03'.", '', 'Please enter a valid date'));
429         $currentcomponent->addguielem($section, new gui_textbox('end', $rate_end, 'Valid till', "This rate is valid untill this time. The format is '1979-10-30 01:02:03'.", '', 'Please enter a valid date'));
430         $currentcomponent->addguielem($section, new gui_textbox('trunk', $rate_trunk, 'Trunk', 'The name of the Trunk for this rate is applicable.', '!isAlphanumeric()', 'Please enter a valid trunk'));
431         $currentcomponent->addguielem($section, new gui_selectbox('zone_id', $currentcomponent->getoptlist('zonelist'), $rate_zone_id, 'Zone', 'The zone of this rate', false));
432         $currentcomponent->addguielem($section, new gui_textbox('rate', $rate_rate, 'Rate', 'The cost of this rate per seconds.', '!isFloat()', 'Please enter a valid number'));
433         $currentcomponent->addguielem($section, new gui_textbox('min_duration', $rate_min_duration, 'Minimum duration', 'The minimum duration will be applied in second.', '!isInteger()', 'Please enter a valid duration'));
434         $currentcomponent->addguielem($section, new gui_textbox('block_size', $rate_block_size, 'Block size', 'The increment size which will be applied in second.', '!isInteger()', 'Please enter a valid block size'));
435         $currentcomponent->addguielem($section, new gui_textbox('connect', $rate_connect, 'Connection cost', 'The cost of the estabilished connections.', '!isFloat()', 'Please enter a valid cost'));
436         $currentcomponent->addguielem($section, new gui_textbox('disconnect', $rate_disconnect, 'Disconnection cost', 'The cost of the disconnections.', '!isFloat()', 'Please enter a valid cost'));
437         $currentcomponent->addguielem($section, new gui_selectbox('schedule_id', $currentcomponent->getoptlist('schedulelist'), $rate_schedule_id, 'Schedule', 'In which schedule this rate valid.', false));
438     }
439 }
440
441 function cdrcost_rate_configprocess() {
442     cdrcost_configprocess(cdrcost_rate_add, cdrcost_rate_del, cdrcost_rate_edit);
443 }
444
445 /* end page.rate.php functions */
446
447 /* begin page.maint.php functions */
448
449 function get_cost($uniqueid) {
450     $sql = "SELECT * FROM asteriskcdrdb.cdr WHERE uniqueid = '".$uniqueid."'";
451     $result = sql($sql,"getAll",DB_FETCHMODE_ASSOC);
452     if (is_array($result) && count($result) == 1) {
453         extract($result[0]);
454     } else {
455         die("There can't be two uniqueid cdr!");
456     }
457
458     $result = getdate(strtotime($calldate));
459     $wday = $result["wday"];
460     $time = $result["hours"].":".$result["minutes"].":".$result["seconds"];
461
462     $sql_sch = "SELECT id FROM call_schedule_part WHERE (weekday = -1 OR weekday = ".$wday.") AND begin <= '".$time."' AND '".$time."' <= end";
463     $sql_zone = "SELECT id FROM call_zone WHERE '".$dst."' REGEXP pattern";
464     
465     $sql = "SELECT id FROM call_rate WHERE ";
466     $sql .= "accountcode = '".$accountcode."'";
467     $sql .= " AND begin <= '".$calldate."' AND '".$calldate."' <= end";
468     $sql .= " AND LOCATE(trunk,'".$dstchannel."') = 1";
469     $sql .= " AND schedule_id IN (".$sql_sch.")";
470     $sql .= " AND zone_id IN (".$sql_zone.")";
471     $result = sql($sql,"getAll");
472     $costs = array();
473     if (is_array($result) && count($result) > 0) {
474         foreach ($result as $rid) {
475             $sql = "SELECT * FROM call_rate WHERE id = ".$rid[0];
476             $tmp = sql($sql,"getAll",DB_FETCHMODE_ASSOC);
477             extract($tmp[0]);
478             $costs[$rid[0]] = max(ceil($billsec / $block_size) * $block_size, $min_duration) * $rate / 60.0 + $connect + $disconnect;
479         }
480     }
481     return $costs;
482 }
483
484 function last_uniqueid() {
485     $sql = "SELECT MAX(uniqueid) FROM asteriskcdrdb.cdr WHERE disposition = 'ANSWERED'";
486     $result = sql($sql,"getAll");
487     return $result[0][0];
488 }
489
490 function getnext_uniqueid($last) {
491     if ($last == '') {
492         $sql = "SELECT value FROM globals WHERE variable = 'CDRCOST_MAX'";
493         $result = sql($sql,"getAll");
494         if (is_array($result) && count($result) == 1) {
495             $last = $result[0][0];
496         }
497     }
498     $sql = "SELECT MIN(uniqueid) FROM asteriskcdrdb.cdr WHERE disposition = 'ANSWERED'";
499     if ($last <> '') {
500         $sql .= " AND uniqueid > '".$last."'";
501     }
502     $result = sql($sql,"getAll");
503     if (is_array($result) && count($result) == 1) {
504         return $result[0][0];
505     } else {
506         return '';
507     }
508 }
509
510 function fill_cdrcost() {
511     $next = getnext_uniqueid('');
512     while ($next <> '') {
513         //print($next."\n");
514         $costs = get_cost($next);
515         if (count($costs) > 0) {
516             arsort($costs,SORT_NUMERIC);
517             $rid = key($costs);
518             $cost = current($costs);
519             $sql = "INSERT INTO asteriskcdrdb.cdrcost (uniqueid, rate_id, cost) VALUES ('".$next."', ".$rid.", ".$cost.")";
520             sql($sql,"query");
521         }
522         $last = $next;
523         $next = getnext_uniqueid($last);
524     }
525     if ($last <> '') {
526         $sql = "INSERT INTO globals (variable, value) VALUES ('CDRCOST_MAX', '".$last."')";
527         sql($sql,"query");
528     }
529 }
530
531 function cdrcost_maint_add($name) {
532     //$sql = "INSERT INTO call_zone_group (name) VALUES ('".$name."');";
533     //sql($sql,"query");
534 }
535
536 function cdrcost_maint_del($name) {
537     //$sql = "DELETE FROM call_zone_group WHERE name = '".$name."'";
538     //sql($sql,"query");
539 }
540
541 function cdrcost_maint_list() {
542     //$sql = "SELECT name FROM call_zone_group ORDER BY name";
543     //return sql($sql,"getAll");
544 }
545
546 function cdrcost_maint_configpageinit($dispnum) {
547 }
548
549 function cdrcost_maint_configpageload() {
550 }
551
552 function cdrcost_maint_configprocess() {
553 }
554
555
556 /* end page.maint.php functions */
557
558 ?>
559
Note: See TracBrowser for help on using the browser.