Files
ERP-upgrade/resources/views/clients/show.blade.php
2026-07-27 09:03:12 +00:00

494 lines
28 KiB
PHP

@extends('layouts.masterbeta')
@section('page-title')
Clients | {{ $showclient->name }}
@endsection
@section('breadcrumbs')
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a href="{{ url('/clients') }}" class="text-decoration-none">Clients</a></li>
<li class="breadcrumb-item active" aria-current="page">{{ $showclient->name }}</li>
</ol>
</nav>
@endsection
@section('content')
<div class="container-fluid px-0">
<!-- Header Section -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div class="d-flex align-items-center">
<div class="avatar-circle bg-primary text-white me-3 d-flex justify-content-center align-items-center fw-bold shadow-sm" style="width: 54px; height: 54px; border-radius: 50%; font-size: 1.5rem;">
{{ substr($showclient->name, 0, 2) }}
</div>
<div>
<h3 class="fw-bold mb-1 text-dark">{{ $showclient->name }}</h3>
<div class="text-secondary d-flex align-items-center" style="font-size: 0.9rem;">
<i class="bi bi-geo-alt-fill text-danger me-1"></i> {{ $showclient->country ?? 'Unknown Location' }}
<span class="mx-2"></span>
<i class="bi bi-building me-1"></i> {{ $showclient->company_type ?? 'N/A' }}
<span class="mx-2"></span>
@if($showclient->status == 'Live' || $showclient->status == 'active')
<span class="badge bg-success bg-opacity-10 text-success"><i class="bi bi-check-circle me-1"></i>Active</span>
@else
<span class="badge bg-warning bg-opacity-10 text-warning"><i class="bi bi-clock me-1"></i>{{ ucfirst($showclient->status) }}</span>
@endif
</div>
</div>
</div>
<div>
<!-- Button to trigger the Edit modal or go to edit page -->
<button class="btn btn-primary fw-bold shadow-sm px-4" data-bs-toggle="modal" data-bs-target="#editClientModal">
<i class="bi bi-pencil-square me-2"></i> Edit Client
</button>
</div>
</div>
<!-- Main Grid Layout -->
<div class="row g-4 mb-5">
<!-- COLUMN 1 -->
<div class="col-lg-4 d-flex flex-column">
<!-- Company Profile -->
<div class="card border-light-subtle shadow-sm mb-4">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-info-circle text-primary me-2"></i> Company Profile
</h6>
</div>
<div class="card-body">
<ul class="list-group list-group-flush">
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Industry</span>
<span class="fw-medium text-dark">{{ $showclient->industry ?? 'N/A' }}</span>
</li>
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Type</span>
<span class="fw-medium text-dark">{{ $showclient->type ?? 'N/A' }}</span>
</li>
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Acquisition</span>
<span class="fw-medium text-dark">{{ $showclient->how_we_got_client ?? 'N/A' }}</span>
</li>
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Date Added</span>
<span class="fw-medium text-dark">{{ $showclient->created_at ? \Carbon\Carbon::parse($showclient->created_at)->format('d M Y') : 'N/A' }}</span>
</li>
</ul>
</div>
</div>
<!-- Primary Contact (Will now stretch automatically) -->
<div class="card border-light-subtle shadow-sm flex-grow-1">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-person-badge text-primary me-2"></i> Primary Contact
</h6>
</div>
<div class="card-body">
<div class="mb-3">
<div class="text-muted small mb-1">Contact Person</div>
<div class="fw-bold text-dark">{{ $showclient->contact_person ?? 'N/A' }}</div>
</div>
<div class="mb-3">
<div class="text-muted small mb-1">Email Address</div>
<div class="fw-medium text-primary"><a href="mailto:{{ $showclient->email }}" class="text-decoration-none">{{ $showclient->email ?? 'N/A' }}</a></div>
</div>
<div class="mb-3">
<div class="text-muted small mb-1">Phone Number</div>
<div class="fw-medium text-dark">{{ $showclient->phone ?? 'N/A' }}</div>
</div>
<div class="row">
<div class="col-6">
<div class="text-muted small mb-1">Skype</div>
<div class="fw-medium text-dark">{{ $showclient->skype_name ?? 'N/A' }}</div>
</div>
<div class="col-6">
<div class="text-muted small mb-1">LinkedIn</div>
<div class="fw-medium text-dark">{{ $showclient->linkedin_name ?? 'N/A' }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- COLUMN 2 -->
<div class="col-lg-4">
<!-- Service & Billing -->
<div class="card border-light-subtle shadow-sm mb-4">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-wallet2 text-primary me-2"></i> Service & Billing
</h6>
</div>
<div class="card-body">
<div class="mb-3">
<div class="text-muted small mb-2">Subscribed Services</div>
<div>
@php
$services = json_decode($showclient->services, true) ?? [];
@endphp
@if(count($services) > 0)
@foreach($services as $service)
<span class="badge bg-secondary bg-opacity-10 text-secondary border me-1">{{ $service }}</span>
@endforeach
@else
<span class="text-muted small">N/A</span>
@endif
</div>
</div>
<div class="row mb-3">
<div class="col-6">
<div class="text-muted small mb-1">Billing Mode</div>
<div class="fw-bold text-dark text-uppercase">{{ $showclient->pay_mode ?? 'N/A' }}</div>
</div>
<div class="col-6">
<div class="text-muted small mb-1">Currency</div>
<div class="fw-bold text-dark">{{ $showclient->currency ?? 'N/A' }}</div>
</div>
</div>
<div class="mb-2">
<div class="text-muted small mb-1">Message Types</div>
<div>
@php
$msgTypes = json_decode($showclient->message_types, true) ?? [];
@endphp
@if(count($msgTypes) > 0)
@foreach($msgTypes as $type)
<span class="badge bg-info bg-opacity-10 text-info border border-info me-1">{{ $type }}</span>
@endforeach
@else
<span class="text-muted small">N/A</span>
@endif
</div>
</div>
</div>
</div>
<!-- Contract Details -->
<div class="card border-light-subtle shadow-sm">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-file-earmark-text text-primary me-2"></i> Contract Details
</h6>
</div>
<div class="card-body">
<ul class="list-group list-group-flush">
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Contract Type</span>
<span class="fw-medium text-dark">{{ $showclient->contract_type ?? 'N/A' }}</span>
</li>
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Auto Renew</span>
@if($showclient->contract_auto_renew == 'YES')
<span class="badge bg-success">Yes</span>
@else
<span class="badge bg-secondary">No</span>
@endif
</li>
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-center border-0">
<span class="text-muted small">Validity (Expiry)</span>
@if($showclient->contract_validity && $showclient->contract_validity != '1970-01-01 22:00:00')
<span class="fw-medium text-dark">{{ \Carbon\Carbon::parse($showclient->contract_validity)->format('d M Y') }}</span>
@else
<span class="text-muted small">N/A</span>
@endif
</li>
<li class="list-group-item px-0 py-2 border-0 mt-2 bg-light rounded">
<div class="text-muted small mb-1">SMPP Username</div>
<div class="fw-bold text-dark font-monospace">{{ $showclient->smpp_username ?? 'N/A' }}</div>
</li>
</ul>
</div>
</div>
</div>
<!-- COLUMN 3 -->
<div class="col-lg-4">
<!-- Onboarding Progress -->
<div class="card border-light-subtle shadow-sm mb-4">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-graph-up text-primary me-2"></i> Onboarding Progress
</h6>
</div>
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-2">
<div class="text-muted small fw-bold">Current Stage</div>
<div class="badge bg-primary">{{ $showclient->progress_indicator ?? 'N/A' }}</div>
</div>
@php
$score = $showclient->progress_indicator_score ?? 0;
$scoreColor = $score >= 100 ? 'bg-success' : ($score >= 50 ? 'bg-primary' : 'bg-warning');
@endphp
<div class="d-flex justify-content-between align-items-center mt-3 mb-1">
<span class="text-muted small">Completion Score</span>
<span class="fw-bold text-dark">{{ $score }}%</span>
</div>
<div class="progress" style="height: 8px;">
<div class="progress-bar {{ $scoreColor }}" role="progressbar" style="width: {{ $score }}%" aria-valuenow="{{ $score }}" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</div>
<!-- Communication Channels -->
<div class="card border-light-subtle shadow-sm">
<div class="card-header bg-white py-3 border-bottom border-light">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-chat-dots text-primary me-2"></i> Communications
</h6>
</div>
<div class="card-body">
<!-- Helper Macro for JSON Emails/Phones -->
@php
function renderBadges($jsonString, $type = 'email') {
$items = json_decode($jsonString, true) ?? [];
if(count($items) === 0) return '<span class="text-muted small">N/A</span>';
$html = '';
foreach($items as $item) {
$icon = $type == 'email' ? 'bi-envelope' : 'bi-telephone';
$html .= '<span class="badge bg-light text-dark border me-1 mb-1"><i class="bi '.$icon.' text-secondary me-1"></i>'.$item.'</span>';
}
return $html;
}
@endphp
<div class="mb-3">
<div class="text-muted small mb-1">Finance Emails</div>
<div>{!! renderBadges($showclient->finance_email, 'email') !!}</div>
</div>
<div class="mb-3">
<div class="text-muted small mb-1">Support Emails</div>
<div>{!! renderBadges($showclient->support_emails, 'email') !!}</div>
</div>
<div class="mb-3">
<div class="text-muted small mb-1">Rate Emails</div>
<div>{!! renderBadges($showclient->rate_emails, 'email') !!}</div>
</div>
<div class="mb-0">
<div class="text-muted small mb-1">Support Phones</div>
<div>{!! renderBadges($showclient->support_phones, 'phone') !!}</div>
</div>
</div>
</div>
</div>
</div>
<!-- Tabs Navigation for Additional Records -->
<div class="card border-light-subtle shadow-sm mt-5 mb-4">
<div class="card-header bg-white py-3 border-bottom d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3">
<!-- Tab Links -->
<ul class="nav nav-tabs card-header-tabs m-0" id="clientRecordTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active fw-bold text-dark" id="shortcodes-tab" data-bs-toggle="tab" data-bs-target="#shortcodes-pane" type="button" role="tab">
<i class="bi bi-code-square text-primary me-1"></i> Short Codes
<span class="badge bg-primary bg-opacity-10 text-primary ms-1">{{ count($voice_codes) + count($sms_codes) + count($ussd_codes) }}</span>
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fw-bold text-dark" id="payments-tab" data-bs-toggle="tab" data-bs-target="#payments-pane" type="button" role="tab">
<i class="bi bi-wallet2 text-primary me-1"></i> Payments
<span class="badge bg-primary bg-opacity-10 text-primary ms-1">{{ count($recent_payments) }}</span>
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link fw-bold text-dark" id="files-tab" data-bs-toggle="tab" data-bs-target="#files-pane" type="button" role="tab">
<i class="bi bi-file-earmark-arrow-down text-primary me-1"></i> Documents
<span class="badge bg-primary bg-opacity-10 text-primary ms-1">{{ count($showdocuments) }}</span>
</button>
</li>
</ul>
<!-- Action Buttons Corresponding to Tabs -->
<div class="tab-action-buttons">
<button type="button" class="btn btn-sm btn-outline-primary fw-bold" data-bs-toggle="modal" data-bs-target="#addShortcodeModal">
<i class="bi bi-plus-lg me-1"></i> Add Short Code
</button>
<button type="button" class="btn btn-sm btn-outline-primary fw-bold ms-1" data-bs-toggle="modal" data-bs-target="#addPaymentModal">
<i class="bi bi-plus-lg me-1"></i> Add Payment
</button>
<button type="button" class="btn btn-sm btn-outline-primary fw-bold ms-1" data-bs-toggle="modal" data-bs-target="#uploadDocumentModal">
<i class="bi bi-upload me-1"></i> Upload Doc
</button>
</div>
</div>
<div class="card-body bg-light tab-content" id="clientRecordTabsContent">
<!-- TAB 1: SHORT CODES -->
<div class="tab-pane fade show active" id="shortcodes-pane" role="tabpanel" tabindex="0">
@php
$allCodes = collect($voice_codes)->concat($sms_codes)->concat($ussd_codes);
@endphp
@if($allCodes->count() > 0)
<div class="table-responsive">
<table class="table table-hover align-middle mb-0 bg-white border rounded">
<thead class="table-light">
<tr style="font-size: 0.8rem;" class="text-secondary text-uppercase">
<th>Type</th>
<th>Shortcode</th>
<th>Network</th>
<th>Status</th>
<th>Expiry Date</th>
</tr>
</thead>
<tbody>
@foreach($allCodes as $code)
<tr>
<td><span class="badge bg-secondary text-uppercase" style="font-size: 0.7rem;">{{ $code->code_type ?? 'N/A' }}</span></td>
<td class="fw-bold text-dark font-monospace">{{ $code->shortcode ?? 'N/A' }}</td>
<td>{{ $code->network ?? 'N/A' }}</td>
<td>
<span class="badge bg-success bg-opacity-10 text-success">{{ $code->status ?? 'Active' }}</span>
</td>
<td class="text-muted small">{{ $code->expiry_date ? \Carbon\Carbon::parse($code->expiry_date)->format('d M Y') : 'N/A' }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="text-center py-4 text-muted small">
<i class="bi bi-folder2-open fs-4 d-block mb-1"></i> No short codes assigned to this client.
</div>
@endif
</div>
<!-- TAB 2: PAYMENTS -->
<div class="tab-pane fade" id="payments-pane" role="tabpanel" tabindex="0">
@if(isset($recent_payments) && count($recent_payments) > 0)
<div class="table-responsive" style="max-height: 450px; overflow-y: auto;">
<table class="table table-hover align-middle mb-0 bg-white border rounded">
<thead class="table-light">
<tr style="font-size: 0.8rem;" class="text-secondary text-uppercase">
<th>Invoice #</th>
<th>Amount</th>
<th>Date</th>
<th>Status</th>
</tr>
</thead>
<tbody>
@foreach($recent_payments as $payment)
<tr>
<td class="fw-bold text-dark">{{ $payment->invoice_number ?? 'N/A' }}</td>
<td class="fw-semibold text-success">{{ number_format($payment->invoice_amount ?? 0, 2) }}</td>
<td class="text-muted small">{{ $payment->invoice_date ? \Carbon\Carbon::parse($payment->invoice_date)->format('d M Y') : 'N/A' }}</td>
<td>
<span class="badge bg-info bg-opacity-10 text-info text-uppercase">{{ $payment->invoice_status ?? 'Pending' }}</span>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="text-center py-4 text-muted small">
<i class="bi bi-wallet fs-4 d-block mb-1"></i> No payment records found.
</div>
@endif
</div>
<!-- TAB 3: DOCUMENTS -->
<div class="tab-pane fade" id="files-pane" role="tabpanel" tabindex="0">
@if(isset($showdocuments) && count($showdocuments) > 0)
<div class="row g-3">
@foreach($showdocuments as $file)
<div class="col-md-4">
<div class="card border bg-white shadow-sm p-3 d-flex flex-row align-items-center justify-content-between">
<div class="d-flex align-items-center overflow-hidden">
<i class="bi bi-file-earmark-text fs-3 text-primary me-3"></i>
<div class="text-truncate">
<div class="fw-bold text-dark text-truncate" style="font-size: 0.9rem;" title="{{ $file->name }}">{{ $file->name }}</div>
<small class="text-muted text-uppercase" style="font-size: 0.7rem;">{{ $file->file_extension ?? 'file' }}</small>
</div>
</div>
@if(!empty($file->file_path))
<a href="{{ asset('storage/client_files/' . $file->file_path) }}" target="_blank" class="btn btn-sm btn-light text-primary" title="Download File">
<i class="bi bi-download"></i>
</a>
@endif
</div>
</div>
@endforeach
</div>
@else
<div class="text-center py-4 text-muted small">
<i class="bi bi-file-earmark-x fs-4 d-block mb-1"></i> No documents uploaded for this client.
</div>
@endif
</div>
</div>
</div>
<!-- Notes / Activity Log Section -->
<div class="card border-light-subtle shadow-sm mt-5 mb-5">
<div class="card-header bg-white py-3 border-bottom border-light d-flex justify-content-between align-items-center">
<h6 class="fw-bold mb-0 text-secondary text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">
<i class="bi bi-journal-text text-primary me-2"></i> Client Notes & Activity Logs
</h6>
<span class="badge bg-primary bg-opacity-10 text-primary">{{ count($show_notes) }} Entries</span>
</div>
<!-- Scrollable Container -->
<div class="card-body bg-light p-3" style="max-height: 450px; overflow-y: auto;">
@if(isset($show_notes) && count($show_notes) > 0)
<div class="timeline">
@foreach($show_notes as $note)
<div class="card border-0 shadow-sm mb-3">
<div class="card-body p-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<div class="d-flex align-items-center">
<!-- Author Avatar or Name -->
<div class="fw-bold text-dark me-2">
<i class="bi bi-person-circle text-secondary me-1"></i>
{{ $note->created_by_info->name ?? 'System User' }}
</div>
@if(isset($note->highlight) && $note->highlight == 'YES')
<span class="badge bg-warning bg-opacity-10 text-warning border border-warning-subtle" style="font-size: 0.7rem;">Highlighted</span>
@endif
</div>
<small class="text-muted" style="font-size: 0.8rem;">
<i class="bi bi-clock me-1"></i>{{ \Carbon\Carbon::parse($note->created_at)->format('d M Y, h:i A') }}
</small>
</div>
<!-- Note Content -->
<p class="mb-0 text-dark" style="white-space: pre-wrap; font-size: 0.95rem;">
{{ $note->notes_body ?? $note->note ?? $note->content ?? 'No content found' }}
</p>
</div>
</div>
@endforeach
</div>
@else
<div class="text-center py-4 text-muted small">
<i class="bi bi-journal-x fs-4 d-block mb-1"></i> No notes recorded for this client yet.
</div>
@endif
</div>
</div>
</div>
@include('clients.partials.shortcode-payment-docs-modal')
@endsection
@section('scripts')
<script src="{{ asset('js/client-show-modals.js') }}"></script>
@endsection