diff --git a/src/components/admin/ActivityTypeManager.tsx b/src/components/admin/ActivityTypeManager.tsx index 02d8f98..fddb69d 100644 --- a/src/components/admin/ActivityTypeManager.tsx +++ b/src/components/admin/ActivityTypeManager.tsx @@ -12,7 +12,14 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; -import { +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; +import { FileText, Plus, Trash2, @@ -21,12 +28,12 @@ import { AlertCircle, CheckCircle, } from 'lucide-react'; -import { - getAllActivityTypes, - createActivityType, - updateActivityType, - deleteActivityType, - ActivityType +import { + getAllActivityTypes, + createActivityType, + updateActivityType, + deleteActivityType, + ActivityType } from '@/services/adminApi'; import { toast } from 'sonner'; @@ -88,17 +95,18 @@ export function ActivityTypeManager() { const handleSave = async () => { try { setError(null); - - if (!formData.title.trim()) { - setError('Activity type title is required'); + + if (!formData.title.trim() || !formData.taxationType.trim() || !formData.sapRefNo.trim()) { + setError('Title, Taxation Type, and Claim Document Type (SAP Ref) are required'); + toast.error('Please fill in all mandatory fields'); return; } const payload: Partial = { title: formData.title.trim(), itemCode: formData.itemCode.trim() || null, - taxationType: formData.taxationType.trim() || null, - sapRefNo: formData.sapRefNo.trim() || null + taxationType: formData.taxationType.trim(), + sapRefNo: formData.sapRefNo.trim() }; if (editingActivityType) { @@ -165,9 +173,9 @@ export function ActivityTypeManager() {

{error}

- - - + {/* File Preview Modal - Matching DocumentsTab style */} { diff --git a/src/dealer-claim/components/request-detail/modals/DealerProposalSubmissionModal.tsx b/src/dealer-claim/components/request-detail/modals/DealerProposalSubmissionModal.tsx index e796bd3..e3a0095 100644 --- a/src/dealer-claim/components/request-detail/modals/DealerProposalSubmissionModal.tsx +++ b/src/dealer-claim/components/request-detail/modals/DealerProposalSubmissionModal.tsx @@ -96,6 +96,10 @@ export function DealerProposalSubmissionModal({ return getActiveTaxComponents(stateCode); }, [dealerGSTIN]); + const isNonGst = useMemo(() => { + return taxationType === 'Non GST' || taxationType === 'Non-GST'; + }, [taxationType]); + const [costItems, setCostItems] = useState([ { id: '1', @@ -260,13 +264,13 @@ export function DealerProposalSubmissionModal({ : numberOfDays !== '' && parseInt(numberOfDays) > 0; const hasValidComments = dealerComments.trim().length > 0; - const hasHSNSACErrors = costItems.some(item => { + const hasHSNSACErrors = isNonGst ? false : costItems.some(item => { const { isValid } = validateHSNSAC(item.hsnCode, item.isService); return !isValid; }); return hasProposalDoc && hasValidCostItems && hasTimeline && hasValidComments && !hasHSNSACErrors; - }, [proposalDocument, costItems, timelineMode, expectedCompletionDate, numberOfDays, dealerComments]); + }, [proposalDocument, costItems, timelineMode, expectedCompletionDate, numberOfDays, dealerComments, isNonGst]); const handleProposalDocChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; @@ -462,8 +466,8 @@ export function DealerProposalSubmissionModal({ try { setSubmitting(true); - // Validation: Alert for 0% GST on taxable items - const hasZeroGstItems = costItems.some(item => + // Validation: Alert for 0% GST on taxable items (Skip for Non-GST) + const hasZeroGstItems = !isNonGst && costItems.some(item => item.description.trim() !== '' && item.amount > 0 && (item.gstRate === 0 || !item.gstRate) ); @@ -546,15 +550,17 @@ export function DealerProposalSubmissionModal({ - - - Dealer Proposal Submission + +
+ + Dealer Proposal Submission +
+ {taxationType && ( + + {taxationType === 'GST' ? 'GST Claim' : 'Non-GST Claim'} + + )}
- {taxationType && ( - - {taxationType === 'GST' ? 'GST Claim' : 'Non-GST Claim'} - - )} Step 1: Upload proposal and planning details @@ -824,9 +830,11 @@ export function DealerProposalSubmissionModal({

Cost Breakup

Required -
- Tax fields are automatically toggled based on the dealer's state (Inter-state vs Intra-state). -
+ {!isNonGst && ( +
+ Tax fields are automatically toggled based on the dealer's state (Inter-state vs Intra-state). +
+ )}