ajikamaludin 2 years ago
parent 724212f714
commit 6f89d682ca
Signed by: ajikamaludin
GPG Key ID: 476C9A2B4B794EBB

@ -41,4 +41,9 @@ class GeneralController extends Controller
{
return Inertia::render('Gaji/Slip');
}
public function userGaji()
{
return Inertia::render('Gaji/UserGaji');
}
}

@ -84,6 +84,7 @@ export default function Authenticated({ auth, children }) {
</div>
<div className={(showingNavigationDropdown ? 'block' : 'hidden') + ' sm:hidden'}>
{auth.user.is_admin ? (
<div className="pt-2 pb-3 space-y-1">
<ResponsiveNavLink href={route('dashboard')} active={route().current('dashboard')}>
Dashboard
@ -107,6 +108,16 @@ export default function Authenticated({ auth, children }) {
Slip Gaji
</ResponsiveNavLink>
</div>
) : (
<div className="pt-2 pb-3 space-y-1">
<ResponsiveNavLink href={route('dashboard')} active={route().current('dashboard')}>
Dashboard
</ResponsiveNavLink>
<ResponsiveNavLink href={route('user.gaji')} active={route().current('user.gaji')}>
Data Gaji
</ResponsiveNavLink>
</div>
)}
<div className="pt-4 pb-1 border-t border-gray-200">
<div className="px-4">
@ -126,45 +137,63 @@ export default function Authenticated({ auth, children }) {
<div className='flex flex-row md:mt-5 mx-au max-w-7xl mx-auto'>
<div className='w-auto hidden md:block'>
<aside className="w-64" aria-label="Sidebar">
<div className="overflow-y-auto py-4 px-3 bg-white rounded dark:bg-gray-800">
<ul className="space-y-2">
<li>
<Link href={route('dashboard')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('dashboard') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="ml-3">Dashboard</span>
</Link>
</li>
<li>
<Link href={route('jabatan')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('jabatan') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Jabatan</span>
</Link>
</li>
<li>
<Link href={route('karyawan')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('karyawan') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Karyawan</span>
</Link>
</li>
<li>
<Link href={route('absensi')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('absensi') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Data Absensi</span>
</Link>
</li>
<li>
<Link href={route('setting.potongan.gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('setting.potongan.gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Setting Potongan Gaji</span>
</Link>
</li>
<li>
<Link href={route('gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Data Gaji</span>
</Link>
</li>
<li>
<Link href={route('slip.gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('slip.gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Slip Gaji</span>
</Link>
</li>
</ul>
</div>
{auth.user.is_admin ? (
<div className="overflow-y-auto py-4 px-3 bg-white rounded dark:bg-gray-800">
<ul className="space-y-2">
<li>
<Link href={route('dashboard')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('dashboard') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="ml-3">Dashboard</span>
</Link>
</li>
<li>
<Link href={route('jabatan')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('jabatan') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Jabatan</span>
</Link>
</li>
<li>
<Link href={route('karyawan')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('karyawan') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Karyawan</span>
</Link>
</li>
<li>
<Link href={route('absensi')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('absensi') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Data Absensi</span>
</Link>
</li>
<li>
<Link href={route('setting.potongan.gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('setting.potongan.gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Setting Potongan Gaji</span>
</Link>
</li>
<li>
<Link href={route('gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Data Gaji</span>
</Link>
</li>
<li>
<Link href={route('slip.gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('slip.gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Slip Gaji</span>
</Link>
</li>
</ul>
</div>
) : (
<div className="overflow-y-auto py-4 px-3 bg-white rounded dark:bg-gray-800">
<ul className="space-y-2">
<li>
<Link href={route('dashboard')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('dashboard') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="ml-3">Dashboard</span>
</Link>
</li>
<li>
<Link href={route('user.gaji')} className={`flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white ${route().current('user.gaji') ? 'bg-gray-100' : 'hover:bg-gray-100'} dark:hover:bg-gray-700`}>
<span className="flex-1 ml-3 whitespace-nowrap">Data Gaji</span>
</Link>
</li>
</ul>
</div>
)}
</aside>
</div>

@ -29,7 +29,8 @@ export default function Login({ status, canResetPassword }) {
name: user.name,
username: user.username,
password: user.password,
is_admin: user.is_admin
is_admin: user.is_admin,
id: user.id
})
} else {
setError('Username atau password tidak cocok')

@ -0,0 +1,268 @@
import React, { useEffect, useRef, useState } from 'react';
import Authenticated from '@/Layouts/Authenticated';
import { Head, useForm } from '@inertiajs/inertia-react';
import { useModalState } from '@/Hooks'
import Button from '@/Components/Button';
import FormModal from './FormModal';
import { getDataGajiByUser } from '@/Services/DataGaji';
import { useReactToPrint } from 'react-to-print';
import { formatIDR } from '@/Utils';
const ComponentToPrintOne = React.forwardRef(({ user, month, year }, ref) => {
const date = new Date()
return (
<div ref={ref} className="p-5 print-only">
<div className='w-full text-center p-2 flex flex-col justify-center items-center'>
<p className='font-bold text-3xl'>Koro Koro Family Karaoke</p>
<p className='text-xl border-b-2 w-2/3'>Slip Gaji Pegawai</p>
</div>
<table className='ml-10'>
<tbody>
<tr>
<td>Nama Karyawan </td>
<td>: {user?.name}</td>
</tr>
<tr>
<td>NIK </td>
<td>: {user?.nik}</td>
</tr>
<tr>
<td>Jabatan </td>
<td>: {user?.jabatan}</td>
</tr>
<tr>
<td>Bulan </td>
<td>: {month}</td>
</tr>
<tr>
<td>Tahun</td>
<td>: {year}</td>
</tr>
</tbody>
</table>
<table className="w-full text-sm text-left text-gray-800 dark:text-gray-400 mt-5" border={1}>
<tbody>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2 font-bold">No</td>
<td className="border px-2 py-2 font-bold">Keterangan</td>
<td className="border px-2 py-2 font-bold">Jumlah</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">1</td>
<td className="border px-2 py-2">Gaji Pokok</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.gajiPokok)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">2</td>
<td className="border px-2 py-2">Tunjangan Jabatan</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.tunjangan)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">3</td>
<td className="border px-2 py-2">Fee Penjualan</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.feePenjualan)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">4</td>
<td className="border px-2 py-2">Tunjangan Transaportasi</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.transport)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">5</td>
<td className="border px-2 py-2">Uang Makan</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.uangMakan)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">6</td>
<td className="border px-2 py-2">Bonus</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.bonus)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td className="border px-2 py-2">7</td>
<td className="border px-2 py-2">Potongan</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.potongan)}</td>
</tr>
<tr className="bg-white border dark:bg-gray-800 dark:border-gray-700">
<td colSpan={2} className="text-right font-bold">Total Gaji</td>
<td className="border px-2 py-2">Rp. {formatIDR(user?.total)}</td>
</tr>
</tbody>
</table>
<div className='flex justify-between mt-5 mr-5'>
<div className='flex flex-col ml-10'>
<p>Pegawai</p>
<div className='mt-20'>{user?.name}</div>
</div>
<div className='flex flex-col'>
<p>Pekanbaru, {date.getDate()}-{date.getMonth()}-{date.getFullYear()}</p>
<p>Finance</p>
<div className='border-black border-2 mt-20'/>
</div>
</div>
</div>
)
})
export default function Gaji(props) {
const user = props.auth.user
const formModal = useModalState(false)
const componentRefOne = useRef();
const handlePrintOne = useReactToPrint({
content: () => componentRefOne.current,
});
const month = (new Date()).getMonth()
const year = (new Date()).getFullYear()
const months = [1,2,3,4,5,6,7,8,9,10,11,12]
const years = [+year-2, +year-1, year, +year+1, +year+2]
const {data, setData} = useForm({
month: month,
year: year
})
const onHandleChange = (event) => {
setData(
event.target.name,
event.target.type === 'checkbox'
? event.target.checked
: event.target.value
)
}
const [items, setItems] = useState([])
const onClickShow = () => {getDataGajiByUser(`${data.month}_${data.year}`, setItems, user.id)}
const one = items[0]
useEffect(() => {
getDataGajiByUser(`${data.month}_${data.year}`, setItems, user.id)
}, [data])
return (
<Authenticated
auth={props.auth}
errors={props.errors}
>
<Head title="Data Gaji" />
<div className="py-0">
<div className="max-w-3xl xl:max-w-7xl w-full sm:px-6">
<div className="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div className="p-6 bg-white border-b border-gray-200">
<div className='mb-5 text-3xl font-semibold'>
Data Gaji
</div>
<div className='flex flex-col md:flex-row space-y-1 md:space-y-0 justify-between'>
<div className='flex space-x-1 items-center'>
<p>Periode Data :</p>
<select className='select' value={data.month} name="month" onChange={onHandleChange}>
<option value="">Bulan</option>
{months.map(month => (
<option key={month}>{month}</option>
))}
</select>
<select className='select' value={data.year} name="year" onChange={onHandleChange}>
<option>Tahun</option>
{years.map(year => (
<option key={year}>{year}</option>
))}
</select>
</div>
<div className='flex space-x-1'>
<Button onClick={onClickShow}>Tampilkan Data</Button>
</div>
</div>
<ComponentToPrintOne ref={componentRefOne} user={one} month={data.month} year={data.year}/>
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 mt-5 block overflow-x-auto whitespace-nowrap">
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr>
<th scope="col" className="py-3 px-6">
NIK
</th>
<th scope="col" className="py-3 px-6">
Nama
</th>
<th>
Jabatan
</th>
<th scope="col" className='px-2'>
Gaji Pokok
</th>
<th scope="col" className='px-2'>
Tunjangan
</th>
<th scope="col" className='px-2'>
Fee Penjualan
</th>
<th scope="col" className='px-2'>
Uang Transport
</th>
<th scope="col" className='px-2'>
Uang Makan
</th>
<th scope="col" className='px-2'>
Bonus
</th>
<th scope="col" className='px-2'>
Potongan
</th>
<th scope="col" className='px-2'>
Total
</th>
<th></th>
</tr>
</thead>
<tbody>
{items.map(item => (
<tr key={item.id} className="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
{item.nik}
</th>
<td className="py-4 px-6">
{item.name}
</td>
<td className="py-4 px-6">
{item.jabatan}
</td>
<td>
Rp. {formatIDR(item.gajiPokok)}
</td>
<td>
Rp. {formatIDR(item.tunjangan)}
</td>
<td>
Rp. {formatIDR(item.feePenjualan)}
</td>
<td>
Rp. {formatIDR(item.transport)}
</td>
<td>
Rp. {formatIDR(item.uangMakan)}
</td>
<td>
Rp. {formatIDR(item.bonus)}
</td>
<td>
Rp. {formatIDR(item.potongan)}
</td>
<td>
Rp. {formatIDR(item.total)}
</td>
<td className='px-2'>
<Button onClick={handlePrintOne}>Cetak</Button>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
</div>
<FormModal modalState={formModal} periode={`${data.month}_${data.year}`}/>
</Authenticated>
);
}

@ -51,6 +51,61 @@ async function getDataGaji(periode, setLists) {
})
}
async function getDataGajiByUser(periode, setLists, userId) {
let potongan = []
getJabatan()
.then(jabatans => {
getByPeriode(periode).then(items => {
if(items[0] == undefined) {
setLists([])
toast.error("data tidak tersedia")
return
}
getPotongan()
.then(p => p.map(item => {
potongan.push(item)
}))
.finally(() => {
let alfa = potongan.find(pot => pot.data.jenis == 'alfa')
let sakit = potongan.find(pot => pot.data.jenis == 'sakit')
let filtered = items[0].data.users.filter(user => user.id == userId)
if(filtered == undefined) {
toast.error("data tidak tersedia")
return
}
let employees = filtered.map(employee => {
let jab = jabatans.find(item => item.id == employee.jabatan_id)
let potong = 0
if(alfa != undefined) {
potong += +alfa.data.potongan * +employee.alfa
}
if(sakit != undefined) {
potong += +sakit.data.potongan * +employee.sakit
}
return {
...employee,
gajiPokok: jab.data.gajiPokok,
tunjangan: jab.data.tunjangan,
feePenjualan: jab.data.feePenjualan,
transport: jab.data.transport,
uangMakan: jab.data.uangMakan,
bonus: jab.data.bonus,
potongan: potong,
total: +jab.data.total - +potong
}
})
setLists(employees)
})
})
})
}
export {
getDataGaji
getDataGaji,
getDataGajiByUser
}

@ -4,7 +4,12 @@ import { collection, getDocs } from "firebase/firestore";
async function getAllUsers() {
const usersCollcetion = collection(db, 'users')
const users = await getDocs(usersCollcetion)
const usersList = users.docs.map(doc => doc.data())
const usersList = users.docs.map(doc => {
return {
...doc.data(),
id: doc.id
}
})
return usersList
}

@ -35,5 +35,6 @@ Route::middleware([IsSessionAuth::class])->group(function () {
Route::get('/setting-potong-gaji', [GeneralController::class, 'settingPotongGaji'])->name('setting.potongan.gaji');
Route::get('/data-gaji', [GeneralController::class, 'dataGaji'])->name('gaji');
Route::get('/slip-gaji', [GeneralController::class, 'slipGaji'])->name('slip.gaji');
Route::get('/user-gaji', [GeneralController::class, 'userGaji'])->name('user.gaji');
Route::post('/logout', [AuthController::class, 'destroy'])->name('logout');
});

Loading…
Cancel
Save