ISPANA API Server Setup Guide

This guide details the complete configuration, local development, and production deployment of the ISPANA Backend API Service (built with Dart Native and Shelf).

---

📋 1. Prerequisites

Before setting up the API, ensure you have the following installed on your target system:

  • Dart SDK (>= 3.0.0 but < 4.0.0)
  • MongoDB (Local instance or MongoDB Atlas account)
  • Nginx (For reverse proxying and SSL termination in production)
  • Systemd (For managing the backend daemon on Linux)

---

🛠️ 2. Environment Configuration (.env)

  1. Copy the .env.example file to .env:
  2.    cp .env.example .env
  3. Configure the variables:
# Server Configuration
PORT=8080
ENV=PROD # Options: DEV, PROD

# Database Configuration
# Set DEV_MODE=true to use Atlas; DEV_MODE=false to use local Mongo
DEV_MODE=false

# MongoDB Atlas (Cloud - Development)
MONGODB_ATLAS_URI=mongodb+srv://<user>:<password>@cluster0.example.mongodb.net/ispana_db?retryWrites=true&w=majority

# MongoDB Local (Server/Localhost - Production)
MONGODB_LOCAL_URI=mongodb://127.0.0.1:27017/ispana_db

# Security
JWT_SECRET=your_super_secret_jwt_key
ISO_SECRET_KEY=your_tenant_isolation_secret_key

# Email (SMTP) - Gmail Example
SMTP_USERNAME=your_email@gmail.com
SMTP_PASSWORD=your_gmail_app_password

Connections strings, JWT secrets, and SMTP credentials must never be committed to public repository. Ensure .env is listed in your .gitignore file.

---

🚀 3. Local Development

To run the API server locally:

  1. Fetch dependencies:
  2.    dart pub get
  3. Run the server:
  4.    dart bin/server.dart
  5. Verify the server is running by visiting:
  6.    http://localhost:8080/health

---

📦 4. Production Deployment

For production environments, compiling the Dart code to a native binary ensures maximum performance, minimal resource usage, and zero runtime package dependency.

Step 1: Compile Native Binary

Compile the server entrypoint to a self-contained executable binary:

dart compile exe bin/server.dart -o build/server

Step 2: Systemd Daemon Configuration

Create a systemd service file to manage the API process:

sudo nano /etc/systemd/system/ispana-api.service

Paste the following configuration:

[Unit]
Description=ISPANA Backend API Service
After=network.target mongodb.service

[Service]
Type=simple
User=ispana
WorkingDirectory=/var/www/ispana-api
ExecStart=/var/www/ispana-api/build/server
Restart=always
RestartSec=5
EnvironmentFile=/var/www/ispana-api/.env

[Install]
WantedBy=multi-user.target

Reload systemd daemon, start the service, and enable it to run at boot:

sudo systemctl daemon-reload
sudo systemctl start ispana-api
sudo systemctl enable ispana-api

---

🌐 5. Reverse Proxy Configuration (Nginx)

To serve the landing page, the web application, and reverse proxy the API requests under a single configuration, set up Nginx as follows.

Step 1: Create Nginx Config

Create a new server block:

sudo nano /etc/nginx/sites-available/ispana

Add the following site configuration:

server {
    listen 80;
    listen [::]:80;

    server_name ispana.com www.ispana.com;

    # ===== API (RECOMMENDED) =====
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Step 2: Enable Site and Reload Nginx

sudo ln -s /etc/nginx/sites-available/ispana /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Step 3: SSL Setup with Certbot

sudo certbot --nginx -d ispana.com -d www.ispana.com

---

⚠️ 6. Common Issues & Troubleshooting

Ensure the directory for file uploads exists and has correct permissions:

```bash

mkdir -p /var/www/ispana-api/storage/uploads/landmarks

chown -R ispana:ispana /var/www/ispana-api/storage

```

If you are using MongoDB Atlas, make sure that the server's public IP address is whitelisted in your MongoDB Atlas Dashboard's Network Access section.

FreeRADIUS Server Setup Guide

This guide details the complete configuration required to set up FreeRADIUS with the ISPANA Dart API for stateless dynamic client discovery and subscriber authentication.

---

📁 1. Client Configurations

/etc/freeradius/3.0/clients.conf

Configure localhost clients and ensure the directory for dynamic client definitions is included.

client localhost {
        ipaddr = 127.0.0.1
        proto = *
        secret = testing123
        # localhost isn't usually a NAS...
        nas_type = other        
        limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
        }
}

client localhost_ipv6 {
        ipv6addr        = ::1
        secret          = testing123
}

$INCLUDE clients.d/

---

🛠️ 2. Module Configurations

/etc/freeradius/3.0/mods-available/rest

Define the main rest module for subscriber authorize/accounting operations and the rest_nas module for dynamic client discovery.

rest {
        tls {
        }
        connect_uri = "http://127.0.0.1:8080/api"
        authorize {
                uri = "${..connect_uri}/radius/authorize"
                method = 'post'
                body = 'json'
                # Pass the pre-shared secret key for security in headers
                headers = 'Authorization: Bearer YOUR_RADIUS_REST_KEY'
                data = '{ "username": "%{User-Name}", "mac": "%{Calling-Station-Id}", "action": "authorize" }'
        }
        authenticate {
                uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=authenticate"
                method = 'get'
                tls = ${..tls}
        }
        preacct {
                uri = "${..connect_uri}/user/%{User-Name}/sessions/%{Acct-Unique-Session-ID}?action=preacct"
                method = 'post'
                tls = ${..tls}
        }
        accounting {
                uri = "${..connect_uri}/radius/accounting"
                method = 'post'
                body = 'json'
                headers = 'Authorization: Bearer YOUR_RADIUS_REST_KEY'
                data = '{ "username": "%{User-Name}", "sessionId": "%{Acct-Session-Id}", "status": "%{Acct-Status-Type}", "nasIp": "%{NAS-IP-Address}", "framedIp": "%{Framed-IP-Address}", "uploadOctets": "%{Acct-Input-Octets}", "downloadOctets": "%{Acct-Output-Octets}" }'
        }
        post-auth {
                uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=post-auth"
                method = 'post'
                tls = ${..tls}
        }
        pre-proxy {
                uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=pre-proxy"
                method = 'post'
                tls = ${..tls}
        }
        post-proxy {
                uri = "${..connect_uri}/user/%{User-Name}/mac/%{Called-Station-ID}?action=post-proxy"
                method = 'post'
                tls = ${..tls}
        }
        pool {
                start = ${thread[pool].start_servers}
                min = ${thread[pool].min_spare_servers}
                max = ${thread[pool].max_servers}
                spare = ${thread[pool].max_spare_servers}
                uses = 0
                retry_delay = 30
                lifetime = 0
                idle_timeout = 60
        }
}

rest rest_nas {
    connect_uri = "http://127.0.0.1:8080/api"

    authorize {
        # Query your Dart API nas endpoint passing the router's IP
        uri = "${..connect_uri}/radius/nas?ip=%{Packet-Src-IP-Address}"
        method = "get"
        body = "none"
    }
}

Enable the REST module by symlinking it:

ln -sf /etc/freeradius/3.0/mods-available/rest /etc/freeradius/3.0/mods-enabled/

---

🌐 3. Virtual Server Configurations

/etc/freeradius/3.0/sites-enabled/dynamic-clients

Define the wildcard client mapping and the virtual server responsible for querying the API and instantiating dynamic client routers.

The dynamic client module (rlm_dynamic_clients) expects to run inside a virtual server named exactly dynamic_clients. To satisfy FreeRADIUS's constraint that dynamically registered clients must match the virtual server of the network listener, we map the network wildcard client to default, and inside dynamic_clients we force FreeRADIUS-Client-Virtual-Server = "default".

# Define a catch-all network for dynamic lookups mapping directly to the default server
client dynamic_network {
    ipaddr = 0.0.0.0/0
    secret = dummy               
    virtual_server = default
    dynamic_clients = dynamic_clients

    limit {
        max_connections = 16
        lifetime = 0
        idle_timeout = 30
    }
}

# The hardcoded server block that performs the API lookup
server dynamic_clients {
    authorize {
        # 1. Fetch NAS info from Dart API
        rest_nas

        # 2. Map to "default" to match the parent network listener!
        update control {
            FreeRADIUS-Client-Shortname = "%{reply:FreeRADIUS-Client-Shortname}"
            FreeRADIUS-Client-Secret = "%{reply:FreeRADIUS-Client-Secret}"
            FreeRADIUS-Client-IP-Address = "%{reply:FreeRADIUS-Client-IP-Address}"
            FreeRADIUS-Client-NAS-Type = "%{reply:FreeRADIUS-Client-NAS-Type}"
            FreeRADIUS-Client-Virtual-Server = "default"
        }

        # 3. Instantiate the client in-memory
        dynamic_clients
    }
}

/etc/freeradius/3.0/sites-enabled/default

Enable subscriber authorization and accounting with the REST module.

Inside the authorize block, add the rest module:

authorize {
    ...
    # Query Dart API for subscriber credentials and speed limits
    rest
    ...
}

Inside the accounting block, add the rest module:

accounting {
    ...
    # Send accounting stats to Dart API
    rest
    ...
}

---

⚠️ 4. Crucial Gotchas & Cleanups

FreeRADIUS includes all files in /etc/freeradius/3.0/clients.d/ regardless of extension. Stale files like .save, .bak, or temp files will cause duplicate client definition conflicts and prevent FreeRADIUS from starting. Always clean the directory:

```bash

rm -f /etc/freeradius/3.0/clients.d/*.save

rm -f /etc/freeradius/3.0/clients.d/*.bak

```

Ensure no duplicate server definitions for dynamic_clients exist. If a duplicate server is defined elsewhere in the configuration, FreeRADIUS may compile the empty default block and ignore the custom lookup block.

---

🔍 5. Verification & Testing

Start FreeRADIUS in debug mode to trace requests, API calls, and authentication:

freeradius -X

ISPANA Client App Changelog — v0.0.7 Catatan Rilis Klien ISPANA — v0.0.7

a3 2026-07-24

Release App v0.0.6

ISPANA Client App Changelog — v0.0.6 Catatan Rilis Klien ISPANA — v0.0.6

a1 2026-06-12

Start of v0.0.6 Iteration

  • **Changes**:
  • [pubspec.yaml]: Bumped version to `0.0.6+70` to initiate v0.0.6 development.
a2 2026-06-15

Settings Menu with General, Brand, and Payment Gateway sub-menus.

  • **Changes**:
  • [settings_remote_data_source.dart]: Created settings remote data source.
  • [settings_repository.dart]: Created settings repository with input validation and audit logging for gateway changes.
  • [settings_controller.dart]: Created settings route controllers.
  • [vendor_controller.dart]: Registered settings router namespace.
  • [server.dart]: Wired settings backend modules.
  • [storage_service.dart]: Added theme and language settings persistence.
  • [vendor_features.dart]: Registered settings category and sub-features.
  • [vendor_drawer.dart]: Added drawer navigation mapping for settings.
  • [settings_service.dart]: Added settings API requests service.
  • [settings_provider.dart]: Added state provider for customizations and API sync.
  • [settings_management_page.dart]: Built tabbed settings page.
  • [main.dart]: Registered SettingsProvider globally and watched themeMode & locale.
  • [customer_dashboard_page.dart]: Added settings icon button to customer portal.
  • [ispana_dashboard_page.dart]: Added settings icon button to platform admin portal.
  • [pubspec.yaml]: Bumped version to `0.0.6+2`.
a3 2026-06-15

Settings Localization Integration.

  • **Changes**:
  • [app_localization.dart]: Created translation keys and English/Indonesian maps.
  • [settings_provider.dart]: Added translation triggers during language loading and setLanguage calls.
  • [main.dart]: Configured MaterialApp with localized delegates and initialized FlutterLocalization.
  • [settings_management_page.dart]: Applied localized strings on all tabs, fields, dropdowns, and buttons.
  • [vendor_drawer.dart]: Added localized labels for navigation list tiles and logout.
  • [pubspec.yaml]: Bumped version to `0.0.6+3`.
a4 2026-06-16

Localization Rule Enforcement.

  • **Changes**:
  • [15-localization-rule.md]: Created localization rule to enforce the use of `flutter_localization` and context-based String extensions.
  • [pubspec.yaml]: Bumped version to `0.0.6+4`.
a5 2026-06-17

Staff Management Localization.

  • **Changes**:
  • [app_localization.dart]: Added localization keys and translations for Staff, Roles, Employees, and related forms.
  • [vendor_features.dart]: Added `VendorFeatureLocalization` extension to dynamically localized feature titles.
  • [vendor_drawer.dart]: Simplified feature tile localization with new extension method.
  • [staff_management_page.dart]: Localized tab views, appBar title, and construction pages.
  • [role_management_page.dart]: Localized headers, buttons, cards, delete confirmations, and snackbars.
  • [employee_management_page.dart]: Localized cards, titles, delete confirmations, and text fields.
  • [role_form_page.dart]: Localized edit/create headers, validation snacks, role name input, permission categories, and segmented buttons.
  • [employee_form_page.dart]: Localized form fields (Full Name, Email, WhatsApp, Address, Status), validation, save actions, and status choices.
  • [pubspec.yaml]: Bumped version to `0.0.6+5`.
a6 2026-06-17

Maps and Landmark Management Localization.

  • **Changes**:
  • [app_localization.dart]: Added localization keys and translations for Landmark, Style, Connection, and Device forms.
  • [landmark_form_page.dart]: Localized form page titles, action buttons, tab layouts, and error/success alerts.
  • [landmark_connection_section.dart]: Localized section headers, photo upload widgets, distance fields, and list labels/tooltips.
  • [landmark_data_section.dart]: Localized dropdown labels, placeholder text, description fields, map picker tooltips, and validators.
  • [landmark_style_section.dart]: Localized owned-pole checkboxes, marker icon selectors, and color pickers.
  • [landmark_pop_form.dart]: Localized device lists, type dropdowns, connection forms, upstream configurations, and ports management.
  • [landmark_detail_sheet.dart]: Localized navigation headers, general details tabs, photo specs, hardware connections lists, and port specifications.
  • [pubspec.yaml]: Bumped version to `0.0.6+6`.
a7 2026-06-17

Landmark ODP Form Fixes.

  • **Changes**:
  • [landmark_controller.dart]: Parsed and forwarded `metadata` and `distanceKm` fields from request payloads.
  • [landmark_connection_section.dart]: Added unique ValueKey to `PhotoUploadWidget` and defined `onAttenuationPhotoChanged` callback parameter.
  • [landmark_pop_form.dart]: Assigned unique ValueKeys to device `PhotoUploadWidget` elements.
  • [landmark_form_page.dart]: Implemented `_onAttenuationPhotoChanged` callback to update attenuation photo URL in state, and passed `distanceKm` property when constructing direct save data.
  • [pubspec.yaml]: Bumped version to `0.0.6+7`.
a8 2026-06-17

Detail Sheet Image URLs Resolution.

  • **Changes**:
  • [landmark_detail_sheet.dart]: Imported `ApiConfig` and prepended `ApiConfig.baseUrl` prefix to relative photo paths for both attenuation signal and hardware device images.
  • [pubspec.yaml]: Bumped version to `0.0.6+8`.
a9 2026-06-17

Customer & Network Management Localization.

  • **Changes**:
  • [app_localization.dart]: Added `defaultKey` localization key and translations for English and Indonesian.
  • [radius_management_view.dart]: Localized card actions, delete confirmation dialogs, and snackbar messages.
  • [profile_management_view.dart]: Localized profile creation/update status alerts, delete dialog controls, search inputs, empty page warnings, and table card metadata.
  • [vpn_management_view.dart]: Localized add-vpn action, tunnel profile list labels, status indicators, deletion flows, and script copy commands.
  • [vpn_user_form.dart]: Localized form input field decorations, hint texts, password generators, validation notifications, dialog titles, and button options.
  • [pppoe_profile_form.dart]: Localized form input boxes, numeric formats, validators, pool assignments, headers, and action buttons.
  • [router_registration_form.dart]: Localized TabBar tabs, general details inputs, landmark select fields, hardware photos upload label, and script copy CLI alerts.
  • [pubspec.yaml]: Bumped version to `0.0.6+9`.
a10 2026-06-17

feat: localize language preferences, fix ODP form template

a11 2026-06-17

feat: fix env file for API reference

a12 2026-06-17

feat: fix env file for API reference part 2

a13 2026-06-23

feat: add Account settings and Change Password via Email OTP

  • **Changes**:
  • [app_localization.dart]: Added localized string keys and translations (EN/ID) for account and change password fields.
  • [vendor_features.dart]: Integrated settings_account sub-feature.
  • [auth_provider.dart]: Updated access verification to always allow account settings.
  • [auth_service.dart]: Integrated password change request helper.
  • [settings_management_page.dart]: Implemented AccountSettingsView widget with OTP verification flow.
a14 2026-06-23

fix: resolve OTP verification UNAUTHORIZED error & add spam warning

  • **Changes**:
  • [auth_middleware.dart]: Exempted `auth/change-password` from session token requirement since it validates body-based verification token.
  • [app_localization.dart]: Added `checkSpamWarning` key with translations.
  • [otp_dialog.dart]: Imported localization and displayed warning note about emails potentially arriving in the Spam/Junk folder.
  • [env_config.dart]: Added `01_API/.env` to the search paths so env config loads correctly under restructured folders.
a15 2026-06-24

Settings page layout refactoring to dynamic tab bar.

  • **Changes**:
  • [settings_management_page.dart]: Refactored to use dynamic DefaultTabController and ButtonsTabBar, displaying General settings (Theme/Language & Change Password) in the first tab ("Umum") to all users, and separate tabs for Brand Settings ("Merek") and Payment Gateway ("Gerbang Pembayaran") for authorized Vendor users.
  • [pubspec.yaml]: Bumped version to `0.0.6+15`.
a16 2026-06-26

Settings page cleanup, tooltip guidelines, and compact button refactoring.

  • **Changes**:
  • [app_localization.dart]: Added new localized string keys for brand settings inputs guidelines, hint texts, validator errors, and image labels.
  • [settings_management_page.dart]: Replaced the hardcoded active cooldown text with localized translation key using `_cooldownRemainingDays`, resolving the linter warning. Replaced the helper text and customer link card with a hover/tap-based help `?` tooltip button (`Icons.help_outline`) on the right side of the business name field. Refactored the Save Brand and Save Gateway buttons to be compact and colored using `AppTheme.landmarkMagenta` color.
  • [pubspec.yaml]: Bumped version to `0.0.6+16`.
a17 2026-06-26

Unified save button in settings AppBar actions and optional field validation removal.

  • **Changes**:
  • [settings_management_page.dart]: Declared and wired global keys for Brand and Payment Gateway settings views. Placed a unified Save button in the AppBar actions that dynamically triggers the active form's save action (Brand or Gateway) and displays a circular loading indicator during sync. Removed the bottom save buttons from both forms and removed validators from the WhatsApp and Address input fields.
  • [pubspec.yaml]: Bumped version to `0.0.6+17`.
a18 2026-06-26

Remove custom magenta colors from top-right save button to use default theme colors.

  • **Changes**:
  • [settings_management_page.dart]: Removed the custom `landmarkMagenta` color styling from the top-right AppBar save button so it defaults to the primary color from the active theme. Cleaned up unused `AppTheme` import.
  • [pubspec.yaml]: Bumped version to `0.0.6+18`.
a19 2026-06-26

Unified save button for General Settings/Account Password change tab.

  • **Changes**:
  • [settings_management_page.dart]: Declared a global key for Account settings and passed it down with a loading state callback. Included the General settings tab in the top-right AppBar save actions, displaying the "Change Password" text label and displaying circular loading progress while the OTP request is processing. Removed the bottom save button from the Account Settings password change form.
  • [pubspec.yaml]: Bumped version to `0.0.6+19`.
a20 2026-06-26

Unify save button label on General settings/Account tab.

  • **Changes**:
  • [settings_management_page.dart]: Unified the top-right save button label to display the default "Save" (or localized equivalent) instead of "Change Password" across all settings tabs.
  • [pubspec.yaml]: Bumped version to `0.0.6+20`.
a21 2026-06-26

Update generated MikroTik L2TP client command configuration.

  • **Changes**:
  • [vpn_management_view.dart]: Added `allow=mschap2` to the generated L2TP client config command to support MS-CHAPv2 authentication only.
  • [pubspec.yaml]: Bumped version to `0.0.6+21`.
a22 2026-06-26

Dissect generated MikroTik VPN script commands.

  • **Changes**:
  • [vpn_management_view.dart]: Split single script string into three distinct commands (Remove Client, Remove Route, Add Client) to copy/paste one by one in the UI.
  • [pubspec.yaml]: Bumped version to `0.0.6+22`.
a23 2026-06-26

Update VPN User card UI layout to match Radius style.

  • **Changes**:
  • [vpn_management_view.dart]: Redesigned `_buildUserCard` and `_buildCreateCard` layout dimensions to match `_buildRouterCard` (width 320, elevation 3, borderRadius 16, and anti-alias clip). Repositioned IP badges and actions. Wrapped write permissions on forms and toggle switches. Changed wrap alignment to start.
  • [pubspec.yaml]: Bumped version to `0.0.6+23`.
a24 2026-06-26

Refactor VPN User card actions and dialog layout integration.

  • **Changes**:
  • [vpn_management_view.dart]: Removed toggle switch from card. Censored password on card (`••••••••`). Added `InkWell` to open `VpnUserForm` in read-only mode on tap. Replaced bottom action buttons with a single "Edit" / "View Info" text button. Fixed static IP erasure bug on update.
  • [vpn_user_form.dart]: Refactored to support read-only mode, password obscuring with a visibility toggle, and tabbed interface containing general settings and the dissected MikroTik script.
  • [pubspec.yaml]: Bumped version to `0.0.6+24`.
a25 2026-06-26

Three-Stage Customer Onboarding & Permissions Alignment

  • **Changes**:
  • [customer_form_page.dart]: Implemented dynamic tabs list based on custom permissions and editability constraints. Added footprints visual timeline.
  • [app_localization.dart]: Defined and translated onboarding progress, pending status, by actor, and pppoe input validations.
  • [pubspec.yaml]: Bumped version to `0.0.6+25`.
a26 2026-06-27

Customer Deletion Workspace Sanitization & Dialog Overflow Fixes

  • **Changes**:
  • [customer_form_page.dart]: Wrapped tabView inside Expanded to enable proper scrolling inside dialogs and prevent bottom layout overflow on desktop/tablet views.
  • [customer_repository.dart]: Updated deleteCustomer logic to perform bidirectional connection cleanup, removing soft-deleted customer ONU port references from ODP/upstream landmarks to sanitize the vendor workspace.
  • [pubspec.yaml]: Bumped version to `0.0.6+26`.
a27 2026-06-27

Prefix-Matching & Landmark Connection Sanitization on Customer Deletion

  • **Changes**:
  • [customer_repository.dart]: Replaced exact port ID matching with highly robust prefix-matching (matching any port connection ID starting with `onu-$tokenId`). Added cleanup for the parent landmark `connections` list to remove both the `tokenId` and database `_id` of the soft-deleted customer's ONU.
  • [pubspec.yaml]: Bumped version to `0.0.6+27`.
a28 2026-06-27

Dynamic Status-Based Customer ONU Landmark Marker Colors

  • **Changes**:
  • [customer_repository.dart]: Updated customer lifecycle methods (`createCustomer`, `updateCustomer`, `isolateCustomer`, `activateCustomer`, and automatic isolation scheduler) to sync the active customer status to the ONU landmark metadata field `customerStatus`.
  • [map_display_view.dart]: Implemented dynamic color mapping for customer ONU category landmarks: green (active), yellow (isolated), red (disabled/suspended), and grey (onboarding/pending).
  • [pubspec.yaml]: Bumped version to `0.0.6+28`.
a29 2026-06-27

Connection Preservation & Field Merging on Onboarding Status Changes

  • **Changes**:
  • [customer_form_page.dart]: Implemented client-side field preservation in `_save()`. Unexposed tab values (such as coordinates, deviceSource, and PPPoE configuration details) are preserved from the original customer model if the active user tier lacks write permission for the connection tab, preventing accidental database overwrites with null values.
  • [customer_repository.dart]: Configured `_syncCustomerOnuLandmark` to conditionally update port connections and completely skip the bidirectional healing loop if `deviceSource` is passed as null (indicating a pure status update). Updated status changes (activation/isolation) to request status sync with `deviceSource: null` to preserve existing map wiring.
  • [pubspec.yaml]: Bumped version to `0.0.6+29`.
a30 2026-06-27

Fix Undefined isSuper Getter Compile Error in AuthProvider

  • **Changes**:
  • [auth_provider.dart]: Defined `isSuper` and `userTier` getters in the `AuthProvider` class.
  • [customer_form_page.dart]: Updated line 321 to use the clean `auth.isSuper` check.
  • [pubspec.yaml]: Bumped version to `0.0.6+30`.
a31 2026-07-06

Fix unused variable compiler warnings in CustomerManagementView

  • **Changes**:
  • [customer_management_view.dart]: Removed unused `hasWritePermission` and `auth` variables in the `build` method.
  • [pubspec.yaml]: Bumped version to `0.0.6+31`.
a32 2026-07-06

Add new customer floating action button only on customer onboarding panel

  • **Changes**:
  • [customer_management_view.dart]: Re-introduced `auth` and defined `hasWritePermission` and `showFab` variables inside the `build` method. Configured `Scaffold`'s `floatingActionButton` to show the register FAB only when on the `customer_onboarding` tab with active write permissions.
  • [pubspec.yaml]: Bumped version to `0.0.6+32`.
a33 2026-07-07

Unified Customer Onboarding & Complete Digital Signature Invoicing Flow

  • **Changes**:
  • [vendor_features.dart]: Consolidated onboarding submenu keys under `customer_onboarding`. Registered new `customer_invoices` key.
  • [app_localization.dart]: Registered English and Indonesian localizations.
  • [customer_management_page.dart]: Wired route mappings to display onboarding view and the new invoices table view.
  • [customer_management_view.dart]: Refactored onboarding panel with unified status progress dropdown filters and dropdown card selectors.
  • [pdf_invoice_service.dart] (Backend): Built PDF compiler featuring settings-based brand assets, verification QR codes, and Indonesian/English spelled total numbers.
  • [invoice_model.dart] (Backend & Frontend): Ported model supporting line items categorized by 'product' or 'discount'.
  • [invoice_repository.dart] (Backend): Tied auto-invoice generation hooks to status changes. Built audit log trackers and manual parameters.
  • [invoice_controller.dart] (Backend): Exposed CRUD endpoints, responsive verification HTML pages, and public unauthenticated PDF downloads.
  • [auth_middleware.dart] (Backend): Configured path bypasses to ensure validation links are publicly openable.
  • [invoice_service.dart] & [invoice_provider.dart] (Frontend): Added provider state management and HTTP request maps.
  • [invoice_view.dart] (Frontend): Built clean invoices list table view with download, deletion, and fallback WhatsApp sharing.
  • [invoice_form_page.dart] (Frontend): Implemented comprehensive manual invoice form supporting vendor information, custom customer selections, dates, line items, and bank details.
  • [pubspec.yaml]: Bumped version to `0.0.6+33`.
a34 2026-07-07

Invoice Form Grid Alignment, Localization & Delete Dialogue Upgrades

  • **Changes**:
  • [invoice_form_page.dart]: Redesigned entire form to a grid-aligned two-column layout. Added a checkbox to toggle between registered vendor customers and manual customer entry, parsing optional customerAddress and customerPhone.
  • [invoice_model.dart] (Backend & Frontend): Added optional `customerAddress` and `customerPhone` properties to track customer details directly inside invoice documents.
  • [pdf_invoice_service.dart] (Backend): Implemented complete PDF localization (`lang` parameter) for all titles/labels/headers. Formatted the vendor details block into a structured name, address, and combined phone/email block. Formatted the customer info block to prefix name with Tn./Mr. and render address, phone number, and ID details.
  • [customer_repository.dart] (Backend): Updated auto-invoice activation to capture the active customer's address and phone number.
  • [invoice_repository.dart] & [invoice_controller.dart] (Backend): Forwarded request language query parameters down to the PDF generation service.
  • [invoice_view.dart] (Frontend): Appended language parameters to download and resend URLs. Styled the invoice delete confirmation alert dialog to prevent barrier dismissals (`barrierDismissible: false`).
  • [pubspec.yaml]: Bumped version to `0.0.6+34`.
a35 2026-07-08

ObjectId Robust Parsing, Vendor Settings Fallback & Invoice Prefix Formatting

  • **Changes**:
  • [invoice_model.dart] & [customer_model.dart] (Frontend): Implemented robust `parseId` helper inside `fromMap` factory methods to extract hex strings from dynamic string or map representations of ObjectIds (resolves invoice deletion issues).
  • [invoice_repository.dart] & [customer_repository.dart] (Backend): Configured merged vendor custom settings map supporting flat root-level document property fallbacks when nested brand map settings are missing.
  • [invoice_repository.dart] & [customer_repository.dart] (Backend): Updated `_generateInvoiceNumber` to format invoice sequence prefixes using the full vendor business name in uppercase without spaces.
  • [pubspec.yaml]: Bumped version to `0.0.6+35`.
a36 2026-07-08

Filter Soft-Deleted Invoices on UI List

  • **Changes**:
  • [invoice_view.dart]: Added an explicit `isDeleted` exclusion filter to the local `filtered` list in the invoices table view widget.
  • [pubspec.yaml]: Bumped version to `0.0.6+36`.
a37 2026-07-08

Dynamic PDF Discount Calculations and Transfer Notes Formatting

  • **Changes**:
  • [pdf_invoice_service.dart] (Backend): Configured dynamic table item row formatting to automatically append localized `(Diskon)` or `(Discount)` tags and negative price/amount prefixes for discount types. Programmed real-time, dynamic product subtotal and discount calculations for summary columns. Injected the vendor's actual business name dynamically into the payment instructions note block.
  • [pubspec.yaml]: Bumped version to `0.0.6+37`.
a38 2026-07-08

Release v0.0.6+37

a39 2026-07-08

Release v0.0.6+37

a40 2026-07-08

Release v0.0.6+37

a41 2026-07-08

Release v0.0.6+37

a42 2026-07-10

Release v0.0.6+41 - Auto-Activation & Expired Customer Billing Integration

a43 2026-07-10

Release v0.0.6a43 - Add real-time server WIB clock to drawer footer

a44 2026-07-12

Complete WhatsApp (WAHA) Integration & Multi-Tenant Session Control

  • **Changes**:
  • [01_API/.env] & [01_API/.env.example]: Added WAHA server environment variables (`DEFAULT_WAHA_URL` and `DEFAULT_WAHA_API_KEY`).
  • [env_config.dart]: Exposed `defaultWahaUrl` and `defaultWahaApiKey` settings properties.
  • [whatsapp_service.dart]: Implemented robust WhatsApp API wrapper supporting typing indicators, seen confirmations, and staggered multi-recipient sending loops (anti-ban simulation).
  • [settings_remote_data_source.dart] & [settings_repository.dart]: Implemented multi-tenant database CRUD, settings caching, and critical action auditing for `whatsappGateway` maps.
  • [settings_controller.dart] & [server.dart]: Mounted WhatsApp control endpoints, secure QR code image streaming, and dynamic tenant isolation webhook.
  • [auth_middleware.dart]: Bypassed JWT token validation for incoming WhatsApp webhooks.
  • [customer_repository.dart] & [customer_data_source.dart]: Integrated WhatsApp message triggers during automatic isolation events and tracked opt-in customer interaction.
  • [app_localization.dart]: Registered WhatsApp Gateway English and Indonesian translations.
  • [vendor_features.dart]: Mounted new `settings_whatsapp_gateway` permission key.
  • [settings_service.dart] & [settings_provider.dart]: Built state controllers, polling loops, and HTTP mapping commands.
  • [settings_management_page.dart]: Implemented sleek form fields and connection status card (start/disconnect and real-time QR scanner updates).
  • [pubspec.yaml]: Bumped version to `0.0.6+44`.
a45 2026-07-12

Fix Undefined Variable invoiceNumber in Customer Repository

  • **Changes**:
  • [customer_repository.dart] (Backend): Declared `generatedInvoiceNumber` outside the conditional check for unpaid invoices to fix the `Undefined name 'invoiceNumber'` syntax error.
  • [pubspec.yaml]: Bumped version to `0.0.6+45`.
a46 2026-07-12

Fix BoxDecoration border compiler error

  • **Changes**:
  • [settings_management_page.dart]: Changed `BorderSide` to `Border.all` for decoration's `border` parameter.
  • [pubspec.yaml]: Bumped version to `0.0.6+46`.
a47 2026-07-12

Refactor settings page by splitting into multiple view files

  • **Changes**:
  • [settings_management_page.dart]: Cleaned up file by moving sub-views and helpers to widgets directory.
  • [section_card.dart]: Created generic card styling container.
  • [general_settings_view.dart]: Created General settings tab view component.
  • [brand_settings_view.dart]: Created Brand settings tab view component.
  • [payment_gateway_settings_view.dart]: Created Payment Gateway settings tab view component.
  • [account_settings_view.dart]: Created Account settings tab view component.
  • [whatsapp_gateway_settings_view.dart]: Created WhatsApp settings tab view component.
  • [pubspec.yaml]: Bumped version to `0.0.6+47`.
a48 2026-07-12

Refactor backend customer repository by splitting sync/scheduler logic

  • **Changes**:
  • [customer_repository.dart]: Extracted ONU landmark sync, PPPoE session disconnect, and automatic cron isolation scheduler logic.
  • [customer_sync_repository.dart]: Created a dedicated repository for sync actions, RADIUS disconnect triggers, and cron isolate schedule runs.
  • [server.dart]: Mounted and wired CustomerSyncRepository dependency and updated isolation timer commands.
  • [pubspec.yaml]: Bumped version to `0.0.6+48`.
a49 2026-07-12

Fix missing email parameters in CustomerModel constructor calls

  • **Changes**:
  • [customer_repository.dart]: Added required `email` parameter to the three `CustomerModel` constructor calls.
  • [pubspec.yaml]: Bumped version to `0.0.6+49`.
a50 2026-07-12

Fix named parameters error in updateCustomer signature

  • **Changes**:
  • [customer_repository.dart]: Added missing optional named parameters (`email`, `status`, `installationDate`, `activeDate`, `subscriptionEndDate`) to `updateCustomer` and mapped them in `CustomerModel`.
  • [pubspec.yaml]: Bumped version to `0.0.6+50`.
a51 2026-07-12

Remove unused _staffDataSource field from CustomerSyncRepository

  • **Changes**:
  • [customer_sync_repository.dart] (Backend): Removed the unused `_staffDataSource` field, import statement, and constructor parameter.
  • [server.dart] (Backend): Removed the `staffDataSource` argument from the instantiation of `CustomerSyncRepository`.
  • [pubspec.yaml]: Bumped version to `0.0.6+51`.
a52 2026-07-12

Responsive layout refactoring for WhatsApp settings view

  • **Changes**:
  • [whatsapp_gateway_settings_view.dart] (Frontend): Wrapped form inside `LayoutBuilder` to separate the WhatsApp status card (left column, fixed 360 width) and settings text form fields/toggles (right column) in widescreen displays, preventing UI stretching.
  • [pubspec.yaml]: Bumped version to `0.0.6+52`.
a53 2026-07-12

Fix settings router prefix matching and tenant isolation checking in backend API

  • **Changes**:
  • [settings_controller.dart] (Backend): Prepended `/<vendorId>/settings` prefixes to all sub-routes to align with VendorController's forwarding behavior, updated signatures, removed obsolete helper, and added strict JWT-based tenant isolation checks.
  • [pubspec.yaml]: Bumped version to `0.0.6+53`.
a54 2026-07-22

Fix Employee Role Menu & Action Permission Engine (Read-Only, Read-Write, Full Access)

  • **Changes**:
  • [role_form_page.dart] (Frontend): Removed unconditional base key saving in `RoleFormDialog._saveRole()`, ensuring only explicit level suffixes (`|read`, `|write`, `|delete`) are saved for roles.
  • [auth_provider.dart] (Frontend): Refactored `AuthProvider.hasPermission()` to enforce strict level checks (`|delete` only matches `|delete`, `|write` matches `|write` or `|delete`), and integrated `isSuper` check.
  • [landmarks_list_view.dart] (Frontend): Added `canWrite` and `canDelete` permission checks to show/hide Add and Delete buttons, and passed `isReadOnly` to landmark form.
  • [customer_management_view.dart] (Frontend): Replaced raw `auth.tier == 'vendor'` with `auth.isSuper || auth.hasPermission(...)` checks.
  • [vpn_management_view.dart] & [radius_management_view.dart] & [profile_management_view.dart] (Frontend): Differentiated `write` and `delete` permission checks for add/edit buttons vs. delete buttons.
  • [role_management_page.dart] (Frontend): Added permission checks to show/hide create role card and role delete button.
  • [auth_middleware.dart] (Backend): Injected permissions into request context and added `request.hasPermission()` helper extension.
  • [landmark_controller.dart] & [customer_controller.dart] & [invoice_controller.dart] & [staff_controller.dart] & [network_controller.dart] (Backend): Added server-side permission validation on POST/PUT/DELETE routes.
  • [pubspec.yaml]: Bumped version to `0.0.6+54`.
a55 2026-07-22

Landmark Label form field & Landmark search bar feature

  • **Changes**:
  • [app_localization.dart] (Frontend): Added localized keys (`landmarkLabel`, `landmarkLabelHint`, `searchLandmarksHint`) for EN and ID.
  • [map_landmark.dart] (Frontend): Added `label` field to `MapLandmark` model with `fromMap` and `toMap` serialization.
  • [landmark_model.dart] (Backend): Added `label` field to `LandmarkModel` with `fromMap` and `toMap` serialization.
  • [landmark_repository.dart] & [landmark_controller.dart] (Backend): Added `label` parameter parsing and persistence in landmark creation and update routes.
  • [landmark_data_section.dart] & [landmark_form_page.dart] (Frontend): Rendered Landmark Label form input above Description section in General tab of Landmark form.
  • [landmark_provider.dart] (Frontend): Updated `filteredLandmarks` search matching logic to query Name, Label, Theme/Category, and Description.
  • [landmarks_list_view.dart] (Frontend): Integrated top search bar TextField and added category tag and label display on list cards.
  • [pubspec.yaml]: Bumped version to `0.0.6+55`.
a56 2026-07-24

Fix Google Maps open directions launching on Android app

  • **Changes**:
  • [AndroidManifest.xml] (Android): Added `<intent>` queries for `https` and `geo` schemes under `<queries>` to comply with Android 11+ package visibility requirement.
  • [landmark_detail_sheet.dart] (Frontend): Updated `_openInGoogleMaps` to use directions URL (`/maps/dir/?api=1&destination=...`), set `LaunchMode.externalApplication`, and provided `geo:` scheme fallback with try-catch logic.
  • [pubspec.yaml]: Bumped version to `0.0.6+56`.
a57 2026-07-24

App update required download link redirection & localization

  • **Changes**:
  • [app_localization.dart] (Frontend): Added localized translation keys (`updateRequired`, `updateRequiredDesc`, `updateNow`, `contactSupport`) for EN and ID.
  • [update_required_page.dart] (Frontend): Updated update button handler to launch `https://swainet.id/download/` with `LaunchMode.externalApplication` and replaced hardcoded strings with `AppLocale` keys.
  • [pubspec.yaml]: Bumped version to `0.0.6+57`.
a58 2026-07-24

Fix Read-Write Landmark Role Permission Engine

  • **Changes**:
  • [auth_provider.dart] (Frontend): Added key alias mapping (`maps_management|landmarks` <-> `maps_management|landmarks_list`) in `hasPermission()`.
  • [landmarks_list_view.dart] (Frontend): Updated write/delete permission checks to accept both `landmarks_list` and `landmarks` keys.
  • [landmark_detail_sheet.dart] (Frontend): Added Edit IconButton to header row when `canWrite` permission is granted.
  • [auth_middleware.dart] (Backend): Added key alias mapping in `request.hasPermission()` helper extension.
  • [landmark_controller.dart] (Backend): Updated `_createLandmark`, `_updateLandmark`, and `_deleteLandmark` permission checks.
  • [pubspec.yaml]: Bumped version to `0.0.6+58`.
a59 2026-07-24

Universal Sub-Menu Permission Resolution Engine & Project Rule Update

  • **Changes**:
  • [09-authentification-rule.md] (Rules): Added Universal Sub-Menu Permission Resolution Rule requiring automatic candidate key expansion, parent category fallback, and hierarchical level enforcement.
  • [auth_provider.dart] (Frontend): Implemented full Universal Sub-Menu Permission Resolution Engine with comprehensive alias dictionary (`_permissionAliases`) and category parent fallback.
  • [auth_middleware.dart] (Backend): Implemented matching Universal Sub-Menu Permission Resolution Engine for backend API middleware.
  • [pubspec.yaml]: Bumped version to `0.0.6+59`.

ISPANA Client App Changelog — v0.0.5 Catatan Rilis Klien ISPANA — v0.0.5

a1 2026-05-26

Unified Search Overlay for MapDisplayView

  • **Changes**:
  • [map_display_view.dart]: Implemented advanced Search Bar with Google Maps link parsing, coordinate resolution, and real-time landmark autocomplete suggestions.
  • [pubspec.yaml]: Incremented version to `0.0.5+1`.
a2 2026-05-28

Customer Management System & CSV Import Wizard

  • **Changes**:
  • [customer_model.dart]: [NEW] Formulated Flutter Customer data structure.
  • [customer_service.dart]: [NEW] Formulated API client consumer wrapper.
  • [customer_provider.dart]: [NEW] Developed Provider mapping list filters and asynchronous tasks.
  • [customer_management_page.dart]: [NEW] Developed UI featuring ButtonsTabBar, manual CRUD, and CSV Wizard with parsed coordinate validations.
  • [vendor_features.dart] & [vendor_drawer.dart]: Added feature routes and registered view mapping.
  • [main.dart]: Registered `CustomerProvider` in MultiProvider.
  • [customer_dashboard_page.dart]: Added AppBar logout actions button and dynamic welcome message for Customer tier.
  • [pubspec.yaml]: Incremented app version to `0.0.5+2`.
a3 2026-05-28

Tabbed Customer Form Dialog & Map Picker Coordinates

  • **Changes**:
  • [customer_form_page.dart]: [NEW] Developed customer form inside a dialog using ButtonsTabBar with General, Connection, and Billing tabs, integrating a location picker.
  • [customer_management_page.dart]: Removed inline CustomerFormSheet widget, replaced _showCustomerForm with CustomerFormPage dialog show helper.
  • [pubspec.yaml]: Incremented app version to `0.0.5+3`.
a4 2026-05-28

Add phoneNumber to AuthModel & Propagation

  • **Changes**:
  • [auth_model.dart]: Added nullable `phoneNumber` field, mapping database queries.
  • [auth_repository_impl.dart]: Updated customer/vendor registrations to propagate contact numbers.
  • [vendor_repository_impl.dart]: Updated employee and customer creation/updates to propagate contact numbers to AuthModel registry.
  • [pubspec.yaml]: Incremented app version to `0.0.5+4`.
a5 2026-05-28

Semicolon Delimiter Auto-Detection in CSV Service

  • **Changes**:
  • [csv_service.dart]: Implemented dynamic delimiter auto-detection to support both comma (`,`) and semicolon (`;`) separators.
  • [pubspec.yaml]: Incremented app version to `0.0.5+5`.
a6 2026-05-28

CSV Schema Aliases for CamelCase and Lowercase Headers

  • **Changes**:
  • [customer_management_page.dart]: Added camelCase and lowercase aliases (e.g. `'realName'`, `'realname'`) to the CSV Import schema to make header parsing highly forgiving.
  • [pubspec.yaml]: Incremented app version to `0.0.5+6`.
a7 2026-05-28

Dropdown Form Value Sanitization on Edit

  • **Changes**:
  • [customer_form_page.dart]: Implemented robust data sanitization in `initState` to check and default any unrecognized billingType or status values (preventing assertion crashes on historically corrupted data).
  • [pubspec.yaml]: Incremented app version to `0.0.5+7`.
a8 2026-05-29

Automatic Customer ONU Landmark Mapping

  • **Changes**:
  • [vendor_remote_data_source.dart]: Added `findLandmarkByCustomerId` to fetch linked customer landmarks.
  • [vendor_repository_impl.dart]: Integrated `_syncCustomerOnuLandmark` helper in `createCustomer` and `updateCustomer` to automatically create, update, or soft-delete category `"ONU"` landmarks when coordinate data is registered or modified.
  • [pubspec.yaml]: Incremented app version to `0.0.5+8`.
a9 2026-05-29

Cascade Deletion of ONU Landmarks & Category Sanitization

  • **Changes**:
  • [vendor_repository_impl.dart]: Updated `deleteCustomer` to automatically soft-delete associated ONU landmarks from `data_landmark`. Changed backend-generated ONU category to lowercase `'onu'` to match existing dropdown items.
  • [landmark_form_page.dart]: Implemented robust category theme sanitization and safe default fallbacks to prevent Dropdown Form Field assertions when encountering unrecognized or uppercase categories on map views.
  • [pubspec.yaml]: Incremented app version to `0.0.5+9`.
a10 2026-05-30

Resubscription & Accidental Deletion Re-activation Support

  • **Changes**:
  • [vendor_remote_data_source.dart]: Added `findAnyCustomerByTokenId` to query records irrespective of isDeleted status.
  • [vendor_repository_impl.dart]: Redesigned `createCustomer` checking logic to support clean re-activation of historically soft-deleted records. Updates the existing soft-deleted document's fields and flips `isDeleted` to `false` rather than inserting a brand new duplicated document.
  • [pubspec.yaml]: Incremented app version to `0.0.5+10`.
a11 2026-05-30

Granular Customer Write Access & Read-Only Navigation

  • **Changes**:
  • [customer_form_page.dart]: Added `isReadOnly` parameter. Made all general, connection, and billing tab fields read-only when the flag is true. Disallowed Router/OLT Name editing permanently with descriptive helper text.
  • [customer_management_page.dart]: Wrapped Customer Cards in InkWell to allow quick read-only details navigation. Hid the Floating Action Button, delete buttons, and edit button triggers dynamically for employees without write permissions.
  • [pubspec.yaml]: Incremented app version to `0.0.5+11`.
a12 2026-05-30

Read-Only Form Styling & Map Picker Interactivity

  • **Changes**:
  • [customer_form_page.dart]: Swapped all `enabled: false` states to high-contrast `readOnly: true` text fields. Dynamically swapped dropdown boxes with formatted, copyable, read-only text fields. Enabled map viewer actions to open coordinates on the Map.
  • [location_picker.dart]: Added `isReadOnly` support. Hides the search layout and tap instructions when viewing, and disables coordinate pinning/relocating interactions.
  • [pubspec.yaml]: Incremented app version to `0.0.5+12`.
a13 2026-05-30

Unified Popup Role Forms & Collapsible Map Search Bar

  • **Changes**:
  • [role_form_page.dart]: Refactored `RoleFormPage` to `RoleFormDialog` to serve as a modern popup dialog. Integrated dynamic `SegmentedButton` selector allowing users to set granular access levels (Read-Only, Read-Write, and Full Access) on each permission choice, generating corresponding `|read`, `|write`, and `|delete` suffixes.
  • [role_management_page.dart]: Swapped full-page navigation (`Navigator.push`) for the popup dialog (`RoleFormDialog.show`).
  • [auth_provider.dart]: Augmented `hasAccessTo` and `hasPermission` methods to support suffix-aware evaluation and legacy compatibility.
  • [add_role_page.dart]: Deprecated and retired the redundant layout file.
  • [map_display_view.dart]: Stacked the collapsible search button and map layer switcher vertically in a column on the top right with identical button decorations, eliminating overlapping and ensuring optimal responsive layouts.
  • [pubspec.yaml]: Incremented app version to `0.0.5+13`.
a14 2026-05-30

Dynamic Height Self-Sizing Popup Dialogs

  • **Changes**:
  • [customer_form_page.dart]: Replaced standard full-page scaffold layout and bounded TabBarView container with a custom stateful `TabController` switching active views dynamically. Embedded inside a `Flexible` scrollview wrapper to allow self-sizing height adjustments that completely eliminate empty spaces.
  • [role_form_page.dart]: Replaced `Scaffold` container with `Material` and swapped layout's standard `Expanded` scrolling list wrapper with a `Flexible(ListView(shrinkWrap: true))` model, enabling role permission dialog heights to fit contents perfectly without padding spillages.
  • [pubspec.yaml]: Incremented app version to `0.0.5+14`.
a15 2026-05-30

Dynamic RADIUS Indexing & Dynamic NAS Discovery

  • **Changes**:
  • [auth_remote_data_source.dart]: Implemented index definitions on `data_routers` (`nasIp`), `data_customers` (`pppoeUsername`), and `active_sessions` (`sessionId`).
  • [vendor_controller.dart]: Outlined dynamic NAS IP router lookup endpoint `/radius/nas`.
  • [pubspec.yaml]: Incremented version to `0.0.5+15`.
a16 2026-05-30

Dynamic RADIUS Integration Bridge (rlm_rest) & Active Sessions Dashboard

  • **Changes**:
  • [radius_service.dart]: Formulated MikroTik speed limit VSA rate formatter, retired shell-based configuration syncing by stubbing `syncRouters` as a safe no-op.
  • [vendor_remote_data_source.dart]: Updated PPPoE subscriber and VPN credentials lookups, added real-time active sessions CRUD handlers for MongoDB database interaction.
  • [vendor_repository_impl.dart]: Registered active sessions tracking delegates and speed profile retrieval helpers.
  • [vendor_controller.dart]: Developed `/radius/authorize` POST endpoint with velocity speed profile injections, `/radius/accounting` session telemetry parser, and `GET /<vendorId>/radius/sessions` list getter.
  • [customer_service.dart]: Integrated active session HTTP fetcher wrapper.
  • [customer_provider.dart]: Formulated session provider lists and `fetchActiveSessions` action.
  • [vendor_features.dart]: Registered `active_sessions` sub-feature key.
  • [customer_management_page.dart]: Mounted dynamic active session view selector and developed premium `ActiveSessionsView` dashboard with real-time bandwidth metrics, statistics cards, and tabular subscriber lists.
  • [pubspec.yaml]: Incremented app version to `0.0.5+16`.
a17 2026-05-30

Network POE User Management Sub-Section & Code Cleanup

  • **Changes**:
  • a. [vendor_features.dart]: Registered the new `poe_user` sub-feature key under the Network Management category.
  • b. [pppoe_user_management_view.dart]: Developed the dynamic PPPoE user management view with search filtering, active/suspended status indicators, profile associations, and a creation wizard that automatically defaults passwords to match usernames.
  • c. [network_management_page.dart]: Imported and mounted the `PppoeUserManagementView` dynamically as a new tab inside the Network Management tabbed page.
  • d. [vendor_remote_data_source.dart]: Resolved the `ModifierBuilder.addAll()` compiler issue by dynamically chaining `.set()` operations.
  • e. [radius_service_test.dart]: Replaced the deprecated static clients config test with a new `formatMikrotikRateLimit` and no-op `syncRouters` test suite.
  • f. [pubspec.yaml]: Incremented app version to `0.0.5+17`.
a18 2026-05-30

Dynamic RADIUS Fallback Routing (`/api/radius` and `/api/user`)

  • **Changes**:
  • a. [auth_middleware.dart]: Exempted `/api/radius/` and `/api/user/` paths from JWT session checks to allow FreeRADIUS direct module queries.
  • b. [server.dart]: Mounted the `vendorController` under the `/api` prefix path fallback in Shelf, ensuring complete compatibility with the default local FreeRADIUS Rest config without requiring dynamic URL prefix overrides.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+18`.
a19 2026-05-30

Dynamic RADIUS Multi-Status Support (VPN & PPPoE)

  • **Changes**:
  • a. [vendor_controller.dart]: Refactored `_authorizeRadiusUserPost` to support both `'enabled'` (VPN tunnel users) and `'active'` (PPPoE customer subscribers) statuses, preventing status mismatch authentication denials.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+19`.
a20 2026-05-30

Dynamic RADIUS PPPoE Priority Swapping

  • **Changes**:
  • a. [vendor_remote_data_source.dart]: Swapped lookups in `findRadiusUserByUsername` to check the PPPoE customer collection first before checking the VPN collection. This resolves potential lookup collisions (e.g. where a stale VPN user named `ispana` overshadows a PPPoE customer named `ispana`).
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+20`.
a21 2026-05-30

Dynamic Client Virtual Server Assignment

  • **Changes**:
  • a. [vendor_controller.dart]: Added `FreeRADIUS-Client-Virtual-Server: default` to the `_getNASInfo` response payload. This instructs FreeRADIUS to automatically assign dynamically loaded clients to the fully pre-configured `default` virtual server for actual subscriber packet handling, eliminating the need to duplicate complex MS-CHAP and PAP auth configurations in the `dynamic-clients-server` block.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+21`.
a22 2026-05-30

Dynamic RADIUS Virtual Server Alignment

  • **Changes**:
  • a. [vendor_controller.dart]: Changed `FreeRADIUS-Client-Virtual-Server` from `default` to `dynamic_clients` inside `_getNASInfo`'s response to align the dynamically created client with the parent network listener virtual server context, resolving FreeRADIUS's client registration constraint.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+22`.
a23 2026-05-31

Customer Management Consolidation & Tab Cleanup

  • **Changes**:
  • a. [vendor_features.dart]: Removed redundant `active_sessions` and `poe_user` sub-feature key configurations from the global feature registry.
  • b. [customer_management_page.dart]: Deleted the 'Active Sessions' tab mapping and removed the entire inline `ActiveSessionsView` class.
  • c. [network_management_page.dart]: Deleted the 'POE User' tab mapping and removed the import of `pppoe_user_management_view.dart`.
  • d. [pppoe_user_management_view.dart]: Cleared and deprecated the redundant widget file.
  • e. [pubspec.yaml]: Incremented version to `0.0.5+23`.
a24 2026-05-31

Decoupled Customer Personal Identity & Subscriptions DB

  • **Changes**:
  • a. [auth_remote_data_source.dart]: Added `data_vendor_customers` collection schema indexes and created an automatic, high-performance database migration block to split any legacy unified customers into decoupled collections on boot.
  • b. [vendor_remote_data_source.dart]: Refactored all Customer CRUD methods to split-write personal profile data to `data_customers` and vendor-scoped subscription data to `data_vendor_customers`, while denormalizing fast rendering columns and mapping queries back to a unified transparent model for absolute frontend and system compatibility.
  • c. [pubspec.yaml]: Bumped version to `0.0.5+24`.
a25 2026-05-31

Decoupled Customer Personal Identity & Subscriptions

a26 2026-06-01

Migrated Remaining Customer and Network Feature Files & Updated Imports

  • **Changes**:
  • a. [radius_service.dart, pppoe_profile_service.dart, vpn_service.dart]: Migrated all remaining network-related services to `features/vendor/network/services/`.
  • b. [pppoe_profile_provider.dart, vpn_provider.dart]: Migrated all network-related providers to `features/vendor/network/providers/`.
  • c. [radius_management_view.dart, router_registration_form.dart, mikrotik_script_dialog.dart, pppoe_profile_management_view.dart, pppoe_profile_form.dart, vpn_management_view.dart, vpn_user_form.dart]: Migrated network widgets to `features/vendor/network/widgets/`.
  • d. [network_management_page.dart]: Migrated `NetworkManagementPage` to `features/vendor/network/pages/` and updated imports.
  • e. [vendor_drawer.dart, main.dart, photo_upload_widget.dart]: Updated import statements to absolute `package:ispana/...` paths targeting the newly vertical sliced customer, network, landmark, staff, and dashboard features.
  • f. [pubspec.yaml]: Incremented app version to `0.0.5+26`.
a27 2026-06-01

Multi-Tab Router Registration Form Redesign

  • **Changes**:
  • a. [vendor_remote_data_source.dart]: Added `findRouterByName` and system-wide global unique index checks on NAS IP.
  • b. [vendor_network_logic.dart]: Updated `createRouter` registration flow to support dual-collection updates (inserting NAS identity into `data_routers` and simultaneously syncing coordinate/device/port structure to `data_landmarks`, pushing to existing POP landmarks or creating new standalone ones).
  • c. [vendor_repository_impl.dart]: Adjusted delegate parameter mapping for `createRouter`.
  • d. [vendor_controller.dart]: Updated `_createRouter` handler to parse extra coordinates, POP attachment ID, and port collection payload.
  • e. [router_registration_form.dart]: Completely redesigned UI to feature a premium three-tab ButtonsTabBar form with General (NAS settings), Landmark (coordinates & coordinate locking on POP attachment), and Device (device image upload, upstream, and dynamic downstream Ether port mapping, splitter mode, and power attenuation levels).
  • f. [pubspec.yaml]: Incremented app version to `0.0.5+27`.
a28 2026-06-01

Unified Popup Header Layout for Router Registration Form

  • **Changes**:
  • a. [router_registration_form.dart]: Refactored layout structure from an `AlertDialog` to a unified top-header `Dialog` to match the customer and landmark form formats, placing the Cancel button (X) on the top left, the title in the center, and the SAVE/UPDATE text button on the top right.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+28`.
a29 2026-06-01

Refactored Router Registration form to unified popup layout

a30 2026-06-02

Backend Vertical Slice Domain Migration & Purged Monolithic Files

  • **Changes**:
  • a. [Staff Feature]: Extracted StaffDataSource, StaffRepository, and StaffController under `features/vendor/staff/` for decoupled employee and role domain management.
  • b. [Landmark Feature]: Extracted LandmarkDataSource, LandmarkRepository, and LandmarkController under `features/vendor/landmark/` for GIS and draft landmark management.
  • c. [Customer Feature]: Extracted CustomerDataSource, CustomerRepository, and CustomerController under `features/vendor/customer/` with integrated constructor-injected LandmarkDataSource ONU synchronization.
  • d. [Network Feature]: Extracted NetworkDataSource, NetworkRepository, and NetworkController under `features/vendor/network/` handling Router, PPPoE Profile, and Active RADIUS Sessions logic with purged L2TP/IPSec VPN logic.
  • e. [VendorController Gateway]: Refactored the core `VendorController` to serve as a high-performance gateway router delegating requests dynamically to the new domain-specific controllers.
  • f. [Server Dependency Wiring]: Updated `bin/server.dart` to instantiate and wire up all the new domain-isolated datasources, repositories, and controllers.
  • g. [Deprecation & Purge]: Purged and deprecated the old monolithic `vendor_remote_data_source.dart`, `vendor_repository_impl.dart`, `vendor_gis_logic.dart`, `vendor_network_logic.dart`, `vpn_service.dart`, `radius_service.dart`, and associated old data models in `features/vendor/data/` to ensure zero compilation or namespace conflict issues.
  • h. [pubspec.yaml]: Incremented app version to `0.0.5+30`.
a31 2026-06-02

Fixed Heights for Customer & Landmark Form Dialogs

  • **Changes**:
  • a. [customer_form_page.dart]: Swapped dynamic layout rebuilding with TabBarView inside custom fixed heights on desktop dialog views (`height: 450`) and responsive `Expanded` on mobile.
  • b. [landmark_form_page.dart]: Adjusted dialog constraints in `show()` helper from dynamic tall `maxHeight: 1000` to a consistent and stable fixed height `minHeight: 650, maxHeight: 650` for desktop views.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+31`.
a32 2026-06-02

Responsive Locked Heights using IndexedStack

  • **Changes**:
  • a. [customer_form_page.dart]: Replaced TabBarView with IndexedStack on CustomerFormPage, removing hardcoded SizedBox height limits to allow dynamic responsive shrink-wrapping of the tallest tab with zero bottom gaps and stable, locked dialog height transitions.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+32`.
a33 2026-06-02

Decoupled Customer Management Tab Sub-Features into Widgets

  • **Changes**:
  • a. [customer_management_page.dart]: Deconstructed monolithic page exceeding 800 lines into a clean and thin layout controller page.
  • b. [customer_management_view.dart]: [NEW] Extracted Customer Management ListView, search, filter query row, and customer CRUD dialog trigger wrapper.
  • c. [customer_import_view.dart]: [NEW] Extracted Customer CSV Import Wizard, schema validation definitions, and bulk database importation views.
  • d. [pubspec.yaml]: Incremented app version to `0.0.5+33`.
a34 2026-06-03

Premium Router Cards, FloatingActionButton, and Script Tab Refactoring

  • **Changes**:
  • a. [radius_service.dart]: Added `updateRouter` PUT API request helper.
  • b. [radius_management_view.dart]: Styled router cards to match Customer cards (rounded shapes, elevation, delete buttons, bottom edit button actions, and InkWell detail popups). Replaced register card with FloatingActionButton and added text search and status filter options.
  • c. [router_registration_form.dart]: Added `isReadOnly` support to lock coordinate picks, switch triggers, text fields, and port connection edits. Dynamic length TabController mounts a fourth "Script" tab for existing routers containing copyable CLI setups.
  • d. [mikrotik_script_dialog.dart]: Deprecated and retired dialog widget since CLI commands are now direct tab layouts.
  • e. [pubspec.yaml]: Incremented app version to `0.0.5+34`.
a35 2026-06-03

Premium PPPoE Profile Cards, Search Filtering, and Read-Only Form Support

  • **Changes**:
  • a. [pppoe_profile_form.dart]: Added `isReadOnly` logic that locks form inputs, dynamically adjusts dialog titles, hides submit/save buttons, and renames Cancel to Close.
  • b. [profile_management_view.dart]: Refactored list view layout to match other modules, including a search query bar, 320px width clickable profile cards (triggering read-only modal popups), bottom edit/view actions, and prominently displaying the formatted MikroTik rate-limit string.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+35`.
a36 2026-06-05

Robust Router Document Parsing & Detailed Fetch Error Feedback

  • **Changes**:
  • a. [router_model.dart]: Upgraded `RouterModel.fromMap` with safe-parsing and default fallback logic for ObjectId, DateTime, and boolean fields.
  • b. [radius_management_view.dart]: Added user-facing red SnackBar alerts inside `_fetchRouters` to surface network API, database type coercion, or schema errors immediately.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+36`.
a37 2026-06-05

Dynamic RADIUS IP Pool Assignment

  • **Changes**:
  • a. [network_controller.dart]: Modified the `_authorizeRadiusUserPost` controller handler to read the `ipPool` field from the resolved PPPoE Profile and dynamically inject it as `reply:Framed-Pool` in the RADIUS access response payload.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+37`.
a38 2026-06-05

MikroTik Setup Script Command Improvements

  • **Changes**:
  • a. [router_registration_form.dart]: Updated copyable CLI setup commands in the Script tab to include `/ppp aaa set use-radius=yes` alongside `/ppp profile` options, and added the default profile gateway IP configuration `/ppp profile set [find name=default] local-address=10.10.0.1` to prevent IPCP handshake failures.
  • b. [pubspec.yaml]: Incremented app version to `0.0.5+38`.
a39 2026-06-07

Customer Isolation & PPPoE System Profiles

  • **Changes**:
  • a. [pppoe_profile_model.dart / pppoe_profile.dart]: Introduced `isSystemProfile` field to flag and lock default/isolation profiles.
  • b. [customer_model.dart (Backend & Frontend)]: Added `subscriptionEndDate` and `isolationType` properties.
  • c. [network_data_source.dart / network_repository.dart]: Implemented dynamic lookup/creation and validation for system-managed profiles.
  • d. [customer_data_source.dart / customer_repository.dart]: Added manual `isolateCustomer` and `activateCustomer` methods with active session audit logging.
  • e. [customer_controller.dart]: Mounted `/isolate` and `/activate` action endpoints.
  • f. [network_controller.dart]: Integrated isolation redirection logic into RADIUS user authorization handler.
  • g. [customer_management_view.dart]: Added status-dependent Isolate/Activate actions, badges, and warning dialog flow.
  • h. [profile_management_view.dart / pppoe_profile_form.dart]: Restricted deletion and modification for system profiles.
  • i. [router_registration_form.dart]: Added the manual `ISPANA_ISOLATION_POOL` creation and isolation firewall/NAT redirect commands to the copyable setup script in the Script tab.
  • j. [pubspec.yaml]: Incremented app version to `0.0.5+39`.
a40 2026-06-07

Build Script Linters & MikroTik Queue Syntax Correction

  • **Changes**:
  • a. [build.ps1]: Standardized internal function naming (e.g. `Invoke-ApiBuild`, `Test-GitChanges`), corrected `$null` comparison ordering, and wrapped variables in subexpressions to prevent parse errors.
  • b. [router_registration_form.dart]: Implemented `ISPANA_SFQ` and `ISPANA_PARENT` queue configuration and removed the unsupported comment tag to prevent CLI syntax errors.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+40`.
a41 2026-06-07

RADIUS Group Mapping & Dynamic Queue Partitioning

  • **Changes**:
  • a. [network_controller.dart]: Included the `reply:Mikrotik-Group` attribute mapping in the RADIUS access response payload for both active and isolated users to map connections to PPP profiles on the router.
  • b. [router_registration_form.dart]: Updated PPP Profile commands to include a custom `on-up` script that dynamically assigns dynamic Simple Queues to their profile-defined parent queues.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+41`.
a42 2026-06-07

Automated RADIUS Session Disconnection (RADIUS Kick)

  • **Changes**:
  • a. [radius_service.dart]: Formulated `disconnectUser` using the standard `radclient` CLI utility to send RADIUS Disconnect-Requests on UDP port 3799.
  • b. [customer_repository.dart]: Wired `_attemptDisconnect` to invoke `disconnectUser` asynchronously right after updating customer status to `isolated` or `active`.
  • c. [pubspec.yaml]: Incremented app version to `0.0.5+42`.
a42 2026-06-07

Feat: automated RADIUS session termination

a43 2026-06-07

Feat: automated RADIUS session termination

a43 2026-06-07

Fix read-only routerName field in customer form to dropdown selector

a46 2026-06-09

Feat: customer isolation bt time

a47 2026-06-10

Manual Isolation Date & Auto-Isolation

a48 2026-06-10

Manual Isolation Date & Auto-Isolation

a49 2026-06-10

Support Minute and Hour Precision in Isolation Setup & Scheduler

  • **Changes**:
  • [server.dart]: Swapped auto-isolation periodic timer interval from 10 minutes to 1 minute for faster testing.
  • [customer_form_page.dart]: Added a time picker to `_pickActiveDate` and updated its display TextFormField to use `_formatDateTime` for full hour/minute precision.
a50 2026-06-10

Split Date and Time Fields in Customer Form

  • **Changes**:
  • [customer_form_page.dart]: Split the unified date and time fields for "Active Date" and "Isolation Date" into side-by-side Date (width flex 3) and Time (width flex 2) inputs, giving the user direct, explicit fields to configure and pick the hour and minute easily.
a51 2026-06-10

Manual Isolation Date (hour-minute) & Auto-Isolation

a52 2026-06-10

Fix Timezone Offset & Unpopulated Customer Fields in Expiry Check

  • **Changes**:
  • [customer_model.dart]: Changed `toMap()` to serialize all `DateTime` objects to UTC ISO strings. This fixes timezone offset discrepancies between local clients and the backend.
  • [customer_data_source.dart]: Updated `findExpiredActiveCustomers()` to join/lookup the customer personal profile fields, ensuring `tokenId` and name properties are fully populated for the PPPoE disconnect triggers.
a53 2026-06-10

Auto-Isolation Frequency Update

  • **Changes**:
  • [server.dart]: Updated background isolation scheduler timer frequency to 1 minute.
a54 2026-06-10

Self-Healing Database Migration & Expiry Check Repair

  • **Changes**:
  • [auth_remote_data_source.dart]: Added automatic String-to-Date type normalization and missing customer end date repair in `ensureIndexes()`.
  • [customer_data_source.dart]: Added diagnostic logs to print timezone/datetime states of all active customers during the scheduler run.
a55 2026-06-10

UTC Timezone Alignment in Frontend API Request

  • **Changes**:
  • [customer_service.dart]: Fixed timezone offset mismatch by converting `installationDate`, `activeDate`, and `subscriptionEndDate` to UTC before serializing them in API requests.
a56 2026-06-10

fixing isolation time zone

a57 2026-06-10

Frontend Parse DateTime Local Timezone Conversion

  • **Changes**:
  • [customer_model.dart]: Added `.toLocal()` conversion in `parseDateTime` for customer model deserialization to prevent timezone cascading shifts.
a58 2026-06-10

Version Bump for Verification

  • **Changes**:
  • [pubspec.yaml]: Bumped version to `0.0.5+58` for verification deployment.
a59 2026-06-10

RADIUS Disconnect Router Fallback

  • **Changes**:
  • [customer_repository.dart]: Added automatic router name fallback inside `_attemptDisconnect()` to resolve the disconnect target router when the customer's `routerName` is null or empty, using the vendor's single router configuration as a fallback.
a60 2026-06-10

Customer Status Silent Auto-Refresh

  • **Changes**:
  • [customer_provider.dart]: Added `silent` parameter support in `fetchCustomers()` to avoid showing full-screen loaders during background refreshes.
  • [customer_management_view.dart]: Added 30-second periodic background timer to automatically silent-refresh the customer statuses.
a61 2026-06-11

PPPoE and Isolation IP Pool Updates & Isolation Queue Nesting

  • **Changes**:
  • [router_registration_form.dart]: Changed default PPPoE local-address gateway to `192.168.0.1` and pool to `192.168.0.10-192.168.255.254`. Changed isolation pool to `10.200.0.2-10.200.255.254` and updated firewall and NAT redirect target subnets to `10.200.0.0/16`. Added simple queue `sub-ispana-isolation` as a child under `ISPANA_PARENT`. Added commands to create and configure the `ISOLATION` PPP profile with `parent-queue=sub-ispana-isolation`.
  • [pubspec.yaml]: Bumped version to `0.0.5+61` for iteration revision.
a62 2026-06-11

Decoupled Physical Upstream Connection (Device Source) from Logical PPPoE Authentication Router

  • **Changes**:
  • [customer_model.dart (Backend)]: Added nullable `deviceSource` string field.
  • [customer_model.dart (Frontend)]: Added nullable `deviceSource` string field and constructor/serializer mappings.
  • [customer_data_source.dart]: Updated `saveCustomer` and `updateCustomer` database operations to write and update the `deviceSource` key.
  • [customer_repository.dart]: Updated signature of `createCustomer` and `updateCustomer` to handle `deviceSource`, and added automated bidirectional port connection sync & healing in `_syncCustomerOnuLandmark`.
  • [customer_controller.dart]: Parsed `deviceSource` in POST/PUT API handlers.
  • [customer_service.dart]: Forwarded `deviceSource` key in API JSON payloads.
  • [customer_provider.dart]: Mapped `deviceSource` field when invoking service methods.
  • [customer_form_page.dart]: Integrated a search-enabled port picker dropdown for the "Device Source" connection field below "Router / OLT Name".
  • [pubspec.yaml]: Bumped version to `0.0.5+62` for iteration revision.
a63 2026-06-12

Idempotent MikroTik Setup Commands & PPP On-Up Braces Fix

  • **Changes**:
  • [router_registration_form.dart]: Upgraded all creation commands (IP pools, simple queues, parent queues, and isolation sub-queues) to be idempotent using `:if` checks and `set` fallback updates. Modified firewall and NAT rules to remove previous matches before recreating them. Wrapped PPP on-up script in curly braces `{}` to prevent immediate variable evaluation during pasting into the MikroTik command console.
  • [pubspec.yaml]: Bumped version to `0.0.5+63` for iteration revision.
a64 2026-06-12

Fixed Invalid Parent Queue Mismatch for Dynamic Interfaces

  • **Changes**:
  • [router_registration_form.dart]: Changed `sub-ispana-isolation` simple queue target from `10.200.0.0/16` to `0.0.0.0/0` (all traffic). This resolves the RouterOS validation error where a child queue targeting a dynamic interface (`<pppoe-username>`) was marked as invalid (red) when parented to a queue restricted only to an IP subnet.
  • [pubspec.yaml]: Bumped version to `0.0.5+64` for iteration revision.
a65 2026-06-12

Dynamic Simple Queue IP-Based Targeting Fix

  • **Changes**:
  • [router_registration_form.dart]: Changed `sub-ispana-isolation` simple queue target back to the user-requested isolation subnet `10.200.0.0/16`. Updated the PPP `on-up` script block to set the dynamic simple queue target to the client's assigned IP address using the built-in `$"remote-address"` variable. This satisfies the RouterOS parent/child IP subnet validation while preserving correct isolation IP constraints.
  • [pubspec.yaml]: Bumped version to `0.0.5+65` for iteration revision.
a66 2026-06-12

Fixed RouterOS on-up Script Syntax Error

  • **Changes**:
  • [router_registration_form.dart]: Reverted on-up script block to use double quotes (`on-up="..."`) as required by RouterOS CLI string assignments. Fixed client-side terminal variable evaluation by backslash-escaping all variable indicators (e.g. `\$interface`, `\$user`, `\$pName`, `\$parentQ`, `\$interfaceName`, `\$\"remote-address\"`) inside a Dart raw string (`r'...'`) to ensure the backslashes are preserved in the user-copyable UI console output.
  • [pubspec.yaml]: Bumped version to `0.0.5+66` for iteration revision.
a67 2026-06-12

Optimized PPP On-Up Script Length

  • **Changes**:
  • [router_registration_form.dart]: Shortened the `on-up` script command length from 432 to 279 characters by inlining the interface name retrieval and profile lookup. This prevents terminal paste operations from breaking the script string due to character wrapping buffer limits in certain terminal emulators (e.g. Winbox Console/Telnet).
  • [pubspec.yaml]: Bumped version to `0.0.5+67` for iteration revision.
a68 2026-06-12

Revised Payment Gateway TODOs & Roadmaps

  • **Changes**:
  • [TODO.md]: Shifted payment integration focus to Duitku instead of Tripay.
  • [roadmap.md]: Updated payment gateway roadmap and numbering to prioritize Duitku integration.
  • [pubspec.yaml]: Bumped version to `0.0.5+68`.
a69 2026-06-12

Final Release Build for v0.0.5

  • **Changes**:
  • [pubspec.yaml]: Bumped version to `0.0.5+69` for final v0.0.5 release.

ISPANA Client App Changelog — v0.0.4 Catatan Rilis Klien ISPANA — v0.0.4

a1 2026-05-21

Version Transition to v0.0.4

  • **Changes**:
  • [pubspec.yaml]: Bumped version to `0.0.4+1` to start the new development cycle.
  • [build.ps1]: Updated default target to `all` to build apk, web, and windows (exe) by default.
a2 2026-05-21

Transition to v0.0.4

a3 2026-05-21

v0.0.4 release

a4 2026-05-21

fix web base path

a5 2026-05-22

Google Maps Link Resolution Fix for Flutter Web (CORS Bypass)

  • **Changes**:
  • [auth_middleware.dart]: Made `/system/resolve-map-url` a public route bypassing JWT guards.
  • [system_controller.dart]: Implemented `/system/resolve-map-url` native proxy resolver endpoint on the backend.
  • [location_picker.dart]: Routed Google Maps URL resolution through the backend API first, with a native local fallback for mobile.
  • [pubspec.yaml]: Incremented app version to `0.0.4+5`.
a6 2026-05-22

Feat: fix map url getter link

a7 2026-05-25

Security fix

ISPANA Client App Changelog — v0.0.3 Catatan Rilis Klien ISPANA — v0.0.3

a1 2026-04-21

Topology Path Refinement & Version Transition

  • **Changes**:
  • **[pubspec.yaml]**: Bumped version to `0.0.3+1` to start the new development cycle.
  • **[map_display_view.dart]**:
  • Implemented `Device` grouping in the topology summary to collapse internal port hops.
  • Updated display format to `DEVICE • PORT X > PORT Y` for better readability.
  • Added a permanent **NAP ISP** destination at the end of the topology path.
a2 2026-04-21

Port Form UX Overhaul (Grid & Modals)

  • **Changes**:
  • **[landmark_pop_form.dart]**:
  • Replaced the vertical scrolling list of port forms with a compact **Status Grid** of square buttons.
  • Implemented a **Dynamic Color System**: Green (Empty), Orange (Partial), Red (Full).
  • Integrated a **Modal Port Editor** (Bottom Sheet) to manage descriptions, splitters, and connections individually.
a3 2026-04-21

Connectivity Bugfix (ID Collisions)

  • **Changes**:
  • **[map_landmark.dart]**: Updated `Port.generateId` to support an optional integer suffix for guaranteed uniqueness.
  • **[landmark_form_page.dart]**: Updated `_addPortToDevice` to pass the port loop index as a suffix, preventing duplicate IDs when adding multiple ports in a single batch.
a4 2026-04-21

UI Logic Synchronization

  • **Changes**:
  • **[map_display_view.dart]**: Synchronized `Topology Path` numbering with map landmark sequence. Multiple hops within the same landmark now share the same sequence badge, matching the markers displayed on the map.
a5 2026-04-21

Data Integrity (Bidirectional Link Healing)

  • **Changes**:
  • **[landmark_form_page.dart]**:
  • Implemented **Global ID Registry** during the save process to identify all valid port IDs across the entire vendor network.
  • Added **Local Cleanup Pass** to the form state to strip orphaned connection IDs from current devices before saving.
  • Added **Global Cleanup Logic** to the cross-landmark sync loop to "heal" external landmarks by removing dead IDs when their partners are deleted or changed.
a6 2026-04-21

Dual-Mode Path Tracing (Upward/Downward)

  • **Changes**:
  • **[landmark_provider.dart]**:
  • Renamed `startTrace` to `traceUpstream`.
  • Implemented `traceDownstream` with full tree traversal (BFS) and "Upstream Blocking" logic to follow the signal flow away from the NAP ISP.
  • Added branching support to highlight all downstream paths on the map.
  • **[landmark_detail_sheet.dart]**:
  • Added a **Cyan** trace button at the **Device Header** level for Upward tracing (to Internet).
  • Updated **Port-level** trace buttons to **Orange** and configured them for Downward tracing (to partners/branches).
a7 2026-04-21

Downstream Branching UI & NAP Visibility

  • **Changes**:
  • **[landmark_provider.dart]**:
  • Introduced `depth` tracking in `traceDownstream` to identify branching levels.
  • Implemented `isDownward` flag to automatically toggle UI behavior.
  • Updated numbering logic to use `depth` instead of list index for downward traces (siblings now share badge numbers).
  • **[map_display_view.dart]**:
  • **NAP Gateway Binding**: Automatically hides the `NAP ISP` card when in Downward mode.
  • **Visual Branching**: Added depth-based indentation for steps in the Topology Path.
  • **Separator Logic**: Hidden vertical lines between sibling nodes to clarify the tree structure.
a8 2026-04-21

Device Consolidation & UI Consistency

  • **Changes**:
  • **[map_display_view.dart]**:
  • Fixed the `_VisualHop` aggregation logic to ignore `depth` when grouping ports of the same device.
  • Restored the compact `Landmark • Port X > Port Y` row format for both upward and downward traces.
  • Ensures that even if a device has multiple signal hops internally, it is presented as a single logical landmark in the Topology Path list.
a9 2026-04-21

Landmark Draft & Approval System

  • **Changes**:
  • **[API]**:
  • Created `landmark_draft_model.dart` and updated `vendor_remote_data_source.dart` for the new `landmark_drafts` collection.
  • Implemented resolution logic in `vendor_gis_logic.dart` to merge approved drafts into the live `landmarks` collection.
  • **[LandmarkProvider]**:
  • Now fetches pending drafts and integrates them into `filteredLandmarks`.
  • Pending 'CREATE' drafts are tagged as `isDraft` for visual distinction.
  • **[Map UX]**:
  • **Ghosted Markers**: Implemented 0.5 opacity and gray-scale fallback for draft markers in `map_display_view.dart`.
  • Added '(Draft)' suffix to landmark labels on the map for clear identification.
  • **[Redirection Logic]**:
  • **LandmarkFormPage**: Technicians without `maps_management|approve` permission are now redirected to the draft submission workflow.
  • **LandmarkDetailSheet**: Added a Delete button; Technicians submit a 'DELETE' draft instead of a direct deletion.
  • **[Admin Review UI]**:
  • Created `landmark_drafts_list_view.dart` providing a dedicated interface for reviewing, approving, or rejecting proposed changes.
  • Updated `vendor_features.dart` and `maps_management_page.dart` to include the "Drafts" tab.
a10 2026-04-21

Landmark Draft Read-Only UI Expansion Phase

  • **Changes**:
  • **[landmark_form_page.dart]**: Integrated `isReadOnly` flag and propagated it to all child sections (`LandmarkDataSection`, `LandmarkConnectionSection`, `LandmarkStyleSection`, `LandmarkPopForm`). Disabled form submissions when read-only.
  • **[landmark_drafts_list_view.dart]**:
  • Made draft cards actionable.
  • Added routing to open `LandmarkFormPage` in read-only mode to preview the drafted network layout before approval.
  • **[map_display_view.dart]**:
  • Applied a 0.5 opacity ghosting effect to polylines/connections involving a draft landmark to visually differentiate pending topological links from active ones.
a11 2026-05-01

Landmark Photo Upload & Template Unification

  • **Changes**:
  • [map_landmark.dart]: Added `imageUrl` to `Device` model.
  • [photo_upload_widget.dart]: Created new reusable widget for camera/gallery upload.
  • [landmark_form_page.dart]: Unified JC and OTB with ODP template (Attenuation + Ports).
  • [landmark_connection_section.dart]: Added photo support for attenuation rows.
  • [landmark_pop_form.dart]: Added photo support for device-level configuration (excluding ODP/JC/OTB).
  • [landmark_provider.dart/service.dart]: Implemented `uploadImage` logic.
a12 2026-05-04

ODP & Infrastructure Reporting Modernization

  • **Changes**:
  • [map_landmark.dart]: Added attenuation fields (`output`, `loss`, `result`) and `distanceKm`.
  • [landmark_connection_section.dart]: Redesigned ODP section with single header photo, distance field, and percentage ratio row-fields.
  • [landmark_pop_form.dart]: Added dBm power tracking for OLT/Switch ports and ODP splitter ports.
  • [landmark_form_page.dart]: Implemented state management and bidirectional logic for the new reporting fields.
  • [API]: Updated `landmark_model.dart` and `vendor_gis_logic.dart` to persist distance and power metrics.
  • [landmark_pop_form.dart]: Restored the **Device Source (Port 0)** section for ODP/OLT infrastructure forms to allow upstream connection selection.
a13 2026-05-04

Landmark Form Modernization (Responsive Popup & Tabbed UI)

  • **Changes**:
  • [landmark_form_page.dart]:
  • Refactored into a **Tabbed UI** using `ButtonsTabBar` (General, Infrastructure, Hardware, Style).
  • Implemented `LandmarkFormPage.show()` for **Responsive Routing**: Full-page on mobile, Centered Popup on larger screens.
  • Added **Dynamic Header Title** that updates as the user types the landmark name.
  • [landmark_detail_sheet.dart/landmarks_list_view.dart/landmark_drafts_list_view.dart]: Updated to use the new `show()` method.
a14 2026-05-19

OLT and ODP Port Settings Preservation on Connection Update

  • **Changes**:
  • [landmark_form_page.dart]: Updated all port reconstruction operations (`_onPortSplitterChanged`, `_onPortRatioChanged`, `_onPortConnectedChanged`, local consistency pass, and global consistency healing loop) to preserve preexisting port labels, splitter configurations, and dBm attenuation metrics (`attenuationOutput`, `attenuationLoss`, `attenuationResult`) during connection syncs.
a15 2026-05-19

Maps Management Category Filter Dialog Modernization & RadioGroup Migration

  • **Changes**:
  • [maps_management_page.dart]: Migrated the category filter dialog (`_showFilterDialog`) to the modern, standard Flutter `RadioGroup` parent widget API. Centralized state properties (`groupValue`, `onChanged`) on the parent `RadioGroup` widget, eliminating all analyzer deprecation warnings on individual `RadioListTile` children.
a16 2026-05-19

Map Display Initializer Silent Freeze / Crash Fix

  • **Changes**:
  • [map_display_view.dart]:
  • Removed viewport fetch trigger (`addPostFrameCallback`) from `initState`.
  • Added safe `onMapReady` trigger to `MapOptions` inside the `FlutterMap` constructor to ensure the map controller is fully attached and ready.
  • Wrapped coordinate bounds retrieval inside `_fetchVisibleLandmarks` in a robust `try-catch` block to shield the app from unhandled layout exception freezes.
a17 2026-05-19

Content-Length Aware Responsive Button Padding Implementation

  • **Changes**:
  • [app_theme.dart]: Added a dynamic, centralized static helper `responsiveButtonPadding` which calculates proportional vertical and horizontal paddings dynamically based on text length and icon presence to ensure buttons never clip.
  • [landmarks_list_view.dart]: Bound the new `responsiveButtonPadding` helper to the "+ Add Landmark" button empty state.
a18 2026-05-19

Stateful Upstream Port Picker Search Implementation

  • **Changes**:
  • [landmark_pop_form.dart]: Implemented a fully stateful, real-time filtering logic inside `_showPortPicker` modal bottom sheet using a `StatefulBuilder` and persistent `TextEditingController` to keep focus/cursor position stable. Enables case-insensitive searching by landmark name, device name, and port labels instantly.
a19 2026-05-20

Landmark Detail Sheet UI/UX Tabbed Redesign

  • **Changes**:
  • [landmark_detail_sheet.dart]: Overhauled bottom sheet UI to present a modern, tabbed interface (Connection, Detail, Hardware) using ButtonsTabBar.
  • [pubspec.yaml]: Bumped app version to 0.0.3+19.
a20 2026-05-20

Landmark Detail Sheet Header Cleanup & Collapsible Hardware Specifications

  • **Changes**:
  • [landmark_detail_sheet.dart]:
  • Removed Edit & Delete IconButtons from the sheet header to lock data modifications strictly to the landmarks list/form sub-feature.
  • Extracted hardware items into a dedicated stateful `_HardwareDeviceCard` widget to support collapsible cards for each hardware.
  • Added expanding detailed views for each port inside the hardware cards using `ExpansionTile` widgets, displaying port labels, splitting configs, full attenuation specs (output/loss/result), and bidirectional connection pairs.
  • [pubspec.yaml]: Bumped app version to `0.0.3+20`.
a21 2026-05-21

Map Infinite Rebuild Loop and Sync I/O Freeze Fix

  • **Changes**:
  • [map_display_view.dart]:
  • Defined persistent `_tileProvider` state variable and initialized it in `initState` to avoid redundant synchronous cache and I/O checks inside the `build` method.
  • Changed `initialZoom` in `MapOptions` to use `_currentZoom` instead of hardcoded `12` to prevent layout re-synchronization mismatches.
  • Optimized the `onMapEvent` handler to silently update `_currentZoom` and only call `setState` when the active URL layer threshold actually crosses the `17.5` mark.
  • [location_picker.dart]:
  • Applied matching optimization to `onMapEvent` handler to only call `setState` when crossing the `17.5` zoom boundary.
  • [pubspec.yaml]: Bumped app version to `0.0.3+21`.
a22 2026-05-21

Exception-Free Map Controller Layout Initialization

  • **Changes**:
  • [map_display_view.dart]:
  • Added `_isMapReady` boolean state gate to safely guard `_mapController.camera` access.
  • Deferred the first `_fetchVisibleLandmarks` invocation inside `onMapReady` using `WidgetsBinding.instance.addPostFrameCallback`.
  • Re-introduced the persistent `_tileProvider` instance to eliminate redundant rebuild caching.
  • Integrated optimized zoom-boundary checking for `onMapEvent`.
  • [pubspec.yaml]: Bumped version to `0.0.3+22`.

ISPANA Client App Changelog — v0.0.2 Catatan Rilis Klien ISPANA — v0.0.2

a1 2026-03-30

Improving Auth Workflow - Mandatory Version Check

  • **Changes**:
  • **[pubspec.yaml]**: Added `package_info_plus: ^8.2.1` and bumped version to `0.0.2+1`.
  • **[auth]**:
  • Created `UpdateRequiredPage` to lock the UI when a mandatory update is pending.
  • Updated `AuthProvider` to check for versions during `checkAuthStatus`.
  • Integrated version lock into `AuthGateway`.
  • **[build.ps1]**: Added automation to sync the `pubspec.yaml` version to the API via `Invoke-RestMethod` when the `-Publish` flag is used.
  • **[Sync]**: Compatible with **ISPANA API v1.0.0a2**.
a2 2026-03-31

Project Documentation & Authentication Refinement

  • **Changes**:
  • **[README.md]**: Built comprehensive project documentation including feature sets, multi-tier access overview, and technical architecture.
  • **[pubspec.yaml]**: Standard version sync to `0.0.2+2`.
  • **[README.md]**: Created the central developer guide for the unified workspace and build automation (`build.ps1`).
a3 2026-03-31

Engineering Standards & File Consolidation

  • **Changes**:
  • **[Rule 00]**: Integrated the "File Consolidation & Simplicity" principle to avoid unnecessary file proliferation.
  • **[Rule 04]**: Added "File Organization" guidelines to prevent redundant sub-file naming and promote internal refactoring.
  • **[pubspec.yaml]**: Standard version sync to `0.0.2+3`.
a4 2026-04-02

Radius Status Visualization & Type Safety

  • **Changes**:
  • **[models]**: [NEW] `RouterModel` for structured data handling and liveness calculation.
  • **[widgets]**:
  • `RadiusManagementView`: Integrated `RouterModel` and added a pulse-animated **StatusPulse** indicator (Live/Recent/Offline).
  • `MikroTikScriptDialog`: Refactored to use `RouterModel` for safer command generation.
  • **[services]**: Updated `RadiusService` to return strongly-typed `RouterModel` objects.
a4 2026-04-05

Test alpha build

a5 2026-04-02

Automated Pulse Heartbeat UI

  • **Changes**:
  • **[MikroTikScriptDialog]**:
  • Updated script generator to use the new path-based pulse URL (no `?` required).
  • Added **Step 5: Enable Heartbeat** to automate the "Pipeline Pulse" via the MikroTik scheduler.
a6 2026-04-02

Feature Rollback & Abortion (Check Pipeline)

  • **Changes**:
  • **[RadiusManagementView]**: Reverted to Map-based logic and removed Pulse UI indicators.
  • **[MikroTikScriptDialog]**: Removed automated heartbeat scheduler (Step 5).
  • **[RadiusService]**: Reverted return types to `Map<String, dynamic>`.
  • **[router_model.dart]**: Deleted to remove dead code.
a7 2026-04-05

Router Operations Stability - Backend Sync Error Handling

  • **Changes**:
  • **[Backend Fix]**: API now handles FreeRADIUS sync failures gracefully, preventing snackbar errors during router add/update/delete operations.
  • **User Experience**: Router management UI now displays success messages reliably, with data persisting immediately without requiring hot-restart.
  • **Compatibility**: Compatible with **ISPANA API v1.0.0a9**.
a8 2026-04-05

Build Script Enhancement - Version Status Indicators

  • **Changes**:
  • **[build.ps1]**: Added `-Status` parameter for "a" (Alpha) and "b" (Beta) build indicators, following Rule 12 versioning standards.
  • **[Versioning]**: Now supports full `v.Major.Minor.Patch[Status][Revision]` format (e.g., `v.0.0.2a4` for alpha, `v.0.0.2b4` for beta).
  • **[Automation]**: Updated changelog entries and Git tags to include dynamic status indicators.
a9 2026-04-07

ISP Infrastructure Mapping - Node-based Port Connectivity

  • **Changes**:
  • **[Landmark Model]**: Refactored to support stable UUID-based Port IDs, decoupling connectivity from volatile landmark IDs.
  • **[Landmark Form]**:
  • Implemented a "Node-based" UI where every port is a selectable anchor.
  • Added **Bidirectional Synchronization** logic to automatically link ports across landmarks during save.
  • Introduced **NAP ISP (Internet Source)** as a built-in virtual connection target.
  • **[Map Display]**:
  • Replaced legacy connection lines with **Premium Gradient Polylines** that transition colors between source and target landmarks.
  • Implemented connection deduplication for a clean, performant map interface.
a10 2026-04-07

Port-level Topology Tracing & Visualization

  • **Changes**:
  • **[LandmarkProvider]**: Implemented ordered BFS traversal to capture sequential `TraceStep` data (Landmark, Device, Port) for the mapping topology.
  • **[MapDisplayView]**:
  • [NEW] **_TraceSummaryCard**: Floating bottom-center overlay showing the network topology path with scrolling for 4+ items.
  • [NEW] **_TracePulseEffect**: Added animated highlight for the start point of a trace path.
  • **Topology Indicators**: Integrated numerical badges (1, 2, 3...) to mark the sequence of landmarks on the map during tracing.
  • **UI Stability**: Fixed `RenderFlex` overflows on map markers by enlarging icons and wrapping labels in flexible containers.
  • **[LandmarkDetailSheet]**: Refactored to include port-level trace triggers and direct Google Maps navigation support.
a11 2026-04-12

Map Management Infrastructure & UX Modernization

  • **Changes**:
  • [map_landmark.dart]: Updated `Port` model with `upstreamPortId`, `downstreamPortIds`, `isSplitter`, and `splitterRatio`. Added `isOwnedPole` to `MapLandmark`.
  • [landmark_form_page.dart]: Implemented OTB template support and "Owned Pole" property handling.
  • [landmark_pop_form.dart]: Redesigned port connection UI, replaced "NODE" with "PORT", and implemented strict splitter connection limits.
  • [landmark_provider.dart]: Overhauled path tracing logic to support splitters, same-landmark connections, and port descriptions. Added search/filter state.
  • [map_display_view.dart]: Integrated "Owned Pole" symbols, updated marker labels, and removed redundant clear trace buttons.
  • [maps_management_page.dart]: Added global search, category filters, and a "Help Documentation" feature.
a12 2026-04-19

Unified Bidirectional Node Architecture & Targeted Shortest-Path Tracing

  • **Changes**:
  • **[Landmark Models]**:
  • Removed `upstreamPortId` and `downstreamPortIds` from `Port`, replacing them with `connectedPortIds` to fully transition to an undirected, unified bidirectional graph.
  • Removed `upstreamPortId` from the `Device` model. Consolidated all device up-links into an implicit `Port 0` structure.
  • **[landmark_pop_form.dart]**:
  • Removed redundant `Device Source (Upstream)` UI logic. Connections exclusively rely on port-to-port bindings.
  • Implemented UI culling to fully hide exhausted ports (`SizedBox.shrink()`) from dropdown sheets rather than just striking them out.
  • **[landmark_form_page.dart]**:
  • Adjusted the save loop to establish and verify symmetric bidirectional hooks simultaneously.
  • **[landmark_provider.dart]**:
  • Rewrote network mapping completely to function on undirected Port properties.
  • Upgraded `startTrace` to simulate hardware routing natively (treating `Port 0` as an internal local-loop bridge for any port on the device).
  • Replaced the scattershot trace algorithm with a targeted Shortest-Path BFS tracking directly toward `VIRTUAL-NAP-ISP`.
  • Integrated visualization masking logic to actively ignore reporting `Port 0` bridging steps, ensuring clean GUI readouts (`User1 > ODP1.port1 > pop1.switch1.port1 (splitter:2) > pop1.router1.port1 > NAP ISP`).
a13 2026-04-20

Network Path Tracing Logic Scrapping & UI Rollback

  • **Changes**:
  • **[landmark_provider.dart]**: Completely removed the BFS algorithm, `TraceStep` model, and all path tracing state variables (`_activeTraceIds`, etc.). Added placeholder comments and empty sections for future logic redesign.
  • **[map_display_view.dart]**:
  • Removed `_TracePulseEffect` and `_TraceSummaryCard` overlays.
  • Reverted marker and polyline styling to standard defaults (removed trace-dependent highlights, scales, and colors).
  • Cleaned up the `FlutterMap` stack to remove trace-specific layers.
  • **[landmark_detail_sheet.dart]**: Removed the "Trace Path" button from the port list entries.
a14 2026-04-20

Redesigned Network Path Tracing (Bidirectional Graph)

  • **Changes**:
  • **[landmark_provider.dart]**:
  • Re-implemented `startTrace` using a Breadth-First Search (BFS) and a **Virtual Device Hub** graph model.
  • Added support for intra-landmark multi-device traversal.
  • Filtered redundant virtual hops for clean breadcrumb generation.
  • **[map_display_view.dart]**:
  • Restored `_TracePulseEffect` and `_TraceSummaryCard` overlays.
  • Re-integrated marker highlighting, sequence badges (1, 2, 3...), and dimmed states for map markers.
  • Implemented trace-path polyline highlighting with gradient colors and thicker strokes.
  • **[landmark_detail_sheet.dart]**:
  • Restored the "Trace Path" trigger button on ports.
  • Enhanced connection breadcrumbs to show specific `Landmark > Device > Port` target details.
a15 2026-04-20

Tracing UX & Bidirectional Visibility Refinement

  • **Changes**:
  • **[landmark_detail_sheet.dart]**:
  • Added a dedicated **"Trace Uplink"** button in the Device Header. This allows users to trace the signal path directly from the device's source (Port 0) without searching the port list.
  • Implemented **Bidirectional Connection Lookup** in the port list. Ports now display both **Outgoing** (🔗 Out: ...) and **Incoming** (⬅️ Feed: ...) connections.
  • Fixed the perception bug where distribution ports (e.g., Router Port 1) appeared disconnected even when feeding other devices.
a16 2026-04-20

Simplified Tracing & Device Bridging

  • **Changes**:
  • **[landmark_provider.dart]**: Rewrote `startTrace` to use a direct bridged BFS model. All ports on a device now pass signal to each other, removing the need for specialized "Port 0" hub logic.
  • **[landmark_detail_sheet.dart]**: Hidden Port 0 from display and removed the dedicated "Trace Uplink" button in favor of unified port-to-port tracing.
  • **[landmark_form_page.dart]**: Implemented stable, timestamp-based ID generation for devices and ports (`dev-`, `port-`).
a17 2026-04-20

UI Precision & Ghost Connection Removal

  • **Changes**:
  • **[landmark_detail_sheet.dart]**: Removed the broad "incoming" connection scanner. Connections are now only displayed if they are explicitly defined on the port's own data, preventing "ghost" labels on empty ports.
a18 2026-04-20

Intra-Landmark Consistency & Logic Preservation

  • **Changes**:
  • **[landmark_form_page.dart]**:
  • [CRITICAL] Implemented "Local Consistency Pass" during save to automatically mirror internal links within the same landmark.
  • Optimized the save loop to perform full-vendor sync for off-screen landmarks.
  • **[landmark_detail_sheet.dart]**: Fixed nullable boolean type errors in the subtitle display.
a19 2026-04-20

Stable bidirectional tracing system finalized

ISPANA Client App Changelog — v0.0.1 Catatan Rilis Klien ISPANA — v0.0.1

a1 2026-03-30

Initializing Versioning System & Project Baseline

  • **Changes**:
  • **[12-app-versioning-rule.md]**: Created the official versioning and change log management rule.
  • **[pubspec.yaml]**: Updated project version to `0.0.1+1`.
  • **[TODO.md]**: Added priority tasks for Application Version Update tracking.
a2 2026-03-30

Multi-Platform Build Automation

  • **Changes**:
  • **[build.ps1]**: Created a universal PowerShell build script.
  • **[pubspec.yaml]**: Bumped build number to `0.0.1+2`.
a3 2026-03-30

Local-to-GitHub Release Automation

  • **Changes**:
  • **[build.ps1]**: Added `-Publish` flag to automate Git tagging, pushing, and GitHub Release creation using the `gh` CLI. Fixed internal function naming bug (`Build_Target`).
  • **[pubspec.yaml]**: Bumped build number to `0.0.1+3`.
a4 2026-03-30

Dual-Repository Automation & Log Relocation

  • **Changes**:
  • **[Log Relocation]**: Moved the `change_logs` folder from the root into the `ispana/` repository for better version tracking.
  • **[build.ps1]**:
  • Added `-Message` parameter for automated git commits.
  • Implemented dual-repository commit logic: automatically commits and pushes changes to both **ispana (Frontend)** and **API (Backend)** repositories.
  • Updated internal pathing to point to the new `ispana/releases/` and `ispana/change_logs/` folders.
  • **[pubspec.yaml]**: Bumped build number to `0.0.1+4`.
a5 2026-03-30

Build Script UI/UX & Encoding Fix

  • **Changes**:
  • **[build.ps1]**:
  • **UI/UX**: Converted `$Clean` and `$Publish` parameters to `[switch]` for easier command-line usage.
  • **Encoding Fix**: Removed emoji characters and updated function definitions to use explicit `Param()` blocks. This resolves parsing errors in standard Windows PowerShell (5.1) where variables were being skipped.
  • **Safety**: Added path checking and stronger quoting for cross-directory git commands.
  • **[pubspec.yaml]**: Bumped build number to `0.0.1+5`.
a6 2026-03-30

Finalizing Versioning & Release Integration

  • **Changes**:
  • **[pubspec.yaml]**: Bumped build number to `0.0.1+6`.
  • **[TODO.md]**: Marked the "Application Version Update" task as complete.
  • **[GitHub Releases]**: Verified full integration of the `gh` release workflow for both the Flutter App and the Backend API.

ISPANA Backend API Changelog — v1.0.0 Catatan Rilis API Backend ISPANA — v1.0.0

v1.0.0 2026-06-15

initial release of stable backend services

  • Exposed fully compliant RESTful authentication, login, and registration APIs.
  • Integrated FreeRADIUS synchronization and VPN control script interfaces.
  • Created decoupled MongoDB indexes for logically isolated multi-tenant operations.