RT#18361: Delay package from billing until services are provisioned [bug fix to javas...
[freeside.git] / httemplate / elements / tr-pkg_svc.html
1 <TR>
2   <TD CLASS="background" COLSPAN=99>
3
4 <SCRIPT>
5 var provision_hold_td = [];
6 var provision_hold_input = [];
7 </SCRIPT>
8
9 <% itable('', 4, 1) %><TR><TD VALIGN="top">
10 <% pkg_svc_thead() %>
11
12 %foreach my $part_svc ( @part_svc ) {
13 %  my $svcpart = $part_svc->svcpart;
14 %  my $pkg_svc = $pkg_svc{$svcpart}
15 %             || new FS::pkg_svc ( {
16 %                                   'pkgpart'     => $pkgpart,
17 %                                   'svcpart'     => $svcpart,
18 %                                   'quantity'    => 0,
19 %                                   'primary_svc' => '',
20 %                                   'hidden'      => '',
21 %                                } );
22 %  if ( $cgi->param('error') ) {
23 %    my $primary_svc = ( $pkg_svc->primary_svc =~ /^Y/i );
24 %    my $pkg_svc_primary = scalar($cgi->param('pkg_svc_primary'));
25 %    $pkg_svc->primary_svc('')
26 %      if $primary_svc && $pkg_svc_primary != $svcpart;
27 %    $pkg_svc->primary_svc('Y')
28 %      if ! $primary_svc && $pkg_svc_primary == $svcpart;
29 %  }
30 %
31 %  push @fixups, "pkg_svc$svcpart";
32 %
33 %  my $quan = 0;
34 %  if ( $cgi->param("pkg_svc$svcpart") =~ /^\s*(\d+)\s*$/ ) {
35 %    $quan = $1;
36 %  } elsif ( $pkg_svc->quantity ) {
37 %    $quan = $pkg_svc->quantity;
38 %  }
39 %
40 %  my $provision_hold = '';
41 %  if ( grep { $_ eq "provision_hold$svcpart" } $cgi->param ) {
42 %    $provision_hold = $cgi->param("hidden_svc$svcpart");
43 %  } else {
44 %    $provision_hold = $pkg_svc->provision_hold;
45 %  }
46 %
47 %  my @exports = $pkg_svc->part_svc->part_export;
48 %  foreach my $export ( @exports ) {
49 %       push @possible_exports, $export if $export->can('external_pkg_map');
50 %  }
51
52   <TR>
53     <TD>
54       <INPUT TYPE="text" NAME="pkg_svc<% $svcpart %>" SIZE=7 MAXLENGTH=6 VALUE="<% $quan %>">
55     </TD>
56    
57     <TD ALIGN="center">
58       <INPUT TYPE="radio" NAME="pkg_svc_primary" VALUE="<% $svcpart %>" <% $pkg_svc->primary_svc =~ /^Y/i ? ' CHECKED' : '' %>>
59     </TD>
60
61     <TD>
62       <A HREF="part_svc.cgi?<% $part_svc->svcpart %>"><% $part_svc->svc %></A>      <% $part_svc->disabled =~ /^Y/i ? ' (DISABLED)' : '' %>
63     </TD>
64
65     <TD>
66       <INPUT TYPE="checkbox" NAME="hidden<% $svcpart %>" VALUE="Y"<% $pkg_svc->hidden =~ /^Y/i ? ' CHECKED' : ''%>>
67     </TD>
68
69     <TD ALIGN="center" ID="td_provision_hold<% $svcpart %>">
70       <INPUT TYPE="checkbox" ID="input_provision_hold<% $svcpart %>" NAME="provision_hold<% $svcpart %>" VALUE="Y"<% $provision_hold =~ /^Y/i ? ' CHECKED' : ''%>>
71     </TD>
72 <SCRIPT>
73 provision_hold_td.push(document.getElementById('td_provision_hold<% $svcpart %>'));
74 provision_hold_input.push(document.getElementById('input_provision_hold<% $svcpart %>'));
75 </SCRIPT>
76
77   </TR>
78 % foreach ( 1 .. $columns-1 ) {
79 %       if ( $count == int( $_ * scalar(@part_svc) / $columns ) ) { 
80 %  
81
82          </TABLE></TD><TD VALIGN="top"><% pkg_svc_thead() %>
83 %   }
84 %     }
85 %     $count++;
86 %  
87 % } # foreach $part_svc
88
89 </TR></TABLE></TD></TR></TABLE>
90
91 <SCRIPT>
92 // start_on_hold from edit/part_pkg.cgi
93 // toggles display of provision_hold checkboxes when that changes
94 function provision_hold_check () {
95   var start_on_hold = document.getElementById('start_on_hold');
96   if (start_on_hold) {
97     for (i = 0; i < provision_hold_td.length; i++) {
98       provision_hold_td[i].style.display = start_on_hold.checked ? '' : 'none';
99     }
100     for (i = 0; i < provision_hold_input.length; i++) {
101       provision_hold_input[i].disabled = start_on_hold.checked ? false : true;
102     }
103   }
104 }
105 function provision_hold_init () {
106   var start_on_hold = document.getElementById('start_on_hold');
107   if (start_on_hold) {
108     start_on_hold.onchange = provision_hold_check;
109     provision_hold_check();
110   }
111 }
112 provision_hold_init();
113 </SCRIPT>
114
115 % if ( scalar(@possible_exports) > 0 || scalar(@mapped_exports) > 0 ) {
116    <TABLE><TR>
117         <TH BGCOLOR="#dcdcdc">Export</TH>
118         <TH BGCOLOR="#dcdcdc">Vendor Package Id <FONT SIZE="-2">(blank to delete)</FONT></TH>
119         </TR>
120 %   foreach my $export ( @mapped_exports ) {
121         <TR>
122             <TD><% $export->exportname %></TD>
123             <TD><INPUT TYPE="text" NAME="export<% $export->exportnum %>"
124                     SIZE="30" VALUE="<% $vendor_pkg_ids{$export->exportnum} %>">
125             </TD>
126         </TR>
127 %   } 
128 %   foreach my $export ( @possible_exports ) {
129 %       unless ( defined $vendor_pkg_ids{$export->exportnum} ) {
130             <TR>
131                 <TD><% $export->exportname %></TD>
132                 <TD>
133                     <INPUT TYPE="text" NAME="export<% $export->exportnum %>" SIZE="30">
134                 </TD>
135             </TR>
136 %       }
137 %   }
138   </TABLE>
139 % }
140
141   </TD>
142 </TR>
143
144 <%init>
145
146 my %opt = @_;
147 my $cgi = $opt{'cgi'};
148
149 my $thead_count = 0;
150 sub pkg_svc_thead {
151   $thead_count += 1;
152   return "\n\n". ntable('#cccccc', 2).
153          '<TR>'.
154          '<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH>'.
155          '<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Primary</FONT></TH>'.
156          '<TH BGCOLOR="#dcdcdc">Service</TH>'.
157          '<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Hide<BR>from<BR>Invoices</FONT></TH>'.
158          '<TH BGCOLOR="#dcdcdc" ID="th_provision_hold' . $thead_count . '"><FONT SIZE=-1>Remove Hold After Provisioning</FONT></TH>'.
159          '</TR>'.
160          qq!<SCRIPT>provision_hold_td.push(document.getElementById('th_provision_hold$thead_count'))</SCRIPT>!;
161 ;
162 }
163
164 my $part_pkg = $opt{'object'};
165 my $pkgpart = $part_pkg->pkgpart;
166
167 my $where =  "WHERE disabled IS NULL OR disabled = ''";
168 if ( $pkgpart ) {
169   $where .=  "   OR 0 < ( SELECT quantity FROM pkg_svc
170                            WHERE pkg_svc.svcpart = part_svc.svcpart
171                              AND pkgpart = $pkgpart
172                         )";
173 }
174 my @part_svc = qsearch('part_svc', {}, '', $where);
175
176 #my $q_part_pkg = $clone_part_pkg || $part_pkg;
177 #my %pkg_svc = map { $_->svcpart => $_ } $q_part_pkg->pkg_svc;
178 my %pkg_svc = map { $_->svcpart => $_ } $part_pkg->pkg_svc('disable_linked'=>1);
179
180 my @fixups = ();
181 my $count = 0;
182 my $columns = 3;
183
184 my @possible_exports = ();
185 my @mapped_exports = ();
186 my @part_pkg_vendor = $part_pkg->part_pkg_vendor;
187 foreach my $part_pkg_vendor ( @part_pkg_vendor ) {
188     push @mapped_exports, $part_pkg_vendor->part_export;
189 }
190 my %vendor_pkg_ids = $part_pkg->vendor_pkg_ids;
191
192 </%init>