Time Tracking con NativePHP y Personio

Time Tracking con NativePHP y Personio

Siempre me ha costado un poco llevar al día el time tracking en mi empresa y acabo apuntando todo en Akiflow para luego actualizar todo Personio a mano. Un poco rollo, la verdad :-)

Ayer dediqué parte de mi tarde a crear una herramienta de menú con NativePHP. Nada más abrirla, me pide configurar las credenciales de API de Personio y, posteriormente, me muestra una pantalla así:

En esta pantalla muestro el tiempo dedicado hoy al trabajo + el tiempo de los últimos 7 días. Además, usando la última versión de Filament Forms y Filament Notifications, permito al usuario gestionar sus horas desde la propia aplicación, lo cual lo hace todo mucho más sencillo.

La estructura general de la aplicación no es muy complicada. Es una aplicación de Laravel basada en Livewire que tiene 1 ruta en el web.php:

<?php

use App\Livewire\MenuApp;
use Illuminate\Support\Facades\Route;

Route::get('/', MenuApp::class);

La clase MenuApp carga ciertos datos de la base de datos, y los pasa a la siguiente vista:

<div class="bg-black min-h-full p-4">
    @if (blank($selectedProvider))
        <livewire:select-provider lazy />
    @elseif(!$hasProviderConfig)
        <livewire:configure-provider lazy />
    @elseif(!$selectedProfile)
        <livewire:select-profile lazy />
    @else
        <div class="grid grid-cols-3 gap-8">
            <div class="col-span-2">
                <livewire:summary lazy />
            </div>
            <livewire:time-tracking lazy />
        </div>
    @endif
</div>

El uso de lazy en Livewire 3 es una pasada. Como la API de Personio es un poco lenta, los componentes se renderizan de forma lazy y hacen la llamada en background mientras se muestra un placeholder. La experiencia de usuario es muy buena.

A parte de estos componentes de Livewire, todo es una aplicación de Laravel bastante normal. Tiene sus modelos, migraciones, etc. Lo único especial es la instalación de NativePHP, que crea la aplicación de MenuBar en el fichero app/Providers/NativeAppServiceProvider.php:

<?php

namespace App\Providers;

use Native\Laravel\Contracts\ProvidesPhpIni;
use Native\Laravel\Facades\MenuBar;
use Native\Laravel\Facades\Window;

class NativeAppServiceProvider implements ProvidesPhpIni
{
    /**
     * Executed once the native application has been booted.
     * Use this method to open windows, register global shortcuts, etc.
     */
    public function boot(): void
    {
        MenuBar::create()
            ->icon(storage_path('app/menuBarIconTemplate.png'))
            ->alwaysOnTop()
            ->width(850)
            ->minWidth(850)
            ->maxWidth(850)
            ->height(508);
    }

    /**
     * Return an array of php.ini directives to be set.
     */
    public function phpIni(): array
    {
        return [
        ];
    }
}

Puedes ver el código y probarlo tú mismo desde el repositorio de GitHub: https://github.com/RuliLG/NativeTimeTracking