Monday, 25 December 2023

Edge Browser Cache Cleaner V2






Manifest.json


{
  "manifest_version": 3,
  "name": "Browser Cache Cleaner",
  "version": "1.0",
  "description": "Quickly clear browser cache, cookies, and history with Browser Cache Cleaner, enhancing your browsing speed and privacy.",
  "action": {
    "default_popup": "popup.html"
  },
  "icons": {
    "16": "icons/bcc16.png",
    "48": "icons/bcc48.png",
    "128": "icons/bcc128.png"
},
  "permissions": [
    "storage",
    "activeTab",
    "scripting",
    "browsingData",
    "tabs"    
  ],
  "host_permissions": [
    "*://*/*"
  ],
  "background": {
    "service_worker": "background.js"
  }
}

 popup.html

<!DOCTYPE html>
<html>

<head>
    <title>Browser Cache Clearer</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
    <span class="head-ing"> Browser Cache Cleaner. V2 <br></span>
    <span class="subhead-ing">for Microsoft Edge Browser</span>
    <p></p>
    <div id="browserVersionInfo"></div>
    <form id="dataOptions">
        <div>
            <input type="checkbox" id="selectAll"> Select All
        </div>
        <hr>
        <div>
            <input type="checkbox" id="cache" checked>
            <span class="checkbox-label">1. Cache</span>
            <span class="desc">(Clears browser cache)</span>
        </div>
        <div>
            <input type="checkbox" id="cookies">
            <span class="checkbox-label">2. Cookies</span>
            <span class="desc">(Removes cookies storing user activity and preferences)</span>
        </div>
        <div>
            <input type="checkbox" id="history">
            <span class="checkbox-label">3. Browsing History</span>
            <span class="desc">(Deletes the record of visited web pages)</span>
        </div>
        <div>
            <input type="checkbox" id="fileSystems">
            <span class="checkbox-label">4. File Systems</span>
            <span class="desc">(Clears data in file systems API used by some web apps)</span>
        </div>
        <div>
            <input type="checkbox" id="indexedDB">
            <span class="checkbox-label">5. IndexedDB</span>
            <span class="desc">(Removes data in IndexedDB for structured data storage)</span>
        </div>
        <div>
            <input type="checkbox" id="localStorage">
            <span class="checkbox-label">6. Local Storage</span>
            <span class="desc">(Clears local storage used for key-value pair data)</span>
        </div>
        <div>
            <input type="checkbox" id="serviceWorkers">
            <span class="checkbox-label">7. Service Workers</span>
            <span class="desc">(Clears data related to background scripts for web apps)</span>
        </div>
        <div>
            <input type="checkbox" id="downloads">
            <span class="checkbox-label">8. Downloads</span>
            <span class="desc">(Removes the browser's download history records)</span>
        </div>
        <div>
            <input type="checkbox" id="formdata">
            <span class="checkbox-label">9. Form Data</span>
            <span class="desc">(Clears saved form information like names and addresses)</span>
        </div>
        <div>
            <input type="checkbox" id="passwords">
            <span class="checkbox-label">10. Passwords</span>
            <span class="desc">(Removes saved passwords from the browser)</span>
        </div>
        <div>
            <input type="checkbox" id="pluginData">
            <span class="checkbox-label">11. Plugin Data</span>
            <span class="desc">(Clears data stored by plugins)</span>
        </div>
    </form>
    <div id="statusMessage" style="margin-top: 10px;margin-bottom: 10px;"></div>
    <hr>
    <button id="clearDataButton">Clear Selected Data</button>
    <button id="captureBtn">Capture Screenshot</button>
    <script src="popup.js"></script>
    <span class="copyright"><br> <br>Edge extension by AdventHealth Infra Admin Team<br>(Copyrights 2023. All rights reserved)</span>
</body>

</html>


style.css

        /* Add your styling here */

        #clearDataButton {
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            margin: 0;
            padding: 10px;
            text-align: center;
            background-color: #f4f4f4;
            color: #333;
            width: 550px;
            height: 580px;
            margin: auto;
            overflow-y: auto;
            overflow: hidden;


        }


        h1 {
            color: #5a5a5a;
        }

        #dataOptions {
            margin: 20px 0;
            text-align: left;
        }

        #dataOptions div {
            margin-bottom: 10px;
        }

        input[type="checkbox"] {
            margin-right: 10px;
        }

        button {
            background-color: #3c2cca;
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s ease;
            margin-right: 20px
        }

        #captureBtn {
            background-color: green;
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s ease;
        }

        button:hover {
            background-color: #3c2cca;
        }

        .cleared {
            position: relative;
            padding-left: 25px;
            /* Adjust space for check mark */
        }

        .cleared::before {
            content: '\2714';
            /* Unicode check mark */
            position: absolute;
            left: 0;
            color: green;
        }

        .checkbox-label {
            font-weight: bold;
            color: rgb(11, 31, 212);
        }

        .head-ing {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            font-size: 30px;
        }

        .subhead-ing {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            color: rgb(11, 31, 212);
        }

        .copyright {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            color: rgb(96, 113, 136);
        }


popup.js

document.addEventListener("DOMContentLoaded", function () {
  var selectAllCheckbox = document.getElementById("selectAll");
  var otherCheckboxes = document.querySelectorAll(
    '#dataOptions input[type="checkbox"]:not(#selectAll)'
  );
  var clearDataButton = document.getElementById("clearDataButton");
  var statusMessage = document.getElementById("statusMessage");
  var checkboxes = document.querySelectorAll(
    '#dataOptions input[type="checkbox"]'
  );

  selectAllCheckbox.addEventListener("change", function () {
    checkboxes.forEach((checkbox) => {
      checkbox.checked = this.checked;
      checkbox.parentElement.classList.remove("cleared"); // Remove cleared class if needed
      document.getElementById("statusMessage").innerHTML = "";
    });
  });

  checkboxes.forEach(function (checkbox) {
    checkbox.addEventListener("change", function () {
      // If any checkbox is unchecked, uncheck the selectAllCheckbox
      if (!this.checked) {
        selectAllCheckbox.checked = false;
      }
    });
  });

  clearDataButton.addEventListener("click", function () {
    // Check if any checkbox is selected
    var isAnyCheckboxSelected = Array.from(checkboxes).some(
      (checkbox) => checkbox.checked
    );

    if (!isAnyCheckboxSelected) {
      // Show 'nothing selected' message
      statusMessage.textContent = "No selection(s) found!";
      statusMessage.style.color = "red";
      checkboxes.forEach((checkbox) => {
        checkbox.parentElement.classList.remove("cleared");
      });
      return; // Exit the function
    }

    var options = {
      cache: document.getElementById("cache").checked,
      cookies: document.getElementById("cookies").checked,
      history: document.getElementById("history").checked,
      fileSystems: document.getElementById("fileSystems").checked,
      indexedDB: document.getElementById("indexedDB").checked,
      localStorage: document.getElementById("localStorage").checked,
      serviceWorkers: document.getElementById("serviceWorkers").checked,
      downloads: document.getElementById("downloads").checked,
      formData: document.getElementById("formdata").checked,
      passwords: document.getElementById("passwords").checked,
      pluginData: document.getElementById("pluginData").checked,
    };

    chrome.runtime.sendMessage({ action: "clearData", options: options });
    updateStatusMessage();
    document.getElementById("statusMessage").style.color = "red";
    var checkedItems = document.querySelectorAll(
      '#dataOptions input[type="checkbox"]:checked:not(#selectAll)'
    );

    checkboxes.forEach((checkbox) => {
      checkbox.parentElement.classList.remove("cleared");
    });

    checkedItems.forEach((item) => {
      item.parentElement.classList.add("cleared");
    });
  });
  displayEdgeVersion();
});

function updateStatusMessage() {
  var now = new Date();
  var options = {
    year: "numeric",
    month: "numeric",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
    second: "numeric",
    timeZoneName: "short",
  };
  var dateString = new Intl.DateTimeFormat("en-US", options).format(now);

  var message = "Selected data cleared from your browser<br>" + dateString;
  document.getElementById("statusMessage").innerHTML = message;
}

function displayEdgeVersion() {
  var userAgent = navigator.userAgent;
  var edgeVersionMatch = userAgent.match(/Edg\/([\d\.]+)/); // Find Edge version
  // var edgeVersionMatch = userAgent.split('Edge/')[1];
  var edgeVersion = edgeVersionMatch
    ? "Your Edge Version:" + edgeVersionMatch[1]
    : "Edge version not detected";

  // Displaying version info
  document.getElementById("browserVersionInfo").textContent = edgeVersion;
}

chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
  if (message.action === "captured") {
    downloadImage(message.image);
  }
});

function downloadImage(imageData) {
  var link = document.createElement("a");
  link.href = imageData;
  link.download = "screenshot.png";
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

document.getElementById("captureBtn").addEventListener("click", function () {
  chrome.runtime.sendMessage({ action: "capture" });
});

background.js


chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.action === "clearData") {
    // Call clearBrowserData and then send response
    clearBrowserData(request.options)
      .then(() => {
        sendResponse({ action: "clearDataResponse" });
      })
      .catch((error) => {
        console.error("Error clearing data:", error);
        sendResponse({ action: "clearDataResponse", error: error.message });
      });

    // Return true to keep the messaging channel open for the response
    return true;
  }
});

function clearBrowserData(options) {
  return new Promise((resolve, reject) => {
    var dataToRemove = {};
    // Existing options
    if (options.cache) dataToRemove.cache = true;
    if (options.cookies) dataToRemove.cookies = true;
    if (options.history) dataToRemove.history = true;
    if (options.fileSystems) dataToRemove.fileSystems = true;
    if (options.indexedDB) dataToRemove.indexedDB = true;
    if (options.localStorage) dataToRemove.localStorage = true;
    if (options.serviceWorkers) dataToRemove.serviceWorkers = true;
    if (options.downloads) dataToRemove.downloads = true;
    if (options.formData) dataToRemove.formData = true;
    if (options.passwords) dataToRemove.passwords = true;
    if (options.pluginData) dataToRemove.pluginData = true;
    chrome.browsingData.remove({ since: 0 }, dataToRemove, () => {
      console.log("Selected data cleared.");
      resolve();
    });
  });
}

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.action === "capture") {
    chrome.tabs.captureVisibleTab(null, { format: "png" }, function (image) {
      // Send the image data to the popup script
      chrome.runtime.sendMessage({ action: "captured", image: image });
    });
  }
});









Sunday, 24 December 2023

Browser Cache Clearer





______________________________________________________________________________

manifest.json

______________________________________________________________________________

{

  "manifest_version": 3,

  "name": "Cache Clearer",

  "version": "1.0",

  "action": {

    "default_popup": "popup.html"

  },

  "permissions": [

    "storage",

    "activeTab",

    "scripting",

    "browsingData"

  ],

  "host_permissions": [

    "*://*/*"

  ],

  "background": {

    "service_worker": "background.js"

  }

}



chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {

    if (request.action === "clearData") {

        // Call clearBrowserData and then send response

        clearBrowserData(request.options).then(() => {

            sendResponse({ action: "clearDataResponse" });

        }).catch((error) => {

            console.error("Error clearing data:", error);

            sendResponse({ action: "clearDataResponse", error: error.message });

        });


        // Return true to keep the messaging channel open for the response

        return true;

    }

});


function clearBrowserData(options) {

    return new Promise((resolve, reject) => {

        var dataToRemove = {};

        if (options.cache) dataToRemove.cache = true;

        if (options.cookies) dataToRemove.cookies = true;

        if (options.history) dataToRemove.history = true;

        if (options.fileSystems) dataToRemove.fileSystems = true;

        if (options.indexedDB) dataToRemove.indexedDB = true;

        if (options.localStorage) dataToRemove.localStorage = true;

        if (options.serviceWorkers) dataToRemove.serviceWorkers = true;


        chrome.browsingData.remove({ "since": 0 }, dataToRemove, () => {

            console.log("Selected data cleared bg.");

            // sendResponse({ action: "clearDataResponse" });

            resolve();

        });

    });

}

______________________________________________________________________________

background.js

______________________________________________________________________________

popup.html

<!DOCTYPE html>

<html>


<head>

    <title>Cache Clearer</title>

    <style>

        /* Add your styling here */


        #clearDataButton {

            padding: 10px 20px;

            font-size: 16px;

            cursor: pointer;

        }


        body {

            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;

            margin: 0;

            padding: 10px;

            text-align: center;

            background-color: #f4f4f4;

            color: #333;

            width: 350px;

            /* Adjust this value as needed */

            margin: auto;

        }



        h1 {

            color: #5a5a5a;

        }


        #dataOptions {

            margin: 20px 0;

            text-align: left;

        }


        #dataOptions div {

            margin-bottom: 10px;

        }


        input[type="checkbox"] {

            margin-right: 10px;

        }


        button {

            background-color: #4CAF50;

            color: white;

            padding: 10px 20px;

            border: none;

            border-radius: 5px;

            cursor: pointer;

            font-size: 16px;

            transition: background-color 0.3s ease;

        }


        button:hover {

            background-color: #45a049;

        }


        .cleared {

            position: relative;

            padding-left: 25px;

            /* Adjust space for check mark */

        }


        .cleared::before {

            content: '\2714';

            /* Unicode check mark */

            position: absolute;

            left: 0;

            color: green;

        }

    </style>

</head>


<body>

    <h1>Browser cache clearer</h1>

    <form id="dataOptions">

        <div><input type="checkbox" id="selectAll"> Select All</div>

        <hr>

        <div><input type="checkbox" id="cache" checked> Cache</div>

        <div><input type="checkbox" id="cookies"> Cookies</div>

        <div><input type="checkbox" id="history"> Browsing History</div>

        <div><input type="checkbox" id="fileSystems"> File Systems</div>

        <div><input type="checkbox" id="indexedDB"> IndexedDB</div>

        <div><input type="checkbox" id="localStorage"> Local Storage</div>

        <div><input type="checkbox" id="serviceWorkers"> Service Workers</div>

        <!-- Add more options as needed -->

    </form>

    <div id="statusMessage" style="margin-top: 10px;margin-bottom: 10px;"></div>

    <button id="clearDataButton">Clear Selected Data</button>

    <script src="popup.js"></script>

</body>

</html>


______________________________________________________________________________

popup.js

______________________________________________________________________________




document.addEventListener('DOMContentLoaded', function () {

    var selectAllCheckbox = document.getElementById('selectAll');

    var otherCheckboxes = document.querySelectorAll('#dataOptions input[type="checkbox"]:not(#selectAll)');

    var clearDataButton = document.getElementById('clearDataButton');

    var statusMessage = document.getElementById('statusMessage');

    var checkboxes = document.querySelectorAll('#dataOptions input[type="checkbox"]');


    selectAllCheckbox.addEventListener('change', function () {

        checkboxes.forEach(checkbox => {

            checkbox.checked = this.checked;

            checkbox.parentElement.classList.remove('cleared'); // Remove cleared class if needed

            document.getElementById('statusMessage').innerHTML = ''

        });

    });


    checkboxes.forEach(function (checkbox) {

        checkbox.addEventListener('change', function () {

            // If any checkbox is unchecked, uncheck the selectAllCheckbox

            if (!this.checked) {

                selectAllCheckbox.checked = false;

            }

        });

    });


    clearDataButton.addEventListener('click', function () {


        // Check if any checkbox is selected

        var isAnyCheckboxSelected = Array.from(checkboxes).some(checkbox => checkbox.checked);


        if (!isAnyCheckboxSelected) {

            // Show 'nothing selected' message

            statusMessage.textContent = "No selection(s) found!";

            statusMessage.style.color = "red";

            checkboxes.forEach(checkbox => {

                checkbox.parentElement.classList.remove('cleared');

            });

            return; // Exit the function

        }


        var options = {

            cache: document.getElementById('cache').checked,

            cookies: document.getElementById('cookies').checked,

            history: document.getElementById('history').checked,

            fileSystems: document.getElementById('fileSystems').checked,

            indexedDB: document.getElementById('indexedDB').checked,

            localStorage: document.getElementById('localStorage').checked,

            serviceWorkers: document.getElementById('serviceWorkers').checked

            // ... add more options as needed

        };


        chrome.runtime.sendMessage({ action: "clearData", options: options });

        // document.getElementById('statusMessage').textContent = "Selected data cleared from your browser!";

        updateStatusMessage();

        document.getElementById('statusMessage').style.color = "red";

        var checkedItems = document.querySelectorAll('#dataOptions input[type="checkbox"]:checked:not(#selectAll)');


        checkboxes.forEach(checkbox => {

            checkbox.parentElement.classList.remove('cleared');

        });


        checkedItems.forEach(item => {

            item.parentElement.classList.add('cleared');

        });


    });

});



function updateStatusMessage() {

    var now = new Date();

    var options = {

        year: 'numeric', month: 'numeric', day: 'numeric',

        hour: 'numeric', minute: 'numeric', second: 'numeric',

        timeZoneName: 'short'

    };

    var dateString = new Intl.DateTimeFormat('en-US', options).format(now);


    var message = "Selected data cleared from your browser<br>" + dateString;

    document.getElementById('statusMessage').innerHTML = message;

}


______________________________________________________________________________


Thursday, 9 November 2023

XDEBUG -- php.ini file


Xdebug: Support — Tailored Installation Instructions

zend_extension = xdebug

xdebug.mode=debug

xdebug.default_enable=1

xdebug.start_start_with_request=yes


Enables Xdebug and Step Debugger in VS Code



Sunday, 5 November 2023

csv upload in php

 



<!DOCTYPE html>
<html>
<head>
    <title>CSV Upload and Database Insert</title>
</head>
<body>
    <form action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']) ?>" method="post" enctype="multipart/form-data">
        <input type="file" name="csv_file">
        <input type="submit" name="submit" value="Upload CSV">
    </form>
</body>
</html>


<?php
error_reporting(0);
if ($_POST['submit']) {    
    if (isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])) {

        // Database connection
        $db_host = '127.0.0.1';
        $db_user = 'test';
        $db_pass = 'test123';
        $db_name = 'test';
        $db_port = '3306';

        $conn = new mysqli($db_host, $db_user, $db_pass, $db_name, $db_port);

        // $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name, $db_port);

        if ($conn->connect_errno) {
            echo "Failed to connect to MySQL: " . $mysqli->connect_error;
            exit();

        }

        echo "<br>database connection successful";
        // Get the uploaded file
        $csv_file = $_FILES['csv_file']['tmp_name'];

        // Read the CSV file
        $csv_data = file_get_contents($csv_file);
        $csv_rows = explode("\n", $csv_data);

        // Loop through the CSV data and insert into the database
        $sql = "TRUNCATE TABLE csv_table;";
        $conn->query($sql);
        foreach ($csv_rows as $row) {
            $row_data = str_getcsv($row);

            // Assuming the CSV has two columns (change as needed)
            $column1 = $conn->real_escape_string($row_data[0]);
            $column2 = $conn->real_escape_string($row_data[1]);

            // Insert data into the database table (change "your_table_name" to your table name)
            $sql = "INSERT INTO csv_table (value1, value2) VALUES ('$column1', '$column2');";
            $conn->query($sql);
        }

        // Close the database connection
        $conn->close();
        echo "<br> CSV data has been successfully uploaded and inserted into the database.";
    } else {
        echo "Please select a valid CSV file.";
    }
}

?>

Wednesday, 26 April 2023

Peoplesoft Purchase Order Process using GHX system


Peoplesoft Purchase Order Process using GHX system

1. The user logs into the PeopleSoft procurement system and selects the option to access the supplier catalog using punchout.

2. The user is redirected to the supplier's website within the PeopleSoft system and can browse the catalog and select items to purchase.

3. When the user adds items to their cart, the supplier's website generates a shopping cart file containing details about the items and their pricing.

4. The shopping cart file is sent back to PeopleSoft through the punchout connection and is converted into a requisition within the PeopleSoft system.

5. The requisition is then routed for approval according to the company's procurement policies and workflows.

6. Once the requisition is approved, the purchase order is created within the PeopleSoft system.

7. The purchase order is then transmitted to the supplier through the GHX platform, which provides a secure, standardized method of exchanging electronic documents between trading partners.

8. The supplier receives the purchase order through GHX and can begin processing the order.

9. The supplier can then send an electronic invoice back to the buyer through the GHX platform, which can be automatically matched with the purchase order within the PeopleSoft system.

By using the punchout process in PeopleSoft and the GHX platform, companies can streamline the procurement process and reduce errors associated with manual data entry and document processing. This can result in faster order processing times, improved accuracy, and better visibility into transaction status, allowing companies to improve overall supply chain management.


 Here are some of the common documents that may be involved in the PeopleSoft PO process, along with their corresponding EDI document numbers:

1. Purchase Order (PO) - The PO document is used to formally request goods or services from a supplier and typically includes details such as item descriptions, quantities, pricing, and delivery dates. The EDI document number for the PO is typically 850.

2. Purchase Order Acknowledgment (POA) - The POA document is used by the supplier to confirm that they have received and accepted the PO. The POA typically includes details such as the PO number, supplier information, and confirmation of the items and quantities ordered. The EDI document number for the POA is typically 855.

3. Advanced Shipping Notice (ASN) - The ASN document is used by the supplier to provide advance notification of a pending shipment, including details such as the carrier, shipment date, tracking information, and item and quantity information. The EDI document number for the ASN is typically 856.

4. Invoice - The invoice document is used by the supplier to request payment for goods or services that have been provided. The invoice typically includes details such as the supplier information, PO number, item and quantity information, and pricing details. The EDI document number for the invoice is typically 810.



These are just a few examples of the documents that may be involved in the PeopleSoft PO process. Depending on the specific business requirements and trading partner relationships, other documents such as purchase order change requests, order status updates, and payment remittance advice may also be used.



Electronic Data Interchange, or EDI, is a method of exchanging business documents between trading partners in a standardized electronic format. EDI enables companies to exchange documents electronically, such as Purchase Orders, Invoices, and Advance Shipping Notices, in a way that is more efficient, accurate, and secure than traditional paper-based methods.
EDI uses a standardized format for exchanging data, which allows information to be transferred seamlessly between different computer systems. The format is based on a set of EDI standards that have been developed by various organizations, including the American National Standards Institute (ANSI) and the United Nations.

EDI typically involves four key components: sender, receiver, translator, and communication channel. Here's how they work together:

1. Sender: The sender is the company that initiates the EDI transaction by sending a document, such as a Purchase Order, to a trading partner.
2. Receiver: The receiver is the company that receives the EDI document from the sender.
3. Translator: The translator is a software application that converts the EDI document into a format that can be understood by the receiver's computer system. The translator ensures that the data is formatted correctly and meets the necessary EDI standards.
4. Communication channel: The communication channel is the method used to transfer the EDI document from the sender to the receiver. This can be done through various means, such as direct point-to-point connections, VANs (Value-Added Networks), or AS2 (Applicability Statement 2) connections.

Benefits of EDI include:

1. Improved efficiency: EDI can help to automate manual processes, reducing the time and effort required to process transactions. This can result in faster order processing times, reduced errors, and improved supply chain management.
2. Cost savings: By eliminating paper-based processes, EDI can help to reduce the costs associated with printing, postage, and manual data entry.
3. Improved accuracy: EDI can help to reduce errors associated with manual data entry and document processing, resulting in more accurate data and fewer discrepancies.
4. Improved visibility: EDI can help to provide real-time visibility into transaction status, allowing companies to better track the progress of their orders and improve overall supply chain management.