schedule trainer

 avatar
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...