Files
HotLunches/user_balances.php
T
2026-10-19 15:22:52 -07:00

470 lines
18 KiB
PHP

<?php
require_once("include/globals.php");
if (SessionActive() != 1 || ! UserLoggedIn()) {
header("Location: /");
exit();
}
//
// Process all actions to list and edit records
//
$action = "user-balances";
$CurrentTable = "user_balance_save";
$TitleText = getLanguageText('TEXT-USER-ACCOUNT-BALANCES');
$OrderBy = "last_name,first_name";
// Start the template and output buffering
startTemplate();
$templatePageTitle = "$TitleText " . getLanguageText('TEXT-ADMINISTRATION');
$moduleName = "user_balances.php";
// if ($_SESSION['UserInfo']['type'] == 'SuperUser') startLog($moduleName);
writeLog(print_r($_SESSION, true));
// Ensure that only valid user types have access to this module
$AllowedUserTypes = array('SuperUser','System Administrator');
if (checkPermission($AllowedUserTypes) != 1) {
$error_message = getLanguageText('ERRORMSG-ACCESS-DENIED');
include "form.messages.php";
endTemplate();
exit();
}
$school_num = $school_record['record_num'];
if (array_key_exists('naction',$_GET)) $naction = $_GET['naction'];
if (array_key_exists('naction',$_POST)) $naction = $_POST['naction'];
switch (strtolower($naction)) {
case "save":
$linked_sites = $school_record['linked_sites'];
$query = "SELECT email,userid,first_name,last_name,type,status,receive_emails,sum(ua.transaction_amount) as balance,trx_status,u.record_num " .
"FROM users AS u LEFT JOIN user_account AS ua ON user_num = u.record_num and (ua.deleted != 'Y' or ua.deleted is null) " .
"WHERE u.school_num = $base_school_num " .
"AND ua.school_num IN ($linked_sites) " .
"AND u.record_num = ua.user_num " .
"GROUP BY 1,2,3,4,5,6,7,9,10 " .
"HAVING sum(ua.transaction_amount) != 0 " .
"ORDER BY $OrderBy";
writeLog($query);
$results = db_query($query);
$num = db_num_rows($results);
writeLog("Num Balances: $num");
if (db_num_rows($results)) {
db_query("DELETE FROM user_balance_save WHERE school_num = $school_num");
$ubs = new Table($CurrentTable);
$balance_year = date("Y",time());
$posted = 'N';
$saved_date = date("Y-m-d", time());
$count = 0;
while ($row = db_fetch_array($results)) {
extract($row);
writeLog("$userid - $first_name $last_name");
$original_user_num = $record_num;
$original_userid = db_escape_string($userid);
$original_type = $type;
// Get account history
if ($balance > 0) {
$query = "SELECT * FROM user_account " .
"WHERE school_num = $school_num " .
"AND user_num = $original_user_num " .
"AND transaction_status = 'Open' " .
"AND transaction_amount > 0 " .
"AND abs(amount_paid) < transaction_amount";
$trx = db_query($query);
$trx_history = "";
while ($row = db_fetch_assoc($trx)) {
extract($row);
$sname = "";
if ($schedule_num > 0) {
$sname = "(" . db_getVal("SELECT schedule_name FROM hotlunch_schedules WHERE school_num = $school_num AND record_num = $schedule_num") . ") ";
}
$transaction_amount = '$' . number_format($transaction_amount,2);
$trx_history .= "$transaction_type: $transaction_amount - $sname$note\n";
}
}
$query = $ubs->BuildInsert();
writeLog($query);
writeLog("---------------------------");
db_query($query);
$count++;
}
}
$form_message = getLanguageText('MSG-USER-BALANCES-SAVED');
$naction = 'list';
header("Location: /?action=$action&naction=$naction&form_message=" . urlencode($form_message) . "&error_message=" . urlencode($error_message));
exit();
case "delete":
$dTitle = getLanguageText('TEXT-ALL-RECORDS');
include "delete.form.php";
break;
case "delete-confirmed":
db_query("DELETE FROM $CurrentTable WHERE school_num = $school_num");
$form_message = getLanguageText('MSG-USER-BALANCES-DELETED');
$naction = 'list';
header("Location: /?action=$action&naction=$naction&form_message=" . urlencode($form_message) . "&error_message=" . urlencode($error_message));
exit();
}
$cMonth = date("m",time());
switch ($cMonth) {
case '04':
case '05':
$days = 0;
break;
case '06':
case '07':
case '08':
case '09':
case '10':
$days = 150;
break;
case '11':
case '12':
$days = 210;
break;
case '01':
$days = 250;
break;
case '02':
$days = 270;
break;
case '03':
$days = 300;
break;
}
$cutoff = date("Y-m-d",time() - 60 * 60 * 24 * 5);
$numSaved = db_getVal("SELECT count(*) FROM user_balance_save WHERE school_num = $school_num");
$numPosted = db_getVal("SELECT count(*) FROM user_balance_save WHERE school_num = $school_num AND posted = 'Y'");
if ($numSaved > 0) $saved_date = db_getVal("SELECT max(saved_date) FROM user_balance_save WHERE school_num = $school_num");
if (isset($saved_date)) {
$numParents = db_getVal("SELECT count(*) FROM users WHERE school_num = $base_school_num AND type = 'Parent' AND date_added < '$saved_date'");
}
else {
$numParents = db_getVal("SELECT count(*) FROM users WHERE school_num = $base_school_num AND type = 'Parent' AND date_added < '$cutoff'");
$numParents = db_getVal("SELECT count(*) FROM users WHERE school_num = $base_school_num AND type = 'Parent'");
}
include "form.messages.php";
?>
<br>
<?php if (!isset($naction) && $numSaved) echo(" <p>" . getLanguageText('TEXT-USER-ACCOUNT-BALANCES') . ": $numSaved ($saved_date)</p>\n"); ?>
<table cellpadding='5' cellspacing='2' border='0'>
<tr>
<?php if ($numParents > 0 && (!isset($saved_date) || $saved_date < $cutoff)) { ?>
<td align='center'><a href='?action=user-balances&naction=save' id='save-balances' class='btn btn--primary'><?php displayLanguageText('TEXT-SAVE-BALANCES'); ?></a></td>
<?php if ($numSaved == 0) { ?>
<td align='center'><a href='#' id='clear-selected-balances' class='btn btn--primary'><?php displayLanguageText('TEXT-CLEAR-SELECTED-USER-BALANCES'); ?></a></td>
<?php } ?>
<?php } ?>
<?php if ($numSaved > 0) { ?>
<td align='center'><a href='?action=user-balances&naction=list' class='btn btn--primary'><?php displayLanguageText('TEXT-LIST-BALANCES'); ?></a></td>
<td align='center'><a href='?action=user-balances&naction=delete' class='btn btn--primary' onclick='return confirm(\"$deleteConfirmationMsg\")'><?php displayLanguageText('TEXT-CLEAR-BALANCES'); ?></a></td>
<?php } ?>
<?php if ($numParents == 0 && $numSaved == 0) { ?>
<td align='center'><p><b><?php displayLanguageText('TEXT-NO-SAVED-BALANCES-MSG') ?></b></p></td>
<?php } ?>
</tr>
</table>
<script>
$(document).ready(function() {
$(document).on('click', '#save-balances', function(e) {
if (confirm("<?php displayLanguageText('TEXT-CONFIRM'); ?>")) {
return true;
}
else {
return false;
}
});
});
</script>
<?php
switch (strtolower($naction)) {
case "list":
$post_icon = "<img src='images/icons/next24.png' alt='Post Balance'>";
$flag_icon = "<img src='images/icons/accept24.png' alt='Flag as Posted'>";
$query = "SELECT * " .
"FROM user_balance_save " .
"WHERE school_num = $school_num " .
"ORDER BY $OrderBy";
logQuery($school_num,"user_balance_save",$query,"user-balances list");
$balances = db_query($query);
$data = array();
$count = 0;
$confirm = getLanguageText('TEXT-CONFIRM-STATUS-CHANGE');
while ($row = db_fetch_array($balances)) {
extract($row);
$rnum = $record_num;
$name = "$first_name $last_name";
$obalance = $balance;
if (isset($posted_method) && $posted_method == 'Manual') $balance = "<span class='notice'>$balance</span>";
$commands = "";
$ewhere = "";
if (strlen($email)) $ewhere .= "email = '".db_escape_string($email)."' ";
if (strlen($ewhere)) $ewhere .= "OR ";
$ewhere .= "userid = '".db_escape_string($original_userid)."' ";
$fname = db_escape_string($first_name);
$lname = db_escape_string($last_name);
$fwhere = "";
if (strlen($fname) || strlen($lname)) $fwhere = "(first_name = '$fname' AND last_name = '$lname') ";
if (strlen($fwhere)) $fwhere .= "OR ";
$fwhere .= $ewhere;
// Lookup in users table for a matching name or email
$userFound = false;
$query = "SELECT * FROM users " .
"WHERE school_num = $base_school_num " .
"AND type IN ('Parent','Guest','Administration Team','Schedule Team','Financial Team','Staff') " .
"AND ($fwhere)";
$results = db_query($query);
if (db_num_rows($results)) {
$r = db_fetch_assoc($results);
$userFound = true;
$unum = $r['record_num'];
$eclass = 'notice';
if ($posted == 'N') $eclass = 'error';
else {
$transaction_type = 'Charge Adjustment';
if ($obalance < 0) $transaction_type = 'Credit Adjustment';
$note = $school_record['previous_balances_post_message'];
$query = "SELECT * FROM user_account " .
"WHERE school_num = $school_num " .
"AND user_num = $unum " .
"AND note = '$note' " .
"AND transaction_type = '$transaction_type' " .
"AND transaction_amount = $obalance";
$res = db_query($query);
if (db_num_rows($res) == 0) $balance = "<span class='error'>$obalance</span>";
}
$original_userid = "<a href='?action=user-account&naction=list&user_num=$unum'><span class='$eclass'>$original_userid</span></a>";
// $commands = "<a href='?action=user-balances&naction=post&rnum=$rnum' title='Post Balance'>$post_icon</a>&nbsp;";
}
$commands .= "<a href='?action=user-balances&naction=flag&rnum=$rnum' onClick=\"return(confirm('$confirm'));\" title='Flag as Posted'>$flag_icon</a>";
$ptime = "";
if ($posted == 'Y') $ptime = date("Y-m-d H:ia",$posted_time);
if (strlen($email)) $email = "<a href='mailto:$email'>$email</a>";
$data[$count] = array($original_userid,$original_type,$name,$email,$balance_year,$balance,$posted,$ptime,$commands);
$count++;
}
$columnHeaders = array('UserID','Type','Name','Email','Year','Balance','Posted','Posted Time','');
$columnAlign = array('left','left','left','left','center','right','center','center','center');
listDataCustom($data,$columnHeaders,$action,array(),'N',$columnAlign);
echo("<br>\n");
echo("<p>");
if ($school_record['previous_balances_post'] == 'Post Manually' || $_SESSION['UserInfo']['type'] == 'SuperUser') {
$msg = getLanguageText('TEXT-USER-BALANCE-POST-MSG') . "\\n --> " . getLanguageText('TEXT-CONTINUE');
echo("<a href='?action=user-balances&naction=post-matching' onclick='return confirm(\"$msg\");' class='btn btn--primary'>" . getLanguageText('TEXT-POST-USER-BALANCES') . "</a>");
if ($_SESSION['UserInfo']['type'] == 'SuperUser') {
$cyear = date("Y",time());
$msg = "Clear balance posted flags for $cyear";
echo("<a href='?action=user-balances&naction=unpost' onclick='return confirm(\"$msg\");' class='btn btn--primary'>Unpost Balances</a>");
$msg = "Post Balances to Current DB";
if ($currentDBMode != 'Current') echo("<a href='?action=user-balances&naction=post-forward' onclick='return confirm(\"$msg\");' class='btn btn--primary'>Post Balances to Current DB</a>");
}
}
echo("<a href='?action=user-balances-csv' class='btn btn--primary'>" . getLanguageText('TEXT-GENERATE-CSV') . "</a>");
echo("</p>");
break;
case "unpost":
$cyear = date("Y",time());
$query = "UPDATE user_balance_save SET posted = 'N', posted_time = NULL WHERE school_num = $school_num";
logQuery($school_num,"user_balance_save",$query,"user-balances unpost");
db_query($query);
break;
case "post-forward":
$balances = array();
$cyear = date("Y",time());
$query = "SELECT * FROM user_balance_save WHERE school_num = $school_num";
logQuery($school_num,"user_balance_save",$query,"user-balances post-forward");
$results = db_query($query);
if (db_num_rows($results)) {
while ($row = db_fetch_assoc($results)) {
$balances[] = $row;
}
db_query("use hotlunch");
$table = new Table("user_balance_save");
db_query("DELETE FROM user_balance_save WHERE school_num = $school_num");
for ($i = 0; $i < count($balances); $i++) {
extract($balances[$i]);
$query = $table->BuildInsert($balances[$i]);
$query .= " ON DUPLICATE KEY UPDATE balance = $balance, balance_year = '$balance_year'";
logQuery($school_num,"user_balance_save",$query,"user-balances post-forward");
db_query($query);
}
}
header("Location: /?action=user-balances");
exit();
case "post-matching":
$rwhere = "";
$rnum = 0;
if (array_key_exists('rnum',$_GET)) $rnum = $_GET['rnum'];
if ($rnum > 0) {
$rwhere = "AND record_num = $rnum ";
}
$query = "SELECT original_userid,original_type,first_name,last_name,email,balance_year,balance,posted,posted_time,record_num " .
"FROM user_balance_save " .
"WHERE school_num = $school_num " .
"AND posted = 'N' " .
$rwhere .
"ORDER BY $OrderBy";
logQuery($school_num,"user_balance_save",$query,"user-balances post-matching-users");
$balances = db_query($query);
// User account defaults
$ua = new Table("user_account");
$note = $school_record['previous_balances_post_message'];
$entered_time = time();
$transaction_datetime = date("Y-m-d H:i:s",$entered_time);
$data = array();
$count = 0;
$posted_count = 0;
while ($row = db_fetch_assoc($balances)) {
extract($row);
$rnum = $record_num;
$name = "$first_name $last_name";
$ewhere = "";
if (strlen($email)) {
$ewhere = "email = '".db_escape_string($email)."'";
$email = "<a href='mailto:$email'>$email</a>";
}
$fname = db_escape_string($first_name);
$lname = db_escape_string($last_name);
$fwhere = "";
if (strlen($fname) || strlen($lname)) $fwhere = "(first_name = '$fname' AND last_name = '$lname') ";
if (strlen($fwhere)) $fwhere .= "OR ";
$fwhere .= $ewhere;
// Lookup in users table for a matching name or email
$query = "SELECT * FROM users " .
"WHERE school_num = $base_school_num " .
"AND type IN ('Parent','Guest','Administration Team','Schedule Team','Financial Team','Staff') " .
"AND ($fwhere)";
$results = db_query($query);
$new_name = "";
$paction = "";
if (db_num_rows($results)) {
$row = db_fetch_assoc($results);
$user_num = $row['record_num'];
$new_name = $row['first_name'] . ' ' . $row['last_name'];
$paction = "->";
// Post saved balance
$transaction_type = 'Charge Adjustment';
if ($balance < 0) $transaction_type = 'Credit Adjustment';
$transaction_amount = $balance;
// Create a new transaction
$query = $ua->BuildInsert();
db_query($query);
$trx_num = db_insert_id();
// Update the saved balance record
$query = "UPDATE user_balance_save SET posted = 'Y', posted_time = $entered_time, posted_method = 'Post', user_num = $user_num, trx_num = $trx_num " .
"WHERE school_num = $school_num AND record_num = $rnum";
logQuery($school_num,"user_balance_save",$query,"user-balances post-matching-users");
db_query($query);
if ($school_record['balance_post_limit'] > 0.00 && $balance > $school_record['balance_post_limit']) {
$query = "UPDATE users SET can_order = 'Balance' WHERE school_num = $school_num AND record_num = $user_num";
db_query($query);
}
$posted_count++;
}
$data[$count] = array($original_type,$name,$email,$balance_year,$balance,$paction,$new_name);
$count++;
}
echo("<p><b>" . getLanguageText('TEXT-BALANCES-POSTED') . ": $posted_count</b></p>\n");
$columnHeaders = array('Type','Name','Email','Year','Balance','','New Name');
$columnAlign = array('left','left','left','center','right','center','left');
listDataCustom($data,$columnHeaders,$action,array(),'N',$columnAlign);
break;
case "flag":
$rnum = $_GET['rnum'];
$entered_time = time();
if ($rnum > 0) {
$query = "SELECT * FROM user_balance_save WHERE school_num = $school_num AND record_num = $rnum";
$results = db_query($query);
if (db_num_rows($results)) {
$row = db_fetch_assoc($results);
if ($row['posted'] != 'Y') {
$query = "UPDATE user_balance_save SET posted = 'Y', posted_time = $entered_time, user_num = $user_num WHERE school_num = $school_num AND record_num = $rnum";
logQuery($school_num,"user_balance_save",$query,"user-balances flag-manually-y");
db_query($query);
}
else {
$query = "UPDATE user_balance_save SET posted = 'N', posted_time = 0, user_num = 0 WHERE school_num = $school_num AND record_num = $rnum";
logQuery($school_num,"user_balance_save",$query,"user-balances flag-manually-n");
db_query($query);
}
}
header("Location: /?action=user-balances&naction=list&form_message=".urlencode(getLanguageText('TEXT-TRANSACTION-POSTED')));
exit();
}
break;
}
endTemplate();
?>