4.x style
[freeside.git] / httemplate / edit / svc_broadband.cgi
1 <& elements/svc_Common.html,
2      'post_url'             => popurl(1). 'process/svc_broadband.cgi',
3      'name'                 => 'broadband service',
4      'table'                => 'svc_broadband',
5      'fields'               => \@fields, 
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',
12      'html_foot'            => $js,
13 &>
14 <%init>
15
16 die "access denied"
17   unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
18
19 # If it's stupid but it works, it's still stupid.
20 #  -Kristian
21
22 my $conf = new FS::Conf;
23
24 my $js = <<END
25     <script type="text/javascript">
26         function validate_coords(f){
27 END
28 ;
29 if ( $conf->exists('svc_broadband-require-nw-coordinates') ) {
30 $js .= <<END
31             var lon = f.longitude;
32             var lat = f.latitude;
33             if ( lon == null || lat == null || 
34                 lon.value.length == 0 || lat.value.length == 0 ) return true;
35
36             return (ut_coord(lat.value,1,90) && ut_coord(lon.value,-180,-1));
37         } // validate_coords
38
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(/^-/,'');
43
44             var d = 0;
45             var m = 0;
46             var s = 0;
47             
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);
51             if ( t1 != null ) {
52                 d = t1[1];
53             } else if ( t2 != null ) {
54                 d = t2[1];
55                 m = t2[2];
56             } else if ( t3 != null ) {
57                 d = t3[1];
58                 m = t3[2];
59                 s = t3[3];
60             } else {
61                 alert('Invalid co-ordinates! Latitude must be positive and longitude must be negative.');
62                 return false;
63             } 
64             
65             var ts = /^\\d{3}\$/.exec(s);
66             if ( ts != null || s > 59 ) {
67                s /= 1000; 
68             } else {
69                 s /= 60;
70             }
71             s /= 60;
72
73             m /= 60;
74             if ( m > 59 ) {
75                 alert('Invalid coordinate with minutes > 59');
76                 return false;
77             }
78
79             var tmp = parseInt(d)+parseInt(m)+parseInt(s);
80             tmp = tmp.toFixed(8);
81             coord = (neg ? -1 : 1) * tmp;
82
83             if(coord < lower) {
84                 alert('Error: invalid coordinate < '+lower);
85                 return false;
86             }
87             if(coord > upper) {
88                 alert('Error: invalid coordinate > '+upper);
89                 return false;
90             }
91
92             return true;
93 END
94 ;
95 }
96 $js .= <<END
97         }
98     </script>
99 END
100 ;
101
102 my @fields = (
103   qw( description speed_down speed_up speed_test_down speed_test_up speed_test_latency),
104   { field=>'sectornum', type=>'select-tower_sector',
105     include_opt_callback => sub {
106       my $svc_broadband = shift;
107       my $part_svc = $svc_broadband->part_svc;
108       my $sectors_only;
109       foreach ($part_svc->part_export()) {
110         $sectors_only = '1' if $_->can('require_tower_and_sector');
111       }
112       ## incase export requires a sector and service only has tower attached it will not show on edit.
113       my $non_option_label;
114       my $sector = qsearchs({'table' => 'tower_sector', 'hashref' => { 'sectornum' => $svc_broadband->sectornum }, });
115       $non_option_label = $sector->description if $sector;
116       return ('sectorsonly' => $sectors_only, 'non_option_label' => $non_option_label);
117     },
118   },
119   { field=>'routernum', type=>'select-router_block_ip', 
120     include_opt_callback => sub { 
121       my $svc_broadband = shift;
122       my $part_svc = $svc_broadband->part_svc;
123       return () unless $part_svc; #sanity check
124       my $col = $part_svc->part_svc_column('ip_addr');
125       return () unless $col; #sanity check
126       $col->set('required', 'Y') unless $conf->exists('svc_broadband-allow_null_ip_addr');
127       return ('ip_addr_required' => $col->required);
128     },
129   },
130   { field=>'mac_addr' , type=>'input-mac_addr' },
131   qw(
132       latitude longitude altitude
133       radio_serialnum radio_location poe_location rssi suid
134     ),
135   { field=>'shared_svcnum', type=>'search-svc_broadband', },
136   qw( vlan_profile performance_profile authkey plan_id ),
137 );
138
139 if ( $conf->exists('svc_broadband-radius') ) {
140   push @fields,
141   { field     => 'usergroup',
142     type      => 'select-radius_group',
143     multiple  => 1,
144   }
145 }
146
147 my $part_svc;
148
149 my $svc_edit_callback = sub {
150   my ($cgi, $svc_x, $part_svc_x, $cust_pkg, $fields, $opt) = @_;
151
152   $part_svc = $part_svc_x; #for field_callback to use
153
154   my ($nas_export) = $part_svc->part_export('broadband_nas');
155   #can we assume there's only one of these per part_svc?
156   if ( $nas_export ) {
157     my $nas;
158     if ( $svc_x->svcnum ) {
159       $nas = qsearchs('nas', { 'svcnum' => $svc_x->svcnum });
160     }
161     $nas ||= $nas_export->default_nas;
162     $svc_x->set($_, $nas->$_) foreach fields('nas');
163
164     # duplicates the fields in httemplate/edit/nas.html (mostly)
165     push @$fields,
166       { type  => 'tablebreak-tr-title', 
167         #value => 'Attached NAS',
168         value => $nas_export->exportname,
169         colspan => 2,
170       },
171       { field=>'nasnum', type=>'hidden', },
172       { field=>'shortname', size=>16, maxlength=>32 },
173       { field=>'secret', size=>40, maxlength=>60, required=>1 },
174       { field=>'type', type=>'select',
175         options=>[qw( cisco computone livingston max40xx multitech netserver
176         pathras patton portslave tc usrhiper other )],
177       },
178       { field=>'ports', size=>5 },
179       { field=>'server', size=>40, maxlength=>64 },
180       { field=>'community', size=>40, maxlength=>50 },
181     ;
182
183     $opt->{'labels'}{'shortname'} = 'Short name';
184     $opt->{'labels'}{'secret'}    = 'Shared secret';
185     $opt->{'labels'}{'type'}      = 'Type';
186     $opt->{'labels'}{'ports'}     = 'Ports';
187     $opt->{'labels'}{'server'}    = 'Server';
188     $opt->{'labels'}{'community'} = 'Community';
189   }
190 };
191
192 my $svc_field_callback = sub {
193   my ($cgi, $object, $fieldref) = @_;
194
195   my $columndef = $part_svc->part_svc_column($fieldref->{'field'});
196   if ($fieldref->{field} eq 'usergroup' && $columndef->columnflag eq 'F') {
197     $fieldref->{'formatted_value'} = 
198       [ $object->radius_groups('long_description') ];
199   }
200
201 }; 
202
203 </%init>