Merge branch 'fix/transfer-to-laying' into 'development'

[FIX/FE] Transfer To Laying

See merge request mbugroup/lti-web-client!471
This commit is contained in:
Rivaldi A N S
2026-05-12 05:04:56 +00:00
3 changed files with 70 additions and 45 deletions
@@ -40,6 +40,9 @@ const TransferToLayingDetailModal = () => {
? transferToLayingResponse.data ? transferToLayingResponse.data
: undefined; : undefined;
const isTransferToLayingApproved =
transferToLaying?.approval.step_number === 2;
const { data: transferToLayingApprovalResponse } = useSWR( const { data: transferToLayingApprovalResponse } = useSWR(
transferToLayingId transferToLayingId
? ['approval-transfer-to-laying', transferToLayingId] ? ['approval-transfer-to-laying', transferToLayingId]
@@ -55,9 +58,9 @@ const TransferToLayingDetailModal = () => {
const detailModal = useModal(); const detailModal = useModal();
const totalEnteredChickenForTransfer = const maxSourceQuantity =
transferToLaying?.sources.reduce( transferToLaying?.sources.reduce(
(acc, item) => acc + Number(item.qty), (acc, item) => acc + Number(item.product_warehouse.quantity),
0 0
) ?? 0; ) ?? 0;
@@ -67,8 +70,9 @@ const TransferToLayingDetailModal = () => {
0 0
) ?? 0; ) ?? 0;
// Sisa transfer = Max available dari kandang asal - Total yang sudah diisi di kandang tujuan
const totalAvailableChickenForTransfer = const totalAvailableChickenForTransfer =
totalEnteredChickenForTransfer - totalTransferedChicken; maxSourceQuantity - totalTransferedChicken;
const closeModalHandler = (shouldPushToRoute: boolean = true) => { const closeModalHandler = (shouldPushToRoute: boolean = true) => {
if (shouldPushToRoute) { if (shouldPushToRoute) {
@@ -161,13 +165,36 @@ const TransferToLayingDetailModal = () => {
{/* Source Kandang */} {/* Source Kandang */}
<div className='flex flex-col'> <div className='flex flex-col'>
<span className='w-full py-2 text-xs font-semibold'> <span className='w-fit py-2 text-xs font-semibold flex flex-row items-center gap-3'>
<span className='text-nowrap'>
Kandang Asal{' '} Kandang Asal{' '}
<span className='tooltip tooltip-error' data-tip='required'> <span className='tooltip tooltip-error' data-tip='required'>
<span className='text-error'> *</span> <span className='text-error'> *</span>
</span> </span>
</span> </span>
{!isTransferToLayingApproved && (
<>
<div className='w-px h-5 bg-base-content/10' />
<StatusBadge
color={
totalAvailableChickenForTransfer < 0
? 'error'
: 'neutral'
}
text={`Sisa ayam: ${formatNumber(
totalAvailableChickenForTransfer,
'en-US'
)} ekor`}
className={{
badge: 'text-nowrap',
}}
/>
</>
)}
</span>
{transferToLaying?.sources.length === 0 && ( {transferToLaying?.sources.length === 0 && (
<span className='text-sm text-base-content/50 italic'> <span className='text-sm text-base-content/50 italic'>
Belum ada kandang asal yang dipilih Belum ada kandang asal yang dipilih
@@ -225,21 +252,6 @@ const TransferToLayingDetailModal = () => {
<span className='text-error'> *</span> <span className='text-error'> *</span>
</span> </span>
</span> </span>
<div className='w-px h-5 bg-base-content/10' />
<StatusBadge
color={
totalAvailableChickenForTransfer < 0 ? 'error' : 'neutral'
}
text={`Sisa transfer: ${formatNumber(
totalAvailableChickenForTransfer,
'en-US'
)} ekor`}
className={{
badge: 'text-nowrap',
}}
/>
</span> </span>
{transferToLaying?.targets.length === 0 && ( {transferToLaying?.targets.length === 0 && (
@@ -304,7 +316,7 @@ const TransferToLayingDetailModal = () => {
readOnly readOnly
errorMessage={ errorMessage={
totalAvailableChickenForTransfer < 0 totalAvailableChickenForTransfer < 0
? `Jumlah transfer melebihi ketersediaan (${formatNumber(totalEnteredChickenForTransfer, 'en-US')} ayam)` ? `Jumlah transfer melebihi ketersediaan (${formatNumber(maxSourceQuantity, 'en-US')} ayam)`
: '' : ''
} }
/> />
@@ -822,13 +822,35 @@ const TransferToLayingFormModal = () => {
{/* Source Kandang */} {/* Source Kandang */}
<div className='flex flex-col'> <div className='flex flex-col'>
<span className='w-full py-2 text-xs font-semibold'> <span className='w-fit py-2 text-xs font-semibold flex flex-row items-center gap-3'>
<span className='text-nowrap'>
Kandang Asal{' '} Kandang Asal{' '}
<span className='tooltip tooltip-error' data-tip='required'> <span
className='tooltip tooltip-error'
data-tip='required'
>
<span className='text-error'> *</span> <span className='text-error'> *</span>
</span> </span>
</span> </span>
<div className='w-px h-5 bg-base-content/10' />
<StatusBadge
color={
totalAvailableChickenForTransfer < 0
? 'error'
: 'neutral'
}
text={`Sisa ayam: ${formatNumber(
totalAvailableChickenForTransfer,
'en-US'
)} ekor`}
className={{
badge: 'text-nowrap',
}}
/>
</span>
{formik.values.flockSourceKandangs.length === 0 && ( {formik.values.flockSourceKandangs.length === 0 && (
<span className='text-sm text-base-content/50 italic'> <span className='text-sm text-base-content/50 italic'>
Belum ada kandang asal yang dipilih Belum ada kandang asal yang dipilih
@@ -906,23 +928,6 @@ const TransferToLayingFormModal = () => {
<span className='text-error'> *</span> <span className='text-error'> *</span>
</span> </span>
</span> </span>
<div className='w-px h-5 bg-base-content/10' />
<StatusBadge
color={
totalAvailableChickenForTransfer < 0
? 'error'
: 'neutral'
}
text={`Sisa transfer: ${formatNumber(
totalAvailableChickenForTransfer,
'en-US'
)} ekor`}
className={{
badge: 'text-nowrap',
}}
/>
</span> </span>
{formik.values.flockDestinationKandangs.length === 0 && ( {formik.values.flockDestinationKandangs.length === 0 && (
+9 -1
View File
@@ -1,4 +1,8 @@
import { BaseMetadata, CreatedUser } from '@/types/api/api-general'; import {
BaseApproval,
BaseMetadata,
CreatedUser,
} from '@/types/api/api-general';
import { BaseKandang } from '@/types/api/master-data/kandang'; import { BaseKandang } from '@/types/api/master-data/kandang';
import { WarehouseType } from '@/types/api/master-data/warehouse'; import { WarehouseType } from '@/types/api/master-data/warehouse';
@@ -27,6 +31,10 @@ export type BaseTransferToLaying = {
}; };
qty: number; qty: number;
product_warehouse: { product_warehouse: {
id: number;
product_id: number;
warehouse_id: number;
quantity: number;
product: { product: {
id: number; id: number;
name: string; name: string;