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