1 <& elements/svc_Common.html,
2 'post_url' => popurl(1). 'process/svc_broadband.cgi',
3 'name' => 'broadband service',
4 'table' => 'svc_broadband',
6 'svc_field_callback' => $svc_field_callback,
7 'svc_new_callback' => $svc_edit_callback,
8 'svc_edit_callback' => $svc_edit_callback,
9 'svc_error_callback' => $svc_edit_callback,
10 'dummy' => $cgi->query_string,
11 'onsubmit' => 'validate_coords',
17 unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
19 # If it's stupid but it works, it's still stupid.
22 my $conf = new FS::Conf;
25 <script type="text/javascript">
26 function validate_coords(f){
29 if ( $conf->exists('svc_broadband-require-nw-coordinates') ) {
31 var lon = f.longitude;
33 if ( lon == null || lat == null ||
34 lon.value.length == 0 || lat.value.length == 0 ) return true;
36 return (ut_coord(lat.value,1,90) && ut_coord(lon.value,-180,-1));
39 /* this is a JS re-implementation of FS::Record::ut_coord */
40 function ut_coord(coord,lower,upper) {
41 var neg = /^-/.test(coord);
42 coord = coord.replace(/^-/,'');
48 var t1 = /^(\\s*\\d{1,3}(?:\\.\\d+)?)\\s*\$/.exec(coord);
49 var t2 = /^(\\s*\\d{1,3})\\s+(\\d{1,2}(?:\\.\\d+))\\s*\$/.exec(coord);
50 var t3 = /^(\\s*\\d{1,3})\\s+(\\d{1,2})\\s+(\\d{1,3})\\s*\$/.exec(coord);
53 } else if ( t2 != null ) {
56 } else if ( t3 != null ) {
61 alert('Invalid co-ordinates! Latitude must be positive and longitude must be negative.');
65 var ts = /^\\d{3}\$/.exec(s);
66 if ( ts != null || s > 59 ) {
75 alert('Invalid coordinate with minutes > 59');
79 var tmp = parseInt(d)+parseInt(m)+parseInt(s);
81 coord = (neg ? -1 : 1) * tmp;
84 alert('Error: invalid coordinate < '+lower);
88 alert('Error: invalid coordinate > '+upper);
103 qw( description speed_down speed_up ),
104 { field=>'sectornum', type=>'select-tower_sector', },
105 { field=>'routernum', type=>'select-router_block_ip' },
106 { field=>'mac_addr' , type=>'input-mac_addr' },
108 latitude longitude altitude
109 radio_serialnum radio_location poe_location rssi suid
111 { field=>'shared_svcnum', type=>'search-svc_broadband', },
112 qw( vlan_profile performance_profile authkey plan_id ),
115 if ( $conf->exists('svc_broadband-radius') ) {
117 { field => 'usergroup',
118 type => 'select-radius_group',
125 my $svc_edit_callback = sub {
126 my ($cgi, $svc_x, $part_svc_x, $cust_pkg, $fields, $opt) = @_;
128 $part_svc = $part_svc_x; #for field_callback to use
130 my ($nas_export) = $part_svc->part_export('broadband_nas');
131 #can we assume there's only one of these per part_svc?
134 if ( $svc_x->svcnum ) {
135 $nas = qsearchs('nas', { 'svcnum' => $svc_x->svcnum });
137 $nas ||= $nas_export->default_nas;
138 $svc_x->set($_, $nas->$_) foreach fields('nas');
140 # duplicates the fields in httemplate/edit/nas.html (mostly)
142 { type => 'tablebreak-tr-title',
143 #value => 'Attached NAS',
144 value => $nas_export->exportname,
147 { field=>'nasnum', type=>'hidden', },
148 { field=>'shortname', size=>16, maxlength=>32 },
149 { field=>'secret', size=>40, maxlength=>60, required=>1 },
150 { field=>'type', type=>'select',
151 options=>[qw( cisco computone livingston max40xx multitech netserver
152 pathras patton portslave tc usrhiper other )],
154 { field=>'ports', size=>5 },
155 { field=>'server', size=>40, maxlength=>64 },
156 { field=>'community', size=>40, maxlength=>50 },
159 $opt->{'labels'}{'shortname'} = 'Short name';
160 $opt->{'labels'}{'secret'} = 'Shared secret';
161 $opt->{'labels'}{'type'} = 'Type';
162 $opt->{'labels'}{'ports'} = 'Ports';
163 $opt->{'labels'}{'server'} = 'Server';
164 $opt->{'labels'}{'community'} = 'Community';
168 my $svc_field_callback = sub {
169 my ($cgi, $object, $fieldref) = @_;
171 my $columndef = $part_svc->part_svc_column($fieldref->{'field'});
172 if ($fieldref->{field} eq 'usergroup' && $columndef->columnflag eq 'F') {
174 $fieldref->{'formatted_value'} =
175 [ $object->radius_groups('long_description') ];