diff options
author | Ivan Kohler <ivan@freeside.biz> | 2014-01-08 17:23:05 -0800 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2014-01-08 17:23:05 -0800 |
commit | 8861d46820af163c7de7839178b6120c9b32ab2c (patch) | |
tree | ebd723b2d1ea70f57bc52f94c80d991b5f50094a /httemplate | |
parent | 49809d3653e7ac4951d36716dce3cd25ba9c3728 (diff) |
time/data/etc. unit pricing add-ons, RT#24392
Diffstat (limited to 'httemplate')
-rwxr-xr-x | httemplate/browse/part_pkg.cgi | 5 | ||||
-rw-r--r-- | httemplate/edit/process/quick-cust_pkg.cgi | 15 | ||||
-rw-r--r-- | httemplate/elements/cust_pkg_usageprice.html | 72 | ||||
-rw-r--r-- | httemplate/elements/order_pkg.js | 69 | ||||
-rw-r--r-- | httemplate/elements/order_pkg_link.html | 2 | ||||
-rw-r--r-- | httemplate/elements/tr-cust_pkg_usageprice.html | 24 | ||||
-rwxr-xr-x | httemplate/misc/detach_pkg.html | 2 | ||||
-rw-r--r-- | httemplate/misc/order_pkg.html | 21 | ||||
-rw-r--r-- | httemplate/misc/xmlhttp-part_pkg_usageprice.html | 24 |
9 files changed, 226 insertions, 8 deletions
diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index b073866..574cf7a 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -278,9 +278,8 @@ push @fields, sub { ), ], ( - map { my $amount = $_->amount - / (FS::part_pkg_usageprice->targets->{$_->target}{multiplier}||1); - my $label = FS::part_pkg_usageprice->targets->{$_->target}{label}; + map { my $amount = $_->amount / ($_->target_info->{multiplier} || 1); + my $label = $_->target_info->{label}; [ { data => "Plus $money_char". $_->price. ' '. ( $_->action eq 'increment' ? 'per' : 'for' ). diff --git a/httemplate/edit/process/quick-cust_pkg.cgi b/httemplate/edit/process/quick-cust_pkg.cgi index 7dcd232..95c9243 100644 --- a/httemplate/edit/process/quick-cust_pkg.cgi +++ b/httemplate/edit/process/quick-cust_pkg.cgi @@ -133,6 +133,21 @@ my %hash = ( ); $hash{'custnum'} = $cust_main->custnum if $cust_main; +my @cust_pkg_usageprice = (); +foreach my $quantity_param ( grep ( $cgi->param($_) && $cgi->param($_) > 0 ), + grep /^usagepricenum(\d+)_quantity$/, + $cgi->param + ) +{ + $quantity_param =~ /^usagepricenum(\d+)_quantity$/ or die 'unpossible'; + my $num = $1; + push @cust_pkg_usageprice, new FS::cust_pkg_usageprice { + usagepricepart => scalar($cgi->param("usagepricenum${num}_usagepricepart")), + quantity => scalar($cgi->param($quantity_param)), + }; +} +$hash{cust_pkg_usageprice} = \@cust_pkg_usageprice; + if ( $quotationnum ) { $quotation_pkg = new FS::quotation_pkg \%hash; diff --git a/httemplate/elements/cust_pkg_usageprice.html b/httemplate/elements/cust_pkg_usageprice.html new file mode 100644 index 0000000..7290993 --- /dev/null +++ b/httemplate/elements/cust_pkg_usageprice.html @@ -0,0 +1,72 @@ +% unless ( $opt{'js_only'} ) { + + <INPUT TYPE="hidden" NAME="<%$name%>" ID="<%$id%>" VALUE="<% $curr_value %>"> + + <INPUT TYPE = "hidden" + NAME = "<%$name%>_usagepricepart" + ID = "<%$id%>_usagepricepart" + VALUE = "<% $part_pkg_usageprice->usagepricepart %>" + > + + <TABLE STYLE="display:inline"> + <TR> + +% ### +% # action +% ### + <TD> +% # maybe we should be a quantity entry instead of a select? even more +% # javascript auto-calculation need to display a subtotal & total + <SELECT NAME = "<%$name%>_quantity" + ID = "<%$id%>_quantity" + <% $onchange %> + > +% my $info = $part_pkg_usageprice->target_info; +% my $amount = $part_pkg_usageprice->amount / ($info->{multiplier}||1); + <OPTION VALUE="">Additional <% $info->{label} %> +% for (1..100) { #100? arbitrary. + <OPTION VALUE="<% $_ %>"><% + $money_char. sprintf('%.2f', $_ * $part_pkg_usageprice->price ). + ' '. + 'for'. #( $part_pkg_usageprice->action eq 'increment' ? 'per' : 'for' ). + ' '. + ( $_ * $amount ). ' '. $info->{label} + %> +% } + </SELECT> + </TD> + + </TR> + </TABLE> + +% } +<%init> + +#my $targets = FS::part_pkg_usageprice->targets; + +my( %opt ) = @_; + +my $conf = new FS::Conf; +my $money_char = $conf->config('money_char') || '$'; + +my $name = $opt{'element_name'} || $opt{'field'} || 'usagepricenum'; +my $id = $opt{'id'} || $opt{'field'} || 'usagepricenum'; + +my $curr_value = $opt{'curr_value'} || $opt{'value'}; + +my $onchange = ''; +if ( $opt{'onchange'} ) { + $onchange = $opt{'onchange'}; + $onchange .= '(this)' unless $onchange =~ /\(\w*\);?$/; + $onchange =~ s/\(what\);/\(this\);/g; #ugh, terrible hack. all onchange + #callbacks should act the same + $onchange = 'onChange="'. $onchange. '"'; +} + +my $cust_pkg_usageprice = $curr_value + ? qsearchs('cust_pkg_usageprice', { 'usagepricenum' => $curr_value } ) + : new FS::cust_pkg_usageprice { 'usagepricepart' => $opt{usagepricepart} }; + +my $part_pkg_usageprice = $cust_pkg_usageprice->part_pkg_usageprice; + +</%init> diff --git a/httemplate/elements/order_pkg.js b/httemplate/elements/order_pkg.js index 4e41fd6..393b845 100644 --- a/httemplate/elements/order_pkg.js +++ b/httemplate/elements/order_pkg.js @@ -21,8 +21,8 @@ function pkg_changed () { } } -// if this form element exists, then the start date is a future -// package change date; don't replace it + // if this form element exists, then the start date is a future + // package change date; don't replace it if ( form.delay ) { return; } @@ -39,6 +39,8 @@ function pkg_changed () { date_button_disabled.style.display = ''; } + get_part_pkg_usageprice( opt.value, update_part_pkg_usageprice ); + } else { form.submitButton.disabled = true; if ( discountnum ) { form.discountnum.disabled = true; } @@ -46,6 +48,69 @@ function pkg_changed () { } } +function update_part_pkg_usageprice(part_pkg_usageprice) { + + var table = document.getElementById('cust_pkg_usageprice_table'); + + // black the current usage price rows + for ( var r = table.rows.length - 1; r >= 0; r-- ) { + table.deleteRow(r); + } + + // add the new usage price rows + var rownum = 0; + var usagepriceArray = eval('(' + part_pkg_usageprice + ')' ); + for ( var s = 0; s < usagepriceArray.length; s=s+2 ) { + //surely this should be some kind of JSON structure + var html = usagepriceArray[s+0]; + var javascript = usagepriceArray[s+1]; + + // a lot like ("inspiried by") edit/elements/edit.html function spawn_<%$field%> + + // XXX evaluate the javascript + //if (window.ActiveXObject) { + // window.execScript(newfunc); + //} else { /* (window.XMLHttpRequest) */ + // //window.eval(newfunc); + // setTimeout(newfunc, 0); + //} + + var row = table.insertRow(rownum++); + + //var label_cell = document.createElement('TD'); + + //label_cell.id = '<% $field %>_label' + <%$field%>_fieldnum; + + //label_cell.style.textAlign = "right"; + //label_cell.style.verticalAlign = "top"; + //label_cell.style.borderTop = "1px solid black"; + //label_cell.style.paddingTop = "5px"; + + //label_cell.innerHTML = '<% $label %>'; + + //row.appendChild(label_cell); + + var widget_cell = document.createElement('TD'); + + //widget_cell.style.borderTop = "1px solid black"; + widget_cell.style.paddingTop = "3px"; + widget_cell.colSpan = "2"; + + widget_cell.innerHTML = html; + + row.appendChild(widget_cell); + + } + + if ( rownum > 0 ) { + document.getElementById('cust_pkg_usageprice_title').style.display = ''; + } else { + document.getElementById('cust_pkg_usageprice_title').style.display = 'none'; + } + +} + + function standardize_new_location() { var form = document.OrderPkgForm; var loc = form.locationnum; diff --git a/httemplate/elements/order_pkg_link.html b/httemplate/elements/order_pkg_link.html index 0cae492..6e0dd68 100644 --- a/httemplate/elements/order_pkg_link.html +++ b/httemplate/elements/order_pkg_link.html @@ -21,6 +21,6 @@ my %optional = grep $opt{$_}, qw( lock_pkgpart lock_locationnum qualnum quotationnum svcpart ); -my $height = $opt{'lock_locationnum'} ? 336 : 606; +my $height = $opt{'lock_locationnum'} ? 470 : 740; </%init> diff --git a/httemplate/elements/tr-cust_pkg_usageprice.html b/httemplate/elements/tr-cust_pkg_usageprice.html new file mode 100644 index 0000000..ccd0631 --- /dev/null +++ b/httemplate/elements/tr-cust_pkg_usageprice.html @@ -0,0 +1,24 @@ +% unless ( $opt{'js_only'} ) { + + <% include('tr-td-label.html', %opt) %> + <TD <% $cell_style %>> + +% } +% + <% include( '/elements/cust_pkg_usageprice.html', %opt ) %> +% +% unless ( $opt{'js_only'} ) { + + </TD> + </TR> + +% } +<%init> + +my( %opt ) = @_; + +my $cell_style = $opt{'cell_style'} ? 'STYLE="'. $opt{'cell_style'}. '"' : ''; + +#$opt{'label'} ||= 'XXX Something'; + +</%init> diff --git a/httemplate/misc/detach_pkg.html b/httemplate/misc/detach_pkg.html index 366bbac..b2dfa38 100755 --- a/httemplate/misc/detach_pkg.html +++ b/httemplate/misc/detach_pkg.html @@ -1,7 +1,5 @@ <& /elements/header-popup.html, mt("Detach Package to New Customer") &> -<SCRIPT TYPE="text/javascript" SRC="../elements/order_pkg.js"></SCRIPT> - <& /elements/error.html &> <FORM NAME="OrderPkgForm" ACTION="<% $p %>edit/process/detach-cust_pkg.html" METHOD=POST> diff --git a/httemplate/misc/order_pkg.html b/httemplate/misc/order_pkg.html index b06f962..080ba41 100644 --- a/httemplate/misc/order_pkg.html +++ b/httemplate/misc/order_pkg.html @@ -5,6 +5,12 @@ } &> +<& /elements/xmlhttp.html, + 'url' => $p.'misc/xmlhttp-part_pkg_usageprice.html', + 'subs' => [ 'get_part_pkg_usageprice' ], +&> + + <LINK REL="stylesheet" TYPE="text/css" HREF="../elements/calendar-win2k-2.css" TITLE="win2k-2"> <SCRIPT TYPE="text/javascript" SRC="../elements/calendar_stripped.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="../elements/calendar-en.js"></SCRIPT> @@ -113,6 +119,21 @@ </TABLE><BR> +%#so: +%# - hide until you selecdt a pacakge with add-ons +%# -lookup and display the available add-ons when +%# -add them to the (recur if there is one, otherwise setup) price and display magically like processing fees do on edit/cust_pay.cgi + +%# better label? +<FONT CLASS = "fsinnerbox-title" + ID = "cust_pkg_usageprice_title" + STYLE = "display:none" +><% mt('Usage add-ons') |h %></FONT> +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 ID="cust_pkg_usageprice_table"> + +</TABLE> +<BR> + % my $discount_cust_pkg = $curuser->access_right('Discount customer package'); % my $waive_setup_fee = $curuser->access_right('Waive setup fee'); % diff --git a/httemplate/misc/xmlhttp-part_pkg_usageprice.html b/httemplate/misc/xmlhttp-part_pkg_usageprice.html new file mode 100644 index 0000000..d4e2d84 --- /dev/null +++ b/httemplate/misc/xmlhttp-part_pkg_usageprice.html @@ -0,0 +1,24 @@ +<% encode_json( \@return ) %>\ +<%init> + +my( $pkgpart ) = $cgi->param('arg'); + +#could worry about agent-virting this so you can't see the add-on pricing of +# other agents, but not a real-world big worry + +my $part_pkg = qsearchs( 'part_pkg', { pkgpart=>$pkgpart } ); + +my $num = 0; + +my @return = map { + my @inc = ('/elements/cust_pkg_usageprice.html', + 'usagepricepart' => $_->usagepricepart, + ); + + ( include(@inc, field=>'usagepricenum'.$num, html_only=>1 ), + include(@inc, field=>'usagepricenum'.$num++, js_only=>1 ), + ); + } + $part_pkg->part_pkg_usageprice; + +</%init> |