File size: 2,446 Bytes
df37f6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from typing import Literal
from app.client.futabus_client import FutabusClient


class LocationService:
    def __init__(self, client: FutabusClient):
        self.client = client

    async def get_city_by_office(
        self, office_name: str, role: Literal["origin", "dest"]
    ) -> tuple[int | None, str | None, str | None]:
        """
        Trích xuất thông tin tỉnh (ID, code, name) từ tên văn phòng.

        Args:
            office_name (str): Tên văn phòng cần tìm.
            role (Literal["origin", "dest"]): Loại văn phòng ("origin" hoặc "dest").

        Returns:
            Tuple[int | None, str | None, str | None]: Thông tin tỉnh tương ứng (ID, code, name),
                                                       hoặc toàn bộ là None nếu không tìm thấy.
        """
        if role not in {"origin", "dest"}:
            raise ValueError("role must be 'origin' or 'dest'")
        response = await self.client.get_pickup_points(
            origin=office_name if role == "origin" else None,
            dest=office_name if role == "dest" else None,
        )
        key = role
        for group in response.get(key, []):
            for office in group.get("group", []):
                if office.get("name", "").lower() == office_name.lower():
                    id = (
                        office.get("provinceId")[0]
                        if isinstance(office.get("provinceId"), tuple)
                        else office.get("provinceId")
                    )
                    code = office.get("provinceCode")
                    name = office.get("provinceName")
                    return id, code, name
        return None, None, None

    async def get_office_id_by_name(self, office_name: str) -> int | None:
        """
        Trích xuất Office ID từ tên văn phòng.

        Args:
            office_name (str): Tên văn phòng.

        Returns:
            int | None: ID văn phòng nếu tìm thấy, ngược lại None.
        """
        response = await self.client.get_pickup_points(origin=office_name)
        for group in response.get("origin", []):
            for office in group.get("group", []):
                if office.get("name", "").lower() == office_name.lower():
                    office_id = office.get("officeId")
                    return office_id[0] if isinstance(office_id, tuple) else office_id
        return None