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

393 lines
17 KiB
PHP

<?php
require_once("include/globals.php");
if (SessionActive() != 1 || ! UserLoggedIn()) {
header("Location: /");
exit();
}
//
// Generate an order for each active student in the selected classes
//
unset($selected_classes);
if (array_key_exists('selected_classes',$_POST) && is_array($_POST['selected_classes'])) $selected_classes = $_POST['selected_classes'];
$cWhere = "";
if (count($selected_classes)) {
$classes = implode(",",$selected_classes);
$cWhere = "AND class_num IN ($classes)";
}
// Get set of active students
$students = db_query("SELECT * FROM people WHERE school_num = $base_school_num AND people_type = 'Student' AND status != 'Inactive' $cWhere ORDER BY last_name,first_name");
$ordered_by_type = 'Student';
if (db_num_rows($students)) {
$num_orders_generated = 0;
$num_orders_found = 0;
$num_students = db_num_rows($students);
$num_errors = 0;
$hotlunch_order_header = new Table("hotlunch_order_header");
$hotlunch_order_items = new Table("hotlunch_order_items");
$processResults = array();
while ($row = db_fetch_assoc($students)) {
$ordered_by_num = $row['record_num'];
$user_num = $row['user_num'];
$current_name = $row['first_name'] . ' ' . $row['last_name'];
// Check if this person has an order for this schedule
$query = "select * from hotlunch_order_header " .
"where school_num = $school_num " .
"and ordered_by_num = $ordered_by_num " .
"and schedule_num = $schedule_num " .
"order by record_num desc limit 0,1";
$results = db_query($query);
if (db_num_rows($results) > 0) {
$num_orders_found++;
$processResults[] = array($current_name,getLanguageText('TEXT-ORDER-FOUND'),$currencySymbol.'0.00');
continue;
}
// Process each menu and menu item in the schedule
$query = "select * from hotlunch_menu_dates " .
"where school_num = $school_num " .
"and schedule_num = $schedule_num " .
"order by sequence,menu_date";
$menu_dates = db_query($query);
$num_items = 0;
while ($menu_date = db_fetch_array($menu_dates)) {
$menu_num = $menu_date['record_num'];
$menu_code = $schedule_num . "_" . $menu_num;
// Get menu items for this menu date
$query = "select * from hotlunch_menu_items " .
"where school_num = $school_num " .
"and menu_num = $menu_num " .
"AND active != 'N' " .
"order by sequence";
$menu_items = db_query($query);
$order_num = 0;
while ($menu_item = db_fetch_array($menu_items)) {
$menu_item_num = $menu_item['record_num'];
$options = trim($menu_item['options']);
$options2 = trim($menu_item['options2']);
$options3 = trim($menu_item['options3']);
$taxable_item = $menu_item['taxable_item'];
$curr_code = $schedule_num . "_" . $menu_num . "_" . $menu_item_num;
$qty = $_POST["qty_$curr_code"];
$price = $_POST["price_$curr_code"];
$price = str_replace(".","",$menu_item['online_price']);
if ($qty > 0) {
// Handle item options
$options_ordered = "";
if (strlen($options) > 0) {
$item_options = explode("\n",$options);
for ($i = 0; $i < count($item_options); $i++) {
$option = trim($item_options[$i]);
$option_f = str_replace(" ","_",substr($option,0,30));
$option_f = str_replace("&","and",$option_f);
$option_f = preg_replace("/[\"'%/()\.,\?\!:-]/","",$option_f);
$opt_name = "option_$curr_code" . "_$option_f";
if (array_key_exists($opt_name, $_POST) && $_POST[$opt_name] == 'Y') $options_ordered .= "$option\n";
}
}
// Handle item options2
$options2_ordered = "";
if (strlen($options2) > 0) {
$item_options = explode("\n",$options2);
for ($i = 0; $i < count($item_options); $i++) {
$option = trim($item_options[$i]);
$option_f = str_replace(" ","_",substr($option,0,30));
$option_f = str_replace("&","and",$option_f);
$option_f = preg_replace("/[\"'%/()\.,\?\!:-]/","",$option_f);
$opt_name = "option2_$curr_code" . "_$option_f";
if (array_key_exists($opt_name, $_POST) && $_POST[$opt_name] == 'Y') $options2_ordered .= "$option\n";
}
}
// Handle item options3
$options3_ordered = "";
if (strlen($options3) > 0) {
$item_options = explode("\n",$options3);
for ($i = 0; $i < count($item_options); $i++) {
$option = trim($item_options[$i]);
$option_f = str_replace(" ","_",substr($option,0,30));
$option_f = str_replace("&","and",$option_f);
$option_f = preg_replace("/[\"'%/()\.,\?\!:-]/","",$option_f);
$opt_name = "option3_$curr_code" . "_$option_f";
if (array_key_exists($opt_name, $_POST) && $_POST[$opt_name] == 'Y') $options3_ordered .= "$option\n";
}
}
// Calculate the extended price and save the data
$extended_price = intval($qty * $price) / 100;
$active = 'Y';
$menu_item_price = $price;
$query = $hotlunch_order_items->BuildInsert();
db_query($query);
$num_items++;
}
}
}
// Get order total
$query = "select sum(qty) as num, sum(extended_price) as order_subtotal " .
"from hotlunch_order_items " .
"where school_num = $school_num " .
"and ordered_by_num = $ordered_by_num " .
"and schedule_num = $schedule_num " .
"and active != 'N'";
$results = db_query($query);
$row = db_fetch_array($results);
$number_items = $row['num'];
$order_subtotal = $row['order_subtotal'];
$ordertotal = $order_subtotal;
$order_total = $order_subtotal;
$processResults[] = array($current_name,getLanguageText('TEXT-ORDER-SAVED'),$currencySymbol.$order_total);
$num_orders_generated++;
if (!isset($discount_amount)) $discount_amount = 0;
if (!isset($source) || strlen($source) == 0) $source = 'On-Line';
// Handle any discounts
$today = date("Y-m-d",time());
if ($ordered_by_type != 'Concession' && $source == 'On-Line' &&
isset($hotlunch_schedule['discount_offered']) && $hotlunch_schedule['discount_offered'] > 0 &&
$hotlunch_schedule['discount_expiry_date'] >= $today) {
$discount_offered = $hotlunch_schedule['discount_offered'];
$discount_type = $hotlunch_schedule['discount_type'];
$discount_order_minimum = $hotlunch_schedule['discount_order_minimum'];
if ($order_total >= $discount_order_minimum) {
if ($discount_type == 'Amount') {
$discount_amount = $discount_offered;
}
else {
$discount_amount = $order_subtotal * $discount_offered / 100;
}
}
}
// Apply the discount amount
$order_total = $order_subtotal - $discount_amount;
// Calculate any taxes
$tax_charge_amount = 0;
if ($hotlunch_schedule['tax_rate'] > 0.00) {
$tax_rate = $hotlunch_schedule['tax_rate'];
$tax_description = $hotlunch_schedule['tax_description'];
switch($school_record['taxable_items']) {
case 'All':
$taxable_total = $order_total;
break;
case 'Some':
$query = "select sum(extended_price) " .
"from hotlunch_order_items " .
"where school_num = $school_num " .
"and ordered_by_num = $ordered_by_num " .
"and schedule_num = $schedule_num " .
"and active != 'N' " .
"and taxable_item = 'Y'";
$taxable_total = db_getVal($query);
break;
case 'None':
$taxable_total = 0;
break;
}
$tax_charge_amount = round($tax_rate * $taxable_total / 100,2);
}
// Create an order header record if required
$added_time = time();
$added_date = date("Y-m-d",$added_time);
$updated_date = $added_date;
$amount_paid = 0;
// Create new order header on insert
$entered_by = $_SESSION['UserInfo']['record_num'];
$status = $school_record['default_order_status'];
$query = $hotlunch_order_header->BuildInsert();
db_query($query);
$order_num = db_insert_id();
// Update hotlunch_order_items with order_num
$query = "update hotlunch_order_items " .
"set order_num = $order_num, " .
"active = 'Y' " .
"where school_num = $school_num " .
"and ordered_by_num = $ordered_by_num " .
"and schedule_num = $schedule_num " .
"and order_num in (0,$order_num)";
db_query($query);
$datetime = date("Y-m-d H:i:s",time());
$entered_time = time();
$current_name = str_replace("'","&quot;",$current_name);
// Create user_account entry for current order
$query = "INSERT INTO user_account (school_num,user_num,schedule_num,order_num,people_num,transaction_datetime,transaction_type,note,transaction_amount,deleted,entered_time,transaction_status) " .
"VALUES ($school_num,$user_num,$schedule_num,$order_num,$ordered_by_num,'$datetime','Order','Order for $current_name',$order_total,'N',$entered_time,'Open')";
db_query($query);
// Delete any incorrect entries for this order
$query = "DELETE FROM user_account " .
"WHERE school_num = $school_num " .
"AND user_num != $user_num " .
"AND schedule_num = $schedule_num " .
"AND people_num = $ordered_by_num " .
"AND transaction_type = 'Order'";
db_query($query);
// Create late charge entry if required
if ($late_charge_amount > 0) {
// Determine if there is already a late charge for this order
$results = db_query("SELECT * FROM user_account WHERE school_num = $school_num AND user_num = $user_num AND order_num = $order_num AND transaction_type = 'Late Charge' AND deleted = 'N'");
if (db_num_rows($results) == 0) {
$datetime = date("Y-m-d H:i:s",time());
$entered_time = time();
$entered_user_num = intval($_SESSION['UserInfo']['record_num']);
$query = "INSERT INTO user_account (school_num,user_num,schedule_num,order_num,people_num,transaction_datetime,transaction_type,note,transaction_amount," .
"deleted,entered_time,entered_by_user_num) " .
"VALUES ($school_num,$user_num,$schedule_num,$order_num,$ordered_by_num,'$datetime','Late Charge','Order Entered $today',$late_charge_amount," .
"'N',$entered_time,$entered_user_num)";
db_query($query);
}
}
// Create tax charge entry if required
if ($tax_charge_amount > 0) {
// Determine if there is already a tax charge for this order
$results = db_query("SELECT * FROM user_account WHERE school_num = $school_num AND user_num = $user_num AND order_num = $order_num AND transaction_type = 'Tax Charge' AND deleted = 'N'");
$tdescription = db_escape_string($tax_description) . ' - Order (#' . $order_num . ')';
if (db_num_rows($results) == 0) {
$datetime = date("Y-m-d H:i:s",time());
$entered_time = time();
$entered_user_num = intval($_SESSION['UserInfo']['record_num']);
$query = "INSERT INTO user_account (school_num,user_num,schedule_num,order_num,people_num,transaction_datetime,transaction_type,note,transaction_amount," .
"deleted,entered_time,entered_by_user_num) " .
"VALUES ($school_num,$user_num,$schedule_num,$order_num,$ordered_by_num,'$datetime','Tax Charge','$tdescription',$tax_charge_amount," .
"'N',$entered_time,$entered_user_num)";
db_query($query);
}
else {
db_query("UPDATE user_account SET transaction_amount = $tax_charge_amount,note = '$tdescription' " .
"WHERE school_num = $school_num AND user_num = $user_num AND order_num = $order_num AND transaction_type = 'Tax Charge' AND deleted = 'N'");
}
}
// Create additional order fee entry if required
$additional_charge = $hotlunch_schedule['additional_charge'];
$additional_charge_message = db_escape_string($hotlunch_schedule['additional_charge_message']);
if ($additional_charge > 0) {
// Determine if there is already an additional order fee for this order
$results = db_query("SELECT * FROM user_account WHERE school_num = $school_num AND user_num = $user_num AND order_num = $order_num AND transaction_type = 'Additional Order Fee' AND deleted = 'N'");
if (db_num_rows($results) == 0) {
$datetime = date("Y-m-d H:i:s",time());
$entered_time = time();
$entered_user_num = intval($_SESSION['UserInfo']['record_num']);
$query = "INSERT INTO user_account (school_num,user_num,schedule_num,order_num,people_num,transaction_datetime,transaction_type,note,transaction_amount," .
"deleted,entered_time,entered_by_user_num) " .
"VALUES ($school_num,$user_num,$schedule_num,$order_num,$ordered_by_num,'$datetime','Additional Order Fee','$additional_charge_message',$additional_charge," .
"'N',$entered_time,$entered_user_num)";
db_query($query);
}
}
// Send parent an email if required
if (isset($user_num) && $user_num > 0) {
$email_message = trim($hotlunch_schedule['email_message']);
if (strlen($email_message) > 0) {
// Get parent record
$results = db_query("SELECT * FROM users WHERE school_num = $base_school_num AND record_num = $user_num");
$parent = db_fetch_array($results);
// Get account balance
$balance = db_getVal("select sum(transaction_amount) as balance from user_account where school_num = $school_num and user_num = $user_num AND (deleted != 'Y' OR deleted IS NULL)");
if (strlen($parent['email']) > 0) {
include_once("include/queuemail.php");
$emailRecipient = $parent['userid'];
$emailTo = $parent['email'];
$emailReply = $school_record['reply_description'];
$emailFrom = setReplyAddress($school_record['reply_email']);
$emailSubject = $school_record['school_name'] . " " . getLanguageText('TEXT-ORDER-DETAILS');
$sign = "";
if ($balance < 0) $sign = "-";
$emailMessage = getLanguageText('TEXT-ORDER-DETAILS') . ":\n" .
" - " . $current_name . "\n" .
" - " . getLanguageText('TEXT-ORDER-TOTAL') . ": $currencySymbol" . number_format($ordertotal,2) . "\n" .
" - " . getLanguageText('TEXT-ACCOUNT-BALANCE') . ": $sign$currencySymbol" . number_format(abs($balance),2) . "\n\n" .
$email_message;
// Send the email
QueueEmail($emailTo, $emailFrom, $emailSubject, $emailMessage, $emailReply, $emailRecipient);
}
}
}
}
}
// Display page
include "hotlunch_reports.menu.php";
include "hotlunch_orders.options.php";
echo("<br>\n");
include "form.messages.php";
$columnHeaders = array(getLanguageText('TEXT-STUDENT-NAME'),
getLanguageText('TEXT-RESULT'),
getLanguageText('TEXT-AMOUNT')
);
$columnAlign = array('left','center','right');
$TableWidth = 450;
listDataCustom($processResults,$columnHeaders,'',array(),'N',$columnAlign);
echo("<br>\n");
$data = array();
$data[] = array(getLanguageText('TEXT-ORDER-FOUND'),$num_orders_found);
$data[] = array(getLanguageText('TEXT-ORDER-SAVED'),$num_orders_generated);
$columnHeaders = array(getLanguageText('TEXT-RESULT'),
getLanguageText('TEXT-NUMBER')
);
$columnAlign = array('left','center');
$TableWidth = 450;
listDataCustom($data,$columnHeaders,'',array(),'N',$columnAlign);
echo("</center>\n");
?>