Sơ đồ

flowchart TD
    Start([Người dùng click CSVインポート]) --> SelectFile[Chọn file CSV]
    SelectFile --> Upload[Upload file lên server]
    Upload --> ReadHeader[Đọc header dòng đầu tiên]
    ReadHeader --> CheckID{Header có cột ID}
    CheckID -->|Có| UpdateMode[Update Mode]
    CheckID -->|Không| InsertMode[Insert Mode]

    UpdateMode --> ValidateHeaderUpdate[Kiểm tra header khớp mẫu có ID]
    InsertMode --> ValidateHeaderInsert[Kiểm tra header khớp mẫu không ID]

    ValidateHeaderUpdate -->|Không khớp| ErrorHeader[Lỗi Header không khớp]
    ValidateHeaderInsert -->|Không khớp| ErrorHeader
    ValidateHeaderUpdate -->|Khớp| ValidateFile[Kiểm tra file CSV]
    ValidateHeaderInsert -->|Khớp| ValidateFile

    ValidateFile --> CheckDelimiter{CSV phân cách bằng dấu phẩy}
    CheckDelimiter -->|Không| ErrorDelimiter[Lỗi CSVファイルはカンマ区切りで作成してください]
    CheckDelimiter -->|Có| CheckRecordSize{Số dòng <= giới hạn}

    CheckRecordSize -->|Vượt quá| ErrorSize[Lỗi データ数が importLimit 件を超えています]
    CheckRecordSize -->|OK| CreateTask[Tạo batch task]

    CreateTask --> SaveFile[Lưu file tạm thời PlaceCalendar_taskId.csv]
    SaveFile --> CheckRunningTask{Có task import đang chạy}

    CheckRunningTask -->|Có| WaitTask[Chờ task hiện tại xong]
    CheckRunningTask -->|Không| ProcessImport[Bắt đầu import]

    WaitTask --> ProcessImport

    ProcessImport --> ReadRecords[Đọc từng dòng dữ liệu]
    ReadRecords --> ValidateRecord{Validate từng record}

    ValidateRecord -->|Có lỗi| WriteErrorFile[Ghi vào file lỗi]
    ValidateRecord -->|Không lỗi| CheckMode{Loại import}

    CheckMode -->|Insert| InsertDB[Thêm mới vào DB]
    CheckMode -->|Update| UpdateDB[Cập nhật DB]

    InsertDB --> NextRecord{Còn dòng}
    UpdateDB --> NextRecord
    WriteErrorFile --> NextRecord

    NextRecord -->|Có| ReadRecords
    NextRecord -->|Không| CheckError{Có lỗi không}

    CheckError -->|Có| ShowError[Hiển thị lỗi và download file lỗi]
    CheckError -->|Không| ShowSuccess[インポート結果はCSV実行履歴画面でご確認ください]

    ErrorHeader --> End([Kết thúc])
    ErrorDelimiter --> End
    ErrorSize --> End
    ShowError --> End
    ShowSuccess --> End

    style Start fill:#e1f5ff
    style End fill:#e1f5ff
    style UpdateMode fill:#fff4e1
    style InsertMode fill:#e1ffe1
    style ErrorHeader fill:#ffe1e1
    style ErrorDelimiter fill:#ffe1e1
    style ErrorSize fill:#ffe1e1
    style ShowError fill:#ffe1e1
    style ShowSuccess fill:#e1ffe1
    style InsertDB fill:#e1ffe1
    style UpdateDB fill:#fff4e1