<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tra cứu địa chỉ mới &#8211; Nhật Phúc</title>
	<atom:link href="https://nhatphuc.com/bai-viet/tra-cuu-dia-chi-moi/feed/" rel="self" type="application/rss+xml" />
	<link>https://nhatphuc.com</link>
	<description></description>
	<lastBuildDate>Wed, 02 Jul 2025 11:04:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://nhatphuc.com/wp-content/uploads/2019/08/favicon-75x75.png</url>
	<title>Tra cứu địa chỉ mới &#8211; Nhật Phúc</title>
	<link>https://nhatphuc.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Công cụ tra cứu doanh nghiệp theo địa chỉ mới</title>
		<link>https://nhatphuc.com/tra-cuu-dia-chi-moi-cua-doanh-nghiep/</link>
					<comments>https://nhatphuc.com/tra-cuu-dia-chi-moi-cua-doanh-nghiep/#respond</comments>
		
		<dc:creator><![CDATA[Linh Nguyễn]]></dc:creator>
		<pubDate>Wed, 02 Jul 2025 10:47:44 +0000</pubDate>
				<category><![CDATA[Khám phá]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Tra cứu địa chỉ mới]]></category>
		<guid isPermaLink="false">https://nhatphuc.com/?p=16828</guid>

					<description><![CDATA[<p>Công cụ Tra cứu Địa chỉ Mới (Hiển thị nhiều kết quả) Tra cứu Địa [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://nhatphuc.com/tra-cuu-dia-chi-moi-cua-doanh-nghiep/">Công cụ tra cứu doanh nghiệp theo địa chỉ mới</a> appeared first on <a rel="nofollow" href="https://nhatphuc.com">Nhật Phúc</a>.</p>
]]></description>
										<content:encoded><![CDATA[<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Công cụ Tra cứu Địa chỉ Mới (Hiển thị nhiều kết quả)</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Inter', sans-serif;
        }
        .autocomplete-items::-webkit-scrollbar { width: 6px; }
        .autocomplete-items::-webkit-scrollbar-track { background: #f1f1f1; }
        .autocomplete-items::-webkit-scrollbar-thumb { background: #888; border-radius: 3px; }
        .autocomplete-items::-webkit-scrollbar-thumb:hover { background: #555; }
        .input-spinner {
            display: none; position: absolute; right: 12px; top: 50%;
            transform: translateY(-50%); border: 3px solid #f3f3f3;
            border-top: 3px solid #3498db; border-radius: 50%;
            width: 20px; height: 20px; animation: spin 0.8s linear infinite;
        }
        @keyframes spin {
            0% { transform: translateY(-50%) rotate(0deg); }
            100% { transform: translateY(-50%) rotate(360deg); }
        }
    </style>
</head>
<body class="bg-gray-100 dark:bg-gray-900 text-gray-800 dark:text-gray-200 transition-colors duration-300">

    <div class="container mx-auto p-4 md:p-8 max-w-3xl">
        <header class="text-center mb-8">
            <h1 class="text-3xl md:text-4xl font-bold text-blue-600 dark:text-blue-400">Tra cứu Địa chỉ Hành chính Mới</h1>
            <p class="mt-2 text-lg text-gray-600 dark:text-gray-400">Nhập địa chỉ cũ để tìm thông tin đơn vị hành chính mới.</p>
        </header>

        <main class="bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 md:p-8">
            <div id="search-section">
                <div class="relative mb-4" id="autocomplete-container">
                    <label for="old-address-input" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Nhập địa chỉ cũ (Phường/Xã, Quận/Huyện, Tỉnh/TP)</label>
                    <div class="relative">
                         <input type="text" id="old-address-input" placeholder="Bắt đầu gõ tên Phường/Xã..."
                               class="w-full px-4 py-3 bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200">
                         <div id="input-spinner" class="input-spinner"></div>
                    </div>
                    <div id="autocomplete-list" class="autocomplete-items absolute z-10 w-full bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-b-lg mt-1 max-h-60 overflow-y-auto hidden shadow-lg"></div>
                </div>
                <div class="mb-4">
                    <label for="street-input" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Số nhà, Tên đường (tùy chọn)</label>
                    <input type="text" id="street-input" placeholder="Ví dụ: 123 Nguyễn Huệ"
                           class="w-full px-4 py-3 bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200">
                </div>
                <button id="lookup-button" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-lg transition-transform transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
                    Tra cứu
                </button>
            </div>

            <div id="result-container" class="mt-6 p-5 bg-gray-50 dark:bg-gray-700 rounded-lg hidden border border-gray-200 dark:border-gray-600">
                <h3 class="text-xl font-semibold mb-3 border-b pb-2 border-gray-300 dark:border-gray-600">Kết quả tra cứu:</h3>
                <div id="result-content" class="text-lg space-y-2"></div>
            </div>
        </main>
    </div>

    <script type="module">
        import { initializeApp } from "https://www.gstatic.com/firebasejs/11.6.1/firebase-app.js";
        import { getFirestore, collection, getDocs, query, where, limit } from "https://www.gstatic.com/firebasejs/11.6.1/firebase-firestore.js";

        const firebaseConfig = {
  apiKey: "AIzaSyBL3USs4_BgCBM1_eFrOA0Htmjj2FWa5XM",
  authDomain: "app-and-game.firebaseapp.com",
  projectId: "app-and-game",
  storageBucket: "app-and-game.firebasestorage.app",
  messagingSenderId: "670250047171",
  appId: "1:670250047171:web:ca90d4df93674be6fef476",
  measurementId: "G-4KR5Q5RCQV"
        };

        const app = initializeApp(firebaseConfig);
        const db = getFirestore(app);

        const oldAddressInput = document.getElementById('old-address-input');
        const streetInput = document.getElementById('street-input');
        const lookupButton = document.getElementById('lookup-button');
        const resultContainer = document.getElementById('result-container');
        const resultContent = document.getElementById('result-content');
        const autocompleteList = document.getElementById('autocomplete-list');
        const spinner = document.getElementById('input-spinner');

        function parseOldAddress(fullAddress) {
            const parts = fullAddress.split(',').map(p => p.trim());
            if (parts.length !== 3) return null;
            return { oldWard: parts[0], oldDistrict: parts[1], oldProvince: parts[2] };
        }

        async function findNewAddress() {
            const inputValue = oldAddressInput.value;
            if (!inputValue) {
                alert("Vui lòng nhập và chọn địa chỉ Phường/Xã, Quận/Huyện, Tỉnh/TP.");
                return;
            }

            const parsed = parseOldAddress(inputValue);
            if (!parsed) {
                displayResult([], null);
                return;
            }
            
            spinner.style.display = 'block';
            lookupButton.disabled = true;

            // *** THAY ĐỔI: Bỏ limit(1) để lấy tất cả các kết quả phù hợp ***
            const q = query(
                collection(db, "vietnam_address_mappings"),
                where('old_ward', '==', parsed.oldWard),
                where('old_district', '==', parsed.oldDistrict),
                where('old_province', '==', parsed.oldProvince)
            );

            try {
                const querySnapshot = await getDocs(q);
                // Lấy tất cả các kết quả, không chỉ một
                const matches = querySnapshot.docs.map(doc => doc.data());
                displayResult(matches, streetInput.value.trim());
            } catch (error) {
                console.error("Lỗi khi tra cứu:", error);
                displayResult([], null, "Đã xảy ra lỗi khi kết nối tới máy chủ.");
            } finally {
                spinner.style.display = 'none';
                lookupButton.disabled = false;
            }
        }

        /**
         * *** NÂNG CẤP: Hiển thị nhiều kết quả nếu có ***
         */
        function displayResult(matches, streetInfo, errorMessage) {
            resultContainer.style.display = 'block';
            if (errorMessage) {
                 resultContent.innerHTML = `<p class="text-red-600 dark:text-red-400">${errorMessage}</p>`;
                 return;
            }

            if (matches && matches.length > 0) {
                const oldAddress = [streetInfo, matches[0].old_ward, matches[0].old_district, matches[0].old_province]
                    .filter(Boolean).join(', ');

                // Tạo một list HTML cho tất cả các địa chỉ mới có thể có
                const newAddressesHtml = matches.map(match => {
                    const newAddress = [streetInfo, match.new_ward, match.new_province]
                        .filter(Boolean).join(', ');
                    return `<li class="font-bold text-green-700 dark:text-green-400">${newAddress}</li>`;
                }).join('');

                resultContent.innerHTML = `
                    <p><strong class="font-medium text-gray-500 dark:text-gray-400">Địa chỉ cũ:</strong> ${oldAddress}</p>
                    <p class="mt-3"><strong class="font-medium text-gray-900 dark:text-gray-200">Có thể là một trong các địa chỉ mới sau:</strong></p>
                    <ul class="list-disc list-inside mt-2 space-y-1">${newAddressesHtml}</ul>
                `;
            } else {
                resultContent.innerHTML = `
                    <p class="text-red-600 dark:text-red-400"><strong class="font-medium">Không tìm thấy!</strong></p>
                    <p>Không có thông tin thay đổi cho địa chỉ bạn đã nhập. Vui lòng kiểm tra lại.</p>
                `;
            }
        }
        
        async function handleAutocomplete(e) {
            const value = e.target.value;
            autocompleteList.innerHTML = '';
            if (value.length < 2) {
                autocompleteList.classList.add('hidden'); return;
            }
            spinner.style.display = 'block';
            const q = query(collection(db, "vietnam_address_mappings"), where('old_ward', '>=', value), where('old_ward', '<=', value + '\uf8ff'), limit(7));
            try {
                const querySnapshot = await getDocs(q);
                const suggestions = new Set();
                querySnapshot.forEach(doc => {
                    const data = doc.data();
                    suggestions.add(`${data.old_ward}, ${data.old_district}, ${data.old_province}`);
                });
                autocompleteList.innerHTML = '';
                if (suggestions.size > 0) {
                    autocompleteList.classList.remove('hidden');
                    suggestions.forEach(suggestion => {
                        const div = document.createElement('div');
                        div.className = 'p-3 hover:bg-gray-100 dark:hover:bg-gray-600 cursor-pointer';
                        div.textContent = suggestion;
                        div.addEventListener('click', () => {
                            oldAddressInput.value = suggestion;
                            autocompleteList.classList.add('hidden');
                            oldAddressInput.focus();
                        });
                        autocompleteList.appendChild(div);
                    });
                } else {
                    autocompleteList.classList.add('hidden');
                }
            } catch (error) {
                console.error("Lỗi autocomplete:", error);
                autocompleteList.classList.add('hidden');
            } finally {
                spinner.style.display = 'none';
            }
        }

        lookupButton.addEventListener('click', findNewAddress);
        oldAddressInput.addEventListener('input', handleAutocomplete);
        oldAddressInput.addEventListener('keydown', e => {
            if (e.key === 'Enter') {
                e.preventDefault();
                autocompleteList.classList.add('hidden');
                findNewAddress();
            }
        });
        document.addEventListener('click', e => {
            if (!document.getElementById('autocomplete-container').contains(e.target)) {
                autocompleteList.classList.add('hidden');
            }
        });
    </script>
</body>
</html>
<p>The post <a rel="nofollow" href="https://nhatphuc.com/tra-cuu-dia-chi-moi-cua-doanh-nghiep/">Công cụ tra cứu doanh nghiệp theo địa chỉ mới</a> appeared first on <a rel="nofollow" href="https://nhatphuc.com">Nhật Phúc</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nhatphuc.com/tra-cuu-dia-chi-moi-cua-doanh-nghiep/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
