mourningdove/cgi-bin/DW/Shop/Engine/CheckMoneyOrder.pm

157 lines
4.8 KiB
Perl
Raw Normal View History

2026-05-24 01:03:05 +00:00
#!/usr/bin/perl
#
# DW::Shop::Engine::CheckMoneyOrder
#
# This engine lets the user pay via check/money order.
#
# Authors:
# Mark Smith <mark@dreamwidth.org>
# 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 DW::Shop::Engine::CheckMoneyOrder;
use strict;
use Carp qw/ croak confess /;
use Storable qw/ nfreeze thaw /;
use base qw/ DW::Shop::Engine /;
# new( $cart )
#
# instantiates a new CMO engine for the given cart
sub new {
return bless { cart => $_[1] }, $_[0];
}
# new_from_cart( $cart )
#
# constructs an engine from a given cart. doesn't really do much
# more than call new() as that's the default
sub new_from_cart {
return $_[0]->new( $_[1] );
}
# checkout_url()
#
# given a shopping cart full of Stuff, build a URL for us to send the user to
# to initiate the checkout process.
sub checkout_url {
my $self = $_[0];
# make sure that the cart contains something that costs something. since
# this check should have been done above, we die hardcore here.
my $cart = $self->cart;
die
"Constraints not met: cart && cart->has_items && ( cart->total_cash > 0.00 || cart->total_points > 0 ).\n"
unless $cart && $cart->has_items && ( $cart->total_cash > 0.00 || $cart->total_points > 0 );
# and, just in case something terrible happens, make sure our state is good
die "Cart not in valid state!\n"
unless $cart->state == $DW::Shop::STATE_OPEN || $cart->state == $DW::Shop::STATE_CHECKOUT;
# the cart is in a good state, so just send them to the confirmation page which
# gives them instructions on where to send it
return "$LJ::SHOPROOT/confirm?ordernum=" . $cart->ordernum;
}
# confirm_order()
#
# all this does is mark the order as pending.
sub confirm_order {
my $self = $_[0];
my $cart = $self->cart;
# ensure the cart is in checkout state. if it's still open or paid
# or something, we can't touch it.
return $self->error('cmo.engbadstate')
unless $cart->state == $DW::Shop::STATE_CHECKOUT;
# and now, if this order is free (paid on points) then try to deduct the points
# from the user and if that works, mark it paid
if ( $cart->total_cash == 0.00 && $cart->total_points > 0 ) {
$self->try_capture_points
or die "Unknown error capturing points for sale.\n";
# if the above succeeded the order is paid and done
$cart->state($DW::Shop::STATE_PAID);
return 1;
}
# now set it pending
$cart->state($DW::Shop::STATE_PEND_PAID);
# send an email to the user who placed the order
my $u = LJ::load_userid( $cart->userid );
my $linebreak = "\n ";
my $address = $LJ::SITEADDRESS;
$address =~ s/<br \/>/$linebreak/g;
LJ::send_mail(
{
to => $cart->email,
from => $LJ::ACCOUNTS_EMAIL,
fromname => $LJ::SITENAME,
subject => LJ::Lang::ml(
'shop.email.confirm.checkmoneyorder.subject',
{ sitename => $LJ::SITENAME }
),
body => LJ::Lang::ml(
'shop.email.confirm.checkmoneyorder.body',
{
touser => LJ::isu($u) ? $u->display_name : $cart->email,
receipturl => "$LJ::SHOPROOT/receipt?ordernum=" . $cart->ordernum,
total => sprintf( '$%0.2f USD', $cart->total_cash ),
payableto => $LJ::SITECOMPANY,
address => "$LJ::SITECOMPANY${linebreak}Order #"
. $cart->id
. "$linebreak$address",
sitename => $LJ::SITENAME,
}
),
}
);
# and run any additional actions desired (because this is such a manual process)
LJ::Hooks::run_hooks( 'check_money_order_pending', $cart, $u );
return 2;
}
# cancel_order()
#
# cancels the order, but all it has to do is check the cart state
sub cancel_order {
my $self = $_[0];
# ensure the cart is in open state
return $self->error('cmo.engbadstate')
unless $self->cart->state == $DW::Shop::STATE_OPEN;
return 1;
}
# called when something terrible has happened and we need to fully fail out
# a transaction for some reason. (payment not valid, etc.)
sub fail_transaction {
my $self = $_[0];
# step 1) mark statuses
# $self->cart->
}
################################################################################
## internal methods, nobody else should be calling these
################################################################################
# accessors
sub cart { $_[0]->{cart} }
1;