price plans web gui 1st pass, oh my
[freeside.git] / httemplate / edit / part_pkg.cgi
1 <!-- $Id: part_pkg.cgi,v 1.4 2001-10-15 10:42:29 ivan Exp $ -->
2
3 <%
4
5 if ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {
6   $cgi->param('clone', $1);
7 } else {
8   $cgi->param('clone', '');
9 }
10 if ( $cgi->param('pkgnum') && $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
11   $cgi->param('pkgnum', $1);
12 } else {
13   $cgi->param('pkgnum', '');
14 }
15
16 my ($query) = $cgi->keywords;
17 my $action = '';
18 my $part_pkg = '';
19 if ( $cgi->param('error') ) {
20   $part_pkg = new FS::part_pkg ( {
21     map { $_, scalar($cgi->param($_)) } fields('part_pkg')
22   } );
23 }
24 if ( $cgi->param('clone') ) {
25   $action='Custom Pricing';
26   my $old_part_pkg =
27     qsearchs('part_pkg', { 'pkgpart' => $cgi->param('clone') } );
28   $part_pkg ||= $old_part_pkg->clone;
29 } elsif ( $query && $query =~ /^(\d+)$/ ) {
30   $part_pkg ||= qsearchs('part_pkg',{'pkgpart'=>$1});
31   unless ( $part_pkg->plan ) {
32     $part_pkg->plan('flat');
33     $part_pkg->plandata("setup=". $part_pkg->setup. "\n".
34                         "recur=". $part_pkg->recur. "\n");
35   }
36 } else {
37   $part_pkg ||= new FS::part_pkg {};
38   $part_pkg->plan('flat');
39 }
40 $action ||= $part_pkg->pkgpart ? 'Edit' : 'Add';
41 my $hashref = $part_pkg->hashref;
42
43 %>
44
45 <SCRIPT>
46 function visualize(what) {
47   if (document.getElementById) {
48     document.getElementById('d<%= $part_pkg->plan %>').style.visibility = "visible";
49   } else {
50     document.l<%= $part_pkg->plan %>.visibility = "visible";
51   }
52 }
53 </SCRIPT>
54
55 <% 
56
57 print header("$action Package Definition", menubar(
58   'Main Menu' => popurl(2),
59   'View all packages' => popurl(2). 'browse/part_pkg.cgi',
60 ), ' onLoad="visualize()"');
61
62 print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
63       "</FONT>"
64   if $cgi->param('error');
65
66 #print '<FORM ACTION="', popurl(1), 'process/part_pkg.cgi" METHOD=POST>';
67 print '<FORM NAME="dummy">';
68
69 #if ( $cgi->param('clone') ) {
70 #  print qq!<INPUT TYPE="hidden" NAME="clone" VALUE="!, $cgi->param('clone'), qq!">!;
71 #}
72 #if ( $cgi->param('pkgnum') ) {
73 #  print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="!, $cgi->param('pkgnum'), qq!">!;
74 #}
75 #
76 #print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!,
77 print "Package Part #", $hashref->{pkgpart} ? $hashref->{pkgpart} : "(NEW)";
78
79 print <<END;
80 <PRE>
81 Package (customer-visable)          <INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="$hashref->{pkg}">
82 Comment (customer-hidden)           <INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="$hashref->{comment}">
83
84 Frequency (months) of recurring fee <INPUT TYPE="text" NAME="freq" VALUE="$hashref->{freq}">
85
86 </PRE>
87
88 END
89
90 unless ( $cgi->param('clone') ) {
91   print <<END;
92 Enter the quantity of each service this package includes.<BR><BR>
93 <TABLE BORDER><TR><TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH>
94                   <TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH></TR>
95 END
96 }
97
98 my $count = 0;
99 my @fixups = ();
100 foreach my $part_svc ( ( qsearch( 'part_svc', {} ) ) ) {
101   my $svcpart = $part_svc->svcpart;
102   my $pkg_svc = qsearchs( 'pkg_svc', {
103     'pkgpart'  => $cgi->param('clone') || $part_pkg->pkgpart,
104     'svcpart'  => $svcpart,
105   } ) || new FS::pkg_svc ( {
106     'pkgpart'  => $cgi->param('clone') || $part_pkg->pkgpart,
107     'svcpart'  => $svcpart,
108     'quantity' => 0,
109   });
110   #? #next unless $pkg_svc;
111
112   push @fixups, "pkg_svc$svcpart";
113
114   unless ( defined ($cgi->param('clone')) && $cgi->param('clone') ) {
115     print '<TR>' if $count == 0 ;
116     print qq!<TD><INPUT TYPE="text" NAME="pkg_svc$svcpart" SIZE=3 VALUE="!,
117           $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0,
118           qq!"></TD><TD><A HREF="part_svc.cgi?!,$part_svc->svcpart,
119           qq!">!, $part_svc->getfield('svc'), "</A></TD>";
120     $count++;
121     if ($count == 2)
122     {
123       print '</TR>';
124       $count = 0;
125     }
126   } else {
127     print qq!<INPUT TYPE="hidden" NAME="pkg_svc$svcpart" VALUE="!,
128           $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0, qq!">\n!;
129   }
130 }
131
132 unless ( $cgi->param('clone') ) {
133   print qq!</TR>! if ($count != 0) ;
134   print "</TABLE>";
135 }
136
137 # prolly should be in database
138 my %plans = (
139
140   'flat' => {
141     'name' => 'Flat rate',
142     'fields' => {
143       'setup_fee' => { 'name' => 'Setup fee for this package',
144                        'default' => 0,
145                      },
146       'recur_fee' => { 'name' => 'Recurring fee for this package',
147                        'default' => 0,
148                       },
149     },
150     'setup' => 'what.setup_fee.value',
151     'recur' => 'what.recur_fee.value',
152   },
153
154   'flat_comission' => {
155     'name' => 'Flat rate with recurring referral comission as credit',
156     'fields' => {
157       'setup_fee' => { 'name' => 'Setup fee for this package',
158                        'default' => 0,
159                      },
160       'recur_fee' => { 'name' => 'Recurring fee for this package',
161                        'default' => 0,
162                      },
163       'comission_amount' => { 'name' => 'Comission amount',
164                               'default' => 0,
165                             },
166       'comission_depth'  => { 'name' => 'Number of layers',
167                               'default' => 1,
168                             },
169     },
170     'setup' => 'what.setup_fee.value',
171     'recur' => '\'my $error = $cust_pkg->cust_main->credit( \' + what.comission_amount.value + \' * scalar($cust_pkg->cust_main->referral_cust_pkg(\' + what.comission_depth.value+ \')), "commission" ); die $error if $error; \' + what.recur_fee.value + \';\'',
172   },
173
174 );
175
176 %>
177
178 <SCRIPT>
179 var layer = null;
180
181 function changed(what) {
182   layer = what.options[what.selectedIndex].value;
183 <% foreach my $layer ( keys %plans ) { %>
184   if (layer == "<%= $layer %>" ) {
185     <% foreach my $not ( grep { $_ ne $layer } keys %plans ) { %>
186       if (document.getElementById) {
187         document.getElementById('d<%= $not %>').style.visibility = "hidden";
188       } else {
189         document.l<%= $not %>.visibility = "hidden";
190       }
191     <% } %>
192     if (document.getElementById) {
193       document.getElementById('d<%= $layer %>').style.visibility = "visible";
194     } else {
195       document.l<%= $layer %>.visibility = "visible";
196     }
197   }
198 <% } %>
199 }
200
201 </SCRIPT>
202 <BR>
203 Price plan <SELECT NAME="plan" SIZE=1 onChange="changed(this);">
204 <OPTION>
205 <% foreach my $layer (keys %plans ) { %>
206 <OPTION VALUE="<%= $layer %>"<%= ' SELECTED'x($layer eq $part_pkg->plan) %>><%= $plans{$layer}->{'name'} %>
207 <% } %>
208 </SELECT></FORM>
209
210 <SCRIPT>
211 function fchanged(what) {
212   fixup(what.form);
213 }
214
215 function fixup(what) {
216 alert(what);
217 <% foreach my $f ( qw( pkg comment freq ), @fixups ) { %>
218   what.<%= $f %>.value = document.dummy.<%= $f %>.value;
219 <% } %>
220   what.plan.value = document.dummy.plan.options[document.dummy.plan.selectedIndex].value;
221 <% foreach my $p ( keys %plans ) { %>
222   if ( what.plan.value == "<%= $p %>" ) {
223     what.setup.value = <%= $plans{$p}->{setup} %>;
224     what.recur.value = <%= $plans{$p}->{recur} %>;
225   }
226 <% } %>
227 }
228 </SCRIPT>
229
230 <% my %plandata = map { /^(\w+)=(.*)$/; ( $1 => $2 ); }
231                     split("\n", $part_pkg->plandata );
232    #foreach my $layer ( 'konq_kludge', keys %plans ) { 
233    foreach my $layer ( 'konq_kludge', keys %plans ) {
234      my $visibility = "hidden";
235 %>
236 <SCRIPT>
237 if (document.getElementById) {
238     document.write("<DIV ID=\"d<%= $layer %>\" STYLE=\"visibility: <%= $visibility %>; position: absolute\">");
239 } else {
240 <% $visibility="show" if $visibility eq "visible"; %>
241     document.write("<LAYER ID=\"l<%= $layer %>\" VISIBILITY=\"<%= $visibility %>\">");
242 }
243 </SCRIPT>
244
245 <FORM NAME="<%= $layer %>" ACTION="process/part_pkg.cgi" METHOD=POST onSubmit="fixup(this)">
246 <INPUT TYPE="hidden" NAME="plan" VALUE="<%= $part_pkg->plan %>">
247 <INPUT TYPE="hidden" NAME="pkg" VALUE="<%= $hashref->{pkg} %>">
248 <INPUT TYPE="hidden" NAME="comment" VALUE="$<%= $hashref->{comment} %>">
249 <INPUT TYPE="hidden" NAME="freq" VALUE="<%= $hashref->{freq} %>">
250 <% foreach my $f ( @fixups ) { %>
251 <INPUT TYPE="hidden" NAME="<%= $f %>" VALUE="">
252 <% } %>
253
254 <%
255 if ( $cgi->param('clone') ) {
256   print qq!<INPUT TYPE="hidden" NAME="clone" VALUE="!, $cgi->param('clone'), qq!">!;
257 }
258 if ( $cgi->param('pkgnum') ) {
259   print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="!, $cgi->param('pkgnum'), qq!">!;
260 }
261 print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!,
262 %>
263
264 <% my $href = $plans{$layer}->{'fields'};
265    foreach my $field ( keys %{ $href } ) { %>
266 <%= $href->{$field}{'name'} %>: 
267 <INPUT TYPE="text" NAME="<%= $field %>" VALUE="<%= exists($plandata{$field}) ? $plandata{$field} : $href->{$field}{'default'} %>" onChange="fchanged(this)"><BR>
268 <% } %>
269 <INPUT TYPE="hidden" NAME="plandata" VALUE="<%= join(',', keys %{ $href } ) %>">
270
271 <FONT SIZE="1">
272 Setup expression<BR><INPUT TYPE="text" NAME="setup" SIZE="160" VALUE="<%= $hashref->{setup} %>" onLoad="fchanged(this)"><BR>
273 Recurring espression<BR><INPUT TYPE="text" NAME="recur" SIZE="160" VALUE="<%= $hashref->{recur} %>" onLoad="fchanged(this)"><BR>
274 </FONT>
275
276 <%
277 print qq!<BR><INPUT TYPE="submit" VALUE="!,
278       $hashref->{pkgpart} ? "Apply changes" : "Add package",
279       qq!" onClick="fchanged(this)">!;
280 %>
281
282 </FORM>
283
284 <SCRIPT>
285 if (document.getElementById) {
286   document.write("</DIV>");
287 } else {
288   document.write("</LAYER>");
289 }
290 </SCRIPT>
291
292 <% } %>
293
294 <TAG onLoad="
295     if (document.getElementById) {
296       document.getElementById('d<%= $part_pkg->plan %>').style.visibility = 'visible';
297     } else {
298       document.l<%= $part_pkg->plan %>.visibility = 'visible';
299     }
300 ">
301   </BODY>
302 </HTML>