schedule trainer
unknown
php
10 months ago
12 kB
17
Indexable
public function scheduleTrainingSession()
{
try {
$model = model(TrainingSessionModel::class);
$paymentModel = model(OrderPaymentsModel::class);
$orderOfPaymentDetailsModel = model(OrderOfPaymentDetailsModel::class);
$requestData = $this->request->getJSON(true);
$userSession = session();
$sessionId = $userSession->get('id');
$fname = $userSession->get('fname') ?? '';
$lname = $userSession->get('lname') ?? '';
$fullName = "$fname $lname";
// Get notes from the top level of request data (not from individual sessions)
$globalNotes = $requestData['notes'] ?? '';
log_message('info', 'Received training session request: ' . json_encode($requestData));
if (!$requestData) {
return $this->response->setJSON([
'success' => false,
'message' => 'No data received'
])->setStatusCode(400);
}
$member_id = $requestData['member_id'] ?? $sessionId;
$total_amount = $requestData['total_amount'] ?? 1200;
if (!$member_id) {
return $this->response->setJSON([
'success' => false,
'message' => 'Member ID is required'
])->setStatusCode(400);
}
$db = \Config\Database::connect();
$db->transStart();
$insertedSessions = 0;
$insertedPayments = 0;
$insertedPaymentDetails = 0;
$totalPaymentAmount = 0; // Track total amount from all payments
$firstPaymentId = null; // Track first payment ID for the details record
if (isset($requestData['sessions']) && is_array($requestData['sessions'])) {
$sessionCount = count($requestData['sessions']);
$amountPerSession = $total_amount / $sessionCount;
foreach ($requestData['sessions'] as $session) {
$date = $session['date'] ?? null;
$time = $session['time'] ?? null;
$branch_id = $session['branch_id'] ?? null;
$trainer_id = $session['trainer_id'] ?? null;
// Use global notes from the main request, not from individual sessions
$notes = $session['notes'] ?? $globalNotes;
if (!$date || !$time || !$branch_id || !$trainer_id || !$member_id) {
log_message('warning', 'Skipping session due to missing data: ' . json_encode($session));
continue;
}
$dateTime = DateTime::createFromFormat('Y-m-d H:i', $date.' '.$time)
?: DateTime::createFromFormat('d/m/y h:i A', $date.' '.$time);
if (!$dateTime) {
log_message('warning', 'Invalid date/time format: ' . $date . ' ' . $time);
continue;
}
$trainingData = [
'member_id' => $member_id,
'trainer_id' => $trainer_id,
'schedule' => $dateTime->format('Y-m-d H:i:s'),
'branch_id' => $branch_id,
'notes' => $notes, // This will now include the notes
];
log_message('info', 'Inserting training session with notes: ' . json_encode($trainingData));
$trainingId = $model->insert($trainingData);
if ($trainingId) {
$insertedSessions++;
$paymentData = [
'member_id' => $member_id,
'branch_id' => $branch_id,
'pos_id' => 1,
'order_date' => $date,
'status' => '0',
'order_amount' => $amountPerSession,
'subscription_id' => '5',
];
$paymentId = $paymentModel->insert($paymentData);
if ($paymentId) {
$insertedPayments++;
$totalPaymentAmount += $amountPerSession; // Add to total
// Store first payment ID for the details record
if ($firstPaymentId === null) {
$firstPaymentId = $paymentId;
}
} else {
log_message('error', 'Failed to insert payment for training session: ' . $trainingId);
}
} else {
log_message('error', 'Failed to insert training session: ' . json_encode($trainingData));
log_message('error', 'Model errors: ' . json_encode($model->errors()));
}
}
// Insert single record into OrderOfPaymentDetails after all sessions are processed
if ($firstPaymentId && $insertedPayments > 0) {
$paymentDetailsData = [
'orderofpayment_header_id' => $firstPaymentId,
'product_id' => 1, // Assuming product_id 1 for training sessions
'qty' => $insertedPayments, // Count of all payment records inserted
'selling_price' => $amountPerSession, // Price per session
'total' => $totalPaymentAmount, // Sum of all payment amounts
'subscription_id' => '5'
];
$paymentDetailId = $orderOfPaymentDetailsModel->insert($paymentDetailsData);
if ($paymentDetailId) {
$insertedPaymentDetails++;
} else {
log_message('error', 'Failed to insert consolidated payment details for payment: ' . $firstPaymentId);
}
}
} else {
$date = $requestData['date'] ?? null;
$time = $requestData['time'] ?? null;
$branch_id = $requestData['branch_id'] ?? null;
$trainer_id = $requestData['trainer'] ?? $requestData['trainer_id'] ?? null;
$notes = $globalNotes; // Use global notes for single session
if (!$date || !$time || !$branch_id || !$trainer_id || !$member_id) {
return $this->response->setJSON([
'success' => false,
'message' => 'Missing required fields: date, time, branch_id, trainer_id, member_id'
])->setStatusCode(400);
}
$dateTime = DateTime::createFromFormat('Y-m-d H:i', $date.' '.$time)
?: DateTime::createFromFormat('d/m/y h:i A', $date.' '.$time);
if (!$dateTime) {
return $this->response->setJSON([
'success' => false,
'message' => 'Invalid date/time format'
])->setStatusCode(400);
}
$trainingData = [
'member_id' => $member_id,
'trainer_id' => $trainer_id,
'schedule' => $dateTime->format('Y-m-d H:i:s'),
'branch_id' => $branch_id,
'notes' => $notes, // This will now include the notes
];
log_message('info', 'Inserting single training session with notes: ' . json_encode($trainingData));
$trainingId = $model->insert($trainingData);
if ($trainingId) {
$insertedSessions++;
$paymentData = [
'member_id' => $member_id,
'branch_id' => $branch_id,
'pos_id' => 1,
'order_date' => $date,
'status' => '0',
'order_amount' => $total_amount,
'subscription_id' => '5',
];
$paymentId = $paymentModel->insert($paymentData);
if ($paymentId) {
$insertedPayments++;
$totalPaymentAmount = $total_amount; // For single session, total is the full amount
// Insert single record into OrderOfPaymentDetails for single session
$paymentDetailsData = [
'orderofpayment_header_id' => $paymentId,
'product_id' => 1, // Assuming product_id 1 for training sessions
'qty' => 1, // 1 session
'selling_price' => $total_amount, // Price for single session
'total' => $total_amount, // Total amount for single session
'subscription_id' => '5'
];
$paymentDetailId = $orderOfPaymentDetailsModel->insert($paymentDetailsData);
if ($paymentDetailId) {
$insertedPaymentDetails++;
} else {
log_message('error', 'Failed to insert payment details for single session payment: ' . $paymentId);
}
}
} else {
log_message('error', 'Failed to insert single training session');
log_message('error', 'Model errors: ' . json_encode($model->errors()));
}
}
$db->transComplete();
if ($db->transStatus() === false) {
log_message('error', 'Database transaction failed');
return $this->response->setJSON([
'success' => false,
'message' => 'Database transaction failed'
])->setStatusCode(500);
}
if ($insertedSessions === 0) {
return $this->response->setJSON([
'success' => false,
'message' => 'No training sessions were created. Please check your data and try again.'
])->setStatusCode(400);
}
return $this->response->setJSON([
'success' => true,
'message' => 'Training session(s) scheduled successfully',
'data' => [
'sessions_created' => $insertedSessions,
'payments_created' => $insertedPayments,
'payment_details_created' => $insertedPaymentDetails,
'total_payment_amount' => $totalPaymentAmount,
],
'notes' => $globalNotes, // Return the notes for confirmation
'notes2' => $requestData['notes'] ?? 'No notes provided' // Original notes field for backward compatibility
]);
} catch (\Exception $e) {
log_message('error', 'Exception in scheduleTrainingSession: ' . $e->getMessage());
log_message('error', 'Stack trace: ' . $e->getTraceAsString());
return $this->response->setJSON([
'success' => false,
'message' => 'Server error: ' . $e->getMessage()
])->setStatusCode(500);
}
}Editor is loading...