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_KEY=
APP_DEBUG=true

@ -42,7 +42,8 @@ class GeneralController extends Controller
->orderBy('date', 'asc')
->groupBy('date')
->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')
->with('product.category')
@ -79,7 +80,8 @@ class GeneralController extends Controller
'list_customer' => $transactionCustomers,
'month' => now()->locale('id')->translatedFormat('F'),
'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();
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]);
}

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

@ -1,17 +1,18 @@
import React from "react";
import { HiOutlineDotsVertical } from "react-icons/hi";
import React from 'react'
import { HiOutlineDotsVertical } from 'react-icons/hi'
export default function HeadInput({ onClick }) {
return (
<div className="flex mb-2" onClick={onClick}>
<input
<input
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}
/>
<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>
</div>
)
}
}

@ -1,24 +1,38 @@
import React, { useState, useEffect } from 'react';
import { ToastContainer, toast } from 'react-toastify';
import ApplicationLogo from '@/Components/Defaults/ApplicationLogo';
import Dropdown from '@/Components/Defaults/Dropdown';
import { Link } from '@inertiajs/react';
import { Breadcrumb } from 'flowbite-react';
import React, { useState, useEffect } from 'react'
import { ToastContainer, toast } from 'react-toastify'
import ApplicationLogo from '@/Components/Defaults/ApplicationLogo'
import Dropdown from '@/Components/Defaults/Dropdown'
import { Link } from '@inertiajs/react'
import { Breadcrumb } from 'flowbite-react'
import { HiMenu, HiChevronDown, HiHome } from 'react-icons/hi'
import { router } from '@inertiajs/react';
import SidebarNav from './Partials/SidebarNav';
import { router } from '@inertiajs/react'
import SidebarNav from './Partials/SidebarNav'
export default function Authenticated({ auth, children, flash, page = '', action = ''}) {
const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false);
export default function Authenticated({
auth,
children,
flash,
page = '',
action = '',
}) {
const [showingNavigationDropdown, setShowingNavigationDropdown] =
useState(false)
useEffect(() => {
if (flash.message !== null) {
toast(flash.message.message, {type: flash.message.type})
toast(flash.message.message, { type: flash.message.type })
}
}, [flash])
console.log(
'APLIKASI INI DIJUAL DENGAN HARGA 1JT RUPIAH, JIKA DIJUAL LEBIH MAHAL SILAHKAN HUBUNGI KREATOR DI +6281325307692 (WA)'
)
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">
<div className="mx-auto px-4 sm:px-6 lg:px-8">
<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" />
</Link>
</div>
</div>
<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"
>
{auth.user.name}
<HiChevronDown/>
<HiChevronDown />
</button>
</span>
</Dropdown.Trigger>
<Dropdown.Content>
<Dropdown.Link href={route('profile.edit')}>Profile</Dropdown.Link>
<Dropdown.Link href={route('logout')} method="post" as="button">
<Dropdown.Link
href={route('profile.edit')}
>
Profile
</Dropdown.Link>
<Dropdown.Link
href={route('logout')}
method="post"
as="button"
>
Log Out
</Dropdown.Link>
</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">
<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"
>
<HiMenu/>
<HiMenu />
</button>
</div>
</div>
</div>
</nav>
<div className='flex-1 flex flex-row'>
<div className={`w-fit ${showingNavigationDropdown ? 'absolute h-screen z-10' : 'md:block hidden'}`}>
<SidebarNav user={auth.user}/>
<div className="flex-1 flex flex-row">
<div
className={`w-fit ${
showingNavigationDropdown
? 'absolute h-screen z-10'
: 'md:block hidden'
}`}
>
<SidebarNav user={auth.user} />
</div>
<main className='w-full'>
<main className="w-full">
{page !== '' && (
<Breadcrumb
className="bg-gray-200 py-3 px-5 mb-2 dark:bg-gray-700"
>
<Breadcrumb className="bg-gray-200 py-3 px-5 mb-2 dark:bg-gray-700">
<Breadcrumb.Item
onClick={() => router.visit(route('dashboard'))}
icon={HiHome}
>
<p className='mt-0.5'>{page}</p>
<p className="mt-0.5">{page}</p>
</Breadcrumb.Item>
{action !== '' && (
<Breadcrumb.Item>
{action}
</Breadcrumb.Item>
<Breadcrumb.Item>{action}</Breadcrumb.Item>
)}
</Breadcrumb>
)}
<div className='py-4'>
{children}
</div>
<div className="py-4">{children}</div>
</main>
</div>
<ToastContainer />
</div>
);
)
}

@ -5,11 +5,12 @@ import { Link } from '@inertiajs/react'
export default function Guest({ children }) {
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>
<Link href="/">
<img src={logo} alt="app logo" className="w-48 h-48" />
</Link>
<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"
creator="aji19kamaludin@gmail.com"
>
<div className="mb-10">
<ApplicationLogo className="font-bold text-gray-600 text-7xl" />
</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">

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

@ -1,12 +1,12 @@
import React from 'react';
import { Head } from '@inertiajs/react';
import React from 'react'
import { Head } from '@inertiajs/react'
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { formatDate, formatIDR } from '@/utils';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
import { formatDate, formatIDR } from '@/utils'
export default function Sale(props) {
const { sale, auth } = props
return (
<AuthenticatedLayout
auth={props.auth}
@ -20,35 +20,60 @@ export default function Sale(props) {
<div>
<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='flex flex-col'>
<div>Date : <b>{formatDate(sale.date)}</b></div>
<div>Customer : <b>{sale.customer?.name}</b></div>
<div>Total : <b>{formatIDR(sale.total)}</b></div>
<div className="flex flex-col">
<div>
Date : <b>{formatDate(sale.date)}</b>
</div>
<div>
Customer : <b>{sale.customer?.name}</b>
</div>
<div>
Total : <b>{formatIDR(sale.total)}</b>
</div>
</div>
<div className='overflow-auto'>
<div className="overflow-auto">
<div>
<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">
<tr>
<th scope="col" className="py-3 px-6">
Barang
<th
scope="col"
className="py-3 px-6"
>
Produk
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Harga
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Jumlah
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Subtotal
</th>
</tr>
</thead>
<tbody>
{sale?.items?.map(item => (
<tr className="bg-white border-b dark:bg-gray-800 dark:border-gray-700" 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})
{sale?.items?.map((item) => (
<tr
className="bg-white border-b dark:bg-gray-800 dark:border-gray-700"
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 className="py-4 px-6">
{formatIDR(item.price)}
@ -57,7 +82,10 @@ export default function Sale(props) {
{formatIDR(item.quantity)}
</td>
<td className="py-4 px-6">
{formatIDR(item.quantity * item.price)}
{formatIDR(
item.quantity *
item.price
)}
</td>
</tr>
))}
@ -69,5 +97,5 @@ export default function Sale(props) {
</div>
</div>
</AuthenticatedLayout>
);
}
)
}

Loading…
Cancel
Save