PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 131
prepare(" SELECT b.id as booking_id, b.*, p.name as package_name, p.price, a.name as agent_name, b.customer_name, b.email as customer_email, b.phone as customer_phone, p.departure_date, b.amount as total_amount, b.payment_status FROM package_bookings b LEFT JOIN packages p ON b.package_id = p.id LEFT JOIN agents a ON b.agent_id = a.id WHERE b.id = ? "); if (!$stmt) { throw new Exception("Query error: " . $conn->error); } $stmt->bind_param("i", $booking_id); $stmt->execute(); $result = $stmt->get_result(); $booking = $result->fetch_assoc(); if (!$booking) { throw new Exception("Data booking tidak ditemukan"); } $response_data['booking'] = [ 'id' => $booking['booking_id'], 'customer_name' => $booking['customer_name'], 'package_name' => $booking['package_name'] ]; // Get settings $settings = []; $stmt = $conn->prepare("SELECT name, value FROM settings"); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $settings[$row['name']] = $row['value']; } // Validate required settings $required_settings = ['smtp_host', 'smtp_user', 'smtp_pass', 'whatsapp_api_key']; $missing_settings = []; foreach ($required_settings as $setting) { if (empty($settings[$setting])) { $missing_settings[] = $setting; } } if (!empty($missing_settings)) { throw new Exception("Pengaturan belum lengkap: " . implode(", ", $missing_settings)); } // Generate PDF Invoice $pdf_file = generateInvoicePDF($booking, $settings); $response_data['pdf_generated'] = true; // Prepare notification message $message = "Halo " . $booking['customer_name'] . ",\n\n"; $message .= "Terima kasih telah memilih " . $settings['company_name'] . ". Berikut adalah detail pembayaran Anda:\n\n"; $message .= "Invoice No: " . $booking['booking_id'] . "\n"; $message .= "Paket: " . $booking['package_name'] . "\n"; $message .= "DP: Rp " . number_format($booking['total_amount'], 0, ',', '.') . "\n"; $message .= "Sisa Pembayaran: Rp " . number_format($booking['price'] - $booking['amount'], 0, ',', '.') . "\n\n"; $message .= "Mohon segera lakukan pembayaran sesuai dengan detail di atas.\n"; $message .= "Invoice lengkap telah dilampirkan dalam email ini.\n\n"; $message .= "Terima kasih,\n" . $settings['company_name']; // Send notifications $notifications = ['email' => false, 'whatsapp' => false]; $errors = []; // Send email try { sendEmailWithPDF( $booking['customer_email'], 'Invoice Pembayaran - ' . $settings['company_name'], $message, $pdf_file, $settings ); $notifications['email'] = true; } catch (Exception $e) { $errors['email'] = $e->getMessage(); } // Send WhatsApp try { sendWhatsApp($booking['customer_phone'], $message, $settings['whatsapp_api_key']); $notifications['whatsapp'] = true; } catch (Exception $e) { $errors['whatsapp'] = $e->getMessage(); } // Clean up PDF file if (file_exists($pdf_file)) { unlink($pdf_file); } // Prepare response $response_data['notifications'] = $notifications; if (!empty($errors)) { $response_data['errors'] = $errors; } // Determine final status and message if ($notifications['email'] && $notifications['whatsapp']) { sendJsonResponse('success', 'Notifikasi berhasil dikirim ke email dan WhatsApp', $response_data); } elseif ($notifications['email']) { sendJsonResponse('warning', 'Notifikasi hanya berhasil dikirim ke email', $response_data); } elseif ($notifications['whatsapp']) { sendJsonResponse('warning', 'Notifikasi hanya berhasil dikirim ke WhatsApp', $response_data); } else { sendJsonResponse('error', 'Gagal mengirim notifikasi', $response_data); } } catch (Exception $e) { error_log("Error in send_payment_notification.php: " . $e->getMessage()); sendJsonResponse('error', $e->getMessage(), ['trace' => $e->getTraceAsString()]); } // Helper functions remain the same but with error handling improvements function generateInvoicePDF($booking, $settings) { try { $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // Set document information $pdf->SetCreator($settings['company_name']); $pdf->SetAuthor($settings['company_name']); $pdf->SetTitle('Invoice #' . $booking['booking_id']); // Remove default header/footer $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); // Set margins $pdf->SetMargins(15, 15, 15); $pdf->SetAutoPageBreak(TRUE, 15); // Add a page $pdf->AddPage(); // Set font $pdf->SetFont('helvetica', '', 10); // Company Logo if (!empty($settings['site_logo'])) { $logo_path = dirname(__DIR__) . '/' . $settings['site_logo']; if (file_exists($logo_path)) { $pdf->Image($logo_path, 15, 15, 50); } } // Company Information (right aligned) $pdf->SetXY(120, 15); $pdf->SetFont('helvetica', 'B', 14); $pdf->Cell(75, 10, $settings['company_name'], 0, 1, 'R'); $pdf->SetFont('helvetica', '', 9); $pdf->SetXY(120, 25); $pdf->MultiCell(75, 5, $settings['company_address'] . "\n" . "Phone: " . $settings['company_phone'] . "\n" . "Email: " . $settings['company_email'], 0, 'R'); // Invoice Title $pdf->SetY(50); $pdf->SetFont('helvetica', 'B', 18); $pdf->Cell(180, 10, 'INVOICE', 0, 1, 'C'); // Invoice Details $pdf->SetY(65); $pdf->SetFont('helvetica', 'B', 10); $pdf->Cell(90, 7, 'BILL TO:', 0, 0); $pdf->Cell(90, 7, 'INVOICE DETAILS:', 0, 1); $pdf->SetFont('helvetica', '', 10); // Customer Details (left) $pdf->MultiCell(90, 6, $booking['customer_name'] . "\n" . "Phone: " . $booking['customer_phone'] . "\n" . "Email: " . $booking['customer_email'], 0, 'L'); // Reset Y position for invoice details $pdf->SetXY(105, 72); // Invoice Details (right) $pdf->MultiCell(90, 6, "Invoice No: #" . str_pad($booking['booking_id'], 5, '0', STR_PAD_LEFT) . "\n" . "Date: " . date('d/m/Y') . "\n" . "Due Date: " . date('d/m/Y', strtotime('+7 days')), 0, 'L'); // Package Details Table $pdf->SetY(100); $pdf->SetFont('helvetica', 'B', 10); // Table Header $pdf->SetFillColor(240, 240, 240); $pdf->Cell(90, 8, 'Description', 1, 0, 'L', true); $pdf->Cell(30, 8, 'Participants', 1, 0, 'C', true); $pdf->Cell(60, 8, 'Amount', 1, 1, 'R', true); // Table Content $pdf->SetFont('helvetica', '', 10); $pdf->Cell(90, 8, $booking['package_name'], 1, 0, 'L'); $pdf->Cell(30, 8, $booking['participants'], 1, 0, 'C'); $pdf->Cell(60, 8, 'Rp ' . number_format($booking['price'], 0, ',', '.'), 1, 1, 'R'); // DP Amount $pdf->Cell(120, 8, 'Down Payment (DP)', 1, 0, 'L'); $pdf->Cell(60, 8, 'Rp ' . number_format($booking['amount'], 0, ',', '.'), 1, 1, 'R'); // Remaining Payment $pdf->SetFont('helvetica', 'B', 10); $pdf->Cell(120, 8, 'Remaining Payment', 1, 0, 'L'); $pdf->Cell(60, 8, 'Rp ' . number_format($booking['price'] - $booking['amount'], 0, ',', '.'), 1, 1, 'R'); // Payment Instructions $pdf->SetY(160); $pdf->SetFont('helvetica', 'B', 11); $pdf->Cell(180, 8, 'PAYMENT INSTRUCTIONS', 0, 1, 'L'); $pdf->SetFont('helvetica', '', 10); // Bank Details $bank_accounts = [ ['bank' => 'UOB', 'number' => $settings['bank_bca'], 'name' => $settings['bank_account_name']], ['bank' => 'Mandiri', 'number' => $settings['bank_mandiri'], 'name' => $settings['bank_account_name']], ['bank' => 'BSI', 'number' => $settings['bank_bri'], 'name' => $settings['bank_account_name']] ]; foreach ($bank_accounts as $account) { if (!empty($account['number'])) { $pdf->MultiCell(180, 6, $account['bank'] . "\n" . "Account Number: " . $account['number'] . "\n" . "Account Name: " . $account['name'] . "\n", 0, 'L'); $pdf->Ln(2); } } // Notes $pdf->SetFont('helvetica', 'B', 10); $pdf->Cell(180, 8, 'Notes:', 0, 1, 'L'); $pdf->SetFont('helvetica', '', 10); $pdf->MultiCell(180, 6, "1. Please include booking number in payment description\n" . "2. Send payment confirmation to our contact\n" . "3. Payment is due within 7 days of invoice date", 0, 'L'); // Signature $pdf->SetY(-70); $pdf->Cell(180, 10, $settings['company_city'] . ', ' . date('d F Y'), 0, 1, 'R'); // Add signature if exists if (!empty($settings['signature'])) { $signature_path = dirname(__DIR__) . '/' . $settings['signature']; if (file_exists($signature_path)) { $pdf->Image($signature_path, 140, $pdf->GetY(), 30); } } $pdf->SetY(-40); $pdf->Cell(180, 10, $settings['director_name'], 0, 1, 'R'); $pdf->SetFont('helvetica', 'I', 8); $pdf->Cell(180, 5, 'Director', 0, 1, 'R'); // Save PDF $pdf_file = TEMP_PATH . '/invoice_' . $booking['booking_id'] . '.pdf'; $pdf->Output($pdf_file, 'F'); if (!file_exists($pdf_file)) { throw new Exception("Gagal generate file PDF"); } return $pdf_file; } catch (Exception $e) { throw new Exception("Error generating PDF: " . $e->getMessage()); } } function sendEmailWithPDF($to, $subject, $message, $pdf_file, $settings) { try { $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = $settings['smtp_host']; $mail->SMTPAuth = true; $mail->Username = $settings['smtp_user']; $mail->Password = $settings['smtp_pass']; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = $settings['smtp_port']; $mail->setFrom($settings['smtp_user'], $settings['company_name']); $mail->addAddress($to); $mail->addAttachment($pdf_file, 'Invoice.pdf'); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = nl2br($message); $mail->AltBody = strip_tags($message); if (!$mail->send()) { throw new Exception($mail->ErrorInfo); } return true; } catch (Exception $e) { throw new Exception("Gagal mengirim email: " . $e->getMessage()); } } function sendWhatsApp($phone, $message, $api_key) { try { if (empty($api_key)) { throw new Exception("API Key WhatsApp belum dikonfigurasi"); } $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://api.fonnte.com/send', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => [ 'target' => $phone, 'message' => $message, 'countryCode' => '62', ], CURLOPT_HTTPHEADER => [ 'Authorization: ' . $api_key ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); // if ($err) { // throw new Exception("Error CURL: " . $err); // } // $result = json_decode($response, true); // if (!isset($result['status']) || $result['status'] !== true) { // throw new Exception("Error API WhatsApp: " . ($result['message'] ?? 'Unknown error')); // } return true; } catch (Exception $e) { throw new Exception("Gagal mengirim WhatsApp: " . $e->getMessage()); } }