add pdf download

pull/1/head
Aji Kamaludin 3 years ago
parent c9e21b29aa
commit eed374981f
No known key found for this signature in database
GPG Key ID: 670E1F26AD5A8099

@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use DB;
use PDF;
use App\Models\Product;
use App\Models\Payroll;
use App\Models\PayrollItem;
@ -199,4 +200,14 @@ class PayrollController extends Controller
return redirect()->route('payrolls.index');
}
public function pdf(Payroll $payroll)
{
$pdf = PDF::loadView('payroll', [
'payroll' => $payroll->load(['employee', 'items.product']),
'user' => auth()->user()
]);
return $pdf->download($payroll->employee->name.'-'.$payroll->date.'.pdf');
}
}

@ -6,6 +6,7 @@
"license": "MIT",
"require": {
"php": "^7.3|^8.0",
"barryvdh/laravel-dompdf": "^0.9.0",
"dompdf/dompdf": "^1.1",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",

68
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "0922ffcc8eeffdaa23c9299eafaf4746",
"content-hash": "c98e6bd315a3d72016e890b6217eaad7",
"packages": [
{
"name": "asm89/stack-cors",
@ -62,6 +62,72 @@
},
"time": "2021-03-11T06:42:03+00:00"
},
{
"name": "barryvdh/laravel-dompdf",
"version": "v0.9.0",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-dompdf.git",
"reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/5b99e1f94157d74e450f4c97e8444fcaffa2144b",
"reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b",
"shasum": ""
},
"require": {
"dompdf/dompdf": "^1",
"illuminate/support": "^5.5|^6|^7|^8",
"php": "^7.1 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.9-dev"
},
"laravel": {
"providers": [
"Barryvdh\\DomPDF\\ServiceProvider"
],
"aliases": {
"PDF": "Barryvdh\\DomPDF\\Facade"
}
}
},
"autoload": {
"psr-4": {
"Barryvdh\\DomPDF\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "A DOMPDF Wrapper for Laravel",
"keywords": [
"dompdf",
"laravel",
"pdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-dompdf/issues",
"source": "https://github.com/barryvdh/laravel-dompdf/tree/v0.9.0"
},
"funding": [
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2020-12-27T12:05:53+00:00"
},
{
"name": "brick/math",
"version": "0.9.3",

@ -229,7 +229,7 @@ return [
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'PDF' => Barryvdh\DomPDF\Facade::class,
],
];

@ -1598,6 +1598,11 @@ html {
--tw-text-opacity: 0.4;
color: hsla(var(--bc) / var(--tw-text-opacity, 1));
}
.mockup-phone .display {
overflow: hidden;
border-radius: 40px;
margin-top: -25px;
}
.modal-box {
--tw-bg-opacity: 1;
background-color: hsla(var(--b1) / var(--tw-bg-opacity, 1));
@ -2215,6 +2220,10 @@ html {
--tw-border-opacity: 1;
border-color: rgb(239 68 68 / var(--tw-border-opacity));
}
.border-black {
--tw-border-opacity: 1;
border-color: rgb(0 0 0 / var(--tw-border-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));

10
public/js/app.js vendored

@ -9883,7 +9883,12 @@ function Payrolls(props) {
children: (0,_utils__WEBPACK_IMPORTED_MODULE_9__.formatIDR)(payroll.recived)
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)("td", {
className: "text-right",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_2__.Link, {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)("a", {
className: "btn btn-outline mx-1",
href: route('payrolls.pdf', payroll),
download: "".concat(payroll.employee.name, "-").concat(payroll.date, ".pdf"),
children: "PDF"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_2__.Link, {
className: "btn btn-primary mx-1",
href: route('payrolls.edit', payroll),
children: "Edit"
@ -9961,7 +9966,8 @@ var Print = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function
ref: ref,
className: "p-4",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)("table", {
className: "border-collapse border border-gray-400 w-full",
className: "border-collapse border border-black w-full",
border: "1",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("thead", {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("tr", {
className: "text-center border",

@ -180,9 +180,22 @@ export default function Payrolls(props) {
{formatIDR(payroll.recived)}
</td>
<td className="text-right">
<a
className="btn btn-outline mx-1"
href={route(
'payrolls.pdf',
payroll
)}
download={`${payroll.employee.name}-${payroll.date}.pdf`}
>
PDF
</a>
<Link
className="btn btn-primary mx-1"
href={route('payrolls.edit', payroll)}
href={route(
'payrolls.edit',
payroll
)}
>
Edit
</Link>

@ -14,7 +14,7 @@ const Print = React.forwardRef((props, ref) => {
return (
<>
<div ref={ref} className="p-4">
<table className="border-collapse border border-gray-400 w-full">
<table className="border-collapse border border-black w-full" border="1">
<thead>
<tr className="text-center border">
<th colSpan={4}>

@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
font-family: Nunito, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
.border-collapse {
border-collapse: collapse;
}
.border-gray-400 {
border-color: black;
}
.border {
border-width: 1px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
}
.w-full {
width: 100%;
}
.text-center {
text-align: center;
}
.font-bold {
font-weight: 700;
}
.text-4xl {
font-size: 2.25rem;
line-height: 2.5rem;
}
.text-3xl {
font-size: 1.875rem;
line-height: 2.25rem;
}
.py-4 {
padding-top: 1rem;
padding-bottom: 1rem;
}
.justify-center {
justify-content: center;
}
.items-center {
align-items: center;
}
.flex {
display: flex;
}
.p-2 {
padding: 0.5rem;
}
.max-w-sm {
max-width: 24rem;
}
.text-right {
text-align: right;
}
</style>
</head>
@php
function formatIDR($output) {
return number_format($output, 0, ',', '.');
}
@endphp
<body>
<table class="border-collapse border border-gray-400 w-full" border="1">
<thead>
<tr class="text-center border">
<th colspan="4">
<div class="flex text-md justify-center items-center font-bold text-4xl py-4">
GAJIAN KONVEKSI
</div>
</th>
</tr>
</thead>
<tbody>
<tr class="border">
<td class="border p-2">
Nama Tukang
</td>
<td class="border p-2">
{{ $payroll->employee->name }}
</td>
<td class="border p-2">
Nomer Telpon
</td>
<td class="border p-2">
{{ $payroll->employee->whatsapp }}
</td>
</tr>
<tr class="border">
<td class="border p-2">
Tanggal Pembuatan
</td>
<td class="border p-2">
{{ $payroll->date }}
</td>
<td class="border p-2">
Dibuat Oleh
</td>
<td class="border p-2">
{{ $user->name }}
</td>
</tr>
<tr class="border text-center">
<th colspan="4">
<div class="flex text-md justify-center items-center font-bold text-3xl py-4">
Detail Gajian
</div>
</th>
</tr>
<tr class="border">
<td class="border p-2 max-w-sm">
#
</td>
<td class="border p-2">
Nama Barang
</td>
<td class="border p-2">
Harga
</td>
<td class="border p-2">
Jumlah
</td>
</tr>
@foreach($payroll->items as $item)
<tr class="border">
<td class="border p-2 max-w-sm">
{{ $loop->iteration }}
</td>
<td class="border p-2">
{{ $item->product->name }}
</td>
<td class="border p-2">
{{ formatIDR($item->price) }}
</td>
<td class="border p-2">
{{ formatIDR($item->quantity) }}
</td>
</tr>
@endforeach
<tr class="border">
<td class="border p-2 text-right" colspan="3">
Total
</td>
<td class="border p-2">
{{ formatIDR($payroll->amount) }}
</td>
</tr>
<tr class="border">
<td class="border p-2 text-right" colspan="3">
Potongan/Pinjaman
</td>
<td class="border p-2">
{{ formatIDR($payroll->cuts) }}
</td>
</tr>
<tr class="border">
<td class="border p-2 text-right" colspan="3">
Bonus
</td>
<td class="border p-2">
{{ formatIDR($payroll->bonus) }}
</td>
</tr>
<tr class="border">
<td class="border p-2 text-right" colspan="3">
Total Diterima
</td>
<td class="border p-2 font-bold">
{{ formatIDR($payroll->recived) }}
</td>
</tr>
</tbody>
</table>
</body>
</html>

@ -56,6 +56,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('/payrolls/{payroll}', [PayrollController::class, 'edit'])->name('payrolls.edit');
Route::put('/payrolls/{payroll}', [PayrollController::class, 'update'])->name('payrolls.update');
Route::delete('/payrolls/{payroll}', [PayrollController::class, 'destroy'])->name('payrolls.destroy');
Route::get('/payrolls/{payroll}/pdf', [PayrollController::class, 'pdf'])->name('payrolls.pdf');
Route::get('/report', [ReportController::class, 'index'])->name('report');
Route::get('/report/export', [ReportController::class, 'export'])->name('report.export');

Loading…
Cancel
Save