জি ভাই। এখন আপনি **live client software-এ শুধু OLT-related code বসাবেন**—তাই সবচেয়ে safe way হলো **OLT-specific files direct upload**, আর যেসব shared file-এ অন্য module-এর code-ও আছে সেগুলো **merge** করা।

নিচের order-এ করুন।

1. **প্রথমে live project backup নিন।** বিশেষ করে `app/`, `resources/views/`, `routes/`, `database/seeders/` folder-এর backup রাখুন। Database backup থাকলে আরও ভালো।

2. **এই OLT-specific files/folders direct upload/replace করতে পারেন**—এগুলো মূলত OLT module-এর জন্যই:

```text
app/Contracts/Olt/
    OltDriverInterface.php
    SnmpClientInterface.php

app/Services/Olt/
    NativePhpSnmpClient.php
    OltDriverResolver.php
    PhotonEponSnmpDriver.php
    OltConnectionService.php
    OltSyncService.php
    OltCustomerBindingService.php
    OltOnuAutoMatchService.php
    OltBackgroundPollingService.php
    OltMonitoringEventService.php

app/Models/
    Olt.php
    OltOnu.php
    OltOnuEvent.php
    OltOnuAlert.php

app/Observers/
    OltOnuObserver.php

app/Console/Commands/
    OltPollCommand.php
    OltMonitoringReconcileCommand.php

app/Http/Controllers/
    OltController.php
    OltSyncController.php
    OltOnuController.php
    OltOnuAutoMatchController.php
    OltMonitoringController.php

config/
    olt_monitoring.php
```

এরপর OLT views-এর **local final folderগুলো same path-এ live-এ দিন**:

```text
resources/views/admin/olts/

resources/views/admin/olt-onus/

resources/views/admin/olt-onu-auto-match/

resources/views/admin/olt-monitoring/
```

Folder name local project-এ যেভাবে আছে, **ঠিক সেই path-টাই follow করবেন**।

3. **এই shared files direct blind overwrite করবেন না**। Local আর live compare করে OLT-related অংশ merge করবেন:

```text
app/Providers/AppServiceProvider.php

routes/web.php

routes/console.php

resources/views/layouts/admin/includes/sidebar.blade.php

database/seeders/PermissionTableSeeder.php
```

এগুলোর কাজ:

```text
AppServiceProvider.php
→ SNMP client + OLT driver binding

routes/web.php
→ OLT CRUD
→ ONU management
→ ONU sync
→ Auto matching
→ Monitoring
→ Alert acknowledge routes

routes/console.php
→ Status polling schedule
→ Optical polling schedule

sidebar.blade.php
→ OLT Management menu

PermissionTableSeeder.php
→ OLT permissions
```

`routes/console.php`-এ আপনার existing billing/reseller/SMS schedules মুছবেন না। শুধু OLT schedules ensure করবেন:

```php
Schedule::command('olt:poll --mode=status --budget=50')
    ->everyFiveMinutes()
    ->timezone('Asia/Dhaka')
    ->withoutOverlapping(10)
    ->appendOutputTo(storage_path('logs/olt-status-poll.log'));

Schedule::command('olt:poll --mode=optical --budget=50')
    ->cron('2,17,32,47 * * * *')
    ->timezone('Asia/Dhaka')
    ->withoutOverlapping(20)
    ->appendOutputTo(storage_path('logs/olt-optical-poll.log'));
```

4. **Customer Details-এ OLT Live দেখতে চাইলে এই files-ও লাগবে।** এগুলো shared, তাই local final version carefully merge করবেন:

```text
app/Models/CustomerService.php

app/Http/Controllers/CustomerController.php

resources/views/admin/customers/show.blade.php

resources/views/admin/customers/partials/
    olt-live-monitoring.blade.php
```

`CustomerService.php`-এ relation থাকতে হবে:

```php
public function oltOnu(): HasOne
{
    return $this->hasOne(
        OltOnu::class,
        'customer_service_id'
    );
}
```

এখানে অবশ্যই proper importsও local final file অনুযায়ী থাকবে।

5. **Auto ONU Matching-এর জন্য PPPoE last Caller-ID code-ও live-এ দিতে হবে।** শুধু database-এর `last_caller_id` column থাকলেই হবে না। Local project-এ যে MikroTik PPPoE sync code RouterOS-এর `last-caller-id` read করে `mikrotik_pppoe_secrets.last_caller_id`-এ save করছে, সেই updated fileটাও live-এ দিতে হবে।

বিশেষ করে local-vs-live compare করুন:

```text
app/Models/MikrotikPppoeSecret.php
```

এবং আপনার PPPoE secret synchronization service/controller—যে file-এ:

```text
last-caller-id
```

read/save করা হয়েছে।

এই অংশ বাদ দিলে OLT Management চলবে, কিন্তু **automatic PPPoE ↔ ONU matching ঠিকমতো কাজ নাও করতে পারে**।

6. Migration files codebase-এ রাখতে পারেন, যেমন:

```text
create_olts_table
create_olt_onus_table
create_olt_onu_events_table
create_olt_onu_alerts_table
```

কিন্তু live database schema manually তৈরি থাকলে এখন:

```bash
php artisan migrate
```

**চালাবেন না।**

এগুলো শুধু project code complete রাখার জন্য upload করতে পারেন।

7. সব files বসানো শেষ হলে cPanel Terminal-এ project directory-তে যান:

```bash
cd /home/USERNAME/YOUR_PROJECT
```

তারপর:

```bash
composer dump-autoload -o
php artisan optimize:clear
php artisan db:seed --class=PermissionTableSeeder
```

তারপর OLT commands এসেছে কিনা:

```bash
php artisan list | grep -i "olt:"
```

দেখার কথা:

```text
olt:poll
olt:monitoring-reconcile
```

তারপর:

```bash
php artisan schedule:list
```

দেখার কথা:

```text
*/5        php artisan olt:poll --mode=status --budget=50

2,17,32,47 php artisan olt:poll --mode=optical --budget=50
```

8. এরপর browser-এ:

```text
OLT Management
→ OLT Devices
```

যান।

Client-এর OLT add/configure করুন:

```text
Name
Vendor
Model
Management Host
SNMP Port
SNMP Version
Community
PON Count
Max ONU/PON
```

তারপর:

```text
Test Connection
```

**Connected** হলে পরের ধাপ।

9. এরপর ONU Sync দিন:

```text
OLT Management
→ ONU Sync
```

বা আপনার UI-এর Sync button।

প্রথম full sync-এর মাধ্যমে client-এর ONUগুলো:

```text
olt_onus
```

table-এ আসবে।

10. তারপর terminal test:

```bash
php artisan olt:poll --mode=status --olt=1 --budget=50
```

OLT ID যদি `1` না হয়, actual ID ব্যবহার করবেন।

তারপর:

```bash
php artisan olt:poll --mode=optical --olt=1 --budget=50
```

দুটো successful হলে background polling ready।

11. তারপর initial monitoring:

```bash
php artisan olt:monitoring-reconcile --olt=1
```

এটা current ONU state থেকে alert/monitoring initialize করবে।

12. এরপর UI check করবেন:

```text
OLT Management
→ ONU Management
→ ONU Details

OLT Management
→ ONU Auto Matching

OLT Management
→ OLT Monitoring

Customers
→ Customer Details
→ OLT / ONU Live Monitoring
```

সব ঠিক থাকলে code deployment complete।

13. সবশেষে **cPanel Cron Job** ensure করবেন। Production-এ `schedule:work` permanently ব্যবহার করবেন না। প্রতি মিনিটে Laravel scheduler run করতে হবে:

```bash
* * * * * cd /home/USERNAME/YOUR_PROJECT && /usr/local/bin/ea-php82 artisan schedule:run >> /dev/null 2>&1
```

আপনার actual project path এবং PHP binary অনুযায়ী path বসাবেন।

সবচেয়ে গুরুত্বপূর্ণভাবে, **direct upload group** হচ্ছে:

```text
app/Contracts/Olt/
app/Services/Olt/
app/Models/Olt*.php
app/Observers/OltOnuObserver.php
app/Console/Commands/Olt*
app/Http/Controllers/Olt*
config/olt_monitoring.php

resources/views/admin/olts/
resources/views/admin/olt-onus/
resources/views/admin/olt-onu-auto-match/
resources/views/admin/olt-monitoring/
```

আর **merge group** হচ্ছে:

```text
app/Providers/AppServiceProvider.php
app/Models/CustomerService.php
app/Http/Controllers/CustomerController.php

routes/web.php
routes/console.php

resources/views/admin/customers/show.blade.php
resources/views/admin/customers/partials/olt-live-monitoring.blade.php
resources/views/layouts/admin/includes/sidebar.blade.php

database/seeders/PermissionTableSeeder.php
```

আপনি চাইলে deployment আরও safe করতে **প্রথমে local project-এ এই command চালিয়ে output আমাকে দিন**:

```powershell
git status --short
```

আমি তখন আপনার actual changed files দেখে একদম line-by-line বলে দিতে পারব—**কোনটা live-এ upload করবেন, কোনটা merge করবেন, কোনটা OLT-এর সাথে সম্পর্কিত না বলে বাদ দেবেন।**



================v2


app/Services/Olt/Drivers/HsgqEponSnmpDriver.php

app/Models/Olt.php
app/Http/Controllers/OltController.php
app/Providers/AppServiceProvider.php

database/migrations/2026_08_08_230900_create_olts_table.php
resources/views/admin/olts/index.blade.php


ALTER TABLE `olts`
    ADD COLUMN `vendor_api_enabled`
        TINYINT(1) NOT NULL DEFAULT 0
        AFTER `retries`,

    ADD COLUMN `vendor_api_base_url`
        VARCHAR(500) NULL
        AFTER `vendor_api_enabled`,

    ADD COLUMN `vendor_api_login_name`
        VARCHAR(150) NULL
        AFTER `vendor_api_base_url`,

    ADD COLUMN `vendor_api_login_value`
        TEXT NULL
        AFTER `vendor_api_login_name`,

    ADD COLUMN `vendor_api_timeout_seconds`
        TINYINT UNSIGNED NOT NULL DEFAULT 8
        AFTER `vendor_api_login_value`;


---------------------------------------------------------

---------------------------------------------
v-sol
PS C:\xampp\htdocs\isp_orbit_erp> git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   app/Models/Olt.php
        modified:   app/Providers/AppServiceProvider.php

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        app/Services/Olt/Drivers/VsolEponSnmpDriver.php

no changes added to commit (use "git add" and/or "git commit -a")
PS C:\xampp\htdocs\isp_orbit_erp> 

---------------------------------------------