import { Head, Link } from '@inertiajs/react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; import AppLayout from '@/layouts/app-layout'; import { Printer, Building2, CalendarDays, Hash } from 'lucide-react'; // ─── Types ─────────────────────────────────────────────────────────────────── interface DetailItem { name: string; type: 'bonus' | 'deduction'; amount: number; } interface PayrollData { id: number; period: string; basic_salary: number; details: DetailItem[]; net_salary: number; status: 'pending' | 'paid'; created_at: string; employee: { name: string; nip: string; position: string; department: string; }; } interface PageProps { payroll: PayrollData; } // ─── Helpers ───────────────────────────────────────────────────────────────── function formatRupiah(value: number): string { return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0, }).format(value); } function formatPeriod(period: string): string { const [year, month] = period.split('-'); const date = new Date(Number(year), Number(month) - 1, 1); return date.toLocaleDateString('id-ID', { month: 'long', year: 'numeric' }); } // ─── Sub-components ─────────────────────────────────────────────────────────── function InfoCell({ label, value }: { label: string; value: string }) { return (
{label}
{value}
PT. HRIS Nusantara
Slip Gaji Karyawan
Informasi Karyawan
Periode Penggajian
{formatPeriod(payroll.period)}
Komponen Gaji
Tambahan
{bonuses.map((item, i) => (Potongan
{deductions.map((item, i) => (Total Gaji Bersih
Gaji Pokok {bonuses.length > 0 && ' + Tambahan'} {deductions.length > 0 && ' − Potongan'}
{formatRupiah(payroll.net_salary)}
Dokumen ini diterbitkan secara otomatis oleh sistem HRIS dan sah tanpa tanda tangan basah.