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

a117 2026-09-01

Focus: 01092026

Git Commit Tag: ispana-v0.0.7a117
a116 2026-08-31

Focus: Upgrade Default WhatsApp Invoice Notification Template

  • a. [whatsapp_gateway_settings_view.dart]: Updated default notification template to structured multi-line /tagihan format with business name, date, invoice number, amount, status, and payment link.
Git Commit Tag: ispana-app-v0.0.7a116
a115 2026-08-31

Focus: Auto-Send Invoice Dispatch Hardening & Deduplication Separation

  • a. [whatsapp_history_datasource.dart]: Added hasAutoInvoiceMessage to specifically check for auto-source messages, ensuring manual WhatsApp messages do not falsely block automatic invoice delivery.
  • b. [customer_sync_repository.dart]: Cleaned duplicate code blocks in checkAndIsolateExpiredCustomers, wrapped WhatsApp dispatch in localized try-catch with structured logs, and ensured phone fallback resolution.
  • c. [customer_repository.dart]: Added try-catch and status logging around manual isolation WhatsApp dispatch.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+115.
Git Commit Tag: ispana-v0.0.7a115
a114 2026-08-31

Focus: ROOT CAUSE FIX — Brace Mismatch Preventing API Compilation

  • a. [customer_sync_repository.dart]: Fixed broken brace structure (extra } from prior onlySendToInteracted removal) that prevented the entire API from compiling. Server was running stale pre-fix code.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+114.
Git Commit Tag: ispana-v0.0.7a114
a113 2026-08-31

Focus: Robust Expiry Date Type Evaluation

  • a. [customer_data_source.dart]: Added dual support for DateTime and String ISO-8601 formats in findExpiredActiveCustomers query filter.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+113.
Git Commit Tag: ispana-v0.0.7a113
a112 2026-08-30

Focus: Syntax and Brace Alignment in Sync Repository

  • a. [customer_sync_repository.dart]: Removed extraneous closing brace in isolated customer iteration loop.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+112.
Git Commit Tag: ispana-v0.0.7a112
a111 2026-08-30

Focus: Unconditional Invoice Delivery on Isolation

  • a. [customer_repository.dart & customer_sync_repository.dart]: Removed chat interaction gate (onlySendToInteracted) for transactional customer isolation billing notices.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+111.
Git Commit Tag: ispana-v0.0.7a111
a110 2026-08-30

Focus: Customer Phone Fallback Resolution on Auto-Billing

  • a. [customer_data_source.dart]: Corrected non-empty string fallback for customer phone, name, and address to prevent empty string overrides.
  • b. [customer_repository.dart]: Hardened phone number resolution in isolation flow.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+110.
Git Commit Tag: ispana-v0.0.7a110
a109 2026-08-30

Focus: Verification and Compilation Readiness of Auto-Billing

  • a. [customer_repository.dart]: Resolved compilation error and verified immediate auto-send dispatch.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+109.
Git Commit Tag: ispana-v0.0.7a109
a108 2026-08-30

Focus: Import Cleanup in Customer Repository

  • a. [customer_repository.dart]: Added missing WhatsappService import.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+108.
Git Commit Tag: ispana-v0.0.7a108
a107 2026-08-30

Focus: Immediate Auto-Billing WhatsApp Dispatch & Phone Parsing

  • a. [customer_sync_repository.dart & customer_repository.dart]: Switched auto-send bill dispatch to immediate sendMessage and strengthened non-empty phone fallback.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+107.
Git Commit Tag: ispana-v0.0.7a107
a106 2026-08-30

Focus: Auto-Generate Missing Invoices for Isolated Customers

  • a. [customer_sync_repository.dart]: Added missing invoice auto-generation during isolated customer sync loop before WhatsApp queueing.
  • b. [customer_repository.dart]: Allowed idempotent isolation without throwing exception when customer is already marked isolated.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+106.
Git Commit Tag: ispana-v0.0.7a106
a105 2026-08-30

Focus: WhatsApp Gateway Null Unwrapping Fix in Auto-Billing

  • a. [customer_sync_repository.dart & customer_repository.dart]: Fixed runtime crash caused by force unwrapping null whatsappGateway during template parsing.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+105.
Git Commit Tag: ispana-v0.0.7a105
a104 2026-08-30

Focus: Auto-Billing Trigger & Setting Fallbacks

  • a. [customer_repository.dart & customer_sync_repository.dart]: Made auto-send invoice evaluation active by default when WhatsApp gateway is available.
  • b. [whatsapp_gateway_settings_view.dart]: Set default auto-send switch state to enabled.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+104.
Git Commit Tag: ispana-v0.0.7a104
a103 2026-08-30

Focus: Isolated Customer Auto-Billing Sync & Interaction History Resolution

  • a. [whatsapp_history_datasource.dart]: Added hasHistoryWithPhone and hasRecentInvoiceMessage queries.
  • b. [customer_repository.dart]: Enhanced hasInteracted resolution during customer isolation to verify existing chat history.
  • c. [customer_sync_repository.dart]: Extended periodic scheduler to automatically catch isolated customers with unpaid invoices and auto-queue invoice bills.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+103.
Git Commit Tag: ispana-v0.0.7a103
a102 2026-08-30

Focus: Auto-Send Bill for Isolated Customers & Public Invoice Link Fix

  • a. [auth_middleware.dart]: Allowed public route access to /verify/invoice without JWT token requirements to prevent 401 Unauthorized errors on public invoice lookup.
  • b. [invoice_controller.dart & server.dart]: Mounted public landing portal at /verify/invoice for direct visitor lookups.
  • c. [customer_repository.dart & customer_sync_repository.dart]: Corrected MongoDB ObjectId hex string extraction (.oid) and refined WhatsApp invoice bill auto-dispatch template parameters.
  • d. [whatsapp_send_dialog.dart & customer_management_view.dart]: Enabled customer ID auto-matching for bill templates, automatic invoice pre-fetching, and graceful link placeholders when invoices are not yet generated.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+102.
Git Commit Tag: ispana-v0.0.7a102
a101 2026-08-30

Focus: Settings Remote Data Source Clean Integration

  • a. [customer_repository.dart]: Connected _settingsDataSource to fetch vendor branding and WhatsApp gateway configurations during customer isolation.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+101.
Git Commit Tag: ispana-v0.0.7a101
a100 2026-08-30

Focus: ObjectId toHexString Deprecation Replacement

  • a. [customer_repository.dart & customer_sync_repository.dart]: Replaced deprecated toHexString() calls on ObjectId with .oid getter.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+100.
Git Commit Tag: ispana-v0.0.7a100
a99 2026-08-30

Focus: Active Invoice Identifiers Declaration Scope

  • a. [customer_sync_repository.dart]: Declared activeInvoiceNum and activeInvoiceId in outer scope before invoice existence evaluation.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+99.
Git Commit Tag: ispana-v0.0.7a99
a98 2026-08-30

Focus: EnvConfig publicDomain Property

  • a. [env_config.dart]: Added publicDomain getter with environment/fallback support for invoice verification links.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+98.
Git Commit Tag: ispana-v0.0.7a98
a97 2026-08-30

Focus: CustomerModel WhatsApp Interacted Fields & Sync Ternary Fix

  • a. [customer_model.dart]: Added whatsappInteracted and whatsappInteractedAt fields, constructor params, and serialization mappings.
  • b. [customer_sync_repository.dart]: Simplified activeInvoiceId assignment to remove nested async condition.
  • c. [whatsapp_history_view.dart]: Removed unused isFailed variable and wrapped nested ternary expression in parentheses.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+97.
Git Commit Tag: ispana-v0.0.7a97
a96 2026-08-30

Focus: Server Dependency Declaration Order Fix

  • a. [server.dart]: Moved customerDataSource instantiation before settingsController initialization to fix unassigned variable error.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+96.
Git Commit Tag: ispana-v0.0.7a96
a95 2026-08-30

Focus: Auto-Billing for Isolated Customers, 3-Minute WAHA Queue, and WhatsApp Chat Localization

  • a. [customer_repository.dart & customer_sync_repository.dart]: Implemented automatic unpaid invoice generation under category billing when customer isolation occurs (manual and cron-scheduled).
  • b. [whatsapp_history_datasource.dart & whatsapp_history_repository.dart]: Implemented persistent message queue engine with guaranteed 3-minute (180s) intervals per vendor to prevent WhatsApp anti-ban triggering.
  • c. [whatsapp_history_view.dart]: Added support for QUEUED message status badge with countdown/interval indicators and localized labels.
  • d. [app_localization.dart]: Added missing localization keys for WhatsApp chat template selection, recipient labels, status badges, and error/success notifications.
  • e. [whatsapp_send_dialog.dart]: Fully localized manual WhatsApp chat form and harmonized /tagihan shortcut template to dynamically render official invoice details, formatted amount, and verification/payment link.
  • f. [pubspec.yaml]: Bumped version to 0.0.7+95.
Git Commit Tag: ispana-v0.0.7a95
a94 2026-08-30

Focus: VendorDrawer Parameter Fix

  • a. [finance_management_page.dart]: Removed undefined currentRoute parameter in VendorDrawer invocations.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+94.
Git Commit Tag: ispana-v0.0.7a94
a93 2026-08-30

Focus: Finance Management Feature Type Correction

  • a. [finance_management_page.dart]: Replaced VendorSubFeature type with VendorFeature and guarded subFeatures nullability.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+93.
Git Commit Tag: ispana-v0.0.7a93
a92 2026-08-30

Focus: Missing Table Column Localization Keys in AppLocale

  • a. [app_localization.dart]: Added missing contactInfo, locationInfo, pppoeUser, and pppoePassword constants and corresponding English / Indonesian translations.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+92.
Git Commit Tag: ispana-v0.0.7a92
a91 2026-08-30

Focus: Code Sanitization, Localization Duplicates Removal, and Invoice Integration Unification

  • a. [app_localization.dart]: Removed duplicate invoices string key definitions and duplicate entries from English and Indonesian locale maps.
  • b. [customer_management_view.dart]: Added missing intl package import and verified column and status handlers.
  • c. [invoice_view.dart & invoice_form_page.dart]: Unified authentic rich Invoice Form and Table view with category routing ('invoice' / 'billing'), Tripay online payment dialog, WhatsApp direct resend, and live 72h settlement countdown badge.
  • d. [finance_management_page.dart]: Wired Finance Management tabs directly to the unified InvoiceView with permission checks.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+91.
Git Commit Tag: ispana-v0.0.7a91
a90 2026-08-30

Focus: Finance Management Menu, Customer Table Expansion, 72h Tripay Settlement, and Billing Separation

  • a. [vendor_features.dart & app_localization.dart]: Relocated Invoices from Customer Management to new Finance Management menu with sub-features Invoices (manual creation) and Billing (recurring auto-generated). Added localized keys.
  • b. [customer_management_view.dart]: Separated PPPoE User and PPPoE Profile into dedicated columns and added Active Date and Isolate Date table columns.
  • c. [invoice_model.dart & payment_callback_controller.dart]: Added category, paidAt, settlementDueAt fields; updated Tripay payment callback to set status to 'settle' with a 72-hour settlement due countdown.
  • d. [settlement_timer_badge.dart & invoice_list_view.dart & invoice_form_page.dart & finance_management_page.dart]: Created full vertical slice for Finance Management with dynamic ButtonsTabBar navigation, live 72h settlement countdown timer, and arbitrary invoice form creation.
  • e. [vendor_drawer.dart]: Wired routing to FinanceManagementPage.
  • f. [pubspec.yaml]: Bumped version to 0.0.7+90.
Git Commit Tag: ispana-v0.0.7a90
a89 2026-08-30

Focus: WhatsApp Gateway UX Direct Visibility & WAHA Session In-App Restart Capability

  • a. [whatsapp_gateway_settings_view.dart]: Removed top toggle switch and collapsed layout, converting WhatsApp Gateway into a direct static settings page. Added dedicated FAILED/ERROR session status handling and in-app Restart Session buttons.
  • b. [settings_provider.dart & settings_service.dart]: Added restartWahaSession / restartWhatsAppSession client methods.
  • c. [settings_controller.dart & whatsapp_service.dart]: Implemented POST /settings/whatsapp-gateway/session/restart and auto-recovery restart fallback on 409/stuck WAHA sessions.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+89.
Git Commit Tag: ispana-v0.0.7a89
a88 2026-08-30

Focus: Customer Management & Network Management Read-Only Permission Sanitization

  • a. [customer_management_view.dart]: Removed auth.tier == 'vendor' bypass; gated Edit button, Isolate/Activate/Delete popup menu, Onboarding status quick dropdown, CSV Import, and Add FAB with strict hasWritePermission and hasDeletePermission.
  • b. [invoice_view.dart]: Removed vendor tier bypass; gated Delete Invoice action with hasDeletePermission and Buat Invoice FAB with hasWritePermission.
  • c. [whatsapp_history_view.dart]: Gated Send WhatsApp FAB with canWrite permission.
  • d. [customer_controller.dart, invoice_controller.dart, network_controller.dart]: Enforced 403 Forbidden checks on all mutating API routes (customers, invoices, routers, PPPoE profiles, isolation profiles, VPN users).
  • e. [pubspec.yaml]: Bumped version to 0.0.7+88.
Git Commit Tag: ispana-v0.0.7a88
a87 2026-08-30

Focus: Strict Read-Only Permission Gating & Architecture Guard Standard

  • a. [role_management_page.dart]: Gated role edit and dialog save buttons with staff_management|role|write permission.
  • b. [employee_management_page.dart]: Gated employee card popup menu edit and delete actions with canWrite and canDelete.
  • c. [landmark_drafts_list_view.dart]: Gated draft approve and reject actions with write and delete permissions.
  • d. [settings_management_page.dart, brand_settings_view.dart, payment_gateway_settings_view.dart, whatsapp_gateway_settings_view.dart]: Gated top save button and disabled form inputs/switches/actions when user has read-only status.
  • e. [auth_provider.dart & auth_middleware.dart]: Added settings permission aliases to Universal Sub-Menu Permission Engine.
  • f. [staff_controller.dart, landmark_controller.dart, settings_controller.dart]: Enforced 403 Forbidden checks on all mutating API endpoints.
  • g. [09-authentification-rule.md]: Added permanent guard standard for granular UI and API permission gating.
  • h. [pubspec.yaml]: Bumped version to 0.0.7+87.
Git Commit Tag: ispana-v0.0.7a87
a86 2026-08-19

Focus: feat:Payment gateway integrations

Git Commit Tag: ispana-v0.0.7a86
a85 2026-08-18

Focus: Refactored Status Resolution to O(1) Constant Map & Set Lookups

  • a. [invoice_view.dart]: Replaced verbose 45-line switch-case in _buildStatusBadge with a static Map<String, (Color, String)> for instant O(1) badge configuration lookups.
  • b. [payment_callback_controller.dart]: Replaced repetitive if/else-if chain with constant Set<String> lookups in webhook status settlement.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+85.
Git Commit Tag: ispana-v0.0.7a85
a84 2026-08-18

Focus: Comprehensive Payment Gateway Status Alias Mapping (All 5 Categories)

  • a. [invoice_view.dart] & [payment_callback_controller.dart]: Added exhaustive status alias mapping across all 5 payment outcome categories:
    • PAID (paid, settled, success, completed, dibayar, lunas, 1)
    • UNPAID (unpaid, pending, waiting, belum dibayar, belum lunas, 0)
    • REFUNDED (refund, refunded, reversed, dikembalikan, dikembalian)
    • EXPIRED (expired, expiration, kadaluarsa, kadaluwarsa)
    • FAILED (failed, failed_payment, cancelled, canceled, denied, gagal, batal)
  • b. [pubspec.yaml]: Bumped version to 0.0.7+84.
Git Commit Tag: ispana-v0.0.7a84
a83 2026-08-18

Focus: Fixed Refund Status Badge Alias Mapping & Callback Strings

  • a. [invoice_view.dart]: Added refund and dikembalian cases to _buildStatusBadge switch statement, so REFUND status callbacks correctly display purple REFUNDED badge instead of falling back to default UNPAID.
  • b. [payment_callback_controller.dart]: Supported REFUND, REFUNDED, DIKEMBALIKAN, and DIKEMBALIAN status string aliases in callback processor.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+83.
Git Commit Tag: ispana-v0.0.7a83
a82 2026-08-18

Focus: Read-Only Payment Status Badges & 5 Gateway Outcome Mappings

  • a. [invoice_view.dart]: Removed manual status dropdown; implemented _buildStatusBadge supporting 5 gateway-driven status badges (UNPAID, PAID, REFUNDED, EXPIRED, FAILED).
  • b. [payment_callback_controller.dart]: Mapped payment gateway callback outcomes explicitly across all 5 statuses in MongoDB.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+82.
Git Commit Tag: ispana-v0.0.7a82
a81 2026-08-18

Focus: Tripay Callback Settlement Logic & Real-time Flutter UI Auto-Refresh

  • a. [payment_callback_controller.dart]: Expanded isPaid evaluation to cover all Tripay status formats (status == 'PAID', status_code == 1, or test simulator payload with payment_status header), ensuring database status auto-updates to paid upon callback arrival.
  • b. [invoice_view.dart]: Added periodic background auto-refresh timer (every 5 seconds) to InvoiceView so the Flutter table automatically updates invoice statuses on screen without requiring manual page reload.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+81.
Git Commit Tag: ispana-v0.0.7a81
a80 2026-08-18

Focus: Replaced Invoice Download Action with Copy Link Button

  • a. [invoice_view.dart]: Replaced _downloadInvoice button with _copyInvoiceUrl using Icons.link, allowing vendors to copy public web checkout URLs directly to clipboard with confirmation toast feedback.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+80.
Git Commit Tag: ispana-v0.0.7a80
a79 2026-08-18

Focus: Fixed Tripay Webhook Callback Signature Verification Error

  • a. [payment_callback_controller.dart]: Fixed credential field mapping in _processTripayCallback to use clientKey/privateKey instead of apiKey when computing HMAC-SHA256 signatures, resolving the Invalid signature (HTTP 400) error from Tripay.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+79.
Git Commit Tag: ispana-v0.0.7a79
a78 2026-08-18

Focus: Multiline PDF Address Wrapping & Regional (Kabupaten) Signature Location

  • a. [pdf_invoice_service.dart]: Wrapped top-left vendor brand container in pw.Expanded with right padding, enabling long vendor addresses to wrap cleanly onto multiple lines without pushing the right INVOICE header block off-screen.
  • b. [invoice_repository.dart]: Extracted regency (Regional Kabupaten) from vendor brand workingArea settings and rendered it above the digital signature QR code (e.g. Kampar, 18 August 2026).
  • c. [pubspec.yaml]: Bumped version to 0.0.7+78.
Git Commit Tag: ispana-v0.0.7a78
a77 2026-08-18

Focus: Full Responsive Table Expansion via LayoutBuilder & ConstrainedBox

  • a. [invoice_view.dart]: Wrapped Invoice DataTable in LayoutBuilder and ConstrainedBox(constraints: BoxConstraints(minWidth: constraints.maxWidth)) so the table stretches across 100% width on wide desktop screens while preserving smooth horizontal scroll on mobile devices.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+77.
Git Commit Tag: ispana-v0.0.7a77
a76 2026-08-18

Focus: Strict Tenant Isolation Query Fix & Standardized Table UI Styling

  • a. [invoice_data_source.dart]: Replaced unsafe where.raw(...) query builder with strict where.eq('vendorId', vendorId).ne('isDeleted', true) selector in getInvoices, eliminating cross-tenant invoice leakage.
  • b. [invoice_view.dart]: Standardized Invoice DataTable container styling with Card, ClipRRect, themed headingRowColor, and bold header column labels matching Customer and WhatsApp History sub-features.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+76.
Git Commit Tag: ispana-v0.0.7a76
a75 2026-08-18

Focus: Interactive Public Web Checkout, Overdue Bill Regeneration, PDF Alignment & Status Auto-Update

  • a. [invoice_controller.dart]: Built interactive public web payment checkout portal on /verify/invoice/<invoiceId> with dynamic channel selection, QRIS QR code rendering, VA code copying, and real-time status auto-polling.
  • b. [invoice_repository.dart]: Implemented createPaymentTransactionPublic and expired bill renewal allowing customers to re-select payment methods and generate fresh 24h transactions under the same invoiceNumber.
  • c. [pdf_invoice_service.dart]: Fixed header right metadata table column overflow (expanding width for long invoice numbers like INV/SWAINET/26/00008) and added dynamic QR/VA rendering in PDF Payment Method section.
  • d. [invoice_view.dart]: Updated WhatsApp invoice message link template to point to the Web Checkout portal instead of direct raw PDF downloads.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+75.
Git Commit Tag: ispana-v0.0.7a75
a74 2026-08-17

Focus: Fixed Layout Overflow in Payment Checkout Dialog

  • a. [payment_dialog.dart]: Wrapped SelectableText inside Expanded widget within the payment code Row container to prevent right overflow when displaying long checkout URLs or payment codes.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+74.
Git Commit Tag: ispana-v0.0.7a74
a73 2026-08-17

Focus: Safe Fee Number Parsing in Payment Checkout Dialog

  • a. [payment_dialog.dart]: Added _parseDouble helper method handling String, num, and null types for flat and percentage fee calculations, resolving the _TypeError (type 'String' is not a subtype of type 'num?') cast exception when Tripay returns string numbers.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+73.
Git Commit Tag: ispana-v0.0.7a73
a72 2026-08-17

Focus: Fixed Tripay Credential Mapping Mismatch & Standardized Form Labels

  • a. [invoice_repository.dart]: Fixed credential parsing logic where apiKey and privateKey were inverted when retrieving payment channels and creating transactions.
  • b. [payment_gateway_settings_view.dart]: Standardized settings form labels and helper texts to match Tripay Dashboard terminology (Kode Merchant, API Key, Private Key).
  • c. [pubspec.yaml]: Bumped version to 0.0.7+72.
Git Commit Tag: ispana-v0.0.7a72
a71 2026-08-17

Focus: Resolved All Invoice Repository Signature & Named Parameter Mismatches

  • a. [invoice_repository.dart]: Updated getInvoices to accept optional customerId filtering. Extended createInvoice signature with amount, invoiceNumber, date, dueDate, and customerAddress matching InvoiceController callers.
  • b. Verified 0 compilation errors across 01_API with dart analyze.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+71.
Git Commit Tag: ispana-v0.0.7a71
a70 2026-08-17

Focus: Rebuilt InvoiceRepository & Resolved All Backend and App Analysis Errors

  • a. [invoice_repository.dart]: Restored and updated the complete InvoiceRepository class with exact model mappings, PDF invoice generation, and payment gateway methods.
  • b. [payment_gateway_settings_view.dart]: Cleaned up unused fields and fixed runtime constant instantiation for ClipboardData.
  • c. Verified 0 compilation/analysis issues across both 01_API and 02_ispana codebases.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+70.
Git Commit Tag: ispana-v0.0.7a70
a69 2026-08-17

Focus: Fix Server Payment Callback Mount Path Alignment

  • a. [server.dart]: Fixed server route mounting from /api/payment/callback to /api/payment and /payment, aligning with vendor-scoped routes (/api/payment/tripay/instanet, /api/payment/tripay/platform) and legacy callback fallbacks.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+69.
Git Commit Tag: ispana-v0.0.7a69
a68 2026-08-17

Focus: Vendor-Scoped Payment Gateway Callback Architecture (/api/payment/tripay/<vendor-brand-name>)

  • a. [payment_callback_controller.dart]: Implemented vendor-scoped callback route handling (/api/payment/<provider>/<vendorIdentifier>) with tenant isolation validation before HMAC signature checking and invoice settlement.
  • b. [invoice_repository.dart]: Dynamically formatted Tripay payment callback URLs to vendor-specific paths (e.g. https://swainet.id/api/payment/tripay/instanet) or platform.
  • c. [payment_gateway_settings_view.dart]: Dynamically generated copyable vendor-branded callback URL for Tripay Merchant Dashboard configuration.
  • d. [auth_middleware.dart]: Updated public whitelist for path.startsWith('api/payment/') and path.startsWith('payment/').
  • e. [pubspec.yaml]: Bumped version to 0.0.7+68.
Git Commit Tag: ispana-v0.0.7a68
a67 2026-08-17

Focus: Removed Payment Gateway Toggle & Copyable Tripay Merchant Callback URL

  • a. [payment_gateway_settings_view.dart]: Removed the redundant 'Enable Payment Gateway' switch toggle. Added a read-only, 1-click copyable Tripay Merchant Callback URL field (https://swainet.id/api/payment/callback/tripay) when Tripay (Own Account) is selected.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+67.
Git Commit Tag: ispana-v0.0.7a67
a66 2026-08-17

Focus: Tripay Payment Gateway Full Functional Integration & Interactive Checkout Dialog

  • a. [tripay_service.dart]: Implemented TripayService with HMAC-SHA256 signature generation, payment channel retrieval, and closed payment transaction creation.
  • b. [invoice_model.dart & invoice_repository.dart]: Extended invoice schema with paymentUrl, paymentPayCode, paymentMethodCode, and paymentExpiredAt. Added channel discovery and payment transaction creation.
  • c. [invoice_controller.dart & auth_middleware.dart]: Exposed payment channel & transaction routes. Fixed auth middleware to publicly whitelist payment callbacks (resolving HTTP 401 error).
  • d. [payment_dialog.dart & invoice_view.dart]: Built interactive online payment dialog featuring payment channel selection, dynamic QRIS display, and Virtual Account number 1-click copy. Added 'Bayar Online' action button on unpaid invoices.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+66.
Git Commit Tag: ispana-v0.0.7a66
a65 2026-08-17

Focus: Payment Gateway Options (ISPANA Platform Tripay, Own Tripay, Xendit, Duitku) & Extensible Callback Webhook

  • a. [payment_gateway_settings_view.dart]: Updated provider dropdown options to support ISPANA Platform (Tripay), Tripay (Own Account), Xendit (Coming Soon), and Duitku (Coming Soon). Removed redundant Production Mode switch toggle.
  • b. [payment_callback_controller.dart]: Created generalized, extensible payment callback controller handling webhooks for Tripay (HMAC-SHA256 signature verification, auto-settling invoice as paid, auto-activating customer subscription) and stubbed routes for future gateway providers.
  • c. [server.dart]: Mounted /api/payment/callback/<provider> and /payment/callback/<provider> webhook routes.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+65.
Git Commit Tag: ispana-v0.0.7a65
a64 2026-08-17

Focus: Separate PPPoE User/Pass Columns & Compact DataRow Height

  • a. [customer_management_view.dart]: Separated PPPoE credentials into distinct PPPoE User and PPPoE Pass columns. Reduced row height to dataRowMinHeight: 48 and dataRowMaxHeight: 52 for a compact table presentation.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+64.
Git Commit Tag: ispana-v0.0.7a64
a63 2026-08-17

Focus: PPPoE Account Column & Tap-To-Reveal Password Toggle

  • a. [customer_management_view.dart]: Added PPPoE column displaying PPPoE username and masked password (••••••••). Tapping the cell toggles password visibility without opening the customer detail modal.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+63.
Git Commit Tag: ispana-v0.0.7a63
a62 2026-08-17

Focus: Removed Selection Checkbox Column in Customer Management Table

  • a. [customer_management_view.dart]: Set showCheckboxColumn: false on DataTable to remove checkbox column while preserving full-row clickability.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+62.
Git Commit Tag: ispana-v0.0.7a62
a61 2026-08-17

Focus: Unified Status Badge Styling in Customer Management Column

  • a. [customer_management_view.dart]: Styled 4th column Status cell (line 441) with statusColor background and statusText label badge across both Customers & Onboarding views.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+61.
Git Commit Tag: ispana-v0.0.7a61
a60 2026-08-17

Focus: Full DataRow Clickability in Customer Management Table

  • a. [customer_management_view.dart]: Added onSelectChanged callback to DataRow so clicking anywhere on a customer row opens the detail modal.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+60.
Git Commit Tag: ispana-v0.0.7a60
a59 2026-08-17

Focus: Fix Customer DataTable Row Height Overflow & Full-Width Layout

  • a. [customer_management_view.dart]: Set dataRowMinHeight: 64, dataRowMaxHeight: 68, and wrapped in LayoutBuilder with full-width ConstrainedBox to eliminate bottom pixel overflow and stretch table to 100% container width. Added direct WhatsApp action button.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+59.
Git Commit Tag: ispana-v0.0.7a59
a58 2026-08-17

Focus: WhatsApp Gateway (WAHA) Auto-Detection & Connected Phone Synchronization

  • a. [whatsapp_service.dart]: Extracted connected phone number and account push name from WAHA active session status payload.
  • b. [settings_provider.dart]: Added wahaPhone and wahaPushName tracking in state provider.
  • c. [whatsapp_gateway_settings_view.dart]: Added fallback to Brand WhatsApp number, auto-populated empty phone field upon pairing, and displayed connected account badge with manual sync button.
  • d. [app_localization.dart]: Added localization keys and translations (EN/ID) for connected account badges and sync actions.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+58.
Git Commit Tag: ispana-v0.0.7a58
a57 2026-08-17

Focus: Onboarding Table Layout & Username Display in Activation Progress

  • a. [customer_management_view.dart]: Converted Customer Onboarding grid cards into a clean, scrollable DataTable layout to eliminate card height overflow.
  • b. [customer_form_page.dart]: Added username formatting to display usernames (e.g., sarana.working.akses.indonesia) instead of full email addresses in Activation Progress timeline.
  • c. [customer_repository.dart]: Updated _resolveActorName on backend to extract username or email prefix for registration footprints.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+57.
Git Commit Tag: ispana-v0.0.7a57
a55 2026-08-17

Focus: Fixed WhatsApp WAHA Gateway Map Type Cast Error

  • a. [settings_repository.dart]: Converted MongoDB BSON subdocuments (whatsappGateway, paymentGateway) using safe Map<String, dynamic>.from(...).
  • b. [settings_controller.dart]: Replaced direct as Map<String, dynamic>? subtype casts in WAHA session handlers with safe map conversion.
  • c. [whatsapp_service.dart]: Ensured JSON decodes safely cast to Map<String, dynamic>.
  • d. [api_client.dart]: Updated _handleResponse in Flutter app to safely convert HTTP JSON map responses via Map<String, dynamic>.from(...).
  • e. [pubspec.yaml]: Bumped version to 0.0.7+55.
Git Commit Tag: ispana-v0.0.7a55
a54 2026-08-17

Focus: Dual Searchable Kecamatan/Village Fields & Google Maps Short-Link Navigation

  • a. [landmark_data_section.dart]: Placed Kecamatan and Village (Kelurahan/Desa) selection fields in the same row with searchable modal picker sheets.
  • b. [landmark_form_page.dart]: Implemented dynamic village filtering per selected kecamatan & spatial coordinate auto-population.
  • c. [map_display_view.dart]: Enhanced Google Maps short-link coordinate extraction and map navigation.
  • d. [app_localization.dart]: Added Kecamatan & Village search localization keys for EN & ID.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+54.
Git Commit Tag: ispana-v0.0.7a54
a53 2026-08-17

Focus: Fixed Vendor Settings Fetch Trigger & Auto-Population Lifecycle

  • a. [settings_management_page.dart]: Removed restrictive tier == 'vendor' check so all authorized vendor accounts fetch settings on page load.
  • b. [brand_settings_view.dart]: Direct build-pass sync for controllers and state properties when brand settings arrive.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+53.
Git Commit Tag: ispana-v0.0.7a53
a52 2026-08-17

Focus: Fixed Root Vendor Fields Fallback for Business Name, WhatsApp, Address, Logo & Banner

  • a. [settings_repository.dart]: Merged root vendor fields (businessName, whatsapp, address, logoUrl, bannerUrl) into the brand settings response map.
  • b. [settings_remote_data_source.dart]: Updated updateBrandSettings to synchronize root vendor fields alongside brand subdocument in MongoDB.
  • c. [brand_settings_view.dart]: Added fallback key checks for whatsapp/whatsappNumber and businessName/name.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+52.
Git Commit Tag: ispana-v0.0.7a52
a51 2026-08-17

Focus: Fixed Brand Settings Data Auto-Population for Logo, Banner, Business Name & WhatsApp

  • a. [brand_settings_view.dart]: Updated _populateFromBrand and build lifecycle to automatically populate existing business name, whatsapp number, logo URL, and banner URL when settings data loads.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+51.
Git Commit Tag: ispana-v0.0.7a51
a50 2026-08-17

Focus: Replaced Kecamatan with Kabupaten (Regency) Multi-Selection in Vendor Working Area

  • a. [regions_data_source.dart] & [system_controller.dart]: Added getRegenciesForProvince method and mounted GET /v1/system/regions/regencies?province=X endpoint.
  • b. [brand_settings_view.dart]: Replaced Kecamatan multi-select with Regional (Kabupaten) multi-select form & + Add Kabupaten modal.
  • c. [settings_service.dart]: Added getRegencies(province) service helper method.
  • d. [landmark_form_page.dart] & [customer_form_page.dart]: Updated regional working area kelurahan loading logic to support selected Kabupaten (Regencies).
  • e. [pubspec.yaml]: Bumped version to 0.0.7+50.
Git Commit Tag: ispana-v0.0.7a50
a49 2026-08-17

Focus: Fixed Undefined Method loadSettings in Landmark Form Page

  • a. [landmark_form_page.dart]: Replaced undefined loadSettings call on SettingsProvider with fetchVendorSettings(vendorId, token).
  • b. [pubspec.yaml]: Bumped version to 0.0.7+49.
Git Commit Tag: ispana-v0.0.7a49
a48 2026-08-17

Focus: Fixed VendorDrawer Avatar Exception & Enabled Regional Working Area Selection in Landmark Form

  • a. [vendor_drawer.dart]: Fixed Invalid image data exception by replacing raw ui-avatars NetworkImage with robust initial text CircleAvatar.
  • b. [landmark_form_page.dart]: Fixed regional working area kelurahan loading fallback and integrated 2dsphere spatial lookup (lookupRegion) on coordinate changes.
  • c. [settings_service.dart]: Added lookupRegion(lat, lng) method to query regional spatial lookup API.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+48.
Git Commit Tag: ispana-v0.0.7a48
a47 2026-08-17

Focus: Integrated 1.9 GB Indonesia District Master GeoJSON Dataset into MongoDB & Dart API

  • a. [seed_regions.dart] (CLI Script): Created CLI import tool to stream and seed 1.9 GB GeoJSON dataset into MongoDB system_regions collection with 2dsphere index.
  • b. [regions_data_source.dart] (Backend Datasource): Refactored to query MongoDB system_regions collection dynamically with aggregation pipelines and spatial lookup.
  • c. [system_controller.dart] (Backend Controller): Updated REST endpoints (provinces, kecamatan, kelurahan) and added /v1/system/regions/lookup endpoint.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+47.
Git Commit Tag: ispana-v0.0.7a47
a46 2026-08-17

Focus: FEATURE-03 Regionalization Polygon & Working Area System

  • a. [regions_data_source.dart] (API): Added Indonesian regional datasource providing provinces list, kecamatan GeoJSON polygons, and kelurahan lists.
  • b. [system_controller.dart] (API): Exposed regional REST API endpoints (GET /regions/provinces, GET /regions/kecamatan, POST /regions/kelurahan).
  • c. [settings_service.dart] & [settings_provider.dart] (Flutter): Added regional API consumer methods and working area payload support.
  • d. [brand_settings_view.dart] (Widget): Replaced address field with Country -> Province -> Multi-Kecamatan working area chip selector.
  • e. [map_display_view.dart] (Widget): Added PolygonLayer overlay to render vendor working area kecamatan polygons on canvas with toggle map control button.
  • f. [landmark_data_section.dart] & [landmark_form_page.dart] (Widget): Replaced landmark label text field with Village (Kelurahan/Desa) dropdown scoped to vendor working area.
  • g. [customer_form_page.dart] (Widget): Added scoped Kelurahan dropdown selection for customer address setup.
  • h. [TODO.md]: Checked off all FEATURE-03 tasks.
  • i. [pubspec.yaml]: Bumped version to 0.0.7+46.
Git Commit Tag: ispana-v0.0.7a46
a45 2026-08-17

Focus: Fix Port Search Bar Clearing on Mobile Scroll

  • a. [landmark_pop_form.dart]: Moved searchController lifecycle outside showModalBottomSheet builder to prevent search input wipe on scroll.
  • b. [router_registration_form.dart]: Fixed port search controller reset on scroll rebuilds.
  • c. [customer_form_page.dart]: Fixed customer upstream port search controller lifecycle.
  • d. [TODO.md]: Marked BUG-02 task as completed.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+45.
Git Commit Tag: ispana-v0.0.7a45
a44 2026-08-17

Focus: Unify Landmark and Map Search Bar Logic

  • a. [landmark_provider.dart]: Incremented _landmarksVersion in setFilterQuery and setSelectedCategory to trigger map cache update on search query changes.
  • b. [map_display_view.dart]: Initialized _searchController text from provider state and synced search changes/clears to LandmarkProvider.setFilterQuery.
  • c. [landmarks_list_view.dart]: Ensured bidirectional search query sync between map view and landmark list.
  • d. [TODO.md]: Added roadmap and marked BUG-01 search unification task as completed.
  • e. [pubspec.yaml]: Bumped version to 0.0.7+44.
Git Commit Tag: ispana-v0.0.7a44
a43 2026-08-03

Focus: Fix web version check caching and refresh handling

Git Commit Tag: ispana-v0.0.7a43
a42 2026-08-03

Focus: feat: UI/UX improvement part 1

Git Commit Tag: ispana-v0.0.7a42
a31 2026-07-28

Focus: Fix FilePicker API Call Compatibility

  • a. [customer_import_view.dart] (Widget): Updated FilePicker.platform.pickFiles to static method FilePicker.pickFiles for file_picker v11.x API compatibility.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+31.
Git Commit Tag: ispana-v0.0.7a31
a30 2026-07-28

Focus: Refactor Role Management to Data Table & Integrate File Picker

  • a. [role_management_page.dart] (Widget): Refactored role grid cards to structured DataTable with action columns.
  • b. [customer_import_view.dart] (Widget): Integrated file_picker for selecting local CSV files.
  • c. [pubspec.yaml]: Added file_picker: ^11.0.2 dependency and bumped version to 0.0.7+30.
Git Commit Tag: ispana-v0.0.7a30
a29 2026-07-28

Focus: Simplify Staff & Customer Management UI/UX via Modal Dialogs

  • a. [staff_management_page.dart] (Page): Removed 'Peran' tab from top sub-menu bar.
  • b. [employee_management_page.dart] (Widget): Added 'Kelola Peran' button to open role management dialog.
  • c. [role_management_page.dart] (Widget): Wrapped role table and creation form into RoleManagementDialog.
  • d. [customer_management_page.dart] (Page): Removed 'Impor CSV' tab from top sub-menu bar.
  • e. [customer_management_view.dart] (Widget): Added 'Impor CSV' button in header action bar.
  • f. [customer_import_view.dart] (Widget): Wrapped CSV importer in CustomerImportDialog and added 'Unduh Templat CSV' template download button.
  • g. [pubspec.yaml]: Bumped version to 0.0.7+29.
Git Commit Tag: ispana-v0.0.7a29
a28 2026-07-28

Focus: Remove Template Shortcut Inserted SnackBar Notification

  • a. [whatsapp_send_dialog.dart] (Widget): Removed SnackBar notification when inserting message template shortcuts.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+28.
Git Commit Tag: ispana-v0.0.7a28
a27 2026-07-28

Focus: WhatsApp History UI Cleanup (Refresh Button Removal & FAB Icon-Only)

  • a. [whatsapp_history_view.dart] (Widget): Removed manual refresh IconButton next to search field and updated FloatingActionButton to icon-only FAB.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+27.
Git Commit Tag: ispana-v0.0.7a27
a26 2026-07-27

Focus: Release

Git Commit Tag: ispana-v0.0.7a26
a25 2026-07-26

Focus: Refactor Null Check to Null-Aware Element Marker in MapDisplayView

  • a. [map_display_view.dart] (Widget): Replaced if (_searchMarker != null) _searchMarker! with ?_searchMarker null-aware collection element syntax.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+25.
Git Commit Tag: ispana-v0.0.7a25
a24 2026-07-26

Focus: Fix Map Event Infinite Rebuild Loop in MapDisplayView

  • a. [map_display_view.dart] (Widget): Filtered onMapEvent listener to only trigger debounced bounding box fetches when map camera movement finishes (MapEventMoveEnd, MapEventFlingAnimationEnd, MapEventDoubleTapZoomEnd), eliminating the UI thread freeze loop.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+24.
Git Commit Tag: ispana-v0.0.7a24
a23 2026-07-26

Focus: Fix "Ini Tiang Sendiri" (isOwnedPole) Persistence in Dart API Backend

  • a. [landmark_model.dart] (API Model): Added isOwnedPole field, constructor mapping, fromMap() parsing, and toMap() serialization in Dart API backend.
  • b. [landmark_repository.dart] (API Repository): Added isOwnedPole parameter handling in createLandmark() and updateLandmark().
  • c. [landmark_controller.dart] (API Controller): Extracted payload['isOwnedPole'] in REST HTTP endpoints (POST /landmarks and PUT /landmarks/<id>) to preserve checkbox state in MongoDB.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+23.
Git Commit Tag: ispana-v0.0.7a23
a22 2026-07-26

Focus: Fix Map Management UI Freeze & Unused Field Warning

  • a. [map_display_view.dart] (Widget): Replaced synchronous main-thread BuiltInMapCachingProvider with non-blocking NetworkTileProvider to prevent UI freeze on map startup, and fixed ?_searchMarker null-aware syntax in MarkerLayer.
  • b. [landmark_form_page.dart] (Page): Removed unused private field _landmarkIcons and unreferenced style handlers.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+22.
Git Commit Tag: ispana-v0.0.7a22
a21 2026-07-26

Focus: Landmark Form Simplification (Moved Mark Own Pole to General Tab & Removed Style Tab)

  • a. [landmark_data_section.dart] (Widget): Moved the Ini Tiang Sendiri (Mark Own Pole) checkbox tile directly into the Umum (General) tab form.
  • b. [landmark_form_page.dart] (Page): Removed the Gaya (Style) sub-menu tab from the landmark modal dialog and reduced tab count to 3 (Umum, Infrastruktur, Perangkat Keras). Cleaned up unused style handlers & imports.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+21.
Git Commit Tag: ispana-v0.0.7a21
a20 2026-07-26

Focus: Fix HTTP 301 Moved Permanently Error (Separate API BaseUrl & Public Verification Domain)

  • a. [api_config.dart] (Config): Restored ApiConfig.baseUrl back to API backend server (http://103.196.40.140:8080) to prevent Nginx HTTP-to-HTTPS 301 redirects on API calls, and added ApiConfig.publicDomain (http://swainet.id) specifically for public invoice links.
  • b. [invoice_view.dart] (Widget): Updated invoice PDF download & WhatsApp sharing links to utilize ApiConfig.publicDomain (http://swainet.id/verify/invoice/...) while preserving direct API server connectivity for app requests.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+20.
Git Commit Tag: ispana-v0.0.7a20
a19 2026-07-26

Focus: Domain Invoice PDF URL & Auto-Populating Brand Settings Form

  • a. [api_config.dart] (Config): Updated default ApiConfig.baseUrl from IP:PORT (http://103.196.40.140:8080) to production domain (http://swainet.id) so invoice PDF links are formatted with the domain.
  • b. [brand_settings_view.dart] (Widget): Added automatic fetchVendorSettings() post-frame callback in initState() and implemented reactive _populateFromBrand() syncing so existing brand settings (Business Name, WhatsApp Number, Address, Logo, Banner) are populated into the form.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+19.
Git Commit Tag: ispana-v0.0.7a19
a18 2026-07-26

Focus: Auto-Fetch Vendor Settings & Compact Autocomplete Template Selection Field

  • a. [whatsapp_send_dialog.dart] (Widget): Added automatic fetchVendorSettings() execution in initState() so custom saved message templates from vendor settings are always loaded when opening the dialog.
  • b. [whatsapp_send_dialog.dart] (Widget): Replaced the template action chips bar with a compact, clean Autocomplete<Map<String, dynamic>> FormField (Pilih / Cari Templat Pesan (Pintasan)) with live filtering by template title, shortcut, or body.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+18.
Git Commit Tag: ispana-v0.0.7a18
a17 2026-07-26

Focus: Reliable Shortcut Expansion & Built-In Template Fallback

  • a. [whatsapp_send_dialog.dart] (Widget): Added automatic pre-send shortcut expansion inside _handleSend() so clicking "Kirim WhatsApp" with raw shortcut text (e.g. /hello) instantly expands into template text before sending.
  • b. [whatsapp_send_dialog.dart] (Widget): Implemented live onChanged shortcut expansion detection (expanding shortcuts when space or newline is typed) and added built-in fallback template defaults (/hello, /tagihan, /terimakasih).
  • c. [pubspec.yaml]: Bumped version to 0.0.7+17.
Git Commit Tag: ispana-v0.0.7a17
a16 2026-07-26

Focus: Auto-Sanitization of Phone Numbers (Country Code Conversion)

  • a. [customer_form_page.dart] (Page): Auto-sanitizes input phone numbers starting with 0 (e.g. 08123456789) into international country code format (628123456789) upon customer registration & edit.
  • b. [whatsapp_send_dialog.dart] (Widget): Normalizes target phone numbers in direct messaging modal dialog to ensure leading 0 is converted to country code 62.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+16.
Git Commit Tag: ispana-v0.0.7a16
a15 2026-07-26

Focus: Full WhatsApp Integration (Customer Card Button, Invoice Send, Shortcut Engine & History Tab)

  • a. [customer_management_view.dart] (Widget): Added a green WhatsApp IconButton on the bottom-right of customer card opening direct chat modal dialog.
  • b. [whatsapp_send_dialog.dart] (Widget): Implemented a modal dialog supporting shortcut auto-expansion (e.g. typing /hello and pressing Enter automatically fills template text and replaces variables {customerName}, {invoiceNumber}, {amount}) and quick-pick action chips.
  • c. [invoice_view.dart] (Widget): Integrated direct WhatsApp sending in the Faktur / Invoice sub-menu table with prefilled invoice payment notice template.
  • d. [whatsapp_history_view.dart] (Widget): Created the "Riwayat WhatsApp" sub-menu tab displaying sent history logs data table with recipient type badges, source badges, status, and extended Floating Action Button (FAB) with recipient autocomplete suggestions.
  • e. [vendor_features.dart] & [app_localization.dart]: Registered whatsapp_history sub-feature key and localized all strings in Indonesian & English.
  • f. [pubspec.yaml]: Bumped version to 0.0.7+15.
Git Commit Tag: ispana-v0.0.7a15
a14 2026-07-26

Focus: Fix BuildContext Across Async Gaps Warning

  • a. [whatsapp_gateway_settings_view.dart] (Widget): Replaced context.mounted checks after asynchronous operations with mounted (State.mounted) to satisfy Dart's use_build_context_synchronously linter rule.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+14.
Git Commit Tag: ispana-v0.0.7a14
a11 2026-07-24

Focus: Responsive Draft Data Table & Creator Name Resolution

  • a. [landmark_drafts_list_view.dart] (Widget): Wrapped DataTable in LayoutBuilder with responsive min-width constraint (math.max(constraints.maxWidth, 700.0)) so the table expands responsively across 100% of desktop/web views.
  • b. [landmark_drafts_list_view.dart] (Widget): Added _fetchStaffNames() via EmployeeService to resolve raw creator token IDs (e.g. 3SY!C8) into human-readable staff names (e.g. John Doe) in the "Dibuat Oleh" column.
  • c. [pubspec.yaml]: Bumped version to 0.0.7+11.
Git Commit Tag: ispana-v0.0.7a11
a10 2026-07-24

Focus: Landmark Draft Sub-Menu DataTable & Live Background Sync

  • a. [landmark_drafts_list_view.dart] (Widget): Replaced bulky card layout with a clean, horizontal-scrolling DataTable (Tipe, Nama Markah, Dibuat Oleh, Tanggal, Aksi). Preserved click-to-view feature opening read-only draft form.
  • b. [landmark_drafts_list_view.dart] (Widget): Implemented a periodic 5-second background sync timer while mounted so newly submitted drafts automatically appear live for admins without manual refresh.
  • c. [landmark_provider.dart] (Provider): Updated approveDraft() to call both fetchLandmarks() and fetchDrafts() for immediate real-time state resolution.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+10.
Git Commit Tag: ispana-v0.0.7a10
a9 2026-07-24

Focus: Fix App Crash on Map Marker Render (Safeguard Splitter Ratio Parsing)

  • a. [map_landmark.dart] (Model): Wrapped getEffectiveColor() in a try-catch safety handler and added range checks for splitterRatio string splitting to prevent RangeError crashes when splitter ratios lack colon formatting.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+9.
Git Commit Tag: ispana-v0.0.7a9
a8 2026-07-24

Focus: Restrict Landmark Editing to Landmark Sub-Menu List

  • a. [landmark_detail_sheet.dart] (Widget): Removed the edit button icon from the landmark detail popup sheet header so landmark editing can only be launched from the Landmark sub-menu list view ("Markah Tanah" tab).
  • b. [pubspec.yaml]: Bumped version to 0.0.7+8.
Git Commit Tag: ispana-v0.0.7a8
a7 2026-07-24

Focus: Landmark Pin Style & Color Revision (Dynamic Port & Status Colors + Color Wheel Picker)

  • a. [map_landmark.dart] (Model): Added getEffectiveColor() method calculating dynamic status colors for odp, olt, jc, bts, otb based on non-zero port capacity and onu based on customer status.
  • b. [map_display_view.dart] (Widget): Updated marker pin rendering, polylines, search suggestions, and dimmed opacity for unconfigured ONU pins.
  • c. [landmark_detail_sheet.dart] & [landmarks_list_view.dart] (Widgets): Updated landmark headers and list items to display effective status colors.
  • d. [landmark_style_section.dart] (Page): Restricted customizable colors to pop & default themes, added Hex input field, interactive HSV Color Wheel dialog, and dynamic color notification notice for hardware devices.
  • e. [landmark_form_page.dart] (Page): Added silent color normalization on edit when saving non-customizable landmark records to database.
  • f. [pubspec.yaml]: Bumped version to 0.0.7+7.
Git Commit Tag: ispana-v0.0.7a7
a6 2026-07-24

Focus: Remove Duplicated AppBar Search Bar in Maps Management

  • a. [maps_management_page.dart] (Frontend): Removed redundant AppBar title TextField that caused a double search bar when filterQuery was active.
  • b. [pubspec.yaml]: Bumped version to 0.0.7+6.
Git Commit Tag: ispana-v0.0.7a6
a41 2026-08-02

Focus: Standardized Proportional Card System Across Staff, Customer & Radius Routers

  • a. [employee_management_page.dart]: Standardized EmployeeCard layout to 175px grid height with 52x52 soft avatar container, zero blank space, and uniform borders.
  • b. [customer_management_view.dart]: Converted Customer view to GridView.builder with 175px grid height, 52x52 customer avatar container, and 3-dots popup menu.
  • c. [radius_management_view.dart]: Converted Router view to GridView.builder with 175px grid height, 52x52 router icon container, and top ID/status chips.
  • d. [pubspec.yaml]: Incremented version to 0.0.7+41.
Git Commit Tag: ispana-v0.0.7a41
a40 2026-08-02

Focus: Role Form Top-Right Header Action & Redundant Cancel Button Removal

  • a. [role_management_page.dart]: Placed the primary BUAT PERAN / SIMPAN button in the top-right header bar next to the close button for seamless design alignment with Settings.
  • b. [role_form_page.dart]: Removed the redundant BATAL button from the bottom footer bar since the top-left <- back button handles navigation.
  • c. [pubspec.yaml]: Incremented version to 0.0.7+40.
Git Commit Tag: ispana-v0.0.7a40
a39 2026-08-02

Focus: Single-Layer Role Management Dialog, CSV Import Permission Cleanup & Modal Overflow Fix

  • a. [role_management_page.dart] & [role_form_page.dart]: Refactored RoleManagementDialog to switch views inline (List <-> Form) inside a single modal container, eliminating double-stacked popups.
  • b. [vendor_features.dart]: Removed customer_import (Impor CSV) sub-feature entry from the role permission checklist.
  • c. [customer_import_view.dart]: Wrapped title/description text in Expanded inside the CSV import modal header to eliminate pixel overflow errors.
  • d. [pubspec.yaml]: Incremented version to 0.0.7+39.
Git Commit Tag: ispana-v0.0.7a39
a38 2026-08-02

Focus: Reusable PhotoUploadWidget Integration & Account Profile Global SIMPAN Binding

  • a. [account_security_view.dart]: Removed redundant Simpan Profil button and bound saving to the top global SIMPAN button header.
  • b. [photo_upload_widget.dart]: Decoupled PhotoUploadWidget from LandmarkProvider so it can be reused globally across all app features.
  • c. [account_security_view.dart] & [employee_form_page.dart]: Integrated PhotoUploadWidget for uniform image picker and upload experience.
  • d. [auth_repository_impl.dart], [auth_remote_data_source.dart] & [auth_controller.dart]: Resolved all backend API compile errors.
  • e. [pubspec.yaml]: Incremented version to 0.0.7+38.
Git Commit Tag: ispana-v0.0.7a38
a37 2026-08-02

Focus: Employee Form Profile Picture Field & Account Profile Settings Form (Phone, Photo, Address)

  • a. [employee_form_page.dart]: Added profile picture field with live 54x54 soft rounded square avatar preview container in EmployeeFormDialog.
  • b. [employee_management_page.dart]: Rendered uploaded network photo images inside the staff card avatar container with initial letter fallback.
  • c. [account_security_view.dart]: Added Profil Akun card allowing users to update their WhatsApp number (with InputSanitizer), profile picture URL, and address.
  • d. [auth_controller.dart] & [auth_repository_impl.dart]: Added PUT /v1/auth/profile endpoint in API to persist user profile updates in data_auth and data_employees.
  • e. [pubspec.yaml]: Incremented version to 0.0.7+37.
Git Commit Tag: ispana-v0.0.7a37
a36 2026-08-02

Focus: Staff Square Avatar, PopupMenu Contrast Fix, Employee Form Dialog Popup & Responsive Role Table

  • a. [employee_management_page.dart]: Added a square avatar container with soft border radius displaying staff initials to balance the card layout.
  • b. [employee_management_page.dart]: Enhanced PopupMenu contrast and elevation so item list options stand out clearly against dark card surface.
  • c. [employee_form_page.dart]: Refactored Employee Create/Edit form from a full-page route into a modal dialog (EmployeeFormDialog.show).
  • d. [role_management_page.dart]: Made the role list table 100% responsive (expanding to double.infinity width).
  • e. [pubspec.yaml]: Incremented version to 0.0.7+36.
Git Commit Tag: ispana-v0.0.7a36
a35 2026-08-02

Focus: Staff Page Double Navbar Fix, Dropdown Filter Removal & Icon-Only FloatingActionButton

  • a. [employee_management_page.dart]: Removed duplicate inner AppBar and VendorDrawer, fixing the double navbar issue.
  • b. [employee_management_page.dart]: Completely removed status dropdown filter from top header row to eliminate pixel overflow.
  • c. [employee_management_page.dart]: Converted FloatingActionButton to an icon-only button (Icon(Icons.person_add_outlined)).
  • d. [pubspec.yaml]: Incremented version to 0.0.7+35.
Git Commit Tag: ispana-v0.0.7a35
a34 2026-08-02

Focus: Staff Page Header Overflow Fix, FAB Refactoring, Outdated Warning Card Removal & Centralized Input Sanitizers

  • a. [employee_management_page.dart]: Moved + Tambah Karyawan action to a FloatingActionButton (FloatingActionButton.extended) and cleaned up top header action row to eliminate pixel overflow.
  • b. [employee_form_page.dart]: Removed outdated AppLocale.employeeSignInInfo warning card from employee form.
  • c. [input_sanitizer.dart]: Created centralized InputSanitizer utility in both Flutter frontend (02_ispana) and backend API (01_API) for mandatory email lowercasing and phone country code conversion.
  • d. [staff_repository.dart], [customer_form_page.dart], [auth_provider.dart] & [auth_repository_impl.dart]: Enforced InputSanitizer across forms, providers, and backend repositories.
  • e. [pubspec.yaml]: Incremented version to 0.0.7+34.
Git Commit Tag: ispana-v0.0.7a34
a33 2026-08-02

Focus: Staff Phone Country Code Auto-Conversion, Staff Page UI/UX Modernization & WhatsApp Recipient Autocomplete

  • a. [employee_form_page.dart] & [staff_repository.dart]: Enforced automatic phone country code conversion (converting 08... to 628...) on frontend form submission and backend database insertion.
  • b. [employee_management_page.dart]: Redesigned Staff Management page UI/UX to match Customer Management styling with live search, status filter, ID badges, role chips, and WhatsApp quick actions.
  • c. [whatsapp_send_dialog.dart]: Enhanced recipient autocomplete search so searching by customer or staff name automatically populates and replaces text field with their WhatsApp phone number.
  • d. [pubspec.yaml]: Incremented version to 0.0.7+33.
Git Commit Tag: ispana-v0.0.7a33
a32 2026-08-02

Focus: Option C Role Permission Selection & Global Settings Architecture Refactoring

  • a. [app_appearance_view.dart]: Created shared core widget for universal theme and language selection across all tiers.
  • b. [account_security_view.dart]: Created shared core widget for change password & security verification across all tiers.
  • c. [vendor_features.dart]: Added isPermissionConfigurable and supportedLevels per feature, excluding universal features (dashboard and settings_account).
  • d. [role_form_page.dart]: Updated RoleFormDialog to filter out universal features, dynamically build supported permission level segments, and support claim level access.
  • e. [auth_provider.dart] & [auth_middleware.dart]: Updated permission engines to evaluate |claim level access.
  • f. [settings_management_page.dart]: Refactored settings tabs to isolate vendor company settings and create a dedicated Account tab for change password.
  • g. [pubspec.yaml]: Incremented version to 0.0.7+32.
Git Commit Tag: ispana-v0.0.7a32
a5 2026-07-24

Focus: Strict Read-Write Role Level Enforcement (Delete Button Removal)

  • a. [auth_provider.dart] (Frontend): Refactored _hasLevelPermission so delete level strictly requires |delete permission and updated isSuper getter.
  • b. [auth_middleware.dart] (Backend): Enforced strict delete level validation in _hasLevelPermission and updated hasPermission bypass for employees.
  • c. [staff_repository.dart] (Backend): Ensured employee auth accounts are saved with role: 1 (Employee), reserving role: 0 exclusively for primary Vendor Owner.
  • d. [pubspec.yaml]: Bumped version to 0.0.7+5.
Git Commit Tag: ispana-v0.0.7a5
a4 2026-07-24

Focus: Dev Tools Cleanup

  • a. [build.ps1]: Removed unused $CHANGELOG_DIR variable assignment.
Git Commit Tag: ispana-v0.0.7a4
a1 2026-07-24

Focus: Version Transition to v0.0.7

  • a. [pubspec.yaml]: Bumped version to 0.0.7+1 to initiate the v0.0.7 development cycle.
  • b. [app-v0-0-7.astro]: Created standalone Astro changelog page for tracking v0.0.7 iterations.
Git Commit Tag: ispana-v0.0.7a1