fix error in svc_broadband, RT#16137
[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      'field_callback'       => $field_callback,
7      'svc_new_callback'     => $svc_edit_callback,
8      'svc_edit_callback'    => $svc_edit_callback,
9      'dummy'                => $cgi->query_string,
10      'onsubmit'             => 'validate_coords',
11      'html_foot'            => $js,
12 &>
13 <%init>
14
15 die "access denied"
16   unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
17
18 # If it's stupid but it works, it's still stupid.
19 #  -Kristian
20
21 my $conf = new FS::Conf;
22
23 my $js = <<END
24     <script type="text/javascript">
25         function validate_coords(f){
26 END
27 ;
28 if ( $conf->exists('svc_broadband-require-nw-coordinates') ) {
29 $js .= <<END
30             var lon = f.longitude;
31             var lat = f.latitude;
32             if ( lon == null || lat == null || 
33                 lon.value.length == 0 || lat.value.length == 0 ) return true;
34
35             return (ut_coord(lat.value,1,90) && ut_coord(lon.value,-180,-1));
36         } // validate_coords
37
38         /* this is a JS re-implementation of FS::Record::ut_coord */
39         function ut_coord(coord,lower,upper) {
40             var neg = /^-/.test(coord);
41             coord = coord.replace(/^-/,'');
42
43             var d = 0;
44             var m = 0;
45             var s = 0;
46             
47             var t1 = /^(\\s*\\d{1,3}(?:\\.\\d+)?)\\s*\$/.exec(coord);
48             var t2 = /^(\\s*\\d{1,3})\\s+(\\d{1,2}(?:\\.\\d+))\\s*\$/.exec(coord);
49             var t3 = /^(\\s*\\d{1,3})\\s+(\\d{1,2})\\s+(\\d{1,3})\\s*\$/.exec(coord);
50             if ( t1 != null ) {
51                 d = t1[1];
52             } else if ( t2 != null ) {
53                 d = t2[1];
54                 m = t2[2];
55             } else if ( t3 != null ) {
56                 d = t3[1];
57                 m = t3[2];
58                 s = t3[3];
59             } else {
60                 alert('Invalid co-ordinates! Latitude must be positive and longitude must be negative.');
61                 return false;
62             } 
63             
64             var ts = /^\\d{3}\$/.exec(s);
65             if ( ts != null || s > 59 ) {
66                s /= 1000; 
67             } else {
68                 s /= 60;
69             }
70             s /= 60;
71
72             m /= 60;
73             if ( m > 59 ) {
74                 alert('Invalid coordinate with minutes > 59');
75                 return false;
76             }
77
78             var tmp = parseInt(d)+parseInt(m)+parseInt(s);
79             tmp = tmp.toFixed(8);
80             coord = (neg ? -1 : 1) * tmp;
81
82             if(coord < lower) {
83                 alert('Error: invalid coordinate < '+lower);
84                 return false;
85             }
86             if(coord > upper) {
87                 alert('Error: invalid coordinate > '+upper);
88                 return false;
89             }
90
91             return true;
92 END
93 ;
94 }
95 $js .= <<END
96         }
97     </script>
98 END
99 ;
100
101 my @fields = (
102   qw( description ip_addr speed_down speed_up ),
103   { field=>'sectornum', type=>'select-tower_sector', },
104   qw( blocknum ),
105   { field=>'block_label', type=>'fixed' },
106   qw( mac_addr latitude longitude altitude vlan_profile 
107       performance_profile authkey plan_id ),
108 );
109
110 if ( $conf->exists('svc_broadband-radius') ) {
111   push @fields,
112   { field     => 'usergroup',
113     type      => 'select-radius_group',
114     multiple  => 1,
115   }
116 }
117
118 my $fixedblock = '';
119
120 my $part_svc;
121
122 my $svc_edit_callback = sub {
123   my ($cgi, $svc_x, $part_svc_x, $cust_pkg, $fields, $opt) = @_;
124
125   $part_svc = $part_svc_x; #for field_callback to use
126
127   $opt->{'labels'}{'block_label'} = 'Block';
128
129   my ($nas_export) = $part_svc->part_export('broadband_nas');
130   #can we assume there's only one of these per part_svc?
131   if ( $nas_export ) {
132     my $nas;
133     if ( $svc_x->svcnum ) {
134       $nas = qsearchs('nas', { 'svcnum' => $svc_x->svcnum });
135     }
136     $nas ||= $nas_export->default_nas;
137     $svc_x->set($_, $nas->$_) foreach fields('nas');
138
139     # duplicates the fields in httemplate/edit/nas.html (mostly)
140     push @$fields,
141       { type  => 'tablebreak-tr-title', 
142         #value => 'Attached NAS',
143         value => $nas_export->exportname,
144         colspan => 2,
145       },
146       { field=>'nasnum', type=>'hidden', },
147       { field=>'shortname', size=>16, maxlength=>32 },
148       { field=>'secret', size=>40, maxlength=>60, required=>1 },
149       { field=>'type', type=>'select',
150         options=>[qw( cisco computone livingston max40xx multitech netserver
151         pathras patton portslave tc usrhiper other )],
152       },
153       { field=>'ports', size=>5 },
154       { field=>'server', size=>40, maxlength=>64 },
155       { field=>'community', size=>40, maxlength=>50 },
156     ;
157
158     $opt->{'labels'}{'shortname'} = 'Short name';
159     $opt->{'labels'}{'secret'}    = 'Shared secret';
160     $opt->{'labels'}{'type'}      = 'Type';
161     $opt->{'labels'}{'ports'}     = 'Ports';
162     $opt->{'labels'}{'server'}    = 'Server';
163     $opt->{'labels'}{'community'} = 'Community';
164   }
165 };
166
167 my $field_callback = sub {
168   my ($cgi, $object, $fieldref) = @_;
169
170   unless ( $part_svc ) {
171     my $svcpart = $object->svcnum ? $object->cust_svc->svcpart;
172                     : $cgi->param('svcpart');
173     $part_svc = qsearchs( 'part_svc', { svcpart => $svcpart } );
174     die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
175   }
176
177   my $columndef = $part_svc->part_svc_column($fieldref->{'field'});
178   if ($columndef->columnflag eq 'F') {
179     $fieldref->{'type'} = length($columndef->columnvalue)
180                             ? 'fixed'
181                             : 'hidden';
182     $fieldref->{'value'} = $columndef->columnvalue;
183     $fixedblock = $fieldref->{value}
184       if $fieldref->{field} eq 'blocknum';
185
186     if ( $fieldref->{field} eq 'usergroup' ) {
187       $fieldref->{'formatted_value'} = 
188         [ $object->radius_groups('long_description') ];
189     }
190   }
191
192   if ($object->svcnum) { 
193
194     $fieldref->{type} = 'hidden'
195       if $fieldref->{field} eq 'blocknum';
196       
197     $fieldref->{value} = $object->addr_block->label
198       if $fieldref->{field} eq 'block_label' && $object->addr_block;
199
200   } else { 
201
202     if ($fieldref->{field} eq 'block_label') {
203       if ($fixedblock && $object->addr_block) {
204         $object->blocknum($fixedblock);
205         $fieldref->{value} = $object->addr_block->label;
206       }else{
207         $fieldref->{type} = 'hidden';
208       }
209     }
210
211     if ($fieldref->{field} eq 'blocknum') {
212       if ( $fixedblock or $conf->exists('auto_router') ) {
213         $fieldref->{type} = 'hidden';
214         $fieldref->{value} = $fixedblock;
215         return;
216       }
217
218       my $cust_pkg = qsearchs( 'cust_pkg', {pkgnum => $cgi->param('pkgnum')} );
219       die "No cust_pkg entry!" unless $cust_pkg;
220
221       $object->svcpart($part_svc->svcpart);
222       my @addr_block =
223         grep {  ! $_->agentnum
224                || $cust_pkg->cust_main->agentnum == $_->agentnum
225                && $FS::CurrentUser::CurrentUser->agentnum($_->agentnum)
226              }
227         map { $_->addr_block } $object->allowed_routers;
228       my @options = map { $_->blocknum } 
229                     sort { $a->label cmp $b->label } @addr_block;
230       my %option_labels = map { ( $_->blocknum => $_->label ) } @addr_block;
231       $fieldref->{type}    = 'select';
232       $fieldref->{options} = \@options;
233       $fieldref->{labels}  = \%option_labels;
234     }
235
236   }
237 }; 
238
239 </%init>