import { useAlert } from '@/components/AlertComponent'; import { AppDatePicker } from '@/components/AppDatePicker'; import GenericDropdown from '@/components/GenericDropdown'; import FileAttachmentCard from '@/components/FileAttachmentCard'; import api from '@/utils/api'; import { formatDate, formatPickerDate } from '@/utils/dateTime'; import { DateType } from 'react-native-ui-datepicker'; import { useRouter } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { Calendar, CheckSquare, ChevronLeft, Square } from 'lucide-react-native'; import React, { useEffect, useState } from 'react'; import { ActivityIndicator, KeyboardAvoidingView, Modal, Platform, ScrollView, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import * as DocumentPicker from 'expo-document-picker'; export default function AddQualityControlScreen() { const router = useRouter(); const alert = useAlert(); const [isSubmitting, setIsSubmitting] = useState(false); const [showDatePicker, setShowDatePicker] = useState(false); // Form fields const [date, setDate] = useState(new Date()); const [subactivityId, setSubactivityId] = useState(null); const [workType, setWorkType] = useState(null); const [refDoc, setRefDoc] = useState(null); const [controlType, setControlType] = useState(''); const [instrument, setInstrument] = useState(null); const [result, setResult] = useState(null); // Attachments const [attachments, setAttachments] = useState([]); // Checkboxes const [checkSegnaletica, setCheckSegnaletica] = useState(false); const [checkSoggettiTerzi, setCheckSoggettiTerzi] = useState(false); const [checkUtilizzoDPI, setCheckUtilizzoDPI] = useState(false); const [checkControlloVisivo, setCheckControlloVisivo] = useState(false); const [checkControlloDim, setCheckControlloDim] = useState(false); const [checkConformita, setCheckConformita] = useState(false); const [checkControlloFunz, setCheckControlloFunz] = useState(false); // Lists const [subactivities, setSubactivities] = useState<{id: number | string, label: string}[]>([]); const [workTypeList, setWorkTypeList] = useState<{id: number, label: string}[]>([]); const [refDocList, setRefDocList] = useState<{id: number, label: string}[]>([]); const [instrumentList, setInstrumentList] = useState<{id: number, label: string}[]>([]); const results = [ { id: 1, label: 'Positivo' }, { id: 0, label: 'Negativo' }, ]; useEffect(() => { loadData(); }, []); const loadData = async () => { try { // Load Subactivities const subRes = await api.get('/subactivity/get-subactivities'); if (subRes.data?.success) { const mappedSubs = subRes.data.subactivities.map((s: any) => ({ id: s.id, uuid: s.uuid, label: s.label })); setSubactivities(mappedSubs); } // Load Related Tables const relRes = await api.get('/quality-control/get-related-tables'); if (relRes.data?.success) { setWorkTypeList(relRes.data.data.workType || []); setRefDocList(relRes.data.data.refDocument || []); setInstrumentList(relRes.data.data.instrument || []); } } catch (error) { console.error('Errore nel caricamento dei dati iniziali:', error); alert.showAlert('error', 'Errore', 'Impossibile caricare i dati per il form.'); } }; const pickDocument = async () => { try { const result = await DocumentPicker.getDocumentAsync({ multiple: true, copyToCacheDirectory: true, }); if (!result.canceled && result.assets) { setAttachments(prev => [...prev, ...result.assets]); } } catch (error) { console.error('Errore durante la selezione del documento:', error); alert.showAlert('error', 'Errore', 'Impossibile selezionare il documento.'); } }; const removeAttachment = (index: number) => { setAttachments(prev => prev.filter((_, i) => i !== index)); }; const handleSave = async () => { if (!subactivityId || !date || result === null) { alert.showAlert('warning', 'Dati Mancanti', 'Compila tutti i campi obbligatori (Cantiere, Data, Esito).'); return; } setIsSubmitting(true); try { const formattedDate = formatPickerDate(date); const selectedSub = subactivities.find(s => s.id === subactivityId) as any; const payload = { subactivity_uuid: selectedSub?.uuid, id_subactivity: subactivityId, subactivity_id: subactivityId, // just in case id_work_type: workType, date: formattedDate, id_ref_document: refDoc, control_type: controlType, id_instrument: instrument, result: result, check_segnaletica: checkSegnaletica ? 1 : 0, check_soggetti_terzi: checkSoggettiTerzi ? 1 : 0, check_utilizzo_dpi: checkUtilizzoDPI ? 1 : 0, check_controllo_visivo: checkControlloVisivo ? 1 : 0, check_controllo_dim: checkControlloDim ? 1 : 0, check_conformita: checkConformita ? 1 : 0, check_controllo_funz: checkControlloFunz ? 1 : 0, }; const response = await api.post('/quality-control/add', { post: JSON.stringify(payload) }); if (response.data?.success) { const qcId = response.data.id; // Upload attachments if present if (attachments.length > 0) { for (let i = 0; i < attachments.length; i++) { const file = attachments[i]; const formData = new FormData(); const fileName = file.name || `document_${i}`; const fileType = file.mimeType || 'application/octet-stream'; const fileUri = Platform.OS === 'android' ? file.uri : file.uri.replace('file://', ''); formData.append("files", { name: fileName, type: fileType, uri: fileUri } as any); formData.append('model_classname', 'QualityControl'); formData.append('model_id', qcId); formData.append('method', 'put'); formData.append('name', fileName); formData.append('type', fileType); await api.post('/quality-control/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); } } alert.showAlert('success', 'Salvato', 'Controllo di Qualità salvato con successo.'); router.back(); } else { alert.showAlert('error', 'Errore', response.data?.message || 'Salvataggio non riuscito.'); } } catch (error) { console.error('Errore durante il salvataggio:', error); alert.showAlert('error', 'Errore', 'Impossibile completare il salvataggio.'); } finally { setIsSubmitting(false); } }; const CheckboxRow = ({ label, value, onChange }: { label: string, value: boolean, onChange: (v: boolean) => void }) => ( onChange(!value)} className="flex-row items-center bg-white border border-gray-100 rounded-xl px-4 py-4 mb-3 active:bg-gray-50 shadow-sm" > {value ? : } {label} ); return ( {/* Header */} router.back()} className="p-2 -ml-2 rounded-full active:bg-gray-100"> Nuovo Controllo {/* Date */} Data * setShowDatePicker(true)} className="flex-row items-center bg-white border border-gray-200 rounded-2xl px-5 py-4 mb-6 active:bg-gray-50 shadow-sm" > {date ? formatDate(formatPickerDate(date)) : 'Seleziona data...'} {/* Subactivity / Cantiere */} Cantiere * setSubactivityId(id as number)} placeholder="Seleziona cantiere..." searchPlaceholder="Cerca cantiere..." /> {/* Work Type */} Tipologia Lavorazione {/* Reference Document */} Documento di Riferimento {/* Control Type */} Tipo di Controllo {/* Instrument */} Strumento Utilizzato {/* Checkboxes */} Checklist Controlli {/* Result */} Esito * {/* Attachments Section */} Allegati ({attachments.length}) Aggiungi {attachments.map((file, index) => ( removeAttachment(index)} /> ))} {attachments.length === 0 && ( Nessun file allegato )} {/* Save Button */} {isSubmitting ? ( ) : ( Salva )} {/* Date Picker Modal */} Seleziona Data setDate(d.date || new Date())} /> setShowDatePicker(false)} className="mt-6 w-full py-4 bg-[#1071C2] rounded-xl active:scale-[0.98]" > Conferma ); }