Skip to content

Commit df5b9aa

Browse files
[Fix] No estaban funcionando los registros de retail
1 parent a1c0594 commit df5b9aa

20 files changed

Lines changed: 845 additions & 67 deletions

src/Components/GD/RegistrarNuevo/Modals/Cesaciones/procesoCesacion.tsx

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ function withSuffix(name: string, i: number) {
3636
export const ProcessDetail: React.FC<PropsProceso> = ({detallesRows, loadingDetalles, errorDetalles, loadDetalles, titulo, selectedCesacion, onClose, loadingPasos, errorPasos, pasosById, decisiones, motivos, setMotivos, setDecisiones, handleCompleteStep, proceso,}) => {
3737
const {ColaboradoresDH, ColaboradoresEDM, ColaboradoresDenim, ColaboradoresVisual, ColaboradoresMeta, mail,}: any = useGraphServices();
3838

39-
const vm = React.useMemo(() => {
40-
return toUnifyVM(proceso as Proceso, selectedCesacion as any);
41-
}, [proceso, selectedCesacion]);
39+
const vm = toUnifyVM(proceso as Proceso, selectedCesacion as any);
40+
4241

4342
const [files, setFiles] = React.useState<Record<string, File | null>>({});
4443
const [destinatario, setDestinatario] = React.useState<string>("");
@@ -124,65 +123,78 @@ export const ProcessDetail: React.FC<PropsProceso> = ({detallesRows, loadingDeta
124123
const handleUploadAndComplete = async (detalle: DetallesPasos, paso: any) => {
125124
if (uploadingRef.current) return;
126125
uploadingRef.current = true;
126+
setUploading(true);
127127

128-
const idDetalle = detalle.Id ?? "";
129-
const file = files[idDetalle];
128+
console.log(vm)
130129

131-
if (!file) {
132-
uploadingRef.current = false;
133-
alert("Debes seleccionar un archivo antes de subirlo");
134-
return;
135-
}
130+
try {
131+
const idDetalle = detalle.Id ?? "";
132+
const file = files[idDetalle];
136133

137-
const canon = (s: string) =>
138-
(s ?? "")
139-
.toString()
140-
.normalize("NFKC")
141-
.replace(/\u00a0/g, " ")
142-
.replace(/[-]/g, "-")
143-
.replace(/\s+/g, " ")
144-
.trim();
145-
146-
const empresa = canon(vm?.empresa?.toLowerCase() ?? "");
147-
148-
const servicioColaboradores =
149-
empresa === "dh retail"
150-
? ColaboradoresDH
151-
: empresa === "movimiento"
152-
? ColaboradoresVisual
153-
: empresa === "denim head"
154-
? ColaboradoresDenim
155-
: empresa === "estudio de moda"
156-
? ColaboradoresEDM
157-
: empresa === "metagraphics"
158-
? ColaboradoresMeta
159-
: ColaboradoresEDM;
160-
161-
const ext = (file.name.split(".").pop() ?? "pdf").trim();
162-
163-
const evidenciaRaw = canon(paso?.NombreEvidencia ?? paso?.NombrePaso ?? "Evidencia");
164-
const nombreBaseRaw = canon(`${vm?.numeroDoc ?? ""} - ${evidenciaRaw}`);
165-
const baseSafe = sanitizeFileName(nombreBaseRaw);
166-
167-
const folderName = canon(`${vm.numeroDoc ?? ""} - ${vm.nombre ?? ""}`);
168-
const carpetaFallback = `Colaboradores Activos/${folderName}`;
134+
if (!file) {
135+
alert("Debes seleccionar un archivo antes de subirlo");
136+
return;
137+
}
169138

170-
setUploading(true);
139+
const canon = (s: string) =>
140+
(s ?? "")
141+
.toString()
142+
.normalize("NFKC")
143+
.replace(/\u00a0/g, " ")
144+
.replace(/[-]/g, "-")
145+
.replace(/\s+/g, " ")
146+
.trim();
147+
148+
const numeroDoc = canon(vm?.numeroDoc ?? "");
149+
const nombre = canon(vm?.nombre ?? "");
150+
const empresa = canon(vm?.empresa?.toLowerCase() ?? "");
151+
152+
if (!numeroDoc || !nombre) {
153+
alert("Faltan datos del colaborador: número de documento o nombre.");
154+
return;
155+
}
156+
157+
const servicioColaboradores =
158+
empresa === "dh retail"
159+
? ColaboradoresDH
160+
: empresa === "movimiento"
161+
? ColaboradoresVisual
162+
: empresa === "denim head"
163+
? ColaboradoresDenim
164+
: empresa === "estudio de moda"
165+
? ColaboradoresEDM
166+
: empresa === "metagraphics"
167+
? ColaboradoresMeta
168+
: null;
169+
170+
if (!servicioColaboradores) {
171+
alert(`Empresa no reconocida para subida de archivos: ${vm?.empresa ?? "sin empresa"}`);
172+
return;
173+
}
174+
175+
const ext = (file.name.split(".").pop() ?? "pdf").trim();
176+
const evidenciaRaw = canon(paso?.NombreEvidencia ?? paso?.NombrePaso ?? "Evidencia");
177+
const nombreBaseRaw = `${numeroDoc} - ${evidenciaRaw}`;
178+
const baseSafe = sanitizeFileName(nombreBaseRaw);
179+
180+
const folderName = `${numeroDoc} - ${nombre}`;
181+
const carpetaFallback = `Colaboradores Activos/${folderName}`;
171182

172-
try {
173183
let targetFolderId: string | null = null;
174184

175185
try {
176-
const found = await servicioColaboradores.findFolderByDocNumber(vm.numeroDoc);
177-
186+
const found = await servicioColaboradores.findFolderByDocNumber(numeroDoc);
178187
if (found?.id) targetFolderId = found.id;
179-
180188
} catch {
181-
// no existe o falló la búsqueda → usamos fallback por ruta
182189
targetFolderId = null;
183190
}
184191

185-
console.log("[UPLOAD] folderId:", targetFolderId, "path:", carpetaFallback);
192+
console.log("[UPLOAD] vm:", vm);
193+
console.log("[UPLOAD] numeroDoc:", numeroDoc);
194+
console.log("[UPLOAD] nombre:", nombre);
195+
console.log("[UPLOAD] empresa:", empresa);
196+
console.log("[UPLOAD] folderId:", targetFolderId);
197+
console.log("[UPLOAD] fallbackPath:", carpetaFallback);
186198

187199
let uploadedName: string | null = null;
188200
let lastErr: any = null;
@@ -224,16 +236,7 @@ export const ProcessDetail: React.FC<PropsProceso> = ({detallesRows, loadingDeta
224236

225237
if (!uploadedName) throw lastErr;
226238

227-
try {
228-
await handleSubmit(detalle, "Completado");
229-
} catch {
230-
alert(
231-
`El archivo se subió (${uploadedName}), pero falló completar el paso. ` +
232-
`Reintenta completar el paso (no necesitas volver a subir).`
233-
);
234-
return;
235-
}
236-
239+
await handleSubmit(detalle, "Completado");
237240
setFiles((prev) => ({ ...prev, [idDetalle]: null }));
238241
alert("Archivo subido y paso completado correctamente");
239242
} catch (e: any) {
@@ -244,7 +247,6 @@ export const ProcessDetail: React.FC<PropsProceso> = ({detallesRows, loadingDeta
244247
uploadingRef.current = false;
245248
}
246249
};
247-
248250
/** ======= Notificación ======= */
249251
const sendNotification = async (toList: string[], subject: string, htmlBody: string) => {
250252
const payload: GraphSendMailPayload = {
@@ -350,7 +352,7 @@ export const ProcessDetail: React.FC<PropsProceso> = ({detallesRows, loadingDeta
350352

351353
const obligatorio = paso?.Obligatorio ?? true;
352354
const canSkip = !obligatorio && !isDone;
353-
355+
354356
return (
355357
<article key={idDetalle} className="step-card">
356358
<div className="step-card__header">

src/Components/GD/RegistrarNuevo/Modals/Retail/addRetail.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,9 @@ export default function FormRetail({
339339
loadingDetalles={retailStepsDetailsController.loading}
340340
errorDetalles={retailStepsDetailsController.error}
341341
loadDetalles={retailStepsDetailsController.load}
342-
proceso={"Nuevo"}/> :
342+
proceso={"Retail"}
343+
344+
/> :
343345
<>
344346
<h2 id="ft_title" className="ft-title">{title} {(tipo === "edit" || isView) ? ` - ${porcentajeCompletacion}` : null}</h2>
345347

src/Components/GD/View/VieweDocument.tsx

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import type { Archivo } from "../../../models/archivos";
77
import { SimpleFileUpload } from "../../GD/AddFile/AddFile";
88
import { usePermissions } from "../../../Funcionalidades/Permisos";
99
import { useColaboradoresExplorer } from "../../../Funcionalidades/GD/DocumentViewer/hooks/useColaboradoresExplorer";
10+
import { useFolderControl } from "../../../Funcionalidades/GD/DocumentViewer/CheckFolderControl/hooks/useFolderControl";
11+
import type { ControlRevisionCarpetas } from "../../../models/DocumentViewer";
1012

1113
/* ================= Helpers ================= */
1214
function buildBreadcrumb(currentPath: string) {
@@ -44,6 +46,22 @@ export const ColaboradoresExplorer: React.FC = () => {
4446
const totalFiles = totalItems - totalFolders;
4547
const isActivosOrRetirados = viewerController.currentPath.toLowerCase().includes("activos") || viewerController.currentPath.toLowerCase().includes("retirados");
4648
const isActivosOrCancelados = viewerController.currentPath.toLowerCase().includes("activos") || viewerController.currentPath.toLowerCase().includes("cancelados");
49+
const folderInfo = React.useMemo(() => {
50+
const path = viewerController.currentPath;
51+
52+
// ⚠️ Ajusta esto según cómo venga tu path
53+
const partes = path.split("/");
54+
const nombre = partes[partes.length - 1] || "";
55+
56+
return {
57+
cedula: nombre,
58+
nombre,
59+
fullname: nombre,
60+
path: selectedFile?.path ?? ""
61+
};
62+
}, [viewerController.currentPath, selectedFile]);
63+
64+
const folderController = useFolderControl(folderInfo, viewerController.empresa);
4765

4866
const handleCancel = async () => {
4967

@@ -86,6 +104,38 @@ export const ColaboradoresExplorer: React.FC = () => {
86104
setEdit(true);
87105
};
88106

107+
const handleSearchAndCreateControlEntity = async () => {
108+
if (!selectedFile?.isFolder) return;
109+
110+
const nombreCarpeta = selectedFile.name;
111+
const [cedula, nombre] = nombreCarpeta.split(" - ");
112+
113+
if (!cedula || !nombre) return;
114+
115+
const folderEncontrado = await folderController.searchSpecificFolder(cedula);
116+
if (folderEncontrado.founded) return;
117+
118+
const nextState: ControlRevisionCarpetas = {
119+
...folderController.state,
120+
Cedula: cedula,
121+
NombreColaborador: nombre,
122+
FolderName: nombre,
123+
FolderPath: selectedFile.path ?? "",
124+
Title: `Control de revisión: ${cedula} - ${nombre}`,
125+
};
126+
127+
folderController.setState(nextState);
128+
129+
await folderController.createEntity(nextState);
130+
};
131+
132+
//Buscar y crear registro de control en caso de ser necesario
133+
React.useEffect(() => {
134+
if(selectedFile) {
135+
handleSearchAndCreateControlEntity();
136+
}
137+
}, [selectedFile, viewerController.currentPath]);
138+
89139
return (
90140
<div className="ce2">
91141
{/* Sidebar */}
@@ -212,7 +262,7 @@ export const ColaboradoresExplorer: React.FC = () => {
212262
const date = parseDateFlex(item.lastModified ?? "")?.toLocaleDateString("es-CO") ?? "";
213263

214264
return (
215-
<button key={item.id} type="button" className="ce2-tr ce2-rowBtn" role="row" onClick={() => viewerController.openItem(item)}>
265+
<button key={item.id} type="button" className="ce2-tr ce2-rowBtn" role="row" onClick={() => {setSelectedFile(item); viewerController.openItem(item)}}>
216266
<div className="ce2-td ce2-td--seq" role="cell">
217267
<span className={"ce2-seq" + (seq === "—" ? " is-ghost" : "")}>{seq}</span>
218268
</div>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from "react";
2+
import { useGraphServices } from "../../../../../graph/graphContext";
3+
import type { ControlRevisionCarpetas } from "../../../../../models/DocumentViewer";
4+
import { buildControlRevisionReportFilter } from "../utils/controlRevisionReport";
5+
6+
export function useFolderControlActions() {
7+
const graph = useGraphServices()
8+
9+
const handleSubmitBd = async (state: Partial<ControlRevisionCarpetas>): Promise<ControlRevisionCarpetas> => {
10+
try {
11+
console.log("Enviando a creación con estado:", state);
12+
const created = await graph.controlRevisionCarpetas.create(state);
13+
console.log("Se ha creado la entidad de la carpeta con éxito", created)
14+
return created
15+
} catch {
16+
throw new Error("Algo ha salido mal")
17+
}
18+
};
19+
20+
const loadToReport = React.useCallback(async (from: string, to: string, empresa?: string, estado?: string): Promise<{ok: boolean, data: ControlRevisionCarpetas[], message: string | null}> => {
21+
try {
22+
const res = await graph.controlRevisionCarpetas.getAll(buildControlRevisionReportFilter(from, to, empresa, estado),);
23+
return {
24+
data: res ?? [],
25+
message: null,
26+
ok: true
27+
}
28+
} catch (e: any) {
29+
return {
30+
data: [],
31+
message: "Algo ha salido mal, " + e,
32+
ok: false
33+
}
34+
}
35+
}, []);
36+
37+
38+
return {
39+
loadToReport, handleSubmitBd,
40+
41+
};
42+
}
43+
44+
45+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React from "react";
2+
import { useGraphServices } from "../../../../../graph/graphContext";
3+
import type { ControlRevisionCarpetas } from "../../../../../models/DocumentViewer";
4+
5+
export function useSpecificFolderSearch() {
6+
const graph = useGraphServices()
7+
8+
const [folders, setFolders] = React.useState<ControlRevisionCarpetas[]>([]);
9+
10+
const searchSpecificFolder = async (query: string): Promise<{founded: boolean, folders: ControlRevisionCarpetas | null}> => {
11+
const resp = await graph.controlRevisionCarpetas.getAll({filter: `fields/Cedula eq '${query}'`, top: 1,});
12+
13+
const foundFolders = resp ?? [];
14+
setFolders(foundFolders);
15+
16+
if(foundFolders.length > 0) {
17+
return {
18+
founded: true,
19+
folders: foundFolders[0]
20+
};
21+
}
22+
23+
return {
24+
founded: false,
25+
folders: null
26+
};
27+
};
28+
29+
return {
30+
searchSpecificFolder,
31+
folders,
32+
};
33+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from "react";
2+
import { useFolderControlForm } from "./userControlForm";
3+
import { useFolderControlActions } from "./useControlBdACtions";
4+
import { useSpecificFolderSearch } from "./useControlSearcher";
5+
import type { ControlRevisionCarpetas } from "../../../../../models/DocumentViewer";
6+
import { buildFirstTimeControlRevisionPayload } from "../utils/controlRevisionPayload";
7+
8+
9+
10+
export function useFolderControl(folderInfo: {cedula: string, nombre: string, fullname: string, path: string}, empresa: string) {
11+
const formController = useFolderControlForm(folderInfo, empresa)
12+
const actionsController = useFolderControlActions()
13+
//const listController = useHabeasList(paginationController.pageSize, auth.account?.name ?? "")
14+
const searchesController = useSpecificFolderSearch()
15+
16+
const [loading, setLoading] = React.useState(false);
17+
18+
const createEntity = async (state: ControlRevisionCarpetas): Promise<{ created: ControlRevisionCarpetas | null; ok: boolean }> => {
19+
setLoading(true);
20+
21+
try {
22+
console.log("Creando entidad con estado:", state);
23+
const payload = buildFirstTimeControlRevisionPayload(state)
24+
console.log("Payload después de conversión:", payload);
25+
const creado = await actionsController.handleSubmitBd(payload);
26+
return { ok: true, created: creado };
27+
} catch {
28+
alert("Algo ha salido mal creando el registro");
29+
return { ok: false, created: null };
30+
} finally {
31+
setLoading(false);
32+
}
33+
};
34+
35+
return {
36+
createEntity,
37+
...searchesController,
38+
...formController,
39+
...actionsController,
40+
loading
41+
};
42+
}

0 commit comments

Comments
 (0)