\begin{figure}[ht] \centering \begin{tikzpicture}[ font=\footnotesize, actor/.style={draw=ipsblue, rounded corners=2pt, align=center, minimum width=1.7cm, minimum height=0.7cm, fill=codebg}, msg/.style={-{Latex}, thick}, note/.style={align=left, font=\scriptsize\color{ipsgrey}} ] \node[actor] (d) {Desktop}; \node[actor, right=1.5cm of d] (g) {Gateway}; \node[actor, right=1.5cm of g] (a) {API bot}; \node[actor, right=1.5cm of a] (w) {Agent}; \node[actor, right=1.5cm of w] (m) {MinIO}; \coordinate (top) at ($(d.south)+(0,-0.35)$); \foreach \n in {d,g,a,w,m} { \draw[ipsgrey!60] (\n.south) -- ++(0,-5.6); } \draw[msg] ($(w.south)+(0,-0.5)$) -- node[above,font=\scriptsize]{register + heartbeat} ($(a.south)+(0,-0.5)$); \draw[msg] ($(d.south)+(0,-1.3)$) -- node[above,font=\scriptsize]{POST /jobs (Excel)} ($(a.south)+(0,-1.3)$); \draw[msg] ($(a.south)+(0,-2.0)$) -- node[above,font=\scriptsize]{PutObject Excel} ($(m.south)+(0,-2.0)$); \draw[msg] ($(w.south)+(0,-2.7)$) -- node[above,font=\scriptsize]{claim\_pending} ($(a.south)+(0,-2.7)$); \draw[msg] ($(w.south)+(0,-3.4)$) -- node[above,font=\scriptsize]{GET Excel / Put PDFs} ($(m.south)+(0,-3.4)$); \draw[msg] ($(w.south)+(0,-4.1)$) -- node[above,font=\scriptsize]{POST events} ($(a.south)+(0,-4.1)$); \draw[msg] ($(w.south)+(0,-4.8)$) -- node[above,font=\scriptsize]{PATCH completed} ($(a.south)+(0,-4.8)$); \draw[msg] ($(d.south)+(0,-5.4)$) -- node[above,font=\scriptsize]{poll job + files} ($(a.south)+(0,-5.4)$); \end{tikzpicture} \caption{Secuencia del flujo bot de descarga.} \label{fig:flujo-bot} \end{figure}