HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/web/hyperflight/apps/status/index - Copy (2).asp
<%@ Language=VBScript %>
<% Option Explicit %>
<%
Response.Buffer = True

'==========================================================
' AUTO-REFRESH + REFRESH COUNT (Session-based)
'==========================================================
Dim refreshSeconds
refreshSeconds = 60 ' 1 minute

If IsEmpty(Session("RefreshCount")) Or IsNull(Session("RefreshCount")) Then
  Session("RefreshCount") = 0
End If
Session("RefreshCount") = CLng(Session("RefreshCount")) + 1

'==========================================================
' CONNECTION (DSN)
'==========================================================
Dim cn, rs, sql
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open "DSN=MySQL_hyperflight;"

'==========================================================
' SQL (MariaDB with ROW_NUMBER())
'==========================================================
sql = ""
sql = sql & "SELECT StatusText, Orders, SortOrder " & vbCrLf
sql = sql & "FROM ( " & vbCrLf

' --- Payment statuses: fixed display order ---
sql = sql & "  SELECT " & vbCrLf
sql = sql & "    Status AS StatusText, " & vbCrLf
sql = sql & "    COUNT(*) AS Orders, " & vbCrLf
sql = sql & "    CASE Status " & vbCrLf
sql = sql & "      WHEN 'PAYMENT RECEIVED' THEN 10 " & vbCrLf
sql = sql & "      WHEN 'PAYMENT ON ACCOUNT' THEN 20 " & vbCrLf
sql = sql & "      WHEN 'AWAITING PAYMENT' THEN 30 " & vbCrLf
sql = sql & "      ELSE 99 " & vbCrLf
sql = sql & "    END AS SortOrder " & vbCrLf
sql = sql & "  FROM orders " & vbCrLf
sql = sql & "  WHERE Status IN ('PAYMENT RECEIVED','PAYMENT ON ACCOUNT','AWAITING PAYMENT') " & vbCrLf
sql = sql & "  GROUP BY Status " & vbCrLf

sql = sql & "  UNION ALL " & vbCrLf

' --- Spacer row ---
sql = sql & "  SELECT NULL AS StatusText, NULL AS Orders, 1000 AS SortOrder " & vbCrLf

sql = sql & "  UNION ALL " & vbCrLf

' --- Sent by courier (today): Courier DESC via ROW_NUMBER ---
sql = sql & "  SELECT " & vbCrLf
sql = sql & "    CONCAT('Sent ', Courier) AS StatusText, " & vbCrLf
sql = sql & "    Orders, " & vbCrLf
sql = sql & "    1100 + rn AS SortOrder " & vbCrLf
sql = sql & "  FROM ( " & vbCrLf
sql = sql & "    SELECT " & vbCrLf
sql = sql & "      Courier, " & vbCrLf
sql = sql & "      COUNT(*) AS Orders, " & vbCrLf
sql = sql & "      ROW_NUMBER() OVER (ORDER BY Courier DESC) AS rn " & vbCrLf
sql = sql & "    FROM orders " & vbCrLf
sql = sql & "    WHERE Status='COMPLETED' AND DATE(DateTimeCompleted)=CURDATE() " & vbCrLf
sql = sql & "    GROUP BY Courier " & vbCrLf
sql = sql & "  ) s " & vbCrLf

sql = sql & "  UNION ALL " & vbCrLf

' --- Total sent (today) ---
sql = sql & "  SELECT 'Total Sent' AS StatusText, COUNT(*) AS Orders, 1999 AS SortOrder " & vbCrLf
sql = sql & "  FROM orders " & vbCrLf
sql = sql & "  WHERE Status='COMPLETED' AND DATE(DateTimeCompleted)=CURDATE() " & vbCrLf

sql = sql & ") x " & vbCrLf
sql = sql & "ORDER BY SortOrder; "

'==========================================================
' RUN (client-side cursor so we can MoveFirst for max calc)
'==========================================================
Set rs = Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = 3 ' adUseClient
rs.Open sql, cn, 3, 1 ' adOpenStatic, adLockReadOnly

Dim lastUpdated : lastUpdated = Now()

'==========================================================
' HELPERS
'==========================================================
Function HtmlEncode(ByVal s)
  If IsNull(s) Then HtmlEncode = "" Else HtmlEncode = Server.HTMLEncode(CStr(s))
End Function

Function FormatUkDateTime(ByVal dt)
  Dim d, m, y, hh, nn, ss
  d  = Right("0" & Day(dt), 2)
  m  = Right("0" & Month(dt), 2)
  y  = Year(dt)
  hh = Right("0" & Hour(dt), 2)
  nn = Right("0" & Minute(dt), 2)
  ss = Right("0" & Second(dt), 2)
  FormatUkDateTime = d & "/" & m & "/" & y & " " & hh & ":" & nn & ":" & ss
End Function

Function CourierLogoHtml(ByVal statusText)
  Dim s, c, src, alt
  CourierLogoHtml = ""
  If IsNull(statusText) Then Exit Function

  s = Trim(CStr(statusText))
  If LCase(Left(s, 5)) <> "sent " Then Exit Function

  c = Trim(Mid(s, 6))
  alt = c
  src = ""

  Select Case LCase(c)
    Case "royal mail", "royalmail", "rm"
      src = "/assets/couriers/royalmail.svg"
    Case "fedex", "fed ex"
      src = "/assets/couriers/fedex.svg"
    Case "dhl ecommerce", "dhl e-commerce", "dhl eCommerce"
      src = "/assets/couriers/dhl-ecommerce.svg"
    Case "dhl"
      src = "/assets/couriers/dhl.svg"
    Case "ups"
      src = "/assets/couriers/ups.svg"
    Case Else
      src = ""
  End Select

  If Len(src) > 0 Then
    CourierLogoHtml = "<img src=""" & src & """ alt=""" & Server.HTMLEncode(alt) & _
                      """ class=""courier-logo me-2"" loading=""lazy"">"
  End If
End Function

Function BarPct(ByVal v, ByVal maxV)
  If IsNull(v) Or IsNull(maxV) Then
    BarPct = 0
  ElseIf CDbl(maxV) <= 0 Then
    BarPct = 0
  Else
    BarPct = (CDbl(v) / CDbl(maxV)) * 100
    If BarPct < 0 Then BarPct = 0
    If BarPct > 100 Then BarPct = 100
  End If
End Function

'==========================================================
' CALC MAX (for bar widths)
'==========================================================
Dim maxOrders : maxOrders = 0
If Not (rs.EOF And rs.BOF) Then
  rs.MoveFirst
  Do While Not rs.EOF
    If Not IsNull(rs("Orders")) Then
      If CLng(rs("Orders")) > CLng(maxOrders) Then maxOrders = CLng(rs("Orders"))
    End If
    rs.MoveNext
  Loop
  rs.MoveFirst
End If
%>

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- Fallback refresh if JS disabled -->
  <meta http-equiv="refresh" content="<%= refreshSeconds %>">

  <title>Orders Status</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

  <style>
    .status-table td, .status-table th { vertical-align: middle; }
    .status-big { font-weight: 800; font-size: clamp(1.05rem, 2.2vw, 1.45rem); }
    .count-big  { font-weight: 800; font-size: clamp(1.05rem, 2.2vw, 1.45rem); text-align: right; }
    .spacer-row td { padding: 0.6rem; background: #fff; }
    .total-row td { font-weight: 800; }
    .courier-logo { width: 26px; height: 26px; object-fit: contain; vertical-align: -4px; }
    .orders-cell { min-width: 180px; }
    .orders-top { display: flex; align-items: center; justify-content: flex-end; gap: .5rem; }
    .progress { height: 8px; }
  </style>
</head>

<body class="bg-light">
  <div class="container py-3" style="max-width:900px;">
    <div class="card shadow-sm">
      <div class="card-body">

        <div class="d-flex flex-column flex-sm-row align-items-sm-center justify-content-between gap-2 mb-3">
          <form method="get" action="" class="m-0">
            <button type="submit" class="btn btn-outline-secondary btn-sm">Refresh</button>
          </form>

          <div class="text-muted small">
            <span class="me-2">Last Updated:</span>
            <strong><%= FormatUkDateTime(lastUpdated) %></strong>
            <span class="ms-2">(<%= Session("RefreshCount") %>)</span>
            <span class="ms-2">Auto refresh in: <strong id="countdown"><%= refreshSeconds %></strong>s</span>
          </div>
        </div>

        <div class="table-responsive">
          <table class="table table-bordered table-sm status-table mb-0 bg-white">
            <thead class="table-light">
              <tr>
                <th style="width:70%;">Status</th>
                <th style="width:30%;" class="text-end">Orders</th>
              </tr>
            </thead>
            <tbody>
              <%
              If rs.EOF Then
              %>
                <tr><td colspan="2" class="text-center text-muted py-4">No data returned.</td></tr>
              <%
              Else
                Dim statusText, ordersCount, rowClass, pct
                Do While Not rs.EOF
                  statusText  = rs("StatusText")
                  ordersCount = rs("Orders")

                  If IsNull(statusText) And IsNull(ordersCount) Then
              %>
                    <tr class="spacer-row"><td colspan="2">&nbsp;</td></tr>
              <%
                  Else
                    rowClass = ""
                    If Not IsNull(statusText) Then
                      If CStr(statusText) = "Total Sent" Then rowClass = "total-row"
                    End If

                    pct = BarPct(ordersCount, maxOrders)
              %>
                    <tr class="<%= rowClass %>">
                      <td class="status-big">
                        <%= CourierLogoHtml(statusText) %><%= HtmlEncode(statusText) %>
                      </td>
                      <td class="orders-cell">
                        <div class="orders-top">
                          <div class="count-big"><%= ordersCount %></div>
                        </div>
                        <div class="progress mt-1" role="progressbar" aria-label="Orders bar">
                          <div class="progress-bar" style="width:<%= Replace(CStr(pct), ",", ".") %>%"></div>
                        </div>
                      </td>
                    </tr>
              <%
                  End If

                  rs.MoveNext
                Loop
              End If
              %>
            </tbody>
          </table>
        </div>

      </div>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

  <script>
    (function () {
      var secs = <%= refreshSeconds %>;
      var el = document.getElementById('countdown');
      if (!el) return;

      function tick() {
        secs -= 1;
        if (secs <= 0) {
          el.textContent = '0';
          window.location.reload();
          return;
        }
        el.textContent = String(secs);
      }

      // Start countdown
      el.textContent = String(secs);
      window.setInterval(tick, 1000);
    })();
  </script>
</body>
</html>

<%
'==========================================================
' CLEANUP
'==========================================================
On Error Resume Next
If Not rs Is Nothing Then
  If rs.State <> 0 Then rs.Close
End If
Set rs = Nothing

If Not cn Is Nothing Then
  If cn.State <> 0 Then cn.Close
End If
Set cn = Nothing
On Error GoTo 0
%>