<?page
title=>Paid Time Transfer

body<=
<?_code
{
    use strict;
    use vars qw(%GET %POST);

    my $dbh = LJ::get_db_writer();
    
    my $remote = LJ::get_remote();
    return LJ::bad_input($ML{'error.noremote'})
        unless $remote;

    my $has_priv = LJ::check_priv($remote, "moneyenter");

    # disable authas mechanism for priv'd users
    delete $GET{'authas'} if $has_priv;

    my $authas = $GET{'authas'} || $remote->{'user'};
    my $u = LJ::get_authas_user($authas);
    return LJ::bad_input($ML{'error.invalidauth'})
        unless $u;

    # extra arguments for get requests
    my $getextra = $authas ne $remote->{'user'} ? "?authas=$authas" : '';

    my $ret = "";
    my $dbh = LJ::get_db_writer();
 
    my $is_perm = sub { return $_[0]->{caps} & (1 << $LJ::Pay::capinf{perm}->{bit}) };
    my $paid_bit = (1 << $LJ::Pay::capinf{paid}->{bit});

    my $get_days = sub { return sprintf("%0.02f", $_[0] / 86400) };
    my $get_secs = sub {
        return $dbh->selectrow_array
            ("SELECT UNIX_TIMESTAMP(paiduntil)-UNIX_TIMESTAMP() " .
             "FROM paiduser WHERE userid=?", undef, $_[0]->{userid});
    };

    if (LJ::did_post() && $POST{'submit'}) {
        my $u_from = ($has_priv ? LJ::load_user($POST{user}) : $remote)
            or return LJ::bad_input("User <b>$POST{user}</b> doesn't exist.");
        my $u_to = LJ::load_user($POST{userto})
            or return LJ::bad_input("User <b>$POST{userto}</b> doesn't exist.");

        return LJ::bad_input("Source and destination users must be different")
            if LJ::u_equals($u_from, $u_to);

        return LJ::bad_input("Source user must be currently logged in user")
            unless $has_priv || LJ::u_equals($u_from, $u);

        return LJ::bad_input("Destination user already has a permanent account!")
            if $is_perm->($u_to);

        return LJ::bad_input("You must have purchased a permanent account to transfer paid time to another user.")
            unless $has_priv || $is_perm->($u_from);

        my $secs = $get_secs->($u_from);
        my $days = $get_days->($secs);
        return "<?h1 Error h1?><?p User " . LJ::ljuser($u_from) . " does not have any paid time left. p?>"
            unless $secs > 0;

        $ret .= "Transferred <b>$days</b> days from " . LJ::ljuser($u_from) . " to " . LJ::ljuser($u_to) . "\n";
        
        # first try inserting in the case of a new paid account
        LJ::update_user($u_to, { raw => "caps=caps|$paid_bit" });
        $dbh->do("INSERT INTO paiduser (userid, paiduntil) " .
                 "VALUES (?, FROM_UNIXTIME(UNIX_TIMESTAMP()+?))",
                 undef, $u_to->{userid}, $secs);

        # already a paid user, just extend their existing row
        if ($dbh->err) {
            $dbh->do("UPDATE paiduser " .
                     "SET paiduntil=FROM_UNIXTIME(UNIX_TIMESTAMP(paiduntil)+?) " . 
                     "WHERE userid=?", undef, $secs, $u_to->{userid});
        }

        # log to statushistory so there's a record of this action
        my $logmesg = "Transferred $days days: $u_from->{user} => $u_to->{user}";
        LJ::statushistory_add($u_from, $remote->{'userid'}, "acct_xfer_src", $logmesg);
        LJ::statushistory_add($u_to,   $remote->{'userid'}, "acct_xfer_dest", $logmesg);
     
        ### take away time from source 
        if ($is_perm->($u_from)) {
            # take away their paid until time so they can't give it away again.
            # don't remove them from paiduser though, since they're permanent and need
            # to be here to get the email alias generated.
            $dbh->do("UPDATE paiduser SET paiduntil='0000-00-00' WHERE userid=?",
                     undef, $u_from->{userid});
        } else {
            $dbh->do("DELETE FROM paiduser WHERE userid=?", 
                     undef, $u_from->{userid});

            LJ::update_user($u_from->{userid}, { raw => "caps=caps&~$paid_bit" });
        }

        my $source = $has_priv && $POST{'anon'} ? "(ANONYMOUS)" : $u_from->{user};

        LJ::send_mail({ 'to' => $u_to->{email},
                        'from' => $LJ::ACCOUNTS_EMAIL,
                        'fromname' => 'LiveJournal',
                        'subject' => "Gift!  Paid account left-overs...",
                        'body' => "Hey,\n\nUser $source has decided to transfer his/her remaining paid time to you.  So, you now have a paid account (if you didn't have one already) and $days more days of paid account status.\n\nYou can find out more about paid accounts and their benefits at http://www.livejournal.com/paidaccounts/\n\nEnjoy!\n",
                    });
     
        return $ret;
    } 

    # authas switcher form -- makes no sense if user is priv'd
    unless ($has_priv) {
        $ret .= "<form method='get' action='xfer_remaining.bml'>\n";
        $ret .= LJ::make_authas_select($remote, { authas => $GET{'authas'} }) . "\n";
        $ret .= "</form>\n\n";
    }

    $ret .= "<?h1 Transfer Paid Time h1?>";

    # standard intro paragraph for users
    if ($has_priv) {
        $ret .= "<?p This tool will allow you to transfer all remaining paid time ";
        $ret .= "from one user to another. p?>";

    # only available to admins and perm account holders
    } elsif (! $is_perm->($u)) {
        $ret .= "<?p This tool is only available to users who have recently purchased permanent ";
        $ret .= "accounts and wish to transfer their remaining paid time to another user. p?>";
        return $ret;

    # standard form for normal permanent accounts
    } else {

        my $secs = $get_secs->($u);
        my $days = $get_days->($secs);

        $ret .= "<?p This tool will allow you to transfer all of your remaining paid time ";
        $ret .= "(currently $days days) " if $secs > 0;
        $ret .= "to any other non-permanent account. p?>";

        unless ($secs > 0) {
            $ret .= "<?p You don't have any remaining paid time to transfer! Have ";
            $ret .= "you already used this tool in the past? p?>";
            return $ret;
        }
    }

    # begin submission form
    $ret .= "<form method='post'><table>";

    # from user
    $ret .= "<tr><td align='right'>From:</td><td>";
    if ($has_priv) {
        $ret .= LJ::html_text({ size => 15, maxlength => 15, name => 'user' });
    } else {
        $ret .= LJ::ljuser($u);
    }
    $ret .= "</td></tr>";

    # to user
    $ret .= "<tr><td align='right'>To:</td>";
    $ret .= "<td>" . LJ::html_text({ size => 15, maxlength => 15, name => 'userto' });
    $ret .= "</td></tr>";

    # anonymous option for admins
    if ($has_priv) {
        $ret .= "<tr><td align='right'>Anonymous?</td>";
        $ret .= "<td>" . LJ::html_check({ value => 1, name => 'anon' });
        $ret .= "</td></tr>";
    }

    $ret .= "<tr><td>&nbsp;</td><td>";
    $ret .= LJ::html_submit('submit' => "Transfer");
    $ret .= "</td></tr></table></form>";

    return $ret;
}
_code?>
<=body

page?>
