Kaynağa Gözat

Condicionante

OscarGil03 11 ay önce
ebeveyn
işleme
c77458630e

+ 1 - 1
src/views/catalogos/finMovilizaciones/FinMovilizacionDetalle.jsx

@@ -121,7 +121,7 @@ const FinMovilizacionDetalleDetalle = () => {
               commonRules.requerido,
             ]}
           >
-            <Input onKeyPress={handleKeyPress} maxLength={10}/>
+            <Input onKeyPress={handleKeyPress} maxLength={9}/>
           </Form.Item>
         </Col>
         <Col span={24}>

+ 1 - 1
src/views/catalogos/productos/ProductoDetalle.jsx

@@ -151,7 +151,7 @@ const ProductoDetalle = () => {
               commonRules.requerido,
             ]}
           >
-            <Input onKeyPress={handleKeyPress} maxLength={10}/>
+            <Input onKeyPress={handleKeyPress} maxLength={9}/>
           </Form.Item>
         </Col>
         <Col span={24}>

+ 1 - 1
src/views/catalogos/tipoMovilizaciones/TipoMovilizacionDetalle.jsx

@@ -121,7 +121,7 @@ const TipoMovilizacionDetalleDetalle = () => {
               commonRules.requerido,
             ]}
           >
-            <Input onKeyPress={handleKeyPress} maxLength={10}/>
+            <Input onKeyPress={handleKeyPress} maxLength={9}/>
           </Form.Item>
         </Col>
         <Col span={24}>

+ 300 - 236
src/views/condicionantes/CondicionanteDetalle.jsx

@@ -1,21 +1,26 @@
-import { Form, Input, Button, Spin, Row, Col, Switch, Select as AntdSelect, Checkbox } from 'antd'
-import { useEffect, useMemo, useState } from 'react'
-import HttpService from '../../services/httpService'
-import { respuestas } from '../../utilities'
-import { useNavigate } from 'react-router-dom'
-import { useQuery, useModel } from '../../hooks'
-import { commonRules } from '../../constants/rules'
-import { Select } from '../../components'
+import { Form, Input, Button, Spin, Row, Col, Switch, Select as AntdSelect, Checkbox, notification, Typography, Modal, Divider } from 'antd';
+import { useEffect, useMemo, useState } from 'react';
+import HttpService from '../../services/httpService';
+import { respuestas } from '../../utilities';
+import { useNavigate } from 'react-router-dom';
+import { useQuery, useModel } from '../../hooks';
+import { Select } from '../../components';
+import { DefaultLayout } from '../../components/layouts';
+
+const { Text } = Typography;
 
 const selectores = {
   productos: {
     name: "producto",
     expand: "subproductos",
   },
-}
+};
 
 const endpoints = {
   condicionante: "condicionante",
+  fines: "fin-movilizacion",
+  tipos: "tipo-movilizacion",
+  estados: "estado",
 };
 
 const amplitudes = [
@@ -27,89 +32,95 @@ const amplitudes = [
     value: "Familia (Varios)",
     label: "Familia (Varios)",
   },
-]
+];
 
-const fines = [
-  {
-    value: "Consumo Humano",
-    label: "Consumo Humano",
-  },
-  {
-    value: "Polinización",
-    label: "Polinización",
-  }
-]
-
-const tipos = [
-  {
-    value: "Introducción",
-    label: "Introducción",
-  },
-  {
-    value: "Expotación",
-    label: "Expotación",
-  },
-  {
-    value: "Tránsito",
-    label: "Tránsito",
-  },
-  {
-    value: "Movilización (Salida)",
-    label: "Movilización (Salida)",
-  },
-  {
-    value: "Importación",
-    label: "Importación",
-  }
-]
-
-const ProductoDetalle = () => {
-  const [form] = Form.useForm()
-  const navigate = useNavigate()
-  const [loading, setLoading] = useState(false)
-  const query = useQuery()
-  const id = query.get("id")
-  const [request, setRequest] = useState({})
-  const [activa, setActiva] = useState(false)
-  const [subproductos, setSubproductos] = useState([])
-
-  // const extraParams = useMemo(() => ({
-  //   idAgenda: id,
-  // }), [id])
+const CondicionanteDetalle = () => {
+  const [form] = Form.useForm();
+  const navigate = useNavigate();
+  const [loading, setLoading] = useState(false);
+  const query = useQuery();
+  const id = query.get("id");
+  const [request, setRequest] = useState({});
+  const [activa, setActiva] = useState(false);
+  const [subproductos, setSubproductos] = useState([]);
+  const [fines, setFines] = useState([]);
+  const [tipos, setTipos] = useState([]);
+  const [estados, setEstados] = useState([]);
+  const [selectedFines, setSelectedFines] = useState([]);
+  const [selectedTipos, setSelectedTipos] = useState([]);
+  const [selectedOrigenes, setSelectedOrigenes] = useState([]);
+  const [selectedDestinos, setSelectedDestinos] = useState([]);
+  const [isModalVisible, setIsModalVisible] = useState(false);
 
   const requestParams = useMemo(() => ({
     name: endpoints.condicionante,
-    // expand: 'subproductos',
     id,
-    // extraParams
-  }), [id])
-
+  }), [id]);
 
-  const { model, modelLoading } = useModel(request)
+  const { model, modelLoading } = useModel(request);
 
   useEffect(() => {
     if (id) {
-      setRequest(requestParams)
+      setRequest({ ...requestParams, expand: 'condicionanteFin,condicionanteTipo,condicionanteOrigen,condicionanteDestino' });
     }
     return () => {
-      setRequest({})
-    }
-  }, [id, requestParams])
+      setRequest({});
+    };
+  }, [id, requestParams]);
 
   useEffect(() => {
     if (model) {
-      form.setFieldsValue({ //seteo cuando son varios
-        ...model,
-        subproductos: model.subproductos.map((subproducto, index) => ({
-          ...subproducto,
-          key: index
-        }))
-      })
-      if (model?.activa) {
-        setActiva(true)
+      let parsedSubproductos = [];
+      try {
+        parsedSubproductos = JSON.parse(model.subproductos);
+      } catch (e) {
+        console.error("Error parsing subproductos:", e);
       }
+
+      form.setFieldsValue({
+        ...model,
+        subproductos: parsedSubproductos,
+        fines: model.condicionanteFin.map(fin => fin.idFin),
+        tipos: model.condicionanteTipo.map(tipo => tipo.idTipo),
+        origenes: model.condicionanteOrigen.map(origen => origen.idOrigen),
+        destinos: model.condicionanteDestino.map(destino => destino.idDestino),
+      });
+      setActiva(model?.activa ?? false);
+      setSubproductos(parsedSubproductos ?? []);
+      setSelectedFines(model.condicionanteFin.map(fin => fin.idFin));
+      setSelectedTipos(model.condicionanteTipo.map(tipo => tipo.idTipo));
+      setSelectedOrigenes(model.condicionanteOrigen.map(origen => origen.idOrigen));
+      setSelectedDestinos(model.condicionanteDestino.map(destino => destino.idDestino));
     }
-  }, [form, model])
+  }, [form, model]);
+
+  useEffect(() => {
+    const fetchCatalogData = async () => {
+      try {
+        const finesResponse = await HttpService.get(`${endpoints.fines}`);
+        const tiposResponse = await HttpService.get(`${endpoints.tipos}`);
+        const estadosResponse = await HttpService.get(`${endpoints.estados}`);
+
+        if (finesResponse?.status === 200) {
+          setFines(finesResponse?.resultado || []);
+        }
+        if (tiposResponse?.status === 200) {
+          setTipos(tiposResponse?.resultado || []);
+        }
+        if (estadosResponse?.status === 200) {
+          setEstados(estadosResponse?.resultado || []);
+        }
+      } catch (error) {
+        console.error(error);
+        notification.error({
+          message: "Error",
+          description: "No se pudieron cargar los datos del catálogo.",
+        });
+      }
+    };
+
+    fetchCatalogData();
+  }, []);
 
   const onFinish = async (values) => {
     try {
@@ -117,16 +128,19 @@ const ProductoDetalle = () => {
 
       let body = {
         ...values,
+        origenes: selectedOrigenes,
+        destinos: selectedDestinos,
+        subproductos: JSON.stringify(values.subproductos),
       };
 
       if (id) {
-        body.id = id
+        body.id = id;
       }
 
-      const res = await HttpService.post(`${endpoints.producto}/guardar`, body);
+      const res = await HttpService.post(`${endpoints.condicionante}/guardar`, body);
       respuestas(res);
       if (res?.status === 200) {
-        navigate('/condicionantes')
+        navigate('/condicionantes');
       }
     } catch (error) {
       console.log(error);
@@ -134,169 +148,219 @@ const ProductoDetalle = () => {
     } finally {
       setLoading(false);
     }
-  }
+  };
+
+  const showModal = () => {
+    setIsModalVisible(true);
+  };
+
+  const handleOk = () => {
+    setIsModalVisible(false);
+  };
+
+  const handleCancel = () => {
+    setIsModalVisible(false);
+  };
 
   if (modelLoading) {
-    return <Spin
-      size="large"
-      style={{ display: "block", margin: "auto", marginTop: "50px" }}
-    />
+    return <Spin size="large" style={{ display: "block", margin: "auto", marginTop: "50px" }} />;
   }
 
   return (
-    <Form
-      layout="vertical"
-      name="basic"
-      form={form}
-      onFinish={onFinish}
-      onFinishFailed={() => { }}
-    >
-      <Row gutter={16}>
-        <Col span={24}>
-          <h2>Información del Condicionante</h2>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Título"
-            name="titulo"
-            rules={[
-              commonRules.requerido,
-            ]}
-          >
-            <Input />
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Descripción"
-            name="descripcion"
-            rules={[
-              commonRules.requerido,
-            ]}
-          >
-            <Input.TextArea rows={3} />
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Activa"
-            name="activa"
-          >
-            <Switch
-              checkedChildren="Si"
-              unCheckedChildren="No"
-              style={{ backgroundColor: activa ? "#52c41a" : "#f5222d" }}
-              checked={activa}
-              onChange={(checked) => setActiva(checked)}
-            />
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Amplitud"
-            name="amplitud"
-            rules={[
-              commonRules.requerido,
-            ]}
-          >
-            <AntdSelect
-              showSearch
-              placeholder="Seleccione una amplitud"
-              optionFilterProp="children"
-              filterOption={(input, option) =>
-                option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
-              }
+    <DefaultLayout>
+      <Form layout="vertical" name="basic" form={form} onFinish={onFinish} onFinishFailed={() => { }}>
+        <Row gutter={16}>
+          <Col span={24}>
+            <h2>Información del Condicionante</h2>
+          </Col>
+          <Col md={8} xs={24}>
+            <Form.Item
+              label={<Text strong>Título</Text>}
+              name="titulo"
+              rules={[
+                { required: true, message: 'El título es obligatorio.' }
+              ]}
+            >
+              <Input />
+            </Form.Item>
+          </Col>
+          <Col md={8} xs={24}>
+            <Form.Item
+              label={<Text strong>Amplitud</Text>}
+              name="amplitud"
+              rules={[
+                { required: true, message: 'La amplitud es obligatoria.' }
+              ]}
+            >
+              <AntdSelect
+                showSearch
+                placeholder="Seleccione una amplitud"
+                optionFilterProp="children"
+                filterOption={(input, option) =>
+                  option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                }
+              >
+                {amplitudes.map((amplitud) => (
+                  <AntdSelect.Option key={amplitud.value} value={amplitud.value}>
+                    {amplitud.label}
+                  </AntdSelect.Option>
+                ))}
+              </AntdSelect>
+            </Form.Item>
+          </Col>
+          <Col md={8} xs={24}>
+            <Form.Item
+              label={<Text strong>Activa</Text>}
+              name="activa"
+            >
+              <Switch
+                checkedChildren="Si"
+                unCheckedChildren="No"
+                style={{ backgroundColor: activa ? "#52c41a" : "#f5222d" }}
+                checked={activa}
+                onChange={(checked) => setActiva(checked)}
+              />
+            </Form.Item>
+          </Col>
+          <Divider style={{margin: '8px 0', borderColor: 'transparent'}}/>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Fines de Movilización</Text>}
+              name="fines"
+              rules={[
+                { required: true, message: 'Seleccione al menos un fin de movilización.' }
+              ]}
+            >
+              <Checkbox.Group value={selectedFines} onChange={setSelectedFines} style={{ width: '100%' }}>
+                <Row>
+                  {fines.map((fin) => (
+                    <Col span={24} key={fin.id}>
+                      <Checkbox value={fin.id}>{fin.nombre}</Checkbox>
+                    </Col>
+                  ))}
+                </Row>
+              </Checkbox.Group>
+            </Form.Item>
+          </Col>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Tipo de Movilización</Text>}
+              name="tipos"
+              rules={[
+                { required: true, message: 'Seleccione al menos un tipo de movilización.' }
+              ]}
+            >
+              <Checkbox.Group value={selectedTipos} onChange={setSelectedTipos} style={{ width: '100%' }}>
+                <Row>
+                  {tipos.map((tipo) => (
+                    <Col span={24} key={tipo.id}>
+                      <Checkbox value={tipo.id}>{tipo.nombre}</Checkbox>
+                    </Col>
+                  ))}
+                </Row>
+              </Checkbox.Group>
+            </Form.Item>
+          </Col>
+          <Divider style={{margin: '8px 0', borderColor: 'transparent'}}/>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Especies</Text>}
+              name="idProducto"
+              rules={[{ required: true, message: 'La especie es obligatoria.' }]}
+            >
+              <Select
+                modelsParams={selectores.productos}
+                labelProp="nombre"
+                valueProp="id"
+                append={[model?.producto]}
+                extraParams={{ padre: true }}
+                onChange={(_, item) => {
+                  setSubproductos(item?.subproductos || []);
+                }}
+              />
+            </Form.Item>
+          </Col>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Subproductos</Text>}
+              name="subproductos"
+            >
+              <Checkbox.Group value={subproductos.map(sp => sp.id)} onChange={setSubproductos} style={{ width: '100%' }}>
+                <Row>
+                  {subproductos.map((subproducto) => (
+                    <Col span={24} key={subproducto.id}>
+                      <Checkbox value={subproducto.id}>{subproducto.nombre}</Checkbox>
+                    </Col>
+                  ))}
+                </Row>
+              </Checkbox.Group>
+            </Form.Item>
+          </Col>
+          <Divider style={{margin: '8px 0', borderColor: 'transparent'}}/>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Descripción</Text>}
+              name="descripcion"
+              rules={[
+                { required: true, message: 'La descripción es obligatoria.' }
+              ]}
             >
-              {amplitudes.map((amplitud) => (
-                <AntdSelect.Option key={amplitud.value} value={amplitud.value}>
-                  {amplitud.label}
-                </AntdSelect.Option>
-              ))}
-            </AntdSelect>
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Fines de Movilización"
-            name="fines"
-            rules={[
-              commonRules.requerido,
-            ]}
-          >
-            <Checkbox.Group>
-              {fines.map((fin) => (
-                <Checkbox key={fin.value} value={fin.value}>
-                  {fin.label}
-                </Checkbox>
-              ))}
-            </Checkbox.Group>
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Tipo de Movilización"
-            name="tipos"
-            rules={[
-              commonRules.requerido,
-            ]}
-          >
-            <Checkbox.Group>
-              {tipos.map((tipo) => (
-                <Checkbox key={tipo.value} value={tipo.value}>
-                  {tipo.label}
-                </Checkbox>
-              ))}
-            </Checkbox.Group>
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Especies"
-            name="idProducto"
-            rules={[commonRules.requerido]}
-          >
-            <Select
-              modelsParams={selectores.productos}
-              labelProp="nombre"
-              valueProp="idProducto"
-              append={[model?.producto]}
-              extraParams={{ padre: true }}
-              onChange={(_, item) => {
-                setSubproductos(item?.subproductos)
-                console.log(item)
-              }}
-            />
-          </Form.Item>
-        </Col>
-        <Col md={8} xs={24}>
-          <Form.Item
-            label="Subproductos"
-            name="subproductos"
-          >
-            <Checkbox.Group>
-              {subproductos.map((subproducto) => (
-                <Checkbox key={subproducto?.id} value={subproducto?.id}>
-                  {subproducto?.nombre}
-                </Checkbox>
-              ))}
-            </Checkbox.Group>
-          </Form.Item>
-        </Col>
-        <Col span={24}>
-          <Form.Item>
-            <Button
-              type="primary"
-              htmlType="submit"
-              style={{ marginTop: "30px" }}
-              loading={loading}
+              <Input.TextArea rows={3} />
+            </Form.Item>
+          </Col>
+          <Col md={12} xs={24}>
+            <Form.Item
+              label={<Text strong>Orígenes y Destinos</Text>}
             >
-              Guardar
-            </Button>
-          </Form.Item>
-        </Col>
-      </Row>
-    </Form>
-  )
+              <Button type="primary" onClick={showModal}>
+                Seleccionar Orígenes y Destinos
+              </Button>
+              <Modal title="Orígenes y Destinos" visible={isModalVisible} onOk={handleOk} onCancel={handleCancel}>
+                <Row>
+                  <Col span={12}>
+                    <h3>Origen</h3>
+                    <Checkbox.Group value={selectedOrigenes} onChange={setSelectedOrigenes}>
+                      <Row>
+                        {estados.map((estado) => (
+                          <Col span={24} key={estado.id}>
+                            <Checkbox value={estado.id}>{estado.nombre}</Checkbox>
+                          </Col>
+                        ))}
+                      </Row>
+                    </Checkbox.Group>
+                  </Col>
+                  <Col span={12}>
+                    <h3>Destino</h3>
+                    <Checkbox.Group value={selectedDestinos} onChange={setSelectedDestinos}>
+                      <Row>
+                        {estados.map((estado) => (
+                          <Col span={24} key={estado.id}>
+                            <Checkbox value={estado.id}>{estado.nombre}</Checkbox>
+                          </Col>
+                        ))}
+                      </Row>
+                    </Checkbox.Group>
+                  </Col>
+                </Row>
+              </Modal>
+            </Form.Item>
+          </Col>
+          <Col span={24}>
+            <Form.Item>
+              <Button
+                type="primary"
+                htmlType="submit"
+                style={{ marginTop: "30px" }}
+                loading={loading}
+              >
+                Guardar
+              </Button>
+            </Form.Item>
+          </Col>
+        </Row>
+      </Form>
+    </DefaultLayout>
+  );
 }
 
-export default ProductoDetalle
+export default CondicionanteDetalle;