fix fallout: allowing selectable choice for arbitrary things broke classic selectable...
[freeside.git] / httemplate / edit / elements / svc_Common.html
1 <% include( 'edit.html',
2
3                  'menubar' => [],
4
5                  'error_callback' => sub {
6                    my( $cgi, $svc_x, $fields, $opt ) = @_;
7                    #$svcnum = $svc_x->svcnum;
8                    $pkgnum  = $cgi->param('pkgnum');
9                    $svcpart = $cgi->param('svcpart');
10
11                    $part_svc = qsearchs( 'part_svc', { svcpart=>$svcpart });
12                    die "No part_svc entry!" unless $part_svc;
13
14                    label_fixup($part_svc, $opt);
15
16                    $svc_x->setfield('svcpart', $svcpart);
17
18                    if ( my $cb = $opt{'svc_error_callback'} ) {
19                      my $cust_pkg = $pkgnum
20                                       ? qsearchs('cust_pkg', {pkgnum=>$pkgnum})
21                                       : ''; #?
22                      &{ $cb }( $cgi,$svc_x, $part_svc,$cust_pkg, $fields,$opt);
23                    }
24                  },
25
26                  'edit_callback' => sub {
27                    my( $cgi, $svc_x, $fields, $opt ) = @_;
28                    #$svcnum = $svc_x->svcnum;
29                    my $cust_svc = $svc_x->cust_svc
30                      or die "Unknown (cust_svc) svcnum!";
31
32                    $pkgnum  = $cust_svc->pkgnum;
33                    $svcpart = $cust_svc->svcpart;
34   
35                    $part_svc = qsearchs ('part_svc', { svcpart=>$svcpart });
36                    die "No part_svc entry!" unless $part_svc;
37
38                    label_fixup($part_svc, $opt);
39                    
40                    if ( my $cb = $opt{'svc_edit_callback'} ) {
41                      my $cust_pkg = $pkgnum
42                                       ? qsearchs('cust_pkg', {pkgnum=>$pkgnum})
43                                       : ''; #?
44                      &{ $cb }( $cgi,$svc_x, $part_svc,$cust_pkg, $fields,$opt);
45                    }
46                  },
47
48                  'new_hashref_callback' => sub {
49                    #my( $cgi, $svc_x ) = @_;
50
51                    { pkgnum  => $pkgnum,
52                      svcpart => $svcpart,
53                    };
54
55                  },
56
57                  'new_callback' => sub {
58                    my( $cgi, $svc_x, $fields, $opt ) = @_;
59
60                    $part_svc = qsearchs( 'part_svc', { svcpart=>$svcpart });
61                    die "No part_svc entry!" unless $part_svc;
62
63                    label_fixup($part_svc, $opt);
64
65                    #$svcnum='';
66
67                    if ( my $cb = $opt{'svc_new_callback'} ) {
68                      my $cust_pkg = $pkgnum
69                                      ? qsearchs('cust_pkg', {pkgnum=>$pkgnum})
70                                      : ''; #?
71                      &{ $cb }( $cgi,$svc_x, $part_svc,$cust_pkg, $fields,$opt);
72                    }
73
74                    $svc_x->set_default_and_fixed;
75
76                  },
77
78                  'field_callback' => sub {
79                    my ($cgi, $object, $f) = @_;
80
81                    my $columndef = $part_svc->part_svc_column($f->{'field'});
82                    my $flag = $columndef->columnflag;
83                    if ( $flag eq 'F' ) {
84                      $f->{'type'} = length($columndef->columnvalue)
85                                       ? 'fixed'
86                                       : 'hidden';
87                      $f->{'value'} = $columndef->columnvalue;
88                    } elsif ( $flag eq 'A' ) {
89                      $f->{'type'} = 'hidden';
90                    } elsif ( $flag eq 'M' ) {
91                      $f->{'empty_label'} = 'Select inventory item';
92                      $f->{'type'}        = 'select-table';
93                      $f->{'table'}       = 'inventory_item';
94                      $f->{'name_col'}    = 'item'; 
95                      $f->{'value_col'}   = 'item'; 
96                      $f->{'agent_virt'}  = 1;
97                      $f->{'agent_null'}  = 1;
98                      $f->{'hashref'}     = {
99                                             'classnum'=>$columndef->columnvalue,
100                                             #'svcnum'  => '',
101                                            };
102                      $f->{'extra_sql'}   = 'AND ( svcnum IS NULL ';
103                      $f->{'extra_sql'}  .= ' OR svcnum = '. $object->svcnum
104                        if $object->svcnum;
105                      $f->{'extra_sql'}  .= ' ) ';
106                      $f->{'disable_empty'} = $object->svcnum ? 1 : 0;
107                      if ( $f->{'field'} eq 'mac_addr' ) {
108                        $f->{'compare_sub'} = sub {
109                          my($a, $b) = @_;
110                          $a =~ s/[-: ]//g;
111                          $b =~ s/[-: ]//g;
112                          lc($a) eq lc($b);
113                        };
114                      }
115                    } elsif ( $flag eq 'H' ) {
116                      $f->{'type'}        = 'select-hardware_type';
117                      $f->{'hashref'}     = {
118                                             'classnum'=>$columndef->columnvalue
119                                            };
120
121                    } elsif ( $flag eq 'S' #selectable choice
122                                && $f->{type} !~ /^select-svc(-domain|_pbx)$/ ) {
123                      $f->{type}    = 'select';
124                      $f->{options} = [ split( /\s*,\s*/,
125                                                 $columndef->columnvalue)
126                                      ];
127                    }
128
129                    if (    $f->{'type'} eq 'select-svc_pbx'
130                         || $f->{'type'} eq 'select-svc-domain' 
131                       )
132                    {
133                      $f->{'include_opt_callback'} =
134                        sub { ( 'pkgnum'  => $pkgnum,
135                                'svcpart' => $svcpart,
136                              );
137                            };
138                    }
139
140                    if ( $f->{'field'} eq 'custnum' && $pkgnum ) {
141                      my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum});
142                      $object->set('custnum', $cust_pkg->custnum);
143                    }
144
145                    if ( my $cb = $opt{'svc_field_callback'} ) {
146                      &{ $cb }( $cgi, $object, $f);
147                    }
148
149                  },
150
151                  'html_init' => sub {
152                    my $cust_main;
153                    if ( $pkgnum ) {
154                      my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum});
155                      $cust_main = $cust_pkg->cust_main if $cust_pkg;
156                    }
157                    $cust_main
158                      ? include( '/elements/small_custview.html',
159                                 $cust_main,
160                                 '',
161                                 1,
162                                 popurl(2). "view/cust_main.cgi"
163                               ). '<BR>'
164                      : '';
165
166                  },
167
168                  'html_table_bottom' => sub {
169                    my $svc_x = shift;
170                    my $html = '';
171                    foreach my $field ($svc_x->virtual_fields) {
172                      if ($part_svc->part_svc_column($field)->columnflag ne 'F'){
173                        # If the flag is X, it won't even show up
174                        # in $svc_acct->virtual_fields.
175                        $html .=
176                          $svc_x->pvf($field)->widget( 'HTML',
177                                                       'edit', 
178                                                       $svc_x->getfield($field)
179                                                     );
180                      }
181                    }
182                    $html;
183                  },
184
185                  'html_bottom' => sub {
186                    qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="$pkgnum">!.
187                    qq!<INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart">!;
188                  },
189
190                  %opt #pass through/override params
191              )
192 %>
193 <%once>
194
195 sub label_fixup {
196   my( $part_svc, $opt ) = @_;
197
198   $opt->{'name'} ||= $part_svc->svc;
199
200   my $svcdb = $part_svc->svcdb;
201   require "FS/$svcdb.pm";
202
203   if ( UNIVERSAL::can("FS::$svcdb", 'table_info') ) {
204     #$opt->{'name'} ||= "FS::$svcdb"->table_info->{'name'};
205
206     my $fields = "FS::$svcdb"->table_info->{'fields'};
207     $opt->{'fields'} ||= [ grep { $_ ne 'svcnum' } keys %$fields ];
208
209     $opt->{labels} ||= {
210                          map { $_ => ( ref($fields->{$_})
211                                          ? $fields->{$_}{'label'}
212                                          : $fields->{$_}
213                                      );
214                              }
215                          keys %$fields
216                        };
217   }
218
219   #false laziness w/view/svc_Common.html
220   #override default labels with service-definition labels if applicable
221   my $labels = $opt->{labels}; # with -> here
222   foreach my $field ( keys %{ $opt->{labels} } ) {
223     my $col = $part_svc->part_svc_column($field);
224     $labels->{$field} = $col->columnlabel if $col->columnlabel !~ /^\s*$/;
225   }
226
227 }
228
229 </%once>
230 <%init>
231
232 my %opt = @_;
233
234 #my( $svcnum, $pkgnum, $svcpart, $part_svc );
235 my( $pkgnum, $svcpart, $part_svc );
236
237 #get & untaint pkgnum & svcpart
238 if ( ! $cgi->param('error')
239      && $cgi->param('pkgnum') && $cgi->param('svcpart')
240    )
241 {
242   $cgi->param('pkgnum') =~ /^(\d+)$/ or die 'unparsable pkgnum';
243   $pkgnum = $1;
244   $cgi->param('svcpart') =~ /^(\d+)$/ or die 'unparsable svcpart';
245   $svcpart = $1;
246   #$cgi->delete_all(); #so edit.html treats this correctly as new??
247 }
248
249 </%init>