> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/Braian551/viax/llms.txt
> Use this file to discover all available pages before exploring further.

# Company Management

> Manage transport companies, assign drivers, and track performance

## Overview

Company Management provides tools for creating and managing transport companies, assigning drivers, and monitoring company performance within the Viax platform.

## Transport Company Entity

Companies are represented by a comprehensive entity:

```dart admin/domain/entities/empresa_transporte.dart theme={null}
class EmpresaTransporte {
  final int id;
  final String nombre;
  final String? nit;
  final String? razonSocial;
  final String? email;
  final String? telefono;
  final String? telefonoSecundario;
  final String? direccion;
  final String? municipio;
  final String? departamento;
  final String? representanteNombre;
  final String? representanteTelefono;
  final String? representanteEmail;
  final List<String> tiposVehiculo;
  final String? logoUrl;
  final String? descripcion;
  final EmpresaEstado estado;
  final bool verificada;
  final DateTime? fechaVerificacion;
  final int? verificadoPor;
  final int totalConductores;
  final int totalViajesCompletados;
  final double calificacionPromedio;
  final double comisionAdminPorcentaje;
  final DateTime creadoEn;
  final DateTime? actualizadoEn;
  final int? creadoPor;
  final String? notasAdmin;
}
```

## Company States

<Tabs>
  <Tab title="Active">
    **Status:** `activo`

    **Display:** Activo

    Company is operational and accepting drivers
  </Tab>

  <Tab title="Inactive">
    **Status:** `inactivo`

    **Display:** Inactivo

    Company temporarily suspended operations
  </Tab>

  <Tab title="Suspended">
    **Status:** `suspendido`

    **Display:** Suspendido

    Company suspended by admin for policy violations
  </Tab>

  <Tab title="Pending">
    **Status:** `pendiente`

    **Display:** Pendiente

    New company awaiting verification
  </Tab>

  <Tab title="Deleted">
    **Status:** `eliminado`

    **Display:** Eliminado

    Company soft-deleted from the system
  </Tab>
</Tabs>

### Estado Enum Implementation

```dart admin/domain/entities/empresa_transporte.dart theme={null}
enum EmpresaEstado {
  activo('activo', 'Activo'),
  inactivo('inactivo', 'Inactivo'),
  suspendido('suspendido', 'Suspendido'),
  pendiente('pendiente', 'Pendiente'),
  eliminado('eliminado', 'Eliminado');

  final String value;
  final String displayName;
  
  const EmpresaEstado(this.value, this.displayName);

  static EmpresaEstado fromString(String? value) {
    return EmpresaEstado.values.firstWhere(
      (e) => e.value == value,
      orElse: () => EmpresaEstado.activo,
    );
  }
}
```

## Company Statistics

Track platform-wide company metrics:

```dart admin/domain/entities/empresa_transporte.dart theme={null}
class EmpresaStats {
  final int totalEmpresas;
  final int activas;
  final int inactivas;
  final int pendientes;
  final int verificadas;
  final int totalConductores;
  final int totalViajes;

  const EmpresaStats({
    required this.totalEmpresas,
    required this.activas,
    required this.inactivas,
    required this.pendientes,
    required this.verificadas,
    required this.totalConductores,
    required this.totalViajes,
  });
}
```

<CardGroup cols={3}>
  <Card title="Total Companies" icon="building">
    All registered transport companies
  </Card>

  <Card title="Active Companies" icon="check-circle" color="#11998e">
    Currently operational companies
  </Card>

  <Card title="Total Drivers" icon="users">
    Drivers across all companies
  </Card>

  <Card title="Verified Companies" icon="shield-check" color="#667eea">
    Companies with verified credentials
  </Card>

  <Card title="Pending" icon="clock" color="#ffa726">
    Companies awaiting verification
  </Card>

  <Card title="Total Trips" icon="route">
    Completed trips across all companies
  </Card>
</CardGroup>

## Company Information Fields

### Basic Information

```json theme={null}
{
  "nombre": "Transportes Rápidos S.A.",
  "nit": "900123456-7",
  "razon_social": "Transportes Rápidos Sociedad Anónima",
  "descripcion": "Empresa de transporte especializada en servicio urbano"
}
```

### Contact Information

```json theme={null}
{
  "email": "info@transportesrapidos.com",
  "telefono": "+57 601 234 5678",
  "telefono_secundario": "+57 312 345 6789",
  "direccion": "Calle 123 #45-67",
  "municipio": "Bogotá",
  "departamento": "Cundinamarca"
}
```

### Legal Representative

```json theme={null}
{
  "representante_nombre": "Carlos Gómez",
  "representante_telefono": "+57 310 123 4567",
  "representante_email": "cgomez@transportesrapidos.com"
}
```

### Service Configuration

```json theme={null}
{
  "tipos_vehiculo": ["carro", "moto", "carro_carga"],
  "comision_admin_porcentaje": 15.0,
  "logo_url": "https://example.com/logos/empresa-123.png"
}
```

### Performance Metrics

```json theme={null}
{
  "total_conductores": 45,
  "total_viajes_completados": 1250,
  "calificacion_promedio": 4.7
}
```

## Vehicle Types

Companies can support multiple vehicle categories:

<CardGroup cols={4}>
  <Card title="Motorcycle" icon="motorcycle">
    `moto`

    Standard motorcycle transport
  </Card>

  <Card title="Car" icon="car">
    `carro`

    Passenger vehicle service
  </Card>

  <Card title="Cargo Moto" icon="box">
    `moto_carga`

    Motorcycle delivery service
  </Card>

  <Card title="Cargo Van" icon="truck">
    `carro_carga`

    Van/truck cargo service
  </Card>
</CardGroup>

## Company Repository

Data access layer for company operations:

```dart admin/domain/repositories/empresa_repository.dart theme={null}
abstract class EmpresaRepository {
  /// Get all companies with optional filters
  Future<Result<List<EmpresaTransporte>>> getEmpresas({
    EmpresaEstado? estado,
    bool? verificada,
    int? page,
    int? limit,
  });

  /// Get company by ID
  Future<Result<EmpresaTransporte>> getEmpresaById(int id);

  /// Create new company
  Future<Result<EmpresaTransporte>> createEmpresa(
    EmpresaTransporte empresa,
  );

  /// Update company information
  Future<Result<EmpresaTransporte>> updateEmpresa(
    int id,
    Map<String, dynamic> updates,
  );

  /// Delete company (soft delete)
  Future<Result<void>> deleteEmpresa(int id);

  /// Get company statistics
  Future<Result<EmpresaStats>> getEmpresaStats();

  /// Verify company
  Future<Result<void>> verifyEmpresa(int id, int adminId);

  /// Get drivers by company
  Future<Result<List<dynamic>>> getDriversByEmpresa(int empresaId);
}
```

## Company Provider

State management for company operations:

```dart admin/presentation/providers/empresa_provider.dart theme={null}
class EmpresaProvider with ChangeNotifier {
  final EmpresaRepository repository;
  
  List<EmpresaTransporte> _empresas = [];
  EmpresaStats? _stats;
  bool _isLoading = false;
  String? _errorMessage;
  EmpresaEstado? _currentFilter;

  Future<void> loadEmpresas({bool refresh = false}) async {
    _setLoading(true);
    
    final result = await repository.getEmpresas(
      estado: _currentFilter,
      page: 1,
      limit: 50,
    );

    result.fold(
      (failure) => _setError(failure.message),
      (empresas) {
        _empresas = empresas;
        _isLoading = false;
        notifyListeners();
      },
    );
  }

  Future<void> createEmpresa(EmpresaTransporte empresa) async {
    final result = await repository.createEmpresa(empresa);
    
    result.fold(
      (failure) => _setError(failure.message),
      (newEmpresa) {
        _empresas.add(newEmpresa);
        notifyListeners();
      },
    );
  }

  Future<void> updateEmpresa(int id, Map<String, dynamic> updates) async {
    final result = await repository.updateEmpresa(id, updates);
    
    result.fold(
      (failure) => _setError(failure.message),
      (updatedEmpresa) {
        final index = _empresas.indexWhere((e) => e.id == id);
        if (index != -1) {
          _empresas[index] = updatedEmpresa;
          notifyListeners();
        }
      },
    );
  }
}
```

## Commission Configuration

Set platform commission rates per company:

<Steps>
  <Step title="Navigate to Company">
    Select a company from the list
  </Step>

  <Step title="Edit Commission">
    Tap "Edit" and locate the commission field
  </Step>

  <Step title="Enter Percentage">
    Set the commission percentage (e.g., 15.0 for 15%)
  </Step>

  <Step title="Save Changes">
    Confirm to apply the new commission rate
  </Step>
</Steps>

<Info>
  Default commission is 15%. This can be customized per company based on agreements.
</Info>

## Assigning Drivers to Companies

Drivers can be assigned to companies for proper organization:

```dart theme={null}
// In User Management, when editing a conductor:
Future<bool> updateUser({
  required int userId,
  String? tipoUsuario,
  int? empresaId,  // Company ID to assign
  String? empresaNombre,
}) async {
  final result = await manageUserUseCase.updateUser(
    adminId: adminId,
    userId: userId,
    tipoUsuario: tipoUsuario,
    empresaId: empresaId,
  );

  return result.fold(
    (failure) => false,
    (success) {
      if (success && empresaId != null) {
        // Driver is now assigned to company
        notifyListeners();
      }
      return success;
    },
  );
}
```

<Warning>
  Drivers must be assigned to a company to ensure proper commission tracking and payment distribution.
</Warning>

## Company Verification

Verify company credentials before activation:

```dart theme={null}
Future<Result<void>> verifyEmpresa(int empresaId, int adminId) async {
  // Verify:
  // - NIT is valid
  // - Legal representative documents
  // - Business registration
  // - Insurance policies
  
  final result = await repository.verifyEmpresa(empresaId, adminId);
  
  return result.fold(
    (failure) => Error(failure),
    (success) {
      // Update local state
      final index = _empresas.indexWhere((e) => e.id == empresaId);
      if (index != -1) {
        _empresas[index] = _empresas[index].copyWith(
          verificada: true,
          fechaVerificacion: DateTime.now(),
          verificadoPor: adminId,
        );
        notifyListeners();
      }
      return Success(success);
    },
  );
}
```

## Platform Earnings by Company

Track commissions owed by each company:

```dart admin/presentation/screens/platform_earnings_screen.dart theme={null}
class PlatformEarningsScreen extends StatefulWidget {
  final int adminId;

  const PlatformEarningsScreen({
    super.key,
    required this.adminId,
  });
}

// Displays:
// - Total trips per company
// - Total earnings per company
// - Platform commission earned
// - Outstanding payments
```

### Earnings Calculation

```dart theme={null}
// For each company trip:
final tripTotal = 50000; // COP
final commissionRate = empresa.comisionAdminPorcentaje; // 15%
final platformEarnings = tripTotal * (commissionRate / 100); // 7500 COP
final driverEarnings = tripTotal - platformEarnings; // 42500 COP
```

## Company CopyWith Method

Immutable updates to company entities:

```dart admin/domain/entities/empresa_transporte.dart theme={null}
EmpresaTransporte copyWith({
  int? id,
  String? nombre,
  String? nit,
  String? razonSocial,
  String? email,
  String? telefono,
  String? telefonoSecundario,
  String? direccion,
  String? municipio,
  String? departamento,
  String? representanteNombre,
  String? representanteTelefono,
  String? representanteEmail,
  List<String>? tiposVehiculo,
  String? logoUrl,
  String? descripcion,
  EmpresaEstado? estado,
  bool? verificada,
  DateTime? fechaVerificacion,
  int? verificadoPor,
  int? totalConductores,
  int? totalViajesCompletados,
  double? calificacionPromedio,
  double? comisionAdminPorcentaje,
  DateTime? creadoEn,
  DateTime? actualizadoEn,
  int? creadoPor,
  String? notasAdmin,
}) {
  return EmpresaTransporte(
    id: id ?? this.id,
    nombre: nombre ?? this.nombre,
    nit: nit ?? this.nit,
    // ... all fields
  );
}
```

## Company Filtering

Filter companies by various criteria:

<Tabs>
  <Tab title="By Status">
    Filter by `activo`, `inactivo`, `suspendido`, `pendiente`, or `eliminado`
  </Tab>

  <Tab title="By Verification">
    Show only verified (`verificada = true`) or unverified companies
  </Tab>

  <Tab title="By Vehicle Type">
    Filter companies offering specific vehicle types
  </Tab>

  <Tab title="By Performance">
    Sort by trip count, rating, or driver count
  </Tab>
</Tabs>

## Best Practices

<Accordion title="Verify Before Activation">
  Always verify company credentials (NIT, legal representative, insurance) before approving.
</Accordion>

<Accordion title="Set Fair Commissions">
  Set commission rates based on service type, volume, and agreements. Standard is 15%.
</Accordion>

<Accordion title="Monitor Performance">
  Regularly review company metrics like completion rate, driver count, and customer ratings.
</Accordion>

<Accordion title="Track Payments">
  Use the Platform Earnings screen to monitor commission payments from companies.
</Accordion>

<Accordion title="Document Changes">
  Use the notes field to document important changes or agreements with companies.
</Accordion>

## Related Features

<CardGroup cols={3}>
  <Card title="Driver Management" icon="id-card" href="/admin/driver-management">
    Assign drivers to companies
  </Card>

  <Card title="User Management" icon="users" href="/admin/user-management">
    Manage company user accounts
  </Card>

  <Card title="Pricing Configuration" icon="dollar-sign" href="/admin/pricing-configuration">
    Set pricing by vehicle type
  </Card>
</CardGroup>
