mourningdove/cgi-bin/LJ/Widget/ShopCart.pm

119 lines
3.6 KiB
Perl
Raw Permalink Normal View History

2026-05-24 01:03:05 +00:00
#!/usr/bin/perl
#
# LJ::Widget::ShopCart
#
# Returns the current shopping cart for the remote user.
#
# Authors:
# Janine Smith <janine@netrophic.com>
#
# Copyright (c) 2009 by Dreamwidth Studios, LLC.
#
# This program is free software; you may redistribute it and/or modify it under
# the same terms as Perl itself. For a copy of the license, please reference
# 'perldoc perlartistic' or 'perldoc perlgpl'.
#
package LJ::Widget::ShopCart;
use strict;
use base qw/ LJ::Widget /;
use Carp qw/ croak /;
use DW::Shop;
sub need_res { qw( stc/shop.css ) }
sub render_body {
my ( $class, %opts ) = @_;
my $cart = $opts{cart} ||= DW::Shop->get->cart
or return $class->ml('widget.shopcart.error.nocart');
return $class->ml('widget.shopcart.error.noitems')
unless $cart->has_items;
my $receipt = $opts{receipt};
# if the cart is not in state OPEN, mark this as a receipt load
# no matter where we are
$receipt = 1
unless $cart->state == $DW::Shop::STATE_OPEN;
$receipt = 1
if $opts{admin};
$receipt = 1
if $opts{confirm};
# if we're not doing a receipt load, then we should balance the points. this
# fixes situations where the user gets gifted points while they're shopping.
unless ($receipt) {
$cart->recalculate_costs;
$cart->save;
}
my $colspan = $opts{receipt} ? 5 : 6;
my $vars = {
receipt => $receipt,
confirm => $opts{confirm},
admin => $opts{admin},
colspan => ( $colspan - 3 ),
cart => $cart
};
$vars->{admin_col} = sub {
my $item = shift;
my $ret;
my $dbh = LJ::get_db_writer();
my $acid =
$dbh->selectrow_array( 'SELECT acid FROM shop_codes WHERE cartid = ? AND itemid = ?',
undef, $cart->id, $item->id );
if ($acid) {
my ( $auth, $rcptid ) =
$dbh->selectrow_array( 'SELECT auth, rcptid FROM acctcode WHERE acid = ?',
undef, $acid );
$ret .= DW::InviteCodes->encode( $acid, $auth );
if ( my $ru = LJ::load_userid($rcptid) ) {
$ret .= ' ('
. $ru->ljuser_display
. ", <a href='$LJ::SITEROOT/admin/pay/index?view="
. $ru->user
. "'>edit</a>)";
}
else {
$ret .=
" (unused, <a href='$LJ::SITEROOT/admin/pay/striptime?from=$acid'>strip</a>)";
}
}
else {
$ret .= 'no code yet or code was stripped';
}
return $ret;
};
$vars->{is_random} = sub { return ref $_[0] =~ /Account/ && $_[0]->random ? 'Y' : 'N'; };
my $checkout_ready =
!$receipt || ( !$opts{confirm} && $cart->state == $DW::Shop::STATE_CHECKOUT );
if ($checkout_ready) {
# check or money order button
my $cmo_threshold =
$LJ::SHOP_CMO_MINIMUM ? $cart->total_cash - $LJ::SHOP_CMO_MINIMUM : undef;
$vars->{disable_cmo} = defined $cmo_threshold ? $cmo_threshold < 0 : 0;
$vars->{cc_avail} = $LJ::STRIPE{enabled};
$vars->{cmo_avail} = LJ::is_enabled('payments_cmo');
$vars->{gco_avail} = LJ::is_enabled('googlecheckout');
$vars->{checkout_ready} = $checkout_ready;
$vars->{cmo_min} = sprintf( '$%0.2f USD', $LJ::SHOP_CMO_MINIMUM );
}
my $ret = DW::Template->template_string( 'widget/shopcart.tt', $vars );
# allow hooks to alter the cart or append to it
LJ::Hooks::run_hooks( 'shop_cart_render', \$ret, %opts );
return $ret;
}
1;