<% # use strict; use vars qw ( $cgi $query $custnum $cust_main $hashref $agent $referral @packages $package @history @bills $bill @credits $credit $balance $item @agents @referrals @invoicing_list $n1 $conf ); use CGI; use CGI::Carp qw(fatalsToBrowser); use Date::Format; use FS::UID qw(cgisuidsetup); use FS::Record qw(qsearchs qsearch); use FS::CGI qw(header menubar popurl table itable ntable); use FS::cust_credit; use FS::cust_pay; use FS::cust_bill; use FS::part_pkg; use FS::cust_pkg; use FS::part_referral; use FS::agent; use FS::cust_main; use FS::cust_refund; $cgi = new CGI; &cgisuidsetup($cgi); $conf = new FS::Conf; print $cgi->header( '-expires' => 'now' ), header("Customer View", menubar( 'Main Menu' => popurl(2) )); die "No customer specified (bad URL)!" unless $cgi->keywords; ($query) = $cgi->keywords; # needs parens with my, ->keywords returns array $query =~ /^(\d+)$/; $custnum = $1; $cust_main = qsearchs('cust_main',{'custnum'=>$custnum}); die "Customer not found!" unless $cust_main; $hashref = $cust_main->hashref; print qq!Edit this customer!; print qq! | Delete this customer! if $conf->exists('deletecustomers'); print '

'; print ''; print &itable(), ''; print ''; print "Billing address", &ntable("#cccccc"), "", &ntable("#cccccc",2), 'Contact name', '', $cust_main->last, ', ', $cust_main->first, 'SS#', $cust_main->ss || ' ', '', 'Company', $cust_main->company, '', 'Address', $cust_main->address1, '', ; print ' ', $cust_main->address2, '' if $cust_main->address2; print 'City', $cust_main->city, 'State', $cust_main->state, 'Zip', $cust_main->zip, '', 'Country', $cust_main->country, '', ; print 'Day Phone', $cust_main->daytime || ' ', '', 'Night Phone', $cust_main->night || ' ', '', 'Fax', $cust_main->fax || ' ', '', '', "" ; if ( defined $cust_main->dbdef_table->column('ship_last') ) { my $pre = $cust_main->ship_last ? 'ship_' : ''; print "
Service address", &ntable("#cccccc"), "", &ntable("#cccccc",2), 'Contact name', '', $cust_main->get("${pre}last"), ', ', $cust_main->get("${pre}first"), '', 'Company', $cust_main->get("${pre}company"), '', 'Address', $cust_main->get("${pre}address1"), '', ; print ' ', $cust_main->get("${pre}address2"), '' if $cust_main->get("${pre}address2"); print 'City', $cust_main->get("${pre}city"), 'State', $cust_main->get("${pre}state"), 'Zip', $cust_main->get("${pre}zip"), '', 'Country', $cust_main->get("${pre}country"), '', ; print 'Day Phone', '', $cust_main->get("${pre}daytime") || ' ', '', 'Night Phone'. '', $cust_main->get("${pre}night") || ' ', '', 'Fax', $cust_main->get("${pre}fax") || ' ', '', '', "" ; } print ''; print ''; print &ntable("#cccccc"), "", &ntable("#cccccc",2), 'Customer number', $custnum, '', ; @agents = qsearch( 'agent', {} ); unless ( scalar(@agents) == 1 ) { $agent = qsearchs('agent',{ 'agentnum' => $cust_main->agentnum } ); print 'Agent', $agent->agentnum, ": ", $agent->agent, ''; } @referrals = qsearch( 'part_referral', {} ); unless ( scalar(@referrals) == 1 ) { my $referral = qsearchs('part_referral', { 'refnum' => $cust_main->refnum } ); print 'Referral', $referral->refnum, ": ", $referral->referral, ''; } print 'Order taker', $cust_main->otaker, ''; print ''; print '
'; @invoicing_list = $cust_main->invoicing_list; print "Billing information (", qq!!, "Bill now)", &ntable("#cccccc"), "", &ntable("#cccccc",2), 'Tax exempt', $cust_main->tax ? 'yes' : 'no', '', 'Postal invoices', ( grep { $_ eq 'POST' } @invoicing_list ) ? 'yes' : 'no', '', 'Email invoices', join(', ', grep { $_ ne 'POST' } @invoicing_list ) || 'no', '', 'Billing type', ; if ( $cust_main->payby eq 'CARD' ) { print 'Credit card', 'Card number', $cust_main->payinfo, '', 'Expiration', $cust_main->paydate, '', 'Name on card', $cust_main->payname, '' ; } elsif ( $cust_main->payby eq 'BILL' ) { print 'Billing'; print 'P.O. ', $cust_main->payinfo, '', if $cust_main->payinfo; print 'Expiration', $cust_main->paydate, '', 'Attention', $cust_main->payname, '', ; } elsif ( $cust_main->payby eq 'COMP' ) { print 'Complimentary', 'Authorized by', $cust_main->payinfo, '', 'Expiration', $cust_main->paydate, '', ; } print ""; print ''; if ( defined $cust_main->dbdef_table->column('comments') ) { print "
Comments", &ntable("#cccccc"), "", &ntable("#cccccc",2), '
', $cust_main->comments,
        '
'; } print ''; print qq!
Packages !, # qq!
Click on package number to view/edit package.!, qq!( Order and cancel packages (preserves services) )!, ; #display packages #formatting print qq!!, &table(), "\n", qq!Package!, qq!DatesServices\n!, qq!Setup!, qq!Next bill!, qq!Susp.Expire!, qq!!, qq!Cancel!, qq!\n!; #get package info if ( $conf->exists('hidecancelledpackages') ) { @packages = $cust_main->ncancelled_pkgs; } else { @packages = $cust_main->all_pkgs; } $n1 = ''; foreach $package (@packages) { my $pkgnum = $package->pkgnum; my $pkg = $package->part_pkg->pkg; my $comment = $package->part_pkg->comment; my $pkgview = popurl(2). "view/cust_pkg.cgi?$pkgnum"; my @cust_svc = qsearch( 'cust_svc', { 'pkgnum' => $pkgnum } ); my $rowspan = scalar(@cust_svc) || 1; my $button_cgi = new CGI; $button_cgi->param('clone', $package->part_pkg->pkgpart); $button_cgi->param('pkgnum', $package->pkgnum); my $button_url = popurl(2). "edit/part_pkg.cgi?". $button_cgi->query_string; #print $n1, qq!$pkgnum!, print $n1, qq!$pkgnum!, qq!!, #qq!$pkg - $comment!, qq!$pkg - $comment!, qq! ( Edit | Customize pricing )!, ; for ( qw( setup bill susp expire cancel ) ) { print "", ( $package->getfield($_) ? time2str("%D", $package->getfield($_) ) : ' ' ), '', ; } my $n2 = ''; foreach my $cust_svc ( @cust_svc ) { my($label, $value, $svcdb) = $cust_svc->label; my($svcnum) = $cust_svc->svcnum; my($sview) = popurl(2). "view"; print $n2,qq!$label!, qq!$value!; $n2=""; } $n1=""; } print ""; #formatting print ""; #formatting print qq!

Payment History!, qq!!, qq! ( Click on invoice to view invoice/enter payment. | !, qq!!, qq!Post credit / refund )!; #get payment history # # major problem: this whole thing is way too sloppy. # minor problem: the description lines need better formatting. @history = (); #needed for mod_perl :) @bills = qsearch('cust_bill',{'custnum'=>$custnum}); foreach $bill (@bills) { my($bref)=$bill->hashref; push @history, $bref->{_date} . qq!\tInvoice #! . $bref->{invnum} . qq! (Balance \$! . $bill->owed . qq!)\t! . $bref->{charged} . qq!\t\t\t!; my(@payments)=qsearch('cust_pay',{'invnum'=> $bref->{invnum} } ); my($payment); foreach $payment (@payments) { my($date,$invnum,$payby,$payinfo,$paid)=($payment->getfield('_date'), $payment->getfield('invnum'), $payment->getfield('payby'), $payment->getfield('payinfo'), $payment->getfield('paid'), ); push @history, "$date\tPayment, Invoice #$invnum ($payby $payinfo)\t\t$paid\t\t"; } } @credits = qsearch('cust_credit',{'custnum'=>$custnum}); foreach $credit (@credits) { my($cref)=$credit->hashref; push @history, $cref->{_date} . "\tCredit #" . $cref->{crednum} . ", (Balance \$" . $cref->{credited} . ") by " . $cref->{otaker} . " - " . $cref->{reason} . "\t\t\t" . $cref->{amount} . "\t"; my(@refunds)=qsearch('cust_refund',{'crednum'=> $cref->{crednum} } ); my($refund); foreach $refund (@refunds) { my($rref)=$refund->hashref; push @history, $rref->{_date} . "\tRefund, Credit #" . $rref->{crednum} . " (" . $rref->{payby} . " " . $rref->{payinfo} . ") by " . $rref->{otaker} . " - ". $rref->{reason} . "\t\t\t\t" . $rref->{refund}; } } #formatting print &table(), < Date Description Charge Payment In-house
Credit
Refund Balance END #display payment history $balance = 0; foreach $item (sort keyfield_numerically @history) { my($date,$desc,$charge,$payment,$credit,$refund)=split(/\t/,$item); $charge ||= 0; $payment ||= 0; $credit ||= 0; $refund ||= 0; $balance += $charge - $payment; $balance -= $credit - $refund; print "",time2str("%D",$date),"", "$desc", "", ( $charge ? "\$".sprintf("%.2f",$charge) : '' ), "", "", ( $payment ? "- \$".sprintf("%.2f",$payment) : '' ), "", "", ( $credit ? "- \$".sprintf("%.2f",$credit) : '' ), "", "", ( $refund ? "\$".sprintf("%.2f",$refund) : '' ), "", "\$" . sprintf("%.2f",$balance), "", "\n"; } #formatting print ""; #end #formatting print < END #subroutiens sub keyfield_numerically { (split(/\t/,$a))[0] <=> (split(/\t/,$b))[0] ; } %>