[dw-free] Payment system admin pages
[commit: http://hg.dwscoalition.org/dw-free/rev/ecaed4a16f04]
http://bugs.dwscoalition.org/show_bug.cgi?id=1063
Mostly from
sophie, bare framework for viewing orders/carts,
we will be expanding this a lot.
Patch by
mark.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=1063
Mostly from
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
we will be expanding this a lot.
Patch by
![[staff profile]](https://www.dreamwidth.org/img/silk/identity/user_staff.png)
Files modified:
- htdocs/admin/pay/index.bml
- htdocs/admin/pay/view.bml
-------------------------------------------------------------------------------- diff -r c3af97541795 -r ecaed4a16f04 htdocs/admin/pay/index.bml --- a/htdocs/admin/pay/index.bml Fri May 01 05:02:44 2009 +0000 +++ b/htdocs/admin/pay/index.bml Fri May 01 05:41:45 2009 +0000 @@ -25,7 +25,6 @@ return "User does not exist.\n" unless $u; - my @actions = (); my $ps = DW::Pay::get_paid_status( $u ); if ( $ps ) { $body .= '<h2>Paid Status</h2>'; @@ -33,7 +32,6 @@ if ( $ps->{permanent} ) { $body .= '; <strong>Permanent Status</strong> will never expire.'; - push @actions, '', 'Use the override section to change account type'; } else { if ( $ps->{expiresin} > 0 ) { @@ -42,175 +40,68 @@ $exp =~ s/ ago//; $body .= "; expires $expt (<strong>$exp</strong>)."; - if ( $ps->{typeid} == 1 ) { - push @actions, 'set-premium', 'Change type to Premium Paid Account'; - } else { - push @actions, 'set-basic', 'Change type to Basic Paid Account'; - } - - push @actions, 'extend-6', 'Extend existing type by 6 months', - 'extend-12', 'Extend existing type by 12 months'; - } else { $body .= '; <strong>expired</strong>.'; - push @actions, '', 'Use the override section to give user a different account type'; } } } else { $body .= '<p>User has never had a paid account of any kind.</p>'; - push @actions, '', 'Use the override section to give user a paid account'; } $body .= qq|<p><a href="/admin/statushistory.bml?user=$u->{user}">View statushistory for user.</a></p>|; - $body .= "<h2>Edit Status</h2>"; + $body .= "<h2>View Carts</h2>"; - $body .= "<ul>"; - while (my ($type, $name) = (shift @actions, shift @actions)) { - last unless $name; + my @carts = DW::Shop::Cart->get_all( $u ); - if ( $type ne '' ) { - $body .= qq|<li><a href="/admin/pay/index.bml?edit=$u->{user}&act=$type">$name</a></li>|; - } else { - $body .= "<li>$name</li>"; + if ( @carts ) { + $body .= "<table border='1'>"; + $body .= "<tr><th>Cart Number</th><th>Date</th><th>Total</th>"; + $body .= "<th>Payment Method</th><th>Status</th><th>Details</th>"; + foreach my $cart ( @carts ) { + my $state = $cart->state; + my $paymentmethod = $cart->paymentmethod; + my $paystr = ( $paymentmethod ? + $ML{"/shop/receipt.bml.cart.paymentmethod.$paymentmethod"} : + "(not yet selected)" ); + my $date = DateTime->from_epoch( epoch => $cart->starttime ); + + my $detailstext = "Details"; + $detailstext .= " / Mark as Payment Received" if $state == $DW::Shop::STATE_PEND_PAID; + + $body .= "<tr>"; + $body .= "<td>" . $cart->id . "</td>"; + $body .= "<td>" . $date->strftime( "%F %r %Z" ) . "</td>"; + $body .= "<td>\$" . $cart->total . " USD</td>"; + $body .= "<td>$paystr</td>"; + $body .= "<td>$ML{\"/shop/receipt.bml.cart.status.$state\"}</td>"; + $body .= "<td><a href='$LJ::SITEROOT/admin/pay/view?cartid=" . $cart->id . "'>$detailstext</a></td>"; + $body .= "</tr>"; } + $body .= "</table>"; } - $body .= "</ul>"; - - $body .= "<h2>Hardcore Override</h2><p>These actions will change the paid status with no regard " . - "for the existing paid status. Their existing status will be thrown away!</p>"; - $body .= "<ul>"; - - @actions = ('override-free', 'Override: reset to free account status', - 'override-basic-6', 'Override: 6 months Basic Paid status', - 'override-basic-12', 'Override: 12 months Basic Paid status', - 'override-basic-99', 'Override: permanent Basic Paid status', - 'override-premium-6', 'Override: 6 months Premium Paid status', - 'override-premium-12', 'Override: 12 months Premium Paid status', - 'override-premium-99', 'Override: permanent Premium Paid status',); - while (my ($type, $name) = (shift @actions, shift @actions)) { - last unless $type; - - $body .= qq|<li><a href="/admin/pay/index.bml?edit=$u->{user}&act=$type">$name</a></li>|; + else { + $body .= "<p>This user has not made any orders.</p>"; } - - $body .= "</ul>"; - - } elsif ($GET{edit}) { - $body .= '<p>[ <a href="/admin/pay/index.bml"><< Back to Index</a> ]</p>'; - - # allow editing a user's paid status - my $u = LJ::load_user( $GET{edit} ); - return "User does not exist.\n" - unless $u; - - my $what = $GET{act}; - return "No action.\n" - unless $what; - - unless ( LJ::did_post() ) { - $body .= "<h2>CONFIRM</h2><p>You must confirm that you wish to take action <b>$what</b> on " . LJ::ljuser( $u ) . ".</p>"; - $body .= "<form method='post' action='/admin/pay/index.bml?edit=$u->{user}&act=$what'>"; - $body .= "<input type='submit' value='Confirmed!'>"; - $body .= "</form>"; - return $body; - } - - my $note = sub { - LJ::statushistory_add( $u, $remote, 'paidstatus', sprintf( shift, @_ ) ); - }; - - my $ps = DW::Pay::get_paid_status( $u ); - - if ( $what eq 'override-free' ) { - DW::Pay::update_paid_status( $u, permanent => 0, expiretime => 0 ); - $note->( "Override: reverted to free." ); - } elsif ( $what eq 'override-basic-6' ) { - DW::Pay::update_paid_status( $u, permanent => 0, typeid => 1, _set_months => 6 ); - $note->( "Override: set to 6 months Basic." ); - } elsif ( $what eq 'override-basic-12' ) { - DW::Pay::update_paid_status( $u, permanent => 0, typeid => 1, _set_months => 12 ); - $note->( "Override: set to 12 months Basic." ); - } elsif ( $what eq 'override-basic-99' ) { - DW::Pay::update_paid_status( $u, permanent => 1, typeid => 1 ); - $note->( "Override: set to permanent Basic." ); - } elsif ( $what eq 'override-premium-6' ) { - DW::Pay::update_paid_status( $u, permanent => 0, typeid => 2, _set_months => 6 ); - $note->( "Override: set to 6 months Premium." ); - } elsif ( $what eq 'override-premium-12' ) { - DW::Pay::update_paid_status( $u, permanent => 0, typeid => 2, _set_months => 12 ); - $note->( "Override: set to 12 months Premium." ); - } elsif ( $what eq 'override-premium-99' ) { - DW::Pay::update_paid_status( $u, permanent => 1, typeid => 2 ); - $note->( "Override: set to permanent Premium." ); - } elsif ( $what eq 'extend-6' ) { - DW::Pay::update_paid_status( $u, _add_months => 6 ); - $note->( "Override: added 6 months to existing type." ); - } elsif ( $what eq 'extend-12' ) { - DW::Pay::update_paid_status( $u, _add_months => 12 ); - $note->( "Override: added 12 months to existing type." ); - } else { - return "Invalid action.\n"; - } - - DW::Pay::sync_caps( $u ); - - BML::redirect( "$LJ::SITEROOT/admin/pay/index.bml?view=$u->{user}" ); - - } elsif ($GET{show} eq 'summary') { - $body .= '<p>[ <a href="/admin/pay/index.bml"><< Back to Index</a> ]</p>'; - - # show summary of payment information, i.e. how many accounts there are, - # of what types, and how many payments have been received broken down on a - # daily basis (last week) and monthly basis (forever) - - my $dbr = DW::Pay::get_db_reader(); - - my $rows = $dbr->selectall_arrayref( q{ - SELECT DATE_FORMAT(FROM_UNIXTIME(paydate), '%m-%d'), typeid, duration, COUNT(*), SUM(amount) - FROM dw_payments - WHERE paydate > UNIX_TIMESTAMP() - 86400*8 - AND status = 'paid-completed' - GROUP BY 1, 2, 3 - ORDER BY 1 DESC, 2, 3 - } ); - - $body .= '<h2>Past 7 Days</h2>'; - $body .= '<table border="1"><tr><td>day</td><td>type</td><td>duration</td><td>sold</td><td>revenue</td></tr>'; - foreach my $row ( @{ $rows || [] } ) { - $body .= "<tr><td>$row->[0]</td><td>" . DW::Pay::type_name( $row->[1] ) . "</td><td>$row->[2]</td>" . - "<td>$row->[3]</td><td>\$$row->[4].00</td></tr>"; - } - $body .= '</table>'; - - my $rows = $dbr->selectall_arrayref( q{ - SELECT DATE_FORMAT(FROM_UNIXTIME(paydate), '%m-%Y'), typeid, duration, COUNT(*), SUM(amount) - FROM dw_payments - WHERE status = 'paid-completed' - GROUP BY 1, 2, 3 - ORDER BY 1 DESC, 2, 3 - } ); - - $body .= '<h2>All Time</h2>'; - $body .= '<table border="1"><tr><td>month</td><td>type</td><td>duration</td><td>sold</td><td>revenue</td></tr>'; - foreach my $row ( @{ $rows || [] } ) { - $body .= "<tr><td>$row->[0]</td><td>" . DW::Pay::type_name( $row->[1] ) . "</td><td>$row->[2]</td>" . - "<td>$row->[3]</td><td>\$$row->[4].00</td></tr>"; - } - $body .= '</table>'; } else { # print the basic form $body .= <<EOF; -<form method="get" action="/admin/pay/index.bml"> - <ul> - <li><a href="/admin/pay/index.bml?show=summary">Complete payment summary</a></li> - <li>Edit user: <input type="text" name="view" /> <input type="submit" value="Go" /></li> + <li>Edit user: + <form method="get" action="/admin/pay/index"> + <input type="text" name="view" /> <input type="submit" value="Go" /> + </form> + </li> + <li>View cart/order ID: + <form method="get" action="/admin/pay/view"> + <input type="text" name="cartid" /> <input type="submit" value="Go" /> + </form> + </li> </ul> EOF diff -r c3af97541795 -r ecaed4a16f04 htdocs/admin/pay/view.bml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htdocs/admin/pay/view.bml Fri May 01 05:41:45 2009 +0000 @@ -0,0 +1,109 @@ +<html> +<head><title>Payment Management</title></head> +<body> + +<?_code +{ + use strict; + use vars qw(%GET %POST); + + my $remote = LJ::get_remote(); + my @displayprivs = ( "payments" ); + my $numprivs = @displayprivs; + + return "<?needlogin?>" unless $remote; + return BML::ml( "admin.noprivserror", { numprivs => $numprivs, needprivs => "<b>" . join(", ", @displayprivs) . "</b>"} ) + unless LJ::check_priv($remote, 'payments'); + + my $body = '<h1>Payment Manager - View Cart</h1>'; + $body .= '<p>[ <a href="/admin/pay/index.bml"><< Back to Index</a> ]</p>'; + + return "Must provide cartid." + unless $GET{cartid} && $GET{cartid} > 0; + + my $cartid = $GET{cartid} + 0; + my $cart = DW::Shop::Cart->get_from_cartid( $cartid ) + or return "Sorry, invalid cart/cart not found in the database!"; + + $cartid = $cart->id; # get a normalised value back + my $state = $cart->state; + my $u = LJ::load_userid( $cart->userid ); + my $from = ( defined $u ? $u->ljuser_display : "Logged-out user with uniq: " . $cart->uniq ); + + my $paymentmethod = $cart->paymentmethod; + my $paystr = ( $paymentmethod ? + $ML{"/shop/receipt.bml.cart.paymentmethod.$paymentmethod"} : + "(not yet selected)" ); + + $body .= "<h2>Cart #$cartid</h2>"; + $body .= "<table border='1'>"; + $body .= "<tr><th>From:</th><td>$from</td></tr>"; + $body .= "<tr><th>Date:</th><td>" . DateTime->from_epoch( epoch => $cart->starttime )->strftime( "%F %r %Z" ) . "</td></tr>"; + $body .= "<tr><th>Total:</th><td>\$" . $cart->total . " USD</td></tr>"; + $body .= "<tr><th>Payment Method:</th><td>$paystr</td></tr>"; + $body .= "<th>Status:</th><td>$ML{\"/shop/receipt.bml.cart.status.$state\"}</td></tr>"; + $body .= "</table>"; + + $body .= "<h3>Items</h3>"; + if ( $cart->has_items ) { + $body .= LJ::Widget::ShopCart->render( receipt => 1, cart => $cart ); + } + else { + $body .= "<p>This cart has no items in it.</p>"; + } + + # attempt to create an engine so we can get more info + my $classname = $DW::Shop::PAYMENTMETHODS{$paymentmethod}->{class}; + my $engine = eval "DW::Shop::Engine::${classname}->new_from_cart( \$cart )"; + + if ( $classname eq 'PayPal' ) { + # show the payer's details. + $body .= "<h2>Payer Details</h2>"; + $body .= "<table border='1'>"; + $body .= "<tr><th>First Name:</th><td>" . $engine->firstname . "</td></tr>"; + $body .= "<tr><th>Last Name:</th></td>" . $engine->lastname . "</td></tr>"; + $body .= "<tr><th>PayPal Email Address:</th><td>" . $engine->email . "</td></tr>"; + $body .= "<tr><th>User Email Address:</th><td>" . $cart->email . "</td></tr>"; + $body .= "</table>"; + + } elsif ( $classname eq 'CheckMoneyOrder' ) { + # show the payer's details. + $body .= "<h2>Payer Details</h2>"; + $body .= "<table border='1'>"; + $body .= "<tr><th>Email Address:</th><td>" . $cart->email . "</td></tr>"; + $body .= "</table>"; + } + + if ( $state == $DW::Shop::STATE_PEND_PAID ) { + $body .= <<HTML; +<h2>Mark as Payment Received</h2> + +<form method="post" action="/admin/pay/mark-received"> +<p> +<label for="paymentmethod">Payment method:</label> +<select id="paymentmethod" name="paymentmethod"> +<option value="cash">Cash</option> +<option value="check">Check</option> +<option value="moneyorder">Money Order</option> +<option value="other">Other</option> +</select> +</p> + +<p> +<label for="notes">Payment notes (check no, address, etc):</label><br> +<textarea rows="5" cols="40" name="notes" id="notes"></textarea> +</p> + +<p> +<input type="submit" value="Mark as Received"> +</p> +</form> +HTML + } + + return $body; +} +_code?> + +</body> +</html> --------------------------------------------------------------------------------