Project Management ve Title
This commit is contained in:
parent
2217722243
commit
8b88970fe2
100 changed files with 525 additions and 593 deletions
|
|
@ -36,7 +36,7 @@ export const KickParticipantModal: React.FC<KickParticipantModalProps> = ({
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-lg font-semibold text-gray-900">Katılımcıyı Çıkar</h3>
|
<h3 className="text-lg font-semibold text-gray-900">Katılımcıyı Çıkar</h3>
|
||||||
<p className="text-sm text-gray-600">Bu işlem geri alınamaz</p>
|
<p className="text-gray-600">Bu işlem geri alınamaz</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {
|
import { FaCheckCircle, FaArrowLeft } from 'react-icons/fa'
|
||||||
FaCheckCircle,
|
|
||||||
FaArrowLeft
|
|
||||||
} from 'react-icons/fa';
|
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { ROUTES_ENUM } from '@/routes/route.constant'
|
import { ROUTES_ENUM } from '@/routes/route.constant'
|
||||||
import { useLocalization } from '@/utils/hooks/useLocalization';
|
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||||
|
|
||||||
interface OrderSuccessProps {
|
interface OrderSuccessProps {
|
||||||
orderId: string
|
orderId: string
|
||||||
|
|
@ -15,20 +12,26 @@ interface OrderSuccessProps {
|
||||||
export const OrderSuccess: React.FC<OrderSuccessProps> = ({ orderId, onBackToShop }) => {
|
export const OrderSuccess: React.FC<OrderSuccessProps> = ({ orderId, onBackToShop }) => {
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
const { translate } = useLocalization()
|
const { translate } = useLocalization()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="max-w-2xl mx-auto text-center">
|
<div className="max-w-2xl mx-auto text-center">
|
||||||
<div className="bg-white rounded-xl shadow-lg border border-gray-200 p-8">
|
<div className="bg-white rounded-xl shadow-lg border border-gray-200 p-8">
|
||||||
<div className="mb-6">
|
<div className="mb-6">
|
||||||
<FaCheckCircle className="w-16 h-16 text-green-500 mx-auto mb-4" />
|
<FaCheckCircle className="w-16 h-16 text-green-500 mx-auto mb-4" />
|
||||||
<h2 className="text-2xl font-bold text-gray-900 mb-2">{translate('::Public.order.success.title')}</h2>
|
<h2 className="text-xl font-bold text-gray-900">
|
||||||
|
{translate('::Public.order.success.title')}
|
||||||
|
</h2>
|
||||||
|
|
||||||
<p className="text-gray-600">
|
<p className="text-gray-600">
|
||||||
{translate('::Public.order.success.number')} <span className="font-semibold text-blue-600">#{orderId}</span>
|
{translate('::Public.order.success.number')}{' '}
|
||||||
|
<span className="font-semibold text-blue-600">#{orderId}</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="bg-green-50 border border-green-200 rounded-lg p-4 mb-6">
|
<div className="bg-green-50 border border-green-200 rounded-lg p-4 mb-6">
|
||||||
<h3 className="font-semibold text-green-800 mb-2">{translate('::Public.order.success.nextSteps')}</h3>
|
<h3 className="font-semibold text-green-800 mb-2">
|
||||||
|
{translate('::Public.order.success.nextSteps')}
|
||||||
|
</h3>
|
||||||
<ul className="text-sm text-green-700 space-y-1 text-left">
|
<ul className="text-sm text-green-700 space-y-1 text-left">
|
||||||
<li>• {translate('::Public.order.success.step1')}</li>
|
<li>• {translate('::Public.order.success.step1')}</li>
|
||||||
<li>• {translate('::Public.order.success.step2')}</li>
|
<li>• {translate('::Public.order.success.step2')}</li>
|
||||||
|
|
|
||||||
|
|
@ -171,9 +171,9 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
|
||||||
<div className="text-gray-400 mb-2">
|
<div className="text-gray-400 mb-2">
|
||||||
<FaFilter className="w-12 h-12 mx-auto" />
|
<FaFilter className="w-12 h-12 mx-auto" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-lg font-medium text-gray-900 mb-2">
|
<h2 className="text-2xl font-bold text-gray-900 mb-2">
|
||||||
{translate('::Public.products.empty.title')}
|
{translate('::Public.products.empty.title')}
|
||||||
</h3>
|
</h2>
|
||||||
<p className="text-gray-600">{translate('::Public.products.empty.description')}</p>
|
<p className="text-gray-600">{translate('::Public.products.empty.description')}</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -134,9 +134,9 @@ export const ReportViewer: React.FC = () => {
|
||||||
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
|
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div>
|
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div>
|
||||||
<h1 className="text-xl font-semibold text-gray-900 mb-2">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{translate('::App.Reports.ReportViewer.LoadingTitle')}
|
{translate('::App.Reports.ReportViewer.LoadingTitle')}
|
||||||
</h1>
|
</h2>
|
||||||
<p className="text-gray-600">{translate('::App.Reports.ReportViewer.LoadingSubtitle')}</p>
|
<p className="text-gray-600">{translate('::App.Reports.ReportViewer.LoadingSubtitle')}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -462,8 +462,8 @@ const BankManagement: React.FC<BankManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Banka Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Banka Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-500">
|
<p className="text-gray-600">
|
||||||
Banka hesapları ve EFT/Havale işlemleri
|
Banka hesapları ve EFT/Havale işlemleri
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ const CashAccountDetails: React.FC<CashAccountDetailsProps> = ({
|
||||||
<h2 className="text-lg font-semibold text-gray-900">
|
<h2 className="text-lg font-semibold text-gray-900">
|
||||||
Kasa Hesabı Detayları
|
Kasa Hesabı Detayları
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{account.name} ({account.accountCode})
|
{account.name} ({account.accountCode})
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -340,8 +340,8 @@ const CashManagement: React.FC<CashManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Kasa Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Kasa Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-500">
|
<p className="text-gray-600">
|
||||||
Nakit giriş-çıkış işlemleri yönetimi
|
Nakit giriş-çıkış işlemleri yönetimi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -666,8 +666,8 @@ const CheckNoteManagement: React.FC<CheckNoteManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Çek & Senet Takibi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Çek & Senet Takibi</h2>
|
||||||
<p className="text-sm text-gray-500">Alınan ve verilen çek & senet yönetimi</p>
|
<p className="text-gray-600">Alınan ve verilen çek & senet yönetimi</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2 text-sm">
|
<div className="flex gap-2 text-sm">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -534,10 +534,10 @@ const CurrentAccountManagement: React.FC<CurrentAccountManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Cari Hesap Yönetimi
|
Cari Hesap Yönetimi
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-500">
|
<p className="text-gray-600">
|
||||||
Müşteri ve tedarikçi cari hesaplarının yönetimi
|
Müşteri ve tedarikçi cari hesaplarının yönetimi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -315,8 +315,8 @@ const InvoiceManagement: React.FC<InvoiceManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Fatura Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Fatura Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-500">
|
<p className="text-gray-600">
|
||||||
Alış ve satış faturaları yönetimi
|
Alış ve satış faturaları yönetimi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ const WaybillDetails: React.FC<WaybillDetailsProps> = ({
|
||||||
<h2 className="text-lg font-semibold text-gray-900">
|
<h2 className="text-lg font-semibold text-gray-900">
|
||||||
İrsaliye Detayları
|
İrsaliye Detayları
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">{waybill.waybillNumber}</p>
|
<p className="text-gray-600">{waybill.waybillNumber}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
|
|
|
||||||
|
|
@ -314,8 +314,8 @@ const WaybillManagement: React.FC<WaybillManagementProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İrsaliye Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İrsaliye Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-500">
|
<p className="text-gray-600">
|
||||||
Giriş ve çıkış irsaliyeleri yönetimi
|
Giriş ve çıkış irsaliyeleri yönetimi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ const ActivityDetails: React.FC<ActivityDetailsProps> = ({ isOpen, onClose, onEd
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-semibold text-gray-900">{activity.subject}</h2>
|
<h2 className="text-lg font-semibold text-gray-900">{activity.subject}</h2>
|
||||||
<p className="text-sm text-gray-600">{getActivityTypeText(activity.activityType)}</p>
|
<p className="text-gray-600">{getActivityTypeText(activity.activityType)}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
|
|
|
||||||
|
|
@ -257,8 +257,8 @@ const ActivityRecords: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Görüşme / Aktivite Kayıtları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Görüşme / Aktivite Kayıtları</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Müşteri etkileşimleri ve aktivite takibi</p>
|
<p className="text-gray-600">Müşteri etkileşimleri ve aktivite takibi</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ const CustomerEdit: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-bold text-gray-900">Müşteri Düzenle</h1>
|
<h2 className="text-2xl font-bold text-gray-900">Müşteri Düzenle</h2>
|
||||||
<p className="text-sm text-gray-600">{customer.name}</p>
|
<p className="text-sm text-gray-600">{customer.name}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ const CustomerForm: React.FC = () => {
|
||||||
<h2 className="text-lg font-semibold text-gray-900">
|
<h2 className="text-lg font-semibold text-gray-900">
|
||||||
{isEdit ? 'Müşteri Düzenle' : 'Yeni Müşteri'}
|
{isEdit ? 'Müşteri Düzenle' : 'Yeni Müşteri'}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{isEdit ? 'Mevcut müşteri bilgilerini güncelleyin' : 'Yeni müşteri bilgilerini girin'}
|
{isEdit ? 'Mevcut müşteri bilgilerini güncelleyin' : 'Yeni müşteri bilgilerini girin'}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ const CustomerForm: React.FC = () => {
|
||||||
<h2 className="text-lg font-semibold text-gray-900">
|
<h2 className="text-lg font-semibold text-gray-900">
|
||||||
{isEdit ? 'Müşteri Düzenle' : 'Yeni Müşteri'}
|
{isEdit ? 'Müşteri Düzenle' : 'Yeni Müşteri'}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{isEdit ? 'Mevcut müşteri bilgilerini güncelleyin' : 'Yeni müşteri bilgilerini girin'}
|
{isEdit ? 'Mevcut müşteri bilgilerini güncelleyin' : 'Yeni müşteri bilgilerini girin'}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ const CustomerListWithToggle: React.FC = () => {
|
||||||
{/* Header with View Toggle */}
|
{/* Header with View Toggle */}
|
||||||
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
|
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-bold text-gray-900">Müşteri Listesi</h1>
|
<h2 className="text-2xl font-bold text-gray-900">Müşteri Listesi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Müşteri listesi ve detay bilgileri</p>
|
<p className="text-gray-600">Müşteri listesi ve detay bilgileri</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* View Mode Toggle */}
|
{/* View Mode Toggle */}
|
||||||
|
|
|
||||||
|
|
@ -157,7 +157,7 @@ const CustomerView: React.FC = () => {
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center space-x-3">
|
<div className="flex items-center space-x-3">
|
||||||
<h1 className="text-xl font-bold text-gray-900">{customer.name}</h1>
|
<h2 className="text-2xl font-bold text-gray-900">{customer.name}</h2>
|
||||||
<span
|
<span
|
||||||
className={classNames(
|
className={classNames(
|
||||||
'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border',
|
'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border',
|
||||||
|
|
@ -518,7 +518,7 @@ const CustomerView: React.FC = () => {
|
||||||
<FaUser className="w-8 h-8 text-blue-600" />
|
<FaUser className="w-8 h-8 text-blue-600" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="text-xl font-semibold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{customer.primaryContact?.fullName}
|
{customer.primaryContact?.fullName}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-gray-600">
|
<p className="text-gray-600">
|
||||||
|
|
|
||||||
|
|
@ -225,8 +225,8 @@ const LossReasons: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Kayıp Nedenleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Kayıp Nedenleri</h2>
|
||||||
<p className="text-sm text-gray-600">Fırsat kaybı nedenlerini analiz edin</p>
|
<p className="text-gray-600">Fırsat kaybı nedenlerini analiz edin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ const OpportunityDetails: React.FC<OpportunityDetailsProps> = ({
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-semibold text-gray-900">{opportunity.title}</h2>
|
<h2 className="text-lg font-semibold text-gray-900">{opportunity.title}</h2>
|
||||||
<p className="text-sm text-gray-600">{opportunity.opportunityNumber}</p>
|
<p className="text-gray-600">{opportunity.opportunityNumber}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
|
|
|
||||||
|
|
@ -241,8 +241,8 @@ const OpportunityManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Teklif & Fırsat Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Teklif & Fırsat Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600">Satış fırsatları ve teklif takibi</p>
|
<p className="text-gray-600">Satış fırsatları ve teklif takibi</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={handleAdd}
|
onClick={handleAdd}
|
||||||
|
|
|
||||||
|
|
@ -250,10 +250,10 @@ const SalesOrderForm: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{isEdit ? 'Satış Siparişi Düzenle' : 'Yeni Satış Siparişi'}
|
{isEdit ? 'Satış Siparişi Düzenle' : 'Yeni Satış Siparişi'}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Müşteri siparişi oluştur ve yönet</p>
|
<p className="text-gray-600">Müşteri siparişi oluştur ve yönet</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -207,8 +207,8 @@ const SalesOrders: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Satış Siparişleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Satış Siparişleri</h2>
|
||||||
<p className="text-sm text-gray-600">Müşteri siparişleri ve teslimat takibi</p>
|
<p className="text-gray-600">Müşteri siparişleri ve teslimat takibi</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={handleAdd}
|
onClick={handleAdd}
|
||||||
|
|
@ -266,12 +266,12 @@ const SalesOrders: React.FC = () => {
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<div className="text-2xl font-bold text-blue-600 mb-1">{currentMonthOrders}</div>
|
<div className="text-2xl font-bold text-blue-600 mb-1">{currentMonthOrders}</div>
|
||||||
<p className="text-sm text-gray-600">Bu Ay</p>
|
<p className="text-gray-600">Bu Ay</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<div className="text-2xl font-bold text-gray-600 mb-1">{previousMonthOrders}</div>
|
<div className="text-2xl font-bold text-gray-600 mb-1">{previousMonthOrders}</div>
|
||||||
<p className="text-sm text-gray-600">Geçen Ay</p>
|
<p className="text-gray-600">Geçen Ay</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
|
|
|
||||||
|
|
@ -144,8 +144,8 @@ const SalesTeamCreate: React.FC = () => {
|
||||||
<FaArrowLeft className="w-5 h-5" />
|
<FaArrowLeft className="w-5 h-5" />
|
||||||
</button>
|
</button>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Yeni Satış Ekibi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Yeni Satış Ekibi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Yeni satış ekibi oluşturun ve ekip üyelerini atayın
|
Yeni satış ekibi oluşturun ve ekip üyelerini atayın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -192,8 +192,8 @@ const SalesTeamEdit: React.FC = () => {
|
||||||
<FaArrowLeft className="w-5 h-5" />
|
<FaArrowLeft className="w-5 h-5" />
|
||||||
</button>
|
</button>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Satış Ekibi Düzenle</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Satış Ekibi Düzenle</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">{team.name} ekibini düzenleyin</p>
|
<p className="text-gray-600">{team.name} ekibini düzenleyin</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,8 @@ const SalesTeamView: React.FC = () => {
|
||||||
<FaArrowLeft className="w-5 h-5" />
|
<FaArrowLeft className="w-5 h-5" />
|
||||||
</button>
|
</button>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">{team.name}</h2>
|
<h2 className="text-2xl font-bold text-gray-900">{team.name}</h2>
|
||||||
<p className="text-gray-600 mt-1">{team.code} • Satış ekibi detayları</p>
|
<p className="text-gray-600">{team.code} • Satış ekibi detayları</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -205,8 +205,8 @@ const SalesTeams: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Satış Ekipleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Satış Ekipleri</h2>
|
||||||
<p className="text-gray-600 mt-1">Satış ekipleri ve performans yönetimi</p>
|
<p className="text-gray-600">Satış ekipleri ve performans yönetimi</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={handleAdd}
|
onClick={handleAdd}
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ const BadgeAssignmentModal: React.FC<BadgeAssignmentModalProps> = ({
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-xl font-bold text-gray-900">Rozet Ata</h3>
|
<h3 className="text-xl font-bold text-gray-900">Rozet Ata</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Personele başarı rozeti atayın
|
Personele başarı rozeti atayın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@ const BadgeEditModal: React.FC<BadgeEditModalProps> = ({
|
||||||
<h3 className="text-xl font-bold text-gray-900">
|
<h3 className="text-xl font-bold text-gray-900">
|
||||||
{mode === "edit" ? "Rozet Düzenle" : "Yeni Rozet Oluştur"}
|
{mode === "edit" ? "Rozet Düzenle" : "Yeni Rozet Oluştur"}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{mode === "edit"
|
{mode === "edit"
|
||||||
? "Mevcut rozet bilgilerini güncelleyin"
|
? "Mevcut rozet bilgilerini güncelleyin"
|
||||||
: "Yeni bir başarı rozeti tanımlayın"}
|
: "Yeni bir başarı rozeti tanımlayın"}
|
||||||
|
|
|
||||||
|
|
@ -292,8 +292,8 @@ const BadgeManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between mb-2">
|
<div className="flex items-center justify-between mb-2">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Rozet Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Rozet Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Personel başarı rozetleri ve ödüllendirme sistemi
|
Personel başarı rozetleri ve ödüllendirme sistemi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -235,7 +235,7 @@ const CostCenterManagement: React.FC = () => {
|
||||||
<div className="flex items-start justify-between mb-4">
|
<div className="flex items-start justify-between mb-4">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-lg font-semibold text-gray-900 mb-1">{costCenter.name}</h3>
|
<h3 className="text-lg font-semibold text-gray-900 mb-1">{costCenter.name}</h3>
|
||||||
<p className="text-sm text-gray-600">{costCenter.code}</p>
|
<p className="text-gray-600">{costCenter.code}</p>
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span
|
||||||
className={`px-2 py-0.5 text-xs font-medium rounded-full ${getCostCenterTypeColor(
|
className={`px-2 py-0.5 text-xs font-medium rounded-full ${getCostCenterTypeColor(
|
||||||
|
|
@ -323,8 +323,8 @@ const CostCenterManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Maliyet Merkezi Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Maliyet Merkezi Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Maliyet merkezlerini ve bütçe takibini yönetin
|
Maliyet merkezlerini ve bütçe takibini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -733,8 +733,8 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-bold text-gray-900">360° Değerlendirme Sistemi</h1>
|
<h2 className="text-2xl font-bold text-gray-900">360° Değerlendirme Sistemi</h2>
|
||||||
<p className="text-gray-600 mt-1">Çok yönlü performans değerlendirme sistemi</p>
|
<p className="text-gray-600">Çok yönlü performans değerlendirme sistemi</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -1453,7 +1453,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium text-gray-900">{campaign.name}</h4>
|
<h4 className="font-medium text-gray-900">{campaign.name}</h4>
|
||||||
<p className="text-sm text-gray-600">{campaign.description}</p>
|
<p className="text-gray-600">{campaign.description}</p>
|
||||||
<div className="flex items-center gap-2 mt-2">
|
<div className="flex items-center gap-2 mt-2">
|
||||||
<span
|
<span
|
||||||
className={`inline-block px-2 py-1 text-xs rounded-full ${getCampaignStatusColor(
|
className={`inline-block px-2 py-1 text-xs rounded-full ${getCampaignStatusColor(
|
||||||
|
|
@ -1515,8 +1515,8 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium text-gray-900">{employee.fullName}</h4>
|
<h4 className="font-medium text-gray-900">{employee.fullName}</h4>
|
||||||
<p className="text-sm text-gray-600">{employee.jobPosition?.name}</p>
|
<p className="text-gray-600">{employee.jobPosition?.name}</p>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{mockDepartments.find((d) => d.id === employee.departmantId)?.name}
|
{mockDepartments.find((d) => d.id === employee.departmantId)?.name}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1571,7 +1571,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<h4 className="font-medium text-gray-900">
|
<h4 className="font-medium text-gray-900">
|
||||||
{getAssessorTypeText(assessorType)}
|
{getAssessorTypeText(assessorType)}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{getAssessorTypeDescription(assessorType)}
|
{getAssessorTypeDescription(assessorType)}
|
||||||
</p>
|
</p>
|
||||||
{getEvaluatorsByType(evaluationTarget, assessorType).length > 0 && (
|
{getEvaluatorsByType(evaluationTarget, assessorType).length > 0 && (
|
||||||
|
|
@ -1683,7 +1683,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium text-gray-900">{evaluator.name}</h4>
|
<h4 className="font-medium text-gray-900">{evaluator.name}</h4>
|
||||||
<p className="text-sm text-gray-600">{evaluator.title}</p>
|
<p className="text-gray-600">{evaluator.title}</p>
|
||||||
<span className="inline-block mt-1 px-2 py-1 text-xs rounded-full bg-purple-100 text-purple-800">
|
<span className="inline-block mt-1 px-2 py-1 text-xs rounded-full bg-purple-100 text-purple-800">
|
||||||
{evaluator.department}
|
{evaluator.department}
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -1719,7 +1719,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium text-gray-900">{evaluator.name}</h4>
|
<h4 className="font-medium text-gray-900">{evaluator.name}</h4>
|
||||||
<p className="text-sm text-gray-600">{evaluator.title}</p>
|
<p className="text-gray-600">{evaluator.title}</p>
|
||||||
<span className="inline-block mt-1 px-2 py-1 text-xs rounded-full bg-purple-100 text-purple-800">
|
<span className="inline-block mt-1 px-2 py-1 text-xs rounded-full bg-purple-100 text-purple-800">
|
||||||
{evaluator.department}
|
{evaluator.department}
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -2057,7 +2057,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<h5 className="font-medium text-gray-800">
|
<h5 className="font-medium text-gray-800">
|
||||||
{group.groupName}
|
{group.groupName}
|
||||||
</h5>
|
</h5>
|
||||||
<p className="text-sm text-gray-600">{group.description}</p>
|
<p className="text-gray-600">{group.description}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2.5">
|
<div className="space-y-2.5">
|
||||||
|
|
@ -2386,7 +2386,7 @@ const Degree360Evaluation: React.FC = () => {
|
||||||
<div key={group.id} className="border rounded-lg p-2">
|
<div key={group.id} className="border rounded-lg p-2">
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<h4 className="font-medium text-gray-900 text-sm">{group.groupName}</h4>
|
<h4 className="font-medium text-gray-900 text-sm">{group.groupName}</h4>
|
||||||
<p className="text-sm text-gray-600">{group.description}</p>
|
<p className="text-gray-600">{group.description}</p>
|
||||||
<div className="flex items-center gap-2 mt-2">
|
<div className="flex items-center gap-2 mt-2">
|
||||||
<span className="text-xs text-gray-500">Ağırlık: %{group.weight}</span>
|
<span className="text-xs text-gray-500">Ağırlık: %{group.weight}</span>
|
||||||
<span className="text-xs text-gray-500">•</span>
|
<span className="text-xs text-gray-500">•</span>
|
||||||
|
|
|
||||||
|
|
@ -273,8 +273,8 @@ const Degree360Templates: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">360° Şablonlar</h2>
|
<h2 className="text-2xl font-bold text-gray-900">360° Şablonlar</h2>
|
||||||
<p className="text-gray-600 mt-1">360 derece değerlendirme şablonlarını yönetin</p>
|
<p className="text-gray-600">360 derece değerlendirme şablonlarını yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
|
@ -459,7 +459,7 @@ const Degree360Templates: React.FC = () => {
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium">{group.groupName}</h4>
|
<h4 className="font-medium">{group.groupName}</h4>
|
||||||
<p className="text-sm text-gray-600">{group.description}</p>
|
<p className="text-sm text-gray-600">{group.description}</p>
|
||||||
<p className="text-sm text-gray-600">Ağırlık: {group.weight}%</p>
|
<p className="text-gray-600">Ağırlık: {group.weight}%</p>
|
||||||
</div>
|
</div>
|
||||||
{isEditMode && (
|
{isEditMode && (
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
|
|
|
||||||
|
|
@ -218,8 +218,8 @@ const DepartmentManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3">
|
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Departman Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Departman Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Organizasyon yapısını ve departmanları yönetin
|
Organizasyon yapısını ve departmanları yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -348,7 +348,7 @@ const DepartmentManagement: React.FC = () => {
|
||||||
<h3 className="font-semibold text-sm text-gray-900 truncate">
|
<h3 className="font-semibold text-sm text-gray-900 truncate">
|
||||||
{department.name}
|
{department.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">{department.code}</p>
|
<p className="text-gray-600">{department.code}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span
|
||||||
|
|
|
||||||
|
|
@ -236,10 +236,10 @@ const EmployeeForm: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{isEdit ? 'Personel Düzenle' : 'Yeni Personel'}
|
{isEdit ? 'Personel Düzenle' : 'Yeni Personel'}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{isEdit
|
{isEdit
|
||||||
? 'Mevcut personel bilgilerini güncelleyin'
|
? 'Mevcut personel bilgilerini güncelleyin'
|
||||||
: 'Yeni personel bilgilerini girin'}
|
: 'Yeni personel bilgilerini girin'}
|
||||||
|
|
|
||||||
|
|
@ -110,8 +110,8 @@ const EmployeeList: React.FC = () => {
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
||||||
{/* Title & Description */}
|
{/* Title & Description */}
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Personel Listesi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Personel Listesi</h2>
|
||||||
<p className="text-sm text-gray-600">Şirket çalışanlarının listesi</p>
|
<p className="text-gray-600">Şirket çalışanlarının listesi</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Header Actions */}
|
{/* Header Actions */}
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,8 @@ const EmploymentTypes: React.FC = () => {
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-4">
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İstihdam Türleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İstihdam Türleri</h2>
|
||||||
<p className="text-gray-600 mt-1">Personel istihdam türleri ve dağılımı</p>
|
<p className="text-gray-600">Personel istihdam türleri ve dağılımı</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* New Button - Visible on larger screens */}
|
{/* New Button - Visible on larger screens */}
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,10 @@ const JobPositionViewModal: React.FC<JobPositionViewModalProps> = ({
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<FaBriefcase className="w-6 h-6 text-blue-600" />
|
<FaBriefcase className="w-6 h-6 text-blue-600" />
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{position.name}
|
{position.name}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-500">{position.code}</p>
|
<p className="text-gray-600">{position.code}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -335,8 +335,8 @@ const JobPositions: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İş Pozisyonları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İş Pozisyonları</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Şirket pozisyonları ve iş tanımları yönetimi
|
Şirket pozisyonları ve iş tanımları yönetimi
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -440,8 +440,8 @@ const LeaveManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İzin Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İzin Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Personel izin talepleri ve onay süreçleri</p>
|
<p className="text-gray-600">Personel izin talepleri ve onay süreçleri</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -360,8 +360,8 @@ const OrganizationChart: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Organizasyon Şeması</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Organizasyon Şeması</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Kurumsal hiyerarşi ve raporlama yapısı</p>
|
<p className="text-gray-600">Kurumsal hiyerarşi ve raporlama yapısı</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|
|
||||||
|
|
@ -460,8 +460,8 @@ const OvertimeManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Mesai Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Mesai Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">Personel mesai talepleri ve onay süreçleri</p>
|
<p className="text-gray-600">Personel mesai talepleri ve onay süreçleri</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -432,8 +432,8 @@ const PayrollManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Maaş, Prim, Bordro Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Maaş, Prim, Bordro Yönetimi</h2>
|
||||||
<p className="text-gray-600 mt-1">Personel ödemelerini hesaplayın ve yönetin</p>
|
<p className="text-gray-600">Personel ödemelerini hesaplayın ve yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@ const AssignWorkOrderModal: React.FC<AssignWorkOrderModalProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between p-3 border-b border-gray-200">
|
<div className="flex items-center justify-between p-3 border-b border-gray-200">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İş Emri Atama</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İş Emri Atama</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Seçili ekiplere ({selectedTeams.length}) bakım planları atayın
|
Seçili ekiplere ({selectedTeams.length}) bakım planları atayın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -142,7 +142,7 @@ const AssignWorkOrderModal: React.FC<AssignWorkOrderModalProps> = ({
|
||||||
<h4 className="font-medium text-sm text-gray-900">
|
<h4 className="font-medium text-sm text-gray-900">
|
||||||
{team.name}
|
{team.name}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">{team.code}</p>
|
<p className="text-gray-600">{team.code}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
@ -172,7 +172,7 @@ const AssignWorkOrderModal: React.FC<AssignWorkOrderModalProps> = ({
|
||||||
<h4 className="font-medium text-gray-900">
|
<h4 className="font-medium text-gray-900">
|
||||||
{plan.planCode}
|
{plan.planCode}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{plan.description}
|
{plan.description}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center space-x-4 mt-1 text-xs text-gray-500">
|
<div className="flex items-center space-x-4 mt-1 text-xs text-gray-500">
|
||||||
|
|
|
||||||
|
|
@ -209,10 +209,10 @@ const FaultNotifications: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Arıza Bildirimleri
|
Arıza Bildirimleri
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
İş merkezi arızalarını takip edin ve yönetin
|
İş merkezi arızalarını takip edin ve yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -282,8 +282,8 @@ const MaintenanceCalendar: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Bakım Takvimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Bakım Takvimi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Bakım planları ve iş emirlerini takip edin. Yeni planlama için
|
Bakım planları ve iş emirlerini takip edin. Yeni planlama için
|
||||||
gün/saat seçin.
|
gün/saat seçin.
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -151,8 +151,8 @@ const MaintenancePlans: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Bakım Planları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Bakım Planları</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Periyodik ve düzeltici bakım planlarını yönetin
|
Periyodik ve düzeltici bakım planlarını yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -151,8 +151,8 @@ const MaintenanceTeams: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Bakım Ekipleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Bakım Ekipleri</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Bakım ekiplerini ve üyelerini yönetin
|
Bakım ekiplerini ve üyelerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -242,8 +242,8 @@ const MaintenanceWorkOrders: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Bakım İş Emirleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Bakım İş Emirleri</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Bakım iş emirlerini takip edin ve yönetin
|
Bakım iş emirlerini takip edin ve yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -69,10 +69,10 @@ const PlanStatusChangeModal: React.FC<PlanStatusChangeModalProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between p-4 border-b border-gray-200">
|
<div className="flex items-center justify-between p-4 border-b border-gray-200">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Plan Durumu Değiştir
|
Plan Durumu Değiştir
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{selectedPlans.length} plan için durum değişikliği
|
{selectedPlans.length} plan için durum değişikliği
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -83,10 +83,10 @@ const TeamStatusChangeModal: React.FC<TeamStatusChangeModalProps> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between p-4 border-b border-gray-200">
|
<div className="flex items-center justify-between p-4 border-b border-gray-200">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Ekip Durumu Değiştir
|
Ekip Durumu Değiştir
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{selectedTeams.length} ekibin durumunu değiştirin
|
{selectedTeams.length} ekibin durumunu değiştirin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -152,8 +152,8 @@ const WorkCenterCards: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İş Merkezleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İş Merkezleri</h2>
|
||||||
<p className="text-gray-600 mt-1">Tüm iş merkezlerini yönetin ve takip edin</p>
|
<p className="text-gray-600">Tüm iş merkezlerini yönetin ve takip edin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
{/* View Toggle */}
|
{/* View Toggle */}
|
||||||
|
|
|
||||||
|
|
@ -81,8 +81,8 @@ const BOMManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Ürün Ağaçları (BOM)</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Ürün Ağaçları (BOM)</h2>
|
||||||
<p className="text-sm text-gray-600 mt-0.5">
|
<p className="text-gray-600">
|
||||||
Ürün bileşenlerini ve üretim operasyonlarını yönetin
|
Ürün bileşenlerini ve üretim operasyonlarını yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ const CompleteWorkOrderModal: React.FC<CompleteWorkOrderModalProps> = ({
|
||||||
<h3 className="font-medium text-gray-900 mb-2">
|
<h3 className="font-medium text-gray-900 mb-2">
|
||||||
{workOrder.workOrderNumber}
|
{workOrder.workOrderNumber}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Kalan Miktar:{" "}
|
Kalan Miktar:{" "}
|
||||||
<span className="font-medium">{remainingQuantity}</span>
|
<span className="font-medium">{remainingQuantity}</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -518,8 +518,8 @@ const DemandPlanning: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Talep Planlama</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Talep Planlama</h2>
|
||||||
<p className="text-sm text-gray-600 mt-0.5">
|
<p className="text-gray-600">
|
||||||
Talep tahmini ve malzeme ihtiyaç hesaplama
|
Talep tahmini ve malzeme ihtiyaç hesaplama
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -62,8 +62,8 @@ const OperationDefinitions: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Operasyon Tanımları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Operasyon Tanımları</h2>
|
||||||
<p className="text-sm text-gray-600 mt-0.5">
|
<p className="text-gray-600">
|
||||||
İş merkezlerinde gerçekleştirilen operasyonları tanımlayın
|
İş merkezlerinde gerçekleştirilen operasyonları tanımlayın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,8 @@ const OperationTypes: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Operasyon Türleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Operasyon Türleri</h2>
|
||||||
<p className="text-sm text-gray-600 mt-0.5">
|
<p className="text-gray-600">
|
||||||
İş merkezlerinde kullanılacak operasyon türlerini tanımlayın
|
İş merkezlerinde kullanılacak operasyon türlerini tanımlayın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -507,10 +507,10 @@ const PlanningGantt: React.FC<PlanningGanttProps> = ({
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Planlama Gantt Şeması
|
Planlama Gantt Şeması
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Üretim ve iş emirlerinizi zaman çizelgesinde yönetin.
|
Üretim ve iş emirlerinizi zaman çizelgesinde yönetin.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -206,9 +206,9 @@ const ProductionOrderForm: React.FC = () => {
|
||||||
Geri
|
Geri
|
||||||
</button>
|
</button>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{id === 'new' ? 'Yeni Üretim Emri' : 'Üretim Emri Düzenle'}
|
{id === 'new' ? 'Yeni Üretim Emri' : 'Üretim Emri Düzenle'}
|
||||||
</h1>
|
</h2>
|
||||||
<p className="text-gray-600 mt-0.5 text-sm">
|
<p className="text-gray-600 mt-0.5 text-sm">
|
||||||
{id === 'new'
|
{id === 'new'
|
||||||
? 'Yeni üretim emri oluşturun'
|
? 'Yeni üretim emri oluşturun'
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ const ProductionOrderList: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<h3 className="text-lg font-semibold text-gray-900">Açık Satış Siparişleri (Step 1)</h3>
|
<h3 className="text-lg font-semibold text-gray-900">Açık Satış Siparişleri (Step 1)</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Üretim emri oluşturmak için malzeme satırlarını seçin.
|
Üretim emri oluşturmak için malzeme satırlarını seçin.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -319,7 +319,7 @@ const ProductionOrderList: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<h3 className="text-lg font-semibold text-gray-900">BOM Seçimi</h3>
|
<h3 className="text-lg font-semibold text-gray-900">BOM Seçimi</h3>
|
||||||
<p className="text-sm text-gray-600">Her seçilen malzeme için uygun BOM'u seçin.</p>
|
<p className="text-gray-600">Her seçilen malzeme için uygun BOM'u seçin.</p>
|
||||||
|
|
||||||
{missingBOMs.length > 0 && (
|
{missingBOMs.length > 0 && (
|
||||||
<div className="bg-yellow-50 border border-yellow-200 rounded-lg p-2 mb-3">
|
<div className="bg-yellow-50 border border-yellow-200 rounded-lg p-2 mb-3">
|
||||||
|
|
@ -361,7 +361,7 @@ const ProductionOrderList: React.FC = () => {
|
||||||
{material?.code} {' - '}
|
{material?.code} {' - '}
|
||||||
{material?.name || materialId}
|
{material?.name || materialId}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">Toplam Miktar: {totalQuantity}</p>
|
<p className="text-gray-600">Toplam Miktar: {totalQuantity}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
|
|
@ -439,7 +439,7 @@ const ProductionOrderList: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<h3 className="text-lg font-semibold text-gray-900">İş Merkezi Seçimi</h3>
|
<h3 className="text-lg font-semibold text-gray-900">İş Merkezi Seçimi</h3>
|
||||||
<p className="text-sm text-gray-600">Her operasyon için uygun iş merkezini seçin.</p>
|
<p className="text-gray-600">Her operasyon için uygun iş merkezini seçin.</p>
|
||||||
|
|
||||||
<div className="space-y-2 mt-2 overflow-y-auto max-h-[350px]">
|
<div className="space-y-2 mt-2 overflow-y-auto max-h-[350px]">
|
||||||
{selectedBOMsList.map((bom) => (
|
{selectedBOMsList.map((bom) => (
|
||||||
|
|
@ -498,7 +498,7 @@ const ProductionOrderList: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<h3 className="text-lg font-semibold text-gray-900">Özet ve Onay</h3>
|
<h3 className="text-lg font-semibold text-gray-900">Özet ve Onay</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Seçilen malzemeler, BOM'lar ve iş merkezi atamalarını gözden geçirin.
|
Seçilen malzemeler, BOM'lar ve iş merkezi atamalarını gözden geçirin.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -597,8 +597,8 @@ const ProductionOrderList: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Üretim Emirleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Üretim Emirleri</h2>
|
||||||
<p className="text-gray-600 mt-1">Üretim süreçlerinizi yönetin ve izleyin</p>
|
<p className="text-gray-600">Üretim süreçlerinizi yönetin ve izleyin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-3">
|
<div className="flex items-center space-x-3">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,8 @@ const Requirements: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Malzeme İhtiyaçları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Malzeme İhtiyaçları</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Malzeme ihtiyaç hesaplama ve satın alma önerileri
|
Malzeme ihtiyaç hesaplama ve satın alma önerileri
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -322,8 +322,8 @@ const WorkOrders: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İş Emirleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İş Emirleri</h2>
|
||||||
<p className="text-sm text-gray-600">Üretim operasyonlarının detaylı takibi</p>
|
<p className="text-gray-600">Üretim operasyonlarının detaylı takibi</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={handleAdd}
|
onClick={handleAdd}
|
||||||
|
|
|
||||||
|
|
@ -165,8 +165,8 @@ const ActivityTypes: React.FC = () => {
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Aktivite Türleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Aktivite Türleri</h2>
|
||||||
<p className="text-gray-600 mt-1">Proje ve görev aktivitelerinin türlerini yönetin</p>
|
<p className="text-gray-600">Proje ve görev aktivitelerinin türlerini yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-1.5">
|
<div className="flex gap-1.5">
|
||||||
<div className="flex border border-gray-300 rounded-lg overflow-hidden">
|
<div className="flex border border-gray-300 rounded-lg overflow-hidden">
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useState } from "react";
|
import React, { useState } from 'react'
|
||||||
import {
|
import {
|
||||||
FaSearch,
|
FaSearch,
|
||||||
FaDollarSign,
|
FaDollarSign,
|
||||||
|
|
@ -7,78 +7,64 @@ import {
|
||||||
FaClock,
|
FaClock,
|
||||||
FaChartBar,
|
FaChartBar,
|
||||||
FaDownload,
|
FaDownload,
|
||||||
} from "react-icons/fa";
|
} from 'react-icons/fa'
|
||||||
import { PsProjectCostTracking } from "../../../types/ps";
|
import { PsProjectCostTracking } from '../../../types/ps'
|
||||||
import { mockProjectCostTracking } from "../../../mocks/mockProjectCostTracking";
|
import { mockProjectCostTracking } from '../../../mocks/mockProjectCostTracking'
|
||||||
import Widget from "../../../components/common/Widget";
|
import Widget from '../../../components/common/Widget'
|
||||||
import {
|
import {
|
||||||
getCostTimeTrackingStatusColor,
|
getCostTimeTrackingStatusColor,
|
||||||
getCostTimeTrackingStatusIcon,
|
getCostTimeTrackingStatusIcon,
|
||||||
getCostTimeTrackingStatusText,
|
getCostTimeTrackingStatusText,
|
||||||
} from "../../../utils/erp";
|
} from '../../../utils/erp'
|
||||||
|
import { Container } from '@/components/shared'
|
||||||
|
|
||||||
const CostTimeTracking: React.FC = () => {
|
const CostTimeTracking: React.FC = () => {
|
||||||
const [searchTerm, setSearchTerm] = useState("");
|
const [searchTerm, setSearchTerm] = useState('')
|
||||||
const [statusFilter, setStatusFilter] = useState<string>("");
|
const [statusFilter, setStatusFilter] = useState<string>('')
|
||||||
const [selectedProject, setSelectedProject] = useState<string>("");
|
const [selectedProject, setSelectedProject] = useState<string>('')
|
||||||
|
|
||||||
const getBudgetVariance = (project: PsProjectCostTracking) => {
|
const getBudgetVariance = (project: PsProjectCostTracking) => {
|
||||||
return (
|
return (
|
||||||
((project.actualCost - (project.plannedBudget * project.progress) / 100) /
|
((project.actualCost - (project.plannedBudget * project.progress) / 100) /
|
||||||
project.plannedBudget) *
|
project.plannedBudget) *
|
||||||
100
|
100
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const getScheduleVariance = (project: PsProjectCostTracking) => {
|
const getScheduleVariance = (project: PsProjectCostTracking) => {
|
||||||
if (!project.actualDuration) return 0;
|
if (!project.actualDuration) return 0
|
||||||
const plannedDurationAtProgress =
|
const plannedDurationAtProgress = (project.plannedDuration * project.progress) / 100
|
||||||
(project.plannedDuration * project.progress) / 100;
|
return ((project.actualDuration - plannedDurationAtProgress) / project.plannedDuration) * 100
|
||||||
return (
|
}
|
||||||
((project.actualDuration - plannedDurationAtProgress) /
|
|
||||||
project.plannedDuration) *
|
|
||||||
100
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const filteredProjects = mockProjectCostTracking.filter((project) => {
|
const filteredProjects = mockProjectCostTracking.filter((project) => {
|
||||||
const matchesSearch =
|
const matchesSearch =
|
||||||
project.projectName.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
project.projectName.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
project.projectCode.toLowerCase().includes(searchTerm.toLowerCase());
|
project.projectCode.toLowerCase().includes(searchTerm.toLowerCase())
|
||||||
const matchesStatus =
|
const matchesStatus = statusFilter === '' || project.status === statusFilter
|
||||||
statusFilter === "" || project.status === statusFilter;
|
return matchesSearch && matchesStatus
|
||||||
return matchesSearch && matchesStatus;
|
})
|
||||||
});
|
|
||||||
|
|
||||||
const totalPlannedBudget = mockProjectCostTracking.reduce(
|
const totalPlannedBudget = mockProjectCostTracking.reduce((sum, p) => sum + p.plannedBudget, 0)
|
||||||
(sum, p) => sum + p.plannedBudget,
|
const totalActualCost = mockProjectCostTracking.reduce((sum, p) => sum + p.actualCost, 0)
|
||||||
0
|
|
||||||
);
|
|
||||||
const totalActualCost = mockProjectCostTracking.reduce(
|
|
||||||
(sum, p) => sum + p.actualCost,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
const averageProgress =
|
const averageProgress =
|
||||||
mockProjectCostTracking.reduce((sum, p) => sum + p.progress, 0) /
|
mockProjectCostTracking.reduce((sum, p) => sum + p.progress, 0) / mockProjectCostTracking.length
|
||||||
mockProjectCostTracking.length;
|
|
||||||
|
|
||||||
const ProjectDetailModal = () => {
|
const ProjectDetailModal = () => {
|
||||||
const project = mockProjectCostTracking.find(
|
const project = mockProjectCostTracking.find((p) => p.id === selectedProject)
|
||||||
(p) => p.id === selectedProject
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!selectedProject || !project) return null;
|
if (!selectedProject || !project) return null
|
||||||
|
|
||||||
const StatusIcon = getCostTimeTrackingStatusIcon(project.status);
|
const StatusIcon = getCostTimeTrackingStatusIcon(project.status)
|
||||||
const budgetVariance = getBudgetVariance(project);
|
const budgetVariance = getBudgetVariance(project)
|
||||||
const scheduleVariance = getScheduleVariance(project);
|
const scheduleVariance = getScheduleVariance(project)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="fixed inset-0 z-50 overflow-y-auto">
|
<div className="fixed inset-0 z-50 overflow-y-auto">
|
||||||
<div className="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
<div className="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
<div
|
<div
|
||||||
className="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"
|
className="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"
|
||||||
onClick={() => setSelectedProject("")}
|
onClick={() => setSelectedProject('')}
|
||||||
></div>
|
></div>
|
||||||
|
|
||||||
<div className="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-2 sm:align-middle sm:max-w-3xl sm:w-full">
|
<div className="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-2 sm:align-middle sm:max-w-3xl sm:w-full">
|
||||||
|
|
@ -91,15 +77,10 @@ const CostTimeTracking: React.FC = () => {
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={() => setSelectedProject("")}
|
onClick={() => setSelectedProject('')}
|
||||||
className="text-gray-400 hover:text-gray-600"
|
className="text-gray-400 hover:text-gray-600"
|
||||||
>
|
>
|
||||||
<svg
|
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
className="w-5 h-5"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke="currentColor"
|
|
||||||
>
|
|
||||||
<path
|
<path
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
|
|
@ -120,23 +101,17 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Planlanan Bütçe:</span>
|
<span>Planlanan Bütçe:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">₺{project.plannedBudget.toLocaleString()}</span>
|
||||||
₺{project.plannedBudget.toLocaleString()}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Gerçekleşen Maliyet:</span>
|
<span>Gerçekleşen Maliyet:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">₺{project.actualCost.toLocaleString()}</span>
|
||||||
₺{project.actualCost.toLocaleString()}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Kalan Bütçe:</span>
|
<span>Kalan Bütçe:</span>
|
||||||
<span
|
<span
|
||||||
className={`font-medium ${
|
className={`font-medium ${
|
||||||
project.remainingBudget >= 0
|
project.remainingBudget >= 0 ? 'text-green-600' : 'text-red-600'
|
||||||
? "text-green-600"
|
|
||||||
: "text-red-600"
|
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
₺{project.remainingBudget.toLocaleString()}
|
₺{project.remainingBudget.toLocaleString()}
|
||||||
|
|
@ -145,20 +120,14 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Bütçe Kullanım Oranı:</span>
|
<span>Bütçe Kullanım Oranı:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">
|
||||||
%
|
%{((project.actualCost / project.plannedBudget) * 100).toFixed(1)}
|
||||||
{(
|
|
||||||
(project.actualCost / project.plannedBudget) *
|
|
||||||
100
|
|
||||||
).toFixed(1)}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Bütçe Varyansı:</span>
|
<span>Bütçe Varyansı:</span>
|
||||||
<span
|
<span
|
||||||
className={`font-medium flex items-center gap-1 ${
|
className={`font-medium flex items-center gap-1 ${
|
||||||
budgetVariance >= 0
|
budgetVariance >= 0 ? 'text-red-600' : 'text-green-600'
|
||||||
? "text-red-600"
|
|
||||||
: "text-green-600"
|
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{budgetVariance >= 0 ? (
|
{budgetVariance >= 0 ? (
|
||||||
|
|
@ -181,15 +150,11 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Planlanan Süre:</span>
|
<span>Planlanan Süre:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">{project.plannedDuration} gün</span>
|
||||||
{project.plannedDuration} gün
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Geçen Süre:</span>
|
<span>Geçen Süre:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">{project.actualDuration || 0} gün</span>
|
||||||
{project.actualDuration || 0} gün
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>İlerleme:</span>
|
<span>İlerleme:</span>
|
||||||
|
|
@ -198,16 +163,14 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Planlanan Bitiş:</span>
|
<span>Planlanan Bitiş:</span>
|
||||||
<span className="font-medium">
|
<span className="font-medium">
|
||||||
{project.plannedEndDate.toLocaleDateString("tr-TR")}
|
{project.plannedEndDate.toLocaleDateString('tr-TR')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span>Süre Varyansı:</span>
|
<span>Süre Varyansı:</span>
|
||||||
<span
|
<span
|
||||||
className={`font-medium flex items-center gap-1 ${
|
className={`font-medium flex items-center gap-1 ${
|
||||||
scheduleVariance >= 0
|
scheduleVariance >= 0 ? 'text-red-600' : 'text-green-600'
|
||||||
? "text-red-600"
|
|
||||||
: "text-green-600"
|
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{scheduleVariance >= 0 ? (
|
{scheduleVariance >= 0 ? (
|
||||||
|
|
@ -244,25 +207,20 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="flex justify-between text-sm mb-1">
|
<div className="flex justify-between text-sm mb-1">
|
||||||
<span>Bütçe Kullanımı</span>
|
<span>Bütçe Kullanımı</span>
|
||||||
<span>
|
<span>
|
||||||
%
|
%{((project.actualCost / project.plannedBudget) * 100).toFixed(1)}
|
||||||
{(
|
|
||||||
(project.actualCost / project.plannedBudget) *
|
|
||||||
100
|
|
||||||
).toFixed(1)}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full bg-gray-200 rounded-full h-2">
|
<div className="w-full bg-gray-200 rounded-full h-2">
|
||||||
<div
|
<div
|
||||||
className={`h-2 rounded-full ${
|
className={`h-2 rounded-full ${
|
||||||
project.actualCost > project.plannedBudget
|
project.actualCost > project.plannedBudget
|
||||||
? "bg-red-600"
|
? 'bg-red-600'
|
||||||
: "bg-green-600"
|
: 'bg-green-600'
|
||||||
}`}
|
}`}
|
||||||
style={{
|
style={{
|
||||||
width: `${Math.min(
|
width: `${Math.min(
|
||||||
(project.actualCost / project.plannedBudget) *
|
(project.actualCost / project.plannedBudget) * 100,
|
||||||
100,
|
100,
|
||||||
100
|
|
||||||
)}%`,
|
)}%`,
|
||||||
}}
|
}}
|
||||||
></div>
|
></div>
|
||||||
|
|
@ -273,27 +231,20 @@ const CostTimeTracking: React.FC = () => {
|
||||||
<div className="flex justify-between text-sm mb-1">
|
<div className="flex justify-between text-sm mb-1">
|
||||||
<span>Süre Kullanımı</span>
|
<span>Süre Kullanımı</span>
|
||||||
<span>
|
<span>
|
||||||
%
|
%{((project.actualDuration / project.plannedDuration) * 100).toFixed(1)}
|
||||||
{(
|
|
||||||
(project.actualDuration /
|
|
||||||
project.plannedDuration) *
|
|
||||||
100
|
|
||||||
).toFixed(1)}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full bg-gray-200 rounded-full h-2">
|
<div className="w-full bg-gray-200 rounded-full h-2">
|
||||||
<div
|
<div
|
||||||
className={`h-2 rounded-full ${
|
className={`h-2 rounded-full ${
|
||||||
project.actualDuration > project.plannedDuration
|
project.actualDuration > project.plannedDuration
|
||||||
? "bg-red-600"
|
? 'bg-red-600'
|
||||||
: "bg-green-600"
|
: 'bg-green-600'
|
||||||
}`}
|
}`}
|
||||||
style={{
|
style={{
|
||||||
width: `${Math.min(
|
width: `${Math.min(
|
||||||
(project.actualDuration /
|
(project.actualDuration / project.plannedDuration) * 100,
|
||||||
project.plannedDuration) *
|
100,
|
||||||
100,
|
|
||||||
100
|
|
||||||
)}%`,
|
)}%`,
|
||||||
}}
|
}}
|
||||||
></div>
|
></div>
|
||||||
|
|
@ -307,224 +258,210 @@ const CostTimeTracking: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2 pt-2">
|
<Container>
|
||||||
<div className="flex items-center justify-between">
|
<div className="space-y-2">
|
||||||
<div>
|
<div className="flex items-center justify-between">
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<div>
|
||||||
Proje Maliyet ve Süre Takibi
|
<h2 className="text-2xl font-bold text-gray-900">Proje Maliyet ve Süre Takibi</h2>
|
||||||
</h2>
|
<p className="text-gray-600">Projelerin bütçe ve zaman performansını analiz edin</p>
|
||||||
<p className="text-gray-600 mt-1">
|
</div>
|
||||||
Projelerin bütçe ve zaman performansını analiz edin
|
<div className="flex gap-2">
|
||||||
</p>
|
<button className="bg-green-600 text-white px-3 py-1.5 rounded-lg hover:bg-green-700 flex items-center gap-2">
|
||||||
|
<FaDownload className="w-4 h-4" />
|
||||||
|
Rapor İndir
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
|
||||||
<button className="bg-green-600 text-white px-3 py-1.5 rounded-lg hover:bg-green-700 flex items-center gap-2">
|
|
||||||
<FaDownload className="w-4 h-4" />
|
|
||||||
Rapor İndir
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Summary Cards */}
|
{/* Summary Cards */}
|
||||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-2">
|
<div className="grid grid-cols-1 md:grid-cols-4 gap-2">
|
||||||
<Widget
|
<Widget
|
||||||
title="Toplam Planlanan Bütçe"
|
title="Toplam Planlanan Bütçe"
|
||||||
value={`₺${(totalPlannedBudget / 1000000).toFixed(1)}M`}
|
value={`₺${(totalPlannedBudget / 1000000).toFixed(1)}M`}
|
||||||
color="blue"
|
color="blue"
|
||||||
icon="FaDollarSign"
|
icon="FaDollarSign"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Widget
|
<Widget
|
||||||
title="Toplam Gerçekleşen"
|
title="Toplam Gerçekleşen"
|
||||||
value={`₺${(totalActualCost / 1000000).toFixed(1)}M`}
|
value={`₺${(totalActualCost / 1000000).toFixed(1)}M`}
|
||||||
color="orange"
|
color="orange"
|
||||||
icon="FaArrowUp"
|
icon="FaArrowUp"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Widget
|
<Widget
|
||||||
title="Ortalama İlerleme"
|
title="Ortalama İlerleme"
|
||||||
value={`%${averageProgress.toFixed(0)}`}
|
value={`%${averageProgress.toFixed(0)}`}
|
||||||
color="green"
|
color="green"
|
||||||
icon="FaChartBar"
|
icon="FaChartBar"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Widget
|
<Widget
|
||||||
title="Aktif Projeler"
|
title="Aktif Projeler"
|
||||||
value={
|
value={mockProjectCostTracking.filter((p) => p.status !== 'COMPLETED').length}
|
||||||
mockProjectCostTracking.filter((p) => p.status !== "COMPLETED")
|
color="purple"
|
||||||
.length
|
icon="FaChartPie"
|
||||||
}
|
|
||||||
color="purple"
|
|
||||||
icon="FaChartPie"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Filters */}
|
|
||||||
<div className="flex flex-col sm:flex-row gap-2">
|
|
||||||
<div className="relative flex-1">
|
|
||||||
<FaSearch className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4" />
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="Proje ara..."
|
|
||||||
value={searchTerm}
|
|
||||||
onChange={(e) => setSearchTerm(e.target.value)}
|
|
||||||
className="pl-10 pr-3 py-1.5 text-sm w-full border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<select
|
|
||||||
value={statusFilter}
|
|
||||||
onChange={(e) => setStatusFilter(e.target.value)}
|
|
||||||
className="px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
||||||
>
|
|
||||||
<option value="">Tüm Durumlar</option>
|
|
||||||
<option value="ON_TRACK">Planında</option>
|
|
||||||
<option value="AT_RISK">Risk Altında</option>
|
|
||||||
<option value="DELAYED">Gecikmiş</option>
|
|
||||||
<option value="COMPLETED">Tamamlandı</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Projects Table */}
|
{/* Filters */}
|
||||||
<div className="bg-white rounded-lg shadow-sm border border-gray-200">
|
<div className="flex flex-col sm:flex-row gap-2">
|
||||||
<div className="overflow-x-auto">
|
<div className="relative flex-1">
|
||||||
<table className="min-w-full divide-y divide-gray-200">
|
<FaSearch className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4" />
|
||||||
<thead className="bg-gray-50">
|
<input
|
||||||
<tr>
|
type="text"
|
||||||
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
placeholder="Proje ara..."
|
||||||
Proje
|
value={searchTerm}
|
||||||
</th>
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
className="pl-10 pr-3 py-1.5 text-sm w-full border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
Bütçe Performansı
|
/>
|
||||||
</th>
|
</div>
|
||||||
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
<select
|
||||||
Süre Performansı
|
value={statusFilter}
|
||||||
</th>
|
onChange={(e) => setStatusFilter(e.target.value)}
|
||||||
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
className="px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
İlerleme
|
>
|
||||||
</th>
|
<option value="">Tüm Durumlar</option>
|
||||||
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
<option value="ON_TRACK">Planında</option>
|
||||||
Durum
|
<option value="AT_RISK">Risk Altında</option>
|
||||||
</th>
|
<option value="DELAYED">Gecikmiş</option>
|
||||||
<th className="px-2 py-1.5 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">
|
<option value="COMPLETED">Tamamlandı</option>
|
||||||
İşlemler
|
</select>
|
||||||
</th>
|
</div>
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody className="bg-white divide-y divide-gray-200">
|
|
||||||
{filteredProjects.map((project) => {
|
|
||||||
const StatusIcon = getCostTimeTrackingStatusIcon(
|
|
||||||
project.status
|
|
||||||
);
|
|
||||||
const budgetVariance = getBudgetVariance(project);
|
|
||||||
const scheduleVariance = getScheduleVariance(project);
|
|
||||||
|
|
||||||
return (
|
{/* Projects Table */}
|
||||||
<tr key={project.id} className="hover:bg-gray-50 text-sm">
|
<div className="bg-white rounded-lg shadow-sm border border-gray-200">
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap">
|
<div className="overflow-x-auto">
|
||||||
<div>
|
<table className="min-w-full divide-y divide-gray-200">
|
||||||
<div className="text-sm font-medium text-gray-900">
|
<thead className="bg-gray-50">
|
||||||
{project.projectName}
|
<tr>
|
||||||
|
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Proje
|
||||||
|
</th>
|
||||||
|
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Bütçe Performansı
|
||||||
|
</th>
|
||||||
|
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Süre Performansı
|
||||||
|
</th>
|
||||||
|
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
İlerleme
|
||||||
|
</th>
|
||||||
|
<th className="px-2 py-1.5 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Durum
|
||||||
|
</th>
|
||||||
|
<th className="px-2 py-1.5 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
İşlemler
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody className="bg-white divide-y divide-gray-200">
|
||||||
|
{filteredProjects.map((project) => {
|
||||||
|
const StatusIcon = getCostTimeTrackingStatusIcon(project.status)
|
||||||
|
const budgetVariance = getBudgetVariance(project)
|
||||||
|
const scheduleVariance = getScheduleVariance(project)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<tr key={project.id} className="hover:bg-gray-50 text-sm">
|
||||||
|
<td className="px-2 py-1.5 whitespace-nowrap">
|
||||||
|
<div>
|
||||||
|
<div className="text-sm font-medium text-gray-900">
|
||||||
|
{project.projectName}
|
||||||
|
</div>
|
||||||
|
<div className="text-sm text-gray-500">{project.projectCode}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm text-gray-500">
|
</td>
|
||||||
{project.projectCode}
|
<td className="px-2 py-1.5 whitespace-nowrap">
|
||||||
</div>
|
<div className="text-sm">
|
||||||
</div>
|
<div className="font-medium text-gray-900">
|
||||||
</td>
|
₺{project.actualCost.toLocaleString()} / ₺
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap">
|
{project.plannedBudget.toLocaleString()}
|
||||||
<div className="text-sm">
|
</div>
|
||||||
<div className="font-medium text-gray-900">
|
|
||||||
₺{project.actualCost.toLocaleString()} / ₺
|
|
||||||
{project.plannedBudget.toLocaleString()}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={`flex items-center gap-1 ${
|
|
||||||
budgetVariance >= 0
|
|
||||||
? "text-red-600"
|
|
||||||
: "text-green-600"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{budgetVariance >= 0 ? (
|
|
||||||
<FaArrowUp className="w-3 h-3" />
|
|
||||||
) : (
|
|
||||||
<FaArrowDown className="w-3 h-3" />
|
|
||||||
)}
|
|
||||||
<span className="text-xs">
|
|
||||||
%{Math.abs(budgetVariance).toFixed(1)} varyans
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap">
|
|
||||||
<div className="text-sm">
|
|
||||||
<div className="font-medium text-gray-900">
|
|
||||||
{project.actualDuration || 0} /{" "}
|
|
||||||
{project.plannedDuration} gün
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={`flex items-center gap-1 ${
|
|
||||||
scheduleVariance >= 0
|
|
||||||
? "text-red-600"
|
|
||||||
: "text-green-600"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{scheduleVariance >= 0 ? (
|
|
||||||
<FaArrowUp className="w-3 h-3" />
|
|
||||||
) : (
|
|
||||||
<FaArrowDown className="w-3 h-3" />
|
|
||||||
)}
|
|
||||||
<span className="text-xs">
|
|
||||||
%{Math.abs(scheduleVariance).toFixed(1)} varyans
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap">
|
|
||||||
<div className="flex items-center">
|
|
||||||
<div className="w-16 bg-gray-200 rounded-full h-2 mr-2">
|
|
||||||
<div
|
<div
|
||||||
className="bg-blue-600 h-2 rounded-full"
|
className={`flex items-center gap-1 ${
|
||||||
style={{ width: `${project.progress}%` }}
|
budgetVariance >= 0 ? 'text-red-600' : 'text-green-600'
|
||||||
></div>
|
}`}
|
||||||
|
>
|
||||||
|
{budgetVariance >= 0 ? (
|
||||||
|
<FaArrowUp className="w-3 h-3" />
|
||||||
|
) : (
|
||||||
|
<FaArrowDown className="w-3 h-3" />
|
||||||
|
)}
|
||||||
|
<span className="text-xs">
|
||||||
|
%{Math.abs(budgetVariance).toFixed(1)} varyans
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-sm font-medium text-gray-900">
|
</td>
|
||||||
%{project.progress}
|
<td className="px-2 py-1.5 whitespace-nowrap">
|
||||||
|
<div className="text-sm">
|
||||||
|
<div className="font-medium text-gray-900">
|
||||||
|
{project.actualDuration || 0} / {project.plannedDuration} gün
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={`flex items-center gap-1 ${
|
||||||
|
scheduleVariance >= 0 ? 'text-red-600' : 'text-green-600'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{scheduleVariance >= 0 ? (
|
||||||
|
<FaArrowUp className="w-3 h-3" />
|
||||||
|
) : (
|
||||||
|
<FaArrowDown className="w-3 h-3" />
|
||||||
|
)}
|
||||||
|
<span className="text-xs">
|
||||||
|
%{Math.abs(scheduleVariance).toFixed(1)} varyans
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td className="px-2 py-1.5 whitespace-nowrap">
|
||||||
|
<div className="flex items-center">
|
||||||
|
<div className="w-16 bg-gray-200 rounded-full h-2 mr-2">
|
||||||
|
<div
|
||||||
|
className="bg-blue-600 h-2 rounded-full"
|
||||||
|
style={{ width: `${project.progress}%` }}
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<span className="text-sm font-medium text-gray-900">
|
||||||
|
%{project.progress}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td className="px-2 py-1.5 whitespace-nowrap">
|
||||||
|
<span
|
||||||
|
className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getCostTimeTrackingStatusColor(
|
||||||
|
project.status,
|
||||||
|
)}`}
|
||||||
|
>
|
||||||
|
<StatusIcon className="w-3 h-3 mr-1" />
|
||||||
|
{getCostTimeTrackingStatusText(project.status)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</td>
|
||||||
</td>
|
<td className="px-2 py-1.5 whitespace-nowrap text-right text-sm font-medium">
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap">
|
<button
|
||||||
<span
|
onClick={() => setSelectedProject(project.id)}
|
||||||
className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getCostTimeTrackingStatusColor(
|
className="text-blue-600 hover:text-blue-900"
|
||||||
project.status
|
>
|
||||||
)}`}
|
Detaylar
|
||||||
>
|
</button>
|
||||||
<StatusIcon className="w-3 h-3 mr-1" />
|
</td>
|
||||||
{getCostTimeTrackingStatusText(project.status)}
|
</tr>
|
||||||
</span>
|
)
|
||||||
</td>
|
})}
|
||||||
<td className="px-2 py-1.5 whitespace-nowrap text-right text-sm font-medium">
|
</tbody>
|
||||||
<button
|
</table>
|
||||||
onClick={() => setSelectedProject(project.id)}
|
</div>
|
||||||
className="text-blue-600 hover:text-blue-900"
|
|
||||||
>
|
|
||||||
Detaylar
|
|
||||||
</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Project Detail Modal */}
|
{/* Project Detail Modal */}
|
||||||
<ProjectDetailModal />
|
<ProjectDetailModal />
|
||||||
</div>
|
</Container>
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
export default CostTimeTracking;
|
export default CostTimeTracking
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ const PhaseViewModal: React.FC<PhaseViewModalProps> = ({
|
||||||
<h3 className="text-base font-semibold text-gray-900">
|
<h3 className="text-base font-semibold text-gray-900">
|
||||||
Proje Aşamaları
|
Proje Aşamaları
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{project.name} - {project.code}
|
{project.name} - {project.code}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -630,10 +630,10 @@ const ProjectForm: React.FC = () => {
|
||||||
<FaFolder className="w-6 h-6 text-blue-600" />
|
<FaFolder className="w-6 h-6 text-blue-600" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{isEdit ? formData.code : 'Yeni Proje'}
|
{isEdit ? formData.code : 'Yeni Proje'}
|
||||||
</h1>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{isEdit ? formData.name : 'Proje bilgilerini girin'}
|
{isEdit ? formData.name : 'Proje bilgilerini girin'}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -545,8 +545,8 @@ const ProjectGantt: React.FC<ProjectGanttProps> = ({ employeeId }) => {
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">İş Yükü ve Proje Takibi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">İş Yükü ve Proje Takibi</h2>
|
||||||
<p className="text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Tüm görevlerinizi merkezi bir noktadan yönetin.
|
Tüm görevlerinizi merkezi bir noktadan yönetin.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -110,8 +110,8 @@ const ProjectList: React.FC = () => {
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Proje Listesi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Proje Listesi</h2>
|
||||||
<p className="text-gray-600 mt-1">Proje listesinizi yönetin</p>
|
<p className="text-gray-600">Proje listesinizi yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
{/* View Toggle */}
|
{/* View Toggle */}
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ const ProjectPhases: React.FC = () => {
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="flex items-center gap-3 mb-2">
|
<div className="flex items-center gap-3 mb-2">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Proje Aşamaları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Proje Aşamaları</h2>
|
||||||
<p className="text-gray-600">Proje İlerleme Yönetimi</p>
|
<p className="text-gray-600">Proje İlerleme Yönetimi</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ const ProjectTasks: React.FC = () => {
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div className="flex items-center justify-between mb-4">
|
<div className="flex items-center justify-between mb-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Görev Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Görev Yönetimi</h2>
|
||||||
<p className="text-gray-600">
|
<p className="text-gray-600">
|
||||||
Proje görevlerinizi oluşturun, düzenleyin ve takip edin
|
Proje görevlerinizi oluşturun, düzenleyin ve takip edin
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -470,7 +470,7 @@ const ProjectTasks: React.FC = () => {
|
||||||
<h3 className="text-lg font-bold text-gray-900">
|
<h3 className="text-lg font-bold text-gray-900">
|
||||||
{selectedTask.taskCode} - {selectedTask.name}
|
{selectedTask.taskCode} - {selectedTask.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">Görev detayları</p>
|
<p className="text-gray-600">Görev detayları</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ const ProjectView: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-lg font-bold text-gray-900">{project.code}</h1>
|
<h1 className="text-lg font-bold text-gray-900">{project.code}</h1>
|
||||||
<p className="text-sm text-gray-600">{project.name}</p>
|
<p className="text-gray-600">{project.name}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -307,7 +307,7 @@ const ProjectView: React.FC = () => {
|
||||||
<h4 className="font-medium text-gray-900">
|
<h4 className="font-medium text-gray-900">
|
||||||
{project.projectManager.fullName}
|
{project.projectManager.fullName}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{project.projectManager.jobPosition?.name || 'Proje Yöneticisi'}
|
{project.projectManager.jobPosition?.name || 'Proje Yöneticisi'}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center mt-1 text-sm text-gray-500">
|
<div className="flex items-center mt-1 text-sm text-gray-500">
|
||||||
|
|
@ -339,7 +339,7 @@ const ProjectView: React.FC = () => {
|
||||||
<h4 className="font-medium text-gray-900">
|
<h4 className="font-medium text-gray-900">
|
||||||
{project.customer.name}
|
{project.customer.name}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{project.customer.primaryContact?.firstName}{' '}
|
{project.customer.primaryContact?.firstName}{' '}
|
||||||
{project.customer.primaryContact?.lastName}
|
{project.customer.primaryContact?.lastName}
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -147,96 +147,88 @@ const TaskDailyUpdates: React.FC = () => {
|
||||||
<Container>
|
<Container>
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="mb-4 mt-2">
|
<div className="flex items-center justify-between mb-3">
|
||||||
<div className="flex items-center justify-between mb-3">
|
<div>
|
||||||
<div>
|
<h2 className="text-2xl font-bold text-gray-900">Günlük Aktivite Takibi</h2>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Günlük Aktivite Takibi</h2>
|
<p className="text-gray-600">
|
||||||
<p className="text-gray-600">
|
Günlük işlerinizi planlayın, tamamlanan görevleri işaretleyin
|
||||||
Günlük işlerinizi planlayın, tamamlanan görevleri işaretleyin
|
</p>
|
||||||
</p>
|
</div>
|
||||||
</div>
|
<button
|
||||||
<button
|
onClick={() => setIsModalVisible(true)}
|
||||||
onClick={() => setIsModalVisible(true)}
|
className="bg-blue-600 text-white px-3 py-1.5 text-sm rounded-lg hover:bg-blue-700 flex items-center gap-2 transition-colors shadow-sm"
|
||||||
className="bg-blue-600 text-white px-3 py-1.5 text-sm rounded-lg hover:bg-blue-700 flex items-center gap-2 transition-colors shadow-sm"
|
>
|
||||||
|
<FaPlus className="w-4 h-4" />
|
||||||
|
Yeni Günlük Rapor
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Stats */}
|
||||||
|
<div className="grid grid-cols-4 gap-2">
|
||||||
|
<Widget title="Bugün Toplam" value={`${todayTotalHours}h`} color="blue" icon="FaClock" />
|
||||||
|
|
||||||
|
<Widget
|
||||||
|
title="Onaylanan"
|
||||||
|
value={
|
||||||
|
filteredUpdates.filter((update) => update.status === DailyUpdateStatusEnum.Approved)
|
||||||
|
.length
|
||||||
|
}
|
||||||
|
color="green"
|
||||||
|
icon="FaCheckCircle"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Widget
|
||||||
|
title="Beklemede"
|
||||||
|
value={
|
||||||
|
filteredUpdates.filter((update) => update.status === DailyUpdateStatusEnum.Submitted)
|
||||||
|
.length
|
||||||
|
}
|
||||||
|
color="yellow"
|
||||||
|
icon="FaHourglassHalf"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Widget
|
||||||
|
title="Taslak Rapor"
|
||||||
|
value={
|
||||||
|
filteredUpdates.filter((update) => update.status === DailyUpdateStatusEnum.Draft)
|
||||||
|
.length
|
||||||
|
}
|
||||||
|
color="gray"
|
||||||
|
icon="FaFileAlt"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Filters */}
|
||||||
|
<div className="bg-white grid grid-cols-6 gap-2 p-2 rounded-lg shadow-sm border border-gray-200 mt-3 mb-3">
|
||||||
|
<div className="col-span-2">
|
||||||
|
<select
|
||||||
|
value={selectedEmployee}
|
||||||
|
onChange={(e) => setSelectedEmployee(e.target.value)}
|
||||||
|
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
||||||
>
|
>
|
||||||
<FaPlus className="w-4 h-4" />
|
{mockEmployees.map((employee) => (
|
||||||
Yeni Günlük Rapor
|
<option key={employee.id} value={employee.id}>
|
||||||
</button>
|
{employee.firstName} {employee.lastName}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="col-span-3">
|
||||||
{/* Stats */}
|
<input
|
||||||
<div className="grid grid-cols-4 gap-2">
|
type="text"
|
||||||
<Widget
|
placeholder="Açıklama, görev veya çalışan adı..."
|
||||||
title="Bugün Toplam"
|
value={searchQuery}
|
||||||
value={`${todayTotalHours}h`}
|
onChange={(e) => setSearchQuery(e.target.value)}
|
||||||
color="blue"
|
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
||||||
icon="FaClock"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Widget
|
|
||||||
title="Onaylanan"
|
|
||||||
value={
|
|
||||||
filteredUpdates.filter((update) => update.status === DailyUpdateStatusEnum.Approved)
|
|
||||||
.length
|
|
||||||
}
|
|
||||||
color="green"
|
|
||||||
icon="FaCheckCircle"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Widget
|
|
||||||
title="Beklemede"
|
|
||||||
value={
|
|
||||||
filteredUpdates.filter(
|
|
||||||
(update) => update.status === DailyUpdateStatusEnum.Submitted,
|
|
||||||
).length
|
|
||||||
}
|
|
||||||
color="yellow"
|
|
||||||
icon="FaHourglassHalf"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Widget
|
|
||||||
title="Taslak Rapor"
|
|
||||||
value={
|
|
||||||
filteredUpdates.filter((update) => update.status === DailyUpdateStatusEnum.Draft)
|
|
||||||
.length
|
|
||||||
}
|
|
||||||
color="gray"
|
|
||||||
icon="FaFileAlt"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="col-span-1">
|
||||||
{/* Filters */}
|
<input
|
||||||
<div className="bg-white grid grid-cols-6 gap-2 p-2 rounded-lg shadow-sm border border-gray-200 mt-3 mb-3">
|
type="date"
|
||||||
<div className="col-span-2">
|
value={selectedDate}
|
||||||
<select
|
onChange={(e) => setSelectedDate(e.target.value)}
|
||||||
value={selectedEmployee}
|
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
||||||
onChange={(e) => setSelectedEmployee(e.target.value)}
|
/>
|
||||||
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
||||||
>
|
|
||||||
{mockEmployees.map((employee) => (
|
|
||||||
<option key={employee.id} value={employee.id}>
|
|
||||||
{employee.firstName} {employee.lastName}
|
|
||||||
</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div className="col-span-3">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="Açıklama, görev veya çalışan adı..."
|
|
||||||
value={searchQuery}
|
|
||||||
onChange={(e) => setSearchQuery(e.target.value)}
|
|
||||||
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-span-1">
|
|
||||||
<input
|
|
||||||
type="date"
|
|
||||||
value={selectedDate}
|
|
||||||
onChange={(e) => setSelectedDate(e.target.value)}
|
|
||||||
className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ const TaskViewModal: React.FC<TaskViewModalProps> = ({
|
||||||
<h3 className="text-lg font-semibold text-gray-900">
|
<h3 className="text-lg font-semibold text-gray-900">
|
||||||
Proje Görevleri
|
Proje Görevleri
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{project.name} - {project.code}
|
{project.name} - {project.code}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ const Contact: React.FC = () => {
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div className="bg-white rounded-xl shadow-lg p-8">
|
<div className="bg-white rounded-xl shadow-lg p-8">
|
||||||
<h2 className="text-2xl font-bold text-gray-900 mb-6">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{translate('::Public.contact.info.title')}
|
{translate('::Public.contact.info.title')}
|
||||||
</h2>
|
</h2>
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ const Home: React.FC = () => {
|
||||||
className="p-8 bg-white rounded-xl shadow-lg hover:shadow-xl transition-shadow"
|
className="p-8 bg-white rounded-xl shadow-lg hover:shadow-xl transition-shadow"
|
||||||
>
|
>
|
||||||
<div className="mb-6">{feature.icon}</div>
|
<div className="mb-6">{feature.icon}</div>
|
||||||
<h3 className="text-xl font-semibold text-gray-900 mb-4">{feature.title}</h3>
|
<h2 className="text-2xl font-bold text-gray-900">{feature.title}</h2>
|
||||||
<p className="text-gray-600">{feature.description}</p>
|
<p className="text-gray-600">{feature.description}</p>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,8 @@ const ApprovalWorkflows: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Onay Süreçleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Onay Süreçleri</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Departman bazlı satınalma onay süreçlerini yönetin
|
Departman bazlı satınalma onay süreçlerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -164,8 +164,8 @@ const DeliveryTracking: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Teslimat Takibi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Teslimat Takibi</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Sipariş teslimatlarını takip edin ve yönetin
|
Sipariş teslimatlarını takip edin ve yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -66,10 +66,10 @@ const MaterialCard: React.FC = () => {
|
||||||
<FaBox className="w-6 h-6 text-blue-600" />
|
<FaBox className="w-6 h-6 text-blue-600" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{material.code}
|
{material.code}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">{material.name}</p>
|
<p className="text-gray-600">{material.name}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-1.5">
|
<div className="flex items-center space-x-1.5">
|
||||||
|
|
|
||||||
|
|
@ -337,10 +337,10 @@ const MaterialForm: React.FC = () => {
|
||||||
<div className="bg-white rounded-lg shadow-sm border border-gray-200 p-2.5">
|
<div className="bg-white rounded-lg shadow-sm border border-gray-200 p-2.5">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{isEdit ? "Malzeme Düzenle" : "Yeni Malzeme Ekle"}
|
{isEdit ? "Malzeme Düzenle" : "Yeni Malzeme Ekle"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{isEdit
|
{isEdit
|
||||||
? "Mevcut malzeme bilgilerini güncelleyin"
|
? "Mevcut malzeme bilgilerini güncelleyin"
|
||||||
: "Yeni malzeme kartı oluşturun"}
|
: "Yeni malzeme kartı oluşturun"}
|
||||||
|
|
|
||||||
|
|
@ -103,8 +103,8 @@ const MaterialGroups: React.FC = () => {
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
||||||
{/* Title & Description */}
|
{/* Title & Description */}
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Malzeme Grupları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Malzeme Grupları</h2>
|
||||||
<p className="text-sm text-gray-600">Malzeme gruplarını yönetin</p>
|
<p className="text-gray-600">Malzeme gruplarını yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Header Actions */}
|
{/* Header Actions */}
|
||||||
|
|
|
||||||
|
|
@ -365,8 +365,8 @@ const MaterialList: React.FC = () => {
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
||||||
{/* Title & Description */}
|
{/* Title & Description */}
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Malzeme Listesi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Malzeme Listesi</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Toplam {totalCount} malzeme bulundu
|
Toplam {totalCount} malzeme bulundu
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -72,8 +72,8 @@ const MaterialTypes: React.FC = () => {
|
||||||
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
||||||
{/* Title & Description */}
|
{/* Title & Description */}
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Malzeme Türleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Malzeme Türleri</h2>
|
||||||
<p className="text-sm text-gray-600">Malzeme türlerini yönetin</p>
|
<p className="text-gray-600">Malzeme türlerini yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Header Actions */}
|
{/* Header Actions */}
|
||||||
|
|
|
||||||
|
|
@ -147,10 +147,10 @@ const OrderManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Satınalma Siparişleri
|
Satınalma Siparişleri
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Satınalma siparişlerini oluşturun ve takip edin
|
Satınalma siparişlerini oluşturun ve takip edin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -209,7 +209,7 @@ const OrderManagementForm: React.FC = () => {
|
||||||
>
|
>
|
||||||
<FaArrowLeft />
|
<FaArrowLeft />
|
||||||
</button>
|
</button>
|
||||||
<h1 className="text-xl font-bold text-gray-900">{pageTitle}</h1>
|
<h2 className="text-2xl font-bold text-gray-900">{pageTitle}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-2">
|
<div className="flex space-x-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,7 @@ const PurchaseRequestForm: React.FC = () => {
|
||||||
>
|
>
|
||||||
<FaArrowLeft />
|
<FaArrowLeft />
|
||||||
</button>
|
</button>
|
||||||
<h1 className="text-xl font-bold text-gray-900">{pageTitle}</h1>
|
<h2 className="text-2xl font-bold text-gray-900">{pageTitle}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-2">
|
<div className="flex space-x-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,8 @@ const PurchaseRequests: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Satınalma Talepleri</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Satınalma Talepleri</h2>
|
||||||
<p className="text-sm text-gray-600">Malzeme, hizmet ve iş merkezi taleplerini yönetin</p>
|
<p className="text-gray-600">Malzeme, hizmet ve iş merkezi taleplerini yönetin</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={handleAddNew}
|
onClick={handleAddNew}
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ const QuotationForm: React.FC = () => {
|
||||||
>
|
>
|
||||||
<FaArrowLeft />
|
<FaArrowLeft />
|
||||||
</button>
|
</button>
|
||||||
<h1 className="text-xl font-bold text-gray-900">{pageTitle}</h1>
|
<h2 className="text-2xl font-bold text-gray-900">{pageTitle}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-2">
|
<div className="flex space-x-2">
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -120,8 +120,8 @@ const QuotationManagement: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Teklif Yönetimi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Teklif Yönetimi</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Tedarikçi tekliflerini yönetin ve karşılaştırın
|
Tedarikçi tekliflerini yönetin ve karşılaştırın
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -96,8 +96,8 @@ const SupplierCards: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Tedarikçiler</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Tedarikçiler</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Tedarikçi kredi limitleri, özel şartlar ve performans metriklerini
|
Tedarikçi kredi limitleri, özel şartlar ve performans metriklerini
|
||||||
yönetin
|
yönetin
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,8 @@ const InventoryTracking: React.FC = () => {
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Envanter Takibi</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Envanter Takibi</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Lot ve seri numarası takiplerini yönetin
|
Lot ve seri numarası takiplerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -477,10 +477,10 @@ const LocationTracking: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Raf/Lokasyon Bazlı Takip
|
Raf/Lokasyon Bazlı Takip
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Lokasyonlardaki stok durumunu takip edin
|
Lokasyonlardaki stok durumunu takip edin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -111,14 +111,14 @@ const LotForm: React.FC<LotFormProps> = ({
|
||||||
<form onSubmit={formik.handleSubmit} className="space-y-2 p-3">
|
<form onSubmit={formik.handleSubmit} className="space-y-2 p-3">
|
||||||
<div className="flex items-center justify-between p-2 border-b">
|
<div className="flex items-center justify-between p-2 border-b">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{mode === "create"
|
{mode === "create"
|
||||||
? "Yeni Lot Kaydı"
|
? "Yeni Lot Kaydı"
|
||||||
: mode === "edit"
|
: mode === "edit"
|
||||||
? "Lot Düzenle"
|
? "Lot Düzenle"
|
||||||
: "Lot Detayı"}
|
: "Lot Detayı"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{mode === "create"
|
{mode === "create"
|
||||||
? "Lot bilgilerini girin"
|
? "Lot bilgilerini girin"
|
||||||
: mode === "edit"
|
: mode === "edit"
|
||||||
|
|
|
||||||
|
|
@ -73,10 +73,10 @@ const MaterialMovements: React.FC<{ materialId?: string }> = ({
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
{materialId ? "Stok Hareketleri" : "Tüm Stok Hareketleri"}
|
{materialId ? "Stok Hareketleri" : "Tüm Stok Hareketleri"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
{materialId
|
{materialId
|
||||||
? `${materialId} kodlu malzeme için`
|
? `${materialId} kodlu malzeme için`
|
||||||
: "Tüm malzemeler için"}{" "}
|
: "Tüm malzemeler için"}{" "}
|
||||||
|
|
|
||||||
|
|
@ -318,10 +318,10 @@ const PutawayRules: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Yerleştirme Kuralları
|
Yerleştirme Kuralları
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Malzeme yerleştirme kurallarını tanımlayın ve yönetin
|
Malzeme yerleştirme kurallarını tanımlayın ve yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -2632,10 +2632,10 @@ const StockLevelsInventory: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">
|
<h2 className="text-2xl font-bold text-gray-900">
|
||||||
Stok Durumu & Stok Sayımı
|
Stok Durumu & Stok Sayımı
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Stok seviyelerini izleyin ve envanter sayımlarını yönetin
|
Stok seviyelerini izleyin ve envanter sayımlarını yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ const WarehouseDefinitions: React.FC = () => {
|
||||||
<h3 className="font-medium text-sm text-gray-900">
|
<h3 className="font-medium text-sm text-gray-900">
|
||||||
{warehouse.name}
|
{warehouse.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">{warehouse.code}</p>
|
<p className="text-gray-600">{warehouse.code}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{warehouse.isMainWarehouse && (
|
{warehouse.isMainWarehouse && (
|
||||||
|
|
@ -543,7 +543,7 @@ const WarehouseDefinitions: React.FC = () => {
|
||||||
<h3 className="font-medium text-sm text-gray-900">
|
<h3 className="font-medium text-sm text-gray-900">
|
||||||
{zone.name}
|
{zone.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600">{zone.zoneCode}</p>
|
<p className="text-gray-600">{zone.zoneCode}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span className="inline-flex px-2 py-1 text-xs font-medium rounded-full bg-blue-100 text-blue-800">
|
<span className="inline-flex px-2 py-1 text-xs font-medium rounded-full bg-blue-100 text-blue-800">
|
||||||
|
|
@ -1104,8 +1104,8 @@ const WarehouseDefinitions: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-lg font-bold text-gray-900">Depo Tanımları</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Depo Tanımları</h2>
|
||||||
<p className="text-sm text-gray-600">
|
<p className="text-gray-600">
|
||||||
Depolar, bölgeler ve lokasyonları yönetin
|
Depolar, bölgeler ve lokasyonları yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1028,8 +1028,8 @@ const WarehouseIssue: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Stok Çıkış</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Stok Çıkış</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Depodan malzeme çıkış hareketlerini yönetin
|
Depodan malzeme çıkış hareketlerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -492,8 +492,8 @@ const WarehouseReceipt: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Stok Giriş</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Stok Giriş</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Depoya malzeme giriş hareketlerini yönetin
|
Depoya malzeme giriş hareketlerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -547,8 +547,8 @@ const WarehouseTransfer: React.FC = () => {
|
||||||
<div className="space-y-4 pt-2">
|
<div className="space-y-4 pt-2">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-xl font-bold text-gray-900">Stok Transfer</h2>
|
<h2 className="text-2xl font-bold text-gray-900">Stok Transfer</h2>
|
||||||
<p className="text-sm text-gray-600 mt-1">
|
<p className="text-gray-600">
|
||||||
Depolar arası malzeme transfer hareketlerini yönetin
|
Depolar arası malzeme transfer hareketlerini yönetin
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue