#parent doesn't need to hold a DB connection open
dbh->disconnect;
undef $FS::UID::dbh;
++ undef $RT::Handle;
server_spawn(MAX_PROCESSES);
POE::Kernel->run();
my $table = $_[0];
my(@result) = qsearch(@_);
cluck "warning: Multiple records in scalar search ($table)"
++ #.join(' / ', map "$_=>".$_[1]->{$_}, keys %{ $_[1] } )
if scalar(@result) > 1;
#should warn more vehemently if the search was on a primary key?
scalar(@result) ? ($result[0]) : ();
my $servicenums =
$class->condition_sql_option_option_integer('has_service');
-- my $sql = qq| 0 < ( SELECT COUNT(cs.svcpart)
++ my $sql = " 0 < ( SELECT COUNT(cs.svcpart)
FROM cust_bill_pkg cbp, cust_svc cs
WHERE cbp.invnum = cust_bill.invnum
AND cs.pkgnum = cbp.pkgnum
AND cs.svcpart IN $servicenums
)
-- |;
++ ";
return $sql;
}
};
}
--#something like this
sub option_fields {
(
'tagnum' => { 'label' => 'Customer tag',
use FS::svc_external;
tie my %options, 'Tie::IxHash',
-- 'access_key' => { label => 'AWS access key', },
-- 'secret_key' => { label => 'AWS secret key', },
-- 'ami' => { label => 'AMI', 'default' => 'ami-ff46a796', },
-- 'keyname' => { label => 'Keypair name', },
++ 'access_key' => { label => 'AWS access key', },
++ 'secret_key' => { label => 'AWS secret key', },
++ 'ami' => { label => 'AMI', 'default' => 'ami-ff46a796', },
++ 'keyname' => { label => 'Keypair name', },
++ 'region' => { label => 'Region', },
++ 'InstanceType' => { label => 'Instance Type', },
#option to turn off (or on) ip address allocation
;
$svc_external->svcnum,
$self->option('ami'),
$self->option('keyname'),
++ $self->option('InstanceType'),
);
ref($err_or_queue) ? '' : $err_or_queue;
}
};
$queue->insert( $self->option('access_key'),
$self->option('secret_key'),
++ $self->option('region'),
@_
)
or $queue;
}
sub amazon_ec2_new {
-- my( $access_key, $secret_key, @rest ) = @_;
++ my( $access_key, $secret_key, $region, @rest ) = @_;
eval 'use Net::Amazon::EC2;';
die $@ if $@;
my $ec2 = new Net::Amazon::EC2 'AWSAccessKeyId' => $access_key,
-- 'SecretAccessKey' => $secret_key;
--
++ 'SecretAccessKey' => $secret_key,
++ 'region' => $region || 'us-east-1',
++ ;
( $ec2, @rest );
}
sub amazon_ec2_insert { #subroutine, not method
-- my( $ec2, $svcnum, $ami, $keyname ) = amazon_ec2_new(@_);
--
-- my $reservation_info = $ec2->run_instances( 'ImageId' => $ami,
-- 'KeyName' => $keyname,
-- 'MinCount' => 1,
-- 'MaxCount' => 1,
-- );
++ my( $ec2, $svcnum, $ami, $keyname, $InstanceType ) = amazon_ec2_new(@_);
++
++ my $reservation_info = $ec2->run_instances(
++ 'ImageId' => $ami,
++ 'KeyName' => $keyname,
++ 'InstanceType' => $InstanceType || 'm1.small',
++ 'MinCount' => 1,
++ 'MaxCount' => 1,
++ );
my $instance_id = $reservation_info->instances_set->[0]->instance_id;
my $ssh = Net::OpenSSH->new( $self->machine,
default_stdin_fh => $def_in );
++ #capture2 and return STDERR, its probably useful if there's a problem
my $private_key = $ssh->capture(
{ 'stdin_data' => $svc_acct->_password. "\n" },
'/usr/local/bin/merchant_create', map $svc_acct->$_, qw( username finger )
my $ssh = Net::OpenSSH->new( $self->machine,
default_stdin_fh => $def_in );
++ #capture2 and return STDERR, its probably useful if there's a problem
my $unused_output = $ssh->capture(
'/usr/local/bin/merchant_disable', map $svc_acct->$_, qw( username )
);
my $sth = dbh->prepare(
'UPDATE phone_avail SET svcnum = NULL
WHERE svcnum IS NOT NULL
-- AND 0 = ( SELECT COUNT(*) FROM svc_phone
-- WHERE phone_avail.svcnum = svc_phone.svcnum )'
++ AND NOT EXISTS ( SELECT 1 FROM svc_phone
++ WHERE phone_avail.svcnum = svc_phone.svcnum )'
) or die dbh->errstr;
$sth->execute or die $sth->errstr;
sub _shouldrun {
my $extra_sql =
-- ' AND 0 < ( SELECT COUNT(*) FROM cust_pkg
-- WHERE cust_pkg.pkgpart = part_pkg.pkgpart
-- AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
-- )
++ ' AND EXISTS ( SELECT 1 FROM cust_pkg
++ WHERE cust_pkg.pkgpart = part_pkg.pkgpart
++ AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
++ )
';
my @part_pkg =
my $cur_cr = 0;
$cur_cr += $_->amount foreach $cust_bill->cust_credited;
$cur_cr = '' if $cur_cr == 0;
++
++ next if $cur_cr > 0 && $opt_k;
++
if ( $opt_p ) {
#print $cust_bill->invnum. ','. $cust_bill->custnum. ",$tax,$credit,$cr_percent%\n";
++# print $cust_bill->invnum. ','. $cust_bill->custnum. ',"'.
++# $cust_bill->cust_main->name. '",'. "$tax,$credit,$cur_cr\n";
print $cust_bill->invnum. ','. $cust_bill->custnum. ',"'.
-- $cust_bill->cust_main->name. '",'. "$tax,$credit,$cur_cr\n";
++ $cust_bill->cust_main->name. '",'. "$tax,$credit\n";
}
-- next if $cur_cr > 0 && $opt_k;
--
--#COMMENTING OUT ALL DANGEROUS STUFF
--#
# if ( $opt_m && ! $opt_r ) {
#
# my $msg_template = qsearchs('msg_template', { 'msgnum' => $opt_m } )
# " custnum ". $cust_bill->custnum. ": $error\n";
# }
# }
--#
--# if ( $opt_c ) {
--# my $cust_credit = new FS::cust_credit {
--# 'custnum' => $cust_main->custnum,
--# 'amount' => $credit,
--# 'reasonnum' => $opt_c,
--# };
--# my $error = $cust_credit->insert;
--# if ( $error ) {
--# warn "error inserting credit: $error\n";
--# }
--# my $cust_credit_bill = new FS::cust_credit_bill {
--# 'crednum' => $cust_credit->crednum,
--# 'invnum' => $cust_bill->invnum,
--# 'amount' => $credit,
--# };
--# my $aerror = $cust_credit_bill->insert;
--# if ( $aerror ) {
--# warn "error applying credit to invnum ". $cust_bill->invnum. ": $aerror\n";
--# }
--# }
--#
++
++ if ( $opt_c ) {
++ my $cust_credit = new FS::cust_credit {
++ 'custnum' => $cust_main->custnum,
++ 'amount' => $credit,
++ 'reasonnum' => $opt_c,
++ };
++ my $error = $cust_credit->insert;
++ if ( $error ) {
++ warn "error inserting credit: $error\n";
++ }
++ my $cust_credit_bill = new FS::cust_credit_bill {
++ 'crednum' => $cust_credit->crednum,
++ 'invnum' => $cust_bill->invnum,
++ 'amount' => $credit,
++ };
++ my $aerror = $cust_credit_bill->insert;
++ if ( $aerror ) {
++ warn "error applying credit to invnum ". $cust_bill->invnum. ": $aerror\n";
++ }
++ }
++
# if ( $opt_e && ! $opt_r ) {
# eval { $cust_bill->email };
# if ( $@ ) {
package FS::table_name;
++use base qw( FS::Record );
use strict;
--use base qw( FS::Record );
use FS::Record qw( qsearch qsearchs );
=head1 NAME
cd ..
#( cd ..; make deploy; cd fs_selfservice )
--( cd ..; make clean; make configure-rt; make install-perl-modules; /etc/init.d/freeside restart; cd fs_selfservice )
++#( cd ..; make clean; make configure-rt; make install-perl-modules; /etc/init.d/freeside restart; cd fs_selfservice )
++( cd ..; make clean; make configure-rt; make install-perl-modules; make deploy; cd fs_selfservice )
#cp /home/ivan/freeside/fs_selfservice/FS-SelfService/cgi/* /var/www/MyAccount
#chown freeside /var/www/MyAccount/*.cgi
'count_query' => 'SELECT COUNT(*) FROM discount',
'disableable' => 1,
'disabled_statuspos' => 1,
-- 'header' => [ 'Name', 'Class', 'Discount', ],
++ 'header' => [ 'Name', 'Comment', 'Class', 'Discount', ],
'fields' => [ 'name',
++ 'comment',
'classname',
'description',
],
% unless ( $agentnum ) {
<CENTER>
-- <FONT SIZE="-3">"" - R. Hunter</FONT>
++ <FONT SIZE="-3">"Half the world's a desert / Cannibals eat human brains for dessert" - D. Zero</FONT>
</CENTER>
% }
{ 'field' => 'contactnum',
'type' => 'contact',
'colspan' => 6,
++ 'custnum' => $custnum,
'm2m_method' => 'cust_contact',
'm2m_dstcol' => 'contactnum',
'm2_label' => ' ', #'Contact',
Example:
-- include('/elements/init_overlib.html')
++ <& /elements/init_overlib.html &>
-- include( '/elements/popup_link.html', { #hashref or a list, either way is fine
++ <& /elements/popup_link.html', { #hashref or a list, either way is fine
#required
'action' => 'content.html', # uri for content of popup
'aname' => "target", # link NAME= value, useful for #targets
'target' => '_parent',
'style' => 'css-attribute:value',
-- } )
++ }
++ &>
</%doc>
% if ($params->{'action'} && $label) {
<% include('tr-td-label.html', @_ ) %>
-- <TD BGCOLOR="#dddddd" <% $style %>><% $value %></TD>
++ <TD BGCOLOR="#dddddd" <% $style %> <% $colspan %>><% $value %></TD>
</TR>
my %opt = @_;
--my $style = $opt{'cell_style'} ? 'STYLE="'. $opt{'cell_style'}. '"' : '';
++my $style = $opt{'cell_style'} ? ' STYLE="'. $opt{'cell_style'}. '" ' : '';
++
++my $colspan = $opt{'colspan'} ? ' COLSPAN="'. $opt{'colspan'}. '" ' : '';
my $value = $opt{'formatted_value'} || $opt{'curr_value'} || $opt{'value'};
$value = $opt{'prefix'} . $value if defined($opt{'prefix'});
$cust_location->coord_auto('Y');
my $location_sort = sub {
++ #enabled w/label_prefix _location # $a->locationname cmp $b->locationname
++ # or
$a->country cmp $b->country
or lc($a->city) cmp lc($b->city)
or lc($a->address1) cmp lc($b->address1)
],
'html_init' => $html_init,
'really_disable_download' => 1,
-- @_
++ @_ #why?
&>
<%init>
#hmm...
push @where, "msgtype = '$1'";
}
if ( $cgi->param('custnum') =~ /^(\d+)$/ ) {
-- push @where, "custnum = $1";
++ push @where, "cust_msg.custnum = $1";
}
my ($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, '');
push @where, "(_date >= $beginning AND _date <= $ending)";