AI Bank Reco

flowchart TD
    subgraph Stage1["Stage 1: Page Initialization"]
        A1["AIRecoBankOption.razor"] --> A2["OnInitializedAsync()"]
        A2 --> A3["GetUserRolesCnt() - Role Check"]
        A2 --> A4["GetAiFeatureCnt() - Feature Check"]
        A2 --> A5["BankCombo() - Fetch Banks"]
        A2 --> A6["BankRecoOption() - Init Dates"]
    end

    subgraph Stage2["Stage 2: User Action & Validation"]
        B1["User Action"] --> B2["Upload .xlsx Bank Statement"]
        B1 --> B3["Select Bank & Date Range"]
        B2 --> B4["ProcessReconciliation()"]
        B3 --> B4
        B4 --> B5["GetAIInsightsCredits()"]
        B4 --> B6["BankRecoValidate()"]
        B4 --> B7["AIRecoService.ProcessAiRecoBank()"]
    end

    subgraph Stage3["Stage 3: HTTP API Gateway"]
        C1["AIRecoService.cs"] -->|Multipart HTTP POST| C2["AIRecoController.cs"]
        C2 --> C3["AIRecoBankProcess()"]
    end

    subgraph Stage4["Stage 4: Backend AI Orchestration"]
        D1["AIRecoOrchestrator.cs"] --> D2["ReconcileBankAsync()"]
        D2 --> D3["BankRecoRepository.BankRecoModel() - Fetch Unreconciled ERP Rows"]
        D2 --> D4["BankRecoExtractionSkill.ExtractFromExcelAsync() - Parse Excel Statement"]
        D2 --> D5["BankRecoMatchingSkill.ExecuteMatchingAsync() - AI Matching Engine"]
        D2 --> D6["ClosedXML - Generate Report Excel File"]
        D2 --> D7["AIInsightsRepository - Deduct Credit & Insert Log"]
    end

    subgraph Stage5["Stage 5: Auto Download & Cleanup"]
        E1["AIRecoBankOption.razor"] -->|NavManager.NavigateTo| E2["FileDownloader.cs"]
        E2 --> E3["DownloadFile()"]
        E3 --> E4["ReadAllBytesAsync()"]
        E3 --> E5["System.IO.File.Delete() - Delete File From Disk"]
        E3 --> E6["Return File Stream Attachment to Browser"]
    end

    Stage1 --> Stage2
    Stage2 --> Stage3
    Stage3 --> Stage4
    Stage4 --> Stage5