dev
Aji Kamaludin 1 year ago
parent 3b72278edf
commit a8e33af694
No known key found for this signature in database
GPG Key ID: 19058F67F0083AD3

@ -1,4 +1,4 @@
APP_NAME='Template App' APP_NAME='Simple POS'
APP_ENV=local APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=true

@ -42,7 +42,8 @@ class GeneralController extends Controller
->orderBy('date', 'asc') ->orderBy('date', 'asc')
->groupBy('date') ->groupBy('date')
->get(); ->get();
$target = (Setting::where('key', 'target')->value('value') ?? 90000) / 30; $originTarget = (Setting::where('key', 'target')->value('value') ?? 90000);
$target = $originTarget / 30;
$dounat = SaleItem::selectRaw('product_id, category_id, SUM(quantity) as qty') $dounat = SaleItem::selectRaw('product_id, category_id, SUM(quantity) as qty')
->with('product.category') ->with('product.category')
@ -79,7 +80,8 @@ class GeneralController extends Controller
'list_customer' => $transactionCustomers, 'list_customer' => $transactionCustomers,
'month' => now()->locale('id')->translatedFormat('F'), 'month' => now()->locale('id')->translatedFormat('F'),
'total_sale_month' => $totalSaleMonth, 'total_sale_month' => $totalSaleMonth,
'targets' => [$target, $target, $target, $target, $target, $target, $target, $target] 'targets' => [$target, $target, $target, $target, $target, $target, $target, $target],
'target' => $originTarget,
]); ]);
} }

@ -94,7 +94,7 @@ class SaleController extends Controller
DB::rollBack(); DB::rollBack();
return redirect()->back() return redirect()->back()
->with('message', ['type' => 'error', 'message' => 'Stok barang tidak cukup']); ->with('message', ['type' => 'error', 'message' => 'Stok produk tidak cukup']);
} }
$product->update(['stock' => $stock]); $product->update(['stock' => $stock]);
} }

@ -1,10 +1,9 @@
import { usePage } from '@inertiajs/react'
import React from 'react' import React from 'react'
export default function ApplicationLogo({ className }) { export default function ApplicationLogo({ className }) {
return ( const {
<h1 className={className}> props: { app_name },
{' '} } = usePage()
Sistem Informasi Penjualan PT. Maju Jaya Kreasindo return <h1 className={className}> {app_name}</h1>
</h1>
)
} }

@ -1,17 +1,18 @@
import React from "react"; import React from 'react'
import { HiOutlineDotsVertical } from "react-icons/hi"; import { HiOutlineDotsVertical } from 'react-icons/hi'
export default function HeadInput({ onClick }) { export default function HeadInput({ onClick }) {
return ( return (
<div className="flex mb-2" onClick={onClick}> <div className="flex mb-2" onClick={onClick}>
<input <input
type="text" type="text"
className="rounded-none rounded-l-lg bg-gray-50 border text-gray-900 focus:ring-blue-500 focus:border-blue-500 block flex-1 min-w-0 w-full text-sm border-gray-300 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="Pilih Barang" className="rounded-none rounded-l-lg bg-gray-50 border text-gray-900 focus:ring-blue-500 focus:border-blue-500 block flex-1 min-w-0 w-full text-sm border-gray-300 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
placeholder="Pilih Produk"
disabled={true} disabled={true}
/> />
<span className="inline-flex items-center px-3 text-sm text-gray-900 bg-gray-200 border border-l-0 border-gray-300 rounded-r-md dark:bg-gray-600 dark:text-gray-400 dark:border-gray-600"> <span className="inline-flex items-center px-3 text-sm text-gray-900 bg-gray-200 border border-l-0 border-gray-300 rounded-r-md dark:bg-gray-600 dark:text-gray-400 dark:border-gray-600">
<HiOutlineDotsVertical/> <HiOutlineDotsVertical />
</span> </span>
</div> </div>
) )
} }

@ -1,24 +1,38 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react'
import { ToastContainer, toast } from 'react-toastify'; import { ToastContainer, toast } from 'react-toastify'
import ApplicationLogo from '@/Components/Defaults/ApplicationLogo'; import ApplicationLogo from '@/Components/Defaults/ApplicationLogo'
import Dropdown from '@/Components/Defaults/Dropdown'; import Dropdown from '@/Components/Defaults/Dropdown'
import { Link } from '@inertiajs/react'; import { Link } from '@inertiajs/react'
import { Breadcrumb } from 'flowbite-react'; import { Breadcrumb } from 'flowbite-react'
import { HiMenu, HiChevronDown, HiHome } from 'react-icons/hi' import { HiMenu, HiChevronDown, HiHome } from 'react-icons/hi'
import { router } from '@inertiajs/react'; import { router } from '@inertiajs/react'
import SidebarNav from './Partials/SidebarNav'; import SidebarNav from './Partials/SidebarNav'
export default function Authenticated({ auth, children, flash, page = '', action = ''}) { export default function Authenticated({
const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false); auth,
children,
flash,
page = '',
action = '',
}) {
const [showingNavigationDropdown, setShowingNavigationDropdown] =
useState(false)
useEffect(() => { useEffect(() => {
if (flash.message !== null) { if (flash.message !== null) {
toast(flash.message.message, {type: flash.message.type}) toast(flash.message.message, { type: flash.message.type })
} }
}, [flash]) }, [flash])
console.log(
'APLIKASI INI DIJUAL DENGAN HARGA 1JT RUPIAH, JIKA DIJUAL LEBIH MAHAL SILAHKAN HUBUNGI KREATOR DI +6281325307692 (WA)'
)
return ( return (
<div className="min-h-screen flex flex-col bg-gray-100 dark:bg-gray-700"> <div
className="min-h-screen flex flex-col bg-gray-100 dark:bg-gray-700"
creator="aji19kamaludin@gmail.com"
>
<nav className="bg-white dark:bg-gray-800 border-b dark:border-gray-700"> <nav className="bg-white dark:bg-gray-800 border-b dark:border-gray-700">
<div className="mx-auto px-4 sm:px-6 lg:px-8"> <div className="mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between h-16"> <div className="flex justify-between h-16">
@ -28,7 +42,6 @@ export default function Authenticated({ auth, children, flash, page = '', action
<ApplicationLogo className="block pt-2 h-12 w-full font-bold text-2xl fill-current" /> <ApplicationLogo className="block pt-2 h-12 w-full font-bold text-2xl fill-current" />
</Link> </Link>
</div> </div>
</div> </div>
<div className="hidden sm:flex sm:items-center sm:ml-6"> <div className="hidden sm:flex sm:items-center sm:ml-6">
@ -41,14 +54,22 @@ export default function Authenticated({ auth, children, flash, page = '', action
className="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150 dark:bg-gray-700 dark:hover:text-gray-50 dark:text-gray-200 gap-2" className="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150 dark:bg-gray-700 dark:hover:text-gray-50 dark:text-gray-200 gap-2"
> >
{auth.user.name} {auth.user.name}
<HiChevronDown/> <HiChevronDown />
</button> </button>
</span> </span>
</Dropdown.Trigger> </Dropdown.Trigger>
<Dropdown.Content> <Dropdown.Content>
<Dropdown.Link href={route('profile.edit')}>Profile</Dropdown.Link> <Dropdown.Link
<Dropdown.Link href={route('logout')} method="post" as="button"> href={route('profile.edit')}
>
Profile
</Dropdown.Link>
<Dropdown.Link
href={route('logout')}
method="post"
as="button"
>
Log Out Log Out
</Dropdown.Link> </Dropdown.Link>
</Dropdown.Content> </Dropdown.Content>
@ -58,45 +79,48 @@ export default function Authenticated({ auth, children, flash, page = '', action
<div className="-mr-2 flex items-center sm:hidden space-x-2"> <div className="-mr-2 flex items-center sm:hidden space-x-2">
<button <button
onClick={() => setShowingNavigationDropdown((previousState) => !previousState)} onClick={() =>
setShowingNavigationDropdown(
(previousState) => !previousState
)
}
className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out" className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out"
> >
<HiMenu/> <HiMenu />
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</nav> </nav>
<div className='flex-1 flex flex-row'> <div className="flex-1 flex flex-row">
<div className={`w-fit ${showingNavigationDropdown ? 'absolute h-screen z-10' : 'md:block hidden'}`}> <div
<SidebarNav user={auth.user}/> className={`w-fit ${
showingNavigationDropdown
? 'absolute h-screen z-10'
: 'md:block hidden'
}`}
>
<SidebarNav user={auth.user} />
</div> </div>
<main className='w-full'> <main className="w-full">
{page !== '' && ( {page !== '' && (
<Breadcrumb <Breadcrumb className="bg-gray-200 py-3 px-5 mb-2 dark:bg-gray-700">
className="bg-gray-200 py-3 px-5 mb-2 dark:bg-gray-700"
>
<Breadcrumb.Item <Breadcrumb.Item
onClick={() => router.visit(route('dashboard'))} onClick={() => router.visit(route('dashboard'))}
icon={HiHome} icon={HiHome}
> >
<p className='mt-0.5'>{page}</p> <p className="mt-0.5">{page}</p>
</Breadcrumb.Item> </Breadcrumb.Item>
{action !== '' && ( {action !== '' && (
<Breadcrumb.Item> <Breadcrumb.Item>{action}</Breadcrumb.Item>
{action}
</Breadcrumb.Item>
)} )}
</Breadcrumb> </Breadcrumb>
)} )}
<div className='py-4'> <div className="py-4">{children}</div>
{children}
</div>
</main> </main>
</div> </div>
<ToastContainer /> <ToastContainer />
</div> </div>
); )
} }

@ -5,11 +5,12 @@ import { Link } from '@inertiajs/react'
export default function Guest({ children }) { export default function Guest({ children }) {
return ( return (
<div className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900"> <div
<div> className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900"
<Link href="/"> creator="aji19kamaludin@gmail.com"
<img src={logo} alt="app logo" className="w-48 h-48" /> >
</Link> <div className="mb-10">
<ApplicationLogo className="font-bold text-gray-600 text-7xl" />
</div> </div>
<div className="w-full max-w-md mt-6 px-6 py-4 bg-white dark:bg-gray-800 shadow-md overflow-hidden sm:rounded-lg"> <div className="w-full max-w-md mt-6 px-6 py-4 bg-white dark:bg-gray-800 shadow-md overflow-hidden sm:rounded-lg">

@ -37,6 +37,7 @@ export default function Dashboard(props) {
month, month,
total_sale_month, total_sale_month,
targets, targets,
target,
} = props } = props
const options = { const options = {
@ -142,6 +143,15 @@ export default function Dashboard(props) {
<div> <div>
<div className="mx-auto sm:px-6 lg:px-8"> <div className="mx-auto sm:px-6 lg:px-8">
<div className="px-2 w-full grid grid-cols-2 md:grid-cols-4 gap-2"> <div className="px-2 w-full grid grid-cols-2 md:grid-cols-4 gap-2">
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl">
Target Penjualan <br />
Bulan {month}
</div>
<div className="text-3xl font-bold">
Rp. {formatIDR(target)}
</div>
</div>
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white"> <div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl"> <div className="text-xl">
Total Penjualan <br /> Total Penjualan <br />
@ -153,7 +163,7 @@ export default function Dashboard(props) {
</div> </div>
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white"> <div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl"> <div className="text-xl">
Total Barang Terjual <br /> Total Penjualan <br />
Hari Ini Hari Ini
</div> </div>
<div className="text-3xl font-bold"> <div className="text-3xl font-bold">
@ -162,19 +172,13 @@ export default function Dashboard(props) {
</div> </div>
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white"> <div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl"> <div className="text-xl">
Jumlah Barang Terjual <br /> Jumlah Produk Terjual <br />
Hari Ini Hari Ini
</div> </div>
<div className="text-3xl font-bold"> <div className="text-3xl font-bold">
{total_item_today} {total_item_today}
</div> </div>
</div> </div>
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl">Jumlah Pelanggan</div>
<div className="text-3xl font-bold">
{total_customer}
</div>
</div>
</div> </div>
{/* Chart : jumlah transaksi 7 hari terkahir */} {/* Chart : jumlah transaksi 7 hari terkahir */}
<div className="w-full flex flex-row mt-4 space-x-2"> <div className="w-full flex flex-row mt-4 space-x-2">
@ -271,7 +275,7 @@ export default function Dashboard(props) {
: 'Umum'} : 'Umum'}
</td> </td>
<td className="py-4 px-6"> <td className="py-4 px-6">
{formatIDR(customer.stotal)} Rp. {formatIDR(customer.stotal)}
</td> </td>
</tr> </tr>
))} ))}

@ -1,12 +1,12 @@
import React from 'react'; import React from 'react'
import { Head } from '@inertiajs/react'; import { Head } from '@inertiajs/react'
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'; import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
import { formatDate, formatIDR } from '@/utils'; import { formatDate, formatIDR } from '@/utils'
export default function Sale(props) { export default function Sale(props) {
const { sale, auth } = props const { sale, auth } = props
return ( return (
<AuthenticatedLayout <AuthenticatedLayout
auth={props.auth} auth={props.auth}
@ -20,35 +20,60 @@ export default function Sale(props) {
<div> <div>
<div className="mx-auto sm:px-6 lg:px-8 "> <div className="mx-auto sm:px-6 lg:px-8 ">
<div className="p-6 overflow-hidden shadow-sm sm:rounded-lg bg-white dark:bg-gray-800 space-y-4"> <div className="p-6 overflow-hidden shadow-sm sm:rounded-lg bg-white dark:bg-gray-800 space-y-4">
<div className='flex flex-col'> <div className="flex flex-col">
<div>Date : <b>{formatDate(sale.date)}</b></div> <div>
<div>Customer : <b>{sale.customer?.name}</b></div> Date : <b>{formatDate(sale.date)}</b>
<div>Total : <b>{formatIDR(sale.total)}</b></div> </div>
<div>
Customer : <b>{sale.customer?.name}</b>
</div>
<div>
Total : <b>{formatIDR(sale.total)}</b>
</div>
</div> </div>
<div className='overflow-auto'> <div className="overflow-auto">
<div> <div>
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 mb-4"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 mb-4">
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400"> <thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr> <tr>
<th scope="col" className="py-3 px-6"> <th
Barang scope="col"
className="py-3 px-6"
>
Produk
</th> </th>
<th scope="col" className="py-3 px-6"> <th
scope="col"
className="py-3 px-6"
>
Harga Harga
</th> </th>
<th scope="col" className="py-3 px-6"> <th
scope="col"
className="py-3 px-6"
>
Jumlah Jumlah
</th> </th>
<th scope="col" className="py-3 px-6"> <th
scope="col"
className="py-3 px-6"
>
Subtotal Subtotal
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{sale?.items?.map(item => ( {sale?.items?.map((item) => (
<tr className="bg-white border-b dark:bg-gray-800 dark:border-gray-700" key={item.id}> <tr
<td scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white"> className="bg-white border-b dark:bg-gray-800 dark:border-gray-700"
{item.product.name} ({item.product.code}) key={item.id}
>
<td
scope="row"
className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white"
>
{item.product.name} (
{item.product.code})
</td> </td>
<td className="py-4 px-6"> <td className="py-4 px-6">
{formatIDR(item.price)} {formatIDR(item.price)}
@ -57,7 +82,10 @@ export default function Sale(props) {
{formatIDR(item.quantity)} {formatIDR(item.quantity)}
</td> </td>
<td className="py-4 px-6"> <td className="py-4 px-6">
{formatIDR(item.quantity * item.price)} {formatIDR(
item.quantity *
item.price
)}
</td> </td>
</tr> </tr>
))} ))}
@ -69,5 +97,5 @@ export default function Sale(props) {
</div> </div>
</div> </div>
</AuthenticatedLayout> </AuthenticatedLayout>
); )
} }

Loading…
Cancel
Save