BEXO ERP Docs

BEXO ERP — Administrator Guide

For IT Staff, Database Administrators, and System Managers


System Architecture

Components

1. WPF Client (Windows) - Location: C:\Release\BEXO\BEXO.UI.exe - .NET Framework: .NET 8 - Requirements: Windows 10+ or Windows Server 2016+

2. API Server (ASP.NET Core) - Location: C:\Release\BEXO\BEXO.API.dll - Service Name: BEXO_API_Prod - Port: 5443 (HTTPS) - Status: Windows Service or Scheduled Task

3. Database (SQL Server) - Database Name: BEXO_ERP - Tables: 98 - Size: ~500 MB typical (depends on data volume)


Service Management

Check Service Status

# View all BEXO services
Get-Service -Name "*BEXO*"

# Check specific service
Get-Service BEXO_API_Prod | Select Name, Status, StartType

# Check scheduled tasks
Get-ScheduledTask -TaskName "*BEXO*"

Restart API Service

# Recommended: Use script on server
C:\Tools\scripts\restart_api.ps1

# Manual restart
Stop-Service BEXO_API_Prod -Force
Start-Sleep -Seconds 10
Start-Service BEXO_API_Prod
Start-Sleep -Seconds 30

# Verify running
Get-Service BEXO_API_Prod
Invoke-RestMethod -Uri "https://localhost:5443/api/health" -SkipCertificateCheck

Scheduled Tasks

BEXO_DB_Backup (Daily 02:00 AM)

# View task
Get-ScheduledTask -TaskName "BEXO_DB_Backup" | Select *

# Trigger manually
Start-ScheduledTask -TaskName "BEXO_DB_Backup"

# View history
Get-ScheduledTaskInfo -TaskName "BEXO_DB_Backup"

BEXO_Health_Watchdog (Every 5 minutes)

# View task
Get-ScheduledTask -TaskName "BEXO_Health_Watchdog"

# View alert log
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 50

Database Administration

Connection String

Server=.\BEXO_ERP;
Database=BEXO_ERP;
Integrated Security=true;
TrustServerCertificate=true

Common DBA Tasks

Check Database Size

-- Size of BEXO_ERP database
SELECT 
    DB_NAME() AS DatabaseName,
    CONVERT(DECIMAL(10,2), SUM(size)/128.0) AS TotalSizeMB
FROM sys.database_files
WHERE database_id = DB_ID('BEXO_ERP')
GROUP BY database_id

Backup Database

-- Manual full backup
BACKUP DATABASE BEXO_ERP 
TO DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_manual.bak'
WITH FORMAT, INIT, COPY_ONLY, STATS=10

Restore Database

-- Restore from backup
RESTORE DATABASE BEXO_ERP 
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_2026-05-30_02-00.bak'
WITH REPLACE, RECOVERY

Verify Database Integrity

-- Check for logical errors
DBCC CHECKDB (BEXO_ERP, REPAIR_FAST)

View Table Row Counts

SELECT 
    OBJECT_NAME(i.object_id) AS TableName,
    SUM(s.row_count) AS RowCount
FROM sys.indexes AS i
INNER JOIN sys.dm_db_partition_stats AS s 
    ON i.object_id = s.object_id 
    AND i.index_id = s.index_id
WHERE database_id = DB_ID('BEXO_ERP')
    AND i.index_id <= 1
GROUP BY i.object_id
ORDER BY SUM(s.row_count) DESC

User Management

User Roles

Role Level Permissions
SuperAdmin 5 All access + user management
Admin 4 All operations within company
Manager 3 Department operations
User 2 Standard create/read
Design 1 Read-only (QA/Testing)

Create New User (SQL Direct)

-- Create user
INSERT INTO Users (Username, PasswordHash, FullName, Email, Role, IsActive, CreatedDate)
VALUES (
    'newuser',
    'hashed_password_here',
    'John Doe',
    '[email protected]',
    2,  -- Role: User (2=User, 3=Manager, 4=Admin)
    1,  -- Active
    GETDATE()
)

-- Assign to company
INSERT INTO UserCompanyAccess (UserId, CompanyId, IsActive)
SELECT u.Id, c.Id, 1
FROM Users u
CROSS JOIN Companies c
WHERE u.Username = 'newuser'
AND c.Name = 'Main Company'

Reset User Password

-- Generate new password hash (use bcrypt or PBKDF2)
-- Then update:
UPDATE Users 
SET PasswordHash = 'new_hashed_password'
WHERE Username = 'username'

Performance Tuning

API Performance Monitoring

# Check API process CPU/Memory
Get-Process -Name "BEXO*" | Select Name, CPU, WorkingSet -Verbose

# View IIS/API logs
Get-Content "C:\Windows\Logs\BEXO_API.log" -Tail 100

Database Performance

-- Find slow queries
SELECT 
    creation_time,
    last_execution_time,
    execution_count,
    total_elapsed_time / 1000000 AS TotalElapsedSec,
    total_elapsed_time / execution_count / 1000 AS AvgElapsedMS,
    text
FROM sys.dm_exec_query_stats qs
INNER JOIN sys.dm_exec_sql_text(qs.sql_handle) st 
    ON qs.sql_handle = st.sql_handle
ORDER BY qs.total_elapsed_time DESC

Cache Statistics

-- SQL Server buffer pool
SELECT 
    COUNT(*) * 8 / 1024 AS BufferPoolMB,
    (SELECT SUM(size) FROM sys.database_files 
     WHERE type_desc = 'ROWS') / 128 AS TotalDataMB

Security

Network Security

Firewall Rules:

# Allow LAN access to port 5443
New-NetFirewallRule -DisplayName "BEXO API - LAN" `
    -Direction Inbound `
    -LocalPort 5443 `
    -Protocol TCP `
    -RemoteAddress 192.168.0.0/16 `
    -Action Allow

SSL Certificate Management

# View current certificate
Get-ChildItem -Path Cert:\LocalMachine\My | Where {$_.FriendlyName -like "*BEXO*"}

# Install new certificate
Import-PfxCertificate -FilePath C:\certs\bexo.pfx -CertStoreLocation Cert:\LocalMachine\My

# Update Kestrel config (needs code change)
# Edit Program.cs: ConfigureKestrel() with new cert thumbprint

SQL Server Security

-- Create SQL user for API
CREATE LOGIN [BEXO_API] WITH PASSWORD = 'strong_password'

-- Create database user
CREATE USER [BEXO_API] FOR LOGIN [BEXO_API]

-- Grant permissions
ALTER ROLE db_owner ADD MEMBER [BEXO_API]

Disaster Recovery

Backup Locations

Local:      C:\Backups\BEXO_SQL\
NAS Mirror: \\nas.company.local\BEXO_Deploy\db_backups\

Full Recovery Procedure

If database corrupted:

# 1. Stop all services
Stop-Service BEXO_API_Prod

# 2. Find latest good backup
$backups = Get-ChildItem C:\Backups\BEXO_SQL\ | Sort LastWriteTime -Descending
$backups | Select FullName, LastWriteTime | Head -5

# 3. Restore
$backupFile = $backups[0].FullName
sqlcmd -S . -Q "RESTORE DATABASE BEXO_ERP FROM DISK = '$backupFile' WITH REPLACE, RECOVERY"

# 4. Restart service
Start-Service BEXO_API_Prod

# 5. Verify
Invoke-RestMethod -Uri https://localhost:5443/api/health -SkipCertificateCheck

Backup Verification

-- Verify backup integrity
RESTORE VERIFYONLY 
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_2026-05-30_02-00.bak'

-- Restore to test database (off-hours only)
RESTORE DATABASE BEXO_ERP_TEST 
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_latest.bak'
WITH MOVE 'BEXO_ERP' TO 'C:\Data\BEXO_ERP_TEST.mdf',
     MOVE 'BEXO_ERP_log' TO 'C:\Logs\BEXO_ERP_TEST.ldf'

Upgrade & Patch Management

API Version Check

# Current version from executable
(Get-Item C:\Release\BEXO\BEXO.API.dll).VersionInfo.ProductVersion

# From API endpoint
Invoke-RestMethod -Uri https://localhost:5443/api/version -SkipCertificateCheck

Deployment Steps

# 1. Backup current release
Copy-Item -Path "C:\Release\BEXO" -Destination "C:\Release\BEXO_backup_$(Get-Date -Format 'yyyyMMdd')" -Recurse

# 2. Stop API
Stop-Service BEXO_API_Prod

# 3. Copy new binaries
Copy-Item -Path "\\nas\releases\BEXO_v2.1.0\*" -Destination "C:\Release\BEXO\" -Recurse -Force

# 4. Update appsettings if needed
# (Verify connection strings, JWT key, cert path)

# 5. Start API
Start-Service BEXO_API_Prod

# 6. Monitor for errors
Start-Sleep 30
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 20

Logging & Monitoring

Application Logs

API Logs:       C:\Tools\logs\BEXO_API.log
Alert Log:      C:\Tools\logs\bexo_alerts.log
Event Viewer:   Windows Logs → Application (Source: BEXO)

View Recent Errors

# Last 50 entries
Get-Content C:\Tools\logs\BEXO_API.log -Tail 50

# Filter by date
Get-Content C:\Tools\logs\BEXO_API.log | Select-String "ERROR"

# Real-time monitoring
Get-Content C:\Tools\logs\BEXO_API.log -Tail 20 -Wait

Troubleshooting Guide

API Won't Start

# Check logs
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 20

# Verify port not in use
Get-NetTCPConnection -LocalPort 5443

# Verify certificate exists
Get-ChildItem -Path Cert:\LocalMachine\My

# Restart with debug
$svc = Get-Service BEXO_API_Prod
Stop-Service $svc -Force
Start-Sleep 15
Start-Service $svc

Database Connection Failed

-- Check database exists
SELECT name FROM sys.databases WHERE name = 'BEXO_ERP'

-- Check login
SELECT name FROM sys.sql_logins WHERE name = 'BEXO_API'

-- Check user permissions
EXEC sp_helpuser 'BEXO_API'

Users Can't Login

-- Check user exists
SELECT * FROM Users WHERE Username = 'marketing2'

-- Check user active
SELECT Username, IsActive, Role FROM Users WHERE IsActive = 1

-- Check user has company access
SELECT u.Username, c.Name, uca.IsActive
FROM Users u
INNER JOIN UserCompanyAccess uca ON u.Id = uca.UserId
INNER JOIN Companies c ON uca.CompanyId = c.Id
WHERE u.Username = 'marketing2'

Maintenance Schedule

DAILY:
  02:00 AM - Automated backup (BEXO_DB_Backup task)
  Every 5 min - Health check & auto-restart (BEXO_Health_Watchdog)

WEEKLY:
  Monday 23:00 - Verify backup integrity

MONTHLY:
  Last Friday - Review logs for errors
  - Verify backup retention (7-day rolling)
  - Check database growth rate
  - Review user access (inactive accounts)

QUARTERLY:
  - Security audit (SSL cert expiration, user permissions)
  - Database maintenance (DBCC CHECKDB)
  - Disaster recovery drill

Contact & Support

System Owner: Application Management Team
DBA On-Call: Ext. 2100 (24/7)
Network On-Call: Ext. 2200 (24/7)


Last Updated: 2026-05-30
Version: 1.0