X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fedit%2Fpart_pkg.cgi;h=84aac5bde3fd5b5e1e0814200dad5288afa395ed;hb=11bbf29de447fe39e9d7155fe280a0df70fa8c3c;hp=2c3808fe1a05d11d1204827969a7cbcabcffd88a;hpb=d1a885c65ac10e19bed0333a380dafeb42c2cef1;p=freeside.git diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index 2c3808fe1..84aac5bde 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -1,352 +1,1197 @@ -<% +<& elements/edit.html, + 'post_url' => popurl(1).'process/part_pkg.cgi', + 'name' => "Package definition", + 'table' => 'part_pkg', -if ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) { - $cgi->param('clone', $1); -} else { - $cgi->param('clone', ''); -} -if ( $cgi->param('pkgnum') && $cgi->param('pkgnum') =~ /^(\d+)$/ ) { - $cgi->param('pkgnum', $1); -} else { - $cgi->param('pkgnum', ''); -} + 'agent_virt' => 1, + 'agent_null_right' => $edit_global, + 'agent_clone_extra_sql' => $agent_clone_extra_sql, + #'viewall_dir' => 'browse', + 'viewall_url' => $p.'browse/part_pkg.cgi', + 'html_init' => include('/elements/init_overlib.html'). + $javascript, + 'html_bottom' => $html_bottom, + 'body_etc' => + 'onLoad="agent_changed(document.edit_topform.agentnum); + aux_planchanged(document.edit_topform.plan); + hide_supp_pkgs()"', -my ($query) = $cgi->keywords; + 'begin_callback' => $begin_callback, + 'end_callback' => $end_callback, + 'new_hashref_callback' => $new_hashref_callback, + 'new_object_callback' => $new_object_callback, + 'new_callback' => $new_callback, + 'clone_callback' => $clone_callback, + 'edit_callback' => $edit_callback, + 'error_callback' => $error_callback, + 'field_callback' => $field_callback, -my $part_pkg = ''; -if ( $cgi->param('error') ) { - $part_pkg = new FS::part_pkg ( { - map { $_, scalar($cgi->param($_)) } fields('part_pkg') - } ); -} + 'onsubmit' => 'confirm_submit', -my $action = ''; -my $clone_part_pkg = ''; -my $pkgpart = ''; -if ( $cgi->param('clone') ) { - $pkgpart = $cgi->param('clone'); - $action = 'Custom Pricing'; - $clone_part_pkg= qsearchs('part_pkg', { 'pkgpart' => $cgi->param('clone') } ); - $part_pkg ||= $clone_part_pkg->clone; - $part_pkg->disabled('Y'); -} elsif ( $query && $query =~ /^(\d+)$/ ) { - $part_pkg ||= qsearchs('part_pkg',{'pkgpart'=>$1}); - $pkgpart = $part_pkg->pkgpart; -} else { - unless ( $part_pkg ) { - $part_pkg = new FS::part_pkg {}; - $part_pkg->plan('flat'); - } -} -unless ( $part_pkg->plan ) { #backwards-compat - $part_pkg->plan('flat'); - $part_pkg->plandata("setup_fee=". $part_pkg->setup. "\n". - "recur_fee=". $part_pkg->recur. "\n"); -} -$action ||= $part_pkg->pkgpart ? 'Edit' : 'Add'; -my $hashref = $part_pkg->hashref; + 'labels' => { + 'pkgpart' => 'Package Definition', + 'pkg' => 'Package', + %locale_field_labels, + 'comment' => 'Comment (customer-hidden)', + 'classnum' => 'Package class', + 'addon_classnum' => 'Restrict additional orders to package class', + 'promo_code' => 'Promotional code', + 'freq' => 'Recurring fee frequency', + 'setuptax' => 'Setup fee tax exempt', + 'recurtax' => 'Recurring fee tax exempt', + 'taxclass' => 'Tax class', + 'plan' => 'Price plan', + 'disabled' => 'Disable new orders', + 'disable_line_item_date_ranges' => 'Disable line item date ranges', + 'start_on_hold' => 'Start on hold', + 'setup_cost' => 'Setup cost', + 'recur_cost' => 'Recur cost', + 'pay_weight' => 'Payment weight', + 'credit_weight' => 'Credit weight', + 'agent_pkgpartid' => 'External ID', + 'agentnum' => 'Agent', + 'agent_type' => ' ', #just its title headingn is fine + 'setup_fee' => 'Setup fee', + 'setup_show_zero' => 'Show zero setup', + 'recur_fee' => 'Recurring fee', + 'recur_show_zero' => 'Show zero recurring', + ( map { ( "setup_fee_$_" => "Setup fee $_", + "recur_fee_$_" => "Recurring fee $_", + ); + } + $conf->config('currencies') + ), + 'usagepricepart' => ' ', + 'discountnum' => 'Offer discounts for longer terms', + 'bill_dst_pkgpart' => 'Include line item(s) from package', + 'svc_dst_pkgpart' => 'Include services of package', + 'supp_dst_pkgpart' => 'When ordering package, also order', + 'report_option' => 'Report classes', + 'delay_start' => 'Default delay (days)', + 'adjourn_months' => 'Suspend the package after ', + 'contract_end_months' => 'Contract ends after ', + 'expire_months' => 'Cancel the package after ', + 'change_to_pkgpart'=> 'and replace it with ', + 'units_taxproductnum' => 'Per-line tax product', + }, + + 'fields' => [ + { field=>'clone', type=>'hidden', + curr_value_callback => + sub { shift->param('clone') }, + }, + { field=>'pkgnum', type=>'hidden', + curr_value_callback => + sub { shift->param('pkgnum') }, + }, + + { field=>'custom', type=>'hidden' }, + { field=>'family_pkgpart', type=>'hidden' }, + { field=>'successor', type=>'hidden' }, + + { type => 'columnstart' }, + + { field => 'pkg', + type => 'input-locale-text', + size => 40, #32 + maxlength => 50, + }, + #@locale_fields, + {field=>'comment', type=>'text', size=>40 }, #32 + { field => 'agentnum', + type => 'select-agent', + disable_empty => ! $acl_edit_global, + empty_label => '(global)', + onchange => 'agent_changed', + }, + {field=>'classnum', type=>'select-pkg_class' }, + ( $conf->exists('pkg-addon_classnum') + ? ( { field=>'addon_classnum', + type =>'select-pkg_class', + } + ) + : () + ), + {field=>'disabled', type=>$disabled_type, value=>'Y'}, + {field=>'disable_line_item_date_ranges', type=>$disabled_type, value=>'Y'}, + { field => 'start_on_hold', + type => 'checkbox', + value => 'Y' + }, + + { type => 'tablebreak-tr-title', + value => 'Pricing', #better name? + }, + { field => 'plan', + type => 'selectlayers-select', + options => [ keys %plan_labels ], + labels => \%plan_labels, + onchange => 'aux_planchanged(what);', + }, + { field => 'setup_fee', + type => 'money', + onchange => 'setup_changed', + }, + { field => 'setup_show_zero', + type => 'checkbox', + value => 'Y', + disabled => sub { $setup_show_zero_disabled }, + }, + ( map { +{ field => "setup_fee_$_", + type => 'text', + prefix=> currency_symbol($_, SYM_HTML), + size => 8, + } + } + sort $conf->config('currencies') + ), + { field => 'freq', + type => 'part_pkg_freq', + onchange => 'freq_changed', + }, + { field => 'recur_fee', + type => 'money', + disabled => sub { $recur_disabled }, + onchange => 'recur_changed', + }, + { field => 'recur_show_zero', + type => 'checkbox', + value => 'Y', + disabled => sub { $recur_show_zero_disabled }, + }, + ( map { +{ field => "recur_fee_$_", + type => 'text', + prefix=> currency_symbol($_, SYM_HTML), + size => 8, + } + } + sort $conf->config('currencies') + ), + + ( $conf->exists('part_pkg-delay_start') + ? ( { type => 'tablebreak-tr-title', + value => 'Delayed start', + }, + { field => 'delay_start', + type => 'text', size => 6 }, + ) + : () + ), + + { type => 'tablebreak-tr-title', + value => 'Limited duration', + }, + { field => 'adjourn_months', + type => 'select-months', + }, + { field => 'contract_end_months', + type => 'select-months', + }, + { field => 'expire_months', + type => 'select-expire_months', + }, + { field => 'change_to_pkgpart', + type => 'select-part_pkg', + extra_sql => sub { $pkgpart + ? "AND part_pkg.pkgpart != $pkgpart" + : '' + }, + empty_label => 'no package', + }, + + #price plan + #setup fee + #recurring frequency + #recurring fee (auto-disable) + + { type => 'columnnext' }, + + {type=>'justtitle', value=>'Taxation' }, + {field=>'setuptax', type=>'checkbox', value=>'Y'}, + {field=>'recurtax', type=>'checkbox', value=>'Y'}, + {field=>'taxclass', type=>'select-taxclass' }, + { field => 'taxproductnums', + type => 'hidden', + value => join(',', @taxproductnums), + }, + { field => 'taxproductnum', + type => 'part_pkg-taxproducts', + include_opt_callback => + sub { pkgpart => $_[0]->pkgpart }, + }, + { field => 'units_taxproductnum', + type => ($tax_data_vendor ? + 'select-taxproduct' : 'hidden'), + }, + { type => 'tablebreak-tr-title', + value => 'Promotions', #better name? + }, + { field=>'promo_code', type=>'text', size=>15 }, + + { type => 'tablebreak-tr-title', + value => 'Cost tracking', #better name? + }, + + ( $curuser->access_right('Edit package definition costs') + ? ( { field=>'setup_cost', type=>'money', }, + { field=>'recur_cost', type=>'money', }, + ) + : ( { field=>'setup_cost', type=>'fixed', }, + { field=>'recur_cost', type=>'fixed', }, + ) + ), + + { type => 'columnnext' }, + + {type=>'justtitle', value=>'Agent (reseller) types' }, + + { field => 'agent_type', + type => 'select-agent_type', + disabled => ! $acl_edit_global, + element_etc => 'size="10"', + multiple => '1', #cause edit.html is dum + curr_value_callback => sub { + my($cgi, $object, $field) = @_; + #in the other callbacks..? hmm. + \@agent_type; + }, + }, + + ($fcc_opts ? ( + { type => 'tablebreak-tr-title', + value => 'FCC Form 477 information', + }, + { field => 'fcc_options_string', + type => 'input-fcc_options', + curr_value_callback => sub { + my ($cgi, $part_pkg, $fref) = @_; + if ( $cgi->param('fcc_options_string') ) { + # error redirect + return $cgi->param('fcc_options_string'); + } + my %hash; + %hash = $part_pkg->fcc_options + if ($part_pkg->pkgpart); + return encode_json(\%hash); + }, + }, + ) : () + ), + + { type => 'tablebreak-tr-title', + value => 'External Links', #better name? + }, + { field=>'agent_pkgpartid', type=>'text', size=>21 }, + + { type => 'tablebreak-tr-title', + value => 'Line-item revenue recognition', #better name? + }, + { field=>'pay_weight', type=>'text', size=>6 }, + { field=>'credit_weight', type=>'text', size=>6 }, + + { type => 'columnend' }, + + { type => 'tablebreak-tr-title', + value => 'Usage pricing add-ons', #better name? just 'Usage pricing' ? there's also CDR usage pricing, RADIUS usage pricing, etc :/ + }, + { 'field' => 'usagepricepart', + 'type' => 'part_pkg_usageprice', + 'o2m_table' => 'part_pkg_usageprice', + 'm2_label' => ' ', + 'm2_error_callback' => $usageprice_error_callback, + }, -%> + { 'type' => $report_option ? 'tablebreak-tr-title' + : 'hidden', + 'value' => 'Optional report classes', + 'field' => 'census_title', + }, + { 'field' => 'report_option', + 'type' => $report_option ? 'select-table' + : 'hidden', + 'table' => 'part_pkg_report_option', + 'name_col' => 'name', + 'hashref' => { 'disabled' => '' }, + 'multiple' => 1, + 'curr_value_callback' => $report_option_value_callback, + }, -<%= header("$action Package Definition", menubar( - 'Main Menu' => popurl(2), - 'View all packages' => popurl(2). 'browse/part_pkg.cgi', -)) %> + { 'type' => 'tablebreak-tr-title', + 'value' => 'Term discounts', + }, + { 'field' => 'discountnum', + 'type' => 'select-table', + 'table' => 'discount', + 'name_col' => 'name', + 'hashref' => { %$discountnum_hashref }, + #'extra_sql' => 'AND (months IS NOT NULL OR months != 0)', + 'empty_label'=> 'Select discount', + 'm2_label' => 'Offer discounts for longer terms', + 'm2m_method' => 'part_pkg_discount', + 'm2m_dstcol' => 'discountnum', + 'm2_error_callback' => $discount_error_callback, + }, -<% #), ' onLoad="visualize()"'); %> + { 'type' => 'tablebreak-tr-title', + 'value' => 'Pricing add-ons', + 'colspan' => 4, + }, + { 'field' => 'bill_dst_pkgpart', + 'type' => 'select-part_pkg', + 'extra_sql' => sub { $pkgpart + ? "AND part_pkg.pkgpart != $pkgpart" + : '' + }, + 'label_callback' => sub { shift->pkg_comment_only }, + 'm2_label' => 'Include line item(s) from package', + 'm2m_method' => 'bill_part_pkg_link', + 'm2m_dstcol' => 'dst_pkgpart', + 'm2_error_callback' => + &{$m2_error_callback_maker}('bill'), + 'm2_fields' => [ { 'field' => 'hidden', + 'type' => 'checkbox', + 'value' => 'Y', + 'curr_value' => '', + 'label' => 'Bundle', + }, + ], + }, -<% if ( $cgi->param('error') ) { %> - Error: <%= $cgi->param('error') %> -<% } %> + { type => 'tablebreak-tr-title', + value => 'Services', + }, + { type => 'pkg_svc', }, -<% #print '