& elements/edit.html,
'body_etc' => $body_etc,
'name_singular' => 'invoice configuration',
'table' => 'invoice_conf',
'viewall_dir' => 'browse',
'fields' => \@fields,
'labels' => \%labels,
'new_callback' => \&new_callback,
'edit_callback' => \&edit_callback,
'error_callback' => \&error_callback,
'html_init' => \&html_init,
'html_table_bottom' => \&html_table_bottom,
'html_bottom' => '', # close tablebreak-tabs
&>
<%init>
my $curuser = $FS::CurrentUser::CurrentUser;
# ???
die "access denied"
unless $curuser->access_right([ 'Edit templates', 'Edit global templates' ]);
my $body_etc = '';
$body_etc = q!onload="document.getElementById('locale').onchange()"!
if $cgi->param('locale') eq 'new';
my $modenum = $cgi->param('modenum');
my $mode = $modenum ? qsearchs('invoice_mode', { modenum => $modenum }) : '';
my %textarea = (type => 'textarea', rows => 10, cols => 40);
my @fields = (
{ field => 'modenum', type => 'hidden' },
{ field => 'agentnum',
type => 'select-agent',
},
{ field => 'modename', size=>60, },
{ type => 'tablebreak-tabs',
include_opt_callback => \&menubar_opt_callback,
},
{ field => 'locale', type => 'hidden' },
{ field => 'notice_name', size=>60, },
{ field => 'subject', size=>60, },
{ field => 'lpr', size=>60, },
{ type => 'columnstart', aligned => 1 },
{ type => 'title', value => '
' },
map ( { +{ type => 'justtitle', value => $_ } }
'Notes',
'Footer',
'Summary header',
'Return address',
'Small footer',
'Enable coupon',
),
{ type => 'columnnext' },
{ type => 'title', value => 'LaTeX' },
{ field => 'latexnotes', %textarea },
{ field => 'latexfooter', %textarea },
{ field => 'latexsummary', %textarea },
{ field => 'latexreturnaddress', %textarea },
{ field => 'latexsmallfooter', %textarea },
{ field => 'with_latexcoupon', type => 'checkbox', value => 'Y' },
{ type => 'columnnext' },
{ type => 'title', value => 'HTML' },
{ field => 'htmlnotes', %textarea }, #htmlarea?
{ field => 'htmlfooter', %textarea },
{ field => 'htmlsummary', %textarea },
{ field => 'htmlreturnaddress', %textarea },
# logo
{ type => 'columnend' },
);
my %labels = (
'confnum' => 'Configuration',
'locale' => 'Locale',
'agentnum' => 'Agent',
'modename' => 'Mode name',
'notice_name' => 'Notice name',
'subject' => 'Email Subject: header',
'lpr' => 'Alternate lpr command',
map { $_ => '' } (qw(
latexnotes
latexfooter
latexsummary
latexreturnaddress
with_latexcoupon
latexsmallfooter
htmlnotes
htmlfooter
htmlsummary
htmlreturnaddress
) ),
);
sub get_invoice_mode { # because we can't quite use agent_virt here
my $modenum = shift;
qsearchs({
'table' => 'invoice_mode',
'hashref' => { 'modenum' => $modenum },
'extra_sql' => ' AND '.
$FS::CurrentUser::CurrentUser->agentnums_sql(
'null_right' => 'Edit global templates',
'viewall_right' => 'Edit global templates' ),
});
};
sub error_callback {
my ($cgi, $object) = @_;
foreach (qw(modename agentnum)) {
$object->set($_, $cgi->param($_));
}
if ($object->confnum) {
return edit_callback(@_);
} else {
return new_callback(@_);
}
}
sub new_callback {
my ($cgi, $object, $fields_arrayref, $opt_hashref) = @_;
my $modenum;
if ( $cgi->param('locale') =~ /^(\w+)$/ ) {
$object->set('locale' => $1);
}
if ( $cgi->param('modenum') =~ /^(\d+)$/ ) {
$modenum = $1; # we're adding a locale to an existing mode
$object->set('modenum' => $modenum);
my $invoice_mode = get_invoice_mode($modenum)
or die "invoice mode $modenum not found";
$object->set('modename', $invoice_mode->modename);
$object->set('agentnum', $invoice_mode->agentnum);
# also, need to select a locale
# make a list of available locales
my %existing_locales = map { $_->locale }
qsearch('invoice_conf', { modenum => $modenum });
my @locales = grep { !exists($existing_locales{$_}) }
FS::Conf->new->config('available-locales');
my %labels;
foreach (@locales) {
my %info = FS::Locales->locale_info($_);
$labels{$_} = $info{'label'};
}
unshift @locales, 'new';
$labels{'new'} = 'Select language';
# insert a field def
my $i = 0;
$i++ until ( $fields_arrayref->[$i]->{'field'} eq 'locale' );
my $locale_field = $fields_arrayref->[$i];
my $onchange_locale = "document.getElementById('submit').disabled =
(this.options[this.selectedIndex].value == 'new');";
%$locale_field = (
field => 'locale',
type => 'select',
options => \@locales,
labels => \%labels,
curr_value => 'new',
onchange => $onchange_locale,
);
} # otherwise it's a completely new mode, so the locale is default
}
sub edit_callback {
# massive false laziness with msg_template UI
my ($cgi, $object, $fields_arrayref, $opt_hashref) = @_;
# a little different here in that we treat the content object
# as "primary" (this is edit/invoice_conf.html, etc.)
# so all we need from the invoice_mode is its name
# (and agent identity)
my $modenum = $object->modenum;
my $invoice_mode = get_invoice_mode($modenum)
or die "invoice mode $modenum not found";
$object->set('modename', $invoice_mode->modename);
$object->set('agentnum', $invoice_mode->agentnum);
}
sub menubar_opt_callback {
my $object = shift;
my $modenum = $object->modenum or return;
my (@tabs, @options, %labels);
my $display_new = 0;
my $selected = '';
foreach my $l ('', FS::Conf->new->config('available-locales')) {
my $invoice_conf =
qsearchs('invoice_conf', { modenum => $modenum, locale => $l });
if ( $invoice_conf ) {
my %info = FS::Locales->locale_info($l) if $l;
my $label = $info{'label'} || mt('Default');
push @tabs, $label, $invoice_conf->confnum;
$selected = $label if $object->locale eq $l;
}
else {
$display_new = 1; # there is at least one unused locale left
}
}
push @tabs, mt('New'), "modenum=$modenum;locale=new" if $display_new;
$selected = mt('New') if $object->locale eq 'new';
$selected ||= mt('Default');
(
'url_base' => $cgi->url() . '?',
'selected' => $selected,
'tabs' => \@tabs
);
}
sub html_init {
q!
!
}
sub html_table_bottom {
my $object = shift;
my $locale = '';
my $modenum = '';
if ($object->locale =~ /^(\w+)$/) {
$locale = $1;
}
if ($object->modenum =~ /^(\d+)$/) {
$modenum = $1;
}
my $html;
my $show_delete = 1;
# don't allow the default locale to be removed unless it's the last one
# in the mode
$show_delete = 0 if (
$locale eq 'new' or
$modenum eq '' or
($locale eq '' and
FS::invoice_conf->count("modenum = $modenum and locale is not null") > 0
)
);
if ( $show_delete ) {
# set up a delete link
my $confnum = $object->confnum;
my $url = $p."misc/delete-invoice_conf.html?$confnum";
my $link = qq!! .
'Delete this configuration' .
'';
$html = qq!