<mxfile host="app.diagrams.net" modified="2026-04-22T10:15:00.000Z" agent="Codex" version="25.0.2">
  <diagram id="hris-approval-lifecycle" name="HRIS Approval Lifecycle">
    <mxGraphModel dx="1788" dy="980" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2200" pageHeight="1600" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <mxCell id="at1" value="HRIS Approval Lifecycle" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=24;fontStyle=1;fontColor=#0f172a;" vertex="1" parent="1">
          <mxGeometry x="40" y="20" width="520" height="30" as="geometry" />
        </mxCell>
        <mxCell id="at2" value="Reusable approval engine for leave, reimbursement, forgetting clock, and SPL." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=12;fontColor=#475569;" vertex="1" parent="1">
          <mxGeometry x="40" y="52" width="980" height="20" as="geometry" />
        </mxCell>

        <mxCell id="al1" value="A. Flow Setup" style="swimlane;html=1;rounded=1;fillColor=#f8fafc;strokeColor=#cbd5e1;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="100" width="2020" height="170" as="geometry" />
        </mxCell>
        <mxCell id="al2" value="B. Request Draft &amp; Submit" style="swimlane;html=1;rounded=1;fillColor=#eff6ff;strokeColor=#bfdbfe;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="290" width="2020" height="220" as="geometry" />
        </mxCell>
        <mxCell id="al3" value="C. Approval Processing" style="swimlane;html=1;rounded=1;fillColor=#fffbeb;strokeColor=#fde68a;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="530" width="2020" height="290" as="geometry" />
        </mxCell>
        <mxCell id="al4" value="D. Outcome &amp; Module Effect" style="swimlane;html=1;rounded=1;fillColor=#f0fdf4;strokeColor=#bbf7d0;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="840" width="2020" height="260" as="geometry" />
        </mxCell>

        <mxCell id="n1" value="master_approval_flows" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="100" y="150" width="200" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n2" value="master_approval_flow_steps&#xa;step_order + approver" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="350" y="145" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n3" value="Module Draft&#xa;Leave / Reimbursement / Forgetting Clock / SPL" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dbeafe;strokeColor=#2563eb;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="100" y="360" width="260" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n4" value="submit() / bulkSubmit()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="410" y="370" width="190" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n5" value="Create approval_requests&#xa;module_key + reference_id + flow_id" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#d97706;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="660" y="360" width="250" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n6" value="Snapshot to approval_request_steps" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="960" y="370" width="230" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n7" value="Status jadi&#xa;submitted / in_review" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1240" y="370" width="190" height="54" as="geometry" />
        </mxCell>

        <mxCell id="n8" value="Current step approver" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="180" y="620" width="180" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n9" value="approve() / bulkApprove()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#ea580c;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="420" y="620" width="190" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n10" value="Step terakhir?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#ea580c;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="690" y="605" width="120" height="84" as="geometry" />
        </mxCell>
        <mxCell id="n11" value="Next step jadi pending&#xa;request tetap in_review" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#ea580c;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="890" y="550" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n12" value="Final approved&#xa;request final_approved_at terisi" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#16a34a;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="890" y="690" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n13" value="reject() / bulkReject()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#dc2626;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="420" y="710" width="190" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n14" value="Request rejected&#xa;rejection_reason tersimpan" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fee2e2;strokeColor=#dc2626;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="690" y="710" width="210" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n15" value="unapprove() / cancel submit()&#xa;opsional per modul" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1240" y="620" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n16" value="Back to draft / rollback state" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ede9fe;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1510" y="620" width="220" height="54" as="geometry" />
        </mxCell>

        <mxCell id="n17" value="Leave approved&#xa;saldo / status izin dipakai modul" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="160" y="930" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n18" value="Reimbursement approved&#xa;siap diproses penggajian / pembayaran" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="430" y="930" width="250" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n19" value="Forgetting clock approved&#xa;perbaikan data attendance" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="740" y="930" width="230" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n20" value="SPL approved&#xa;masuk jalur payroll / separate payout" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1030" y="930" width="230" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n21" value="Audit trail approval&#xa;step acted_at + notes + approver" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#16a34a;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1330" y="930" width="250" height="64" as="geometry" />
        </mxCell>

        <mxCell id="e1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#64748b;" edge="1" parent="1" source="n1" target="n2">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n3" target="n4">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n2" target="n5">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n4" target="n5">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n5" target="n6">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n6" target="n7">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#ea580c;" edge="1" parent="1" source="n7" target="n8">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#ea580c;" edge="1" parent="1" source="n8" target="n9">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#ea580c;" edge="1" parent="1" source="n9" target="n10">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e10" value="Tidak" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#ea580c;" edge="1" parent="1" source="n10" target="n11">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e11" value="Ya" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n10" target="n12">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#dc2626;" edge="1" parent="1" source="n8" target="n13">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#dc2626;" edge="1" parent="1" source="n13" target="n14">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n7" target="n15">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n15" target="n16">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n17">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n18">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n19">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n20">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n21">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n14" target="n21">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
