amitlals
commited on
Commit
·
fc8c40e
0
Parent(s):
Initial commit: SAP Finance Dashboard with RPT-1-OSS Model
Browse files- Gradio-based web application for SAP finance data analysis
- Integration with SAP-RPT-1-OSS model for predictions
- Synthetic data generation for GL accounts, financial statements, and sales orders
- OData connector for live SAP data
- Interactive visualizations with Plotly
- Playground tab for custom model training
- Support for classification and regression tasks
- .env.example +15 -0
- .github/workflows/deploy.yml +127 -0
- .gitignore +59 -0
- README.md +170 -0
- app.py +451 -0
- app_gradio.py +1422 -0
- data/synthetic_financial_statements.csv +13 -0
- data/synthetic_gl_accounts.csv +1001 -0
- data/synthetic_sales_orders.csv +501 -0
- requirements.txt +13 -0
- utils/__init__.py +2 -0
- utils/data_generator.py +219 -0
- utils/odata_connector.py +251 -0
- utils/playground.py +428 -0
- utils/visualizations.py +502 -0
.env.example
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SAP OData Connection Settings
|
| 2 |
+
# Copy this file to .env and fill in your actual credentials
|
| 3 |
+
|
| 4 |
+
# SAP Server Configuration
|
| 5 |
+
SAP_USERNAME=your_sap_username
|
| 6 |
+
SAP_PASSWORD=your_sap_password
|
| 7 |
+
SAP_SERVER=https://sapes5.sapdevcenter.com/
|
| 8 |
+
SAP_ODATA_USER=your_odata_username
|
| 9 |
+
SAP_ODATA_PASSWORD=your_odata_password
|
| 10 |
+
SAP_CLIENT=002
|
| 11 |
+
SAP_LANGUAGE=EN
|
| 12 |
+
|
| 13 |
+
# Hugging Face Authentication
|
| 14 |
+
# Get your token from: https://huggingface.co/settings/tokens
|
| 15 |
+
HUGGINGFACE_TOKEN=your_huggingface_token_here
|
.github/workflows/deploy.yml
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Deploy to GitHub Pages
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches:
|
| 6 |
+
- main
|
| 7 |
+
workflow_dispatch:
|
| 8 |
+
|
| 9 |
+
permissions:
|
| 10 |
+
contents: read
|
| 11 |
+
pages: write
|
| 12 |
+
id-token: write
|
| 13 |
+
|
| 14 |
+
concurrency:
|
| 15 |
+
group: "pages"
|
| 16 |
+
cancel-in-progress: false
|
| 17 |
+
|
| 18 |
+
jobs:
|
| 19 |
+
build:
|
| 20 |
+
runs-on: ubuntu-latest
|
| 21 |
+
steps:
|
| 22 |
+
- name: Checkout
|
| 23 |
+
uses: actions/checkout@v4
|
| 24 |
+
|
| 25 |
+
- name: Set up Python
|
| 26 |
+
uses: actions/setup-python@v4
|
| 27 |
+
with:
|
| 28 |
+
python-version: '3.11'
|
| 29 |
+
|
| 30 |
+
- name: Install dependencies
|
| 31 |
+
run: |
|
| 32 |
+
python -m pip install --upgrade pip
|
| 33 |
+
pip install -r requirements.txt
|
| 34 |
+
pip install git+https://github.com/SAP-samples/sap-rpt-1-oss
|
| 35 |
+
|
| 36 |
+
- name: Generate synthetic data
|
| 37 |
+
run: |
|
| 38 |
+
python -c "from utils.data_generator import generate_all_datasets; generate_all_datasets()"
|
| 39 |
+
|
| 40 |
+
- name: Setup Pages
|
| 41 |
+
uses: actions/configure-pages@v3
|
| 42 |
+
|
| 43 |
+
- name: Build documentation
|
| 44 |
+
run: |
|
| 45 |
+
# Create a simple HTML page for GitHub Pages
|
| 46 |
+
mkdir -p _site
|
| 47 |
+
cat > _site/index.html << 'EOF'
|
| 48 |
+
<!DOCTYPE html>
|
| 49 |
+
<html>
|
| 50 |
+
<head>
|
| 51 |
+
<title>SAP Finance Dashboard with RPT-1-OSS</title>
|
| 52 |
+
<meta charset="utf-8">
|
| 53 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 54 |
+
<style>
|
| 55 |
+
body {
|
| 56 |
+
font-family: Arial, sans-serif;
|
| 57 |
+
max-width: 800px;
|
| 58 |
+
margin: 50px auto;
|
| 59 |
+
padding: 20px;
|
| 60 |
+
line-height: 1.6;
|
| 61 |
+
}
|
| 62 |
+
h1 { color: #2c3e50; }
|
| 63 |
+
.info-box {
|
| 64 |
+
background: #f8f9fa;
|
| 65 |
+
padding: 20px;
|
| 66 |
+
border-radius: 8px;
|
| 67 |
+
margin: 20px 0;
|
| 68 |
+
}
|
| 69 |
+
code {
|
| 70 |
+
background: #e9ecef;
|
| 71 |
+
padding: 2px 6px;
|
| 72 |
+
border-radius: 3px;
|
| 73 |
+
}
|
| 74 |
+
</style>
|
| 75 |
+
</head>
|
| 76 |
+
<body>
|
| 77 |
+
<h1>SAP Finance Dashboard with RPT-1-OSS</h1>
|
| 78 |
+
<div class="info-box">
|
| 79 |
+
<h2>About</h2>
|
| 80 |
+
<p>This is a Python-based financial dashboard application built with Mesop that integrates the SAP-RPT-1-OSS model for predictive analysis.</p>
|
| 81 |
+
</div>
|
| 82 |
+
<div class="info-box">
|
| 83 |
+
<h2>Running Locally</h2>
|
| 84 |
+
<p>To run this application locally:</p>
|
| 85 |
+
<ol>
|
| 86 |
+
<li>Clone the repository</li>
|
| 87 |
+
<li>Install dependencies: <code>pip install -r requirements.txt</code></li>
|
| 88 |
+
<li>Install SAP-RPT-OSS: <code>pip install git+https://github.com/SAP-samples/sap-rpt-1-oss</code></li>
|
| 89 |
+
<li>Set up environment variables (see README.md)</li>
|
| 90 |
+
<li>Run: <code>mesop app.py</code></li>
|
| 91 |
+
</ol>
|
| 92 |
+
</div>
|
| 93 |
+
<div class="info-box">
|
| 94 |
+
<h2>Deployment</h2>
|
| 95 |
+
<p>Since Mesop requires a Python backend, this application cannot run directly on GitHub Pages. Consider deploying to:</p>
|
| 96 |
+
<ul>
|
| 97 |
+
<li>Streamlit Cloud</li>
|
| 98 |
+
<li>Heroku</li>
|
| 99 |
+
<li>Railway</li>
|
| 100 |
+
<li>Render</li>
|
| 101 |
+
<li>Or use GitHub Actions to run as a service</li>
|
| 102 |
+
</ul>
|
| 103 |
+
</div>
|
| 104 |
+
<div class="info-box">
|
| 105 |
+
<h2>Documentation</h2>
|
| 106 |
+
<p>See <code>README.md</code> for full documentation and setup instructions.</p>
|
| 107 |
+
</div>
|
| 108 |
+
</body>
|
| 109 |
+
</html>
|
| 110 |
+
EOF
|
| 111 |
+
|
| 112 |
+
- name: Upload artifact
|
| 113 |
+
uses: actions/upload-pages-artifact@v2
|
| 114 |
+
with:
|
| 115 |
+
path: '_site'
|
| 116 |
+
|
| 117 |
+
deploy:
|
| 118 |
+
environment:
|
| 119 |
+
name: github-pages
|
| 120 |
+
url: ${{ steps.deployment.outputs.page_url }}
|
| 121 |
+
runs-on: ubuntu-latest
|
| 122 |
+
needs: build
|
| 123 |
+
steps:
|
| 124 |
+
- name: Deploy to GitHub Pages
|
| 125 |
+
id: deployment
|
| 126 |
+
uses: actions/deploy-pages@v2
|
| 127 |
+
|
.gitignore
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
*$py.class
|
| 5 |
+
*.so
|
| 6 |
+
.Python
|
| 7 |
+
build/
|
| 8 |
+
develop-eggs/
|
| 9 |
+
dist/
|
| 10 |
+
downloads/
|
| 11 |
+
eggs/
|
| 12 |
+
.eggs/
|
| 13 |
+
lib/
|
| 14 |
+
lib64/
|
| 15 |
+
parts/
|
| 16 |
+
sdist/
|
| 17 |
+
var/
|
| 18 |
+
wheels/
|
| 19 |
+
*.egg-info/
|
| 20 |
+
.installed.cfg
|
| 21 |
+
*.egg
|
| 22 |
+
|
| 23 |
+
# Virtual Environment
|
| 24 |
+
venv/
|
| 25 |
+
env/
|
| 26 |
+
ENV/
|
| 27 |
+
.venv
|
| 28 |
+
|
| 29 |
+
# IDE
|
| 30 |
+
.vscode/
|
| 31 |
+
.idea/
|
| 32 |
+
*.swp
|
| 33 |
+
*.swo
|
| 34 |
+
*~
|
| 35 |
+
|
| 36 |
+
# Environment variables
|
| 37 |
+
.env
|
| 38 |
+
.env.local
|
| 39 |
+
|
| 40 |
+
# Model cache
|
| 41 |
+
.cache/
|
| 42 |
+
models/
|
| 43 |
+
*.pth
|
| 44 |
+
*.pt
|
| 45 |
+
*.ckpt
|
| 46 |
+
|
| 47 |
+
# Data files (optional - uncomment if you don't want to track data)
|
| 48 |
+
# data/*.csv
|
| 49 |
+
|
| 50 |
+
# OS
|
| 51 |
+
.DS_Store
|
| 52 |
+
Thumbs.db
|
| 53 |
+
|
| 54 |
+
# Jupyter Notebook
|
| 55 |
+
.ipynb_checkpoints
|
| 56 |
+
|
| 57 |
+
# Mesop
|
| 58 |
+
.mesop/
|
| 59 |
+
|
README.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SAP Finance Dashboard with RPT-1-OSS Model
|
| 2 |
+
|
| 3 |
+
A comprehensive financial dashboard application built with Gradio that integrates the SAP-RPT-1-OSS model for predictive analysis on SAP finance datasets. Features include synthetic data generation, interactive visualizations, OData connectivity, AI-powered insights, and a playground for training custom models.
|
| 4 |
+
|
| 5 |
+
## Features
|
| 6 |
+
|
| 7 |
+
- **Multiple Synthetic SAP Finance Datasets**: General Ledger accounts, Financial Statements (P&L, Balance Sheet), and Sales Orders
|
| 8 |
+
- **Data Upload**: Upload custom CSV, Parquet, or JSON datasets for analysis
|
| 9 |
+
- **Interactive Visualizations**: Financial charts and graphs using Plotly
|
| 10 |
+
- **SAP-RPT-1-OSS Model Integration**: AI-powered predictions and analysis
|
| 11 |
+
- **Live OData Connection**: Connect to SAP systems to fetch real-time sales order data
|
| 12 |
+
- **Playground Tab**: Upload datasets, configure model parameters, train, and download predictions
|
| 13 |
+
- **Modern UI**: Built with Gradio, a Python-based web framework
|
| 14 |
+
|
| 15 |
+
## Installation
|
| 16 |
+
|
| 17 |
+
### Prerequisites
|
| 18 |
+
|
| 19 |
+
- Python 3.11 or higher
|
| 20 |
+
- Hugging Face account (for model access)
|
| 21 |
+
- SAP OData credentials (optional, for live data connection)
|
| 22 |
+
|
| 23 |
+
### Setup Steps
|
| 24 |
+
|
| 25 |
+
1. **Clone the repository**:
|
| 26 |
+
```bash
|
| 27 |
+
git clone <repository-url>
|
| 28 |
+
cd SAP-RPT-1-OSS-App
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
2. **Create a virtual environment**:
|
| 32 |
+
```bash
|
| 33 |
+
python -m venv venv
|
| 34 |
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
3. **Install dependencies**:
|
| 38 |
+
```bash
|
| 39 |
+
pip install -r requirements.txt
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
4. **Install SAP-RPT-OSS package**:
|
| 43 |
+
```bash
|
| 44 |
+
pip install git+https://github.com/SAP-samples/sap-rpt-1-oss
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
5. **Set up environment variables**:
|
| 48 |
+
- Copy `.env.example` to `.env`
|
| 49 |
+
- Fill in your SAP OData credentials
|
| 50 |
+
- Add your Hugging Face token for model access
|
| 51 |
+
|
| 52 |
+
6. **Authenticate with Hugging Face**:
|
| 53 |
+
```bash
|
| 54 |
+
pip install huggingface_hub
|
| 55 |
+
huggingface-cli login
|
| 56 |
+
```
|
| 57 |
+
Or set the `HUGGINGFACE_TOKEN` in your `.env` file.
|
| 58 |
+
|
| 59 |
+
7. **Generate synthetic data** (optional, if not already generated):
|
| 60 |
+
```bash
|
| 61 |
+
python -c "from utils.data_generator import generate_all_datasets; generate_all_datasets()"
|
| 62 |
+
```
|
| 63 |
+
|
| 64 |
+
## Usage
|
| 65 |
+
|
| 66 |
+
### Running the Application
|
| 67 |
+
|
| 68 |
+
Start the Gradio application:
|
| 69 |
+
|
| 70 |
+
```bash
|
| 71 |
+
python app_gradio.py
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
The application will be available at `http://localhost:7862` (default Gradio port).
|
| 75 |
+
|
| 76 |
+
### Application Tabs
|
| 77 |
+
|
| 78 |
+
1. **Dashboard**: Overview with key financial metrics and visualizations
|
| 79 |
+
2. **Data Explorer**: Browse and filter datasets (GL, Financial Statements, Sales Orders)
|
| 80 |
+
3. **Upload**: Upload custom CSV datasets for analysis
|
| 81 |
+
4. **Predictions**: Use SAP-RPT-1-OSS model for predictions and analysis with pre-configured scenarios
|
| 82 |
+
5. **OData**: Connect to SAP OData services and fetch live data
|
| 83 |
+
6. **Playground**: Upload datasets, configure model parameters (task type, target column, test split, context size, bagging, GPU), train models, and download predictions
|
| 84 |
+
|
| 85 |
+
## SAP OData Connection Setup
|
| 86 |
+
|
| 87 |
+
1. Set the following environment variables in your `.env` file:
|
| 88 |
+
- `SAP_USERNAME`: Your SAP username
|
| 89 |
+
- `SAP_PASSWORD`: Your SAP password
|
| 90 |
+
- `SAP_SERVER`: SAP server URL (default: `https://sapes5.sapdevcenter.com/`)
|
| 91 |
+
- `SAP_CLIENT`: SAP client number (default: `002`)
|
| 92 |
+
|
| 93 |
+
2. The OData connector uses the base URL:
|
| 94 |
+
`https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC`
|
| 95 |
+
|
| 96 |
+
3. Available endpoints:
|
| 97 |
+
- Sales Orders: `SalesOrderSet`
|
| 98 |
+
- Products: `ProductSet`
|
| 99 |
+
- Line Items: `SalesOrderLineItemSet`
|
| 100 |
+
- Business Partners: `BusinessPartnerSet`
|
| 101 |
+
|
| 102 |
+
## Model Configuration
|
| 103 |
+
|
| 104 |
+
The SAP-RPT-1-OSS model supports both classification and regression tasks. For best performance:
|
| 105 |
+
|
| 106 |
+
- **Recommended**: GPU with at least 80 GB memory, context size 8192, bagging factor 8
|
| 107 |
+
- **Lightweight**: CPU with context size 2048, bagging factor 1
|
| 108 |
+
|
| 109 |
+
The application automatically detects available resources and adjusts settings accordingly.
|
| 110 |
+
|
| 111 |
+
## Deployment
|
| 112 |
+
|
| 113 |
+
### GitHub Pages
|
| 114 |
+
|
| 115 |
+
Since Gradio requires a Python backend, GitHub Pages deployment requires alternative approaches:
|
| 116 |
+
|
| 117 |
+
1. **GitHub Actions**: Set up a workflow to run the Gradio app as a service
|
| 118 |
+
2. **Alternative Hosting**: Deploy to platforms that support Python web apps:
|
| 119 |
+
- Hugging Face Spaces (recommended for Gradio apps)
|
| 120 |
+
- Streamlit Cloud
|
| 121 |
+
- Heroku
|
| 122 |
+
- Railway
|
| 123 |
+
- Render
|
| 124 |
+
|
| 125 |
+
### Deploy to Hugging Face Spaces
|
| 126 |
+
|
| 127 |
+
The easiest way to deploy this Gradio app is using Hugging Face Spaces:
|
| 128 |
+
|
| 129 |
+
1. Create a new Space on [Hugging Face Spaces](https://huggingface.co/spaces)
|
| 130 |
+
2. Select "Gradio" as the SDK
|
| 131 |
+
3. Push this repository to your Space
|
| 132 |
+
4. Add your `HUGGINGFACE_TOKEN` as a secret in Space settings
|
| 133 |
+
5. The app will automatically deploy
|
| 134 |
+
|
| 135 |
+
See `.github/workflows/deploy.yml` for deployment configuration examples.
|
| 136 |
+
|
| 137 |
+
## Project Structure
|
| 138 |
+
|
| 139 |
+
```
|
| 140 |
+
SAP-RPT-1-OSS-App/
|
| 141 |
+
├── app_gradio.py # Main Gradio application
|
| 142 |
+
├── models/
|
| 143 |
+
│ └── rpt_model.py # SAP-RPT-1-OSS model wrapper
|
| 144 |
+
├── data/
|
| 145 |
+
│ ├── synthetic_gl_accounts.csv
|
| 146 |
+
│ ├── synthetic_financial_statements.csv
|
| 147 |
+
│ └── synthetic_sales_orders.csv
|
| 148 |
+
├── utils/
|
| 149 |
+
│ ├── data_generator.py # Generate synthetic SAP finance data
|
| 150 |
+
│ ├── visualizations.py # Chart generation functions
|
| 151 |
+
│ ├── odata_connector.py # OData connection utilities
|
| 152 |
+
│ └── playground.py # Playground utilities for model training
|
| 153 |
+
├── requirements.txt
|
| 154 |
+
├── README.md
|
| 155 |
+
└── .env.example
|
| 156 |
+
```
|
| 157 |
+
|
| 158 |
+
## License
|
| 159 |
+
|
| 160 |
+
This project is licensed under the Apache Software License, version 2.0.
|
| 161 |
+
|
| 162 |
+
## Support
|
| 163 |
+
|
| 164 |
+
For issues or questions, please create an issue in this repository.
|
| 165 |
+
|
| 166 |
+
## Acknowledgments
|
| 167 |
+
|
| 168 |
+
- SAP-RPT-1-OSS model: [Hugging Face](https://huggingface.co/SAP/sap-rpt-1-oss)
|
| 169 |
+
- Gradio framework: [Gradio Documentation](https://www.gradio.app/docs/)
|
| 170 |
+
|
app.py
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
SAP Finance Dashboard with RPT-1-OSS Model
|
| 3 |
+
|
| 4 |
+
Main Mesop application with multiple pages:
|
| 5 |
+
- Dashboard: Overview with metrics and charts
|
| 6 |
+
- Data Explorer: Browse datasets
|
| 7 |
+
- Upload: Upload custom datasets
|
| 8 |
+
- Predictions: AI-powered predictions using SAP-RPT-1-OSS
|
| 9 |
+
- OData: Connect to SAP OData services
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
import os
|
| 13 |
+
import mesop as me
|
| 14 |
+
import pandas as pd
|
| 15 |
+
import numpy as np
|
| 16 |
+
from pathlib import Path
|
| 17 |
+
import json
|
| 18 |
+
import base64
|
| 19 |
+
from typing import Optional, Dict, Any
|
| 20 |
+
import plotly.graph_objects as go
|
| 21 |
+
import plotly.io as pio
|
| 22 |
+
|
| 23 |
+
# Import utilities
|
| 24 |
+
from utils.data_generator import generate_all_datasets
|
| 25 |
+
from utils.visualizations import (
|
| 26 |
+
create_revenue_expense_chart,
|
| 27 |
+
create_balance_sheet_chart,
|
| 28 |
+
create_gl_summary_chart,
|
| 29 |
+
create_sales_analytics_chart,
|
| 30 |
+
create_sales_trend_chart,
|
| 31 |
+
get_summary_metrics
|
| 32 |
+
)
|
| 33 |
+
from utils.odata_connector import SAPFinanceConnector
|
| 34 |
+
from models.rpt_model import RPTModelWrapper, create_model
|
| 35 |
+
|
| 36 |
+
# Global state
|
| 37 |
+
from dataclasses import field
|
| 38 |
+
|
| 39 |
+
@me.stateclass
|
| 40 |
+
class State:
|
| 41 |
+
gl_data: pd.DataFrame = field(default_factory=pd.DataFrame)
|
| 42 |
+
financial_data: pd.DataFrame = field(default_factory=pd.DataFrame)
|
| 43 |
+
sales_data: pd.DataFrame = field(default_factory=pd.DataFrame)
|
| 44 |
+
uploaded_data: pd.DataFrame = field(default_factory=pd.DataFrame)
|
| 45 |
+
current_dataset_type: str = ""
|
| 46 |
+
odata_connector: Optional[SAPFinanceConnector] = None
|
| 47 |
+
odata_connected: bool = False
|
| 48 |
+
odata_data: pd.DataFrame = field(default_factory=pd.DataFrame)
|
| 49 |
+
model_wrapper: Optional[RPTModelWrapper] = None
|
| 50 |
+
predictions: Optional[np.ndarray] = None
|
| 51 |
+
prediction_proba: Optional[np.ndarray] = None
|
| 52 |
+
connection_message: str = ""
|
| 53 |
+
fetch_message: str = ""
|
| 54 |
+
model_initialized: bool = False
|
| 55 |
+
model_trained: bool = False
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def load_datasets(state: State):
|
| 59 |
+
"""Load synthetic datasets if they exist."""
|
| 60 |
+
data_dir = Path("data")
|
| 61 |
+
|
| 62 |
+
if (data_dir / "synthetic_gl_accounts.csv").exists():
|
| 63 |
+
state.gl_data = pd.read_csv(data_dir / "synthetic_gl_accounts.csv")
|
| 64 |
+
|
| 65 |
+
if (data_dir / "synthetic_financial_statements.csv").exists():
|
| 66 |
+
state.financial_data = pd.read_csv(data_dir / "synthetic_financial_statements.csv")
|
| 67 |
+
|
| 68 |
+
if (data_dir / "synthetic_sales_orders.csv").exists():
|
| 69 |
+
state.sales_data = pd.read_csv(data_dir / "synthetic_sales_orders.csv")
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def plotly_to_html(fig_dict: Dict[str, Any]) -> str:
|
| 73 |
+
"""Convert Plotly figure dict to HTML string."""
|
| 74 |
+
if not fig_dict:
|
| 75 |
+
return "<p>No chart data available</p>"
|
| 76 |
+
|
| 77 |
+
try:
|
| 78 |
+
fig = go.Figure(fig_dict)
|
| 79 |
+
html_str = pio.to_html(fig, include_plotlyjs='cdn', div_id="plotly-div")
|
| 80 |
+
return html_str
|
| 81 |
+
except Exception as e:
|
| 82 |
+
return f"<p>Error rendering chart: {str(e)}</p>"
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
@me.page(path="/", title="SAP Finance Dashboard")
|
| 86 |
+
def dashboard_page():
|
| 87 |
+
"""Main dashboard page with overview metrics and charts."""
|
| 88 |
+
state = me.state(State)
|
| 89 |
+
|
| 90 |
+
me.text("SAP Finance Dashboard", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 91 |
+
|
| 92 |
+
# Load datasets if not loaded
|
| 93 |
+
if state.gl_data.empty and state.financial_data.empty and state.sales_data.empty:
|
| 94 |
+
load_datasets(state)
|
| 95 |
+
|
| 96 |
+
# Generate datasets if they don't exist
|
| 97 |
+
if state.gl_data.empty or state.financial_data.empty or state.sales_data.empty:
|
| 98 |
+
with me.box(style=me.Style(padding=16, background="#fff3cd", border_radius=8, margin=me.Margin(bottom=16))):
|
| 99 |
+
me.text("Generating synthetic datasets...", style=me.Style(color="#856404"))
|
| 100 |
+
generate_all_datasets()
|
| 101 |
+
load_datasets(state)
|
| 102 |
+
|
| 103 |
+
# Summary metrics
|
| 104 |
+
with me.box(style=me.Style(display="grid", grid_template_columns="repeat(4, 1fr)", gap=16, margin=me.Margin(bottom=24))):
|
| 105 |
+
if not state.gl_data.empty:
|
| 106 |
+
gl_metrics = get_summary_metrics(state.gl_data, "gl")
|
| 107 |
+
with me.box(style=me.Style(padding=16, background="#f8f9fa", border_radius=8)):
|
| 108 |
+
me.text("GL Transactions", style=me.Style(font_weight="bold"))
|
| 109 |
+
me.text(f"{gl_metrics.get('Total Transactions', 0):,}")
|
| 110 |
+
|
| 111 |
+
if not state.financial_data.empty:
|
| 112 |
+
fin_metrics = get_summary_metrics(state.financial_data, "financial")
|
| 113 |
+
with me.box(style=me.Style(padding=16, background="#f8f9fa", border_radius=8)):
|
| 114 |
+
me.text("Latest Revenue", style=me.Style(font_weight="bold"))
|
| 115 |
+
me.text(f"${fin_metrics.get('Latest Revenue', 0):,.2f}")
|
| 116 |
+
|
| 117 |
+
if not state.sales_data.empty:
|
| 118 |
+
sales_metrics = get_summary_metrics(state.sales_data, "sales")
|
| 119 |
+
with me.box(style=me.Style(padding=16, background="#f8f9fa", border_radius=8)):
|
| 120 |
+
me.text("Total Sales", style=me.Style(font_weight="bold"))
|
| 121 |
+
me.text(f"${sales_metrics.get('Total Sales', 0):,.2f}")
|
| 122 |
+
|
| 123 |
+
with me.box(style=me.Style(padding=16, background="#f8f9fa", border_radius=8)):
|
| 124 |
+
me.text("Datasets", style=me.Style(font_weight="bold"))
|
| 125 |
+
count = sum([
|
| 126 |
+
not state.gl_data.empty,
|
| 127 |
+
not state.financial_data.empty,
|
| 128 |
+
not state.sales_data.empty,
|
| 129 |
+
not state.uploaded_data.empty
|
| 130 |
+
])
|
| 131 |
+
me.text(f"{count} loaded")
|
| 132 |
+
|
| 133 |
+
# Charts
|
| 134 |
+
if not state.financial_data.empty:
|
| 135 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=24))):
|
| 136 |
+
me.text("Financial Trends", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 137 |
+
chart_data = create_revenue_expense_chart(state.financial_data)
|
| 138 |
+
if chart_data:
|
| 139 |
+
html_chart = plotly_to_html(chart_data)
|
| 140 |
+
me.html(html_chart)
|
| 141 |
+
|
| 142 |
+
if not state.financial_data.empty:
|
| 143 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=24))):
|
| 144 |
+
me.text("Balance Sheet", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 145 |
+
chart_data = create_balance_sheet_chart(state.financial_data)
|
| 146 |
+
if chart_data:
|
| 147 |
+
html_chart = plotly_to_html(chart_data)
|
| 148 |
+
me.html(html_chart)
|
| 149 |
+
|
| 150 |
+
if not state.sales_data.empty:
|
| 151 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=24))):
|
| 152 |
+
me.text("Sales Analytics", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 153 |
+
chart_data = create_sales_analytics_chart(state.sales_data)
|
| 154 |
+
if chart_data:
|
| 155 |
+
html_chart = plotly_to_html(chart_data)
|
| 156 |
+
me.html(html_chart)
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
@me.page(path="/explorer", title="Data Explorer")
|
| 160 |
+
def explorer_page():
|
| 161 |
+
"""Data explorer page to browse and filter datasets."""
|
| 162 |
+
state = me.state(State)
|
| 163 |
+
|
| 164 |
+
me.text("Data Explorer", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 165 |
+
|
| 166 |
+
# Dataset selector
|
| 167 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 168 |
+
me.text("Select Dataset:", style=me.Style(font_weight="bold", margin=me.Margin(bottom=8)))
|
| 169 |
+
dataset_options = [
|
| 170 |
+
("GL Accounts", "gl"),
|
| 171 |
+
("Financial Statements", "financial"),
|
| 172 |
+
("Sales Orders", "sales"),
|
| 173 |
+
("Uploaded Data", "uploaded")
|
| 174 |
+
]
|
| 175 |
+
|
| 176 |
+
me.select(
|
| 177 |
+
label="Dataset",
|
| 178 |
+
options=[me.SelectOption(label=label, value=value) for label, value in dataset_options],
|
| 179 |
+
on_selection_change=on_dataset_selection_change,
|
| 180 |
+
value=state.current_dataset_type
|
| 181 |
+
)
|
| 182 |
+
|
| 183 |
+
# Display selected dataset
|
| 184 |
+
if state.current_dataset_type:
|
| 185 |
+
display_dataset(state, state.current_dataset_type)
|
| 186 |
+
|
| 187 |
+
|
| 188 |
+
def on_dataset_selection_change(e: me.SelectSelectionChangeEvent):
|
| 189 |
+
"""Handle dataset selection change."""
|
| 190 |
+
state = me.state(State)
|
| 191 |
+
state.current_dataset_type = e.value
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
def display_dataset(state: State, dataset_type: str):
|
| 195 |
+
"""Display the selected dataset."""
|
| 196 |
+
if dataset_type == "gl" and not state.gl_data.empty:
|
| 197 |
+
df = state.gl_data
|
| 198 |
+
me.text(f"GL Accounts ({len(df)} records)", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 199 |
+
chart_data = create_gl_summary_chart(df)
|
| 200 |
+
if chart_data:
|
| 201 |
+
html_chart = plotly_to_html(chart_data)
|
| 202 |
+
me.html(html_chart)
|
| 203 |
+
me.table(data=df.head(100).to_dict("records"), style=me.Style(margin=me.Margin(top=16)))
|
| 204 |
+
|
| 205 |
+
elif dataset_type == "financial" and not state.financial_data.empty:
|
| 206 |
+
df = state.financial_data
|
| 207 |
+
me.text(f"Financial Statements ({len(df)} records)", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 208 |
+
chart_data = create_revenue_expense_chart(df)
|
| 209 |
+
if chart_data:
|
| 210 |
+
html_chart = plotly_to_html(chart_data)
|
| 211 |
+
me.html(html_chart)
|
| 212 |
+
me.table(data=df.to_dict("records"), style=me.Style(margin=me.Margin(top=16)))
|
| 213 |
+
|
| 214 |
+
elif dataset_type == "sales" and not state.sales_data.empty:
|
| 215 |
+
df = state.sales_data
|
| 216 |
+
me.text(f"Sales Orders ({len(df)} records)", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 217 |
+
chart_data = create_sales_trend_chart(df)
|
| 218 |
+
if chart_data:
|
| 219 |
+
html_chart = plotly_to_html(chart_data)
|
| 220 |
+
me.html(html_chart)
|
| 221 |
+
me.table(data=df.head(100).to_dict("records"), style=me.Style(margin=me.Margin(top=16)))
|
| 222 |
+
|
| 223 |
+
elif dataset_type == "uploaded" and not state.uploaded_data.empty:
|
| 224 |
+
df = state.uploaded_data
|
| 225 |
+
me.text(f"Uploaded Data ({len(df)} records)", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 226 |
+
me.table(data=df.head(100).to_dict("records"), style=me.Style(margin=me.Margin(top=16)))
|
| 227 |
+
|
| 228 |
+
else:
|
| 229 |
+
me.text("No data available for this dataset type.", style=me.Style(color="#dc3545"))
|
| 230 |
+
|
| 231 |
+
|
| 232 |
+
@me.page(path="/upload", title="Upload Data")
|
| 233 |
+
def upload_page():
|
| 234 |
+
"""Upload page for custom datasets."""
|
| 235 |
+
state = me.state(State)
|
| 236 |
+
|
| 237 |
+
me.text("Upload Dataset", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 238 |
+
|
| 239 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 240 |
+
me.text("Upload a CSV file to analyze:", style=me.Style(margin=me.Margin(bottom=8)))
|
| 241 |
+
me.file_upload(
|
| 242 |
+
label="Choose CSV File",
|
| 243 |
+
accept=".csv",
|
| 244 |
+
on_upload=handle_file_upload
|
| 245 |
+
)
|
| 246 |
+
|
| 247 |
+
if not state.uploaded_data.empty:
|
| 248 |
+
me.text("Uploaded Data Preview:", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(top=16, bottom=8)))
|
| 249 |
+
me.table(data=state.uploaded_data.head(50).to_dict("records"))
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
def handle_file_upload(e: me.UploadEvent):
|
| 253 |
+
"""Handle file upload."""
|
| 254 |
+
state = me.state(State)
|
| 255 |
+
try:
|
| 256 |
+
if e.files:
|
| 257 |
+
file = e.files[0]
|
| 258 |
+
df = pd.read_csv(file.getvalue())
|
| 259 |
+
state.uploaded_data = df
|
| 260 |
+
except Exception as ex:
|
| 261 |
+
pass
|
| 262 |
+
|
| 263 |
+
|
| 264 |
+
@me.page(path="/predictions", title="Predictions")
|
| 265 |
+
def predictions_page():
|
| 266 |
+
"""Predictions page using SAP-RPT-1-OSS model."""
|
| 267 |
+
state = me.state(State)
|
| 268 |
+
|
| 269 |
+
me.text("AI Predictions with SAP-RPT-1-OSS", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 270 |
+
|
| 271 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 272 |
+
me.text("Model Configuration", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 273 |
+
|
| 274 |
+
me.select(
|
| 275 |
+
label="Model Type",
|
| 276 |
+
options=[
|
| 277 |
+
me.SelectOption(label="Classifier", value="classifier"),
|
| 278 |
+
me.SelectOption(label="Regressor", value="regressor")
|
| 279 |
+
]
|
| 280 |
+
)
|
| 281 |
+
|
| 282 |
+
me.checkbox(label="Use GPU (requires 80GB memory)", checked=False)
|
| 283 |
+
|
| 284 |
+
me.button("Initialize Model", on_click=on_init_model)
|
| 285 |
+
|
| 286 |
+
if state.model_initialized:
|
| 287 |
+
me.text("Model initialized successfully!", style=me.Style(color="#28a745", margin=me.Margin(bottom=16)))
|
| 288 |
+
|
| 289 |
+
# Dataset selection for training
|
| 290 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 291 |
+
me.text("Select Training Data", style=me.Style(font_weight="bold", margin=me.Margin(bottom=8)))
|
| 292 |
+
dataset_options = [
|
| 293 |
+
("GL Accounts", "gl"),
|
| 294 |
+
("Financial Statements", "financial"),
|
| 295 |
+
("Sales Orders", "sales"),
|
| 296 |
+
("Uploaded Data", "uploaded")
|
| 297 |
+
]
|
| 298 |
+
|
| 299 |
+
me.select(
|
| 300 |
+
label="Dataset",
|
| 301 |
+
options=[me.SelectOption(label=label, value=value) for label, value in dataset_options]
|
| 302 |
+
)
|
| 303 |
+
|
| 304 |
+
me.button("Train Model", on_click=on_train_model)
|
| 305 |
+
|
| 306 |
+
if state.model_trained:
|
| 307 |
+
me.text("Model trained successfully!", style=me.Style(color="#28a745", margin=me.Margin(top=16)))
|
| 308 |
+
|
| 309 |
+
if state.predictions is not None:
|
| 310 |
+
me.text("Predictions:", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(top=16, bottom=8)))
|
| 311 |
+
me.text(str(state.predictions[:10])) # Show first 10 predictions
|
| 312 |
+
|
| 313 |
+
else:
|
| 314 |
+
with me.box(style=me.Style(padding=16, background="#fff3cd", border_radius=8)):
|
| 315 |
+
me.text("Please initialize the model first.", style=me.Style(color="#856404"))
|
| 316 |
+
|
| 317 |
+
|
| 318 |
+
def on_init_model(e: me.ClickEvent):
|
| 319 |
+
"""Initialize the model."""
|
| 320 |
+
state = me.state(State)
|
| 321 |
+
try:
|
| 322 |
+
state.model_wrapper = create_model(model_type="classifier", use_gpu=False)
|
| 323 |
+
state.model_initialized = True
|
| 324 |
+
except Exception as ex:
|
| 325 |
+
state.connection_message = f"Error initializing model: {str(ex)}"
|
| 326 |
+
|
| 327 |
+
|
| 328 |
+
def on_train_model(e: me.ClickEvent):
|
| 329 |
+
"""Train the model."""
|
| 330 |
+
state = me.state(State)
|
| 331 |
+
try:
|
| 332 |
+
if state.model_wrapper and not state.gl_data.empty:
|
| 333 |
+
# Simple example: use GL data
|
| 334 |
+
X = state.gl_data.select_dtypes(include=[np.number]).dropna()
|
| 335 |
+
if len(X) > 0:
|
| 336 |
+
# Create a simple target for classification
|
| 337 |
+
y = (X.iloc[:, 0] > X.iloc[:, 0].median()).astype(int)
|
| 338 |
+
state.model_wrapper.fit(X, y)
|
| 339 |
+
state.model_trained = True
|
| 340 |
+
except Exception as ex:
|
| 341 |
+
state.connection_message = f"Error training model: {str(ex)}"
|
| 342 |
+
|
| 343 |
+
|
| 344 |
+
@me.page(path="/odata", title="OData Connection")
|
| 345 |
+
def odata_page():
|
| 346 |
+
"""OData connection page for SAP data."""
|
| 347 |
+
state = me.state(State)
|
| 348 |
+
|
| 349 |
+
me.text("SAP OData Connection", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 350 |
+
|
| 351 |
+
# Connection status
|
| 352 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 353 |
+
if state.odata_connector is None:
|
| 354 |
+
state.odata_connector = SAPFinanceConnector()
|
| 355 |
+
|
| 356 |
+
me.button("Test Connection", on_click=on_test_odata_connection)
|
| 357 |
+
|
| 358 |
+
if state.connection_message:
|
| 359 |
+
color = "#28a745" if state.odata_connected else "#dc3545"
|
| 360 |
+
me.text(state.connection_message, style=me.Style(color=color, margin=me.Margin(top=8)))
|
| 361 |
+
elif state.odata_connected:
|
| 362 |
+
me.text("✓ Connected to SAP OData", style=me.Style(color="#28a745", margin=me.Margin(top=8)))
|
| 363 |
+
else:
|
| 364 |
+
me.text("Not connected", style=me.Style(color="#dc3545", margin=me.Margin(top=8)))
|
| 365 |
+
|
| 366 |
+
# Fetch options
|
| 367 |
+
if state.odata_connected:
|
| 368 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=16))):
|
| 369 |
+
me.text("Fetch Data", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(bottom=8)))
|
| 370 |
+
|
| 371 |
+
top_count = me.number_input(label="Number of records", value=100, min_value=1, max_value=1000)
|
| 372 |
+
|
| 373 |
+
with me.box(style=me.Style(display="grid", grid_template_columns="repeat(2, 1fr)", gap=8, margin=me.Margin(top=8))):
|
| 374 |
+
me.button("Fetch Sales Orders", on_click=lambda e: on_fetch_odata(e, "orders", top_count))
|
| 375 |
+
me.button("Fetch Products", on_click=lambda e: on_fetch_odata(e, "products", top_count))
|
| 376 |
+
me.button("Fetch Line Items", on_click=lambda e: on_fetch_odata(e, "line_items", top_count))
|
| 377 |
+
me.button("Fetch Partners", on_click=lambda e: on_fetch_odata(e, "partners", top_count))
|
| 378 |
+
|
| 379 |
+
if state.fetch_message:
|
| 380 |
+
me.text(state.fetch_message, style=me.Style(color="#28a745", margin=me.Margin(top=8)))
|
| 381 |
+
|
| 382 |
+
# Display fetched data
|
| 383 |
+
if not state.odata_data.empty:
|
| 384 |
+
me.text("Fetched Data:", style=me.Style(font_size=20, font_weight="bold", margin=me.Margin(top=16, bottom=8)))
|
| 385 |
+
me.table(data=state.odata_data.head(100).to_dict("records"))
|
| 386 |
+
|
| 387 |
+
|
| 388 |
+
def on_test_odata_connection(e: me.ClickEvent):
|
| 389 |
+
"""Test OData connection."""
|
| 390 |
+
state = me.state(State)
|
| 391 |
+
try:
|
| 392 |
+
if state.odata_connector is None:
|
| 393 |
+
state.odata_connector = SAPFinanceConnector()
|
| 394 |
+
|
| 395 |
+
connected, message = state.odata_connector.test_connection()
|
| 396 |
+
state.odata_connected = connected
|
| 397 |
+
state.connection_message = message
|
| 398 |
+
except Exception as ex:
|
| 399 |
+
state.connection_message = f"Error: {str(ex)}"
|
| 400 |
+
state.odata_connected = False
|
| 401 |
+
|
| 402 |
+
|
| 403 |
+
def on_fetch_odata(e: me.ClickEvent, entity_type: str, top: int):
|
| 404 |
+
"""Fetch data from OData service."""
|
| 405 |
+
state = me.state(State)
|
| 406 |
+
try:
|
| 407 |
+
if not state.odata_connected:
|
| 408 |
+
state.fetch_message = "Please connect first!"
|
| 409 |
+
return
|
| 410 |
+
|
| 411 |
+
if entity_type == "orders":
|
| 412 |
+
state.odata_data = state.odata_connector.fetch_orders_df(top)
|
| 413 |
+
elif entity_type == "products":
|
| 414 |
+
state.odata_data = state.odata_connector.fetch_products_df(top)
|
| 415 |
+
elif entity_type == "line_items":
|
| 416 |
+
state.odata_data = state.odata_connector.fetch_line_items_df(top)
|
| 417 |
+
elif entity_type == "partners":
|
| 418 |
+
state.odata_data = state.odata_connector.fetch_partners_df(top)
|
| 419 |
+
|
| 420 |
+
state.fetch_message = f"Fetched {len(state.odata_data)} records"
|
| 421 |
+
except Exception as ex:
|
| 422 |
+
state.fetch_message = f"Error fetching data: {str(ex)}"
|
| 423 |
+
|
| 424 |
+
|
| 425 |
+
# Navigation
|
| 426 |
+
@me.page(path="/nav", title="Navigation")
|
| 427 |
+
def nav_page():
|
| 428 |
+
"""Navigation page."""
|
| 429 |
+
me.text("Navigation", style=me.Style(font_size=32, font_weight="bold", margin=me.Margin(bottom=16)))
|
| 430 |
+
|
| 431 |
+
nav_links = [
|
| 432 |
+
("Dashboard", "/"),
|
| 433 |
+
("Data Explorer", "/explorer"),
|
| 434 |
+
("Upload", "/upload"),
|
| 435 |
+
("Predictions", "/predictions"),
|
| 436 |
+
("OData", "/odata")
|
| 437 |
+
]
|
| 438 |
+
|
| 439 |
+
for label, path in nav_links:
|
| 440 |
+
with me.box(style=me.Style(margin=me.Margin(bottom=8))):
|
| 441 |
+
me.link(label, path=path, style=me.Style(font_size=18, text_decoration="none"))
|
| 442 |
+
|
| 443 |
+
|
| 444 |
+
if __name__ == "__main__":
|
| 445 |
+
# Generate datasets if they don't exist
|
| 446 |
+
data_dir = Path("data")
|
| 447 |
+
if not (data_dir / "synthetic_gl_accounts.csv").exists():
|
| 448 |
+
generate_all_datasets()
|
| 449 |
+
|
| 450 |
+
me.run()
|
| 451 |
+
|
app_gradio.py
ADDED
|
@@ -0,0 +1,1422 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
SAP Finance Dashboard with RPT-1-OSS Model - Gradio Version
|
| 3 |
+
|
| 4 |
+
Main Gradio application with tabs:
|
| 5 |
+
- Dashboard: Overview with metrics and charts
|
| 6 |
+
- Data Explorer: Browse datasets
|
| 7 |
+
- Upload: Upload custom datasets
|
| 8 |
+
- Predictions: AI-powered predictions using SAP-RPT-1-OSS
|
| 9 |
+
- OData: Connect to SAP OData services
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
import gradio as gr
|
| 13 |
+
import pandas as pd
|
| 14 |
+
import numpy as np
|
| 15 |
+
from pathlib import Path
|
| 16 |
+
import plotly.graph_objects as go
|
| 17 |
+
from dotenv import load_dotenv
|
| 18 |
+
|
| 19 |
+
# Import utilities
|
| 20 |
+
from utils.data_generator import generate_all_datasets
|
| 21 |
+
from utils.visualizations import (
|
| 22 |
+
create_revenue_expense_chart,
|
| 23 |
+
create_balance_sheet_chart,
|
| 24 |
+
create_gl_summary_chart,
|
| 25 |
+
create_sales_analytics_chart,
|
| 26 |
+
create_sales_trend_chart,
|
| 27 |
+
get_summary_metrics,
|
| 28 |
+
create_prediction_distribution_chart,
|
| 29 |
+
create_prediction_bar_chart,
|
| 30 |
+
create_confidence_gauge
|
| 31 |
+
)
|
| 32 |
+
from utils.odata_connector import SAPFinanceConnector
|
| 33 |
+
from models.rpt_model import create_model
|
| 34 |
+
from utils.playground import (
|
| 35 |
+
load_dataset,
|
| 36 |
+
detect_task_type,
|
| 37 |
+
detect_task_type_from_column,
|
| 38 |
+
get_dataset_info,
|
| 39 |
+
auto_select_target_column,
|
| 40 |
+
prepare_train_test_split,
|
| 41 |
+
preprocess_data,
|
| 42 |
+
export_results,
|
| 43 |
+
check_embedding_server,
|
| 44 |
+
start_embedding_server,
|
| 45 |
+
ensure_embedding_server_running,
|
| 46 |
+
is_sap_rpt_oss_installed
|
| 47 |
+
)
|
| 48 |
+
|
| 49 |
+
# Load environment variables
|
| 50 |
+
load_dotenv()
|
| 51 |
+
|
| 52 |
+
# Global variables
|
| 53 |
+
gl_data = pd.DataFrame()
|
| 54 |
+
financial_data = pd.DataFrame()
|
| 55 |
+
sales_data = pd.DataFrame()
|
| 56 |
+
uploaded_data = pd.DataFrame()
|
| 57 |
+
odata_data = pd.DataFrame()
|
| 58 |
+
odata_connector = None
|
| 59 |
+
model_wrapper = None
|
| 60 |
+
|
| 61 |
+
# Playground variables
|
| 62 |
+
playground_data = pd.DataFrame()
|
| 63 |
+
playground_model = None
|
| 64 |
+
playground_results = None
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def load_datasets():
|
| 68 |
+
"""Load synthetic datasets if they exist."""
|
| 69 |
+
global gl_data, financial_data, sales_data
|
| 70 |
+
data_dir = Path("data")
|
| 71 |
+
|
| 72 |
+
if not data_dir.exists():
|
| 73 |
+
generate_all_datasets()
|
| 74 |
+
|
| 75 |
+
if (data_dir / "synthetic_gl_accounts.csv").exists():
|
| 76 |
+
gl_data = pd.read_csv(data_dir / "synthetic_gl_accounts.csv")
|
| 77 |
+
|
| 78 |
+
if (data_dir / "synthetic_financial_statements.csv").exists():
|
| 79 |
+
financial_data = pd.read_csv(data_dir / "synthetic_financial_statements.csv")
|
| 80 |
+
|
| 81 |
+
if (data_dir / "synthetic_sales_orders.csv").exists():
|
| 82 |
+
sales_data = pd.read_csv(data_dir / "synthetic_sales_orders.csv")
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def create_dashboard():
|
| 86 |
+
"""Create dashboard with metrics and charts."""
|
| 87 |
+
if gl_data.empty and financial_data.empty and sales_data.empty:
|
| 88 |
+
load_datasets()
|
| 89 |
+
|
| 90 |
+
# Calculate metrics with vibrant styling
|
| 91 |
+
metrics_html = "<div style='display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-bottom: 30px;'>"
|
| 92 |
+
|
| 93 |
+
if not gl_data.empty:
|
| 94 |
+
gl_metrics = get_summary_metrics(gl_data, "gl")
|
| 95 |
+
metrics_html += f"""
|
| 96 |
+
<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); color: white;'>
|
| 97 |
+
<h3 style='margin: 0 0 10px 0; font-size: 16px; opacity: 0.9;'>💰 GL Transactions</h3>
|
| 98 |
+
<p style='font-size: 32px; font-weight: bold; margin: 0;'>{gl_metrics.get('Total Transactions', 0):,}</p>
|
| 99 |
+
</div>
|
| 100 |
+
"""
|
| 101 |
+
|
| 102 |
+
if not financial_data.empty:
|
| 103 |
+
fin_metrics = get_summary_metrics(financial_data, "financial")
|
| 104 |
+
metrics_html += f"""
|
| 105 |
+
<div style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); padding: 25px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); color: white;'>
|
| 106 |
+
<h3 style='margin: 0 0 10px 0; font-size: 16px; opacity: 0.9;'>📈 Latest Revenue</h3>
|
| 107 |
+
<p style='font-size: 32px; font-weight: bold; margin: 0;'>${fin_metrics.get('Latest Revenue', 0):,.0f}</p>
|
| 108 |
+
</div>
|
| 109 |
+
"""
|
| 110 |
+
|
| 111 |
+
if not sales_data.empty:
|
| 112 |
+
sales_metrics = get_summary_metrics(sales_data, "sales")
|
| 113 |
+
metrics_html += f"""
|
| 114 |
+
<div style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); padding: 25px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); color: white;'>
|
| 115 |
+
<h3 style='margin: 0 0 10px 0; font-size: 16px; opacity: 0.9;'>🛒 Total Sales</h3>
|
| 116 |
+
<p style='font-size: 32px; font-weight: bold; margin: 0;'>${sales_metrics.get('Total Sales', 0):,.0f}</p>
|
| 117 |
+
</div>
|
| 118 |
+
"""
|
| 119 |
+
|
| 120 |
+
datasets_count = sum([not df.empty for df in [gl_data, financial_data, sales_data, uploaded_data]])
|
| 121 |
+
metrics_html += f"""
|
| 122 |
+
<div style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%); padding: 25px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); color: white;'>
|
| 123 |
+
<h3 style='margin: 0 0 10px 0; font-size: 16px; opacity: 0.9;'>📊 Datasets</h3>
|
| 124 |
+
<p style='font-size: 32px; font-weight: bold; margin: 0;'>{datasets_count} loaded</p>
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
"""
|
| 128 |
+
|
| 129 |
+
# Create charts
|
| 130 |
+
charts = []
|
| 131 |
+
if not financial_data.empty:
|
| 132 |
+
fig_dict = create_revenue_expense_chart(financial_data)
|
| 133 |
+
if fig_dict:
|
| 134 |
+
charts.append(go.Figure(fig_dict))
|
| 135 |
+
|
| 136 |
+
fig_dict = create_balance_sheet_chart(financial_data)
|
| 137 |
+
if fig_dict:
|
| 138 |
+
charts.append(go.Figure(fig_dict))
|
| 139 |
+
|
| 140 |
+
if not sales_data.empty:
|
| 141 |
+
fig_dict = create_sales_analytics_chart(sales_data)
|
| 142 |
+
if fig_dict:
|
| 143 |
+
charts.append(go.Figure(fig_dict))
|
| 144 |
+
|
| 145 |
+
return metrics_html, charts[0] if len(charts) > 0 else None, charts[1] if len(charts) > 1 else None, charts[2] if len(charts) > 2 else None
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
def explore_dataset(dataset_type):
|
| 149 |
+
"""Explore selected dataset."""
|
| 150 |
+
global gl_data, financial_data, sales_data, uploaded_data
|
| 151 |
+
|
| 152 |
+
if dataset_type == "GL Accounts":
|
| 153 |
+
if gl_data.empty:
|
| 154 |
+
return "No GL data available", None, None
|
| 155 |
+
fig_dict = create_gl_summary_chart(gl_data)
|
| 156 |
+
fig = go.Figure(fig_dict) if fig_dict else None
|
| 157 |
+
return f"GL Accounts ({len(gl_data)} records)", fig, gl_data.head(100)
|
| 158 |
+
|
| 159 |
+
elif dataset_type == "Financial Statements":
|
| 160 |
+
if financial_data.empty:
|
| 161 |
+
return "No financial data available", None, None
|
| 162 |
+
fig_dict = create_revenue_expense_chart(financial_data)
|
| 163 |
+
fig = go.Figure(fig_dict) if fig_dict else None
|
| 164 |
+
return f"Financial Statements ({len(financial_data)} records)", fig, financial_data
|
| 165 |
+
|
| 166 |
+
elif dataset_type == "Sales Orders":
|
| 167 |
+
if sales_data.empty:
|
| 168 |
+
return "No sales data available", None, None
|
| 169 |
+
fig_dict = create_sales_trend_chart(sales_data)
|
| 170 |
+
fig = go.Figure(fig_dict) if fig_dict else None
|
| 171 |
+
return f"Sales Orders ({len(sales_data)} records)", fig, sales_data.head(100)
|
| 172 |
+
|
| 173 |
+
elif dataset_type == "Uploaded Data":
|
| 174 |
+
if uploaded_data.empty:
|
| 175 |
+
return "No uploaded data available", None, None
|
| 176 |
+
return f"Uploaded Data ({len(uploaded_data)} records)", None, uploaded_data.head(100)
|
| 177 |
+
|
| 178 |
+
return "Select a dataset", None, None
|
| 179 |
+
|
| 180 |
+
|
| 181 |
+
def upload_file(file):
|
| 182 |
+
"""Handle file upload."""
|
| 183 |
+
global uploaded_data
|
| 184 |
+
if file is not None:
|
| 185 |
+
try:
|
| 186 |
+
uploaded_data = pd.read_csv(file.name)
|
| 187 |
+
return f"Successfully uploaded {len(uploaded_data)} records!", uploaded_data.head(50)
|
| 188 |
+
except Exception as e:
|
| 189 |
+
return f"Error uploading file: {str(e)}", None
|
| 190 |
+
return "No file uploaded", None
|
| 191 |
+
|
| 192 |
+
|
| 193 |
+
def init_model(model_type, use_gpu):
|
| 194 |
+
"""Initialize the SAP-RPT-1-OSS model."""
|
| 195 |
+
global model_wrapper
|
| 196 |
+
try:
|
| 197 |
+
model_wrapper = create_model(model_type=model_type.lower(), use_gpu=use_gpu)
|
| 198 |
+
|
| 199 |
+
context_size = 8192 if use_gpu else 2048
|
| 200 |
+
bagging = 8 if use_gpu else 1
|
| 201 |
+
|
| 202 |
+
return f"""✅ SAP-RPT-1-OSS Model Initialized Successfully!
|
| 203 |
+
|
| 204 |
+
🎯 Model Type: {model_type}
|
| 205 |
+
🔧 Context Size: {context_size}
|
| 206 |
+
📦 Bagging Factor: {bagging}
|
| 207 |
+
💻 Mode: {'GPU (80GB)' if use_gpu else 'CPU (Lightweight)'}
|
| 208 |
+
📝 Status: Ready for training
|
| 209 |
+
|
| 210 |
+
⚠️ Requirements:
|
| 211 |
+
• Hugging Face authentication
|
| 212 |
+
• Embedding service (may be required for predictions)
|
| 213 |
+
• Sufficient memory"""
|
| 214 |
+
except ImportError as e:
|
| 215 |
+
return f"""❌ SAP-RPT-1-OSS Model Not Available
|
| 216 |
+
|
| 217 |
+
Error: {str(e)}
|
| 218 |
+
|
| 219 |
+
📋 Installation Required:
|
| 220 |
+
pip install git+https://github.com/SAP-samples/sap-rpt-1-oss
|
| 221 |
+
|
| 222 |
+
🔑 Authentication Required:
|
| 223 |
+
1. Create Hugging Face account
|
| 224 |
+
2. Accept model license at: https://huggingface.co/SAP/sap-rpt-1-oss
|
| 225 |
+
3. Run: huggingface-cli login
|
| 226 |
+
4. Set HUGGINGFACE_TOKEN in .env file"""
|
| 227 |
+
except Exception as e:
|
| 228 |
+
import traceback
|
| 229 |
+
error_detail = traceback.format_exc()
|
| 230 |
+
|
| 231 |
+
# Check for common errors
|
| 232 |
+
if "HUGGINGFACE_TOKEN" in str(e) or "login" in str(e).lower():
|
| 233 |
+
return f"""❌ Hugging Face Authentication Failed
|
| 234 |
+
|
| 235 |
+
Error: {str(e)}
|
| 236 |
+
|
| 237 |
+
🔑 Required Steps:
|
| 238 |
+
1. Login to Hugging Face: huggingface-cli login
|
| 239 |
+
2. OR set HUGGINGFACE_TOKEN in .env file
|
| 240 |
+
3. Accept model terms: https://huggingface.co/SAP/sap-rpt-1-oss"""
|
| 241 |
+
|
| 242 |
+
elif "memory" in str(e).lower() or "cuda" in str(e).lower():
|
| 243 |
+
return f"""❌ Insufficient Resources
|
| 244 |
+
|
| 245 |
+
Error: {str(e)}
|
| 246 |
+
|
| 247 |
+
💻 Requirements:
|
| 248 |
+
• GPU with 80GB memory (recommended)
|
| 249 |
+
• OR use CPU mode (uncheck GPU option)
|
| 250 |
+
• Context size will be reduced for CPU mode"""
|
| 251 |
+
|
| 252 |
+
else:
|
| 253 |
+
return f"""❌ SAP-RPT-1-OSS Initialization Failed
|
| 254 |
+
|
| 255 |
+
Error: {str(e)}
|
| 256 |
+
|
| 257 |
+
📋 Details:
|
| 258 |
+
{error_detail[:500]}
|
| 259 |
+
|
| 260 |
+
🔧 Common Solutions:
|
| 261 |
+
1. Ensure model is installed
|
| 262 |
+
2. Check Hugging Face authentication
|
| 263 |
+
3. Verify system resources
|
| 264 |
+
4. Try CPU mode if GPU unavailable"""
|
| 265 |
+
|
| 266 |
+
|
| 267 |
+
def train_model(dataset_type):
|
| 268 |
+
"""Train the model on selected dataset."""
|
| 269 |
+
global model_wrapper, gl_data, financial_data, sales_data, uploaded_data
|
| 270 |
+
|
| 271 |
+
if model_wrapper is None:
|
| 272 |
+
return "Please initialize the model first"
|
| 273 |
+
|
| 274 |
+
# Select dataset
|
| 275 |
+
if dataset_type == "GL Accounts":
|
| 276 |
+
df = gl_data
|
| 277 |
+
elif dataset_type == "Financial Statements":
|
| 278 |
+
df = financial_data
|
| 279 |
+
elif dataset_type == "Sales Orders":
|
| 280 |
+
df = sales_data
|
| 281 |
+
elif dataset_type == "Uploaded Data":
|
| 282 |
+
df = uploaded_data
|
| 283 |
+
else:
|
| 284 |
+
return "Please select a dataset"
|
| 285 |
+
|
| 286 |
+
if df.empty:
|
| 287 |
+
return "Selected dataset is empty"
|
| 288 |
+
|
| 289 |
+
try:
|
| 290 |
+
# Get numeric columns and clean data
|
| 291 |
+
X = df.select_dtypes(include=[np.number])
|
| 292 |
+
|
| 293 |
+
# Remove columns with all NaN values
|
| 294 |
+
X = X.dropna(axis=1, how='all')
|
| 295 |
+
|
| 296 |
+
# Fill remaining NaN values with 0
|
| 297 |
+
X = X.fillna(0)
|
| 298 |
+
|
| 299 |
+
if len(X) > 0 and len(X.columns) > 0:
|
| 300 |
+
# Create a simple target for classification based on first column
|
| 301 |
+
y = (X.iloc[:, 0] > X.iloc[:, 0].median()).astype(int)
|
| 302 |
+
|
| 303 |
+
# Keep as DataFrame - SAP-RPT-OSS expects DataFrame or compatible format
|
| 304 |
+
X_train = pd.DataFrame(X, columns=X.columns)
|
| 305 |
+
X_train = X_train.astype(float)
|
| 306 |
+
|
| 307 |
+
# Fit the model with DataFrame
|
| 308 |
+
model_wrapper.fit(X_train, y)
|
| 309 |
+
return f"✅ Model trained successfully on {len(X)} samples with {len(X.columns)} features!"
|
| 310 |
+
else:
|
| 311 |
+
return "No numeric data available for training"
|
| 312 |
+
except Exception as e:
|
| 313 |
+
return f"Error training model: {str(e)}"
|
| 314 |
+
|
| 315 |
+
|
| 316 |
+
def get_scenario_labels(dataset_type, scenario):
|
| 317 |
+
"""Get contextual labels for predictions based on dataset and scenario."""
|
| 318 |
+
labels_map = {
|
| 319 |
+
"Sales Orders": {
|
| 320 |
+
"High Value Order Classification": {
|
| 321 |
+
0: "Standard Order (Low Value)",
|
| 322 |
+
1: "High Value Order (Premium)",
|
| 323 |
+
"description": "Identifies orders with high revenue potential"
|
| 324 |
+
},
|
| 325 |
+
"Order Priority Classification": {
|
| 326 |
+
0: "Normal Priority",
|
| 327 |
+
1: "High Priority / Urgent",
|
| 328 |
+
"description": "Flags orders requiring immediate attention"
|
| 329 |
+
},
|
| 330 |
+
"Customer Segment Classification": {
|
| 331 |
+
0: "Regular Customer",
|
| 332 |
+
1: "VIP / Enterprise Customer",
|
| 333 |
+
"description": "Identifies high-value customer segments"
|
| 334 |
+
}
|
| 335 |
+
},
|
| 336 |
+
"Products": {
|
| 337 |
+
"Product Performance Classification": {
|
| 338 |
+
0: "Low Performer",
|
| 339 |
+
1: "Top Performer / Best Seller",
|
| 340 |
+
"description": "Identifies products with high sales performance"
|
| 341 |
+
},
|
| 342 |
+
"Stock Risk Classification": {
|
| 343 |
+
0: "Normal Stock Level",
|
| 344 |
+
1: "Low Stock / Reorder Needed",
|
| 345 |
+
"description": "Flags products at risk of stockout"
|
| 346 |
+
}
|
| 347 |
+
},
|
| 348 |
+
"GL Accounts": {
|
| 349 |
+
"Transaction Risk Classification": {
|
| 350 |
+
0: "Normal Transaction",
|
| 351 |
+
1: "Flagged / Review Needed",
|
| 352 |
+
"description": "Identifies potentially risky or unusual transactions"
|
| 353 |
+
},
|
| 354 |
+
"Account Balance Classification": {
|
| 355 |
+
0: "Below Average Balance",
|
| 356 |
+
1: "Above Average Balance",
|
| 357 |
+
"description": "Classifies accounts by balance magnitude"
|
| 358 |
+
},
|
| 359 |
+
"Expense Category Classification": {
|
| 360 |
+
0: "Operating Expense",
|
| 361 |
+
1: "Capital Expenditure",
|
| 362 |
+
"description": "Categorizes transactions by type"
|
| 363 |
+
}
|
| 364 |
+
},
|
| 365 |
+
"Financial Statements": {
|
| 366 |
+
"Financial Health Classification": {
|
| 367 |
+
0: "Below Average Performance",
|
| 368 |
+
1: "Strong Performance",
|
| 369 |
+
"description": "Assesses overall financial health"
|
| 370 |
+
},
|
| 371 |
+
"Profitability Classification": {
|
| 372 |
+
0: "Low Margin Period",
|
| 373 |
+
1: "High Margin Period",
|
| 374 |
+
"description": "Identifies periods with strong profitability"
|
| 375 |
+
},
|
| 376 |
+
"Growth Trend Classification": {
|
| 377 |
+
0: "Declining Revenue",
|
| 378 |
+
1: "Revenue Growth",
|
| 379 |
+
"description": "Classifies periods by revenue trajectory"
|
| 380 |
+
}
|
| 381 |
+
}
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
default_labels = {
|
| 385 |
+
0: "Class 0 (Negative/Low)",
|
| 386 |
+
1: "Class 1 (Positive/High)",
|
| 387 |
+
"description": "Binary classification"
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
return labels_map.get(dataset_type, {}).get(scenario, default_labels)
|
| 391 |
+
|
| 392 |
+
|
| 393 |
+
def make_predictions(dataset_type, prediction_scenario):
|
| 394 |
+
"""Make predictions on selected dataset with scenario context."""
|
| 395 |
+
global model_wrapper, gl_data, financial_data, sales_data, uploaded_data
|
| 396 |
+
|
| 397 |
+
if model_wrapper is None:
|
| 398 |
+
return "❌ Please initialize the model first", None
|
| 399 |
+
|
| 400 |
+
if not hasattr(model_wrapper, 'is_fitted') or not model_wrapper.is_fitted:
|
| 401 |
+
return "❌ Please train the model first", None
|
| 402 |
+
|
| 403 |
+
# Select dataset and get original data for context
|
| 404 |
+
if dataset_type == "Sales Orders":
|
| 405 |
+
df = sales_data.copy()
|
| 406 |
+
original_cols = ['Order_Number', 'Customer_Name', 'Total_Amount', 'Status']
|
| 407 |
+
elif dataset_type == "Products":
|
| 408 |
+
df = sales_data.copy()
|
| 409 |
+
original_cols = ['Product_Name', 'Total_Amount', 'Quantity']
|
| 410 |
+
elif dataset_type == "GL Accounts":
|
| 411 |
+
df = gl_data.copy()
|
| 412 |
+
original_cols = ['Transaction_ID', 'Account_Description', 'Debit', 'Credit']
|
| 413 |
+
elif dataset_type == "Financial Statements":
|
| 414 |
+
df = financial_data.copy()
|
| 415 |
+
original_cols = ['Period', 'Revenue', 'Net_Income']
|
| 416 |
+
elif dataset_type == "Uploaded Data":
|
| 417 |
+
df = uploaded_data.copy()
|
| 418 |
+
original_cols = df.columns[:3].tolist() if len(df.columns) >= 3 else df.columns.tolist()
|
| 419 |
+
else:
|
| 420 |
+
return "Please select a dataset", None
|
| 421 |
+
|
| 422 |
+
if df.empty:
|
| 423 |
+
return f"❌ Selected dataset ({dataset_type}) is empty", None
|
| 424 |
+
|
| 425 |
+
try:
|
| 426 |
+
# Get labels for this scenario
|
| 427 |
+
label_config = get_scenario_labels(dataset_type, prediction_scenario)
|
| 428 |
+
|
| 429 |
+
# Get numeric columns
|
| 430 |
+
X = df.select_dtypes(include=[np.number])
|
| 431 |
+
X = X.dropna(axis=1, how='all')
|
| 432 |
+
X = X.fillna(X.mean())
|
| 433 |
+
|
| 434 |
+
if len(X) > 0 and len(X.columns) > 0:
|
| 435 |
+
# Limit to first 15 rows
|
| 436 |
+
X_sample = X.head(15)
|
| 437 |
+
|
| 438 |
+
# Keep as DataFrame with proper column names - SAP-RPT-OSS expects DataFrame
|
| 439 |
+
X_pred = pd.DataFrame(X_sample, columns=X.columns)
|
| 440 |
+
|
| 441 |
+
# Ensure all values are numeric and no NaN
|
| 442 |
+
X_pred = X_pred.astype(float)
|
| 443 |
+
X_pred = X_pred.fillna(0)
|
| 444 |
+
|
| 445 |
+
# Make predictions - pass DataFrame directly
|
| 446 |
+
predictions = model_wrapper.predict(X_pred)
|
| 447 |
+
|
| 448 |
+
# Convert to numpy array and flatten if needed
|
| 449 |
+
predictions = np.array(predictions)
|
| 450 |
+
if hasattr(predictions, 'flatten') and len(predictions.shape) > 1:
|
| 451 |
+
predictions = predictions.flatten()
|
| 452 |
+
|
| 453 |
+
# Get original data columns for context
|
| 454 |
+
context_df = df.head(15)[original_cols] if all(col in df.columns for col in original_cols) else df.head(15).iloc[:, :3]
|
| 455 |
+
|
| 456 |
+
# Create result with meaningful labels
|
| 457 |
+
model_type = model_wrapper.model_type.capitalize()
|
| 458 |
+
|
| 459 |
+
if model_type == "Classifier":
|
| 460 |
+
pred_labels = [label_config.get(int(p), f"Class {int(p)}") for p in predictions]
|
| 461 |
+
|
| 462 |
+
result_df = pd.DataFrame({
|
| 463 |
+
'Row': range(1, len(predictions) + 1),
|
| 464 |
+
'Prediction': pred_labels,
|
| 465 |
+
'Confidence': predictions
|
| 466 |
+
})
|
| 467 |
+
|
| 468 |
+
# Add context columns
|
| 469 |
+
for col in context_df.columns:
|
| 470 |
+
result_df[col] = context_df[col].values
|
| 471 |
+
|
| 472 |
+
# Count predictions
|
| 473 |
+
class_0_count = sum(predictions == 0)
|
| 474 |
+
class_1_count = sum(predictions == 1)
|
| 475 |
+
|
| 476 |
+
# Create visualizations
|
| 477 |
+
pie_chart = go.Figure(create_prediction_distribution_chart(
|
| 478 |
+
predictions,
|
| 479 |
+
label_config,
|
| 480 |
+
f"{prediction_scenario} - Distribution"
|
| 481 |
+
))
|
| 482 |
+
|
| 483 |
+
bar_chart = go.Figure(create_prediction_bar_chart(
|
| 484 |
+
predictions,
|
| 485 |
+
label_config,
|
| 486 |
+
f"{prediction_scenario} - Summary"
|
| 487 |
+
))
|
| 488 |
+
|
| 489 |
+
# Calculate confidence score
|
| 490 |
+
confidence = max(class_0_count, class_1_count) / len(predictions) * 100
|
| 491 |
+
gauge_chart = go.Figure(create_confidence_gauge(
|
| 492 |
+
confidence,
|
| 493 |
+
"Prediction Confidence"
|
| 494 |
+
))
|
| 495 |
+
|
| 496 |
+
status = f"""✅ {model_type} Results - {prediction_scenario}
|
| 497 |
+
|
| 498 |
+
📊 {label_config.get('description', 'Classification complete')}
|
| 499 |
+
|
| 500 |
+
Analyzed {len(predictions)} records:
|
| 501 |
+
• {label_config.get(1, 'Class 1')}: {class_1_count} records ({class_1_count/len(predictions)*100:.1f}%)
|
| 502 |
+
• {label_config.get(0, 'Class 0')}: {class_0_count} records ({class_0_count/len(predictions)*100:.1f}%)
|
| 503 |
+
|
| 504 |
+
Dataset: {dataset_type}
|
| 505 |
+
Model Type: {model_type}
|
| 506 |
+
Confidence: {confidence:.1f}%"""
|
| 507 |
+
else:
|
| 508 |
+
result_df = pd.DataFrame({
|
| 509 |
+
'Row': range(1, len(predictions) + 1),
|
| 510 |
+
'Predicted Value': predictions.round(2)
|
| 511 |
+
})
|
| 512 |
+
|
| 513 |
+
# Add context columns
|
| 514 |
+
for col in context_df.columns:
|
| 515 |
+
result_df[col] = context_df[col].values
|
| 516 |
+
|
| 517 |
+
# Create visualizations for regression
|
| 518 |
+
fig = go.Figure()
|
| 519 |
+
fig.add_trace(go.Scatter(
|
| 520 |
+
x=list(range(1, len(predictions) + 1)),
|
| 521 |
+
y=predictions,
|
| 522 |
+
mode='lines+markers',
|
| 523 |
+
marker=dict(size=10, color='#3498db'),
|
| 524 |
+
line=dict(width=3, color='#3498db')
|
| 525 |
+
))
|
| 526 |
+
fig.update_layout(
|
| 527 |
+
title=f"{prediction_scenario} - Predicted Values",
|
| 528 |
+
xaxis_title="Sample",
|
| 529 |
+
yaxis_title="Predicted Value",
|
| 530 |
+
template='plotly_white',
|
| 531 |
+
height=400
|
| 532 |
+
)
|
| 533 |
+
pie_chart = fig
|
| 534 |
+
bar_chart = None
|
| 535 |
+
gauge_chart = None
|
| 536 |
+
|
| 537 |
+
status = f"""✅ {model_type} Results - {prediction_scenario}
|
| 538 |
+
|
| 539 |
+
Predicted {len(predictions)} values
|
| 540 |
+
Mean: {predictions.mean():.2f}
|
| 541 |
+
Range: {predictions.min():.2f} to {predictions.max():.2f}
|
| 542 |
+
Std Dev: {predictions.std():.2f}
|
| 543 |
+
|
| 544 |
+
Dataset: {dataset_type}"""
|
| 545 |
+
|
| 546 |
+
return status, result_df, pie_chart, bar_chart, gauge_chart
|
| 547 |
+
else:
|
| 548 |
+
return f"❌ No valid numeric data available in {dataset_type}", None, None, None, None
|
| 549 |
+
except Exception as e:
|
| 550 |
+
import traceback
|
| 551 |
+
error_detail = traceback.format_exc()
|
| 552 |
+
|
| 553 |
+
# Check for specific SAP-RPT-1-OSS errors
|
| 554 |
+
if "zmq" in str(e).lower() or "socket" in str(e).lower() or "Resource temporarily unavailable" in str(e):
|
| 555 |
+
return f"""❌ SAP-RPT-1-OSS Embedding Service Not Available
|
| 556 |
+
|
| 557 |
+
Error: {str(e)}
|
| 558 |
+
|
| 559 |
+
🔧 SAP-RPT-1-OSS requires an embedding service to be running:
|
| 560 |
+
|
| 561 |
+
**Required Setup:**
|
| 562 |
+
1. The model uses a text embedding service via ZMQ socket
|
| 563 |
+
2. This service needs to be started separately
|
| 564 |
+
3. Service handles semantic understanding of column names and values
|
| 565 |
+
|
| 566 |
+
**To Use SAP-RPT-1-OSS:**
|
| 567 |
+
• Start the embedding service (see SAP-RPT-1-OSS documentation)
|
| 568 |
+
• Ensure ZMQ socket is accessible
|
| 569 |
+
• Verify service is running before making predictions
|
| 570 |
+
|
| 571 |
+
**Current Status:** Model initialized but embedding service unavailable
|
| 572 |
+
|
| 573 |
+
📖 Documentation: https://github.com/SAP-samples/sap-rpt-1-oss
|
| 574 |
+
🔗 Model Info: https://huggingface.co/SAP/sap-rpt-1-oss
|
| 575 |
+
|
| 576 |
+
Dataset: {dataset_type}
|
| 577 |
+
Scenario: {prediction_scenario}""", None, None, None, None
|
| 578 |
+
|
| 579 |
+
else:
|
| 580 |
+
return f"""❌ Error making predictions on {dataset_type}
|
| 581 |
+
|
| 582 |
+
Error: {str(e)}
|
| 583 |
+
|
| 584 |
+
📋 Details:
|
| 585 |
+
{error_detail[:400]}
|
| 586 |
+
|
| 587 |
+
Dataset: {dataset_type}
|
| 588 |
+
Scenario: {prediction_scenario}""", None, None, None, None
|
| 589 |
+
|
| 590 |
+
|
| 591 |
+
def update_scenarios(dataset_type):
|
| 592 |
+
"""Update scenario dropdown based on selected dataset."""
|
| 593 |
+
scenarios_map = {
|
| 594 |
+
"Sales Orders": [
|
| 595 |
+
"High Value Order Classification",
|
| 596 |
+
"Order Priority Classification",
|
| 597 |
+
"Customer Segment Classification"
|
| 598 |
+
],
|
| 599 |
+
"Products": [
|
| 600 |
+
"Product Performance Classification",
|
| 601 |
+
"Stock Risk Classification"
|
| 602 |
+
],
|
| 603 |
+
"GL Accounts": [
|
| 604 |
+
"Transaction Risk Classification",
|
| 605 |
+
"Account Balance Classification",
|
| 606 |
+
"Expense Category Classification"
|
| 607 |
+
],
|
| 608 |
+
"Financial Statements": [
|
| 609 |
+
"Financial Health Classification",
|
| 610 |
+
"Profitability Classification",
|
| 611 |
+
"Growth Trend Classification"
|
| 612 |
+
],
|
| 613 |
+
"Uploaded Data": [
|
| 614 |
+
"Custom Classification"
|
| 615 |
+
]
|
| 616 |
+
}
|
| 617 |
+
|
| 618 |
+
scenarios = scenarios_map.get(dataset_type, ["Custom Classification"])
|
| 619 |
+
return gr.Dropdown(choices=scenarios, value=scenarios[0])
|
| 620 |
+
|
| 621 |
+
|
| 622 |
+
def test_odata_connection():
|
| 623 |
+
"""Test OData connection."""
|
| 624 |
+
global odata_connector
|
| 625 |
+
try:
|
| 626 |
+
odata_connector = SAPFinanceConnector()
|
| 627 |
+
connected, message = odata_connector.test_connection()
|
| 628 |
+
if connected:
|
| 629 |
+
return f"✓ {message}"
|
| 630 |
+
else:
|
| 631 |
+
return f"✗ {message}"
|
| 632 |
+
except Exception as e:
|
| 633 |
+
return f"Error: {str(e)}"
|
| 634 |
+
|
| 635 |
+
|
| 636 |
+
def fetch_odata_data(entity_type, num_records):
|
| 637 |
+
"""Fetch data from OData service."""
|
| 638 |
+
global odata_connector, odata_data
|
| 639 |
+
|
| 640 |
+
if odata_connector is None:
|
| 641 |
+
return "Please test connection first", None
|
| 642 |
+
|
| 643 |
+
try:
|
| 644 |
+
if entity_type == "Sales Orders":
|
| 645 |
+
odata_data = odata_connector.fetch_orders_df(num_records)
|
| 646 |
+
elif entity_type == "Products":
|
| 647 |
+
odata_data = odata_connector.fetch_products_df(num_records)
|
| 648 |
+
elif entity_type == "Line Items":
|
| 649 |
+
odata_data = odata_connector.fetch_line_items_df(num_records)
|
| 650 |
+
elif entity_type == "Business Partners":
|
| 651 |
+
odata_data = odata_connector.fetch_partners_df(num_records)
|
| 652 |
+
else:
|
| 653 |
+
return "Please select an entity type", None
|
| 654 |
+
|
| 655 |
+
return f"Fetched {len(odata_data)} records", odata_data.head(100) if not odata_data.empty else None
|
| 656 |
+
except Exception as e:
|
| 657 |
+
return f"Error fetching data: {str(e)}", None
|
| 658 |
+
|
| 659 |
+
|
| 660 |
+
# Playground functions
|
| 661 |
+
def handle_playground_upload(file):
|
| 662 |
+
"""Handle dataset upload in playground."""
|
| 663 |
+
global playground_data
|
| 664 |
+
|
| 665 |
+
if file is None:
|
| 666 |
+
return "No file uploaded", None, [], None, "classification", [], None
|
| 667 |
+
|
| 668 |
+
try:
|
| 669 |
+
df, error = load_dataset(file.name)
|
| 670 |
+
if error:
|
| 671 |
+
return f"Error: {error}", None, [], None, "classification", [], None
|
| 672 |
+
|
| 673 |
+
playground_data = df
|
| 674 |
+
|
| 675 |
+
# Get dataset info
|
| 676 |
+
info = get_dataset_info(df)
|
| 677 |
+
|
| 678 |
+
# Auto-select target column (default to last)
|
| 679 |
+
target_col = auto_select_target_column(df, "classification")
|
| 680 |
+
|
| 681 |
+
# Detect task type from filename first
|
| 682 |
+
filename_task_type = detect_task_type(Path(file.name).name)
|
| 683 |
+
|
| 684 |
+
# Then detect from target column data type
|
| 685 |
+
column_task_type = detect_task_type_from_column(df, target_col)
|
| 686 |
+
|
| 687 |
+
# Use column-based detection if filename detection is default
|
| 688 |
+
if filename_task_type == "classification" and column_task_type == "regression":
|
| 689 |
+
task_type = column_task_type # Prefer column-based detection
|
| 690 |
+
else:
|
| 691 |
+
task_type = filename_task_type
|
| 692 |
+
|
| 693 |
+
# Create info text
|
| 694 |
+
target_info = ""
|
| 695 |
+
if target_col:
|
| 696 |
+
target_series = df[target_col]
|
| 697 |
+
if pd.api.types.is_numeric_dtype(target_series):
|
| 698 |
+
unique_count = target_series.dropna().nunique()
|
| 699 |
+
target_info = f"\nTarget '{target_col}': {unique_count} unique values"
|
| 700 |
+
if unique_count > 20:
|
| 701 |
+
target_info += " (suggests regression)"
|
| 702 |
+
else:
|
| 703 |
+
target_info += " (suggests classification)"
|
| 704 |
+
|
| 705 |
+
info_text = f"""Dataset loaded successfully!
|
| 706 |
+
|
| 707 |
+
Rows: {info['num_rows']:,}
|
| 708 |
+
Columns: {info['num_columns']}
|
| 709 |
+
Numeric columns: {len(info['numeric_columns'])}
|
| 710 |
+
Categorical columns: {len(info['categorical_columns'])}
|
| 711 |
+
|
| 712 |
+
Detected task type: {task_type} (from filename: {filename_task_type}, from column: {column_task_type})
|
| 713 |
+
Suggested target column: {target_col}{target_info}"""
|
| 714 |
+
|
| 715 |
+
# Preview first 10 rows
|
| 716 |
+
preview = df.head(10)
|
| 717 |
+
|
| 718 |
+
# Column list for dropdown
|
| 719 |
+
columns = list(df.columns)
|
| 720 |
+
|
| 721 |
+
return (
|
| 722 |
+
info_text,
|
| 723 |
+
preview,
|
| 724 |
+
columns, # Choices for dropdown
|
| 725 |
+
target_col, # Value for dropdown
|
| 726 |
+
task_type,
|
| 727 |
+
columns, # Choices for second dropdown
|
| 728 |
+
target_col # Value for second dropdown
|
| 729 |
+
)
|
| 730 |
+
except Exception as e:
|
| 731 |
+
return f"Error: {str(e)}", None, [], None, "classification", [], None
|
| 732 |
+
|
| 733 |
+
|
| 734 |
+
def train_playground_model(
|
| 735 |
+
task_type,
|
| 736 |
+
target_column,
|
| 737 |
+
test_split,
|
| 738 |
+
max_context_size,
|
| 739 |
+
bagging,
|
| 740 |
+
use_gpu,
|
| 741 |
+
handle_missing,
|
| 742 |
+
normalize,
|
| 743 |
+
progress=gr.Progress()
|
| 744 |
+
):
|
| 745 |
+
"""Train model in playground with progress tracking."""
|
| 746 |
+
global playground_data, playground_model
|
| 747 |
+
|
| 748 |
+
if playground_data.empty:
|
| 749 |
+
return "Please upload a dataset first", None, None, None
|
| 750 |
+
|
| 751 |
+
try:
|
| 752 |
+
progress(0.1, desc="Preparing data...")
|
| 753 |
+
|
| 754 |
+
# Preprocess data
|
| 755 |
+
df_processed = preprocess_data(playground_data, handle_missing, normalize)
|
| 756 |
+
|
| 757 |
+
progress(0.2, desc="Validating target column...")
|
| 758 |
+
|
| 759 |
+
# Validate target column exists
|
| 760 |
+
if target_column not in df_processed.columns:
|
| 761 |
+
return f"Error: Target column '{target_column}' not found in dataset", None, None, None
|
| 762 |
+
|
| 763 |
+
# Check target column data type
|
| 764 |
+
target_series = df_processed[target_column]
|
| 765 |
+
target_dtype = target_series.dtype
|
| 766 |
+
|
| 767 |
+
# Auto-detect task type if mismatch
|
| 768 |
+
is_numeric = pd.api.types.is_numeric_dtype(target_series)
|
| 769 |
+
is_integer_like = False
|
| 770 |
+
|
| 771 |
+
if is_numeric:
|
| 772 |
+
# Check if it's integer-like (can be converted to int without loss)
|
| 773 |
+
try:
|
| 774 |
+
int_values = target_series.dropna().astype(int)
|
| 775 |
+
float_values = target_series.dropna().astype(float)
|
| 776 |
+
is_integer_like = (int_values == float_values).all()
|
| 777 |
+
except:
|
| 778 |
+
is_integer_like = False
|
| 779 |
+
|
| 780 |
+
# Validate task type matches target column
|
| 781 |
+
if task_type == "classification":
|
| 782 |
+
if not is_integer_like:
|
| 783 |
+
# Check if it's numeric with many unique values
|
| 784 |
+
if is_numeric:
|
| 785 |
+
unique_values = target_series.dropna().nunique()
|
| 786 |
+
if unique_values > 20: # Too many unique values for classification
|
| 787 |
+
return f"""Error: Target column '{target_column}' contains continuous numeric values ({unique_values} unique values).
|
| 788 |
+
|
| 789 |
+
This looks like a regression problem, not classification.
|
| 790 |
+
|
| 791 |
+
Solution: Change Task Type to 'regression' or convert your target to integer classes.""", None, None, None
|
| 792 |
+
else:
|
| 793 |
+
# Convert numeric to integer classes (will be handled later with LabelEncoder)
|
| 794 |
+
pass
|
| 795 |
+
else:
|
| 796 |
+
# String/categorical - will be encoded with LabelEncoder later
|
| 797 |
+
# No need to convert here, just validate
|
| 798 |
+
unique_values = target_series.dropna().nunique()
|
| 799 |
+
if unique_values > 100:
|
| 800 |
+
return f"""Error: Target column '{target_column}' has too many unique categories ({unique_values}).
|
| 801 |
+
|
| 802 |
+
Classification works best with fewer categories (< 100).
|
| 803 |
+
|
| 804 |
+
Solution: Consider grouping categories or using regression if this is a continuous value.""", None, None, None
|
| 805 |
+
else: # regression
|
| 806 |
+
if not is_numeric:
|
| 807 |
+
return f"""Error: Target column '{target_column}' is not numeric (type: {target_dtype}).
|
| 808 |
+
|
| 809 |
+
Regression requires numeric target values.
|
| 810 |
+
|
| 811 |
+
Solution: Change Task Type to 'classification' or convert your target to numeric.""", None, None, None
|
| 812 |
+
|
| 813 |
+
progress(0.3, desc="Splitting train/test...")
|
| 814 |
+
|
| 815 |
+
# Prepare train/test split
|
| 816 |
+
X_train, y_train, X_test, y_test = prepare_train_test_split(
|
| 817 |
+
df_processed, target_column, test_split
|
| 818 |
+
)
|
| 819 |
+
|
| 820 |
+
# Ensure classification targets are integers
|
| 821 |
+
if task_type == "classification":
|
| 822 |
+
# Handle string/categorical targets by encoding them
|
| 823 |
+
from sklearn.preprocessing import LabelEncoder
|
| 824 |
+
le = LabelEncoder()
|
| 825 |
+
y_train = pd.Series(le.fit_transform(y_train.astype(str)), index=y_train.index)
|
| 826 |
+
y_test = pd.Series(le.transform(y_test.astype(str)), index=y_test.index)
|
| 827 |
+
|
| 828 |
+
progress(0.4, desc="Preparing model...")
|
| 829 |
+
|
| 830 |
+
# Note: SAP-RPT-OSS typically starts the embedding server automatically when needed
|
| 831 |
+
# We check status but don't require it to be running beforehand
|
| 832 |
+
server_running, server_msg = ensure_embedding_server_running()
|
| 833 |
+
server_warning = ""
|
| 834 |
+
if not server_running:
|
| 835 |
+
# This is normal - the model will start the server automatically when making predictions
|
| 836 |
+
server_warning = f"\n💡 Note: Embedding server will start automatically when model makes predictions."
|
| 837 |
+
|
| 838 |
+
progress(0.5, desc="Initializing model...")
|
| 839 |
+
|
| 840 |
+
# Initialize model with custom parameters
|
| 841 |
+
model_type = "classifier" if task_type == "classification" else "regressor"
|
| 842 |
+
from models.rpt_model import RPTModelWrapper
|
| 843 |
+
playground_model = RPTModelWrapper(
|
| 844 |
+
model_type=model_type,
|
| 845 |
+
max_context_size=max_context_size,
|
| 846 |
+
bagging=bagging
|
| 847 |
+
)
|
| 848 |
+
|
| 849 |
+
progress(0.6, desc="Training model...")
|
| 850 |
+
|
| 851 |
+
# Train model
|
| 852 |
+
playground_model.fit(X_train, y_train)
|
| 853 |
+
|
| 854 |
+
progress(0.8, desc="Making predictions...")
|
| 855 |
+
|
| 856 |
+
# Make predictions
|
| 857 |
+
predictions = playground_model.predict(X_test)
|
| 858 |
+
|
| 859 |
+
progress(0.9, desc="Exporting results...")
|
| 860 |
+
|
| 861 |
+
# Export results
|
| 862 |
+
results_path = export_results(
|
| 863 |
+
X_test, y_test, predictions, task_type,
|
| 864 |
+
filename_prefix="playground"
|
| 865 |
+
)
|
| 866 |
+
|
| 867 |
+
progress(1.0, desc="Complete!")
|
| 868 |
+
|
| 869 |
+
# Calculate metrics
|
| 870 |
+
if task_type == "classification":
|
| 871 |
+
accuracy = (predictions == y_test.values).mean() * 100
|
| 872 |
+
metrics = f"Accuracy: {accuracy:.2f}%"
|
| 873 |
+
else:
|
| 874 |
+
from sklearn.metrics import mean_squared_error, r2_score
|
| 875 |
+
mse = mean_squared_error(y_test, predictions)
|
| 876 |
+
r2 = r2_score(y_test, predictions)
|
| 877 |
+
metrics = f"MSE: {mse:.4f}, R²: {r2:.4f}"
|
| 878 |
+
|
| 879 |
+
# Create results DataFrame for display
|
| 880 |
+
results_df = X_test.copy()
|
| 881 |
+
results_df['true_value'] = y_test.values
|
| 882 |
+
if task_type == "classification":
|
| 883 |
+
results_df['predicted_class'] = predictions
|
| 884 |
+
else:
|
| 885 |
+
results_df['predicted_value'] = predictions
|
| 886 |
+
|
| 887 |
+
status = f"""✅ Training Complete!
|
| 888 |
+
|
| 889 |
+
Training samples: {len(X_train):,}
|
| 890 |
+
Test samples: {len(X_test):,}
|
| 891 |
+
{metrics}
|
| 892 |
+
{server_warning}
|
| 893 |
+
|
| 894 |
+
Results exported to: {results_path}"""
|
| 895 |
+
|
| 896 |
+
return status, results_df.head(100), results_path, gr.File(value=results_path)
|
| 897 |
+
|
| 898 |
+
except Exception as e:
|
| 899 |
+
import traceback
|
| 900 |
+
error_detail = traceback.format_exc()
|
| 901 |
+
return f"Error: {str(e)}\n\nDetails:\n{error_detail[:500]}", None, None, None
|
| 902 |
+
|
| 903 |
+
|
| 904 |
+
def check_playground_embedding_server():
|
| 905 |
+
"""Check embedding server status."""
|
| 906 |
+
# First check if package is installed
|
| 907 |
+
if not is_sap_rpt_oss_installed():
|
| 908 |
+
return f"❌ sap-rpt-oss package not found\n\n📦 Installation Required:\n1. Install sap-rpt-oss: pip install git+https://github.com/SAP-samples/sap-rpt-1-oss\n2. Install pyzmq: pip install pyzmq\n\n💡 After installation, the server will auto-start when you train a model."
|
| 909 |
+
|
| 910 |
+
# Check if server is running
|
| 911 |
+
is_running, message = check_embedding_server()
|
| 912 |
+
if is_running:
|
| 913 |
+
return f"✅ {message}\n\nThe embedding server is ready to use."
|
| 914 |
+
else:
|
| 915 |
+
return f"ℹ️ {message}\n\n✅ This is normal! The embedding server will start automatically when you train a model or make predictions. No manual start needed."
|
| 916 |
+
|
| 917 |
+
|
| 918 |
+
# Create Gradio interface with vibrant theme
|
| 919 |
+
with gr.Blocks(title="SAP Finance Dashboard", theme=gr.themes.Soft(), css="""
|
| 920 |
+
.gradio-container {
|
| 921 |
+
max-width: 1400px !important;
|
| 922 |
+
}
|
| 923 |
+
h1 {
|
| 924 |
+
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
|
| 925 |
+
-webkit-background-clip: text;
|
| 926 |
+
-webkit-text-fill-color: transparent;
|
| 927 |
+
background-clip: text;
|
| 928 |
+
}
|
| 929 |
+
""") as app:
|
| 930 |
+
gr.HTML("""
|
| 931 |
+
<div style='text-align: center; margin-bottom: 20px;'>
|
| 932 |
+
<h1 style='font-size: 42px; margin-bottom: 10px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;'>
|
| 933 |
+
📊SAP Finance playground for RPT-1-OSS Model
|
| 934 |
+
</h1>
|
| 935 |
+
<p style='font-size: 18px; color: #666;'>AI-Powered Financial Analysis & Predictions with RPT-1-OSS Model by Amit Lal</p>
|
| 936 |
+
</div>
|
| 937 |
+
""")
|
| 938 |
+
|
| 939 |
+
with gr.Tabs():
|
| 940 |
+
# Dashboard Tab
|
| 941 |
+
with gr.TabItem("📊 Dashboard"):
|
| 942 |
+
gr.Markdown("## 📈 Financial Overview")
|
| 943 |
+
gr.Markdown("*Real-time metrics and key financial indicators*")
|
| 944 |
+
metrics_display = gr.HTML()
|
| 945 |
+
with gr.Row():
|
| 946 |
+
chart1 = gr.Plot()
|
| 947 |
+
chart2 = gr.Plot()
|
| 948 |
+
chart3 = gr.Plot()
|
| 949 |
+
|
| 950 |
+
refresh_btn = gr.Button("Refresh Dashboard")
|
| 951 |
+
refresh_btn.click(
|
| 952 |
+
create_dashboard,
|
| 953 |
+
outputs=[metrics_display, chart1, chart2, chart3]
|
| 954 |
+
)
|
| 955 |
+
|
| 956 |
+
# Load dashboard on startup
|
| 957 |
+
app.load(create_dashboard, outputs=[metrics_display, chart1, chart2, chart3])
|
| 958 |
+
|
| 959 |
+
# Data Explorer Tab
|
| 960 |
+
with gr.TabItem("🔍 Data Explorer"):
|
| 961 |
+
gr.Markdown("## 🗂️ Explore Datasets")
|
| 962 |
+
gr.Markdown("*Browse and analyze your financial data*")
|
| 963 |
+
dataset_selector = gr.Dropdown(
|
| 964 |
+
choices=["GL Accounts", "Financial Statements", "Sales Orders", "Uploaded Data"],
|
| 965 |
+
label="Select Dataset",
|
| 966 |
+
value="GL Accounts"
|
| 967 |
+
)
|
| 968 |
+
info_text = gr.Textbox(label="Dataset Info", interactive=False)
|
| 969 |
+
data_chart = gr.Plot()
|
| 970 |
+
data_table = gr.Dataframe()
|
| 971 |
+
|
| 972 |
+
dataset_selector.change(
|
| 973 |
+
explore_dataset,
|
| 974 |
+
inputs=[dataset_selector],
|
| 975 |
+
outputs=[info_text, data_chart, data_table]
|
| 976 |
+
)
|
| 977 |
+
|
| 978 |
+
# Upload Tab
|
| 979 |
+
with gr.TabItem("📤 Upload"):
|
| 980 |
+
gr.Markdown("## 📁 Upload Dataset")
|
| 981 |
+
gr.Markdown("*Upload your own CSV files for analysis*")
|
| 982 |
+
file_upload = gr.File(label="Upload CSV File", file_types=[".csv"])
|
| 983 |
+
upload_status = gr.Textbox(label="Status", interactive=False)
|
| 984 |
+
uploaded_preview = gr.Dataframe()
|
| 985 |
+
|
| 986 |
+
file_upload.upload(
|
| 987 |
+
upload_file,
|
| 988 |
+
inputs=[file_upload],
|
| 989 |
+
outputs=[upload_status, uploaded_preview]
|
| 990 |
+
)
|
| 991 |
+
|
| 992 |
+
# Predictions Tab
|
| 993 |
+
with gr.TabItem("🤖 AI Predictions"):
|
| 994 |
+
gr.Markdown("## 🎯 AI Predictions with SAP-RPT-1-OSS")
|
| 995 |
+
gr.Markdown("*Train AI models on financial data and make intelligent predictions powered by deep learning*")
|
| 996 |
+
|
| 997 |
+
with gr.Row():
|
| 998 |
+
model_type_select = gr.Dropdown(
|
| 999 |
+
choices=["Classifier", "Regressor"],
|
| 1000 |
+
label="Model Type",
|
| 1001 |
+
value="Classifier",
|
| 1002 |
+
info="Classifier: Categorize data | Regressor: Predict numeric values"
|
| 1003 |
+
)
|
| 1004 |
+
use_gpu_check = gr.Checkbox(label="Use GPU (requires 80GB memory)", value=False)
|
| 1005 |
+
init_btn = gr.Button("Initialize Model", variant="primary")
|
| 1006 |
+
|
| 1007 |
+
init_status = gr.Textbox(label="Initialization Status", interactive=False)
|
| 1008 |
+
|
| 1009 |
+
gr.Markdown("### Step 1: Train the Model")
|
| 1010 |
+
with gr.Row():
|
| 1011 |
+
train_dataset_select = gr.Dropdown(
|
| 1012 |
+
choices=["Sales Orders", "GL Accounts", "Financial Statements", "Uploaded Data"],
|
| 1013 |
+
label="Select Training Dataset",
|
| 1014 |
+
value="Sales Orders"
|
| 1015 |
+
)
|
| 1016 |
+
train_btn = gr.Button("Train Model", variant="primary")
|
| 1017 |
+
|
| 1018 |
+
train_status = gr.Textbox(label="Training Status", interactive=False, lines=3)
|
| 1019 |
+
|
| 1020 |
+
gr.Markdown("### Step 2: Make Predictions")
|
| 1021 |
+
with gr.Row():
|
| 1022 |
+
pred_dataset_select = gr.Dropdown(
|
| 1023 |
+
choices=["Sales Orders", "Products", "GL Accounts", "Financial Statements", "Uploaded Data"],
|
| 1024 |
+
label="Select Prediction Dataset",
|
| 1025 |
+
value="Sales Orders",
|
| 1026 |
+
info="Choose which dataset to analyze"
|
| 1027 |
+
)
|
| 1028 |
+
prediction_scenario = gr.Dropdown(
|
| 1029 |
+
choices=[
|
| 1030 |
+
"High Value Order Classification",
|
| 1031 |
+
"Order Priority Classification",
|
| 1032 |
+
"Customer Segment Classification"
|
| 1033 |
+
],
|
| 1034 |
+
label="Prediction Scenario",
|
| 1035 |
+
value="High Value Order Classification",
|
| 1036 |
+
info="Scenario updates based on selected dataset"
|
| 1037 |
+
)
|
| 1038 |
+
|
| 1039 |
+
predict_btn = gr.Button("🎯 Make Predictions", variant="primary", size="lg")
|
| 1040 |
+
|
| 1041 |
+
pred_status = gr.Textbox(label="Prediction Results", interactive=False, lines=6)
|
| 1042 |
+
|
| 1043 |
+
gr.Markdown("### Prediction Visualizations")
|
| 1044 |
+
with gr.Row():
|
| 1045 |
+
pred_pie_chart = gr.Plot(label="Distribution")
|
| 1046 |
+
pred_bar_chart = gr.Plot(label="Summary")
|
| 1047 |
+
with gr.Row():
|
| 1048 |
+
pred_gauge_chart = gr.Plot(label="Confidence Score")
|
| 1049 |
+
|
| 1050 |
+
gr.Markdown("### Detailed Predictions")
|
| 1051 |
+
predictions_table = gr.Dataframe(label="Data with Predictions")
|
| 1052 |
+
|
| 1053 |
+
gr.Markdown("""
|
| 1054 |
+
**Dataset-Specific Scenarios:**
|
| 1055 |
+
|
| 1056 |
+
📦 **Sales Orders:**
|
| 1057 |
+
- High Value Order: Premium vs standard orders
|
| 1058 |
+
- Order Priority: Urgent vs normal handling
|
| 1059 |
+
- Customer Segment: VIP vs regular customers
|
| 1060 |
+
|
| 1061 |
+
🛍️ **Products:**
|
| 1062 |
+
- Product Performance: Best sellers vs low performers
|
| 1063 |
+
- Stock Risk: Items needing reorder
|
| 1064 |
+
|
| 1065 |
+
💰 **GL Accounts:**
|
| 1066 |
+
- Transaction Risk: Flagged vs normal transactions
|
| 1067 |
+
- Account Balance: Above vs below average
|
| 1068 |
+
- Expense Category: OpEx vs CapEx
|
| 1069 |
+
|
| 1070 |
+
📊 **Financial Statements:**
|
| 1071 |
+
- Financial Health: Strong vs weak performance
|
| 1072 |
+
- Profitability: High vs low margin periods
|
| 1073 |
+
- Growth Trend: Revenue growth vs decline
|
| 1074 |
+
""")
|
| 1075 |
+
|
| 1076 |
+
init_btn.click(
|
| 1077 |
+
init_model,
|
| 1078 |
+
inputs=[model_type_select, use_gpu_check],
|
| 1079 |
+
outputs=[init_status]
|
| 1080 |
+
)
|
| 1081 |
+
|
| 1082 |
+
train_btn.click(
|
| 1083 |
+
train_model,
|
| 1084 |
+
inputs=[train_dataset_select],
|
| 1085 |
+
outputs=[train_status]
|
| 1086 |
+
)
|
| 1087 |
+
|
| 1088 |
+
# Update scenarios when dataset changes
|
| 1089 |
+
pred_dataset_select.change(
|
| 1090 |
+
update_scenarios,
|
| 1091 |
+
inputs=[pred_dataset_select],
|
| 1092 |
+
outputs=[prediction_scenario]
|
| 1093 |
+
)
|
| 1094 |
+
|
| 1095 |
+
predict_btn.click(
|
| 1096 |
+
make_predictions,
|
| 1097 |
+
inputs=[pred_dataset_select, prediction_scenario],
|
| 1098 |
+
outputs=[pred_status, predictions_table, pred_pie_chart, pred_bar_chart, pred_gauge_chart]
|
| 1099 |
+
)
|
| 1100 |
+
|
| 1101 |
+
# OData Tab
|
| 1102 |
+
with gr.TabItem("🔗 OData"):
|
| 1103 |
+
gr.Markdown("## 🌐 SAP OData Connection")
|
| 1104 |
+
gr.Markdown("*Connect to live SAP systems and fetch real-time data*")
|
| 1105 |
+
|
| 1106 |
+
test_conn_btn = gr.Button("Test Connection")
|
| 1107 |
+
conn_status = gr.Textbox(label="Connection Status", interactive=False)
|
| 1108 |
+
|
| 1109 |
+
with gr.Row():
|
| 1110 |
+
entity_select = gr.Dropdown(
|
| 1111 |
+
choices=["Sales Orders", "Products", "Line Items", "Business Partners"],
|
| 1112 |
+
label="Select Entity",
|
| 1113 |
+
value="Sales Orders"
|
| 1114 |
+
)
|
| 1115 |
+
num_records = gr.Number(label="Number of Records", value=100, minimum=1, maximum=1000)
|
| 1116 |
+
fetch_btn = gr.Button("Fetch Data")
|
| 1117 |
+
|
| 1118 |
+
fetch_status = gr.Textbox(label="Fetch Status", interactive=False)
|
| 1119 |
+
odata_table = gr.Dataframe()
|
| 1120 |
+
|
| 1121 |
+
test_conn_btn.click(
|
| 1122 |
+
test_odata_connection,
|
| 1123 |
+
outputs=[conn_status]
|
| 1124 |
+
)
|
| 1125 |
+
|
| 1126 |
+
fetch_btn.click(
|
| 1127 |
+
fetch_odata_data,
|
| 1128 |
+
inputs=[entity_select, num_records],
|
| 1129 |
+
outputs=[fetch_status, odata_table]
|
| 1130 |
+
)
|
| 1131 |
+
|
| 1132 |
+
# Playground Tab
|
| 1133 |
+
with gr.TabItem("🎮 Playground"):
|
| 1134 |
+
gr.Markdown("## 🧪 SAP-RPT-1-OSS Playground")
|
| 1135 |
+
gr.Markdown("*Upload datasets, configure models, and train with real-time progress tracking*")
|
| 1136 |
+
|
| 1137 |
+
# Embedding Server Status
|
| 1138 |
+
gr.Markdown("**💡 Note:** The SAP-RPT-OSS embedding server starts automatically when the model makes predictions. Manual start is optional and may not be available in all installations.")
|
| 1139 |
+
with gr.Row():
|
| 1140 |
+
embedding_status_btn = gr.Button("Check Embedding Server", size="sm")
|
| 1141 |
+
embedding_status = gr.Textbox(label="Embedding Server Status", interactive=False, lines=4)
|
| 1142 |
+
start_server_btn = gr.Button("Start Embedding Server (Optional)", size="sm", variant="secondary")
|
| 1143 |
+
|
| 1144 |
+
embedding_status_btn.click(
|
| 1145 |
+
check_playground_embedding_server,
|
| 1146 |
+
outputs=[embedding_status]
|
| 1147 |
+
)
|
| 1148 |
+
|
| 1149 |
+
def start_playground_embedding_server():
|
| 1150 |
+
"""Start embedding server and return formatted message."""
|
| 1151 |
+
# Check if package is installed first
|
| 1152 |
+
if not is_sap_rpt_oss_installed():
|
| 1153 |
+
return f"❌ sap-rpt-oss package not found\n\n📦 Installation Required:\npip install git+https://github.com/SAP-samples/sap-rpt-1-oss"
|
| 1154 |
+
|
| 1155 |
+
success, message = start_embedding_server(None)
|
| 1156 |
+
if success:
|
| 1157 |
+
return f"✅ {message}\n\nThe server is now running and will be used automatically during training."
|
| 1158 |
+
else:
|
| 1159 |
+
# This is normal - SAP-RPT-OSS starts the server automatically when needed
|
| 1160 |
+
return f"ℹ️ {message}\n\n✅ This is expected! The embedding server will start automatically when you train the model or make predictions. No action needed."
|
| 1161 |
+
|
| 1162 |
+
start_server_btn.click(
|
| 1163 |
+
start_playground_embedding_server,
|
| 1164 |
+
outputs=[embedding_status]
|
| 1165 |
+
)
|
| 1166 |
+
|
| 1167 |
+
gr.Markdown("### Step 1: Upload Dataset")
|
| 1168 |
+
playground_upload = gr.File(
|
| 1169 |
+
label="Upload Dataset (CSV, Parquet, or JSON)",
|
| 1170 |
+
file_types=[".csv", ".parquet", ".json", ".jsonl"]
|
| 1171 |
+
)
|
| 1172 |
+
|
| 1173 |
+
playground_info = gr.Textbox(label="Dataset Info", interactive=False, lines=8)
|
| 1174 |
+
playground_preview = gr.Dataframe(label="Preview (First 10 Rows)")
|
| 1175 |
+
|
| 1176 |
+
gr.Markdown("### Step 2: Configure Model")
|
| 1177 |
+
|
| 1178 |
+
# Documentation section
|
| 1179 |
+
with gr.Accordion("📚 Parameter Guide - Click to expand", open=False):
|
| 1180 |
+
gr.Markdown("""
|
| 1181 |
+
**Understanding Model Parameters:**
|
| 1182 |
+
|
| 1183 |
+
**🎯 Task Type:**
|
| 1184 |
+
- **Classification**: Predicts categories/classes (e.g., "High Risk" vs "Low Risk", "Approved" vs "Rejected")
|
| 1185 |
+
- Target column should have discrete values (integers or categories)
|
| 1186 |
+
- Examples: Will invoice be paid late? (Yes/No), Product category (A/B/C)
|
| 1187 |
+
- **Regression**: Predicts continuous numeric values (e.g., price, days, amount)
|
| 1188 |
+
- Target column should have numeric values
|
| 1189 |
+
- Examples: Days until payment, Revenue amount, Risk score (0-100)
|
| 1190 |
+
|
| 1191 |
+
**📊 Test Split Ratio:**
|
| 1192 |
+
- Proportion of your dataset reserved for testing model performance
|
| 1193 |
+
- **0.1 (10%)**: Use more data for training, less for validation. Good for small datasets.
|
| 1194 |
+
- **0.2 (20%)**: Balanced approach. Recommended default for most cases.
|
| 1195 |
+
- **0.3-0.5 (30-50%)**: More data for testing. Use when you have large datasets and want thorough validation.
|
| 1196 |
+
- Higher test split = more reliable performance estimate, but less training data
|
| 1197 |
+
|
| 1198 |
+
**🧠 Max Context Size:**
|
| 1199 |
+
- Number of examples the model can consider simultaneously when making predictions
|
| 1200 |
+
- **512**: Fast, memory-efficient. Good for quick experiments or CPU-only setups.
|
| 1201 |
+
- **1024**: Balanced performance. Recommended for most use cases.
|
| 1202 |
+
- **2048**: Better accuracy, moderate memory. Good default for production.
|
| 1203 |
+
- **4096**: High accuracy, requires significant memory (16GB+ RAM).
|
| 1204 |
+
- **8192**: Best accuracy, requires 80GB GPU memory. Use only with powerful hardware.
|
| 1205 |
+
- Larger context = better understanding of patterns, but slower and more memory-intensive
|
| 1206 |
+
|
| 1207 |
+
**🎲 Bagging Factor:**
|
| 1208 |
+
- Number of independent models trained and combined (ensemble learning)
|
| 1209 |
+
- **1**: Single model. Fastest, baseline performance.
|
| 1210 |
+
- **2**: Two models averaged. Good balance of speed and accuracy. Recommended default.
|
| 1211 |
+
- **4**: Four models. Better accuracy, 2x slower than bagging=2.
|
| 1212 |
+
- **8**: Eight models. Best accuracy, 4x slower. Use for final production models.
|
| 1213 |
+
- Higher bagging = more robust predictions (reduces overfitting), but slower training
|
| 1214 |
+
|
| 1215 |
+
**💻 Use GPU:**
|
| 1216 |
+
- Enable GPU acceleration (requires NVIDIA GPU with 80GB VRAM)
|
| 1217 |
+
- GPU mode: Context size 8192, Bagging 8 (maximum performance)
|
| 1218 |
+
- CPU mode: Context size 2048, Bagging 1 (lightweight, works on any machine)
|
| 1219 |
+
- Leave unchecked unless you have enterprise-grade GPU hardware
|
| 1220 |
+
|
| 1221 |
+
**🔧 Handle Missing Values:**
|
| 1222 |
+
- How to treat empty/null values in your data
|
| 1223 |
+
- **mean**: Replace with column average (good for normally distributed data)
|
| 1224 |
+
- **median**: Replace with column median (better for skewed data, robust to outliers)
|
| 1225 |
+
- **zero**: Replace with 0 (simple, but may introduce bias)
|
| 1226 |
+
- **drop**: Remove rows with missing values (loses data, but preserves original distribution)
|
| 1227 |
+
|
| 1228 |
+
**📏 Normalize Features:**
|
| 1229 |
+
- Scale all numeric features to have mean=0 and std=1
|
| 1230 |
+
- **Enabled**: Recommended when features have very different scales (e.g., age 0-100 vs income 0-1000000)
|
| 1231 |
+
- **Disabled**: Use original feature scales (faster, works when scales are similar)
|
| 1232 |
+
- Normalization helps models converge faster and perform better with mixed-scale features
|
| 1233 |
+
""")
|
| 1234 |
+
|
| 1235 |
+
with gr.Row():
|
| 1236 |
+
playground_task_type = gr.Dropdown(
|
| 1237 |
+
choices=["classification", "regression"],
|
| 1238 |
+
label="Task Type",
|
| 1239 |
+
value="classification",
|
| 1240 |
+
info="Classification: Predict categories (Yes/No, A/B/C). Regression: Predict numbers (price, days, score)"
|
| 1241 |
+
)
|
| 1242 |
+
playground_target_col = gr.Dropdown(
|
| 1243 |
+
choices=[],
|
| 1244 |
+
label="Target Column",
|
| 1245 |
+
value=None,
|
| 1246 |
+
info="The column you want to predict. Auto-selected: last column in dataset"
|
| 1247 |
+
)
|
| 1248 |
+
|
| 1249 |
+
with gr.Row():
|
| 1250 |
+
playground_test_split = gr.Slider(
|
| 1251 |
+
minimum=0.1,
|
| 1252 |
+
maximum=0.5,
|
| 1253 |
+
value=0.2,
|
| 1254 |
+
step=0.05,
|
| 1255 |
+
label="Test Split Ratio",
|
| 1256 |
+
info="Proportion of data for testing (0.2 = 20% test, 80% train). Higher = more validation data, less training data"
|
| 1257 |
+
)
|
| 1258 |
+
playground_max_context = gr.Dropdown(
|
| 1259 |
+
choices=[512, 1024, 2048, 4096, 8192],
|
| 1260 |
+
value=2048,
|
| 1261 |
+
label="Max Context Size",
|
| 1262 |
+
info="How many examples model considers (512=fast/light, 2048=balanced, 8192=best/needs GPU). Larger = better accuracy, more memory"
|
| 1263 |
+
)
|
| 1264 |
+
|
| 1265 |
+
with gr.Row():
|
| 1266 |
+
playground_bagging = gr.Dropdown(
|
| 1267 |
+
choices=[1, 2, 4, 8],
|
| 1268 |
+
value=2,
|
| 1269 |
+
label="Bagging Factor",
|
| 1270 |
+
info="Number of models to combine (1=fast, 2=balanced, 8=best). Higher = more accurate but slower. Reduces overfitting"
|
| 1271 |
+
)
|
| 1272 |
+
playground_use_gpu = gr.Checkbox(
|
| 1273 |
+
label="Use GPU (requires 80GB VRAM)",
|
| 1274 |
+
value=False,
|
| 1275 |
+
info="Enable GPU acceleration. Only check if you have NVIDIA GPU with 80GB memory. Unchecked = CPU mode (works on any machine)"
|
| 1276 |
+
)
|
| 1277 |
+
|
| 1278 |
+
with gr.Row():
|
| 1279 |
+
playground_handle_missing = gr.Dropdown(
|
| 1280 |
+
choices=["mean", "median", "zero", "drop"],
|
| 1281 |
+
value="mean",
|
| 1282 |
+
label="Handle Missing Values",
|
| 1283 |
+
info="How to treat empty cells: mean/median (fill with average), zero (fill with 0), drop (remove rows)"
|
| 1284 |
+
)
|
| 1285 |
+
playground_normalize = gr.Checkbox(
|
| 1286 |
+
label="Normalize Features",
|
| 1287 |
+
value=False,
|
| 1288 |
+
info="Scale all numeric features to same range (mean=0, std=1). Recommended when features have very different scales"
|
| 1289 |
+
)
|
| 1290 |
+
|
| 1291 |
+
gr.Markdown("### Step 3: Train Model")
|
| 1292 |
+
train_playground_btn = gr.Button("🚀 Train Model", variant="primary", size="lg")
|
| 1293 |
+
playground_train_status = gr.Textbox(label="Training Status", interactive=False, lines=6)
|
| 1294 |
+
|
| 1295 |
+
gr.Markdown("### Step 4: Results")
|
| 1296 |
+
playground_results_table = gr.Dataframe(label="Test Predictions (First 100 Rows)")
|
| 1297 |
+
playground_download = gr.File(label="Download Full Results CSV")
|
| 1298 |
+
|
| 1299 |
+
# Connect upload handler
|
| 1300 |
+
def update_playground_components(file):
|
| 1301 |
+
"""Update all playground components after upload."""
|
| 1302 |
+
result = handle_playground_upload(file)
|
| 1303 |
+
if len(result) == 7:
|
| 1304 |
+
info, preview, choices, value, task_type, choices2, value2 = result
|
| 1305 |
+
return (
|
| 1306 |
+
info,
|
| 1307 |
+
preview,
|
| 1308 |
+
gr.Dropdown(choices=choices, value=value),
|
| 1309 |
+
task_type,
|
| 1310 |
+
gr.Dropdown(choices=choices2, value=value2)
|
| 1311 |
+
)
|
| 1312 |
+
elif len(result) == 7 and result[2] == []: # Error case
|
| 1313 |
+
return result[0], result[1], gr.Dropdown(choices=[], value=None), result[4], gr.Dropdown(choices=[], value=None)
|
| 1314 |
+
return result
|
| 1315 |
+
|
| 1316 |
+
playground_upload.upload(
|
| 1317 |
+
update_playground_components,
|
| 1318 |
+
inputs=[playground_upload],
|
| 1319 |
+
outputs=[
|
| 1320 |
+
playground_info,
|
| 1321 |
+
playground_preview,
|
| 1322 |
+
playground_target_col,
|
| 1323 |
+
playground_task_type,
|
| 1324 |
+
playground_target_col
|
| 1325 |
+
]
|
| 1326 |
+
)
|
| 1327 |
+
|
| 1328 |
+
# Connect training handler
|
| 1329 |
+
train_playground_btn.click(
|
| 1330 |
+
train_playground_model,
|
| 1331 |
+
inputs=[
|
| 1332 |
+
playground_task_type,
|
| 1333 |
+
playground_target_col,
|
| 1334 |
+
playground_test_split,
|
| 1335 |
+
playground_max_context,
|
| 1336 |
+
playground_bagging,
|
| 1337 |
+
playground_use_gpu,
|
| 1338 |
+
playground_handle_missing,
|
| 1339 |
+
playground_normalize
|
| 1340 |
+
],
|
| 1341 |
+
outputs=[
|
| 1342 |
+
playground_train_status,
|
| 1343 |
+
playground_results_table,
|
| 1344 |
+
playground_download,
|
| 1345 |
+
playground_download
|
| 1346 |
+
]
|
| 1347 |
+
)
|
| 1348 |
+
|
| 1349 |
+
with gr.Accordion("💡 Quick Start Guide", open=False):
|
| 1350 |
+
gr.Markdown("""
|
| 1351 |
+
**Recommended Settings by Use Case:**
|
| 1352 |
+
|
| 1353 |
+
**🚀 Quick Experiment (Fast, Low Memory):**
|
| 1354 |
+
- Task Type: Auto-detect
|
| 1355 |
+
- Test Split: 0.2 (20%)
|
| 1356 |
+
- Max Context: 512
|
| 1357 |
+
- Bagging: 1
|
| 1358 |
+
- GPU: Unchecked
|
| 1359 |
+
- Missing Values: mean
|
| 1360 |
+
- Normalize: Unchecked
|
| 1361 |
+
- *Best for: Trying out the model, small datasets, CPU-only machines*
|
| 1362 |
+
|
| 1363 |
+
**⚖️ Balanced (Recommended Default):**
|
| 1364 |
+
- Task Type: Auto-detect
|
| 1365 |
+
- Test Split: 0.2 (20%)
|
| 1366 |
+
- Max Context: 2048
|
| 1367 |
+
- Bagging: 2
|
| 1368 |
+
- GPU: Unchecked
|
| 1369 |
+
- Missing Values: mean
|
| 1370 |
+
- Normalize: Check if features have very different scales
|
| 1371 |
+
- *Best for: Most production use cases, good accuracy/speed balance*
|
| 1372 |
+
|
| 1373 |
+
**🏆 Maximum Accuracy (Slow, High Memory):**
|
| 1374 |
+
- Task Type: Auto-detect
|
| 1375 |
+
- Test Split: 0.3 (30%)
|
| 1376 |
+
- Max Context: 8192
|
| 1377 |
+
- Bagging: 8
|
| 1378 |
+
- GPU: Checked (requires 80GB GPU)
|
| 1379 |
+
- Missing Values: median (more robust)
|
| 1380 |
+
- Normalize: Checked
|
| 1381 |
+
- *Best for: Final production models, large datasets, when accuracy is critical*
|
| 1382 |
+
|
| 1383 |
+
**📋 Step-by-Step Workflow:**
|
| 1384 |
+
1. **Upload Dataset**: CSV, Parquet, or JSON file
|
| 1385 |
+
2. **Review Auto-Detection**: Check if task type and target column are correct
|
| 1386 |
+
3. **Adjust Parameters**: Use recommended settings above or customize
|
| 1387 |
+
4. **Train Model**: Click "Train Model" and wait for progress
|
| 1388 |
+
5. **Review Results**: Check accuracy/metrics and download predictions
|
| 1389 |
+
|
| 1390 |
+
**⚠️ Common Issues:**
|
| 1391 |
+
- **"Unknown label type"**: Target column has wrong data type. Change Task Type or convert target column.
|
| 1392 |
+
- **Out of Memory**: Reduce Max Context Size or Bagging Factor
|
| 1393 |
+
- **Slow Training**: Reduce Bagging Factor or Max Context Size
|
| 1394 |
+
- **Poor Accuracy**: Increase Max Context Size, Bagging Factor, or check data quality
|
| 1395 |
+
""")
|
| 1396 |
+
|
| 1397 |
+
gr.Markdown("""
|
| 1398 |
+
**Playground Features:**
|
| 1399 |
+
- Upload CSV, Parquet, or JSON datasets
|
| 1400 |
+
- Auto-detect task type from filename and target column
|
| 1401 |
+
- Auto-select target column (defaults to last column)
|
| 1402 |
+
- Configure model parameters with detailed guidance
|
| 1403 |
+
- Real-time progress tracking during training
|
| 1404 |
+
- Download results as CSV with predictions
|
| 1405 |
+
|
| 1406 |
+
**Example Use Cases:**
|
| 1407 |
+
- Predictive business outcomes (invoice late payment, days to payment)
|
| 1408 |
+
- Recommendations & auto-defaulting (form of address)
|
| 1409 |
+
- Normalization & coding (country ISO codes)
|
| 1410 |
+
- Data quality & anomaly flags (bank details review)
|
| 1411 |
+
- Derived scores & segments (employee risk of leave)
|
| 1412 |
+
- Matching & linking (material entity matching)
|
| 1413 |
+
- Information extraction (ticket topic classification)
|
| 1414 |
+
""")
|
| 1415 |
+
|
| 1416 |
+
|
| 1417 |
+
if __name__ == "__main__":
|
| 1418 |
+
# Load datasets on startup
|
| 1419 |
+
load_datasets()
|
| 1420 |
+
|
| 1421 |
+
# Launch the app
|
| 1422 |
+
app.launch(share=False, server_name="127.0.0.1", server_port=7862, quiet=False)
|
data/synthetic_financial_statements.csv
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Period,Statement_Type,Revenue,Cost_of_Goods_Sold,Gross_Profit,Operating_Expenses,EBITDA,Depreciation,EBIT,Interest_Expense,EBT,Tax,Net_Income,Cash,Accounts_Receivable,Inventory,Current_Assets,PPE,Total_Assets,Accounts_Payable,Short_Term_Debt,Current_Liabilities,Long_Term_Debt,Total_Liabilities,Equity
|
| 2 |
+
2024-01,P&L,687270.06,405587.52,281682.54,346398.79,-64716.25,37959.75,-102676.0,13120.37,-115796.38,-28949.09,-86847.28,162397.81,211616.72,279926.42,653940.95,3803345.04,4457285.99,170807.26,52058.45,222865.71,1969909.85,2192775.56,2264510.43
|
| 3 |
+
2024-01,P&L,916221.32,405398.45,510822.87,236364.99,274457.87,25502.14,248955.74,16084.84,232870.89,58217.72,174653.17,309902.57,286389.0,193684.37,789975.95,3835558.68,4625534.63,113949.39,79214.46,193163.85,1366361.84,1559525.69,3066008.94
|
| 4 |
+
2024-03,P&L,728034.99,405541.11,322493.88,239934.76,82559.12,35427.03,47132.09,21848.29,25283.8,6320.95,18962.85,118580.17,321508.97,175578.62,615667.75,2195154.78,2810822.53,194888.55,146563.2,341451.76,1808397.35,2149849.11,660973.43
|
| 5 |
+
2024-03,P&L,652306.88,273665.19,378641.69,336846.61,41795.09,33204.57,8590.51,12440.76,-3850.25,-962.56,-2887.69,298070.76,206877.7,286398.06,791346.53,2776339.94,3567686.47,166252.23,81171.11,247423.34,1520068.02,1767491.36,1800195.12
|
| 6 |
+
2024-04,P&L,773355.14,337933.68,435421.46,393916.93,41504.53,43253.98,-1749.46,28789.98,-30539.43,-7634.86,-22904.58,457930.94,319580.0,288281.14,1065792.07,2265477.51,3331269.58,119598.29,54522.73,174121.02,1325330.33,1499451.35,1831818.23
|
| 7 |
+
2024-05,P&L,694338.64,315417.08,378921.56,365747.5,13174.06,30702.6,-17528.54,15618.69,-33147.23,-8286.81,-24860.42,317078.43,228184.84,270329.55,815592.83,2223651.93,3039244.76,198688.69,127224.48,325913.17,1198715.68,1524628.85,1514615.9
|
| 8 |
+
2024-06,P&L,502761.06,283100.87,219660.18,341371.47,-121711.28,41870.22,-163581.5,25425.41,-189006.91,-47251.73,-141755.18,129617.86,271693.15,167380.36,568691.37,4589310.28,5158001.64,162329.81,83089.8,245419.62,1063558.35,1308977.97,3849023.68
|
| 9 |
+
2024-07,P&L,655491.16,304827.42,350663.74,345921.24,4742.5,39126.72,-34384.22,27744.25,-62128.48,-15532.12,-46596.36,288885.97,223918.85,256986.72,769791.54,4282355.15,5052146.68,156127.72,127096.72,283224.44,1493795.6,1777020.03,3275126.65
|
| 10 |
+
2024-08,P&L,761366.41,369649.64,391716.77,205083.83,186632.95,23236.74,163396.21,10628.58,152767.62,38191.91,114575.72,354564.16,262871.2,226285.6,843720.96,4722699.42,5566420.39,124929.22,91038.29,215967.52,1755551.14,1971518.65,3594901.73
|
| 11 |
+
2024-09,P&L,614399.08,255218.91,359180.17,257950.29,101229.88,24836.64,76393.24,28593.95,47799.29,11949.82,35849.47,423248.15,326680.75,280719.09,1030647.99,4411016.23,5441664.22,118657.01,139255.9,257912.91,1539342.24,1797255.15,3644409.07
|
| 12 |
+
2024-10,P&L,903720.08,523451.17,380268.91,263600.69,116668.21,23301.56,93366.65,14558.7,78807.95,19701.99,59105.96,270843.12,363602.95,279109.59,913555.66,2020856.39,2934412.05,151074.73,91741.1,242815.83,1222107.81,1464923.64,1469488.41
|
| 13 |
+
2024-11,P&L,559932.68,261781.43,298151.26,388581.94,-90430.68,29696.09,-120126.77,20375.81,-140502.58,-35125.65,-105376.94,381207.58,272725.92,295767.31,949700.82,4887341.88,5837042.7,125178.23,99724.85,224903.08,1300878.31,1525781.39,4311261.31
|
data/synthetic_gl_accounts.csv
ADDED
|
@@ -0,0 +1,1001 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Transaction_ID,Date,Account_Code,Account_Description,Debit,Credit,Balance,Document_Number,Posting_Period
|
| 2 |
+
TXN000001,2024-12-14,210000,Accrued Liabilities,0.0,9253.4,-9253.4,DOC6191,2024-12
|
| 3 |
+
TXN000002,2024-04-12,540000,Marketing Expense,22347.05,0.0,22347.05,DOC5426,2024-04
|
| 4 |
+
TXN000003,2024-03-28,310000,Retained Earnings,0.0,16752.06,-16752.06,DOC9322,2024-03
|
| 5 |
+
TXN000004,2024-09-14,540000,Marketing Expense,36127.74,0.0,36127.74,DOC7949,2024-09
|
| 6 |
+
TXN000005,2024-07-10,110000,Accounts Receivable,49611.36,0.0,49611.36,DOC2184,2024-07
|
| 7 |
+
TXN000006,2024-11-09,320000,Other Equity,0.0,26285.35,-26285.35,DOC9666,2024-11
|
| 8 |
+
TXN000007,2024-07-06,300000,Common Stock,0.0,18381.46,-18381.46,DOC1189,2024-07
|
| 9 |
+
TXN000008,2024-02-20,420000,Interest Income,0.0,19184.85,-19184.85,DOC2267,2024-02
|
| 10 |
+
TXN000009,2024-11-02,120000,Inventory,34047.35,0.0,34047.35,DOC6393,2024-11
|
| 11 |
+
TXN000010,2024-03-29,130000,Prepaid Expenses,48285.04,0.0,48285.04,DOC9433,2024-03
|
| 12 |
+
TXN000011,2024-12-11,230000,Long-term Debt,0.0,4973.84,-4973.84,DOC7235,2024-12
|
| 13 |
+
TXN000012,2024-09-20,420000,Interest Income,0.0,1815.99,-1815.99,DOC4152,2024-09
|
| 14 |
+
TXN000013,2024-02-19,130000,Prepaid Expenses,33159.86,0.0,33159.86,DOC4073,2024-02
|
| 15 |
+
TXN000014,2024-02-23,200000,Accounts Payable,0.0,27380.84,-27380.84,DOC8989,2024-02
|
| 16 |
+
TXN000015,2024-08-05,510000,Salaries and Wages,22542.73,0.0,22542.73,DOC5297,2024-08
|
| 17 |
+
TXN000016,2024-09-26,130000,Prepaid Expenses,36390.87,0.0,36390.87,DOC8629,2024-09
|
| 18 |
+
TXN000017,2024-07-31,220000,Short-term Debt,0.0,19495.0,-19495.0,DOC9529,2024-07
|
| 19 |
+
TXN000018,2024-02-22,420000,Interest Income,0.0,29378.88,-29378.88,DOC5859,2024-02
|
| 20 |
+
TXN000019,2024-02-10,400000,Sales Revenue,0.0,14884.05,-14884.05,DOC1064,2024-02
|
| 21 |
+
TXN000020,2024-01-09,210000,Accrued Liabilities,0.0,38635.01,-38635.01,DOC3027,2024-01
|
| 22 |
+
TXN000021,2024-03-03,220000,Short-term Debt,0.0,40791.53,-40791.53,DOC7736,2024-03
|
| 23 |
+
TXN000022,2024-06-11,220000,Short-term Debt,0.0,39529.76,-39529.76,DOC6892,2024-06
|
| 24 |
+
TXN000023,2024-08-18,300000,Common Stock,0.0,32588.74,-32588.74,DOC4099,2024-08
|
| 25 |
+
TXN000024,2024-07-19,210000,Accrued Liabilities,0.0,31202.58,-31202.58,DOC4104,2024-07
|
| 26 |
+
TXN000025,2024-03-02,430000,Other Income,0.0,16326.65,-16326.65,DOC3731,2024-03
|
| 27 |
+
TXN000026,2024-08-01,220000,Short-term Debt,0.0,44371.92,-44371.92,DOC6056,2024-08
|
| 28 |
+
TXN000027,2024-04-10,120000,Inventory,48588.43,0.0,48588.43,DOC4840,2024-04
|
| 29 |
+
TXN000028,2024-08-05,140000,"Property, Plant & Equipment",11875.65,0.0,11875.65,DOC7938,2024-08
|
| 30 |
+
TXN000029,2024-07-25,230000,Long-term Debt,0.0,21434.3,-21434.3,DOC8721,2024-07
|
| 31 |
+
TXN000030,2024-06-27,400000,Sales Revenue,0.0,1668.32,-1668.32,DOC3790,2024-06
|
| 32 |
+
TXN000031,2024-02-21,500000,Cost of Goods Sold,28207.45,0.0,28207.45,DOC7019,2024-02
|
| 33 |
+
TXN000032,2024-08-18,140000,"Property, Plant & Equipment",20578.11,0.0,20578.11,DOC4242,2024-08
|
| 34 |
+
TXN000033,2024-01-13,130000,Prepaid Expenses,3941.3,0.0,3941.3,DOC4157,2024-01
|
| 35 |
+
TXN000034,2024-06-18,110000,Accounts Receivable,40425.21,0.0,40425.21,DOC3693,2024-06
|
| 36 |
+
TXN000035,2024-02-13,320000,Other Equity,0.0,20883.85,-20883.85,DOC6450,2024-02
|
| 37 |
+
TXN000036,2024-07-08,210000,Accrued Liabilities,0.0,5591.59,-5591.59,DOC2306,2024-07
|
| 38 |
+
TXN000037,2024-08-20,530000,Utilities Expense,15308.58,0.0,15308.58,DOC9901,2024-08
|
| 39 |
+
TXN000038,2024-05-16,220000,Short-term Debt,0.0,24293.02,-24293.02,DOC1663,2024-05
|
| 40 |
+
TXN000039,2024-11-10,420000,Interest Income,0.0,16227.83,-16227.83,DOC2495,2024-11
|
| 41 |
+
TXN000040,2024-06-28,230000,Long-term Debt,0.0,18245.12,-18245.12,DOC7585,2024-06
|
| 42 |
+
TXN000041,2024-09-24,530000,Utilities Expense,12663.94,0.0,12663.94,DOC8554,2024-09
|
| 43 |
+
TXN000042,2024-04-10,500000,Cost of Goods Sold,14313.54,0.0,14313.54,DOC1698,2024-04
|
| 44 |
+
TXN000043,2024-01-02,500000,Cost of Goods Sold,25183.68,0.0,25183.68,DOC1854,2024-01
|
| 45 |
+
TXN000044,2024-08-11,140000,"Property, Plant & Equipment",45422.47,0.0,45422.47,DOC6249,2024-08
|
| 46 |
+
TXN000045,2024-06-20,540000,Marketing Expense,22444.38,0.0,22444.38,DOC6535,2024-06
|
| 47 |
+
TXN000046,2024-07-21,130000,Prepaid Expenses,18545.76,0.0,18545.76,DOC9958,2024-07
|
| 48 |
+
TXN000047,2024-10-06,200000,Accounts Payable,0.0,23568.0,-23568.0,DOC8777,2024-10
|
| 49 |
+
TXN000048,2024-08-27,200000,Accounts Payable,0.0,39937.42,-39937.42,DOC5282,2024-08
|
| 50 |
+
TXN000049,2024-12-14,200000,Accounts Payable,0.0,42932.1,-42932.1,DOC3811,2024-12
|
| 51 |
+
TXN000050,2024-12-11,130000,Prepaid Expenses,25653.44,0.0,25653.44,DOC9338,2024-12
|
| 52 |
+
TXN000051,2024-12-17,530000,Utilities Expense,4899.21,0.0,4899.21,DOC9680,2024-12
|
| 53 |
+
TXN000052,2024-05-07,100000,Cash and Cash Equivalents,25935.79,0.0,25935.79,DOC5736,2024-05
|
| 54 |
+
TXN000053,2024-05-30,310000,Retained Earnings,0.0,27118.25,-27118.25,DOC1262,2024-05
|
| 55 |
+
TXN000054,2024-12-11,430000,Other Income,0.0,49110.2,-49110.2,DOC3049,2024-12
|
| 56 |
+
TXN000055,2024-10-30,100000,Cash and Cash Equivalents,48274.43,0.0,48274.43,DOC5548,2024-10
|
| 57 |
+
TXN000056,2024-06-08,140000,"Property, Plant & Equipment",31691.76,0.0,31691.76,DOC8400,2024-06
|
| 58 |
+
TXN000057,2024-05-26,120000,Inventory,36325.19,0.0,36325.19,DOC2154,2024-05
|
| 59 |
+
TXN000058,2024-05-31,530000,Utilities Expense,20284.96,0.0,20284.96,DOC2648,2024-05
|
| 60 |
+
TXN000059,2024-04-13,220000,Short-term Debt,0.0,30360.81,-30360.81,DOC3557,2024-04
|
| 61 |
+
TXN000060,2024-06-01,120000,Inventory,352.57,0.0,352.57,DOC5973,2024-06
|
| 62 |
+
TXN000061,2024-07-12,510000,Salaries and Wages,34625.57,0.0,34625.57,DOC1956,2024-07
|
| 63 |
+
TXN000062,2024-06-09,230000,Long-term Debt,0.0,1001.96,-1001.96,DOC5493,2024-06
|
| 64 |
+
TXN000063,2024-10-30,540000,Marketing Expense,37349.92,0.0,37349.92,DOC7015,2024-10
|
| 65 |
+
TXN000064,2024-05-14,220000,Short-term Debt,0.0,36074.9,-36074.9,DOC5735,2024-05
|
| 66 |
+
TXN000065,2024-06-24,100000,Cash and Cash Equivalents,4774.37,0.0,4774.37,DOC9050,2024-06
|
| 67 |
+
TXN000066,2024-06-06,410000,Service Revenue,0.0,48653.23,-48653.23,DOC4436,2024-06
|
| 68 |
+
TXN000067,2024-09-20,520000,Rent Expense,31593.82,0.0,31593.82,DOC1225,2024-09
|
| 69 |
+
TXN000068,2024-10-12,540000,Marketing Expense,32290.66,0.0,32290.66,DOC8022,2024-10
|
| 70 |
+
TXN000069,2024-11-12,100000,Cash and Cash Equivalents,25009.75,0.0,25009.75,DOC8683,2024-11
|
| 71 |
+
TXN000070,2024-07-10,120000,Inventory,32309.07,0.0,32309.07,DOC9208,2024-07
|
| 72 |
+
TXN000071,2024-08-07,320000,Other Equity,0.0,23550.23,-23550.23,DOC2069,2024-08
|
| 73 |
+
TXN000072,2024-01-06,540000,Marketing Expense,18570.92,0.0,18570.92,DOC2060,2024-01
|
| 74 |
+
TXN000073,2024-10-28,500000,Cost of Goods Sold,48336.08,0.0,48336.08,DOC4170,2024-10
|
| 75 |
+
TXN000074,2024-04-25,100000,Cash and Cash Equivalents,14793.0,0.0,14793.0,DOC1980,2024-04
|
| 76 |
+
TXN000075,2024-09-12,100000,Cash and Cash Equivalents,24315.47,0.0,24315.47,DOC2816,2024-09
|
| 77 |
+
TXN000076,2024-08-10,300000,Common Stock,0.0,42226.24,-42226.24,DOC6442,2024-08
|
| 78 |
+
TXN000077,2024-06-22,220000,Short-term Debt,0.0,4949.11,-4949.11,DOC8455,2024-06
|
| 79 |
+
TXN000078,2024-12-07,420000,Interest Income,0.0,17996.47,-17996.47,DOC8806,2024-12
|
| 80 |
+
TXN000079,2024-09-29,300000,Common Stock,0.0,42448.62,-42448.62,DOC8560,2024-09
|
| 81 |
+
TXN000080,2024-09-02,310000,Retained Earnings,0.0,18038.61,-18038.61,DOC6596,2024-09
|
| 82 |
+
TXN000081,2024-09-03,300000,Common Stock,0.0,21047.06,-21047.06,DOC2841,2024-09
|
| 83 |
+
TXN000082,2024-11-11,400000,Sales Revenue,0.0,25615.99,-25615.99,DOC8992,2024-11
|
| 84 |
+
TXN000083,2024-06-21,130000,Prepaid Expenses,9794.27,0.0,9794.27,DOC7655,2024-06
|
| 85 |
+
TXN000084,2024-05-21,410000,Service Revenue,0.0,44511.27,-44511.27,DOC7614,2024-05
|
| 86 |
+
TXN000085,2024-04-01,420000,Interest Income,0.0,28985.36,-28985.36,DOC6919,2024-04
|
| 87 |
+
TXN000086,2024-06-01,520000,Rent Expense,7836.58,0.0,7836.58,DOC2148,2024-06
|
| 88 |
+
TXN000087,2024-06-28,500000,Cost of Goods Sold,2037.85,0.0,2037.85,DOC4854,2024-06
|
| 89 |
+
TXN000088,2024-04-10,310000,Retained Earnings,0.0,26159.94,-26159.94,DOC4124,2024-04
|
| 90 |
+
TXN000089,2024-04-17,320000,Other Equity,0.0,31182.23,-31182.23,DOC6315,2024-04
|
| 91 |
+
TXN000090,2024-12-30,200000,Accounts Payable,0.0,9799.56,-9799.56,DOC5142,2024-12
|
| 92 |
+
TXN000091,2024-11-06,120000,Inventory,7003.82,0.0,7003.82,DOC7799,2024-11
|
| 93 |
+
TXN000092,2024-05-03,400000,Sales Revenue,0.0,35758.3,-35758.3,DOC5752,2024-05
|
| 94 |
+
TXN000093,2024-04-01,520000,Rent Expense,37227.73,0.0,37227.73,DOC9932,2024-04
|
| 95 |
+
TXN000094,2024-11-13,540000,Marketing Expense,41815.41,0.0,41815.41,DOC8560,2024-11
|
| 96 |
+
TXN000095,2024-05-08,320000,Other Equity,0.0,8747.39,-8747.39,DOC1512,2024-05
|
| 97 |
+
TXN000096,2024-10-16,420000,Interest Income,0.0,12065.39,-12065.39,DOC6237,2024-10
|
| 98 |
+
TXN000097,2024-03-29,430000,Other Income,0.0,33043.85,-33043.85,DOC4343,2024-03
|
| 99 |
+
TXN000098,2024-07-10,210000,Accrued Liabilities,0.0,27762.27,-27762.27,DOC8004,2024-07
|
| 100 |
+
TXN000099,2024-03-16,120000,Inventory,28345.26,0.0,28345.26,DOC4506,2024-03
|
| 101 |
+
TXN000100,2024-03-26,140000,"Property, Plant & Equipment",818.24,0.0,818.24,DOC6188,2024-03
|
| 102 |
+
TXN000101,2024-04-03,420000,Interest Income,0.0,42787.48,-42787.48,DOC7617,2024-04
|
| 103 |
+
TXN000102,2024-12-06,430000,Other Income,0.0,23726.24,-23726.24,DOC8421,2024-12
|
| 104 |
+
TXN000103,2024-01-23,140000,"Property, Plant & Equipment",2498.14,0.0,2498.14,DOC3849,2024-01
|
| 105 |
+
TXN000104,2024-08-10,530000,Utilities Expense,863.7,0.0,863.7,DOC3489,2024-08
|
| 106 |
+
TXN000105,2024-11-20,100000,Cash and Cash Equivalents,34229.79,0.0,34229.79,DOC3839,2024-11
|
| 107 |
+
TXN000106,2024-09-03,430000,Other Income,0.0,47218.15,-47218.15,DOC7303,2024-09
|
| 108 |
+
TXN000107,2024-05-31,530000,Utilities Expense,33890.7,0.0,33890.7,DOC3427,2024-05
|
| 109 |
+
TXN000108,2024-06-27,100000,Cash and Cash Equivalents,41049.91,0.0,41049.91,DOC6387,2024-06
|
| 110 |
+
TXN000109,2024-03-05,120000,Inventory,48063.41,0.0,48063.41,DOC4913,2024-03
|
| 111 |
+
TXN000110,2024-02-13,310000,Retained Earnings,0.0,13770.66,-13770.66,DOC5107,2024-02
|
| 112 |
+
TXN000111,2024-09-09,410000,Service Revenue,0.0,4812.7,-4812.7,DOC3082,2024-09
|
| 113 |
+
TXN000112,2024-03-30,500000,Cost of Goods Sold,16016.88,0.0,16016.88,DOC1417,2024-03
|
| 114 |
+
TXN000113,2024-04-14,520000,Rent Expense,24852.27,0.0,24852.27,DOC1825,2024-04
|
| 115 |
+
TXN000114,2024-04-23,540000,Marketing Expense,31484.25,0.0,31484.25,DOC1412,2024-04
|
| 116 |
+
TXN000115,2024-08-04,130000,Prepaid Expenses,40193.7,0.0,40193.7,DOC9867,2024-08
|
| 117 |
+
TXN000116,2024-12-22,300000,Common Stock,0.0,37555.68,-37555.68,DOC3786,2024-12
|
| 118 |
+
TXN000117,2024-04-08,500000,Cost of Goods Sold,20689.62,0.0,20689.62,DOC6073,2024-04
|
| 119 |
+
TXN000118,2024-04-05,500000,Cost of Goods Sold,17106.1,0.0,17106.1,DOC8357,2024-04
|
| 120 |
+
TXN000119,2024-09-24,140000,"Property, Plant & Equipment",21506.8,0.0,21506.8,DOC6644,2024-09
|
| 121 |
+
TXN000120,2024-12-26,120000,Inventory,18948.67,0.0,18948.67,DOC9787,2024-12
|
| 122 |
+
TXN000121,2024-08-04,430000,Other Income,0.0,16070.48,-16070.48,DOC1698,2024-08
|
| 123 |
+
TXN000122,2024-06-25,520000,Rent Expense,2768.92,0.0,2768.92,DOC8400,2024-06
|
| 124 |
+
TXN000123,2024-03-16,520000,Rent Expense,17809.77,0.0,17809.77,DOC1717,2024-03
|
| 125 |
+
TXN000124,2024-12-04,530000,Utilities Expense,24701.98,0.0,24701.98,DOC9335,2024-12
|
| 126 |
+
TXN000125,2024-03-09,540000,Marketing Expense,14731.22,0.0,14731.22,DOC8192,2024-03
|
| 127 |
+
TXN000126,2024-02-22,530000,Utilities Expense,39599.79,0.0,39599.79,DOC2062,2024-02
|
| 128 |
+
TXN000127,2024-06-29,400000,Sales Revenue,0.0,24771.57,-24771.57,DOC7541,2024-06
|
| 129 |
+
TXN000128,2024-06-11,140000,"Property, Plant & Equipment",44396.44,0.0,44396.44,DOC5330,2024-06
|
| 130 |
+
TXN000129,2024-05-25,310000,Retained Earnings,0.0,48435.73,-48435.73,DOC8241,2024-05
|
| 131 |
+
TXN000130,2024-09-09,320000,Other Equity,0.0,41940.19,-41940.19,DOC6293,2024-09
|
| 132 |
+
TXN000131,2024-06-16,400000,Sales Revenue,0.0,3730.87,-3730.87,DOC7938,2024-06
|
| 133 |
+
TXN000132,2024-01-05,110000,Accounts Receivable,25714.98,0.0,25714.98,DOC6541,2024-01
|
| 134 |
+
TXN000133,2024-05-15,520000,Rent Expense,18776.11,0.0,18776.11,DOC2365,2024-05
|
| 135 |
+
TXN000134,2024-05-24,530000,Utilities Expense,47367.7,0.0,47367.7,DOC5312,2024-05
|
| 136 |
+
TXN000135,2024-05-11,400000,Sales Revenue,0.0,17575.89,-17575.89,DOC8419,2024-05
|
| 137 |
+
TXN000136,2024-12-29,520000,Rent Expense,27964.37,0.0,27964.37,DOC5186,2024-12
|
| 138 |
+
TXN000137,2024-12-11,300000,Common Stock,0.0,16579.6,-16579.6,DOC5268,2024-12
|
| 139 |
+
TXN000138,2024-08-29,400000,Sales Revenue,0.0,23486.17,-23486.17,DOC7619,2024-08
|
| 140 |
+
TXN000139,2024-11-12,220000,Short-term Debt,0.0,41157.24,-41157.24,DOC4072,2024-11
|
| 141 |
+
TXN000140,2024-12-13,120000,Inventory,48112.41,0.0,48112.41,DOC2214,2024-12
|
| 142 |
+
TXN000141,2024-11-07,500000,Cost of Goods Sold,26465.67,0.0,26465.67,DOC1133,2024-11
|
| 143 |
+
TXN000142,2024-06-21,320000,Other Equity,0.0,48496.95,-48496.95,DOC2852,2024-06
|
| 144 |
+
TXN000143,2024-05-28,420000,Interest Income,0.0,2265.7,-2265.7,DOC6348,2024-05
|
| 145 |
+
TXN000144,2024-08-14,130000,Prepaid Expenses,34801.02,0.0,34801.02,DOC7190,2024-08
|
| 146 |
+
TXN000145,2024-10-31,230000,Long-term Debt,0.0,34817.86,-34817.86,DOC4486,2024-10
|
| 147 |
+
TXN000146,2024-02-23,100000,Cash and Cash Equivalents,29257.28,0.0,29257.28,DOC3703,2024-02
|
| 148 |
+
TXN000147,2024-01-12,310000,Retained Earnings,0.0,47939.25,-47939.25,DOC6063,2024-01
|
| 149 |
+
TXN000148,2024-06-04,200000,Accounts Payable,0.0,16849.44,-16849.44,DOC7819,2024-06
|
| 150 |
+
TXN000149,2024-07-04,220000,Short-term Debt,0.0,11546.8,-11546.8,DOC1539,2024-07
|
| 151 |
+
TXN000150,2024-02-10,140000,"Property, Plant & Equipment",13071.5,0.0,13071.5,DOC7042,2024-02
|
| 152 |
+
TXN000151,2024-07-19,500000,Cost of Goods Sold,15545.43,0.0,15545.43,DOC8891,2024-07
|
| 153 |
+
TXN000152,2024-08-07,400000,Sales Revenue,0.0,13620.79,-13620.79,DOC2581,2024-08
|
| 154 |
+
TXN000153,2024-09-09,120000,Inventory,47032.54,0.0,47032.54,DOC8026,2024-09
|
| 155 |
+
TXN000154,2024-10-29,140000,"Property, Plant & Equipment",45966.91,0.0,45966.91,DOC1009,2024-10
|
| 156 |
+
TXN000155,2024-09-07,510000,Salaries and Wages,2356.41,0.0,2356.41,DOC2015,2024-09
|
| 157 |
+
TXN000156,2024-03-05,100000,Cash and Cash Equivalents,24070.47,0.0,24070.47,DOC8449,2024-03
|
| 158 |
+
TXN000157,2024-04-07,500000,Cost of Goods Sold,1937.41,0.0,1937.41,DOC9702,2024-04
|
| 159 |
+
TXN000158,2024-11-06,100000,Cash and Cash Equivalents,43249.65,0.0,43249.65,DOC3000,2024-11
|
| 160 |
+
TXN000159,2024-12-16,140000,"Property, Plant & Equipment",37520.55,0.0,37520.55,DOC2460,2024-12
|
| 161 |
+
TXN000160,2024-02-22,140000,"Property, Plant & Equipment",47243.81,0.0,47243.81,DOC5178,2024-02
|
| 162 |
+
TXN000161,2024-03-25,500000,Cost of Goods Sold,22582.15,0.0,22582.15,DOC6997,2024-03
|
| 163 |
+
TXN000162,2024-02-20,100000,Cash and Cash Equivalents,13809.12,0.0,13809.12,DOC8939,2024-02
|
| 164 |
+
TXN000163,2024-10-14,100000,Cash and Cash Equivalents,2440.13,0.0,2440.13,DOC8239,2024-10
|
| 165 |
+
TXN000164,2024-06-02,210000,Accrued Liabilities,0.0,24958.44,-24958.44,DOC1770,2024-06
|
| 166 |
+
TXN000165,2024-09-24,510000,Salaries and Wages,40837.65,0.0,40837.65,DOC9427,2024-09
|
| 167 |
+
TXN000166,2024-08-09,140000,"Property, Plant & Equipment",39611.71,0.0,39611.71,DOC7544,2024-08
|
| 168 |
+
TXN000167,2024-09-11,430000,Other Income,0.0,1536.26,-1536.26,DOC2252,2024-09
|
| 169 |
+
TXN000168,2024-03-06,540000,Marketing Expense,40271.73,0.0,40271.73,DOC7881,2024-03
|
| 170 |
+
TXN000169,2024-11-01,200000,Accounts Payable,0.0,29536.89,-29536.89,DOC7941,2024-11
|
| 171 |
+
TXN000170,2024-12-12,420000,Interest Income,0.0,4641.0,-4641.0,DOC2331,2024-12
|
| 172 |
+
TXN000171,2024-11-30,200000,Accounts Payable,0.0,19887.48,-19887.48,DOC5854,2024-11
|
| 173 |
+
TXN000172,2024-02-20,300000,Common Stock,0.0,34912.33,-34912.33,DOC5892,2024-02
|
| 174 |
+
TXN000173,2024-05-17,130000,Prepaid Expenses,46336.72,0.0,46336.72,DOC6449,2024-05
|
| 175 |
+
TXN000174,2024-12-05,500000,Cost of Goods Sold,23010.87,0.0,23010.87,DOC8941,2024-12
|
| 176 |
+
TXN000175,2024-07-23,540000,Marketing Expense,10535.63,0.0,10535.63,DOC2906,2024-07
|
| 177 |
+
TXN000176,2024-09-05,420000,Interest Income,0.0,23059.95,-23059.95,DOC7238,2024-09
|
| 178 |
+
TXN000177,2024-01-08,310000,Retained Earnings,0.0,9085.36,-9085.36,DOC9472,2024-01
|
| 179 |
+
TXN000178,2024-12-17,120000,Inventory,23750.69,0.0,23750.69,DOC5188,2024-12
|
| 180 |
+
TXN000179,2024-03-01,510000,Salaries and Wages,9695.22,0.0,9695.22,DOC8570,2024-03
|
| 181 |
+
TXN000180,2024-01-05,540000,Marketing Expense,17319.62,0.0,17319.62,DOC5777,2024-01
|
| 182 |
+
TXN000181,2024-11-21,540000,Marketing Expense,6119.73,0.0,6119.73,DOC7376,2024-11
|
| 183 |
+
TXN000182,2024-12-11,320000,Other Equity,0.0,44721.44,-44721.44,DOC8240,2024-12
|
| 184 |
+
TXN000183,2024-04-30,420000,Interest Income,0.0,34420.46,-34420.46,DOC7493,2024-04
|
| 185 |
+
TXN000184,2024-11-14,310000,Retained Earnings,0.0,18926.57,-18926.57,DOC5432,2024-11
|
| 186 |
+
TXN000185,2024-09-13,130000,Prepaid Expenses,4317.4,0.0,4317.4,DOC2276,2024-09
|
| 187 |
+
TXN000186,2024-07-25,530000,Utilities Expense,26875.87,0.0,26875.87,DOC1055,2024-07
|
| 188 |
+
TXN000187,2024-01-28,410000,Service Revenue,0.0,18508.79,-18508.79,DOC1364,2024-01
|
| 189 |
+
TXN000188,2024-07-05,410000,Service Revenue,0.0,12696.6,-12696.6,DOC6126,2024-07
|
| 190 |
+
TXN000189,2024-04-20,120000,Inventory,42237.59,0.0,42237.59,DOC7506,2024-04
|
| 191 |
+
TXN000190,2024-09-30,420000,Interest Income,0.0,22425.88,-22425.88,DOC7882,2024-09
|
| 192 |
+
TXN000191,2024-01-15,520000,Rent Expense,5332.97,0.0,5332.97,DOC6750,2024-01
|
| 193 |
+
TXN000192,2024-01-28,140000,"Property, Plant & Equipment",1101.55,0.0,1101.55,DOC2976,2024-01
|
| 194 |
+
TXN000193,2024-08-18,500000,Cost of Goods Sold,4551.3,0.0,4551.3,DOC1125,2024-08
|
| 195 |
+
TXN000194,2024-01-25,320000,Other Equity,0.0,44537.31,-44537.31,DOC7168,2024-01
|
| 196 |
+
TXN000195,2024-03-07,130000,Prepaid Expenses,32476.26,0.0,32476.26,DOC7371,2024-03
|
| 197 |
+
TXN000196,2024-02-03,420000,Interest Income,0.0,27931.34,-27931.34,DOC7891,2024-02
|
| 198 |
+
TXN000197,2024-02-11,520000,Rent Expense,14260.42,0.0,14260.42,DOC3739,2024-02
|
| 199 |
+
TXN000198,2024-11-10,110000,Accounts Receivable,49327.11,0.0,49327.11,DOC4812,2024-11
|
| 200 |
+
TXN000199,2024-05-29,100000,Cash and Cash Equivalents,11344.11,0.0,11344.11,DOC2605,2024-05
|
| 201 |
+
TXN000200,2024-01-04,430000,Other Income,0.0,42555.79,-42555.79,DOC4517,2024-01
|
| 202 |
+
TXN000201,2024-09-03,230000,Long-term Debt,0.0,2676.61,-2676.61,DOC3590,2024-09
|
| 203 |
+
TXN000202,2024-08-16,220000,Short-term Debt,0.0,49120.69,-49120.69,DOC6342,2024-08
|
| 204 |
+
TXN000203,2024-11-17,200000,Accounts Payable,0.0,28842.32,-28842.32,DOC9195,2024-11
|
| 205 |
+
TXN000204,2024-05-13,420000,Interest Income,0.0,48755.85,-48755.85,DOC3551,2024-05
|
| 206 |
+
TXN000205,2024-03-02,200000,Accounts Payable,0.0,46475.86,-46475.86,DOC1846,2024-03
|
| 207 |
+
TXN000206,2024-01-26,310000,Retained Earnings,0.0,14070.96,-14070.96,DOC7469,2024-01
|
| 208 |
+
TXN000207,2024-10-01,130000,Prepaid Expenses,10055.4,0.0,10055.4,DOC5208,2024-10
|
| 209 |
+
TXN000208,2024-02-16,320000,Other Equity,0.0,35390.78,-35390.78,DOC2828,2024-02
|
| 210 |
+
TXN000209,2024-12-21,310000,Retained Earnings,0.0,16100.05,-16100.05,DOC4744,2024-12
|
| 211 |
+
TXN000210,2024-06-26,200000,Accounts Payable,0.0,22767.97,-22767.97,DOC1260,2024-06
|
| 212 |
+
TXN000211,2024-06-20,300000,Common Stock,0.0,10166.35,-10166.35,DOC6287,2024-06
|
| 213 |
+
TXN000212,2024-03-24,110000,Accounts Receivable,12806.57,0.0,12806.57,DOC3832,2024-03
|
| 214 |
+
TXN000213,2024-02-07,230000,Long-term Debt,0.0,20650.86,-20650.86,DOC8984,2024-02
|
| 215 |
+
TXN000214,2024-11-13,140000,"Property, Plant & Equipment",37324.13,0.0,37324.13,DOC2908,2024-11
|
| 216 |
+
TXN000215,2024-05-16,310000,Retained Earnings,0.0,10329.59,-10329.59,DOC9162,2024-05
|
| 217 |
+
TXN000216,2024-01-01,120000,Inventory,37081.92,0.0,37081.92,DOC6951,2024-01
|
| 218 |
+
TXN000217,2024-09-23,220000,Short-term Debt,0.0,39783.84,-39783.84,DOC7413,2024-09
|
| 219 |
+
TXN000218,2024-07-31,120000,Inventory,9401.61,0.0,9401.61,DOC3898,2024-07
|
| 220 |
+
TXN000219,2024-03-02,410000,Service Revenue,0.0,18005.64,-18005.64,DOC2065,2024-03
|
| 221 |
+
TXN000220,2024-10-22,510000,Salaries and Wages,22652.24,0.0,22652.24,DOC7943,2024-10
|
| 222 |
+
TXN000221,2024-05-04,520000,Rent Expense,15138.76,0.0,15138.76,DOC6142,2024-05
|
| 223 |
+
TXN000222,2024-06-01,420000,Interest Income,0.0,17832.59,-17832.59,DOC5033,2024-06
|
| 224 |
+
TXN000223,2024-11-04,410000,Service Revenue,0.0,45332.96,-45332.96,DOC5018,2024-11
|
| 225 |
+
TXN000224,2024-07-16,210000,Accrued Liabilities,0.0,46997.62,-46997.62,DOC2202,2024-07
|
| 226 |
+
TXN000225,2024-02-11,220000,Short-term Debt,0.0,7049.68,-7049.68,DOC6742,2024-02
|
| 227 |
+
TXN000226,2024-08-18,100000,Cash and Cash Equivalents,28700.23,0.0,28700.23,DOC3204,2024-08
|
| 228 |
+
TXN000227,2024-04-06,200000,Accounts Payable,0.0,35378.33,-35378.33,DOC1950,2024-04
|
| 229 |
+
TXN000228,2024-09-10,100000,Cash and Cash Equivalents,10306.78,0.0,10306.78,DOC5612,2024-09
|
| 230 |
+
TXN000229,2024-12-18,300000,Common Stock,0.0,5235.51,-5235.51,DOC7028,2024-12
|
| 231 |
+
TXN000230,2024-08-15,420000,Interest Income,0.0,22904.31,-22904.31,DOC8863,2024-08
|
| 232 |
+
TXN000231,2024-06-05,420000,Interest Income,0.0,27039.05,-27039.05,DOC3371,2024-06
|
| 233 |
+
TXN000232,2024-06-21,320000,Other Equity,0.0,36029.82,-36029.82,DOC1094,2024-06
|
| 234 |
+
TXN000233,2024-08-30,520000,Rent Expense,28318.87,0.0,28318.87,DOC1793,2024-08
|
| 235 |
+
TXN000234,2024-10-09,310000,Retained Earnings,0.0,17350.23,-17350.23,DOC7166,2024-10
|
| 236 |
+
TXN000235,2024-12-11,420000,Interest Income,0.0,47369.44,-47369.44,DOC3443,2024-12
|
| 237 |
+
TXN000236,2024-04-13,400000,Sales Revenue,0.0,25343.85,-25343.85,DOC1984,2024-04
|
| 238 |
+
TXN000237,2024-04-20,100000,Cash and Cash Equivalents,36332.17,0.0,36332.17,DOC4531,2024-04
|
| 239 |
+
TXN000238,2024-12-21,320000,Other Equity,0.0,45945.65,-45945.65,DOC4876,2024-12
|
| 240 |
+
TXN000239,2024-05-06,220000,Short-term Debt,0.0,7711.7,-7711.7,DOC9795,2024-05
|
| 241 |
+
TXN000240,2024-02-20,230000,Long-term Debt,0.0,36848.57,-36848.57,DOC4368,2024-02
|
| 242 |
+
TXN000241,2024-09-13,310000,Retained Earnings,0.0,5750.58,-5750.58,DOC4476,2024-09
|
| 243 |
+
TXN000242,2024-06-30,410000,Service Revenue,0.0,41890.79,-41890.79,DOC4072,2024-06
|
| 244 |
+
TXN000243,2024-05-28,520000,Rent Expense,19027.35,0.0,19027.35,DOC9393,2024-05
|
| 245 |
+
TXN000244,2024-11-08,530000,Utilities Expense,331.14,0.0,331.14,DOC8970,2024-11
|
| 246 |
+
TXN000245,2024-01-25,530000,Utilities Expense,43189.56,0.0,43189.56,DOC8973,2024-01
|
| 247 |
+
TXN000246,2024-07-28,110000,Accounts Receivable,24093.77,0.0,24093.77,DOC7490,2024-07
|
| 248 |
+
TXN000247,2024-05-07,500000,Cost of Goods Sold,11307.78,0.0,11307.78,DOC5971,2024-05
|
| 249 |
+
TXN000248,2024-06-30,520000,Rent Expense,8901.71,0.0,8901.71,DOC2990,2024-06
|
| 250 |
+
TXN000249,2024-07-16,530000,Utilities Expense,1790.57,0.0,1790.57,DOC7320,2024-07
|
| 251 |
+
TXN000250,2024-05-29,310000,Retained Earnings,0.0,11082.85,-11082.85,DOC6588,2024-05
|
| 252 |
+
TXN000251,2024-12-02,500000,Cost of Goods Sold,48057.41,0.0,48057.41,DOC1688,2024-12
|
| 253 |
+
TXN000252,2024-04-27,530000,Utilities Expense,43045.54,0.0,43045.54,DOC6182,2024-04
|
| 254 |
+
TXN000253,2024-02-18,220000,Short-term Debt,0.0,15049.84,-15049.84,DOC2759,2024-02
|
| 255 |
+
TXN000254,2024-08-02,400000,Sales Revenue,0.0,21396.77,-21396.77,DOC1951,2024-08
|
| 256 |
+
TXN000255,2024-11-13,520000,Rent Expense,10336.47,0.0,10336.47,DOC5524,2024-11
|
| 257 |
+
TXN000256,2024-01-19,430000,Other Income,0.0,3378.86,-3378.86,DOC6490,2024-01
|
| 258 |
+
TXN000257,2024-07-12,420000,Interest Income,0.0,26769.35,-26769.35,DOC6232,2024-07
|
| 259 |
+
TXN000258,2024-08-09,510000,Salaries and Wages,28026.05,0.0,28026.05,DOC5926,2024-08
|
| 260 |
+
TXN000259,2024-09-20,130000,Prepaid Expenses,43103.1,0.0,43103.1,DOC9038,2024-09
|
| 261 |
+
TXN000260,2024-10-14,120000,Inventory,13687.86,0.0,13687.86,DOC7305,2024-10
|
| 262 |
+
TXN000261,2024-03-27,100000,Cash and Cash Equivalents,48948.68,0.0,48948.68,DOC4462,2024-03
|
| 263 |
+
TXN000262,2024-11-16,220000,Short-term Debt,0.0,27630.96,-27630.96,DOC6954,2024-11
|
| 264 |
+
TXN000263,2024-02-23,220000,Short-term Debt,0.0,17029.64,-17029.64,DOC4300,2024-02
|
| 265 |
+
TXN000264,2024-02-20,120000,Inventory,32672.03,0.0,32672.03,DOC4054,2024-02
|
| 266 |
+
TXN000265,2024-10-17,220000,Short-term Debt,0.0,12234.29,-12234.29,DOC3538,2024-10
|
| 267 |
+
TXN000266,2024-06-13,430000,Other Income,0.0,7139.98,-7139.98,DOC6005,2024-06
|
| 268 |
+
TXN000267,2024-01-07,430000,Other Income,0.0,31698.71,-31698.71,DOC3198,2024-01
|
| 269 |
+
TXN000268,2024-05-26,540000,Marketing Expense,6226.57,0.0,6226.57,DOC2308,2024-05
|
| 270 |
+
TXN000269,2024-01-02,510000,Salaries and Wages,45540.14,0.0,45540.14,DOC7852,2024-01
|
| 271 |
+
TXN000270,2024-01-11,530000,Utilities Expense,13045.23,0.0,13045.23,DOC2409,2024-01
|
| 272 |
+
TXN000271,2024-04-28,120000,Inventory,13476.38,0.0,13476.38,DOC1804,2024-04
|
| 273 |
+
TXN000272,2024-09-12,200000,Accounts Payable,0.0,27647.15,-27647.15,DOC8083,2024-09
|
| 274 |
+
TXN000273,2024-12-07,120000,Inventory,39009.96,0.0,39009.96,DOC3679,2024-12
|
| 275 |
+
TXN000274,2024-08-02,410000,Service Revenue,0.0,40012.78,-40012.78,DOC3768,2024-08
|
| 276 |
+
TXN000275,2024-04-24,510000,Salaries and Wages,25671.64,0.0,25671.64,DOC3599,2024-04
|
| 277 |
+
TXN000276,2024-08-24,110000,Accounts Receivable,20187.25,0.0,20187.25,DOC8368,2024-08
|
| 278 |
+
TXN000277,2024-01-04,310000,Retained Earnings,0.0,6700.58,-6700.58,DOC9996,2024-01
|
| 279 |
+
TXN000278,2024-11-21,310000,Retained Earnings,0.0,45723.51,-45723.51,DOC6475,2024-11
|
| 280 |
+
TXN000279,2024-02-03,230000,Long-term Debt,0.0,27753.48,-27753.48,DOC8141,2024-02
|
| 281 |
+
TXN000280,2024-03-27,320000,Other Equity,0.0,5418.28,-5418.28,DOC1341,2024-03
|
| 282 |
+
TXN000281,2024-01-27,540000,Marketing Expense,45010.93,0.0,45010.93,DOC1645,2024-01
|
| 283 |
+
TXN000282,2024-04-07,220000,Short-term Debt,0.0,30065.79,-30065.79,DOC7136,2024-04
|
| 284 |
+
TXN000283,2024-06-21,540000,Marketing Expense,41921.54,0.0,41921.54,DOC4028,2024-06
|
| 285 |
+
TXN000284,2024-03-04,410000,Service Revenue,0.0,17758.18,-17758.18,DOC6941,2024-03
|
| 286 |
+
TXN000285,2024-07-11,310000,Retained Earnings,0.0,4231.65,-4231.65,DOC6490,2024-07
|
| 287 |
+
TXN000286,2024-09-23,540000,Marketing Expense,14505.82,0.0,14505.82,DOC8679,2024-09
|
| 288 |
+
TXN000287,2024-04-22,130000,Prepaid Expenses,36104.49,0.0,36104.49,DOC2333,2024-04
|
| 289 |
+
TXN000288,2024-02-24,110000,Accounts Receivable,33217.19,0.0,33217.19,DOC5853,2024-02
|
| 290 |
+
TXN000289,2024-11-07,140000,"Property, Plant & Equipment",10825.52,0.0,10825.52,DOC8715,2024-11
|
| 291 |
+
TXN000290,2024-05-27,420000,Interest Income,0.0,8184.49,-8184.49,DOC8101,2024-05
|
| 292 |
+
TXN000291,2024-07-19,400000,Sales Revenue,0.0,38568.52,-38568.52,DOC2524,2024-07
|
| 293 |
+
TXN000292,2024-07-19,230000,Long-term Debt,0.0,17641.85,-17641.85,DOC6760,2024-07
|
| 294 |
+
TXN000293,2024-04-13,310000,Retained Earnings,0.0,21797.88,-21797.88,DOC8970,2024-04
|
| 295 |
+
TXN000294,2024-08-16,120000,Inventory,216.74,0.0,216.74,DOC4549,2024-08
|
| 296 |
+
TXN000295,2024-12-19,200000,Accounts Payable,0.0,5244.38,-5244.38,DOC5090,2024-12
|
| 297 |
+
TXN000296,2024-01-17,500000,Cost of Goods Sold,47516.84,0.0,47516.84,DOC8982,2024-01
|
| 298 |
+
TXN000297,2024-11-13,320000,Other Equity,0.0,47912.72,-47912.72,DOC1338,2024-11
|
| 299 |
+
TXN000298,2024-05-28,220000,Short-term Debt,0.0,37975.89,-37975.89,DOC6604,2024-05
|
| 300 |
+
TXN000299,2024-07-16,430000,Other Income,0.0,49030.78,-49030.78,DOC7609,2024-07
|
| 301 |
+
TXN000300,2024-05-22,320000,Other Equity,0.0,34689.44,-34689.44,DOC9680,2024-05
|
| 302 |
+
TXN000301,2024-01-26,400000,Sales Revenue,0.0,2067.4,-2067.4,DOC5873,2024-01
|
| 303 |
+
TXN000302,2024-07-17,430000,Other Income,0.0,49967.74,-49967.74,DOC6913,2024-07
|
| 304 |
+
TXN000303,2024-03-26,540000,Marketing Expense,45782.87,0.0,45782.87,DOC5430,2024-03
|
| 305 |
+
TXN000304,2024-01-07,540000,Marketing Expense,14937.72,0.0,14937.72,DOC9007,2024-01
|
| 306 |
+
TXN000305,2024-11-10,510000,Salaries and Wages,47218.9,0.0,47218.9,DOC7737,2024-11
|
| 307 |
+
TXN000306,2024-04-12,530000,Utilities Expense,1946.68,0.0,1946.68,DOC4223,2024-04
|
| 308 |
+
TXN000307,2024-04-17,120000,Inventory,6116.29,0.0,6116.29,DOC1130,2024-04
|
| 309 |
+
TXN000308,2024-06-19,140000,"Property, Plant & Equipment",17059.76,0.0,17059.76,DOC5278,2024-06
|
| 310 |
+
TXN000309,2024-02-08,320000,Other Equity,0.0,15832.99,-15832.99,DOC7640,2024-02
|
| 311 |
+
TXN000310,2024-12-14,130000,Prepaid Expenses,33116.59,0.0,33116.59,DOC8564,2024-12
|
| 312 |
+
TXN000311,2024-06-09,510000,Salaries and Wages,44310.29,0.0,44310.29,DOC9502,2024-06
|
| 313 |
+
TXN000312,2024-06-18,120000,Inventory,49518.03,0.0,49518.03,DOC5346,2024-06
|
| 314 |
+
TXN000313,2024-05-20,400000,Sales Revenue,0.0,19259.8,-19259.8,DOC4810,2024-05
|
| 315 |
+
TXN000314,2024-10-28,210000,Accrued Liabilities,0.0,17600.52,-17600.52,DOC3032,2024-10
|
| 316 |
+
TXN000315,2024-08-23,540000,Marketing Expense,31412.52,0.0,31412.52,DOC4511,2024-08
|
| 317 |
+
TXN000316,2024-08-26,320000,Other Equity,0.0,19974.54,-19974.54,DOC8069,2024-08
|
| 318 |
+
TXN000317,2024-12-05,210000,Accrued Liabilities,0.0,36905.36,-36905.36,DOC4760,2024-12
|
| 319 |
+
TXN000318,2024-05-21,120000,Inventory,14920.44,0.0,14920.44,DOC3033,2024-05
|
| 320 |
+
TXN000319,2024-05-25,130000,Prepaid Expenses,11757.03,0.0,11757.03,DOC8832,2024-05
|
| 321 |
+
TXN000320,2024-07-11,430000,Other Income,0.0,45525.92,-45525.92,DOC3632,2024-07
|
| 322 |
+
TXN000321,2024-10-31,420000,Interest Income,0.0,19642.34,-19642.34,DOC2828,2024-10
|
| 323 |
+
TXN000322,2024-07-16,140000,"Property, Plant & Equipment",49118.29,0.0,49118.29,DOC8486,2024-07
|
| 324 |
+
TXN000323,2024-12-09,410000,Service Revenue,0.0,23423.34,-23423.34,DOC2868,2024-12
|
| 325 |
+
TXN000324,2024-06-01,110000,Accounts Receivable,37193.31,0.0,37193.31,DOC6690,2024-06
|
| 326 |
+
TXN000325,2024-05-27,220000,Short-term Debt,0.0,41907.5,-41907.5,DOC6429,2024-05
|
| 327 |
+
TXN000326,2024-08-30,540000,Marketing Expense,25683.16,0.0,25683.16,DOC8274,2024-08
|
| 328 |
+
TXN000327,2024-11-08,110000,Accounts Receivable,11102.26,0.0,11102.26,DOC7402,2024-11
|
| 329 |
+
TXN000328,2024-01-05,200000,Accounts Payable,0.0,2986.35,-2986.35,DOC8214,2024-01
|
| 330 |
+
TXN000329,2024-01-09,500000,Cost of Goods Sold,46394.84,0.0,46394.84,DOC2913,2024-01
|
| 331 |
+
TXN000330,2024-03-01,500000,Cost of Goods Sold,13085.65,0.0,13085.65,DOC3466,2024-03
|
| 332 |
+
TXN000331,2024-12-03,510000,Salaries and Wages,34831.43,0.0,34831.43,DOC9194,2024-12
|
| 333 |
+
TXN000332,2024-09-25,120000,Inventory,11268.5,0.0,11268.5,DOC5675,2024-09
|
| 334 |
+
TXN000333,2024-12-22,410000,Service Revenue,0.0,4665.19,-4665.19,DOC2640,2024-12
|
| 335 |
+
TXN000334,2024-05-02,120000,Inventory,6562.79,0.0,6562.79,DOC2218,2024-05
|
| 336 |
+
TXN000335,2024-11-27,110000,Accounts Receivable,1867.58,0.0,1867.58,DOC1954,2024-11
|
| 337 |
+
TXN000336,2024-05-03,110000,Accounts Receivable,18697.16,0.0,18697.16,DOC6370,2024-05
|
| 338 |
+
TXN000337,2024-06-24,140000,"Property, Plant & Equipment",24844.2,0.0,24844.2,DOC9228,2024-06
|
| 339 |
+
TXN000338,2024-10-10,430000,Other Income,0.0,3898.93,-3898.93,DOC6233,2024-10
|
| 340 |
+
TXN000339,2024-10-27,220000,Short-term Debt,0.0,24081.27,-24081.27,DOC3396,2024-10
|
| 341 |
+
TXN000340,2024-07-04,520000,Rent Expense,28608.82,0.0,28608.82,DOC7183,2024-07
|
| 342 |
+
TXN000341,2024-08-24,400000,Sales Revenue,0.0,36722.1,-36722.1,DOC5311,2024-08
|
| 343 |
+
TXN000342,2024-12-01,520000,Rent Expense,32956.75,0.0,32956.75,DOC2704,2024-12
|
| 344 |
+
TXN000343,2024-12-28,400000,Sales Revenue,0.0,12010.63,-12010.63,DOC5286,2024-12
|
| 345 |
+
TXN000344,2024-07-06,200000,Accounts Payable,0.0,8014.39,-8014.39,DOC1556,2024-07
|
| 346 |
+
TXN000345,2024-01-31,520000,Rent Expense,41308.26,0.0,41308.26,DOC8561,2024-01
|
| 347 |
+
TXN000346,2024-06-06,310000,Retained Earnings,0.0,45444.2,-45444.2,DOC3403,2024-06
|
| 348 |
+
TXN000347,2024-07-24,110000,Accounts Receivable,37856.13,0.0,37856.13,DOC1294,2024-07
|
| 349 |
+
TXN000348,2024-08-11,110000,Accounts Receivable,4296.5,0.0,4296.5,DOC2136,2024-08
|
| 350 |
+
TXN000349,2024-01-17,230000,Long-term Debt,0.0,5880.61,-5880.61,DOC8009,2024-01
|
| 351 |
+
TXN000350,2024-06-11,400000,Sales Revenue,0.0,6509.59,-6509.59,DOC6352,2024-06
|
| 352 |
+
TXN000351,2024-11-14,110000,Accounts Receivable,19668.35,0.0,19668.35,DOC3382,2024-11
|
| 353 |
+
TXN000352,2024-10-04,140000,"Property, Plant & Equipment",46867.7,0.0,46867.7,DOC2887,2024-10
|
| 354 |
+
TXN000353,2024-08-29,130000,Prepaid Expenses,47370.16,0.0,47370.16,DOC2040,2024-08
|
| 355 |
+
TXN000354,2024-07-11,320000,Other Equity,0.0,2990.23,-2990.23,DOC7353,2024-07
|
| 356 |
+
TXN000355,2024-09-26,510000,Salaries and Wages,48677.1,0.0,48677.1,DOC9476,2024-09
|
| 357 |
+
TXN000356,2024-06-12,320000,Other Equity,0.0,32413.92,-32413.92,DOC6043,2024-06
|
| 358 |
+
TXN000357,2024-01-07,320000,Other Equity,0.0,3374.74,-3374.74,DOC8813,2024-01
|
| 359 |
+
TXN000358,2024-03-19,420000,Interest Income,0.0,40957.4,-40957.4,DOC4356,2024-03
|
| 360 |
+
TXN000359,2024-04-08,130000,Prepaid Expenses,22624.21,0.0,22624.21,DOC1038,2024-04
|
| 361 |
+
TXN000360,2024-10-11,420000,Interest Income,0.0,34714.74,-34714.74,DOC8027,2024-10
|
| 362 |
+
TXN000361,2024-06-23,110000,Accounts Receivable,34056.92,0.0,34056.92,DOC4093,2024-06
|
| 363 |
+
TXN000362,2024-01-27,310000,Retained Earnings,0.0,43415.91,-43415.91,DOC1988,2024-01
|
| 364 |
+
TXN000363,2024-10-29,540000,Marketing Expense,21044.39,0.0,21044.39,DOC5179,2024-10
|
| 365 |
+
TXN000364,2024-05-26,200000,Accounts Payable,0.0,13783.34,-13783.34,DOC6626,2024-05
|
| 366 |
+
TXN000365,2024-02-27,100000,Cash and Cash Equivalents,44715.55,0.0,44715.55,DOC4598,2024-02
|
| 367 |
+
TXN000366,2024-06-11,110000,Accounts Receivable,1653.59,0.0,1653.59,DOC9984,2024-06
|
| 368 |
+
TXN000367,2024-09-30,320000,Other Equity,0.0,43231.48,-43231.48,DOC3255,2024-09
|
| 369 |
+
TXN000368,2024-02-29,220000,Short-term Debt,0.0,9357.72,-9357.72,DOC6776,2024-02
|
| 370 |
+
TXN000369,2024-01-08,540000,Marketing Expense,38569.0,0.0,38569.0,DOC4633,2024-01
|
| 371 |
+
TXN000370,2024-07-17,530000,Utilities Expense,31348.39,0.0,31348.39,DOC1959,2024-07
|
| 372 |
+
TXN000371,2024-06-29,320000,Other Equity,0.0,45600.62,-45600.62,DOC5473,2024-06
|
| 373 |
+
TXN000372,2024-02-15,120000,Inventory,23158.65,0.0,23158.65,DOC2875,2024-02
|
| 374 |
+
TXN000373,2024-01-09,130000,Prepaid Expenses,10106.18,0.0,10106.18,DOC8099,2024-01
|
| 375 |
+
TXN000374,2024-04-26,540000,Marketing Expense,29554.17,0.0,29554.17,DOC1583,2024-04
|
| 376 |
+
TXN000375,2024-03-04,310000,Retained Earnings,0.0,22815.49,-22815.49,DOC5167,2024-03
|
| 377 |
+
TXN000376,2024-09-30,540000,Marketing Expense,34054.79,0.0,34054.79,DOC2389,2024-09
|
| 378 |
+
TXN000377,2024-04-04,420000,Interest Income,0.0,36122.19,-36122.19,DOC7154,2024-04
|
| 379 |
+
TXN000378,2024-08-04,400000,Sales Revenue,0.0,43020.11,-43020.11,DOC5197,2024-08
|
| 380 |
+
TXN000379,2024-09-23,230000,Long-term Debt,0.0,24077.3,-24077.3,DOC7731,2024-09
|
| 381 |
+
TXN000380,2024-06-08,410000,Service Revenue,0.0,1016.55,-1016.55,DOC3720,2024-06
|
| 382 |
+
TXN000381,2024-08-29,300000,Common Stock,0.0,16390.42,-16390.42,DOC1001,2024-08
|
| 383 |
+
TXN000382,2024-10-15,100000,Cash and Cash Equivalents,44138.42,0.0,44138.42,DOC2949,2024-10
|
| 384 |
+
TXN000383,2024-03-17,100000,Cash and Cash Equivalents,4021.07,0.0,4021.07,DOC1917,2024-03
|
| 385 |
+
TXN000384,2024-07-12,210000,Accrued Liabilities,0.0,48875.57,-48875.57,DOC1089,2024-07
|
| 386 |
+
TXN000385,2024-05-01,410000,Service Revenue,0.0,40049.28,-40049.28,DOC4041,2024-05
|
| 387 |
+
TXN000386,2024-10-31,300000,Common Stock,0.0,47582.34,-47582.34,DOC9508,2024-10
|
| 388 |
+
TXN000387,2024-05-02,120000,Inventory,1676.15,0.0,1676.15,DOC7917,2024-05
|
| 389 |
+
TXN000388,2024-12-24,230000,Long-term Debt,0.0,30685.91,-30685.91,DOC1552,2024-12
|
| 390 |
+
TXN000389,2024-07-22,510000,Salaries and Wages,43561.36,0.0,43561.36,DOC4389,2024-07
|
| 391 |
+
TXN000390,2024-11-13,530000,Utilities Expense,30651.67,0.0,30651.67,DOC3430,2024-11
|
| 392 |
+
TXN000391,2024-03-24,210000,Accrued Liabilities,0.0,27694.77,-27694.77,DOC1021,2024-03
|
| 393 |
+
TXN000392,2024-05-06,120000,Inventory,26367.49,0.0,26367.49,DOC5109,2024-05
|
| 394 |
+
TXN000393,2024-01-12,310000,Retained Earnings,0.0,12430.45,-12430.45,DOC2560,2024-01
|
| 395 |
+
TXN000394,2024-08-30,400000,Sales Revenue,0.0,11038.78,-11038.78,DOC4638,2024-08
|
| 396 |
+
TXN000395,2024-12-21,410000,Service Revenue,0.0,37239.53,-37239.53,DOC3356,2024-12
|
| 397 |
+
TXN000396,2024-10-26,520000,Rent Expense,27812.64,0.0,27812.64,DOC8057,2024-10
|
| 398 |
+
TXN000397,2024-05-29,520000,Rent Expense,16682.5,0.0,16682.5,DOC9503,2024-05
|
| 399 |
+
TXN000398,2024-02-28,230000,Long-term Debt,0.0,32551.25,-32551.25,DOC9946,2024-02
|
| 400 |
+
TXN000399,2024-04-02,120000,Inventory,20978.15,0.0,20978.15,DOC1352,2024-04
|
| 401 |
+
TXN000400,2024-11-27,210000,Accrued Liabilities,0.0,8792.25,-8792.25,DOC1158,2024-11
|
| 402 |
+
TXN000401,2024-10-19,530000,Utilities Expense,17362.16,0.0,17362.16,DOC4453,2024-10
|
| 403 |
+
TXN000402,2024-05-31,530000,Utilities Expense,27210.7,0.0,27210.7,DOC5703,2024-05
|
| 404 |
+
TXN000403,2024-09-06,230000,Long-term Debt,0.0,36290.36,-36290.36,DOC6631,2024-09
|
| 405 |
+
TXN000404,2024-03-06,130000,Prepaid Expenses,29926.41,0.0,29926.41,DOC2394,2024-03
|
| 406 |
+
TXN000405,2024-05-10,320000,Other Equity,0.0,31186.03,-31186.03,DOC3958,2024-05
|
| 407 |
+
TXN000406,2024-12-20,100000,Cash and Cash Equivalents,38822.41,0.0,38822.41,DOC7895,2024-12
|
| 408 |
+
TXN000407,2024-01-14,300000,Common Stock,0.0,48572.62,-48572.62,DOC1374,2024-01
|
| 409 |
+
TXN000408,2024-11-20,140000,"Property, Plant & Equipment",3549.73,0.0,3549.73,DOC5648,2024-11
|
| 410 |
+
TXN000409,2024-01-14,420000,Interest Income,0.0,25789.39,-25789.39,DOC4155,2024-01
|
| 411 |
+
TXN000410,2024-08-18,110000,Accounts Receivable,8259.84,0.0,8259.84,DOC9219,2024-08
|
| 412 |
+
TXN000411,2024-06-11,110000,Accounts Receivable,32871.16,0.0,32871.16,DOC6543,2024-06
|
| 413 |
+
TXN000412,2024-06-12,320000,Other Equity,0.0,48494.07,-48494.07,DOC4374,2024-06
|
| 414 |
+
TXN000413,2024-01-10,310000,Retained Earnings,0.0,3767.49,-3767.49,DOC1269,2024-01
|
| 415 |
+
TXN000414,2024-04-02,430000,Other Income,0.0,16916.46,-16916.46,DOC4432,2024-04
|
| 416 |
+
TXN000415,2024-05-12,100000,Cash and Cash Equivalents,12510.84,0.0,12510.84,DOC8115,2024-05
|
| 417 |
+
TXN000416,2024-11-08,100000,Cash and Cash Equivalents,8435.39,0.0,8435.39,DOC7099,2024-11
|
| 418 |
+
TXN000417,2024-06-23,310000,Retained Earnings,0.0,33223.85,-33223.85,DOC4568,2024-06
|
| 419 |
+
TXN000418,2024-11-07,320000,Other Equity,0.0,29309.18,-29309.18,DOC2742,2024-11
|
| 420 |
+
TXN000419,2024-04-17,200000,Accounts Payable,0.0,27041.3,-27041.3,DOC2939,2024-04
|
| 421 |
+
TXN000420,2024-11-29,510000,Salaries and Wages,2948.63,0.0,2948.63,DOC1281,2024-11
|
| 422 |
+
TXN000421,2024-04-28,100000,Cash and Cash Equivalents,11312.59,0.0,11312.59,DOC6178,2024-04
|
| 423 |
+
TXN000422,2024-06-09,140000,"Property, Plant & Equipment",25411.02,0.0,25411.02,DOC2229,2024-06
|
| 424 |
+
TXN000423,2024-10-02,320000,Other Equity,0.0,49332.84,-49332.84,DOC2239,2024-10
|
| 425 |
+
TXN000424,2024-05-05,310000,Retained Earnings,0.0,47595.41,-47595.41,DOC8473,2024-05
|
| 426 |
+
TXN000425,2024-08-10,210000,Accrued Liabilities,0.0,12785.81,-12785.81,DOC7570,2024-08
|
| 427 |
+
TXN000426,2024-10-20,510000,Salaries and Wages,7068.6,0.0,7068.6,DOC7527,2024-10
|
| 428 |
+
TXN000427,2024-11-03,400000,Sales Revenue,0.0,35263.57,-35263.57,DOC1891,2024-11
|
| 429 |
+
TXN000428,2024-12-06,220000,Short-term Debt,0.0,4785.65,-4785.65,DOC7812,2024-12
|
| 430 |
+
TXN000429,2024-01-05,200000,Accounts Payable,0.0,48171.01,-48171.01,DOC2198,2024-01
|
| 431 |
+
TXN000430,2024-07-11,110000,Accounts Receivable,41921.95,0.0,41921.95,DOC7089,2024-07
|
| 432 |
+
TXN000431,2024-05-24,510000,Salaries and Wages,41560.77,0.0,41560.77,DOC1302,2024-05
|
| 433 |
+
TXN000432,2024-03-16,220000,Short-term Debt,0.0,5744.18,-5744.18,DOC5440,2024-03
|
| 434 |
+
TXN000433,2024-10-15,410000,Service Revenue,0.0,30070.42,-30070.42,DOC4124,2024-10
|
| 435 |
+
TXN000434,2024-03-09,430000,Other Income,0.0,28901.54,-28901.54,DOC9125,2024-03
|
| 436 |
+
TXN000435,2024-07-10,110000,Accounts Receivable,2505.78,0.0,2505.78,DOC6704,2024-07
|
| 437 |
+
TXN000436,2024-06-17,100000,Cash and Cash Equivalents,49667.51,0.0,49667.51,DOC7924,2024-06
|
| 438 |
+
TXN000437,2024-09-01,230000,Long-term Debt,0.0,28394.11,-28394.11,DOC1488,2024-09
|
| 439 |
+
TXN000438,2024-11-19,310000,Retained Earnings,0.0,32560.53,-32560.53,DOC4173,2024-11
|
| 440 |
+
TXN000439,2024-05-11,410000,Service Revenue,0.0,33412.91,-33412.91,DOC4553,2024-05
|
| 441 |
+
TXN000440,2024-10-05,510000,Salaries and Wages,21835.61,0.0,21835.61,DOC6450,2024-10
|
| 442 |
+
TXN000441,2024-12-09,100000,Cash and Cash Equivalents,14913.78,0.0,14913.78,DOC1454,2024-12
|
| 443 |
+
TXN000442,2024-05-22,540000,Marketing Expense,31547.42,0.0,31547.42,DOC5806,2024-05
|
| 444 |
+
TXN000443,2024-11-11,420000,Interest Income,0.0,27470.14,-27470.14,DOC2440,2024-11
|
| 445 |
+
TXN000444,2024-08-11,500000,Cost of Goods Sold,18725.26,0.0,18725.26,DOC7059,2024-08
|
| 446 |
+
TXN000445,2024-09-23,200000,Accounts Payable,0.0,30212.08,-30212.08,DOC8117,2024-09
|
| 447 |
+
TXN000446,2024-09-21,300000,Common Stock,0.0,19051.31,-19051.31,DOC7471,2024-09
|
| 448 |
+
TXN000447,2024-04-26,430000,Other Income,0.0,40706.94,-40706.94,DOC5760,2024-04
|
| 449 |
+
TXN000448,2024-05-12,320000,Other Equity,0.0,20001.26,-20001.26,DOC9234,2024-05
|
| 450 |
+
TXN000449,2024-12-08,430000,Other Income,0.0,40667.99,-40667.99,DOC7570,2024-12
|
| 451 |
+
TXN000450,2024-01-21,400000,Sales Revenue,0.0,9869.32,-9869.32,DOC5431,2024-01
|
| 452 |
+
TXN000451,2024-04-26,420000,Interest Income,0.0,44911.72,-44911.72,DOC7936,2024-04
|
| 453 |
+
TXN000452,2024-07-21,130000,Prepaid Expenses,19065.72,0.0,19065.72,DOC1140,2024-07
|
| 454 |
+
TXN000453,2024-10-16,520000,Rent Expense,8399.95,0.0,8399.95,DOC1963,2024-10
|
| 455 |
+
TXN000454,2024-02-21,430000,Other Income,0.0,33537.79,-33537.79,DOC7894,2024-02
|
| 456 |
+
TXN000455,2024-05-15,120000,Inventory,15634.25,0.0,15634.25,DOC6539,2024-05
|
| 457 |
+
TXN000456,2024-01-02,510000,Salaries and Wages,13703.94,0.0,13703.94,DOC7787,2024-01
|
| 458 |
+
TXN000457,2024-09-19,310000,Retained Earnings,0.0,34087.78,-34087.78,DOC8052,2024-09
|
| 459 |
+
TXN000458,2024-11-07,210000,Accrued Liabilities,0.0,39691.02,-39691.02,DOC9636,2024-11
|
| 460 |
+
TXN000459,2024-02-05,300000,Common Stock,0.0,21283.92,-21283.92,DOC2798,2024-02
|
| 461 |
+
TXN000460,2024-06-20,100000,Cash and Cash Equivalents,2266.29,0.0,2266.29,DOC7284,2024-06
|
| 462 |
+
TXN000461,2024-08-01,540000,Marketing Expense,29717.57,0.0,29717.57,DOC4097,2024-08
|
| 463 |
+
TXN000462,2024-09-27,230000,Long-term Debt,0.0,30587.95,-30587.95,DOC6752,2024-09
|
| 464 |
+
TXN000463,2024-03-12,300000,Common Stock,0.0,38520.24,-38520.24,DOC2072,2024-03
|
| 465 |
+
TXN000464,2024-03-08,140000,"Property, Plant & Equipment",13812.82,0.0,13812.82,DOC7674,2024-03
|
| 466 |
+
TXN000465,2024-02-29,130000,Prepaid Expenses,33604.09,0.0,33604.09,DOC8000,2024-02
|
| 467 |
+
TXN000466,2024-06-12,510000,Salaries and Wages,7570.23,0.0,7570.23,DOC1482,2024-06
|
| 468 |
+
TXN000467,2024-08-13,320000,Other Equity,0.0,23697.31,-23697.31,DOC9853,2024-08
|
| 469 |
+
TXN000468,2024-10-19,430000,Other Income,0.0,32134.38,-32134.38,DOC1987,2024-10
|
| 470 |
+
TXN000469,2024-06-08,210000,Accrued Liabilities,0.0,31934.24,-31934.24,DOC2100,2024-06
|
| 471 |
+
TXN000470,2024-11-15,110000,Accounts Receivable,6908.34,0.0,6908.34,DOC7780,2024-11
|
| 472 |
+
TXN000471,2024-08-28,210000,Accrued Liabilities,0.0,889.47,-889.47,DOC3349,2024-08
|
| 473 |
+
TXN000472,2024-03-08,520000,Rent Expense,36244.51,0.0,36244.51,DOC7764,2024-03
|
| 474 |
+
TXN000473,2024-02-05,410000,Service Revenue,0.0,4374.35,-4374.35,DOC8843,2024-02
|
| 475 |
+
TXN000474,2024-03-13,120000,Inventory,16236.24,0.0,16236.24,DOC6189,2024-03
|
| 476 |
+
TXN000475,2024-07-14,230000,Long-term Debt,0.0,22176.26,-22176.26,DOC4713,2024-07
|
| 477 |
+
TXN000476,2024-01-27,140000,"Property, Plant & Equipment",32044.39,0.0,32044.39,DOC8397,2024-01
|
| 478 |
+
TXN000477,2024-02-19,220000,Short-term Debt,0.0,34038.58,-34038.58,DOC8979,2024-02
|
| 479 |
+
TXN000478,2024-12-07,120000,Inventory,33507.4,0.0,33507.4,DOC6291,2024-12
|
| 480 |
+
TXN000479,2024-04-11,110000,Accounts Receivable,27933.39,0.0,27933.39,DOC5211,2024-04
|
| 481 |
+
TXN000480,2024-05-29,220000,Short-term Debt,0.0,28158.61,-28158.61,DOC4374,2024-05
|
| 482 |
+
TXN000481,2024-04-15,430000,Other Income,0.0,4924.15,-4924.15,DOC1632,2024-04
|
| 483 |
+
TXN000482,2024-01-12,430000,Other Income,0.0,17443.82,-17443.82,DOC4719,2024-01
|
| 484 |
+
TXN000483,2024-01-03,530000,Utilities Expense,46366.17,0.0,46366.17,DOC1236,2024-01
|
| 485 |
+
TXN000484,2024-04-13,520000,Rent Expense,1099.32,0.0,1099.32,DOC7099,2024-04
|
| 486 |
+
TXN000485,2024-09-04,220000,Short-term Debt,0.0,27043.86,-27043.86,DOC1285,2024-09
|
| 487 |
+
TXN000486,2024-03-24,540000,Marketing Expense,31216.93,0.0,31216.93,DOC8121,2024-03
|
| 488 |
+
TXN000487,2024-08-18,220000,Short-term Debt,0.0,43247.84,-43247.84,DOC2012,2024-08
|
| 489 |
+
TXN000488,2024-02-07,430000,Other Income,0.0,8049.27,-8049.27,DOC4725,2024-02
|
| 490 |
+
TXN000489,2024-05-30,130000,Prepaid Expenses,13229.32,0.0,13229.32,DOC3408,2024-05
|
| 491 |
+
TXN000490,2024-09-14,540000,Marketing Expense,46854.2,0.0,46854.2,DOC3496,2024-09
|
| 492 |
+
TXN000491,2024-11-18,310000,Retained Earnings,0.0,19909.38,-19909.38,DOC8574,2024-11
|
| 493 |
+
TXN000492,2024-11-06,130000,Prepaid Expenses,8172.03,0.0,8172.03,DOC9597,2024-11
|
| 494 |
+
TXN000493,2024-05-22,310000,Retained Earnings,0.0,49608.68,-49608.68,DOC9435,2024-05
|
| 495 |
+
TXN000494,2024-01-12,300000,Common Stock,0.0,46536.7,-46536.7,DOC9785,2024-01
|
| 496 |
+
TXN000495,2024-10-17,400000,Sales Revenue,0.0,33747.76,-33747.76,DOC8629,2024-10
|
| 497 |
+
TXN000496,2024-03-07,200000,Accounts Payable,0.0,39522.52,-39522.52,DOC8693,2024-03
|
| 498 |
+
TXN000497,2024-06-11,230000,Long-term Debt,0.0,8758.87,-8758.87,DOC5225,2024-06
|
| 499 |
+
TXN000498,2024-07-24,120000,Inventory,48782.95,0.0,48782.95,DOC6656,2024-07
|
| 500 |
+
TXN000499,2024-10-07,110000,Accounts Receivable,24019.79,0.0,24019.79,DOC5259,2024-10
|
| 501 |
+
TXN000500,2024-11-16,410000,Service Revenue,0.0,30352.02,-30352.02,DOC5917,2024-11
|
| 502 |
+
TXN000501,2024-01-25,410000,Service Revenue,0.0,33348.71,-33348.71,DOC3529,2024-01
|
| 503 |
+
TXN000502,2024-01-25,220000,Short-term Debt,0.0,11704.31,-11704.31,DOC8340,2024-01
|
| 504 |
+
TXN000503,2024-10-14,320000,Other Equity,0.0,6189.55,-6189.55,DOC9734,2024-10
|
| 505 |
+
TXN000504,2024-01-20,410000,Service Revenue,0.0,22031.63,-22031.63,DOC6947,2024-01
|
| 506 |
+
TXN000505,2024-06-08,200000,Accounts Payable,0.0,10880.31,-10880.31,DOC5349,2024-06
|
| 507 |
+
TXN000506,2024-02-29,110000,Accounts Receivable,18303.43,0.0,18303.43,DOC7430,2024-02
|
| 508 |
+
TXN000507,2024-01-05,520000,Rent Expense,39060.0,0.0,39060.0,DOC7488,2024-01
|
| 509 |
+
TXN000508,2024-09-23,110000,Accounts Receivable,37737.25,0.0,37737.25,DOC6175,2024-09
|
| 510 |
+
TXN000509,2024-03-23,420000,Interest Income,0.0,8616.17,-8616.17,DOC6448,2024-03
|
| 511 |
+
TXN000510,2024-09-19,410000,Service Revenue,0.0,34638.85,-34638.85,DOC7907,2024-09
|
| 512 |
+
TXN000511,2024-09-16,100000,Cash and Cash Equivalents,31696.16,0.0,31696.16,DOC6671,2024-09
|
| 513 |
+
TXN000512,2024-04-10,500000,Cost of Goods Sold,30799.45,0.0,30799.45,DOC4292,2024-04
|
| 514 |
+
TXN000513,2024-05-03,530000,Utilities Expense,42415.99,0.0,42415.99,DOC8857,2024-05
|
| 515 |
+
TXN000514,2024-04-25,140000,"Property, Plant & Equipment",20299.44,0.0,20299.44,DOC1767,2024-04
|
| 516 |
+
TXN000515,2024-01-07,120000,Inventory,26322.68,0.0,26322.68,DOC2549,2024-01
|
| 517 |
+
TXN000516,2024-08-16,210000,Accrued Liabilities,0.0,19415.23,-19415.23,DOC4716,2024-08
|
| 518 |
+
TXN000517,2024-03-02,110000,Accounts Receivable,24119.07,0.0,24119.07,DOC3293,2024-03
|
| 519 |
+
TXN000518,2024-03-19,200000,Accounts Payable,0.0,29149.2,-29149.2,DOC8638,2024-03
|
| 520 |
+
TXN000519,2024-03-05,210000,Accrued Liabilities,0.0,16242.67,-16242.67,DOC9433,2024-03
|
| 521 |
+
TXN000520,2024-07-31,400000,Sales Revenue,0.0,10022.93,-10022.93,DOC5268,2024-07
|
| 522 |
+
TXN000521,2024-07-06,130000,Prepaid Expenses,32339.9,0.0,32339.9,DOC7036,2024-07
|
| 523 |
+
TXN000522,2024-09-12,530000,Utilities Expense,4994.32,0.0,4994.32,DOC8961,2024-09
|
| 524 |
+
TXN000523,2024-02-03,130000,Prepaid Expenses,16301.33,0.0,16301.33,DOC1593,2024-02
|
| 525 |
+
TXN000524,2024-08-14,220000,Short-term Debt,0.0,18856.83,-18856.83,DOC4493,2024-08
|
| 526 |
+
TXN000525,2024-01-21,300000,Common Stock,0.0,47815.49,-47815.49,DOC3672,2024-01
|
| 527 |
+
TXN000526,2024-07-10,230000,Long-term Debt,0.0,39366.48,-39366.48,DOC1392,2024-07
|
| 528 |
+
TXN000527,2024-05-08,230000,Long-term Debt,0.0,40463.28,-40463.28,DOC4631,2024-05
|
| 529 |
+
TXN000528,2024-01-10,100000,Cash and Cash Equivalents,46522.91,0.0,46522.91,DOC9123,2024-01
|
| 530 |
+
TXN000529,2024-10-03,220000,Short-term Debt,0.0,41274.1,-41274.1,DOC1775,2024-10
|
| 531 |
+
TXN000530,2024-03-19,220000,Short-term Debt,0.0,44480.61,-44480.61,DOC4926,2024-03
|
| 532 |
+
TXN000531,2024-03-09,400000,Sales Revenue,0.0,36897.95,-36897.95,DOC7230,2024-03
|
| 533 |
+
TXN000532,2024-01-08,140000,"Property, Plant & Equipment",2179.48,0.0,2179.48,DOC4456,2024-01
|
| 534 |
+
TXN000533,2024-05-31,400000,Sales Revenue,0.0,1874.99,-1874.99,DOC1147,2024-05
|
| 535 |
+
TXN000534,2024-08-19,540000,Marketing Expense,17727.25,0.0,17727.25,DOC1365,2024-08
|
| 536 |
+
TXN000535,2024-05-18,130000,Prepaid Expenses,48540.42,0.0,48540.42,DOC6330,2024-05
|
| 537 |
+
TXN000536,2024-01-28,210000,Accrued Liabilities,0.0,17806.58,-17806.58,DOC9964,2024-01
|
| 538 |
+
TXN000537,2024-11-15,220000,Short-term Debt,0.0,21272.41,-21272.41,DOC7511,2024-11
|
| 539 |
+
TXN000538,2024-08-10,500000,Cost of Goods Sold,39146.0,0.0,39146.0,DOC9551,2024-08
|
| 540 |
+
TXN000539,2024-02-18,230000,Long-term Debt,0.0,12845.13,-12845.13,DOC7979,2024-02
|
| 541 |
+
TXN000540,2024-04-14,410000,Service Revenue,0.0,32230.82,-32230.82,DOC9569,2024-04
|
| 542 |
+
TXN000541,2024-09-22,510000,Salaries and Wages,39955.84,0.0,39955.84,DOC9843,2024-09
|
| 543 |
+
TXN000542,2024-09-14,220000,Short-term Debt,0.0,30133.89,-30133.89,DOC7303,2024-09
|
| 544 |
+
TXN000543,2024-10-14,430000,Other Income,0.0,30863.34,-30863.34,DOC9714,2024-10
|
| 545 |
+
TXN000544,2024-09-27,300000,Common Stock,0.0,5629.32,-5629.32,DOC8569,2024-09
|
| 546 |
+
TXN000545,2024-06-01,230000,Long-term Debt,0.0,18862.05,-18862.05,DOC5941,2024-06
|
| 547 |
+
TXN000546,2024-10-04,510000,Salaries and Wages,13762.19,0.0,13762.19,DOC1685,2024-10
|
| 548 |
+
TXN000547,2024-05-01,500000,Cost of Goods Sold,40815.75,0.0,40815.75,DOC1038,2024-05
|
| 549 |
+
TXN000548,2024-09-24,500000,Cost of Goods Sold,45954.43,0.0,45954.43,DOC8697,2024-09
|
| 550 |
+
TXN000549,2024-05-28,540000,Marketing Expense,48922.02,0.0,48922.02,DOC1301,2024-05
|
| 551 |
+
TXN000550,2024-08-25,220000,Short-term Debt,0.0,38844.73,-38844.73,DOC9789,2024-08
|
| 552 |
+
TXN000551,2024-12-10,310000,Retained Earnings,0.0,46875.66,-46875.66,DOC4537,2024-12
|
| 553 |
+
TXN000552,2024-01-29,110000,Accounts Receivable,34296.37,0.0,34296.37,DOC7579,2024-01
|
| 554 |
+
TXN000553,2024-04-04,510000,Salaries and Wages,24470.87,0.0,24470.87,DOC5183,2024-04
|
| 555 |
+
TXN000554,2024-10-04,320000,Other Equity,0.0,27157.64,-27157.64,DOC2724,2024-10
|
| 556 |
+
TXN000555,2024-07-02,100000,Cash and Cash Equivalents,30635.83,0.0,30635.83,DOC2653,2024-07
|
| 557 |
+
TXN000556,2024-01-23,520000,Rent Expense,34475.38,0.0,34475.38,DOC6926,2024-01
|
| 558 |
+
TXN000557,2024-10-07,320000,Other Equity,0.0,38079.96,-38079.96,DOC7279,2024-10
|
| 559 |
+
TXN000558,2024-07-04,300000,Common Stock,0.0,565.65,-565.65,DOC7272,2024-07
|
| 560 |
+
TXN000559,2024-09-17,320000,Other Equity,0.0,44084.39,-44084.39,DOC7019,2024-09
|
| 561 |
+
TXN000560,2024-08-11,220000,Short-term Debt,0.0,44002.84,-44002.84,DOC9033,2024-08
|
| 562 |
+
TXN000561,2024-01-10,310000,Retained Earnings,0.0,37143.17,-37143.17,DOC7445,2024-01
|
| 563 |
+
TXN000562,2024-08-06,210000,Accrued Liabilities,0.0,9482.43,-9482.43,DOC3159,2024-08
|
| 564 |
+
TXN000563,2024-03-26,400000,Sales Revenue,0.0,42417.58,-42417.58,DOC9505,2024-03
|
| 565 |
+
TXN000564,2024-07-27,320000,Other Equity,0.0,650.48,-650.48,DOC4489,2024-07
|
| 566 |
+
TXN000565,2024-01-20,540000,Marketing Expense,16413.89,0.0,16413.89,DOC2778,2024-01
|
| 567 |
+
TXN000566,2024-11-07,200000,Accounts Payable,0.0,25152.31,-25152.31,DOC1697,2024-11
|
| 568 |
+
TXN000567,2024-04-20,130000,Prepaid Expenses,22485.67,0.0,22485.67,DOC2929,2024-04
|
| 569 |
+
TXN000568,2024-06-02,120000,Inventory,19637.13,0.0,19637.13,DOC6588,2024-06
|
| 570 |
+
TXN000569,2024-12-24,220000,Short-term Debt,0.0,260.59,-260.59,DOC6891,2024-12
|
| 571 |
+
TXN000570,2024-01-20,400000,Sales Revenue,0.0,20176.12,-20176.12,DOC3563,2024-01
|
| 572 |
+
TXN000571,2024-01-03,410000,Service Revenue,0.0,3336.19,-3336.19,DOC5431,2024-01
|
| 573 |
+
TXN000572,2024-09-10,530000,Utilities Expense,24381.22,0.0,24381.22,DOC1593,2024-09
|
| 574 |
+
TXN000573,2024-06-07,520000,Rent Expense,1244.35,0.0,1244.35,DOC4390,2024-06
|
| 575 |
+
TXN000574,2024-07-29,410000,Service Revenue,0.0,3021.69,-3021.69,DOC1541,2024-07
|
| 576 |
+
TXN000575,2024-04-26,200000,Accounts Payable,0.0,39451.89,-39451.89,DOC9623,2024-04
|
| 577 |
+
TXN000576,2024-08-15,400000,Sales Revenue,0.0,6206.6,-6206.6,DOC7256,2024-08
|
| 578 |
+
TXN000577,2024-05-25,100000,Cash and Cash Equivalents,18633.96,0.0,18633.96,DOC2136,2024-05
|
| 579 |
+
TXN000578,2024-11-08,420000,Interest Income,0.0,46662.36,-46662.36,DOC2283,2024-11
|
| 580 |
+
TXN000579,2024-08-27,530000,Utilities Expense,8994.8,0.0,8994.8,DOC9590,2024-08
|
| 581 |
+
TXN000580,2024-02-16,200000,Accounts Payable,0.0,42006.13,-42006.13,DOC9266,2024-02
|
| 582 |
+
TXN000581,2024-05-16,210000,Accrued Liabilities,0.0,47520.61,-47520.61,DOC6624,2024-05
|
| 583 |
+
TXN000582,2024-03-01,530000,Utilities Expense,48984.37,0.0,48984.37,DOC6068,2024-03
|
| 584 |
+
TXN000583,2024-04-22,310000,Retained Earnings,0.0,29331.93,-29331.93,DOC3757,2024-04
|
| 585 |
+
TXN000584,2024-12-30,500000,Cost of Goods Sold,39150.84,0.0,39150.84,DOC2449,2024-12
|
| 586 |
+
TXN000585,2024-10-28,120000,Inventory,11354.51,0.0,11354.51,DOC8999,2024-10
|
| 587 |
+
TXN000586,2024-02-18,140000,"Property, Plant & Equipment",21815.5,0.0,21815.5,DOC9895,2024-02
|
| 588 |
+
TXN000587,2024-12-21,140000,"Property, Plant & Equipment",6760.65,0.0,6760.65,DOC4331,2024-12
|
| 589 |
+
TXN000588,2024-10-21,210000,Accrued Liabilities,0.0,24873.41,-24873.41,DOC3839,2024-10
|
| 590 |
+
TXN000589,2024-11-21,130000,Prepaid Expenses,2958.28,0.0,2958.28,DOC1685,2024-11
|
| 591 |
+
TXN000590,2024-07-06,320000,Other Equity,0.0,20001.92,-20001.92,DOC2619,2024-07
|
| 592 |
+
TXN000591,2024-07-31,130000,Prepaid Expenses,3541.01,0.0,3541.01,DOC5713,2024-07
|
| 593 |
+
TXN000592,2024-06-11,210000,Accrued Liabilities,0.0,13853.06,-13853.06,DOC9461,2024-06
|
| 594 |
+
TXN000593,2024-12-01,300000,Common Stock,0.0,18623.23,-18623.23,DOC3014,2024-12
|
| 595 |
+
TXN000594,2024-08-04,300000,Common Stock,0.0,38857.86,-38857.86,DOC6675,2024-08
|
| 596 |
+
TXN000595,2024-10-27,230000,Long-term Debt,0.0,42669.17,-42669.17,DOC3643,2024-10
|
| 597 |
+
TXN000596,2024-09-06,510000,Salaries and Wages,28143.44,0.0,28143.44,DOC1689,2024-09
|
| 598 |
+
TXN000597,2024-01-07,100000,Cash and Cash Equivalents,4412.59,0.0,4412.59,DOC1671,2024-01
|
| 599 |
+
TXN000598,2024-05-27,310000,Retained Earnings,0.0,6486.61,-6486.61,DOC7342,2024-05
|
| 600 |
+
TXN000599,2024-06-02,540000,Marketing Expense,20997.79,0.0,20997.79,DOC7285,2024-06
|
| 601 |
+
TXN000600,2024-11-09,140000,"Property, Plant & Equipment",48979.59,0.0,48979.59,DOC4670,2024-11
|
| 602 |
+
TXN000601,2024-10-31,140000,"Property, Plant & Equipment",23250.23,0.0,23250.23,DOC6976,2024-10
|
| 603 |
+
TXN000602,2024-06-09,540000,Marketing Expense,7647.22,0.0,7647.22,DOC8875,2024-06
|
| 604 |
+
TXN000603,2024-11-22,300000,Common Stock,0.0,34219.33,-34219.33,DOC3336,2024-11
|
| 605 |
+
TXN000604,2024-05-31,500000,Cost of Goods Sold,5826.97,0.0,5826.97,DOC8521,2024-05
|
| 606 |
+
TXN000605,2024-06-17,310000,Retained Earnings,0.0,39605.83,-39605.83,DOC5624,2024-06
|
| 607 |
+
TXN000606,2024-07-16,110000,Accounts Receivable,42361.24,0.0,42361.24,DOC2537,2024-07
|
| 608 |
+
TXN000607,2024-02-26,430000,Other Income,0.0,33484.21,-33484.21,DOC1097,2024-02
|
| 609 |
+
TXN000608,2024-05-04,430000,Other Income,0.0,37489.26,-37489.26,DOC9535,2024-05
|
| 610 |
+
TXN000609,2024-10-20,420000,Interest Income,0.0,40339.54,-40339.54,DOC1610,2024-10
|
| 611 |
+
TXN000610,2024-11-14,520000,Rent Expense,24913.07,0.0,24913.07,DOC3324,2024-11
|
| 612 |
+
TXN000611,2024-06-02,530000,Utilities Expense,16577.73,0.0,16577.73,DOC6774,2024-06
|
| 613 |
+
TXN000612,2024-07-31,220000,Short-term Debt,0.0,33015.51,-33015.51,DOC1781,2024-07
|
| 614 |
+
TXN000613,2024-06-16,230000,Long-term Debt,0.0,49250.98,-49250.98,DOC8193,2024-06
|
| 615 |
+
TXN000614,2024-03-06,500000,Cost of Goods Sold,3353.71,0.0,3353.71,DOC4970,2024-03
|
| 616 |
+
TXN000615,2024-02-13,220000,Short-term Debt,0.0,26981.22,-26981.22,DOC3274,2024-02
|
| 617 |
+
TXN000616,2024-06-15,200000,Accounts Payable,0.0,32873.33,-32873.33,DOC7744,2024-06
|
| 618 |
+
TXN000617,2024-07-15,510000,Salaries and Wages,48227.39,0.0,48227.39,DOC3551,2024-07
|
| 619 |
+
TXN000618,2024-03-14,320000,Other Equity,0.0,4792.4,-4792.4,DOC3555,2024-03
|
| 620 |
+
TXN000619,2024-06-12,230000,Long-term Debt,0.0,13894.44,-13894.44,DOC8239,2024-06
|
| 621 |
+
TXN000620,2024-02-16,230000,Long-term Debt,0.0,9872.46,-9872.46,DOC3285,2024-02
|
| 622 |
+
TXN000621,2024-07-28,220000,Short-term Debt,0.0,7981.95,-7981.95,DOC4525,2024-07
|
| 623 |
+
TXN000622,2024-09-19,320000,Other Equity,0.0,30712.31,-30712.31,DOC1258,2024-09
|
| 624 |
+
TXN000623,2024-12-28,510000,Salaries and Wages,49177.72,0.0,49177.72,DOC4200,2024-12
|
| 625 |
+
TXN000624,2024-04-10,220000,Short-term Debt,0.0,36658.5,-36658.5,DOC1687,2024-04
|
| 626 |
+
TXN000625,2024-04-10,310000,Retained Earnings,0.0,22072.14,-22072.14,DOC7509,2024-04
|
| 627 |
+
TXN000626,2024-02-01,520000,Rent Expense,5970.44,0.0,5970.44,DOC8183,2024-02
|
| 628 |
+
TXN000627,2024-03-03,100000,Cash and Cash Equivalents,24319.41,0.0,24319.41,DOC6108,2024-03
|
| 629 |
+
TXN000628,2024-06-06,540000,Marketing Expense,31770.1,0.0,31770.1,DOC2283,2024-06
|
| 630 |
+
TXN000629,2024-08-10,200000,Accounts Payable,0.0,32841.09,-32841.09,DOC4711,2024-08
|
| 631 |
+
TXN000630,2024-01-25,140000,"Property, Plant & Equipment",4742.22,0.0,4742.22,DOC4864,2024-01
|
| 632 |
+
TXN000631,2024-06-02,530000,Utilities Expense,4062.39,0.0,4062.39,DOC7788,2024-06
|
| 633 |
+
TXN000632,2024-07-07,120000,Inventory,16908.34,0.0,16908.34,DOC1264,2024-07
|
| 634 |
+
TXN000633,2024-05-13,530000,Utilities Expense,35541.12,0.0,35541.12,DOC8544,2024-05
|
| 635 |
+
TXN000634,2024-12-29,310000,Retained Earnings,0.0,23017.33,-23017.33,DOC1587,2024-12
|
| 636 |
+
TXN000635,2024-10-03,430000,Other Income,0.0,5735.87,-5735.87,DOC9381,2024-10
|
| 637 |
+
TXN000636,2024-06-11,100000,Cash and Cash Equivalents,7184.4,0.0,7184.4,DOC7450,2024-06
|
| 638 |
+
TXN000637,2024-12-03,420000,Interest Income,0.0,37466.43,-37466.43,DOC8096,2024-12
|
| 639 |
+
TXN000638,2024-05-29,430000,Other Income,0.0,36929.65,-36929.65,DOC7763,2024-05
|
| 640 |
+
TXN000639,2024-12-15,310000,Retained Earnings,0.0,48957.34,-48957.34,DOC9915,2024-12
|
| 641 |
+
TXN000640,2024-03-06,430000,Other Income,0.0,15814.49,-15814.49,DOC1155,2024-03
|
| 642 |
+
TXN000641,2024-07-19,420000,Interest Income,0.0,32798.59,-32798.59,DOC7144,2024-07
|
| 643 |
+
TXN000642,2024-09-03,220000,Short-term Debt,0.0,14035.88,-14035.88,DOC7659,2024-09
|
| 644 |
+
TXN000643,2024-10-20,420000,Interest Income,0.0,18082.85,-18082.85,DOC5628,2024-10
|
| 645 |
+
TXN000644,2024-11-08,120000,Inventory,15266.93,0.0,15266.93,DOC9179,2024-11
|
| 646 |
+
TXN000645,2024-02-08,410000,Service Revenue,0.0,40389.06,-40389.06,DOC2787,2024-02
|
| 647 |
+
TXN000646,2024-07-25,400000,Sales Revenue,0.0,13088.31,-13088.31,DOC5741,2024-07
|
| 648 |
+
TXN000647,2024-02-15,110000,Accounts Receivable,23071.88,0.0,23071.88,DOC3659,2024-02
|
| 649 |
+
TXN000648,2024-11-23,540000,Marketing Expense,6529.55,0.0,6529.55,DOC6661,2024-11
|
| 650 |
+
TXN000649,2024-03-24,410000,Service Revenue,0.0,998.2,-998.2,DOC1423,2024-03
|
| 651 |
+
TXN000650,2024-06-02,410000,Service Revenue,0.0,48315.55,-48315.55,DOC5757,2024-06
|
| 652 |
+
TXN000651,2024-03-23,430000,Other Income,0.0,48641.54,-48641.54,DOC3946,2024-03
|
| 653 |
+
TXN000652,2024-10-01,300000,Common Stock,0.0,40264.85,-40264.85,DOC6075,2024-10
|
| 654 |
+
TXN000653,2024-11-22,400000,Sales Revenue,0.0,31105.09,-31105.09,DOC2531,2024-11
|
| 655 |
+
TXN000654,2024-04-29,520000,Rent Expense,35213.93,0.0,35213.93,DOC3723,2024-04
|
| 656 |
+
TXN000655,2024-10-12,220000,Short-term Debt,0.0,2401.57,-2401.57,DOC7816,2024-10
|
| 657 |
+
TXN000656,2024-03-29,530000,Utilities Expense,41244.29,0.0,41244.29,DOC2762,2024-03
|
| 658 |
+
TXN000657,2024-11-29,230000,Long-term Debt,0.0,37185.34,-37185.34,DOC6827,2024-11
|
| 659 |
+
TXN000658,2024-09-20,130000,Prepaid Expenses,43875.36,0.0,43875.36,DOC8804,2024-09
|
| 660 |
+
TXN000659,2024-03-26,410000,Service Revenue,0.0,44625.89,-44625.89,DOC4198,2024-03
|
| 661 |
+
TXN000660,2024-03-02,430000,Other Income,0.0,39749.46,-39749.46,DOC6154,2024-03
|
| 662 |
+
TXN000661,2024-03-04,310000,Retained Earnings,0.0,39479.13,-39479.13,DOC2492,2024-03
|
| 663 |
+
TXN000662,2024-11-20,540000,Marketing Expense,12690.13,0.0,12690.13,DOC8851,2024-11
|
| 664 |
+
TXN000663,2024-07-19,100000,Cash and Cash Equivalents,45490.38,0.0,45490.38,DOC5577,2024-07
|
| 665 |
+
TXN000664,2024-01-08,100000,Cash and Cash Equivalents,25920.57,0.0,25920.57,DOC2447,2024-01
|
| 666 |
+
TXN000665,2024-03-16,320000,Other Equity,0.0,23275.22,-23275.22,DOC1526,2024-03
|
| 667 |
+
TXN000666,2024-05-26,230000,Long-term Debt,0.0,44636.91,-44636.91,DOC7748,2024-05
|
| 668 |
+
TXN000667,2024-01-21,220000,Short-term Debt,0.0,31602.25,-31602.25,DOC4740,2024-01
|
| 669 |
+
TXN000668,2024-05-11,520000,Rent Expense,33853.68,0.0,33853.68,DOC1771,2024-05
|
| 670 |
+
TXN000669,2024-03-07,320000,Other Equity,0.0,32645.99,-32645.99,DOC1193,2024-03
|
| 671 |
+
TXN000670,2024-12-12,110000,Accounts Receivable,37205.34,0.0,37205.34,DOC5005,2024-12
|
| 672 |
+
TXN000671,2024-08-01,200000,Accounts Payable,0.0,12794.14,-12794.14,DOC7716,2024-08
|
| 673 |
+
TXN000672,2024-09-18,320000,Other Equity,0.0,2377.87,-2377.87,DOC8815,2024-09
|
| 674 |
+
TXN000673,2024-12-27,520000,Rent Expense,48579.48,0.0,48579.48,DOC3800,2024-12
|
| 675 |
+
TXN000674,2024-05-21,120000,Inventory,30577.93,0.0,30577.93,DOC7892,2024-05
|
| 676 |
+
TXN000675,2024-11-07,530000,Utilities Expense,29584.29,0.0,29584.29,DOC5796,2024-11
|
| 677 |
+
TXN000676,2024-02-18,200000,Accounts Payable,0.0,482.44,-482.44,DOC2159,2024-02
|
| 678 |
+
TXN000677,2024-12-18,310000,Retained Earnings,0.0,17009.15,-17009.15,DOC1340,2024-12
|
| 679 |
+
TXN000678,2024-07-10,540000,Marketing Expense,25682.12,0.0,25682.12,DOC6482,2024-07
|
| 680 |
+
TXN000679,2024-09-21,230000,Long-term Debt,0.0,40852.44,-40852.44,DOC5912,2024-09
|
| 681 |
+
TXN000680,2024-01-17,230000,Long-term Debt,0.0,5780.54,-5780.54,DOC3866,2024-01
|
| 682 |
+
TXN000681,2024-07-01,210000,Accrued Liabilities,0.0,43723.7,-43723.7,DOC5492,2024-07
|
| 683 |
+
TXN000682,2024-05-26,310000,Retained Earnings,0.0,22584.79,-22584.79,DOC4629,2024-05
|
| 684 |
+
TXN000683,2024-01-01,400000,Sales Revenue,0.0,19554.63,-19554.63,DOC9210,2024-01
|
| 685 |
+
TXN000684,2024-03-12,320000,Other Equity,0.0,45389.79,-45389.79,DOC7132,2024-03
|
| 686 |
+
TXN000685,2024-09-24,400000,Sales Revenue,0.0,33762.93,-33762.93,DOC7048,2024-09
|
| 687 |
+
TXN000686,2024-03-30,400000,Sales Revenue,0.0,47757.52,-47757.52,DOC4321,2024-03
|
| 688 |
+
TXN000687,2024-01-08,140000,"Property, Plant & Equipment",43157.74,0.0,43157.74,DOC9365,2024-01
|
| 689 |
+
TXN000688,2024-08-02,400000,Sales Revenue,0.0,2123.88,-2123.88,DOC2875,2024-08
|
| 690 |
+
TXN000689,2024-05-25,510000,Salaries and Wages,5812.93,0.0,5812.93,DOC1989,2024-05
|
| 691 |
+
TXN000690,2024-05-06,100000,Cash and Cash Equivalents,33166.96,0.0,33166.96,DOC2774,2024-05
|
| 692 |
+
TXN000691,2024-03-24,220000,Short-term Debt,0.0,45026.03,-45026.03,DOC1331,2024-03
|
| 693 |
+
TXN000692,2024-05-22,520000,Rent Expense,37517.55,0.0,37517.55,DOC6889,2024-05
|
| 694 |
+
TXN000693,2024-07-20,230000,Long-term Debt,0.0,18159.81,-18159.81,DOC5658,2024-07
|
| 695 |
+
TXN000694,2024-02-08,230000,Long-term Debt,0.0,43697.56,-43697.56,DOC4155,2024-02
|
| 696 |
+
TXN000695,2024-06-03,200000,Accounts Payable,0.0,37074.96,-37074.96,DOC2628,2024-06
|
| 697 |
+
TXN000696,2024-12-15,200000,Accounts Payable,0.0,7192.64,-7192.64,DOC5008,2024-12
|
| 698 |
+
TXN000697,2024-08-22,320000,Other Equity,0.0,24351.42,-24351.42,DOC8980,2024-08
|
| 699 |
+
TXN000698,2024-12-22,420000,Interest Income,0.0,6237.86,-6237.86,DOC5318,2024-12
|
| 700 |
+
TXN000699,2024-10-10,200000,Accounts Payable,0.0,19430.89,-19430.89,DOC2130,2024-10
|
| 701 |
+
TXN000700,2024-04-08,510000,Salaries and Wages,3972.97,0.0,3972.97,DOC3120,2024-04
|
| 702 |
+
TXN000701,2024-05-01,540000,Marketing Expense,29555.25,0.0,29555.25,DOC2823,2024-05
|
| 703 |
+
TXN000702,2024-07-13,120000,Inventory,42892.36,0.0,42892.36,DOC7990,2024-07
|
| 704 |
+
TXN000703,2024-03-03,230000,Long-term Debt,0.0,5033.79,-5033.79,DOC2141,2024-03
|
| 705 |
+
TXN000704,2024-06-15,130000,Prepaid Expenses,25632.9,0.0,25632.9,DOC8835,2024-06
|
| 706 |
+
TXN000705,2024-01-07,140000,"Property, Plant & Equipment",7215.45,0.0,7215.45,DOC5928,2024-01
|
| 707 |
+
TXN000706,2024-02-16,100000,Cash and Cash Equivalents,7807.54,0.0,7807.54,DOC4273,2024-02
|
| 708 |
+
TXN000707,2024-05-05,510000,Salaries and Wages,29839.84,0.0,29839.84,DOC2829,2024-05
|
| 709 |
+
TXN000708,2024-06-24,140000,"Property, Plant & Equipment",10972.84,0.0,10972.84,DOC2054,2024-06
|
| 710 |
+
TXN000709,2024-04-22,130000,Prepaid Expenses,7113.59,0.0,7113.59,DOC7980,2024-04
|
| 711 |
+
TXN000710,2024-03-15,120000,Inventory,6875.87,0.0,6875.87,DOC8833,2024-03
|
| 712 |
+
TXN000711,2024-12-28,410000,Service Revenue,0.0,19460.54,-19460.54,DOC3309,2024-12
|
| 713 |
+
TXN000712,2024-09-01,420000,Interest Income,0.0,14533.31,-14533.31,DOC7628,2024-09
|
| 714 |
+
TXN000713,2024-06-18,140000,"Property, Plant & Equipment",18802.7,0.0,18802.7,DOC7789,2024-06
|
| 715 |
+
TXN000714,2024-09-30,130000,Prepaid Expenses,41352.7,0.0,41352.7,DOC3416,2024-09
|
| 716 |
+
TXN000715,2024-02-28,400000,Sales Revenue,0.0,48060.66,-48060.66,DOC6619,2024-02
|
| 717 |
+
TXN000716,2024-04-18,500000,Cost of Goods Sold,48540.03,0.0,48540.03,DOC4236,2024-04
|
| 718 |
+
TXN000717,2024-10-31,230000,Long-term Debt,0.0,26659.65,-26659.65,DOC9556,2024-10
|
| 719 |
+
TXN000718,2024-12-08,540000,Marketing Expense,22078.02,0.0,22078.02,DOC2439,2024-12
|
| 720 |
+
TXN000719,2024-02-20,400000,Sales Revenue,0.0,8940.83,-8940.83,DOC1340,2024-02
|
| 721 |
+
TXN000720,2024-01-21,410000,Service Revenue,0.0,48324.23,-48324.23,DOC1358,2024-01
|
| 722 |
+
TXN000721,2024-04-01,130000,Prepaid Expenses,29190.92,0.0,29190.92,DOC7626,2024-04
|
| 723 |
+
TXN000722,2024-04-20,400000,Sales Revenue,0.0,40856.17,-40856.17,DOC7652,2024-04
|
| 724 |
+
TXN000723,2024-04-08,500000,Cost of Goods Sold,44027.71,0.0,44027.71,DOC3151,2024-04
|
| 725 |
+
TXN000724,2024-06-13,520000,Rent Expense,36567.82,0.0,36567.82,DOC3567,2024-06
|
| 726 |
+
TXN000725,2024-05-24,140000,"Property, Plant & Equipment",35573.15,0.0,35573.15,DOC4730,2024-05
|
| 727 |
+
TXN000726,2024-12-19,540000,Marketing Expense,36134.95,0.0,36134.95,DOC2708,2024-12
|
| 728 |
+
TXN000727,2024-05-19,420000,Interest Income,0.0,1995.28,-1995.28,DOC7538,2024-05
|
| 729 |
+
TXN000728,2024-01-05,210000,Accrued Liabilities,0.0,39731.11,-39731.11,DOC2960,2024-01
|
| 730 |
+
TXN000729,2024-01-12,410000,Service Revenue,0.0,48483.43,-48483.43,DOC1882,2024-01
|
| 731 |
+
TXN000730,2024-06-02,520000,Rent Expense,49051.27,0.0,49051.27,DOC6867,2024-06
|
| 732 |
+
TXN000731,2024-12-17,530000,Utilities Expense,24647.36,0.0,24647.36,DOC8929,2024-12
|
| 733 |
+
TXN000732,2024-04-11,130000,Prepaid Expenses,26169.96,0.0,26169.96,DOC9125,2024-04
|
| 734 |
+
TXN000733,2024-07-21,420000,Interest Income,0.0,45944.86,-45944.86,DOC7642,2024-07
|
| 735 |
+
TXN000734,2024-06-27,510000,Salaries and Wages,44733.18,0.0,44733.18,DOC4802,2024-06
|
| 736 |
+
TXN000735,2024-04-01,510000,Salaries and Wages,41393.19,0.0,41393.19,DOC7142,2024-04
|
| 737 |
+
TXN000736,2024-09-16,420000,Interest Income,0.0,40348.81,-40348.81,DOC5258,2024-09
|
| 738 |
+
TXN000737,2024-11-24,430000,Other Income,0.0,3067.63,-3067.63,DOC8084,2024-11
|
| 739 |
+
TXN000738,2024-12-02,500000,Cost of Goods Sold,42363.75,0.0,42363.75,DOC4935,2024-12
|
| 740 |
+
TXN000739,2024-05-26,220000,Short-term Debt,0.0,15663.76,-15663.76,DOC6442,2024-05
|
| 741 |
+
TXN000740,2024-01-13,140000,"Property, Plant & Equipment",48579.5,0.0,48579.5,DOC2724,2024-01
|
| 742 |
+
TXN000741,2024-04-23,430000,Other Income,0.0,23894.49,-23894.49,DOC4420,2024-04
|
| 743 |
+
TXN000742,2024-11-18,310000,Retained Earnings,0.0,34657.37,-34657.37,DOC6929,2024-11
|
| 744 |
+
TXN000743,2024-07-22,540000,Marketing Expense,40241.42,0.0,40241.42,DOC4735,2024-07
|
| 745 |
+
TXN000744,2024-07-02,120000,Inventory,26476.05,0.0,26476.05,DOC8901,2024-07
|
| 746 |
+
TXN000745,2024-06-11,420000,Interest Income,0.0,49891.26,-49891.26,DOC3841,2024-06
|
| 747 |
+
TXN000746,2024-11-22,500000,Cost of Goods Sold,215.65,0.0,215.65,DOC2088,2024-11
|
| 748 |
+
TXN000747,2024-01-25,130000,Prepaid Expenses,31682.03,0.0,31682.03,DOC6668,2024-01
|
| 749 |
+
TXN000748,2024-08-19,400000,Sales Revenue,0.0,46860.84,-46860.84,DOC3235,2024-08
|
| 750 |
+
TXN000749,2024-05-06,230000,Long-term Debt,0.0,44232.77,-44232.77,DOC4175,2024-05
|
| 751 |
+
TXN000750,2024-10-16,230000,Long-term Debt,0.0,3974.7,-3974.7,DOC8427,2024-10
|
| 752 |
+
TXN000751,2024-03-15,200000,Accounts Payable,0.0,17506.14,-17506.14,DOC8938,2024-03
|
| 753 |
+
TXN000752,2024-07-06,410000,Service Revenue,0.0,28894.33,-28894.33,DOC6409,2024-07
|
| 754 |
+
TXN000753,2024-03-01,400000,Sales Revenue,0.0,5136.97,-5136.97,DOC9549,2024-03
|
| 755 |
+
TXN000754,2024-03-06,430000,Other Income,0.0,3935.42,-3935.42,DOC8913,2024-03
|
| 756 |
+
TXN000755,2024-12-23,430000,Other Income,0.0,2606.28,-2606.28,DOC2497,2024-12
|
| 757 |
+
TXN000756,2024-07-02,400000,Sales Revenue,0.0,14835.0,-14835.0,DOC3555,2024-07
|
| 758 |
+
TXN000757,2024-10-21,110000,Accounts Receivable,20125.17,0.0,20125.17,DOC2238,2024-10
|
| 759 |
+
TXN000758,2024-04-29,410000,Service Revenue,0.0,20314.62,-20314.62,DOC4701,2024-04
|
| 760 |
+
TXN000759,2024-02-22,210000,Accrued Liabilities,0.0,42127.31,-42127.31,DOC6789,2024-02
|
| 761 |
+
TXN000760,2024-09-25,540000,Marketing Expense,30214.31,0.0,30214.31,DOC8480,2024-09
|
| 762 |
+
TXN000761,2024-07-01,500000,Cost of Goods Sold,25203.89,0.0,25203.89,DOC6565,2024-07
|
| 763 |
+
TXN000762,2024-01-10,300000,Common Stock,0.0,41089.46,-41089.46,DOC2589,2024-01
|
| 764 |
+
TXN000763,2024-05-27,530000,Utilities Expense,34162.6,0.0,34162.6,DOC7555,2024-05
|
| 765 |
+
TXN000764,2024-02-22,410000,Service Revenue,0.0,40217.53,-40217.53,DOC7846,2024-02
|
| 766 |
+
TXN000765,2024-07-23,130000,Prepaid Expenses,45847.91,0.0,45847.91,DOC7919,2024-07
|
| 767 |
+
TXN000766,2024-01-12,510000,Salaries and Wages,24885.1,0.0,24885.1,DOC5945,2024-01
|
| 768 |
+
TXN000767,2024-05-06,110000,Accounts Receivable,2811.17,0.0,2811.17,DOC8758,2024-05
|
| 769 |
+
TXN000768,2024-12-14,500000,Cost of Goods Sold,2437.91,0.0,2437.91,DOC4167,2024-12
|
| 770 |
+
TXN000769,2024-07-27,200000,Accounts Payable,0.0,3228.21,-3228.21,DOC7056,2024-07
|
| 771 |
+
TXN000770,2024-11-20,200000,Accounts Payable,0.0,47028.38,-47028.38,DOC6951,2024-11
|
| 772 |
+
TXN000771,2024-04-30,310000,Retained Earnings,0.0,18075.67,-18075.67,DOC5232,2024-04
|
| 773 |
+
TXN000772,2024-04-09,110000,Accounts Receivable,45369.27,0.0,45369.27,DOC3224,2024-04
|
| 774 |
+
TXN000773,2024-04-21,200000,Accounts Payable,0.0,46822.43,-46822.43,DOC9662,2024-04
|
| 775 |
+
TXN000774,2024-11-11,100000,Cash and Cash Equivalents,31672.32,0.0,31672.32,DOC8094,2024-11
|
| 776 |
+
TXN000775,2024-06-23,300000,Common Stock,0.0,8430.96,-8430.96,DOC1234,2024-06
|
| 777 |
+
TXN000776,2024-04-10,400000,Sales Revenue,0.0,48305.77,-48305.77,DOC9043,2024-04
|
| 778 |
+
TXN000777,2024-09-29,310000,Retained Earnings,0.0,33837.8,-33837.8,DOC5888,2024-09
|
| 779 |
+
TXN000778,2024-01-21,230000,Long-term Debt,0.0,23822.79,-23822.79,DOC6842,2024-01
|
| 780 |
+
TXN000779,2024-10-19,320000,Other Equity,0.0,2504.48,-2504.48,DOC2124,2024-10
|
| 781 |
+
TXN000780,2024-12-24,430000,Other Income,0.0,25070.02,-25070.02,DOC6672,2024-12
|
| 782 |
+
TXN000781,2024-10-29,120000,Inventory,5637.78,0.0,5637.78,DOC8935,2024-10
|
| 783 |
+
TXN000782,2024-08-14,410000,Service Revenue,0.0,18553.68,-18553.68,DOC6574,2024-08
|
| 784 |
+
TXN000783,2024-01-13,230000,Long-term Debt,0.0,20883.57,-20883.57,DOC9588,2024-01
|
| 785 |
+
TXN000784,2024-01-31,130000,Prepaid Expenses,36010.73,0.0,36010.73,DOC5424,2024-01
|
| 786 |
+
TXN000785,2024-11-05,200000,Accounts Payable,0.0,44019.82,-44019.82,DOC3016,2024-11
|
| 787 |
+
TXN000786,2024-04-18,130000,Prepaid Expenses,37725.75,0.0,37725.75,DOC2772,2024-04
|
| 788 |
+
TXN000787,2024-08-03,110000,Accounts Receivable,46547.28,0.0,46547.28,DOC8170,2024-08
|
| 789 |
+
TXN000788,2024-05-28,200000,Accounts Payable,0.0,34141.47,-34141.47,DOC2461,2024-05
|
| 790 |
+
TXN000789,2024-12-21,100000,Cash and Cash Equivalents,4358.53,0.0,4358.53,DOC1234,2024-12
|
| 791 |
+
TXN000790,2024-01-13,120000,Inventory,2998.79,0.0,2998.79,DOC5213,2024-01
|
| 792 |
+
TXN000791,2024-02-22,300000,Common Stock,0.0,13452.87,-13452.87,DOC3100,2024-02
|
| 793 |
+
TXN000792,2024-02-15,300000,Common Stock,0.0,12170.26,-12170.26,DOC4173,2024-02
|
| 794 |
+
TXN000793,2024-12-02,110000,Accounts Receivable,6305.98,0.0,6305.98,DOC1674,2024-12
|
| 795 |
+
TXN000794,2024-04-20,120000,Inventory,16579.11,0.0,16579.11,DOC4253,2024-04
|
| 796 |
+
TXN000795,2024-01-24,530000,Utilities Expense,36270.34,0.0,36270.34,DOC9931,2024-01
|
| 797 |
+
TXN000796,2024-11-16,200000,Accounts Payable,0.0,15662.01,-15662.01,DOC4227,2024-11
|
| 798 |
+
TXN000797,2024-06-23,430000,Other Income,0.0,11068.29,-11068.29,DOC3745,2024-06
|
| 799 |
+
TXN000798,2024-10-09,320000,Other Equity,0.0,28810.23,-28810.23,DOC6818,2024-10
|
| 800 |
+
TXN000799,2024-08-09,420000,Interest Income,0.0,18449.91,-18449.91,DOC5063,2024-08
|
| 801 |
+
TXN000800,2024-06-01,540000,Marketing Expense,38679.78,0.0,38679.78,DOC5025,2024-06
|
| 802 |
+
TXN000801,2024-08-31,210000,Accrued Liabilities,0.0,32128.81,-32128.81,DOC7155,2024-08
|
| 803 |
+
TXN000802,2024-07-26,430000,Other Income,0.0,15060.05,-15060.05,DOC5579,2024-07
|
| 804 |
+
TXN000803,2024-05-14,400000,Sales Revenue,0.0,43974.83,-43974.83,DOC5402,2024-05
|
| 805 |
+
TXN000804,2024-06-08,230000,Long-term Debt,0.0,44938.17,-44938.17,DOC9835,2024-06
|
| 806 |
+
TXN000805,2024-07-13,220000,Short-term Debt,0.0,35535.76,-35535.76,DOC3204,2024-07
|
| 807 |
+
TXN000806,2024-08-13,110000,Accounts Receivable,24255.45,0.0,24255.45,DOC2102,2024-08
|
| 808 |
+
TXN000807,2024-08-05,320000,Other Equity,0.0,29152.22,-29152.22,DOC6223,2024-08
|
| 809 |
+
TXN000808,2024-04-28,230000,Long-term Debt,0.0,39280.96,-39280.96,DOC7683,2024-04
|
| 810 |
+
TXN000809,2024-01-17,230000,Long-term Debt,0.0,11346.53,-11346.53,DOC8659,2024-01
|
| 811 |
+
TXN000810,2024-12-27,210000,Accrued Liabilities,0.0,44814.15,-44814.15,DOC8468,2024-12
|
| 812 |
+
TXN000811,2024-09-23,520000,Rent Expense,49084.5,0.0,49084.5,DOC7599,2024-09
|
| 813 |
+
TXN000812,2024-03-08,220000,Short-term Debt,0.0,19469.47,-19469.47,DOC4483,2024-03
|
| 814 |
+
TXN000813,2024-11-16,310000,Retained Earnings,0.0,17325.09,-17325.09,DOC7707,2024-11
|
| 815 |
+
TXN000814,2024-08-03,200000,Accounts Payable,0.0,36276.56,-36276.56,DOC3606,2024-08
|
| 816 |
+
TXN000815,2024-06-22,230000,Long-term Debt,0.0,3203.94,-3203.94,DOC8763,2024-06
|
| 817 |
+
TXN000816,2024-12-26,530000,Utilities Expense,22438.9,0.0,22438.9,DOC6685,2024-12
|
| 818 |
+
TXN000817,2024-08-13,100000,Cash and Cash Equivalents,12170.48,0.0,12170.48,DOC4644,2024-08
|
| 819 |
+
TXN000818,2024-02-15,540000,Marketing Expense,3904.34,0.0,3904.34,DOC3645,2024-02
|
| 820 |
+
TXN000819,2024-03-18,510000,Salaries and Wages,27374.2,0.0,27374.2,DOC2932,2024-03
|
| 821 |
+
TXN000820,2024-01-06,120000,Inventory,22332.53,0.0,22332.53,DOC1492,2024-01
|
| 822 |
+
TXN000821,2024-04-17,310000,Retained Earnings,0.0,42198.12,-42198.12,DOC7474,2024-04
|
| 823 |
+
TXN000822,2024-02-19,400000,Sales Revenue,0.0,42703.87,-42703.87,DOC3743,2024-02
|
| 824 |
+
TXN000823,2024-05-18,320000,Other Equity,0.0,23002.28,-23002.28,DOC8186,2024-05
|
| 825 |
+
TXN000824,2024-06-02,200000,Accounts Payable,0.0,808.08,-808.08,DOC1619,2024-06
|
| 826 |
+
TXN000825,2024-10-11,520000,Rent Expense,45404.15,0.0,45404.15,DOC2296,2024-10
|
| 827 |
+
TXN000826,2024-10-25,310000,Retained Earnings,0.0,26120.84,-26120.84,DOC7593,2024-10
|
| 828 |
+
TXN000827,2024-09-03,110000,Accounts Receivable,19700.41,0.0,19700.41,DOC3409,2024-09
|
| 829 |
+
TXN000828,2024-12-17,220000,Short-term Debt,0.0,15569.0,-15569.0,DOC7976,2024-12
|
| 830 |
+
TXN000829,2024-02-08,310000,Retained Earnings,0.0,39089.31,-39089.31,DOC4667,2024-02
|
| 831 |
+
TXN000830,2024-12-07,510000,Salaries and Wages,42774.83,0.0,42774.83,DOC3468,2024-12
|
| 832 |
+
TXN000831,2024-02-05,300000,Common Stock,0.0,17915.76,-17915.76,DOC4583,2024-02
|
| 833 |
+
TXN000832,2024-09-11,300000,Common Stock,0.0,31754.75,-31754.75,DOC3217,2024-09
|
| 834 |
+
TXN000833,2024-11-17,220000,Short-term Debt,0.0,25782.71,-25782.71,DOC6722,2024-11
|
| 835 |
+
TXN000834,2024-06-03,140000,"Property, Plant & Equipment",1555.57,0.0,1555.57,DOC8618,2024-06
|
| 836 |
+
TXN000835,2024-05-20,320000,Other Equity,0.0,122.09,-122.09,DOC3787,2024-05
|
| 837 |
+
TXN000836,2024-09-04,230000,Long-term Debt,0.0,49505.31,-49505.31,DOC7689,2024-09
|
| 838 |
+
TXN000837,2024-05-08,520000,Rent Expense,2341.07,0.0,2341.07,DOC5422,2024-05
|
| 839 |
+
TXN000838,2024-11-18,500000,Cost of Goods Sold,19683.66,0.0,19683.66,DOC1628,2024-11
|
| 840 |
+
TXN000839,2024-04-08,120000,Inventory,47551.34,0.0,47551.34,DOC4674,2024-04
|
| 841 |
+
TXN000840,2024-01-17,410000,Service Revenue,0.0,39398.7,-39398.7,DOC9307,2024-01
|
| 842 |
+
TXN000841,2024-06-29,530000,Utilities Expense,17993.07,0.0,17993.07,DOC4008,2024-06
|
| 843 |
+
TXN000842,2024-09-13,510000,Salaries and Wages,9660.49,0.0,9660.49,DOC4699,2024-09
|
| 844 |
+
TXN000843,2024-11-10,300000,Common Stock,0.0,11120.55,-11120.55,DOC5200,2024-11
|
| 845 |
+
TXN000844,2024-07-11,140000,"Property, Plant & Equipment",8843.57,0.0,8843.57,DOC2772,2024-07
|
| 846 |
+
TXN000845,2024-08-08,230000,Long-term Debt,0.0,21625.89,-21625.89,DOC8423,2024-08
|
| 847 |
+
TXN000846,2024-11-07,310000,Retained Earnings,0.0,29046.43,-29046.43,DOC7242,2024-11
|
| 848 |
+
TXN000847,2024-10-08,320000,Other Equity,0.0,41999.02,-41999.02,DOC2132,2024-10
|
| 849 |
+
TXN000848,2024-10-29,210000,Accrued Liabilities,0.0,45197.5,-45197.5,DOC7297,2024-10
|
| 850 |
+
TXN000849,2024-05-12,220000,Short-term Debt,0.0,21030.45,-21030.45,DOC3179,2024-05
|
| 851 |
+
TXN000850,2024-03-24,300000,Common Stock,0.0,24927.24,-24927.24,DOC4180,2024-03
|
| 852 |
+
TXN000851,2024-02-10,220000,Short-term Debt,0.0,14855.16,-14855.16,DOC1614,2024-02
|
| 853 |
+
TXN000852,2024-11-19,410000,Service Revenue,0.0,14832.57,-14832.57,DOC3468,2024-11
|
| 854 |
+
TXN000853,2024-07-13,100000,Cash and Cash Equivalents,4843.15,0.0,4843.15,DOC4607,2024-07
|
| 855 |
+
TXN000854,2024-01-04,300000,Common Stock,0.0,7664.59,-7664.59,DOC9120,2024-01
|
| 856 |
+
TXN000855,2024-06-29,500000,Cost of Goods Sold,14195.37,0.0,14195.37,DOC1278,2024-06
|
| 857 |
+
TXN000856,2024-03-09,400000,Sales Revenue,0.0,19652.02,-19652.02,DOC5276,2024-03
|
| 858 |
+
TXN000857,2024-11-08,230000,Long-term Debt,0.0,29562.51,-29562.51,DOC9891,2024-11
|
| 859 |
+
TXN000858,2024-12-22,200000,Accounts Payable,0.0,36184.1,-36184.1,DOC7534,2024-12
|
| 860 |
+
TXN000859,2024-03-25,210000,Accrued Liabilities,0.0,15266.73,-15266.73,DOC6634,2024-03
|
| 861 |
+
TXN000860,2024-12-07,520000,Rent Expense,36494.31,0.0,36494.31,DOC4109,2024-12
|
| 862 |
+
TXN000861,2024-08-26,520000,Rent Expense,20855.6,0.0,20855.6,DOC7028,2024-08
|
| 863 |
+
TXN000862,2024-01-30,510000,Salaries and Wages,16332.23,0.0,16332.23,DOC7680,2024-01
|
| 864 |
+
TXN000863,2024-07-24,430000,Other Income,0.0,6355.29,-6355.29,DOC5591,2024-07
|
| 865 |
+
TXN000864,2024-08-15,420000,Interest Income,0.0,49244.43,-49244.43,DOC6141,2024-08
|
| 866 |
+
TXN000865,2024-11-05,540000,Marketing Expense,29572.83,0.0,29572.83,DOC9463,2024-11
|
| 867 |
+
TXN000866,2024-07-20,300000,Common Stock,0.0,1131.5,-1131.5,DOC9712,2024-07
|
| 868 |
+
TXN000867,2024-05-18,500000,Cost of Goods Sold,31458.86,0.0,31458.86,DOC3832,2024-05
|
| 869 |
+
TXN000868,2024-02-17,130000,Prepaid Expenses,14898.34,0.0,14898.34,DOC1152,2024-02
|
| 870 |
+
TXN000869,2024-12-22,540000,Marketing Expense,5215.55,0.0,5215.55,DOC6310,2024-12
|
| 871 |
+
TXN000870,2024-10-18,520000,Rent Expense,48623.76,0.0,48623.76,DOC8361,2024-10
|
| 872 |
+
TXN000871,2024-09-27,220000,Short-term Debt,0.0,35744.9,-35744.9,DOC2914,2024-09
|
| 873 |
+
TXN000872,2024-01-01,200000,Accounts Payable,0.0,6189.32,-6189.32,DOC1166,2024-01
|
| 874 |
+
TXN000873,2024-09-07,500000,Cost of Goods Sold,2689.58,0.0,2689.58,DOC3120,2024-09
|
| 875 |
+
TXN000874,2024-03-10,400000,Sales Revenue,0.0,16846.96,-16846.96,DOC3292,2024-03
|
| 876 |
+
TXN000875,2024-12-02,120000,Inventory,35088.38,0.0,35088.38,DOC2903,2024-12
|
| 877 |
+
TXN000876,2024-04-18,420000,Interest Income,0.0,47359.82,-47359.82,DOC5160,2024-04
|
| 878 |
+
TXN000877,2024-09-27,500000,Cost of Goods Sold,25382.97,0.0,25382.97,DOC2151,2024-09
|
| 879 |
+
TXN000878,2024-12-04,130000,Prepaid Expenses,39130.35,0.0,39130.35,DOC4490,2024-12
|
| 880 |
+
TXN000879,2024-03-18,220000,Short-term Debt,0.0,35214.62,-35214.62,DOC2293,2024-03
|
| 881 |
+
TXN000880,2024-07-07,110000,Accounts Receivable,4965.96,0.0,4965.96,DOC7871,2024-07
|
| 882 |
+
TXN000881,2024-06-16,520000,Rent Expense,2678.27,0.0,2678.27,DOC3240,2024-06
|
| 883 |
+
TXN000882,2024-10-09,140000,"Property, Plant & Equipment",24164.99,0.0,24164.99,DOC1999,2024-10
|
| 884 |
+
TXN000883,2024-08-27,400000,Sales Revenue,0.0,40020.17,-40020.17,DOC9850,2024-08
|
| 885 |
+
TXN000884,2024-03-20,320000,Other Equity,0.0,6672.58,-6672.58,DOC2481,2024-03
|
| 886 |
+
TXN000885,2024-04-04,530000,Utilities Expense,15558.41,0.0,15558.41,DOC4093,2024-04
|
| 887 |
+
TXN000886,2024-11-08,520000,Rent Expense,39854.4,0.0,39854.4,DOC4277,2024-11
|
| 888 |
+
TXN000887,2024-04-23,120000,Inventory,41658.24,0.0,41658.24,DOC5690,2024-04
|
| 889 |
+
TXN000888,2024-07-28,520000,Rent Expense,12450.75,0.0,12450.75,DOC8291,2024-07
|
| 890 |
+
TXN000889,2024-04-22,100000,Cash and Cash Equivalents,1087.8,0.0,1087.8,DOC1139,2024-04
|
| 891 |
+
TXN000890,2024-04-06,500000,Cost of Goods Sold,21583.96,0.0,21583.96,DOC7043,2024-04
|
| 892 |
+
TXN000891,2024-03-09,410000,Service Revenue,0.0,3510.82,-3510.82,DOC4104,2024-03
|
| 893 |
+
TXN000892,2024-01-19,510000,Salaries and Wages,33909.29,0.0,33909.29,DOC9058,2024-01
|
| 894 |
+
TXN000893,2024-02-16,110000,Accounts Receivable,19133.91,0.0,19133.91,DOC7432,2024-02
|
| 895 |
+
TXN000894,2024-03-24,400000,Sales Revenue,0.0,33606.81,-33606.81,DOC7358,2024-03
|
| 896 |
+
TXN000895,2024-05-07,520000,Rent Expense,37571.9,0.0,37571.9,DOC5855,2024-05
|
| 897 |
+
TXN000896,2024-01-29,530000,Utilities Expense,16330.17,0.0,16330.17,DOC3761,2024-01
|
| 898 |
+
TXN000897,2024-02-26,230000,Long-term Debt,0.0,672.88,-672.88,DOC6693,2024-02
|
| 899 |
+
TXN000898,2024-01-17,300000,Common Stock,0.0,5245.76,-5245.76,DOC8737,2024-01
|
| 900 |
+
TXN000899,2024-11-13,140000,"Property, Plant & Equipment",27819.22,0.0,27819.22,DOC4802,2024-11
|
| 901 |
+
TXN000900,2024-07-22,500000,Cost of Goods Sold,3794.71,0.0,3794.71,DOC7241,2024-07
|
| 902 |
+
TXN000901,2024-07-26,120000,Inventory,31571.95,0.0,31571.95,DOC7309,2024-07
|
| 903 |
+
TXN000902,2024-10-21,310000,Retained Earnings,0.0,8688.32,-8688.32,DOC2518,2024-10
|
| 904 |
+
TXN000903,2024-01-20,200000,Accounts Payable,0.0,14934.81,-14934.81,DOC3195,2024-01
|
| 905 |
+
TXN000904,2024-03-24,320000,Other Equity,0.0,4695.55,-4695.55,DOC3849,2024-03
|
| 906 |
+
TXN000905,2024-05-13,120000,Inventory,12619.56,0.0,12619.56,DOC4849,2024-05
|
| 907 |
+
TXN000906,2024-12-17,230000,Long-term Debt,0.0,30539.37,-30539.37,DOC5195,2024-12
|
| 908 |
+
TXN000907,2024-03-05,110000,Accounts Receivable,5941.6,0.0,5941.6,DOC7409,2024-03
|
| 909 |
+
TXN000908,2024-03-19,540000,Marketing Expense,10732.94,0.0,10732.94,DOC3994,2024-03
|
| 910 |
+
TXN000909,2024-09-04,430000,Other Income,0.0,29420.53,-29420.53,DOC9801,2024-09
|
| 911 |
+
TXN000910,2024-10-10,400000,Sales Revenue,0.0,31411.58,-31411.58,DOC5396,2024-10
|
| 912 |
+
TXN000911,2024-01-07,130000,Prepaid Expenses,12729.77,0.0,12729.77,DOC8331,2024-01
|
| 913 |
+
TXN000912,2024-05-17,520000,Rent Expense,20011.86,0.0,20011.86,DOC3093,2024-05
|
| 914 |
+
TXN000913,2024-10-14,300000,Common Stock,0.0,10811.93,-10811.93,DOC6285,2024-10
|
| 915 |
+
TXN000914,2024-11-25,500000,Cost of Goods Sold,515.17,0.0,515.17,DOC3101,2024-11
|
| 916 |
+
TXN000915,2024-08-31,510000,Salaries and Wages,37444.38,0.0,37444.38,DOC8294,2024-08
|
| 917 |
+
TXN000916,2024-09-27,420000,Interest Income,0.0,40880.89,-40880.89,DOC3426,2024-09
|
| 918 |
+
TXN000917,2024-09-04,230000,Long-term Debt,0.0,11535.68,-11535.68,DOC5138,2024-09
|
| 919 |
+
TXN000918,2024-06-18,230000,Long-term Debt,0.0,35073.3,-35073.3,DOC9560,2024-06
|
| 920 |
+
TXN000919,2024-05-30,540000,Marketing Expense,2595.93,0.0,2595.93,DOC6166,2024-05
|
| 921 |
+
TXN000920,2024-03-09,100000,Cash and Cash Equivalents,3949.54,0.0,3949.54,DOC5897,2024-03
|
| 922 |
+
TXN000921,2024-07-21,220000,Short-term Debt,0.0,23001.13,-23001.13,DOC4901,2024-07
|
| 923 |
+
TXN000922,2024-11-26,100000,Cash and Cash Equivalents,29780.68,0.0,29780.68,DOC2629,2024-11
|
| 924 |
+
TXN000923,2024-05-17,430000,Other Income,0.0,44259.72,-44259.72,DOC5370,2024-05
|
| 925 |
+
TXN000924,2024-11-14,130000,Prepaid Expenses,27258.27,0.0,27258.27,DOC2993,2024-11
|
| 926 |
+
TXN000925,2024-11-16,200000,Accounts Payable,0.0,12742.52,-12742.52,DOC1602,2024-11
|
| 927 |
+
TXN000926,2024-09-20,410000,Service Revenue,0.0,3516.09,-3516.09,DOC1489,2024-09
|
| 928 |
+
TXN000927,2024-03-13,500000,Cost of Goods Sold,10390.25,0.0,10390.25,DOC8786,2024-03
|
| 929 |
+
TXN000928,2024-10-10,210000,Accrued Liabilities,0.0,45771.33,-45771.33,DOC5744,2024-10
|
| 930 |
+
TXN000929,2024-02-25,510000,Salaries and Wages,39389.93,0.0,39389.93,DOC3817,2024-02
|
| 931 |
+
TXN000930,2024-05-02,310000,Retained Earnings,0.0,35302.5,-35302.5,DOC3041,2024-05
|
| 932 |
+
TXN000931,2024-04-23,220000,Short-term Debt,0.0,32501.18,-32501.18,DOC6668,2024-04
|
| 933 |
+
TXN000932,2024-04-01,420000,Interest Income,0.0,21027.54,-21027.54,DOC1062,2024-04
|
| 934 |
+
TXN000933,2024-07-04,310000,Retained Earnings,0.0,1193.48,-1193.48,DOC7915,2024-07
|
| 935 |
+
TXN000934,2024-03-01,210000,Accrued Liabilities,0.0,23529.32,-23529.32,DOC9003,2024-03
|
| 936 |
+
TXN000935,2024-05-08,420000,Interest Income,0.0,38245.59,-38245.59,DOC9312,2024-05
|
| 937 |
+
TXN000936,2024-04-11,100000,Cash and Cash Equivalents,8058.66,0.0,8058.66,DOC6103,2024-04
|
| 938 |
+
TXN000937,2024-07-20,140000,"Property, Plant & Equipment",47132.31,0.0,47132.31,DOC1241,2024-07
|
| 939 |
+
TXN000938,2024-04-18,210000,Accrued Liabilities,0.0,41341.76,-41341.76,DOC1802,2024-04
|
| 940 |
+
TXN000939,2024-03-09,130000,Prepaid Expenses,497.42,0.0,497.42,DOC3187,2024-03
|
| 941 |
+
TXN000940,2024-01-23,300000,Common Stock,0.0,12818.62,-12818.62,DOC1060,2024-01
|
| 942 |
+
TXN000941,2024-12-09,530000,Utilities Expense,39485.71,0.0,39485.71,DOC3591,2024-12
|
| 943 |
+
TXN000942,2024-02-05,140000,"Property, Plant & Equipment",31647.61,0.0,31647.61,DOC2200,2024-02
|
| 944 |
+
TXN000943,2024-11-09,300000,Common Stock,0.0,47061.93,-47061.93,DOC8024,2024-11
|
| 945 |
+
TXN000944,2024-11-12,540000,Marketing Expense,19697.26,0.0,19697.26,DOC3594,2024-11
|
| 946 |
+
TXN000945,2024-05-29,210000,Accrued Liabilities,0.0,26127.81,-26127.81,DOC1086,2024-05
|
| 947 |
+
TXN000946,2024-03-16,500000,Cost of Goods Sold,42952.34,0.0,42952.34,DOC7968,2024-03
|
| 948 |
+
TXN000947,2024-10-11,230000,Long-term Debt,0.0,23013.54,-23013.54,DOC3700,2024-10
|
| 949 |
+
TXN000948,2024-04-21,410000,Service Revenue,0.0,5965.81,-5965.81,DOC6520,2024-04
|
| 950 |
+
TXN000949,2024-03-25,220000,Short-term Debt,0.0,35965.11,-35965.11,DOC9837,2024-03
|
| 951 |
+
TXN000950,2024-01-18,320000,Other Equity,0.0,14909.66,-14909.66,DOC5384,2024-01
|
| 952 |
+
TXN000951,2024-05-05,500000,Cost of Goods Sold,8370.83,0.0,8370.83,DOC8081,2024-05
|
| 953 |
+
TXN000952,2024-05-01,520000,Rent Expense,17778.14,0.0,17778.14,DOC9306,2024-05
|
| 954 |
+
TXN000953,2024-06-10,130000,Prepaid Expenses,26009.31,0.0,26009.31,DOC8178,2024-06
|
| 955 |
+
TXN000954,2024-06-15,410000,Service Revenue,0.0,2980.83,-2980.83,DOC1146,2024-06
|
| 956 |
+
TXN000955,2024-05-31,420000,Interest Income,0.0,30853.39,-30853.39,DOC6628,2024-05
|
| 957 |
+
TXN000956,2024-06-23,230000,Long-term Debt,0.0,37717.87,-37717.87,DOC4552,2024-06
|
| 958 |
+
TXN000957,2024-07-13,520000,Rent Expense,34851.85,0.0,34851.85,DOC7318,2024-07
|
| 959 |
+
TXN000958,2024-12-19,300000,Common Stock,0.0,20656.71,-20656.71,DOC7901,2024-12
|
| 960 |
+
TXN000959,2024-04-02,100000,Cash and Cash Equivalents,26671.95,0.0,26671.95,DOC1204,2024-04
|
| 961 |
+
TXN000960,2024-09-01,430000,Other Income,0.0,5948.47,-5948.47,DOC5390,2024-09
|
| 962 |
+
TXN000961,2024-03-11,500000,Cost of Goods Sold,5802.86,0.0,5802.86,DOC6126,2024-03
|
| 963 |
+
TXN000962,2024-04-12,500000,Cost of Goods Sold,21021.66,0.0,21021.66,DOC2776,2024-04
|
| 964 |
+
TXN000963,2024-06-19,500000,Cost of Goods Sold,3545.39,0.0,3545.39,DOC2788,2024-06
|
| 965 |
+
TXN000964,2024-07-25,120000,Inventory,44292.43,0.0,44292.43,DOC4893,2024-07
|
| 966 |
+
TXN000965,2024-04-29,230000,Long-term Debt,0.0,37656.65,-37656.65,DOC8260,2024-04
|
| 967 |
+
TXN000966,2024-12-29,430000,Other Income,0.0,16748.06,-16748.06,DOC4816,2024-12
|
| 968 |
+
TXN000967,2024-07-24,210000,Accrued Liabilities,0.0,25577.03,-25577.03,DOC1658,2024-07
|
| 969 |
+
TXN000968,2024-09-27,110000,Accounts Receivable,23368.86,0.0,23368.86,DOC4764,2024-09
|
| 970 |
+
TXN000969,2024-01-30,410000,Service Revenue,0.0,32423.93,-32423.93,DOC7801,2024-01
|
| 971 |
+
TXN000970,2024-02-17,520000,Rent Expense,10477.02,0.0,10477.02,DOC4719,2024-02
|
| 972 |
+
TXN000971,2024-07-22,200000,Accounts Payable,0.0,9167.99,-9167.99,DOC6991,2024-07
|
| 973 |
+
TXN000972,2024-11-30,130000,Prepaid Expenses,3421.58,0.0,3421.58,DOC5780,2024-11
|
| 974 |
+
TXN000973,2024-11-17,510000,Salaries and Wages,25717.07,0.0,25717.07,DOC9181,2024-11
|
| 975 |
+
TXN000974,2024-01-20,420000,Interest Income,0.0,49859.4,-49859.4,DOC1634,2024-01
|
| 976 |
+
TXN000975,2024-08-08,300000,Common Stock,0.0,22374.71,-22374.71,DOC1002,2024-08
|
| 977 |
+
TXN000976,2024-11-15,410000,Service Revenue,0.0,30459.61,-30459.61,DOC6626,2024-11
|
| 978 |
+
TXN000977,2024-11-26,530000,Utilities Expense,32870.8,0.0,32870.8,DOC7239,2024-11
|
| 979 |
+
TXN000978,2024-03-02,310000,Retained Earnings,0.0,42132.04,-42132.04,DOC1670,2024-03
|
| 980 |
+
TXN000979,2024-11-12,110000,Accounts Receivable,5273.56,0.0,5273.56,DOC6167,2024-11
|
| 981 |
+
TXN000980,2024-05-15,130000,Prepaid Expenses,21360.94,0.0,21360.94,DOC7457,2024-05
|
| 982 |
+
TXN000981,2024-11-13,140000,"Property, Plant & Equipment",40169.8,0.0,40169.8,DOC4792,2024-11
|
| 983 |
+
TXN000982,2024-07-29,120000,Inventory,31061.64,0.0,31061.64,DOC4612,2024-07
|
| 984 |
+
TXN000983,2024-04-01,210000,Accrued Liabilities,0.0,9829.26,-9829.26,DOC9411,2024-04
|
| 985 |
+
TXN000984,2024-08-02,200000,Accounts Payable,0.0,30310.05,-30310.05,DOC2812,2024-08
|
| 986 |
+
TXN000985,2024-09-01,130000,Prepaid Expenses,31656.33,0.0,31656.33,DOC8081,2024-09
|
| 987 |
+
TXN000986,2024-06-18,320000,Other Equity,0.0,20807.06,-20807.06,DOC7410,2024-06
|
| 988 |
+
TXN000987,2024-01-08,430000,Other Income,0.0,29466.4,-29466.4,DOC6944,2024-01
|
| 989 |
+
TXN000988,2024-08-24,220000,Short-term Debt,0.0,10824.14,-10824.14,DOC2629,2024-08
|
| 990 |
+
TXN000989,2024-05-17,320000,Other Equity,0.0,25402.28,-25402.28,DOC4278,2024-05
|
| 991 |
+
TXN000990,2024-03-21,430000,Other Income,0.0,29274.94,-29274.94,DOC7539,2024-03
|
| 992 |
+
TXN000991,2024-12-11,520000,Rent Expense,22593.74,0.0,22593.74,DOC8485,2024-12
|
| 993 |
+
TXN000992,2024-03-02,500000,Cost of Goods Sold,34648.71,0.0,34648.71,DOC5334,2024-03
|
| 994 |
+
TXN000993,2024-06-14,120000,Inventory,37436.82,0.0,37436.82,DOC7204,2024-06
|
| 995 |
+
TXN000994,2024-06-21,100000,Cash and Cash Equivalents,41313.29,0.0,41313.29,DOC1922,2024-06
|
| 996 |
+
TXN000995,2024-10-04,130000,Prepaid Expenses,3250.7,0.0,3250.7,DOC2230,2024-10
|
| 997 |
+
TXN000996,2024-10-05,130000,Prepaid Expenses,49166.95,0.0,49166.95,DOC4940,2024-10
|
| 998 |
+
TXN000997,2024-07-22,530000,Utilities Expense,7615.34,0.0,7615.34,DOC9960,2024-07
|
| 999 |
+
TXN000998,2024-03-03,140000,"Property, Plant & Equipment",13273.82,0.0,13273.82,DOC5500,2024-03
|
| 1000 |
+
TXN000999,2024-03-19,120000,Inventory,27911.12,0.0,27911.12,DOC4191,2024-03
|
| 1001 |
+
TXN001000,2024-06-26,410000,Service Revenue,0.0,39210.24,-39210.24,DOC3103,2024-06
|
data/synthetic_sales_orders.csv
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Order_Number,Order_Date,Delivery_Date,Customer_ID,Customer_Name,Product_Code,Product_Name,Quantity,Unit_Price,Total_Amount,Currency,Region,Status,Sales_Rep
|
| 2 |
+
SO000001,2024-04-12,2024-05-08,CUST00093,Customer CUST00093,PRD075,Product H,61,302.46,18449.85,USD,South,Open,REP11
|
| 3 |
+
SO000002,2024-03-28,2024-04-24,CUST00100,Customer CUST00100,PRD030,Product H,24,328.94,7894.45,USD,Central,Cancelled,REP06
|
| 4 |
+
SO000003,2024-07-10,2024-08-06,CUST00033,Customer CUST00033,PRD059,Product J,22,13.46,296.17,USD,North,In Process,REP10
|
| 5 |
+
SO000004,2024-07-06,2024-07-28,CUST00015,Customer CUST00015,PRD051,Product C,55,491.78,27048.07,USD,North,Open,REP07
|
| 6 |
+
SO000005,2024-01-21,2024-02-05,CUST00039,Customer CUST00039,PRD090,Product B,4,471.68,1886.72,USD,South,In Process,REP02
|
| 7 |
+
SO000006,2024-12-05,2024-12-26,CUST00060,Customer CUST00060,PRD036,Product G,44,252.64,11116.01,USD,East,Cancelled,REP18
|
| 8 |
+
SO000007,2024-12-25,2025-01-04,CUST00002,Customer CUST00002,PRD090,Product F,54,277.89,15005.95,USD,Central,Cancelled,REP12
|
| 9 |
+
SO000008,2024-06-10,2024-06-26,CUST00062,Customer CUST00062,PRD040,Product D,14,366.36,5129.09,USD,West,Open,REP16
|
| 10 |
+
SO000009,2024-08-24,2024-09-17,CUST00053,Customer CUST00053,PRD041,Product H,26,482.98,12557.35,USD,West,Delivered,REP15
|
| 11 |
+
SO000010,2024-10-27,2024-11-03,CUST00089,Customer CUST00089,PRD063,Product G,9,388.4,3495.6,USD,West,In Process,REP11
|
| 12 |
+
SO000011,2024-03-21,2024-04-04,CUST00035,Customer CUST00035,PRD041,Product C,33,306.92,10128.37,USD,South,In Process,REP07
|
| 13 |
+
SO000012,2024-07-19,2024-08-02,CUST00012,Customer CUST00012,PRD086,Product B,33,41.14,1357.74,USD,Central,Delivered,REP03
|
| 14 |
+
SO000013,2024-08-14,2024-08-25,CUST00047,Customer CUST00047,PRD015,Product C,1,363.65,363.65,USD,East,Delivered,REP10
|
| 15 |
+
SO000014,2024-06-27,2024-07-10,CUST00052,Customer CUST00052,PRD029,Product D,94,78.27,7357.61,USD,Central,Delivered,REP04
|
| 16 |
+
SO000015,2024-01-13,2024-01-26,CUST00059,Customer CUST00059,PRD057,Product C,86,441.43,37962.91,USD,South,Delivered,REP06
|
| 17 |
+
SO000016,2024-10-10,2024-10-28,CUST00044,Customer CUST00044,PRD089,Product D,30,442.81,13284.22,USD,South,Open,REP07
|
| 18 |
+
SO000017,2024-07-08,2024-07-15,CUST00001,Customer CUST00001,PRD003,Product I,27,219.28,5920.64,USD,West,In Process,REP07
|
| 19 |
+
SO000018,2024-07-16,2024-07-30,CUST00027,Customer CUST00027,PRD024,Product I,62,118.83,7367.64,USD,East,In Process,REP15
|
| 20 |
+
SO000019,2024-11-10,2024-12-08,CUST00032,Customer CUST00032,PRD012,Product H,52,188.18,9785.28,USD,North,In Process,REP07
|
| 21 |
+
SO000020,2024-04-22,2024-05-03,CUST00056,Customer CUST00056,PRD087,Product A,59,308.69,18212.5,USD,South,In Process,REP05
|
| 22 |
+
SO000021,2024-08-11,2024-08-18,CUST00001,Customer CUST00001,PRD032,Product C,2,270.16,540.32,USD,South,Cancelled,REP04
|
| 23 |
+
SO000022,2024-07-21,2024-08-13,CUST00038,Customer CUST00038,PRD016,Product H,69,319.83,22068.26,USD,East,Delivered,REP01
|
| 24 |
+
SO000023,2024-07-19,2024-07-31,CUST00080,Customer CUST00080,PRD067,Product C,20,169.72,3394.4,USD,West,Open,REP19
|
| 25 |
+
SO000024,2024-05-27,2024-06-09,CUST00052,Customer CUST00052,PRD011,Product I,33,204.81,6758.74,USD,South,Delivered,REP18
|
| 26 |
+
SO000025,2024-05-30,2024-06-15,CUST00099,Customer CUST00099,PRD002,Product G,16,410.44,6567.02,USD,North,Delivered,REP01
|
| 27 |
+
SO000026,2024-10-30,2024-11-17,CUST00069,Customer CUST00069,PRD019,Product E,32,320.22,10247.03,USD,North,In Process,REP16
|
| 28 |
+
SO000027,2024-07-26,2024-08-04,CUST00020,Customer CUST00020,PRD072,Product H,54,392.14,21175.51,USD,West,Open,REP04
|
| 29 |
+
SO000028,2024-04-13,2024-05-09,CUST00099,Customer CUST00099,PRD082,Product I,99,487.1,48222.43,USD,South,Open,REP02
|
| 30 |
+
SO000029,2024-11-05,2024-11-14,CUST00080,Customer CUST00080,PRD008,Product I,33,18.86,622.28,USD,Central,Open,REP07
|
| 31 |
+
SO000030,2024-07-13,2024-08-05,CUST00033,Customer CUST00033,PRD008,Product C,86,139.95,12035.63,USD,Central,In Process,REP02
|
| 32 |
+
SO000031,2024-10-03,2024-10-10,CUST00028,Customer CUST00028,PRD064,Product A,69,122.79,8472.56,USD,East,Delivered,REP17
|
| 33 |
+
SO000032,2024-01-17,2024-02-04,CUST00092,Customer CUST00092,PRD093,Product E,6,191.38,1148.27,USD,North,Cancelled,REP17
|
| 34 |
+
SO000033,2024-10-28,2024-11-24,CUST00095,Customer CUST00095,PRD087,Product C,60,427.97,25678.48,USD,Central,In Process,REP01
|
| 35 |
+
SO000034,2024-09-12,2024-09-21,CUST00018,Customer CUST00018,PRD024,Product I,95,423.66,40248.12,USD,East,Delivered,REP18
|
| 36 |
+
SO000035,2024-10-14,2024-11-04,CUST00086,Customer CUST00086,PRD017,Product G,66,134.54,8879.65,USD,South,Delivered,REP08
|
| 37 |
+
SO000036,2024-10-25,2024-11-22,CUST00048,Customer CUST00048,PRD025,Product G,93,155.29,14441.97,USD,South,Delivered,REP13
|
| 38 |
+
SO000037,2024-11-11,2024-11-24,CUST00057,Customer CUST00057,PRD015,Product D,45,105.19,4733.74,USD,West,Delivered,REP02
|
| 39 |
+
SO000038,2024-11-17,2024-12-16,CUST00063,Customer CUST00063,PRD058,Product F,51,238.14,12145.29,USD,Central,Delivered,REP17
|
| 40 |
+
SO000039,2024-06-28,2024-07-14,CUST00070,Customer CUST00070,PRD005,Product F,60,170.06,10203.55,USD,Central,In Process,REP07
|
| 41 |
+
SO000040,2024-07-14,2024-07-26,CUST00096,Customer CUST00096,PRD030,Product D,94,274.91,25841.65,USD,West,Open,REP19
|
| 42 |
+
SO000041,2024-05-24,2024-06-18,CUST00092,Customer CUST00092,PRD023,Product J,55,132.92,7310.69,USD,South,Cancelled,REP09
|
| 43 |
+
SO000042,2024-05-08,2024-05-15,CUST00034,Customer CUST00034,PRD016,Product F,48,99.6,4781.01,USD,Central,In Process,REP07
|
| 44 |
+
SO000043,2024-07-10,2024-07-21,CUST00022,Customer CUST00022,PRD057,Product G,67,131.39,8803.01,USD,East,Delivered,REP14
|
| 45 |
+
SO000044,2024-08-07,2024-08-18,CUST00047,Customer CUST00047,PRD016,Product A,94,429.18,40342.51,USD,West,Open,REP16
|
| 46 |
+
SO000045,2024-12-06,2024-12-19,CUST00100,Customer CUST00100,PRD069,Product A,94,328.39,30868.58,USD,South,Delivered,REP04
|
| 47 |
+
SO000046,2024-10-16,2024-11-11,CUST00095,Customer CUST00095,PRD004,Product J,19,256.54,4874.2,USD,North,Delivered,REP16
|
| 48 |
+
SO000047,2024-10-06,2024-10-28,CUST00002,Customer CUST00002,PRD012,Product A,92,297.03,27326.76,USD,East,Delivered,REP18
|
| 49 |
+
SO000048,2024-06-11,2024-06-18,CUST00033,Customer CUST00033,PRD040,Product C,43,471.32,20266.66,USD,East,Delivered,REP10
|
| 50 |
+
SO000049,2024-02-12,2024-03-01,CUST00029,Customer CUST00029,PRD026,Product B,35,174.91,6121.9,USD,South,In Process,REP10
|
| 51 |
+
SO000050,2024-03-30,2024-04-07,CUST00007,Customer CUST00007,PRD036,Product D,58,351.4,20381.27,USD,Central,Cancelled,REP04
|
| 52 |
+
SO000051,2024-12-22,2025-01-06,CUST00024,Customer CUST00024,PRD096,Product C,49,368.51,18056.86,USD,West,In Process,REP05
|
| 53 |
+
SO000052,2024-09-24,2024-10-17,CUST00055,Customer CUST00055,PRD084,Product G,89,126.74,11279.48,USD,North,Delivered,REP16
|
| 54 |
+
SO000053,2024-08-04,2024-09-01,CUST00013,Customer CUST00013,PRD076,Product C,49,36.21,1774.18,USD,Central,Cancelled,REP09
|
| 55 |
+
SO000054,2024-10-10,2024-10-30,CUST00095,Customer CUST00095,PRD012,Product D,83,251.58,20881.35,USD,Central,Open,REP04
|
| 56 |
+
SO000055,2024-02-22,2024-03-22,CUST00016,Customer CUST00016,PRD014,Product I,39,54.69,2132.95,USD,South,Cancelled,REP05
|
| 57 |
+
SO000056,2024-06-11,2024-07-10,CUST00093,Customer CUST00093,PRD007,Product B,76,347.13,26382.24,USD,South,Delivered,REP14
|
| 58 |
+
SO000057,2024-05-20,2024-06-03,CUST00042,Customer CUST00042,PRD037,Product I,50,447.03,22351.47,USD,South,Open,REP06
|
| 59 |
+
SO000058,2024-12-04,2024-12-18,CUST00065,Customer CUST00065,PRD036,Product F,17,474.15,8060.58,USD,North,Delivered,REP06
|
| 60 |
+
SO000059,2024-09-08,2024-10-03,CUST00061,Customer CUST00061,PRD067,Product F,39,217.87,8496.88,USD,South,In Process,REP13
|
| 61 |
+
SO000060,2024-05-20,2024-06-13,CUST00092,Customer CUST00092,PRD039,Product J,20,68.22,1364.42,USD,Central,Delivered,REP01
|
| 62 |
+
SO000061,2024-12-13,2025-01-05,CUST00025,Customer CUST00025,PRD032,Product H,33,119.56,3945.54,USD,South,Open,REP13
|
| 63 |
+
SO000062,2024-11-12,2024-12-03,CUST00021,Customer CUST00021,PRD019,Product F,85,496.55,42206.98,USD,Central,In Process,REP18
|
| 64 |
+
SO000063,2024-02-16,2024-03-02,CUST00049,Customer CUST00049,PRD074,Product A,54,296.31,16000.96,USD,North,Cancelled,REP16
|
| 65 |
+
SO000064,2024-12-23,2025-01-10,CUST00024,Customer CUST00024,PRD058,Product E,8,93.14,745.15,USD,West,In Process,REP18
|
| 66 |
+
SO000065,2024-01-28,2024-02-08,CUST00041,Customer CUST00041,PRD084,Product D,64,232.09,14853.63,USD,North,In Process,REP13
|
| 67 |
+
SO000066,2024-08-07,2024-08-29,CUST00029,Customer CUST00029,PRD066,Product C,6,475.4,2852.41,USD,Central,Delivered,REP10
|
| 68 |
+
SO000067,2024-11-07,2024-12-01,CUST00005,Customer CUST00005,PRD049,Product G,33,391.03,12903.83,USD,South,Cancelled,REP11
|
| 69 |
+
SO000068,2024-12-06,2025-01-03,CUST00059,Customer CUST00059,PRD001,Product A,77,41.12,3166.3,USD,North,In Process,REP16
|
| 70 |
+
SO000069,2024-11-06,2024-11-18,CUST00092,Customer CUST00092,PRD053,Product A,69,499.86,34490.45,USD,East,Delivered,REP05
|
| 71 |
+
SO000070,2024-07-20,2024-08-05,CUST00083,Customer CUST00083,PRD077,Product A,85,230.77,19615.16,USD,North,Cancelled,REP04
|
| 72 |
+
SO000071,2024-10-14,2024-10-22,CUST00092,Customer CUST00092,PRD003,Product H,39,339.07,13223.76,USD,South,In Process,REP18
|
| 73 |
+
SO000072,2024-09-24,2024-10-01,CUST00054,Customer CUST00054,PRD047,Product E,94,439.56,41318.66,USD,North,Delivered,REP15
|
| 74 |
+
SO000073,2024-08-16,2024-09-12,CUST00014,Customer CUST00014,PRD050,Product B,75,114.35,8576.43,USD,West,Cancelled,REP02
|
| 75 |
+
SO000074,2024-12-03,2024-12-24,CUST00091,Customer CUST00091,PRD088,Product C,63,365.93,23053.88,USD,North,Delivered,REP15
|
| 76 |
+
SO000075,2024-01-30,2024-02-28,CUST00051,Customer CUST00051,PRD074,Product A,5,400.27,2001.36,USD,South,Cancelled,REP17
|
| 77 |
+
SO000076,2024-12-05,2024-12-16,CUST00034,Customer CUST00034,PRD075,Product F,53,180.23,9552.33,USD,East,Delivered,REP19
|
| 78 |
+
SO000077,2024-04-20,2024-05-19,CUST00055,Customer CUST00055,PRD067,Product F,16,324.03,5184.46,USD,West,In Process,REP03
|
| 79 |
+
SO000078,2024-06-03,2024-06-27,CUST00061,Customer CUST00061,PRD042,Product J,51,30.03,1531.31,USD,Central,In Process,REP06
|
| 80 |
+
SO000079,2024-01-01,2024-01-12,CUST00012,Customer CUST00012,PRD073,Product J,46,188.49,8670.64,USD,South,Delivered,REP15
|
| 81 |
+
SO000080,2024-04-30,2024-05-28,CUST00056,Customer CUST00056,PRD052,Product A,26,435.47,11322.16,USD,North,Delivered,REP15
|
| 82 |
+
SO000081,2024-10-29,2024-11-26,CUST00014,Customer CUST00014,PRD014,Product J,28,190.77,5341.5,USD,South,Delivered,REP19
|
| 83 |
+
SO000082,2024-01-07,2024-01-16,CUST00023,Customer CUST00023,PRD028,Product B,38,270.98,10297.33,USD,North,Delivered,REP10
|
| 84 |
+
SO000083,2024-02-08,2024-03-02,CUST00086,Customer CUST00086,PRD068,Product J,44,124.28,5468.15,USD,Central,Delivered,REP10
|
| 85 |
+
SO000084,2024-03-07,2024-03-22,CUST00018,Customer CUST00018,PRD042,Product D,86,297.55,25589.48,USD,North,Delivered,REP09
|
| 86 |
+
SO000085,2024-04-10,2024-04-22,CUST00052,Customer CUST00052,PRD033,Product J,64,289.68,18539.61,USD,East,Cancelled,REP06
|
| 87 |
+
SO000086,2024-03-10,2024-04-08,CUST00004,Customer CUST00004,PRD040,Product H,55,422.73,23250.36,USD,East,Delivered,REP05
|
| 88 |
+
SO000087,2024-02-05,2024-02-17,CUST00066,Customer CUST00066,PRD051,Product D,92,459.52,42276.19,USD,North,In Process,REP02
|
| 89 |
+
SO000088,2024-11-30,2024-12-17,CUST00008,Customer CUST00008,PRD068,Product J,51,420.91,21466.18,USD,Central,Open,REP19
|
| 90 |
+
SO000089,2024-07-30,2024-08-06,CUST00020,Customer CUST00020,PRD038,Product A,12,66.27,795.24,USD,South,Delivered,REP05
|
| 91 |
+
SO000090,2024-05-18,2024-05-28,CUST00077,Customer CUST00077,PRD010,Product C,33,190.92,6300.46,USD,South,Delivered,REP12
|
| 92 |
+
SO000091,2024-01-13,2024-01-27,CUST00002,Customer CUST00002,PRD075,Product D,65,78.02,5071.57,USD,North,Delivered,REP15
|
| 93 |
+
SO000092,2024-02-07,2024-03-07,CUST00035,Customer CUST00035,PRD075,Product A,69,417.0,28773.24,USD,West,In Process,REP09
|
| 94 |
+
SO000093,2024-03-16,2024-03-25,CUST00035,Customer CUST00035,PRD072,Product A,40,363.58,14543.29,USD,West,Delivered,REP11
|
| 95 |
+
SO000094,2024-12-26,2025-01-06,CUST00014,Customer CUST00014,PRD026,Product C,85,101.34,8613.77,USD,East,Delivered,REP04
|
| 96 |
+
SO000095,2024-03-29,2024-04-17,CUST00042,Customer CUST00042,PRD097,Product I,18,410.13,7382.41,USD,East,Delivered,REP15
|
| 97 |
+
SO000096,2024-06-01,2024-06-24,CUST00097,Customer CUST00097,PRD070,Product G,66,276.34,18238.5,USD,East,Delivered,REP06
|
| 98 |
+
SO000097,2024-03-07,2024-03-20,CUST00051,Customer CUST00051,PRD094,Product H,42,78.24,3286.22,USD,Central,In Process,REP07
|
| 99 |
+
SO000098,2024-06-05,2024-06-17,CUST00057,Customer CUST00057,PRD010,Product A,27,374.53,10112.41,USD,West,Delivered,REP05
|
| 100 |
+
SO000099,2024-05-02,2024-05-18,CUST00097,Customer CUST00097,PRD052,Product F,38,272.88,10369.28,USD,West,In Process,REP15
|
| 101 |
+
SO000100,2024-06-05,2024-06-19,CUST00005,Customer CUST00005,PRD036,Product D,76,388.22,29504.88,USD,East,Delivered,REP04
|
| 102 |
+
SO000101,2024-10-08,2024-10-25,CUST00027,Customer CUST00027,PRD006,Product E,20,98.98,1979.66,USD,South,In Process,REP08
|
| 103 |
+
SO000102,2024-01-23,2024-02-13,CUST00090,Customer CUST00090,PRD060,Product J,13,78.17,1016.17,USD,South,Delivered,REP11
|
| 104 |
+
SO000103,2024-12-21,2025-01-12,CUST00068,Customer CUST00068,PRD031,Product E,37,356.55,13192.24,USD,South,Delivered,REP09
|
| 105 |
+
SO000104,2024-02-20,2024-03-11,CUST00040,Customer CUST00040,PRD021,Product I,86,456.24,39236.32,USD,North,Open,REP14
|
| 106 |
+
SO000105,2024-06-30,2024-07-29,CUST00057,Customer CUST00057,PRD021,Product A,63,162.61,10244.28,USD,East,Delivered,REP15
|
| 107 |
+
SO000106,2024-11-04,2024-11-19,CUST00074,Customer CUST00074,PRD025,Product D,57,12.27,699.37,USD,North,Open,REP11
|
| 108 |
+
SO000107,2024-10-20,2024-10-28,CUST00007,Customer CUST00007,PRD059,Product B,91,371.38,33795.18,USD,North,Delivered,REP12
|
| 109 |
+
SO000108,2024-09-07,2024-10-02,CUST00054,Customer CUST00054,PRD049,Product H,25,254.2,6355.01,USD,Central,Cancelled,REP11
|
| 110 |
+
SO000109,2024-05-29,2024-06-22,CUST00085,Customer CUST00085,PRD086,Product A,71,488.02,34649.08,USD,North,Open,REP08
|
| 111 |
+
SO000110,2024-02-18,2024-03-02,CUST00001,Customer CUST00001,PRD030,Product G,51,112.85,5755.54,USD,East,In Process,REP17
|
| 112 |
+
SO000111,2024-10-12,2024-11-03,CUST00040,Customer CUST00040,PRD066,Product C,18,154.08,2773.47,USD,East,In Process,REP17
|
| 113 |
+
SO000112,2024-04-23,2024-05-05,CUST00051,Customer CUST00051,PRD074,Product D,1,173.84,173.84,USD,East,In Process,REP19
|
| 114 |
+
SO000113,2024-06-10,2024-06-17,CUST00087,Customer CUST00087,PRD057,Product G,92,421.5,38777.68,USD,Central,In Process,REP03
|
| 115 |
+
SO000114,2024-09-11,2024-09-25,CUST00054,Customer CUST00054,PRD034,Product I,67,444.86,29805.33,USD,West,In Process,REP03
|
| 116 |
+
SO000115,2024-04-05,2024-04-25,CUST00032,Customer CUST00032,PRD054,Product H,46,416.81,19173.16,USD,West,Cancelled,REP14
|
| 117 |
+
SO000116,2024-08-10,2024-09-08,CUST00048,Customer CUST00048,PRD019,Product B,7,320.29,2242.02,USD,North,In Process,REP16
|
| 118 |
+
SO000117,2024-02-05,2024-02-29,CUST00002,Customer CUST00002,PRD002,Product A,47,316.13,14858.25,USD,East,In Process,REP03
|
| 119 |
+
SO000118,2024-04-28,2024-05-16,CUST00020,Customer CUST00020,PRD044,Product E,37,210.61,7792.63,USD,North,In Process,REP03
|
| 120 |
+
SO000119,2024-12-07,2024-12-25,CUST00024,Customer CUST00024,PRD096,Product A,74,287.23,21255.06,USD,East,Delivered,REP17
|
| 121 |
+
SO000120,2024-04-24,2024-05-17,CUST00014,Customer CUST00014,PRD022,Product I,40,352.43,14097.38,USD,North,In Process,REP11
|
| 122 |
+
SO000121,2024-01-04,2024-01-23,CUST00098,Customer CUST00098,PRD042,Product G,37,19.01,703.42,USD,South,Delivered,REP04
|
| 123 |
+
SO000122,2024-02-10,2024-02-22,CUST00034,Customer CUST00034,PRD086,Product A,37,329.2,12180.25,USD,South,Delivered,REP06
|
| 124 |
+
SO000123,2024-08-06,2024-08-20,CUST00098,Customer CUST00098,PRD085,Product I,53,95.93,5084.39,USD,Central,Delivered,REP14
|
| 125 |
+
SO000124,2024-03-04,2024-03-12,CUST00054,Customer CUST00054,PRD021,Product A,51,54.27,2767.52,USD,East,In Process,REP11
|
| 126 |
+
SO000125,2024-10-22,2024-11-08,CUST00036,Customer CUST00036,PRD055,Product A,59,155.59,9179.79,USD,East,Cancelled,REP15
|
| 127 |
+
SO000126,2024-05-31,2024-06-28,CUST00022,Customer CUST00022,PRD083,Product E,56,115.32,6457.96,USD,West,Delivered,REP03
|
| 128 |
+
SO000127,2024-08-31,2024-09-17,CUST00081,Customer CUST00081,PRD040,Product B,73,387.75,28305.53,USD,Central,In Process,REP17
|
| 129 |
+
SO000128,2024-05-08,2024-05-25,CUST00042,Customer CUST00042,PRD044,Product I,39,47.21,1841.09,USD,South,Delivered,REP19
|
| 130 |
+
SO000129,2024-04-11,2024-04-19,CUST00012,Customer CUST00012,PRD074,Product C,44,405.64,17848.2,USD,North,Open,REP17
|
| 131 |
+
SO000130,2024-10-29,2024-11-16,CUST00062,Customer CUST00062,PRD080,Product H,83,368.79,30609.59,USD,Central,Delivered,REP06
|
| 132 |
+
SO000131,2024-07-18,2024-08-11,CUST00089,Customer CUST00089,PRD017,Product J,26,29.32,762.3,USD,South,Delivered,REP07
|
| 133 |
+
SO000132,2024-09-26,2024-10-17,CUST00007,Customer CUST00007,PRD082,Product I,48,66.49,3191.43,USD,East,Cancelled,REP07
|
| 134 |
+
SO000133,2024-04-12,2024-05-05,CUST00014,Customer CUST00014,PRD037,Product H,99,284.73,28188.45,USD,Central,Open,REP11
|
| 135 |
+
SO000134,2024-07-01,2024-07-30,CUST00039,Customer CUST00039,PRD033,Product H,4,397.45,1589.82,USD,North,Delivered,REP16
|
| 136 |
+
SO000135,2024-04-17,2024-04-25,CUST00055,Customer CUST00055,PRD013,Product C,42,495.27,20801.22,USD,East,Delivered,REP18
|
| 137 |
+
SO000136,2024-04-05,2024-04-14,CUST00039,Customer CUST00039,PRD057,Product D,29,385.92,11191.75,USD,Central,Open,REP16
|
| 138 |
+
SO000137,2024-08-23,2024-09-13,CUST00010,Customer CUST00010,PRD014,Product I,84,371.42,31198.89,USD,North,Open,REP18
|
| 139 |
+
SO000138,2024-11-19,2024-12-13,CUST00062,Customer CUST00062,PRD073,Product E,25,145.86,3646.5,USD,Central,Cancelled,REP15
|
| 140 |
+
SO000139,2024-10-31,2024-11-10,CUST00012,Customer CUST00012,PRD039,Product J,37,395.31,14626.44,USD,East,Delivered,REP14
|
| 141 |
+
SO000140,2024-12-09,2024-12-26,CUST00062,Customer CUST00062,PRD020,Product B,25,374.24,9356.07,USD,West,In Process,REP19
|
| 142 |
+
SO000141,2024-11-25,2024-12-12,CUST00098,Customer CUST00098,PRD006,Product I,90,28.0,2519.88,USD,South,Delivered,REP05
|
| 143 |
+
SO000142,2024-09-17,2024-10-15,CUST00047,Customer CUST00047,PRD061,Product G,49,263.95,12933.43,USD,West,Cancelled,REP10
|
| 144 |
+
SO000143,2024-06-26,2024-07-20,CUST00062,Customer CUST00062,PRD089,Product A,88,449.74,39577.45,USD,East,In Process,REP09
|
| 145 |
+
SO000144,2024-03-08,2024-03-28,CUST00098,Customer CUST00098,PRD067,Product I,56,140.14,7848.07,USD,West,In Process,REP02
|
| 146 |
+
SO000145,2024-11-27,2024-12-13,CUST00009,Customer CUST00009,PRD079,Product H,25,279.92,6998.0,USD,East,In Process,REP06
|
| 147 |
+
SO000146,2024-11-23,2024-12-04,CUST00048,Customer CUST00048,PRD028,Product J,18,49.71,894.83,USD,West,Open,REP05
|
| 148 |
+
SO000147,2024-03-21,2024-04-14,CUST00040,Customer CUST00040,PRD077,Product C,58,289.95,16816.88,USD,South,Delivered,REP13
|
| 149 |
+
SO000148,2024-10-15,2024-10-27,CUST00088,Customer CUST00088,PRD048,Product C,80,332.64,26611.31,USD,North,Open,REP09
|
| 150 |
+
SO000149,2024-09-25,2024-10-12,CUST00045,Customer CUST00045,PRD007,Product I,53,343.27,18193.26,USD,East,Delivered,REP05
|
| 151 |
+
SO000150,2024-08-22,2024-09-10,CUST00058,Customer CUST00058,PRD053,Product I,31,414.65,12854.16,USD,South,Delivered,REP07
|
| 152 |
+
SO000151,2024-03-22,2024-04-01,CUST00002,Customer CUST00002,PRD017,Product G,66,150.65,9942.81,USD,East,Cancelled,REP08
|
| 153 |
+
SO000152,2024-08-10,2024-08-18,CUST00060,Customer CUST00060,PRD074,Product H,35,72.94,2552.9,USD,East,Delivered,REP09
|
| 154 |
+
SO000153,2024-08-11,2024-08-19,CUST00063,Customer CUST00063,PRD068,Product E,93,396.52,36875.93,USD,West,Delivered,REP17
|
| 155 |
+
SO000154,2024-01-12,2024-02-09,CUST00017,Customer CUST00017,PRD014,Product J,65,38.38,2494.77,USD,East,Delivered,REP15
|
| 156 |
+
SO000155,2024-10-11,2024-10-29,CUST00036,Customer CUST00036,PRD006,Product C,52,381.55,19840.55,USD,Central,Open,REP15
|
| 157 |
+
SO000156,2024-03-19,2024-04-13,CUST00075,Customer CUST00075,PRD081,Product J,87,228.49,19878.83,USD,South,Cancelled,REP03
|
| 158 |
+
SO000157,2024-02-08,2024-02-29,CUST00029,Customer CUST00029,PRD027,Product D,32,50.37,1611.73,USD,West,Delivered,REP03
|
| 159 |
+
SO000158,2024-12-02,2024-12-20,CUST00056,Customer CUST00056,PRD019,Product E,47,215.67,10136.32,USD,East,Cancelled,REP05
|
| 160 |
+
SO000159,2024-09-13,2024-09-25,CUST00015,Customer CUST00015,PRD012,Product B,61,108.18,6598.73,USD,North,Delivered,REP18
|
| 161 |
+
SO000160,2024-09-27,2024-10-15,CUST00080,Customer CUST00080,PRD008,Product H,60,100.91,6054.45,USD,North,Open,REP15
|
| 162 |
+
SO000161,2024-01-27,2024-02-16,CUST00050,Customer CUST00050,PRD060,Product D,71,316.85,22496.2,USD,West,Open,REP03
|
| 163 |
+
SO000162,2024-02-15,2024-03-07,CUST00025,Customer CUST00025,PRD038,Product G,17,307.58,5228.86,USD,West,In Process,REP16
|
| 164 |
+
SO000163,2024-11-14,2024-12-12,CUST00002,Customer CUST00002,PRD021,Product H,72,162.08,11669.57,USD,Central,Open,REP18
|
| 165 |
+
SO000164,2024-11-15,2024-12-09,CUST00095,Customer CUST00095,PRD041,Product F,32,331.92,10621.51,USD,North,Delivered,REP08
|
| 166 |
+
SO000165,2024-09-23,2024-10-21,CUST00051,Customer CUST00051,PRD079,Product H,41,128.6,5272.68,USD,North,Delivered,REP16
|
| 167 |
+
SO000166,2024-11-05,2024-12-03,CUST00092,Customer CUST00092,PRD002,Product D,33,284.23,9379.52,USD,South,In Process,REP01
|
| 168 |
+
SO000167,2024-10-15,2024-10-30,CUST00077,Customer CUST00077,PRD090,Product A,77,48.5,3734.77,USD,South,Cancelled,REP14
|
| 169 |
+
SO000168,2024-05-01,2024-05-25,CUST00015,Customer CUST00015,PRD006,Product B,44,61.24,2694.48,USD,East,Open,REP09
|
| 170 |
+
SO000169,2024-09-18,2024-10-03,CUST00095,Customer CUST00095,PRD084,Product I,76,436.77,33194.89,USD,South,Delivered,REP15
|
| 171 |
+
SO000170,2024-09-07,2024-09-20,CUST00075,Customer CUST00075,PRD003,Product D,80,278.32,22265.62,USD,South,Delivered,REP09
|
| 172 |
+
SO000171,2024-07-06,2024-07-22,CUST00014,Customer CUST00014,PRD019,Product B,12,131.08,1572.97,USD,Central,In Process,REP14
|
| 173 |
+
SO000172,2024-12-21,2025-01-09,CUST00008,Customer CUST00008,PRD070,Product G,53,332.77,17636.64,USD,East,Open,REP18
|
| 174 |
+
SO000173,2024-07-29,2024-08-26,CUST00037,Customer CUST00037,PRD061,Product H,59,328.66,19390.92,USD,South,In Process,REP15
|
| 175 |
+
SO000174,2024-12-18,2024-12-31,CUST00076,Customer CUST00076,PRD020,Product A,94,480.78,45193.55,USD,South,Delivered,REP05
|
| 176 |
+
SO000175,2024-01-04,2024-01-22,CUST00020,Customer CUST00020,PRD098,Product H,50,434.85,21742.27,USD,North,In Process,REP04
|
| 177 |
+
SO000176,2024-03-06,2024-03-27,CUST00034,Customer CUST00034,PRD012,Product D,6,330.95,1985.73,USD,East,Delivered,REP03
|
| 178 |
+
SO000177,2024-08-24,2024-09-17,CUST00040,Customer CUST00040,PRD094,Product E,15,125.54,1883.07,USD,South,Delivered,REP10
|
| 179 |
+
SO000178,2024-01-14,2024-02-03,CUST00002,Customer CUST00002,PRD060,Product G,37,428.65,15860.0,USD,Central,In Process,REP15
|
| 180 |
+
SO000179,2024-01-14,2024-01-27,CUST00089,Customer CUST00089,PRD028,Product D,2,56.68,113.36,USD,North,In Process,REP02
|
| 181 |
+
SO000180,2024-06-11,2024-06-22,CUST00005,Customer CUST00005,PRD047,Product A,40,303.37,12134.79,USD,West,Cancelled,REP11
|
| 182 |
+
SO000181,2024-01-10,2024-01-19,CUST00014,Customer CUST00014,PRD020,Product J,93,175.13,16287.23,USD,North,In Process,REP08
|
| 183 |
+
SO000182,2024-06-19,2024-07-07,CUST00001,Customer CUST00001,PRD037,Product I,64,186.03,11906.1,USD,West,Open,REP15
|
| 184 |
+
SO000183,2024-07-22,2024-08-02,CUST00049,Customer CUST00049,PRD020,Product A,44,228.72,10063.71,USD,West,Delivered,REP18
|
| 185 |
+
SO000184,2024-11-29,2024-12-07,CUST00073,Customer CUST00073,PRD070,Product E,20,35.33,706.63,USD,North,Open,REP05
|
| 186 |
+
SO000185,2024-09-01,2024-09-12,CUST00033,Customer CUST00033,PRD088,Product A,51,30.37,1548.91,USD,South,In Process,REP11
|
| 187 |
+
SO000186,2024-05-05,2024-05-13,CUST00089,Customer CUST00089,PRD044,Product B,29,435.28,12623.12,USD,East,In Process,REP06
|
| 188 |
+
SO000187,2024-12-05,2025-01-03,CUST00045,Customer CUST00045,PRD085,Product D,80,470.51,37640.94,USD,West,Delivered,REP01
|
| 189 |
+
SO000188,2024-09-20,2024-10-02,CUST00005,Customer CUST00005,PRD030,Product F,47,349.39,16421.18,USD,South,In Process,REP18
|
| 190 |
+
SO000189,2024-05-24,2024-06-07,CUST00047,Customer CUST00047,PRD033,Product H,76,65.42,4972.21,USD,North,Delivered,REP01
|
| 191 |
+
SO000190,2024-05-26,2024-06-17,CUST00014,Customer CUST00014,PRD066,Product E,48,329.1,15797.0,USD,South,In Process,REP18
|
| 192 |
+
SO000191,2024-07-10,2024-07-22,CUST00063,Customer CUST00063,PRD077,Product I,33,209.38,6909.7,USD,Central,Delivered,REP09
|
| 193 |
+
SO000192,2024-11-19,2024-11-27,CUST00004,Customer CUST00004,PRD023,Product F,19,405.84,7711.05,USD,South,Delivered,REP19
|
| 194 |
+
SO000193,2024-12-30,2025-01-16,CUST00001,Customer CUST00001,PRD076,Product H,54,328.05,17714.52,USD,Central,In Process,REP07
|
| 195 |
+
SO000194,2024-05-22,2024-06-18,CUST00019,Customer CUST00019,PRD090,Product I,33,126.4,4171.09,USD,North,In Process,REP11
|
| 196 |
+
SO000195,2024-12-20,2025-01-03,CUST00078,Customer CUST00078,PRD072,Product J,66,237.11,15649.4,USD,East,Delivered,REP16
|
| 197 |
+
SO000196,2024-04-26,2024-05-14,CUST00005,Customer CUST00005,PRD043,Product B,48,294.28,14125.65,USD,West,In Process,REP16
|
| 198 |
+
SO000197,2024-12-08,2024-12-20,CUST00046,Customer CUST00046,PRD047,Product B,43,18.93,814.16,USD,East,Open,REP15
|
| 199 |
+
SO000198,2024-10-07,2024-10-17,CUST00075,Customer CUST00075,PRD034,Product C,15,106.61,1599.08,USD,Central,In Process,REP14
|
| 200 |
+
SO000199,2024-02-21,2024-03-12,CUST00027,Customer CUST00027,PRD002,Product C,8,162.54,1300.33,USD,West,Delivered,REP17
|
| 201 |
+
SO000200,2024-03-17,2024-03-27,CUST00090,Customer CUST00090,PRD013,Product I,94,98.76,9283.74,USD,West,Open,REP07
|
| 202 |
+
SO000201,2024-11-07,2024-11-30,CUST00042,Customer CUST00042,PRD054,Product J,56,481.83,26982.71,USD,West,Open,REP01
|
| 203 |
+
SO000202,2024-06-20,2024-07-09,CUST00047,Customer CUST00047,PRD009,Product G,22,411.4,9050.86,USD,West,In Process,REP15
|
| 204 |
+
SO000203,2024-01-10,2024-01-26,CUST00072,Customer CUST00072,PRD050,Product H,80,282.75,22620.17,USD,East,Delivered,REP19
|
| 205 |
+
SO000204,2024-04-09,2024-04-22,CUST00074,Customer CUST00074,PRD069,Product I,18,385.66,6941.91,USD,South,In Process,REP15
|
| 206 |
+
SO000205,2024-02-18,2024-02-27,CUST00098,Customer CUST00098,PRD092,Product A,21,56.9,1194.9,USD,Central,Delivered,REP07
|
| 207 |
+
SO000206,2024-06-08,2024-06-25,CUST00010,Customer CUST00010,PRD002,Product I,78,319.69,24935.63,USD,North,In Process,REP03
|
| 208 |
+
SO000207,2024-09-19,2024-10-16,CUST00018,Customer CUST00018,PRD024,Product C,42,219.82,9232.35,USD,North,Delivered,REP14
|
| 209 |
+
SO000208,2024-01-19,2024-01-29,CUST00090,Customer CUST00090,PRD097,Product F,42,453.71,19055.7,USD,Central,Open,REP04
|
| 210 |
+
SO000209,2024-03-13,2024-03-27,CUST00097,Customer CUST00097,PRD002,Product F,41,312.41,12808.66,USD,Central,Delivered,REP05
|
| 211 |
+
SO000210,2024-01-27,2024-02-23,CUST00008,Customer CUST00008,PRD003,Product F,72,328.93,23682.95,USD,West,In Process,REP06
|
| 212 |
+
SO000211,2024-05-09,2024-06-07,CUST00044,Customer CUST00044,PRD044,Product B,81,497.79,40320.62,USD,West,Open,REP04
|
| 213 |
+
SO000212,2024-11-28,2024-12-19,CUST00055,Customer CUST00055,PRD012,Product J,62,217.12,13461.3,USD,West,In Process,REP08
|
| 214 |
+
SO000213,2024-01-03,2024-01-25,CUST00030,Customer CUST00030,PRD065,Product G,92,487.34,44835.34,USD,Central,Delivered,REP06
|
| 215 |
+
SO000214,2024-08-18,2024-08-25,CUST00016,Customer CUST00016,PRD066,Product F,98,40.92,4010.5,USD,West,In Process,REP09
|
| 216 |
+
SO000215,2024-12-06,2024-12-14,CUST00091,Customer CUST00091,PRD023,Product I,73,259.76,18962.84,USD,East,In Process,REP04
|
| 217 |
+
SO000216,2024-11-06,2024-11-18,CUST00035,Customer CUST00035,PRD012,Product F,43,291.55,12536.56,USD,West,Delivered,REP15
|
| 218 |
+
SO000217,2024-02-18,2024-03-05,CUST00038,Customer CUST00038,PRD006,Product B,45,196.51,8842.74,USD,South,Delivered,REP03
|
| 219 |
+
SO000218,2024-12-01,2024-12-14,CUST00052,Customer CUST00052,PRD035,Product I,15,207.46,3111.9,USD,South,Open,REP18
|
| 220 |
+
SO000219,2024-07-24,2024-08-19,CUST00082,Customer CUST00082,PRD036,Product J,25,291.83,7295.75,USD,Central,Delivered,REP14
|
| 221 |
+
SO000220,2024-11-16,2024-12-06,CUST00080,Customer CUST00080,PRD013,Product F,52,256.26,13325.38,USD,North,Delivered,REP02
|
| 222 |
+
SO000221,2024-01-25,2024-02-15,CUST00068,Customer CUST00068,PRD002,Product D,18,146.1,2629.78,USD,Central,Open,REP19
|
| 223 |
+
SO000222,2024-10-13,2024-11-07,CUST00005,Customer CUST00005,PRD050,Product C,34,235.3,8000.28,USD,South,In Process,REP15
|
| 224 |
+
SO000223,2024-03-23,2024-04-07,CUST00099,Customer CUST00099,PRD016,Product E,73,393.52,28727.04,USD,East,Open,REP01
|
| 225 |
+
SO000224,2024-09-16,2024-09-26,CUST00040,Customer CUST00040,PRD050,Product A,52,95.14,4947.22,USD,West,Delivered,REP05
|
| 226 |
+
SO000225,2024-04-25,2024-05-04,CUST00007,Customer CUST00007,PRD055,Product F,14,96.67,1353.45,USD,Central,Delivered,REP02
|
| 227 |
+
SO000226,2024-03-02,2024-03-29,CUST00079,Customer CUST00079,PRD085,Product E,10,343.68,3436.78,USD,Central,In Process,REP18
|
| 228 |
+
SO000227,2024-07-31,2024-08-27,CUST00082,Customer CUST00082,PRD060,Product E,45,30.89,1390.06,USD,North,Open,REP11
|
| 229 |
+
SO000228,2024-07-09,2024-08-05,CUST00052,Customer CUST00052,PRD082,Product G,26,72.33,1880.52,USD,South,In Process,REP08
|
| 230 |
+
SO000229,2024-08-14,2024-08-29,CUST00093,Customer CUST00093,PRD064,Product D,29,235.13,6818.74,USD,Central,Cancelled,REP17
|
| 231 |
+
SO000230,2024-04-29,2024-05-14,CUST00041,Customer CUST00041,PRD058,Product A,2,224.43,448.85,USD,Central,In Process,REP08
|
| 232 |
+
SO000231,2024-10-03,2024-10-20,CUST00034,Customer CUST00034,PRD060,Product H,59,230.56,13603.1,USD,North,Delivered,REP13
|
| 233 |
+
SO000232,2024-03-09,2024-03-27,CUST00065,Customer CUST00065,PRD001,Product G,8,30.42,243.36,USD,North,Delivered,REP13
|
| 234 |
+
SO000233,2024-05-31,2024-06-23,CUST00005,Customer CUST00005,PRD015,Product D,21,199.92,4198.35,USD,West,In Process,REP19
|
| 235 |
+
SO000234,2024-01-28,2024-02-22,CUST00058,Customer CUST00058,PRD096,Product E,5,333.55,1667.74,USD,South,Open,REP16
|
| 236 |
+
SO000235,2024-08-07,2024-08-30,CUST00095,Customer CUST00095,PRD036,Product H,25,488.24,12205.89,USD,South,Open,REP04
|
| 237 |
+
SO000236,2024-03-18,2024-04-02,CUST00041,Customer CUST00041,PRD012,Product I,62,448.95,27834.85,USD,South,Delivered,REP08
|
| 238 |
+
SO000237,2024-09-14,2024-10-12,CUST00013,Customer CUST00013,PRD010,Product E,32,376.56,12049.79,USD,West,Open,REP15
|
| 239 |
+
SO000238,2024-09-29,2024-10-13,CUST00018,Customer CUST00018,PRD089,Product G,73,192.36,14042.41,USD,East,Delivered,REP18
|
| 240 |
+
SO000239,2024-10-04,2024-10-30,CUST00030,Customer CUST00030,PRD021,Product D,85,341.23,29004.66,USD,East,Delivered,REP03
|
| 241 |
+
SO000240,2024-05-01,2024-05-30,CUST00039,Customer CUST00039,PRD021,Product A,12,460.27,5523.29,USD,South,Delivered,REP08
|
| 242 |
+
SO000241,2024-10-28,2024-11-11,CUST00007,Customer CUST00007,PRD092,Product G,96,96.94,9306.25,USD,East,In Process,REP13
|
| 243 |
+
SO000242,2024-09-14,2024-10-11,CUST00079,Customer CUST00079,PRD044,Product D,27,482.91,13038.67,USD,East,Open,REP13
|
| 244 |
+
SO000243,2024-10-04,2024-10-21,CUST00037,Customer CUST00037,PRD030,Product A,56,309.85,17351.65,USD,East,Open,REP07
|
| 245 |
+
SO000244,2024-04-17,2024-05-08,CUST00025,Customer CUST00025,PRD003,Product E,8,236.16,1889.31,USD,North,Delivered,REP01
|
| 246 |
+
SO000245,2024-04-13,2024-04-22,CUST00096,Customer CUST00096,PRD046,Product J,98,109.98,10777.79,USD,South,Delivered,REP07
|
| 247 |
+
SO000246,2024-08-06,2024-08-14,CUST00041,Customer CUST00041,PRD012,Product I,36,12.56,452.25,USD,South,Delivered,REP17
|
| 248 |
+
SO000247,2024-01-14,2024-01-22,CUST00053,Customer CUST00053,PRD070,Product I,20,170.2,3403.93,USD,East,Delivered,REP19
|
| 249 |
+
SO000248,2024-04-10,2024-04-20,CUST00004,Customer CUST00004,PRD085,Product D,10,444.24,4442.36,USD,East,Open,REP08
|
| 250 |
+
SO000249,2024-12-24,2025-01-20,CUST00074,Customer CUST00074,PRD017,Product F,46,184.19,8472.81,USD,North,In Process,REP07
|
| 251 |
+
SO000250,2024-01-04,2024-01-24,CUST00003,Customer CUST00003,PRD024,Product H,80,120.46,9637.2,USD,West,Delivered,REP02
|
| 252 |
+
SO000251,2024-06-06,2024-06-30,CUST00019,Customer CUST00019,PRD076,Product C,49,321.88,15772.14,USD,East,Open,REP06
|
| 253 |
+
SO000252,2024-04-26,2024-05-06,CUST00064,Customer CUST00064,PRD018,Product C,48,193.0,9263.84,USD,North,In Process,REP17
|
| 254 |
+
SO000253,2024-09-07,2024-09-28,CUST00075,Customer CUST00075,PRD047,Product I,45,95.01,4275.24,USD,West,In Process,REP15
|
| 255 |
+
SO000254,2024-07-16,2024-08-06,CUST00078,Customer CUST00078,PRD061,Product G,9,475.65,4280.88,USD,Central,Open,REP10
|
| 256 |
+
SO000255,2024-02-19,2024-02-28,CUST00077,Customer CUST00077,PRD051,Product A,94,417.53,39247.97,USD,Central,Delivered,REP19
|
| 257 |
+
SO000256,2024-02-04,2024-02-24,CUST00026,Customer CUST00026,PRD021,Product C,69,422.55,29155.77,USD,Central,In Process,REP10
|
| 258 |
+
SO000257,2024-07-10,2024-07-21,CUST00100,Customer CUST00100,PRD024,Product F,90,49.49,4454.53,USD,South,Cancelled,REP04
|
| 259 |
+
SO000258,2024-11-21,2024-12-06,CUST00054,Customer CUST00054,PRD030,Product I,31,462.09,14324.64,USD,North,Cancelled,REP12
|
| 260 |
+
SO000259,2024-04-15,2024-05-13,CUST00092,Customer CUST00092,PRD054,Product G,35,145.05,5076.75,USD,South,In Process,REP10
|
| 261 |
+
SO000260,2024-08-04,2024-08-23,CUST00070,Customer CUST00070,PRD057,Product I,45,428.01,19260.63,USD,East,Open,REP04
|
| 262 |
+
SO000261,2024-06-26,2024-07-03,CUST00091,Customer CUST00091,PRD075,Product G,70,450.92,31564.28,USD,South,Delivered,REP15
|
| 263 |
+
SO000262,2024-07-17,2024-08-13,CUST00042,Customer CUST00042,PRD069,Product J,14,368.1,5153.43,USD,South,Cancelled,REP03
|
| 264 |
+
SO000263,2024-03-27,2024-04-07,CUST00088,Customer CUST00088,PRD061,Product A,19,161.26,3063.99,USD,Central,Delivered,REP09
|
| 265 |
+
SO000264,2024-06-09,2024-07-03,CUST00068,Customer CUST00068,PRD061,Product J,71,345.04,24497.81,USD,North,Delivered,REP02
|
| 266 |
+
SO000265,2024-01-28,2024-02-14,CUST00041,Customer CUST00041,PRD070,Product G,86,278.93,23988.06,USD,South,Open,REP02
|
| 267 |
+
SO000266,2024-03-05,2024-03-21,CUST00085,Customer CUST00085,PRD098,Product E,2,335.45,670.9,USD,North,Delivered,REP16
|
| 268 |
+
SO000267,2024-05-04,2024-05-17,CUST00086,Customer CUST00086,PRD064,Product H,40,64.85,2593.94,USD,East,In Process,REP19
|
| 269 |
+
SO000268,2024-11-14,2024-12-07,CUST00064,Customer CUST00064,PRD086,Product G,21,90.71,1904.83,USD,West,Delivered,REP15
|
| 270 |
+
SO000269,2024-08-19,2024-09-15,CUST00079,Customer CUST00079,PRD058,Product F,92,135.19,12437.64,USD,Central,In Process,REP17
|
| 271 |
+
SO000270,2024-03-06,2024-03-15,CUST00072,Customer CUST00072,PRD050,Product A,42,253.93,10664.98,USD,West,In Process,REP11
|
| 272 |
+
SO000271,2024-07-15,2024-08-09,CUST00011,Customer CUST00011,PRD036,Product H,12,266.43,3197.18,USD,West,Delivered,REP05
|
| 273 |
+
SO000272,2024-03-25,2024-04-08,CUST00055,Customer CUST00055,PRD084,Product I,47,105.96,4980.21,USD,South,Open,REP06
|
| 274 |
+
SO000273,2024-09-24,2024-10-02,CUST00007,Customer CUST00007,PRD033,Product C,3,449.62,1348.86,USD,East,Cancelled,REP01
|
| 275 |
+
SO000274,2024-01-08,2024-01-19,CUST00032,Customer CUST00032,PRD012,Product E,4,401.31,1605.24,USD,East,Delivered,REP11
|
| 276 |
+
SO000275,2024-10-28,2024-11-26,CUST00016,Customer CUST00016,PRD013,Product A,63,247.83,15613.03,USD,Central,Delivered,REP02
|
| 277 |
+
SO000276,2024-09-16,2024-09-28,CUST00095,Customer CUST00095,PRD025,Product G,27,346.56,9357.17,USD,East,Delivered,REP02
|
| 278 |
+
SO000277,2024-06-02,2024-06-13,CUST00099,Customer CUST00099,PRD011,Product I,50,64.27,3213.34,USD,West,In Process,REP02
|
| 279 |
+
SO000278,2024-12-29,2025-01-16,CUST00073,Customer CUST00073,PRD030,Product E,88,252.16,22190.44,USD,East,Delivered,REP16
|
| 280 |
+
SO000279,2024-10-03,2024-10-10,CUST00085,Customer CUST00085,PRD058,Product C,52,453.63,23588.57,USD,East,In Process,REP11
|
| 281 |
+
SO000280,2024-10-05,2024-10-27,CUST00022,Customer CUST00022,PRD084,Product A,69,405.04,27947.48,USD,East,Delivered,REP16
|
| 282 |
+
SO000281,2024-03-06,2024-03-15,CUST00040,Customer CUST00040,PRD001,Product H,28,344.02,9632.51,USD,North,Delivered,REP08
|
| 283 |
+
SO000282,2024-09-03,2024-10-02,CUST00063,Customer CUST00063,PRD053,Product C,4,434.53,1738.12,USD,Central,Open,REP14
|
| 284 |
+
SO000283,2024-05-21,2024-05-31,CUST00076,Customer CUST00076,PRD082,Product A,39,405.62,15819.34,USD,West,Delivered,REP19
|
| 285 |
+
SO000284,2024-08-12,2024-08-24,CUST00091,Customer CUST00091,PRD062,Product G,59,64.38,3798.71,USD,West,In Process,REP03
|
| 286 |
+
SO000285,2024-05-26,2024-06-15,CUST00084,Customer CUST00084,PRD022,Product A,25,216.51,5412.69,USD,South,Cancelled,REP16
|
| 287 |
+
SO000286,2024-03-23,2024-04-12,CUST00051,Customer CUST00051,PRD071,Product C,42,352.66,14811.91,USD,West,Open,REP14
|
| 288 |
+
SO000287,2024-03-03,2024-03-18,CUST00019,Customer CUST00019,PRD040,Product D,14,117.04,1638.52,USD,Central,Delivered,REP17
|
| 289 |
+
SO000288,2024-10-12,2024-10-27,CUST00064,Customer CUST00064,PRD059,Product A,52,157.62,8196.24,USD,East,Open,REP14
|
| 290 |
+
SO000289,2024-08-09,2024-08-24,CUST00068,Customer CUST00068,PRD086,Product D,92,427.61,39340.06,USD,North,In Process,REP09
|
| 291 |
+
SO000290,2024-04-29,2024-05-28,CUST00016,Customer CUST00016,PRD050,Product A,48,26.99,1295.44,USD,East,In Process,REP05
|
| 292 |
+
SO000291,2024-10-30,2024-11-25,CUST00067,Customer CUST00067,PRD098,Product A,73,455.72,33267.35,USD,West,Delivered,REP01
|
| 293 |
+
SO000292,2024-01-08,2024-01-27,CUST00087,Customer CUST00087,PRD052,Product H,76,456.23,34673.6,USD,North,In Process,REP08
|
| 294 |
+
SO000293,2024-01-21,2024-02-15,CUST00038,Customer CUST00038,PRD022,Product D,29,323.41,9378.8,USD,West,Open,REP12
|
| 295 |
+
SO000294,2024-03-07,2024-04-04,CUST00066,Customer CUST00066,PRD087,Product H,34,241.72,8218.47,USD,North,Delivered,REP06
|
| 296 |
+
SO000295,2024-09-18,2024-10-16,CUST00025,Customer CUST00025,PRD083,Product B,17,29.49,501.25,USD,South,Cancelled,REP10
|
| 297 |
+
SO000296,2024-04-02,2024-04-21,CUST00099,Customer CUST00099,PRD049,Product H,14,309.28,4329.95,USD,Central,In Process,REP13
|
| 298 |
+
SO000297,2024-07-07,2024-07-19,CUST00049,Customer CUST00049,PRD090,Product A,62,418.33,25936.17,USD,West,Open,REP07
|
| 299 |
+
SO000298,2024-12-06,2025-01-02,CUST00049,Customer CUST00049,PRD049,Product J,54,466.56,25194.2,USD,North,Delivered,REP09
|
| 300 |
+
SO000299,2024-01-17,2024-02-13,CUST00051,Customer CUST00051,PRD019,Product G,55,438.37,24110.3,USD,Central,Delivered,REP11
|
| 301 |
+
SO000300,2024-11-28,2024-12-18,CUST00045,Customer CUST00045,PRD061,Product A,40,216.7,8667.83,USD,West,Delivered,REP13
|
| 302 |
+
SO000301,2024-09-24,2024-10-16,CUST00033,Customer CUST00033,PRD087,Product J,92,412.39,37939.62,USD,North,Delivered,REP13
|
| 303 |
+
SO000302,2024-08-02,2024-08-25,CUST00047,Customer CUST00047,PRD036,Product D,82,135.78,11133.97,USD,West,In Process,REP18
|
| 304 |
+
SO000303,2024-05-26,2024-06-16,CUST00028,Customer CUST00028,PRD015,Product H,84,451.16,37897.22,USD,West,Open,REP09
|
| 305 |
+
SO000304,2024-09-14,2024-09-29,CUST00074,Customer CUST00074,PRD051,Product B,51,300.89,15345.58,USD,South,Delivered,REP09
|
| 306 |
+
SO000305,2024-02-08,2024-02-17,CUST00084,Customer CUST00084,PRD016,Product F,27,373.08,10073.18,USD,Central,Open,REP08
|
| 307 |
+
SO000306,2024-09-14,2024-10-07,CUST00041,Customer CUST00041,PRD062,Product C,65,51.35,3337.9,USD,South,Cancelled,REP17
|
| 308 |
+
SO000307,2024-05-06,2024-06-04,CUST00024,Customer CUST00024,PRD099,Product I,38,424.35,16125.15,USD,East,In Process,REP13
|
| 309 |
+
SO000308,2024-03-13,2024-04-09,CUST00030,Customer CUST00030,PRD041,Product B,32,412.99,13215.58,USD,West,Delivered,REP08
|
| 310 |
+
SO000309,2024-03-15,2024-04-06,CUST00032,Customer CUST00032,PRD039,Product J,57,23.44,1335.85,USD,West,Delivered,REP02
|
| 311 |
+
SO000310,2024-06-04,2024-06-15,CUST00007,Customer CUST00007,PRD019,Product D,37,446.15,16507.46,USD,North,Cancelled,REP10
|
| 312 |
+
SO000311,2024-05-05,2024-05-22,CUST00049,Customer CUST00049,PRD056,Product A,38,425.1,16153.74,USD,South,Delivered,REP12
|
| 313 |
+
SO000312,2024-11-16,2024-11-26,CUST00050,Customer CUST00050,PRD045,Product E,30,23.49,704.79,USD,East,Delivered,REP04
|
| 314 |
+
SO000313,2024-06-02,2024-06-22,CUST00064,Customer CUST00064,PRD030,Product J,51,21.44,1093.57,USD,East,Open,REP10
|
| 315 |
+
SO000314,2024-05-01,2024-05-12,CUST00042,Customer CUST00042,PRD073,Product E,35,445.32,15586.12,USD,West,Cancelled,REP17
|
| 316 |
+
SO000315,2024-10-11,2024-10-30,CUST00059,Customer CUST00059,PRD049,Product D,17,198.9,3381.31,USD,West,Cancelled,REP13
|
| 317 |
+
SO000316,2024-06-10,2024-06-29,CUST00086,Customer CUST00086,PRD051,Product E,87,225.82,19646.01,USD,South,Delivered,REP17
|
| 318 |
+
SO000317,2024-12-06,2024-12-26,CUST00021,Customer CUST00021,PRD099,Product G,68,180.17,12251.27,USD,West,Delivered,REP13
|
| 319 |
+
SO000318,2024-04-20,2024-04-28,CUST00011,Customer CUST00011,PRD086,Product D,51,393.37,20061.88,USD,East,Delivered,REP19
|
| 320 |
+
SO000319,2024-06-13,2024-06-26,CUST00085,Customer CUST00085,PRD019,Product H,28,427.75,11977.09,USD,Central,Delivered,REP02
|
| 321 |
+
SO000320,2024-09-23,2024-10-21,CUST00045,Customer CUST00045,PRD056,Product F,21,375.47,7884.9,USD,West,Open,REP09
|
| 322 |
+
SO000321,2024-02-15,2024-03-04,CUST00070,Customer CUST00070,PRD096,Product A,19,261.32,4965.12,USD,West,In Process,REP06
|
| 323 |
+
SO000322,2024-07-01,2024-07-11,CUST00075,Customer CUST00075,PRD081,Product A,62,383.28,23763.43,USD,East,Delivered,REP19
|
| 324 |
+
SO000323,2024-08-06,2024-08-30,CUST00092,Customer CUST00092,PRD035,Product C,47,384.62,18077.08,USD,West,Delivered,REP16
|
| 325 |
+
SO000324,2024-11-24,2024-12-08,CUST00045,Customer CUST00045,PRD067,Product A,81,425.01,34426.19,USD,East,In Process,REP05
|
| 326 |
+
SO000325,2024-01-13,2024-02-03,CUST00061,Customer CUST00061,PRD067,Product G,80,383.67,30693.78,USD,Central,Open,REP10
|
| 327 |
+
SO000326,2024-10-24,2024-11-20,CUST00080,Customer CUST00080,PRD035,Product B,41,146.59,6010.29,USD,North,Delivered,REP19
|
| 328 |
+
SO000327,2024-09-20,2024-10-13,CUST00071,Customer CUST00071,PRD015,Product G,67,371.56,24894.26,USD,North,Delivered,REP05
|
| 329 |
+
SO000328,2024-05-20,2024-06-03,CUST00008,Customer CUST00008,PRD066,Product E,60,332.68,19961.09,USD,North,Delivered,REP08
|
| 330 |
+
SO000329,2024-01-23,2024-02-07,CUST00034,Customer CUST00034,PRD003,Product D,30,22.0,660.13,USD,East,In Process,REP14
|
| 331 |
+
SO000330,2024-07-06,2024-07-25,CUST00045,Customer CUST00045,PRD066,Product B,45,478.01,21510.29,USD,East,Delivered,REP08
|
| 332 |
+
SO000331,2024-05-24,2024-06-22,CUST00034,Customer CUST00034,PRD013,Product J,16,244.35,3909.56,USD,South,Open,REP15
|
| 333 |
+
SO000332,2024-10-16,2024-10-29,CUST00067,Customer CUST00067,PRD053,Product H,87,465.32,40482.99,USD,East,Open,REP07
|
| 334 |
+
SO000333,2024-11-16,2024-12-09,CUST00030,Customer CUST00030,PRD025,Product E,13,305.71,3974.25,USD,Central,In Process,REP17
|
| 335 |
+
SO000334,2024-07-01,2024-07-30,CUST00032,Customer CUST00032,PRD014,Product J,10,412.5,4125.02,USD,West,Delivered,REP18
|
| 336 |
+
SO000335,2024-02-22,2024-03-14,CUST00022,Customer CUST00022,PRD031,Product D,77,459.23,35360.55,USD,South,In Process,REP14
|
| 337 |
+
SO000336,2024-10-16,2024-11-09,CUST00098,Customer CUST00098,PRD093,Product I,76,207.2,15747.11,USD,North,Open,REP18
|
| 338 |
+
SO000337,2024-04-05,2024-05-03,CUST00038,Customer CUST00038,PRD044,Product A,87,295.8,25734.65,USD,North,In Process,REP11
|
| 339 |
+
SO000338,2024-04-30,2024-05-07,CUST00019,Customer CUST00019,PRD015,Product I,27,434.61,11734.43,USD,West,Delivered,REP19
|
| 340 |
+
SO000339,2024-05-20,2024-06-14,CUST00049,Customer CUST00049,PRD087,Product F,56,482.4,27014.31,USD,Central,Open,REP01
|
| 341 |
+
SO000340,2024-11-11,2024-12-10,CUST00010,Customer CUST00010,PRD024,Product G,85,359.39,30548.37,USD,Central,Open,REP12
|
| 342 |
+
SO000341,2024-01-11,2024-02-03,CUST00068,Customer CUST00068,PRD012,Product I,94,141.79,13328.67,USD,West,Delivered,REP05
|
| 343 |
+
SO000342,2024-10-24,2024-11-16,CUST00048,Customer CUST00048,PRD018,Product G,28,434.25,12159.05,USD,East,In Process,REP14
|
| 344 |
+
SO000343,2024-08-14,2024-09-01,CUST00071,Customer CUST00071,PRD002,Product I,13,214.09,2783.13,USD,Central,In Process,REP16
|
| 345 |
+
SO000344,2024-05-16,2024-05-31,CUST00038,Customer CUST00038,PRD045,Product F,56,327.38,18333.25,USD,West,Delivered,REP13
|
| 346 |
+
SO000345,2024-06-10,2024-06-25,CUST00088,Customer CUST00088,PRD044,Product H,7,71.6,501.23,USD,East,In Process,REP08
|
| 347 |
+
SO000346,2024-11-05,2024-12-03,CUST00065,Customer CUST00065,PRD049,Product D,21,150.83,3167.44,USD,East,Delivered,REP10
|
| 348 |
+
SO000347,2024-02-22,2024-03-11,CUST00047,Customer CUST00047,PRD002,Product E,74,17.2,1272.78,USD,Central,Cancelled,REP17
|
| 349 |
+
SO000348,2024-12-21,2025-01-10,CUST00010,Customer CUST00010,PRD024,Product C,25,370.74,9268.46,USD,North,Cancelled,REP11
|
| 350 |
+
SO000349,2024-08-15,2024-08-27,CUST00065,Customer CUST00065,PRD058,Product D,28,140.95,3946.71,USD,North,Delivered,REP12
|
| 351 |
+
SO000350,2024-10-09,2024-11-06,CUST00053,Customer CUST00053,PRD006,Product J,59,197.46,11650.4,USD,North,Open,REP07
|
| 352 |
+
SO000351,2024-08-11,2024-09-07,CUST00025,Customer CUST00025,PRD012,Product A,55,263.8,14509.04,USD,West,Delivered,REP16
|
| 353 |
+
SO000352,2024-07-26,2024-08-12,CUST00100,Customer CUST00100,PRD087,Product G,51,21.56,1099.64,USD,East,Delivered,REP08
|
| 354 |
+
SO000353,2024-02-14,2024-03-13,CUST00059,Customer CUST00059,PRD028,Product D,67,357.97,23983.75,USD,Central,In Process,REP13
|
| 355 |
+
SO000354,2024-03-19,2024-04-17,CUST00044,Customer CUST00044,PRD056,Product J,4,479.32,1917.27,USD,North,In Process,REP18
|
| 356 |
+
SO000355,2024-11-26,2024-12-17,CUST00032,Customer CUST00032,PRD057,Product F,17,120.44,2047.43,USD,West,Delivered,REP10
|
| 357 |
+
SO000356,2024-10-27,2024-11-21,CUST00011,Customer CUST00011,PRD065,Product E,72,321.62,23156.48,USD,West,Delivered,REP17
|
| 358 |
+
SO000357,2024-06-23,2024-07-19,CUST00088,Customer CUST00088,PRD026,Product F,60,274.02,16441.1,USD,North,Delivered,REP17
|
| 359 |
+
SO000358,2024-01-05,2024-01-31,CUST00052,Customer CUST00052,PRD027,Product I,75,31.84,2387.72,USD,North,Cancelled,REP02
|
| 360 |
+
SO000359,2024-01-15,2024-02-11,CUST00046,Customer CUST00046,PRD046,Product E,6,144.6,867.63,USD,South,Delivered,REP13
|
| 361 |
+
SO000360,2024-08-10,2024-08-19,CUST00094,Customer CUST00094,PRD033,Product F,93,245.85,22864.36,USD,Central,Open,REP17
|
| 362 |
+
SO000361,2024-08-27,2024-09-13,CUST00077,Customer CUST00077,PRD016,Product B,11,202.01,2222.12,USD,West,Cancelled,REP04
|
| 363 |
+
SO000362,2024-12-20,2025-01-11,CUST00056,Customer CUST00056,PRD018,Product J,62,289.07,17922.62,USD,East,In Process,REP19
|
| 364 |
+
SO000363,2024-11-06,2024-11-18,CUST00082,Customer CUST00082,PRD098,Product J,6,103.15,618.92,USD,East,Delivered,REP17
|
| 365 |
+
SO000364,2024-04-16,2024-05-03,CUST00080,Customer CUST00080,PRD094,Product B,34,381.08,12956.79,USD,Central,Delivered,REP04
|
| 366 |
+
SO000365,2024-04-03,2024-04-10,CUST00043,Customer CUST00043,PRD086,Product G,81,89.72,7267.55,USD,South,Delivered,REP12
|
| 367 |
+
SO000366,2024-05-16,2024-05-27,CUST00074,Customer CUST00074,PRD085,Product D,92,463.84,42672.83,USD,South,Delivered,REP10
|
| 368 |
+
SO000367,2024-09-08,2024-09-22,CUST00066,Customer CUST00066,PRD093,Product G,72,406.05,29235.96,USD,Central,In Process,REP03
|
| 369 |
+
SO000368,2024-12-29,2025-01-17,CUST00045,Customer CUST00045,PRD001,Product J,9,85.37,768.29,USD,East,Cancelled,REP07
|
| 370 |
+
SO000369,2024-08-28,2024-09-06,CUST00084,Customer CUST00084,PRD090,Product D,94,460.03,43242.72,USD,North,In Process,REP14
|
| 371 |
+
SO000370,2024-01-17,2024-02-10,CUST00045,Customer CUST00045,PRD065,Product D,93,286.4,26634.85,USD,East,In Process,REP18
|
| 372 |
+
SO000371,2024-09-13,2024-10-02,CUST00020,Customer CUST00020,PRD005,Product D,87,257.92,22438.99,USD,East,Delivered,REP01
|
| 373 |
+
SO000372,2024-10-04,2024-10-12,CUST00041,Customer CUST00041,PRD076,Product D,69,362.39,25004.8,USD,East,In Process,REP19
|
| 374 |
+
SO000373,2024-04-18,2024-05-01,CUST00047,Customer CUST00047,PRD004,Product G,71,424.47,30137.11,USD,Central,In Process,REP10
|
| 375 |
+
SO000374,2024-03-24,2024-04-14,CUST00093,Customer CUST00093,PRD091,Product H,41,154.89,6350.51,USD,West,Delivered,REP04
|
| 376 |
+
SO000375,2024-09-27,2024-10-06,CUST00037,Customer CUST00037,PRD061,Product A,67,56.58,3790.59,USD,East,Delivered,REP04
|
| 377 |
+
SO000376,2024-01-24,2024-02-09,CUST00004,Customer CUST00004,PRD023,Product C,34,439.18,14932.21,USD,Central,In Process,REP13
|
| 378 |
+
SO000377,2024-03-09,2024-04-05,CUST00062,Customer CUST00062,PRD057,Product I,57,299.31,17060.74,USD,West,Delivered,REP10
|
| 379 |
+
SO000378,2024-06-16,2024-06-29,CUST00038,Customer CUST00038,PRD068,Product E,61,224.37,13686.33,USD,East,Open,REP12
|
| 380 |
+
SO000379,2024-02-07,2024-03-03,CUST00036,Customer CUST00036,PRD062,Product I,69,381.94,26354.12,USD,South,In Process,REP05
|
| 381 |
+
SO000380,2024-01-25,2024-02-16,CUST00027,Customer CUST00027,PRD039,Product C,78,71.42,5571.12,USD,East,Cancelled,REP16
|
| 382 |
+
SO000381,2024-01-22,2024-02-18,CUST00054,Customer CUST00054,PRD042,Product E,72,333.9,24040.58,USD,East,In Process,REP10
|
| 383 |
+
SO000382,2024-02-01,2024-02-09,CUST00009,Customer CUST00009,PRD048,Product A,11,317.93,3497.26,USD,North,In Process,REP15
|
| 384 |
+
SO000383,2024-06-01,2024-06-28,CUST00065,Customer CUST00065,PRD066,Product I,51,190.95,9738.33,USD,North,In Process,REP08
|
| 385 |
+
SO000384,2024-09-27,2024-10-10,CUST00070,Customer CUST00070,PRD081,Product A,23,71.31,1640.16,USD,Central,Delivered,REP02
|
| 386 |
+
SO000385,2024-09-07,2024-09-22,CUST00093,Customer CUST00093,PRD003,Product I,13,114.56,1489.32,USD,West,Cancelled,REP17
|
| 387 |
+
SO000386,2024-03-03,2024-03-26,CUST00076,Customer CUST00076,PRD032,Product G,64,253.17,16202.67,USD,East,In Process,REP04
|
| 388 |
+
SO000387,2024-12-04,2024-12-21,CUST00035,Customer CUST00035,PRD004,Product H,78,354.81,27675.41,USD,South,In Process,REP19
|
| 389 |
+
SO000388,2024-06-16,2024-07-11,CUST00065,Customer CUST00065,PRD062,Product E,27,246.31,6650.36,USD,Central,Cancelled,REP03
|
| 390 |
+
SO000389,2024-05-26,2024-06-13,CUST00080,Customer CUST00080,PRD002,Product J,89,87.06,7748.68,USD,West,Delivered,REP19
|
| 391 |
+
SO000390,2024-11-08,2024-11-19,CUST00072,Customer CUST00072,PRD083,Product G,78,316.19,24662.69,USD,East,Delivered,REP19
|
| 392 |
+
SO000391,2024-07-28,2024-08-23,CUST00080,Customer CUST00080,PRD027,Product H,97,278.94,27057.25,USD,Central,In Process,REP12
|
| 393 |
+
SO000392,2024-04-06,2024-04-17,CUST00057,Customer CUST00057,PRD019,Product E,59,184.37,10877.76,USD,South,In Process,REP05
|
| 394 |
+
SO000393,2024-02-16,2024-02-29,CUST00068,Customer CUST00068,PRD093,Product A,13,394.58,5129.57,USD,East,Delivered,REP18
|
| 395 |
+
SO000394,2024-11-14,2024-11-30,CUST00057,Customer CUST00057,PRD006,Product H,90,230.56,20750.14,USD,South,Open,REP05
|
| 396 |
+
SO000395,2024-11-13,2024-11-28,CUST00069,Customer CUST00069,PRD076,Product B,90,295.27,26574.28,USD,North,In Process,REP07
|
| 397 |
+
SO000396,2024-09-22,2024-09-30,CUST00089,Customer CUST00089,PRD026,Product C,80,319.04,25523.46,USD,South,Delivered,REP11
|
| 398 |
+
SO000397,2024-10-21,2024-11-11,CUST00020,Customer CUST00020,PRD066,Product I,54,350.94,18950.8,USD,East,Delivered,REP02
|
| 399 |
+
SO000398,2024-11-18,2024-11-30,CUST00079,Customer CUST00079,PRD059,Product J,73,356.25,26006.15,USD,North,Delivered,REP02
|
| 400 |
+
SO000399,2024-03-05,2024-03-30,CUST00026,Customer CUST00026,PRD048,Product I,10,310.01,3100.06,USD,East,Delivered,REP04
|
| 401 |
+
SO000400,2024-04-07,2024-04-26,CUST00028,Customer CUST00028,PRD083,Product A,45,295.63,13303.52,USD,North,Delivered,REP01
|
| 402 |
+
SO000401,2024-05-17,2024-05-27,CUST00073,Customer CUST00073,PRD027,Product J,32,339.51,10864.18,USD,North,In Process,REP18
|
| 403 |
+
SO000402,2024-08-31,2024-09-27,CUST00025,Customer CUST00025,PRD092,Product D,93,261.24,24294.94,USD,East,Open,REP17
|
| 404 |
+
SO000403,2024-02-12,2024-02-27,CUST00042,Customer CUST00042,PRD096,Product B,84,109.97,9237.66,USD,North,Delivered,REP15
|
| 405 |
+
SO000404,2024-03-03,2024-03-10,CUST00069,Customer CUST00069,PRD058,Product B,40,183.88,7355.27,USD,South,Delivered,REP01
|
| 406 |
+
SO000405,2024-11-26,2024-12-18,CUST00082,Customer CUST00082,PRD063,Product G,10,443.63,4436.33,USD,East,In Process,REP13
|
| 407 |
+
SO000406,2024-06-22,2024-07-01,CUST00074,Customer CUST00074,PRD051,Product F,65,134.15,8719.43,USD,East,Delivered,REP14
|
| 408 |
+
SO000407,2024-07-27,2024-08-11,CUST00006,Customer CUST00006,PRD037,Product I,39,141.74,5527.79,USD,West,Cancelled,REP09
|
| 409 |
+
SO000408,2024-12-03,2024-12-30,CUST00002,Customer CUST00002,PRD037,Product J,60,418.49,25109.11,USD,West,Delivered,REP15
|
| 410 |
+
SO000409,2024-04-01,2024-04-25,CUST00098,Customer CUST00098,PRD007,Product F,11,303.43,3337.78,USD,Central,In Process,REP11
|
| 411 |
+
SO000410,2024-11-05,2024-11-15,CUST00092,Customer CUST00092,PRD038,Product A,55,359.35,19764.27,USD,South,In Process,REP16
|
| 412 |
+
SO000411,2024-05-12,2024-06-04,CUST00074,Customer CUST00074,PRD068,Product E,71,363.08,25778.48,USD,West,In Process,REP05
|
| 413 |
+
SO000412,2024-05-08,2024-05-18,CUST00012,Customer CUST00012,PRD052,Product H,23,134.89,3102.52,USD,Central,In Process,REP13
|
| 414 |
+
SO000413,2024-11-06,2024-11-26,CUST00032,Customer CUST00032,PRD058,Product G,96,395.32,37950.27,USD,South,In Process,REP07
|
| 415 |
+
SO000414,2024-12-01,2024-12-08,CUST00085,Customer CUST00085,PRD041,Product I,6,281.15,1686.91,USD,East,In Process,REP05
|
| 416 |
+
SO000415,2024-03-27,2024-04-19,CUST00076,Customer CUST00076,PRD073,Product G,80,376.69,30135.55,USD,North,Open,REP15
|
| 417 |
+
SO000416,2024-06-13,2024-07-12,CUST00013,Customer CUST00013,PRD006,Product D,23,220.51,5071.69,USD,Central,Delivered,REP12
|
| 418 |
+
SO000417,2024-01-18,2024-02-15,CUST00033,Customer CUST00033,PRD036,Product A,32,446.52,14288.61,USD,South,In Process,REP02
|
| 419 |
+
SO000418,2024-07-19,2024-08-04,CUST00028,Customer CUST00028,PRD028,Product G,47,201.61,9475.49,USD,East,In Process,REP08
|
| 420 |
+
SO000419,2024-12-28,2025-01-12,CUST00047,Customer CUST00047,PRD047,Product A,62,437.02,27095.21,USD,East,Delivered,REP10
|
| 421 |
+
SO000420,2024-12-19,2025-01-13,CUST00013,Customer CUST00013,PRD064,Product F,1,319.4,319.4,USD,Central,Delivered,REP07
|
| 422 |
+
SO000421,2024-05-07,2024-05-30,CUST00071,Customer CUST00071,PRD053,Product E,26,448.88,11670.9,USD,South,Delivered,REP01
|
| 423 |
+
SO000422,2024-08-28,2024-09-20,CUST00043,Customer CUST00043,PRD026,Product I,3,284.73,854.2,USD,Central,In Process,REP16
|
| 424 |
+
SO000423,2024-01-25,2024-02-22,CUST00028,Customer CUST00028,PRD041,Product I,56,419.7,23503.07,USD,North,Delivered,REP19
|
| 425 |
+
SO000424,2024-12-29,2025-01-23,CUST00071,Customer CUST00071,PRD011,Product C,19,428.94,8149.81,USD,Central,In Process,REP14
|
| 426 |
+
SO000425,2024-01-30,2024-02-13,CUST00018,Customer CUST00018,PRD036,Product C,48,111.9,5371.13,USD,West,Open,REP15
|
| 427 |
+
SO000426,2024-08-07,2024-09-02,CUST00057,Customer CUST00057,PRD079,Product A,45,230.73,10383.05,USD,Central,Delivered,REP10
|
| 428 |
+
SO000427,2024-08-08,2024-08-17,CUST00083,Customer CUST00083,PRD004,Product C,54,367.33,19835.55,USD,East,Delivered,REP11
|
| 429 |
+
SO000428,2024-05-01,2024-05-18,CUST00096,Customer CUST00096,PRD098,Product B,62,422.74,26209.85,USD,North,Open,REP15
|
| 430 |
+
SO000429,2024-02-17,2024-02-27,CUST00008,Customer CUST00008,PRD096,Product I,58,393.16,22803.3,USD,Central,In Process,REP17
|
| 431 |
+
SO000430,2024-12-20,2024-12-31,CUST00083,Customer CUST00083,PRD058,Product G,92,105.54,9709.48,USD,West,In Process,REP17
|
| 432 |
+
SO000431,2024-08-02,2024-08-11,CUST00021,Customer CUST00021,PRD042,Product J,36,427.77,15399.6,USD,Central,Delivered,REP12
|
| 433 |
+
SO000432,2024-06-18,2024-07-07,CUST00011,Customer CUST00011,PRD059,Product F,16,109.1,1745.67,USD,East,Open,REP02
|
| 434 |
+
SO000433,2024-04-03,2024-04-21,CUST00010,Customer CUST00010,PRD023,Product A,90,351.12,31600.49,USD,West,In Process,REP18
|
| 435 |
+
SO000434,2024-11-13,2024-12-06,CUST00062,Customer CUST00062,PRD045,Product F,67,470.14,31499.62,USD,Central,In Process,REP14
|
| 436 |
+
SO000435,2024-09-25,2024-10-05,CUST00007,Customer CUST00007,PRD070,Product F,74,334.36,24742.99,USD,West,In Process,REP05
|
| 437 |
+
SO000436,2024-12-05,2024-12-23,CUST00033,Customer CUST00033,PRD035,Product H,1,237.36,237.36,USD,Central,Delivered,REP15
|
| 438 |
+
SO000437,2024-01-05,2024-01-25,CUST00050,Customer CUST00050,PRD029,Product F,89,449.98,40048.26,USD,East,Delivered,REP07
|
| 439 |
+
SO000438,2024-04-13,2024-05-02,CUST00018,Customer CUST00018,PRD048,Product B,8,132.01,1056.11,USD,Central,Open,REP12
|
| 440 |
+
SO000439,2024-10-25,2024-11-10,CUST00067,Customer CUST00067,PRD035,Product C,95,29.77,2828.33,USD,Central,In Process,REP11
|
| 441 |
+
SO000440,2024-07-05,2024-08-01,CUST00054,Customer CUST00054,PRD032,Product E,35,17.71,619.99,USD,South,Delivered,REP15
|
| 442 |
+
SO000441,2024-09-12,2024-09-29,CUST00058,Customer CUST00058,PRD083,Product C,3,316.06,948.18,USD,Central,In Process,REP04
|
| 443 |
+
SO000442,2024-03-01,2024-03-26,CUST00043,Customer CUST00043,PRD083,Product B,74,77.83,5759.67,USD,North,In Process,REP11
|
| 444 |
+
SO000443,2024-04-19,2024-04-27,CUST00055,Customer CUST00055,PRD050,Product E,63,113.7,7163.2,USD,East,In Process,REP04
|
| 445 |
+
SO000444,2024-09-02,2024-09-25,CUST00042,Customer CUST00042,PRD061,Product D,38,300.65,11424.61,USD,East,Cancelled,REP18
|
| 446 |
+
SO000445,2024-06-03,2024-07-02,CUST00054,Customer CUST00054,PRD041,Product B,87,463.27,40304.76,USD,West,Delivered,REP09
|
| 447 |
+
SO000446,2024-06-30,2024-07-16,CUST00022,Customer CUST00022,PRD076,Product C,65,321.61,20904.7,USD,West,In Process,REP18
|
| 448 |
+
SO000447,2024-07-27,2024-08-16,CUST00014,Customer CUST00014,PRD043,Product B,20,345.84,6916.87,USD,North,Delivered,REP15
|
| 449 |
+
SO000448,2024-09-24,2024-10-08,CUST00020,Customer CUST00020,PRD077,Product F,3,323.13,969.38,USD,South,In Process,REP02
|
| 450 |
+
SO000449,2024-10-19,2024-11-11,CUST00066,Customer CUST00066,PRD022,Product D,54,295.76,15971.23,USD,West,In Process,REP08
|
| 451 |
+
SO000450,2024-01-29,2024-02-12,CUST00090,Customer CUST00090,PRD045,Product A,84,441.68,37100.85,USD,East,In Process,REP15
|
| 452 |
+
SO000451,2024-06-03,2024-06-30,CUST00087,Customer CUST00087,PRD081,Product H,73,498.65,36401.2,USD,West,In Process,REP15
|
| 453 |
+
SO000452,2024-08-10,2024-09-08,CUST00057,Customer CUST00057,PRD053,Product H,79,425.22,33592.39,USD,West,In Process,REP12
|
| 454 |
+
SO000453,2024-09-29,2024-10-15,CUST00094,Customer CUST00094,PRD020,Product C,11,396.81,4364.92,USD,West,Open,REP18
|
| 455 |
+
SO000454,2024-12-23,2025-01-08,CUST00032,Customer CUST00032,PRD040,Product D,15,82.17,1232.48,USD,East,Cancelled,REP08
|
| 456 |
+
SO000455,2024-10-22,2024-11-09,CUST00056,Customer CUST00056,PRD060,Product G,11,169.86,1868.51,USD,Central,In Process,REP10
|
| 457 |
+
SO000456,2024-02-08,2024-03-02,CUST00036,Customer CUST00036,PRD088,Product D,26,406.42,10566.96,USD,South,In Process,REP02
|
| 458 |
+
SO000457,2024-01-31,2024-02-29,CUST00011,Customer CUST00011,PRD060,Product E,64,294.54,18850.72,USD,East,Open,REP17
|
| 459 |
+
SO000458,2024-03-05,2024-04-03,CUST00095,Customer CUST00095,PRD009,Product J,57,360.44,20545.16,USD,Central,In Process,REP13
|
| 460 |
+
SO000459,2024-03-29,2024-04-20,CUST00018,Customer CUST00018,PRD063,Product C,76,390.75,29697.32,USD,South,In Process,REP07
|
| 461 |
+
SO000460,2024-01-13,2024-02-05,CUST00032,Customer CUST00032,PRD077,Product I,40,192.02,7680.76,USD,East,Delivered,REP16
|
| 462 |
+
SO000461,2024-07-19,2024-08-06,CUST00044,Customer CUST00044,PRD018,Product F,83,332.46,27594.22,USD,North,Delivered,REP16
|
| 463 |
+
SO000462,2024-10-21,2024-10-31,CUST00059,Customer CUST00059,PRD006,Product I,96,71.74,6887.14,USD,Central,Delivered,REP19
|
| 464 |
+
SO000463,2024-03-17,2024-04-06,CUST00095,Customer CUST00095,PRD059,Product F,4,485.42,1941.66,USD,North,Delivered,REP06
|
| 465 |
+
SO000464,2024-07-09,2024-07-21,CUST00092,Customer CUST00092,PRD098,Product E,94,428.59,40287.25,USD,East,Open,REP16
|
| 466 |
+
SO000465,2024-04-05,2024-04-17,CUST00072,Customer CUST00072,PRD059,Product G,72,191.87,13814.86,USD,East,Cancelled,REP12
|
| 467 |
+
SO000466,2024-06-25,2024-07-06,CUST00062,Customer CUST00062,PRD022,Product D,89,22.37,1990.6,USD,Central,Delivered,REP04
|
| 468 |
+
SO000467,2024-01-13,2024-02-01,CUST00042,Customer CUST00042,PRD036,Product B,49,317.39,15552.17,USD,Central,In Process,REP01
|
| 469 |
+
SO000468,2024-09-29,2024-10-13,CUST00091,Customer CUST00091,PRD059,Product G,46,308.87,14208.08,USD,East,In Process,REP13
|
| 470 |
+
SO000469,2024-08-16,2024-09-08,CUST00028,Customer CUST00028,PRD017,Product I,61,85.7,5227.77,USD,South,Delivered,REP07
|
| 471 |
+
SO000470,2024-01-13,2024-02-06,CUST00093,Customer CUST00093,PRD081,Product B,13,340.46,4425.93,USD,Central,Open,REP08
|
| 472 |
+
SO000471,2024-04-25,2024-05-16,CUST00073,Customer CUST00073,PRD052,Product D,74,389.04,28789.02,USD,Central,Open,REP01
|
| 473 |
+
SO000472,2024-11-08,2024-12-04,CUST00009,Customer CUST00009,PRD009,Product F,1,400.04,400.04,USD,East,In Process,REP15
|
| 474 |
+
SO000473,2024-05-19,2024-05-26,CUST00078,Customer CUST00078,PRD065,Product I,57,102.68,5852.66,USD,East,Open,REP11
|
| 475 |
+
SO000474,2024-08-19,2024-09-04,CUST00062,Customer CUST00062,PRD093,Product C,11,288.55,3174.03,USD,North,In Process,REP08
|
| 476 |
+
SO000475,2024-02-25,2024-03-08,CUST00086,Customer CUST00086,PRD049,Product B,37,377.22,13957.09,USD,East,Delivered,REP03
|
| 477 |
+
SO000476,2024-05-18,2024-06-10,CUST00021,Customer CUST00021,PRD017,Product C,66,337.26,22258.85,USD,East,Delivered,REP06
|
| 478 |
+
SO000477,2024-05-26,2024-06-07,CUST00028,Customer CUST00028,PRD086,Product B,38,474.11,18016.15,USD,East,Delivered,REP17
|
| 479 |
+
SO000478,2024-10-25,2024-11-04,CUST00058,Customer CUST00058,PRD060,Product D,58,360.86,20930.14,USD,North,In Process,REP14
|
| 480 |
+
SO000479,2024-03-23,2024-04-01,CUST00056,Customer CUST00056,PRD072,Product A,42,178.26,7486.9,USD,North,Cancelled,REP16
|
| 481 |
+
SO000480,2024-05-16,2024-06-06,CUST00016,Customer CUST00016,PRD034,Product H,76,143.75,10924.66,USD,Central,In Process,REP03
|
| 482 |
+
SO000481,2024-09-06,2024-10-04,CUST00073,Customer CUST00073,PRD024,Product J,20,379.4,7587.91,USD,South,Open,REP05
|
| 483 |
+
SO000482,2024-07-13,2024-08-04,CUST00015,Customer CUST00015,PRD034,Product C,76,433.83,32971.21,USD,West,In Process,REP18
|
| 484 |
+
SO000483,2024-12-05,2024-12-23,CUST00087,Customer CUST00087,PRD066,Product D,87,156.44,13610.28,USD,North,In Process,REP03
|
| 485 |
+
SO000484,2024-05-28,2024-06-23,CUST00049,Customer CUST00049,PRD038,Product D,86,94.94,8164.68,USD,Central,Delivered,REP15
|
| 486 |
+
SO000485,2024-09-06,2024-09-26,CUST00052,Customer CUST00052,PRD047,Product I,21,295.97,6215.3,USD,South,Delivered,REP04
|
| 487 |
+
SO000486,2024-03-31,2024-04-24,CUST00021,Customer CUST00021,PRD010,Product C,86,266.34,22905.25,USD,East,In Process,REP17
|
| 488 |
+
SO000487,2024-07-18,2024-08-16,CUST00075,Customer CUST00075,PRD093,Product E,53,237.35,12579.6,USD,East,Cancelled,REP05
|
| 489 |
+
SO000488,2024-03-13,2024-04-04,CUST00002,Customer CUST00002,PRD076,Product A,60,312.3,18738.15,USD,East,Delivered,REP07
|
| 490 |
+
SO000489,2024-03-30,2024-04-18,CUST00072,Customer CUST00072,PRD058,Product F,92,491.95,45259.21,USD,North,Open,REP15
|
| 491 |
+
SO000490,2024-06-10,2024-07-09,CUST00031,Customer CUST00031,PRD065,Product D,89,349.09,31068.61,USD,Central,Delivered,REP10
|
| 492 |
+
SO000491,2024-06-30,2024-07-16,CUST00021,Customer CUST00021,PRD062,Product A,22,243.9,5365.84,USD,Central,Delivered,REP15
|
| 493 |
+
SO000492,2024-09-29,2024-10-22,CUST00090,Customer CUST00090,PRD014,Product A,38,238.68,9069.83,USD,Central,Delivered,REP15
|
| 494 |
+
SO000493,2024-03-12,2024-04-02,CUST00054,Customer CUST00054,PRD069,Product A,31,158.61,4916.91,USD,East,Open,REP17
|
| 495 |
+
SO000494,2024-08-04,2024-08-12,CUST00026,Customer CUST00026,PRD018,Product E,90,209.8,18881.69,USD,East,Delivered,REP04
|
| 496 |
+
SO000495,2024-09-29,2024-10-19,CUST00078,Customer CUST00078,PRD035,Product G,44,67.02,2948.69,USD,East,Delivered,REP17
|
| 497 |
+
SO000496,2024-04-09,2024-04-18,CUST00032,Customer CUST00032,PRD071,Product J,48,32.93,1580.4,USD,Central,In Process,REP11
|
| 498 |
+
SO000497,2024-02-19,2024-02-26,CUST00099,Customer CUST00099,PRD068,Product D,13,270.51,3516.68,USD,Central,Open,REP08
|
| 499 |
+
SO000498,2024-07-05,2024-07-27,CUST00092,Customer CUST00092,PRD003,Product D,45,117.84,5302.96,USD,Central,Delivered,REP08
|
| 500 |
+
SO000499,2024-10-06,2024-10-27,CUST00043,Customer CUST00043,PRD057,Product I,45,419.88,18894.79,USD,West,Cancelled,REP16
|
| 501 |
+
SO000500,2024-10-12,2024-10-28,CUST00018,Customer CUST00018,PRD045,Product B,69,392.67,27094.39,USD,West,In Process,REP05
|
requirements.txt
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
mesop>=0.4.0
|
| 2 |
+
pandas>=2.0.0
|
| 3 |
+
numpy>=1.24.0
|
| 4 |
+
#sap-rpt-oss
|
| 5 |
+
huggingface_hub>=0.20.0
|
| 6 |
+
plotly>=5.17.0
|
| 7 |
+
requests>=2.31.0
|
| 8 |
+
python-dotenv>=1.0.0
|
| 9 |
+
scikit-learn>=1.3.0
|
| 10 |
+
gradio
|
| 11 |
+
pyarrow>=10.0.0
|
| 12 |
+
pyzmq>=25.0.0
|
| 13 |
+
|
utils/__init__.py
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Utils package
|
| 2 |
+
|
utils/data_generator.py
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Synthetic SAP Finance Data Generator
|
| 3 |
+
|
| 4 |
+
Generates synthetic datasets for:
|
| 5 |
+
- General Ledger accounts with transactions
|
| 6 |
+
- Financial Statements (P&L and Balance Sheet)
|
| 7 |
+
- Sales Order data
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
import pandas as pd
|
| 11 |
+
import numpy as np
|
| 12 |
+
from datetime import datetime, timedelta
|
| 13 |
+
import os
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
def generate_gl_accounts(num_transactions=1000, output_path="data/synthetic_gl_accounts.csv"):
|
| 17 |
+
"""Generate synthetic General Ledger accounts with transactions."""
|
| 18 |
+
|
| 19 |
+
# Account codes and descriptions
|
| 20 |
+
account_codes = [
|
| 21 |
+
"100000", "110000", "120000", "130000", "140000", # Assets
|
| 22 |
+
"200000", "210000", "220000", "230000", # Liabilities
|
| 23 |
+
"300000", "310000", "320000", # Equity
|
| 24 |
+
"400000", "410000", "420000", "430000", # Revenue
|
| 25 |
+
"500000", "510000", "520000", "530000", "540000", # Expenses
|
| 26 |
+
]
|
| 27 |
+
|
| 28 |
+
account_descriptions = [
|
| 29 |
+
"Cash and Cash Equivalents", "Accounts Receivable", "Inventory",
|
| 30 |
+
"Prepaid Expenses", "Property, Plant & Equipment",
|
| 31 |
+
"Accounts Payable", "Accrued Liabilities", "Short-term Debt", "Long-term Debt",
|
| 32 |
+
"Common Stock", "Retained Earnings", "Other Equity",
|
| 33 |
+
"Sales Revenue", "Service Revenue", "Interest Income", "Other Income",
|
| 34 |
+
"Cost of Goods Sold", "Salaries and Wages", "Rent Expense",
|
| 35 |
+
"Utilities Expense", "Marketing Expense"
|
| 36 |
+
]
|
| 37 |
+
|
| 38 |
+
np.random.seed(42)
|
| 39 |
+
|
| 40 |
+
transactions = []
|
| 41 |
+
base_date = datetime(2024, 1, 1)
|
| 42 |
+
|
| 43 |
+
for i in range(num_transactions):
|
| 44 |
+
account_idx = np.random.randint(0, len(account_codes))
|
| 45 |
+
transaction_date = base_date + timedelta(days=np.random.randint(0, 365))
|
| 46 |
+
|
| 47 |
+
# Determine if debit or credit based on account type
|
| 48 |
+
account_num = int(account_codes[account_idx][0])
|
| 49 |
+
if account_num in [1, 5]: # Assets or Expenses
|
| 50 |
+
debit = np.random.uniform(100, 50000)
|
| 51 |
+
credit = 0
|
| 52 |
+
else: # Liabilities, Equity, Revenue
|
| 53 |
+
debit = 0
|
| 54 |
+
credit = np.random.uniform(100, 50000)
|
| 55 |
+
|
| 56 |
+
transactions.append({
|
| 57 |
+
"Transaction_ID": f"TXN{str(i+1).zfill(6)}",
|
| 58 |
+
"Date": transaction_date.strftime("%Y-%m-%d"),
|
| 59 |
+
"Account_Code": account_codes[account_idx],
|
| 60 |
+
"Account_Description": account_descriptions[account_idx],
|
| 61 |
+
"Debit": round(debit, 2),
|
| 62 |
+
"Credit": round(credit, 2),
|
| 63 |
+
"Balance": round(debit - credit, 2),
|
| 64 |
+
"Document_Number": f"DOC{str(np.random.randint(1000, 9999))}",
|
| 65 |
+
"Posting_Period": transaction_date.strftime("%Y-%m")
|
| 66 |
+
})
|
| 67 |
+
|
| 68 |
+
df = pd.DataFrame(transactions)
|
| 69 |
+
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
| 70 |
+
df.to_csv(output_path, index=False)
|
| 71 |
+
print(f"Generated {num_transactions} GL transactions: {output_path}")
|
| 72 |
+
return df
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
def generate_financial_statements(num_periods=12, output_path="data/synthetic_financial_statements.csv"):
|
| 76 |
+
"""Generate synthetic Financial Statements (P&L and Balance Sheet)."""
|
| 77 |
+
|
| 78 |
+
np.random.seed(42)
|
| 79 |
+
base_date = datetime(2024, 1, 1)
|
| 80 |
+
|
| 81 |
+
statements = []
|
| 82 |
+
|
| 83 |
+
for period in range(num_periods):
|
| 84 |
+
period_date = base_date + timedelta(days=period * 30)
|
| 85 |
+
period_str = period_date.strftime("%Y-%m")
|
| 86 |
+
|
| 87 |
+
# Profit & Loss Statement
|
| 88 |
+
revenue = np.random.uniform(500000, 1000000)
|
| 89 |
+
cogs = revenue * np.random.uniform(0.4, 0.6)
|
| 90 |
+
gross_profit = revenue - cogs
|
| 91 |
+
|
| 92 |
+
operating_expenses = np.random.uniform(200000, 400000)
|
| 93 |
+
ebitda = gross_profit - operating_expenses
|
| 94 |
+
depreciation = np.random.uniform(20000, 50000)
|
| 95 |
+
ebit = ebitda - depreciation
|
| 96 |
+
interest_expense = np.random.uniform(10000, 30000)
|
| 97 |
+
ebt = ebit - interest_expense
|
| 98 |
+
tax = ebt * 0.25
|
| 99 |
+
net_income = ebt - tax
|
| 100 |
+
|
| 101 |
+
# Balance Sheet
|
| 102 |
+
cash = np.random.uniform(100000, 500000)
|
| 103 |
+
accounts_receivable = np.random.uniform(200000, 400000)
|
| 104 |
+
inventory = np.random.uniform(150000, 300000)
|
| 105 |
+
current_assets = cash + accounts_receivable + inventory
|
| 106 |
+
ppe = np.random.uniform(2000000, 5000000)
|
| 107 |
+
total_assets = current_assets + ppe
|
| 108 |
+
|
| 109 |
+
accounts_payable = np.random.uniform(100000, 200000)
|
| 110 |
+
short_term_debt = np.random.uniform(50000, 150000)
|
| 111 |
+
current_liabilities = accounts_payable + short_term_debt
|
| 112 |
+
long_term_debt = np.random.uniform(1000000, 2000000)
|
| 113 |
+
total_liabilities = current_liabilities + long_term_debt
|
| 114 |
+
|
| 115 |
+
equity = total_assets - total_liabilities
|
| 116 |
+
|
| 117 |
+
statements.append({
|
| 118 |
+
"Period": period_str,
|
| 119 |
+
"Statement_Type": "P&L",
|
| 120 |
+
"Revenue": round(revenue, 2),
|
| 121 |
+
"Cost_of_Goods_Sold": round(cogs, 2),
|
| 122 |
+
"Gross_Profit": round(gross_profit, 2),
|
| 123 |
+
"Operating_Expenses": round(operating_expenses, 2),
|
| 124 |
+
"EBITDA": round(ebitda, 2),
|
| 125 |
+
"Depreciation": round(depreciation, 2),
|
| 126 |
+
"EBIT": round(ebit, 2),
|
| 127 |
+
"Interest_Expense": round(interest_expense, 2),
|
| 128 |
+
"EBT": round(ebt, 2),
|
| 129 |
+
"Tax": round(tax, 2),
|
| 130 |
+
"Net_Income": round(net_income, 2),
|
| 131 |
+
"Cash": round(cash, 2),
|
| 132 |
+
"Accounts_Receivable": round(accounts_receivable, 2),
|
| 133 |
+
"Inventory": round(inventory, 2),
|
| 134 |
+
"Current_Assets": round(current_assets, 2),
|
| 135 |
+
"PPE": round(ppe, 2),
|
| 136 |
+
"Total_Assets": round(total_assets, 2),
|
| 137 |
+
"Accounts_Payable": round(accounts_payable, 2),
|
| 138 |
+
"Short_Term_Debt": round(short_term_debt, 2),
|
| 139 |
+
"Current_Liabilities": round(current_liabilities, 2),
|
| 140 |
+
"Long_Term_Debt": round(long_term_debt, 2),
|
| 141 |
+
"Total_Liabilities": round(total_liabilities, 2),
|
| 142 |
+
"Equity": round(equity, 2)
|
| 143 |
+
})
|
| 144 |
+
|
| 145 |
+
df = pd.DataFrame(statements)
|
| 146 |
+
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
| 147 |
+
df.to_csv(output_path, index=False)
|
| 148 |
+
print(f"Generated {num_periods} financial statement periods: {output_path}")
|
| 149 |
+
return df
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
def generate_sales_orders(num_orders=500, output_path="data/synthetic_sales_orders.csv"):
|
| 153 |
+
"""Generate synthetic Sales Order data."""
|
| 154 |
+
|
| 155 |
+
np.random.seed(42)
|
| 156 |
+
base_date = datetime(2024, 1, 1)
|
| 157 |
+
|
| 158 |
+
products = [
|
| 159 |
+
"Product A", "Product B", "Product C", "Product D", "Product E",
|
| 160 |
+
"Product F", "Product G", "Product H", "Product I", "Product J"
|
| 161 |
+
]
|
| 162 |
+
|
| 163 |
+
customers = [f"CUST{str(i).zfill(5)}" for i in range(1, 101)]
|
| 164 |
+
regions = ["North", "South", "East", "West", "Central"]
|
| 165 |
+
|
| 166 |
+
orders = []
|
| 167 |
+
|
| 168 |
+
for i in range(num_orders):
|
| 169 |
+
order_date = base_date + timedelta(days=np.random.randint(0, 365))
|
| 170 |
+
delivery_date = order_date + timedelta(days=np.random.randint(7, 30))
|
| 171 |
+
|
| 172 |
+
customer = np.random.choice(customers)
|
| 173 |
+
product = np.random.choice(products)
|
| 174 |
+
quantity = np.random.randint(1, 100)
|
| 175 |
+
unit_price = np.random.uniform(10, 500)
|
| 176 |
+
total_amount = quantity * unit_price
|
| 177 |
+
region = np.random.choice(regions)
|
| 178 |
+
|
| 179 |
+
order_status = np.random.choice(
|
| 180 |
+
["Open", "In Process", "Delivered", "Cancelled"],
|
| 181 |
+
p=[0.2, 0.3, 0.4, 0.1]
|
| 182 |
+
)
|
| 183 |
+
|
| 184 |
+
orders.append({
|
| 185 |
+
"Order_Number": f"SO{str(i+1).zfill(6)}",
|
| 186 |
+
"Order_Date": order_date.strftime("%Y-%m-%d"),
|
| 187 |
+
"Delivery_Date": delivery_date.strftime("%Y-%m-%d"),
|
| 188 |
+
"Customer_ID": customer,
|
| 189 |
+
"Customer_Name": f"Customer {customer}",
|
| 190 |
+
"Product_Code": f"PRD{str(np.random.randint(1, 100)).zfill(3)}",
|
| 191 |
+
"Product_Name": product,
|
| 192 |
+
"Quantity": quantity,
|
| 193 |
+
"Unit_Price": round(unit_price, 2),
|
| 194 |
+
"Total_Amount": round(total_amount, 2),
|
| 195 |
+
"Currency": "USD",
|
| 196 |
+
"Region": region,
|
| 197 |
+
"Status": order_status,
|
| 198 |
+
"Sales_Rep": f"REP{str(np.random.randint(1, 20)).zfill(2)}"
|
| 199 |
+
})
|
| 200 |
+
|
| 201 |
+
df = pd.DataFrame(orders)
|
| 202 |
+
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
| 203 |
+
df.to_csv(output_path, index=False)
|
| 204 |
+
print(f"Generated {num_orders} sales orders: {output_path}")
|
| 205 |
+
return df
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
def generate_all_datasets():
|
| 209 |
+
"""Generate all synthetic datasets."""
|
| 210 |
+
print("Generating synthetic SAP finance datasets...")
|
| 211 |
+
generate_gl_accounts()
|
| 212 |
+
generate_financial_statements()
|
| 213 |
+
generate_sales_orders()
|
| 214 |
+
print("All datasets generated successfully!")
|
| 215 |
+
|
| 216 |
+
|
| 217 |
+
if __name__ == "__main__":
|
| 218 |
+
generate_all_datasets()
|
| 219 |
+
|
utils/odata_connector.py
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
SAP OData Connector
|
| 3 |
+
|
| 4 |
+
Implements SAPFinanceConnector class for connecting to SAP OData services
|
| 5 |
+
and fetching sales orders, products, line items, and business partners.
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
import os
|
| 9 |
+
import json
|
| 10 |
+
import logging
|
| 11 |
+
import requests
|
| 12 |
+
import pandas as pd
|
| 13 |
+
from dotenv import load_dotenv
|
| 14 |
+
|
| 15 |
+
load_dotenv()
|
| 16 |
+
|
| 17 |
+
logging.basicConfig(level=logging.INFO)
|
| 18 |
+
logger = logging.getLogger(__name__)
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
class SAPFinanceConnector:
|
| 22 |
+
"""Connector for SAP OData API services."""
|
| 23 |
+
|
| 24 |
+
def __init__(self, verify_ssl=False):
|
| 25 |
+
"""
|
| 26 |
+
Initialize the SAP Finance Connector.
|
| 27 |
+
|
| 28 |
+
Args:
|
| 29 |
+
verify_ssl: Whether to verify SSL certificates
|
| 30 |
+
"""
|
| 31 |
+
self.user = os.getenv("SAP_USERNAME")
|
| 32 |
+
self.pw = os.getenv("SAP_PASSWORD")
|
| 33 |
+
self.base = os.getenv("SAP_BASE_URL", "https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC")
|
| 34 |
+
self.client = os.getenv("SAP_CLIENT", "002")
|
| 35 |
+
self.headers = {"Accept": "application/json", "x-csrf-token": "Fetch"}
|
| 36 |
+
self.cookies = None
|
| 37 |
+
self.verify_ssl = verify_ssl
|
| 38 |
+
|
| 39 |
+
if not self.user or not self.pw:
|
| 40 |
+
logging.warning("SAP_USERNAME or SAP_PASSWORD environment variable not set.")
|
| 41 |
+
|
| 42 |
+
def test_connection(self):
|
| 43 |
+
"""
|
| 44 |
+
Test the connection to SAP OData service.
|
| 45 |
+
|
| 46 |
+
Returns:
|
| 47 |
+
Tuple of (success: bool, message: str)
|
| 48 |
+
"""
|
| 49 |
+
if not self.user or not self.pw:
|
| 50 |
+
return False, "SAP credentials not set in environment variables."
|
| 51 |
+
|
| 52 |
+
metadata_url = f"{self.base}/$metadata"
|
| 53 |
+
try:
|
| 54 |
+
logging.info(f"Attempting to connect to SAP metadata URL: {metadata_url} with client {self.client}")
|
| 55 |
+
r = requests.get(
|
| 56 |
+
metadata_url,
|
| 57 |
+
auth=(self.user, self.pw),
|
| 58 |
+
headers={"Accept": "application/xml"},
|
| 59 |
+
params={"sap-client": self.client},
|
| 60 |
+
verify=self.verify_ssl,
|
| 61 |
+
timeout=20
|
| 62 |
+
)
|
| 63 |
+
r.raise_for_status()
|
| 64 |
+
self.cookies = r.cookies
|
| 65 |
+
tok = r.headers.get("x-csrf-token")
|
| 66 |
+
if tok:
|
| 67 |
+
self.headers['x-csrf-token'] = tok
|
| 68 |
+
logging.info("SAP Connection successful, CSRF token fetched.")
|
| 69 |
+
return True, "Connected successfully."
|
| 70 |
+
else:
|
| 71 |
+
logging.warning("SAP Connection successful, but x-csrf-token not found.")
|
| 72 |
+
return True, "Connected (Warning: CSRF token missing)."
|
| 73 |
+
except requests.exceptions.Timeout:
|
| 74 |
+
logging.error(f"SAP connection timed out: {metadata_url}")
|
| 75 |
+
return False, "Connection timed out."
|
| 76 |
+
except requests.exceptions.HTTPError as e:
|
| 77 |
+
logging.error(f"SAP connection HTTP error: {e.response.status_code} - {e.response.text[:200]}")
|
| 78 |
+
return False, f"Connection failed (HTTP {e.response.status_code}). Check URL/Credentials/Client."
|
| 79 |
+
except requests.exceptions.RequestException as e:
|
| 80 |
+
logging.error(f"SAP connection failed: {e}")
|
| 81 |
+
return False, f"Connection failed: {type(e).__name__}. Check network/URL."
|
| 82 |
+
except Exception as e:
|
| 83 |
+
logging.error(f"An unexpected error occurred during SAP connection test: {e}", exc_info=True)
|
| 84 |
+
return False, f"An unexpected error occurred: {e}"
|
| 85 |
+
|
| 86 |
+
def fetch(self, entity, top):
|
| 87 |
+
"""
|
| 88 |
+
Fetch data from a specific OData entity.
|
| 89 |
+
|
| 90 |
+
Args:
|
| 91 |
+
entity: Entity name (e.g., "SalesOrderSet")
|
| 92 |
+
top: Maximum number of records to fetch
|
| 93 |
+
|
| 94 |
+
Returns:
|
| 95 |
+
List of records as dictionaries
|
| 96 |
+
"""
|
| 97 |
+
if not self.cookies or 'x-csrf-token' not in self.headers.get('x-csrf-token', ''):
|
| 98 |
+
logging.warning(f"Attempting to fetch {entity} without established connection/CSRF token.")
|
| 99 |
+
connected, msg = self.test_connection()
|
| 100 |
+
if not connected:
|
| 101 |
+
logging.error(f"Cannot fetch {entity}, SAP connection failed: {msg}")
|
| 102 |
+
raise ConnectionError(f"SAP Connection failed: {msg}")
|
| 103 |
+
elif 'x-csrf-token' not in self.headers.get('x-csrf-token', ''):
|
| 104 |
+
logging.warning(f"Proceeding to fetch {entity} without CSRF token. May fail.")
|
| 105 |
+
|
| 106 |
+
url = f"{self.base}/{entity}"
|
| 107 |
+
params = {
|
| 108 |
+
"sap-client": self.client,
|
| 109 |
+
"$format": "json",
|
| 110 |
+
"$top": str(top)
|
| 111 |
+
}
|
| 112 |
+
logging.info(f"Fetching data from: {url} with params: {params}")
|
| 113 |
+
try:
|
| 114 |
+
r = requests.get(url, params=params, auth=(self.user, self.pw), headers=self.headers,
|
| 115 |
+
cookies=self.cookies, verify=self.verify_ssl, timeout=30)
|
| 116 |
+
r.raise_for_status()
|
| 117 |
+
content_type = r.headers.get('Content-Type', '')
|
| 118 |
+
if 'application/json' in content_type:
|
| 119 |
+
# Handle potential empty response or structure variations
|
| 120 |
+
response_json = r.json()
|
| 121 |
+
data = response_json.get('d', {}).get('results', []) if isinstance(response_json.get('d'), dict) else []
|
| 122 |
+
logging.info(f"Successfully fetched {len(data)} records from {entity}.")
|
| 123 |
+
return data
|
| 124 |
+
else:
|
| 125 |
+
logging.error(f"Unexpected Content-Type '{content_type}' for {entity}. Response: {r.text[:200]}")
|
| 126 |
+
raise ValueError(f"Expected JSON response, got {content_type}")
|
| 127 |
+
|
| 128 |
+
except requests.exceptions.Timeout:
|
| 129 |
+
logging.error(f"Timeout occurred while fetching {entity} from {url}")
|
| 130 |
+
raise TimeoutError(f"Timeout fetching {entity}")
|
| 131 |
+
except requests.exceptions.HTTPError as e:
|
| 132 |
+
logging.error(f"HTTP error fetching {entity}: {e.response.status_code} - {e.response.text[:200]}")
|
| 133 |
+
raise ConnectionError(f"HTTP {e.response.status_code} fetching {entity}")
|
| 134 |
+
except requests.exceptions.RequestException as e:
|
| 135 |
+
logging.error(f"Failed to fetch {entity}: {e}")
|
| 136 |
+
raise ConnectionError(f"Request failed for {entity}: {e}")
|
| 137 |
+
except json.JSONDecodeError as e:
|
| 138 |
+
logging.error(f"Failed to decode JSON for {entity}: {e}. Response: {r.text[:500]}")
|
| 139 |
+
raise ValueError(f"Invalid JSON received for {entity}")
|
| 140 |
+
except Exception as e:
|
| 141 |
+
logging.error(f"Unexpected error fetching {entity}: {e}", exc_info=True)
|
| 142 |
+
raise
|
| 143 |
+
|
| 144 |
+
def fetch_orders(self, top=500):
|
| 145 |
+
"""
|
| 146 |
+
Fetch sales orders.
|
| 147 |
+
|
| 148 |
+
Args:
|
| 149 |
+
top: Maximum number of records
|
| 150 |
+
|
| 151 |
+
Returns:
|
| 152 |
+
List of sales order records
|
| 153 |
+
"""
|
| 154 |
+
return self.fetch("SalesOrderSet", top)
|
| 155 |
+
|
| 156 |
+
def fetch_products(self, top=500):
|
| 157 |
+
"""
|
| 158 |
+
Fetch products.
|
| 159 |
+
|
| 160 |
+
Args:
|
| 161 |
+
top: Maximum number of records
|
| 162 |
+
|
| 163 |
+
Returns:
|
| 164 |
+
List of product records
|
| 165 |
+
"""
|
| 166 |
+
return self.fetch("ProductSet", top)
|
| 167 |
+
|
| 168 |
+
def fetch_line_items(self, top=400):
|
| 169 |
+
"""
|
| 170 |
+
Fetch sales order line items.
|
| 171 |
+
|
| 172 |
+
Args:
|
| 173 |
+
top: Maximum number of records
|
| 174 |
+
|
| 175 |
+
Returns:
|
| 176 |
+
List of line item records
|
| 177 |
+
"""
|
| 178 |
+
return self.fetch("SalesOrderLineItemSet", top)
|
| 179 |
+
|
| 180 |
+
def fetch_partners(self, top=500):
|
| 181 |
+
"""
|
| 182 |
+
Fetch business partners.
|
| 183 |
+
|
| 184 |
+
Args:
|
| 185 |
+
top: Maximum number of records
|
| 186 |
+
|
| 187 |
+
Returns:
|
| 188 |
+
List of business partner records
|
| 189 |
+
"""
|
| 190 |
+
return self.fetch("BusinessPartnerSet", top)
|
| 191 |
+
|
| 192 |
+
def fetch_orders_df(self, top=500):
|
| 193 |
+
"""
|
| 194 |
+
Fetch sales orders as a pandas DataFrame.
|
| 195 |
+
|
| 196 |
+
Args:
|
| 197 |
+
top: Maximum number of records
|
| 198 |
+
|
| 199 |
+
Returns:
|
| 200 |
+
pandas DataFrame
|
| 201 |
+
"""
|
| 202 |
+
data = self.fetch_orders(top)
|
| 203 |
+
if data:
|
| 204 |
+
return pd.DataFrame(data)
|
| 205 |
+
return pd.DataFrame()
|
| 206 |
+
|
| 207 |
+
def fetch_products_df(self, top=500):
|
| 208 |
+
"""
|
| 209 |
+
Fetch products as a pandas DataFrame.
|
| 210 |
+
|
| 211 |
+
Args:
|
| 212 |
+
top: Maximum number of records
|
| 213 |
+
|
| 214 |
+
Returns:
|
| 215 |
+
pandas DataFrame
|
| 216 |
+
"""
|
| 217 |
+
data = self.fetch_products(top)
|
| 218 |
+
if data:
|
| 219 |
+
return pd.DataFrame(data)
|
| 220 |
+
return pd.DataFrame()
|
| 221 |
+
|
| 222 |
+
def fetch_line_items_df(self, top=400):
|
| 223 |
+
"""
|
| 224 |
+
Fetch sales order line items as a pandas DataFrame.
|
| 225 |
+
|
| 226 |
+
Args:
|
| 227 |
+
top: Maximum number of records
|
| 228 |
+
|
| 229 |
+
Returns:
|
| 230 |
+
pandas DataFrame
|
| 231 |
+
"""
|
| 232 |
+
data = self.fetch_line_items(top)
|
| 233 |
+
if data:
|
| 234 |
+
return pd.DataFrame(data)
|
| 235 |
+
return pd.DataFrame()
|
| 236 |
+
|
| 237 |
+
def fetch_partners_df(self, top=500):
|
| 238 |
+
"""
|
| 239 |
+
Fetch business partners as a pandas DataFrame.
|
| 240 |
+
|
| 241 |
+
Args:
|
| 242 |
+
top: Maximum number of records
|
| 243 |
+
|
| 244 |
+
Returns:
|
| 245 |
+
pandas DataFrame
|
| 246 |
+
"""
|
| 247 |
+
data = self.fetch_partners(top)
|
| 248 |
+
if data:
|
| 249 |
+
return pd.DataFrame(data)
|
| 250 |
+
return pd.DataFrame()
|
| 251 |
+
|
utils/playground.py
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
SAP-RPT-1-OSS Playground Utilities
|
| 3 |
+
|
| 4 |
+
Functions for handling dataset uploads, previews, training, and results export.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import pandas as pd
|
| 8 |
+
import numpy as np
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
from typing import Tuple, Optional, Dict, Any
|
| 11 |
+
import tempfile
|
| 12 |
+
import os
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def load_dataset(file_path: str) -> Tuple[pd.DataFrame, Optional[str]]:
|
| 16 |
+
"""
|
| 17 |
+
Load dataset from file (CSV, Parquet, or JSON).
|
| 18 |
+
|
| 19 |
+
Args:
|
| 20 |
+
file_path: Path to the dataset file
|
| 21 |
+
|
| 22 |
+
Returns:
|
| 23 |
+
Tuple of (DataFrame, error_message)
|
| 24 |
+
"""
|
| 25 |
+
try:
|
| 26 |
+
file_ext = Path(file_path).suffix.lower()
|
| 27 |
+
|
| 28 |
+
if file_ext == '.csv':
|
| 29 |
+
df = pd.read_csv(file_path)
|
| 30 |
+
elif file_ext == '.parquet':
|
| 31 |
+
df = pd.read_parquet(file_path)
|
| 32 |
+
elif file_ext in ['.json', '.jsonl']:
|
| 33 |
+
df = pd.read_json(file_path, lines=(file_ext == '.jsonl'))
|
| 34 |
+
else:
|
| 35 |
+
return None, f"Unsupported file format: {file_ext}"
|
| 36 |
+
|
| 37 |
+
return df, None
|
| 38 |
+
except Exception as e:
|
| 39 |
+
return None, f"Error loading file: {str(e)}"
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
def detect_task_type(filename: str) -> str:
|
| 43 |
+
"""
|
| 44 |
+
Detect task type from filename.
|
| 45 |
+
|
| 46 |
+
Args:
|
| 47 |
+
filename: Name of the uploaded file
|
| 48 |
+
|
| 49 |
+
Returns:
|
| 50 |
+
'classification' or 'regression'
|
| 51 |
+
"""
|
| 52 |
+
filename_lower = filename.lower()
|
| 53 |
+
if 'classification' in filename_lower:
|
| 54 |
+
return 'classification'
|
| 55 |
+
elif 'regression' in filename_lower:
|
| 56 |
+
return 'regression'
|
| 57 |
+
return 'classification' # Default
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def get_dataset_info(df: pd.DataFrame) -> Dict[str, Any]:
|
| 61 |
+
"""
|
| 62 |
+
Get information about the dataset.
|
| 63 |
+
|
| 64 |
+
Args:
|
| 65 |
+
df: DataFrame to analyze
|
| 66 |
+
|
| 67 |
+
Returns:
|
| 68 |
+
Dictionary with dataset information
|
| 69 |
+
"""
|
| 70 |
+
info = {
|
| 71 |
+
'num_rows': len(df),
|
| 72 |
+
'num_columns': len(df.columns),
|
| 73 |
+
'columns': list(df.columns),
|
| 74 |
+
'numeric_columns': list(df.select_dtypes(include=[np.number]).columns),
|
| 75 |
+
'categorical_columns': list(df.select_dtypes(include=['object', 'category']).columns),
|
| 76 |
+
'missing_values': df.isnull().sum().to_dict(),
|
| 77 |
+
'dtypes': df.dtypes.astype(str).to_dict()
|
| 78 |
+
}
|
| 79 |
+
return info
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
def auto_select_target_column(df: pd.DataFrame, task_type: str) -> Optional[str]:
|
| 83 |
+
"""
|
| 84 |
+
Auto-select target column (defaults to last column).
|
| 85 |
+
|
| 86 |
+
Args:
|
| 87 |
+
df: DataFrame
|
| 88 |
+
task_type: 'classification' or 'regression'
|
| 89 |
+
|
| 90 |
+
Returns:
|
| 91 |
+
Column name or None
|
| 92 |
+
"""
|
| 93 |
+
if len(df.columns) == 0:
|
| 94 |
+
return None
|
| 95 |
+
|
| 96 |
+
# Default to last column
|
| 97 |
+
target = df.columns[-1]
|
| 98 |
+
|
| 99 |
+
# If task type is regression, prefer numeric columns
|
| 100 |
+
if task_type == 'regression':
|
| 101 |
+
numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()
|
| 102 |
+
if numeric_cols:
|
| 103 |
+
# Prefer last numeric column
|
| 104 |
+
for col in reversed(numeric_cols):
|
| 105 |
+
if col == target or df[col].dtype in [np.float64, np.int64]:
|
| 106 |
+
return col
|
| 107 |
+
|
| 108 |
+
return target
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
def detect_task_type_from_column(df: pd.DataFrame, target_column: str) -> str:
|
| 112 |
+
"""
|
| 113 |
+
Detect task type from target column's data type.
|
| 114 |
+
|
| 115 |
+
Args:
|
| 116 |
+
df: DataFrame
|
| 117 |
+
target_column: Name of target column
|
| 118 |
+
|
| 119 |
+
Returns:
|
| 120 |
+
'classification' or 'regression'
|
| 121 |
+
"""
|
| 122 |
+
if target_column not in df.columns:
|
| 123 |
+
return 'classification' # Default
|
| 124 |
+
|
| 125 |
+
target_series = df[target_column]
|
| 126 |
+
|
| 127 |
+
# Check if numeric
|
| 128 |
+
if not pd.api.types.is_numeric_dtype(target_series):
|
| 129 |
+
return 'classification' # Non-numeric = classification
|
| 130 |
+
|
| 131 |
+
# Check if integer-like
|
| 132 |
+
try:
|
| 133 |
+
unique_values = target_series.dropna().nunique()
|
| 134 |
+
if unique_values <= 20: # Few unique values = likely classification
|
| 135 |
+
# Check if values are integer-like
|
| 136 |
+
sample = target_series.dropna().head(100)
|
| 137 |
+
int_values = sample.astype(int)
|
| 138 |
+
float_values = sample.astype(float)
|
| 139 |
+
if (int_values == float_values).all():
|
| 140 |
+
return 'classification'
|
| 141 |
+
|
| 142 |
+
# Many unique numeric values = regression
|
| 143 |
+
return 'regression'
|
| 144 |
+
except:
|
| 145 |
+
return 'regression' # Default to regression for numeric
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
def prepare_train_test_split(
|
| 149 |
+
df: pd.DataFrame,
|
| 150 |
+
target_column: str,
|
| 151 |
+
test_size: float = 0.2
|
| 152 |
+
) -> Tuple[pd.DataFrame, pd.Series, pd.DataFrame, pd.Series]:
|
| 153 |
+
"""
|
| 154 |
+
Prepare train/test split.
|
| 155 |
+
|
| 156 |
+
Args:
|
| 157 |
+
df: Full dataset
|
| 158 |
+
target_column: Name of target column
|
| 159 |
+
test_size: Proportion of test set (0.1 to 0.5)
|
| 160 |
+
|
| 161 |
+
Returns:
|
| 162 |
+
Tuple of (X_train, y_train, X_test, y_test)
|
| 163 |
+
"""
|
| 164 |
+
if target_column not in df.columns:
|
| 165 |
+
raise ValueError(f"Target column '{target_column}' not found in dataset")
|
| 166 |
+
|
| 167 |
+
# Separate features and target
|
| 168 |
+
X = df.drop(columns=[target_column])
|
| 169 |
+
y = df[target_column]
|
| 170 |
+
|
| 171 |
+
# Handle missing values in target
|
| 172 |
+
valid_mask = ~y.isnull()
|
| 173 |
+
X = X[valid_mask]
|
| 174 |
+
y = y[valid_mask]
|
| 175 |
+
|
| 176 |
+
# Calculate split index
|
| 177 |
+
n_total = len(X)
|
| 178 |
+
n_test = int(n_total * test_size)
|
| 179 |
+
n_train = n_total - n_test
|
| 180 |
+
|
| 181 |
+
if n_test == 0:
|
| 182 |
+
n_test = 1
|
| 183 |
+
n_train = n_total - 1
|
| 184 |
+
|
| 185 |
+
# Split
|
| 186 |
+
X_train = X.iloc[:n_train]
|
| 187 |
+
y_train = y.iloc[:n_train]
|
| 188 |
+
X_test = X.iloc[n_train:n_train + n_test]
|
| 189 |
+
y_test = y.iloc[n_train:n_train + n_test]
|
| 190 |
+
|
| 191 |
+
return X_train, y_train, X_test, y_test
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
def preprocess_data(
|
| 195 |
+
df: pd.DataFrame,
|
| 196 |
+
handle_missing: str = 'mean',
|
| 197 |
+
normalize: bool = False
|
| 198 |
+
) -> pd.DataFrame:
|
| 199 |
+
"""
|
| 200 |
+
Preprocess dataset.
|
| 201 |
+
|
| 202 |
+
Args:
|
| 203 |
+
df: DataFrame to preprocess
|
| 204 |
+
handle_missing: How to handle missing values ('mean', 'median', 'drop', 'zero')
|
| 205 |
+
normalize: Whether to normalize numeric columns
|
| 206 |
+
|
| 207 |
+
Returns:
|
| 208 |
+
Preprocessed DataFrame
|
| 209 |
+
"""
|
| 210 |
+
df_processed = df.copy()
|
| 211 |
+
|
| 212 |
+
# Handle missing values
|
| 213 |
+
numeric_cols = df_processed.select_dtypes(include=[np.number]).columns
|
| 214 |
+
|
| 215 |
+
if handle_missing == 'mean':
|
| 216 |
+
df_processed[numeric_cols] = df_processed[numeric_cols].fillna(
|
| 217 |
+
df_processed[numeric_cols].mean()
|
| 218 |
+
)
|
| 219 |
+
elif handle_missing == 'median':
|
| 220 |
+
df_processed[numeric_cols] = df_processed[numeric_cols].fillna(
|
| 221 |
+
df_processed[numeric_cols].median()
|
| 222 |
+
)
|
| 223 |
+
elif handle_missing == 'zero':
|
| 224 |
+
df_processed[numeric_cols] = df_processed[numeric_cols].fillna(0)
|
| 225 |
+
elif handle_missing == 'drop':
|
| 226 |
+
df_processed = df_processed.dropna(subset=numeric_cols)
|
| 227 |
+
|
| 228 |
+
# Normalize numeric columns
|
| 229 |
+
if normalize:
|
| 230 |
+
from sklearn.preprocessing import StandardScaler
|
| 231 |
+
scaler = StandardScaler()
|
| 232 |
+
df_processed[numeric_cols] = scaler.fit_transform(df_processed[numeric_cols])
|
| 233 |
+
|
| 234 |
+
return df_processed
|
| 235 |
+
|
| 236 |
+
|
| 237 |
+
def export_results(
|
| 238 |
+
X_test: pd.DataFrame,
|
| 239 |
+
y_test: pd.Series,
|
| 240 |
+
predictions: np.ndarray,
|
| 241 |
+
task_type: str,
|
| 242 |
+
filename_prefix: str = "results"
|
| 243 |
+
) -> str:
|
| 244 |
+
"""
|
| 245 |
+
Export results to CSV file.
|
| 246 |
+
|
| 247 |
+
Args:
|
| 248 |
+
X_test: Test features
|
| 249 |
+
y_test: True target values
|
| 250 |
+
predictions: Model predictions
|
| 251 |
+
task_type: 'classification' or 'regression'
|
| 252 |
+
filename_prefix: Prefix for output filename
|
| 253 |
+
|
| 254 |
+
Returns:
|
| 255 |
+
Path to exported CSV file
|
| 256 |
+
"""
|
| 257 |
+
# Create results DataFrame
|
| 258 |
+
results_df = X_test.copy()
|
| 259 |
+
results_df['true_value'] = y_test.values
|
| 260 |
+
|
| 261 |
+
if task_type == 'classification':
|
| 262 |
+
results_df['predicted_class'] = predictions
|
| 263 |
+
else:
|
| 264 |
+
# Regression - format with comma for decimal separator
|
| 265 |
+
results_df['predicted_value'] = predictions
|
| 266 |
+
|
| 267 |
+
# Save to temporary file
|
| 268 |
+
temp_dir = tempfile.gettempdir()
|
| 269 |
+
output_path = os.path.join(temp_dir, f"{filename_prefix}_results.csv")
|
| 270 |
+
|
| 271 |
+
results_df.to_csv(output_path, index=False)
|
| 272 |
+
|
| 273 |
+
return output_path
|
| 274 |
+
|
| 275 |
+
|
| 276 |
+
def check_embedding_server() -> Tuple[bool, str]:
|
| 277 |
+
"""
|
| 278 |
+
Check if embedding server is running.
|
| 279 |
+
|
| 280 |
+
Returns:
|
| 281 |
+
Tuple of (is_running, message)
|
| 282 |
+
"""
|
| 283 |
+
# First check if packages are available (but don't fail if import path is different)
|
| 284 |
+
try:
|
| 285 |
+
import zmq
|
| 286 |
+
except ImportError:
|
| 287 |
+
return False, "pyzmq package not installed. Install with: pip install pyzmq"
|
| 288 |
+
|
| 289 |
+
# Try to check if server is running (don't check package installation here)
|
| 290 |
+
try:
|
| 291 |
+
context = zmq.Context()
|
| 292 |
+
socket = context.socket(zmq.REQ)
|
| 293 |
+
socket.setsockopt(zmq.LINGER, 0)
|
| 294 |
+
socket.settimeout(1000) # 1 second timeout
|
| 295 |
+
socket.connect("tcp://localhost:5555")
|
| 296 |
+
socket.send_string("ping")
|
| 297 |
+
|
| 298 |
+
# Try to receive with timeout
|
| 299 |
+
poller = zmq.Poller()
|
| 300 |
+
poller.register(socket, zmq.POLLIN)
|
| 301 |
+
if poller.poll(1000): # 1 second timeout
|
| 302 |
+
response = socket.recv_string()
|
| 303 |
+
socket.close()
|
| 304 |
+
context.term()
|
| 305 |
+
return True, "Embedding server is running and responding"
|
| 306 |
+
else:
|
| 307 |
+
socket.close()
|
| 308 |
+
context.term()
|
| 309 |
+
return False, "Embedding server not responding on port 5555"
|
| 310 |
+
except zmq.ZMQError as e:
|
| 311 |
+
if "Connection refused" in str(e) or "No such file or directory" in str(e):
|
| 312 |
+
return False, "Embedding server is not running"
|
| 313 |
+
return False, f"Connection error: {str(e)}"
|
| 314 |
+
except Exception as e:
|
| 315 |
+
return False, f"Error checking embedding server: {str(e)}"
|
| 316 |
+
|
| 317 |
+
|
| 318 |
+
def is_sap_rpt_oss_installed() -> bool:
|
| 319 |
+
"""Check if sap-rpt-oss package is installed."""
|
| 320 |
+
try:
|
| 321 |
+
import sap_rpt_oss
|
| 322 |
+
return True
|
| 323 |
+
except ImportError:
|
| 324 |
+
try:
|
| 325 |
+
# Try alternative import paths
|
| 326 |
+
from sap_rpt_oss import SAP_RPT_OSS_Classifier
|
| 327 |
+
return True
|
| 328 |
+
except ImportError:
|
| 329 |
+
return False
|
| 330 |
+
|
| 331 |
+
|
| 332 |
+
def start_embedding_server(gpu_idx: Optional[int] = None) -> Tuple[bool, str]:
|
| 333 |
+
"""
|
| 334 |
+
Start the embedding server automatically.
|
| 335 |
+
|
| 336 |
+
Args:
|
| 337 |
+
gpu_idx: GPU index to use (None for CPU)
|
| 338 |
+
|
| 339 |
+
Returns:
|
| 340 |
+
Tuple of (success, message)
|
| 341 |
+
"""
|
| 342 |
+
# Check if package is installed
|
| 343 |
+
if not is_sap_rpt_oss_installed():
|
| 344 |
+
return False, "sap-rpt-oss package not found. Install with: pip install git+https://github.com/SAP-samples/sap-rpt-1-oss"
|
| 345 |
+
|
| 346 |
+
# Check if server is already running
|
| 347 |
+
is_running, _ = check_embedding_server()
|
| 348 |
+
if is_running:
|
| 349 |
+
return True, "Embedding server is already running"
|
| 350 |
+
|
| 351 |
+
try:
|
| 352 |
+
# Try multiple import paths
|
| 353 |
+
start_func = None
|
| 354 |
+
import_paths = [
|
| 355 |
+
"sap_rpt_oss.scripts.start_embedding_server",
|
| 356 |
+
"sap_rpt_oss.start_embedding_server",
|
| 357 |
+
"sap_rpt_oss.data.tokenizer", # Sometimes server is in tokenizer
|
| 358 |
+
]
|
| 359 |
+
|
| 360 |
+
for import_path in import_paths:
|
| 361 |
+
try:
|
| 362 |
+
module = __import__(import_path, fromlist=['start_embedding_server'])
|
| 363 |
+
if hasattr(module, 'start_embedding_server'):
|
| 364 |
+
start_func = getattr(module, 'start_embedding_server')
|
| 365 |
+
break
|
| 366 |
+
except (ImportError, AttributeError):
|
| 367 |
+
continue
|
| 368 |
+
|
| 369 |
+
if start_func is None:
|
| 370 |
+
# Try using threading approach - the server might start automatically when model is used
|
| 371 |
+
# For now, just inform user that server will start when needed
|
| 372 |
+
return False, "Embedding server will start automatically when the model makes predictions. No manual start needed."
|
| 373 |
+
|
| 374 |
+
# Use threading to start server in background (simpler than subprocess)
|
| 375 |
+
import threading
|
| 376 |
+
|
| 377 |
+
def run_server():
|
| 378 |
+
try:
|
| 379 |
+
start_func(
|
| 380 |
+
sentence_embedding_model_name="sentence-transformers/all-MiniLM-L6-v2",
|
| 381 |
+
gpu_idx=gpu_idx
|
| 382 |
+
)
|
| 383 |
+
except Exception as e:
|
| 384 |
+
# Server might block, that's okay
|
| 385 |
+
pass
|
| 386 |
+
|
| 387 |
+
# Start server in background thread
|
| 388 |
+
server_thread = threading.Thread(target=run_server, daemon=True)
|
| 389 |
+
server_thread.start()
|
| 390 |
+
|
| 391 |
+
# Wait a moment for server to start
|
| 392 |
+
import time
|
| 393 |
+
time.sleep(3)
|
| 394 |
+
|
| 395 |
+
# Check if it started
|
| 396 |
+
is_running, message = check_embedding_server()
|
| 397 |
+
if is_running:
|
| 398 |
+
return True, "Embedding server started successfully in background"
|
| 399 |
+
else:
|
| 400 |
+
# Server might take longer to start, or it starts on-demand
|
| 401 |
+
return False, "Server thread started. The embedding server will be available when the model needs it (starts on-demand during predictions)."
|
| 402 |
+
|
| 403 |
+
except Exception as e:
|
| 404 |
+
# If we can't start it manually, that's okay - SAP-RPT-OSS might start it automatically
|
| 405 |
+
return False, f"Manual start not available: {str(e)}. The embedding server will start automatically when the model makes predictions."
|
| 406 |
+
|
| 407 |
+
|
| 408 |
+
def ensure_embedding_server_running() -> Tuple[bool, str]:
|
| 409 |
+
"""
|
| 410 |
+
Ensure embedding server is running, start it if not.
|
| 411 |
+
Note: SAP-RPT-OSS may start the server automatically when needed.
|
| 412 |
+
|
| 413 |
+
Returns:
|
| 414 |
+
Tuple of (is_running, message)
|
| 415 |
+
"""
|
| 416 |
+
is_running, message = check_embedding_server()
|
| 417 |
+
if is_running:
|
| 418 |
+
return True, message
|
| 419 |
+
|
| 420 |
+
# Try to start it (but don't fail if we can't - server may start on-demand)
|
| 421 |
+
success, start_message = start_embedding_server(None)
|
| 422 |
+
if success:
|
| 423 |
+
return True, f"Auto-started: {start_message}"
|
| 424 |
+
else:
|
| 425 |
+
# Server not running, but SAP-RPT-OSS may start it automatically when model is used
|
| 426 |
+
# This is not a fatal error - the model will attempt to start it when needed
|
| 427 |
+
return False, f"Server not currently running. {start_message}"
|
| 428 |
+
|
utils/visualizations.py
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Visualization Utilities for Financial Data
|
| 3 |
+
|
| 4 |
+
Creates Plotly charts for:
|
| 5 |
+
- Revenue/Expense trends
|
| 6 |
+
- Balance Sheet visualizations
|
| 7 |
+
- GL account transaction summaries
|
| 8 |
+
- Sales order analytics
|
| 9 |
+
"""
|
| 10 |
+
|
| 11 |
+
import pandas as pd
|
| 12 |
+
import plotly.graph_objects as go
|
| 13 |
+
import plotly.express as px
|
| 14 |
+
from typing import Optional, Dict, Any
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def create_revenue_expense_chart(df: pd.DataFrame) -> Dict[str, Any]:
|
| 18 |
+
"""
|
| 19 |
+
Create a revenue and expense trend chart.
|
| 20 |
+
|
| 21 |
+
Args:
|
| 22 |
+
df: DataFrame with financial statement data
|
| 23 |
+
|
| 24 |
+
Returns:
|
| 25 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 26 |
+
"""
|
| 27 |
+
if df.empty or 'Period' not in df.columns:
|
| 28 |
+
return {}
|
| 29 |
+
|
| 30 |
+
fig = go.Figure()
|
| 31 |
+
|
| 32 |
+
if 'Revenue' in df.columns:
|
| 33 |
+
fig.add_trace(go.Scatter(
|
| 34 |
+
x=df['Period'],
|
| 35 |
+
y=df['Revenue'],
|
| 36 |
+
mode='lines+markers',
|
| 37 |
+
name='Revenue',
|
| 38 |
+
line=dict(color='#2ecc71', width=3),
|
| 39 |
+
marker=dict(size=8)
|
| 40 |
+
))
|
| 41 |
+
|
| 42 |
+
if 'Operating_Expenses' in df.columns:
|
| 43 |
+
fig.add_trace(go.Scatter(
|
| 44 |
+
x=df['Period'],
|
| 45 |
+
y=df['Operating_Expenses'],
|
| 46 |
+
mode='lines+markers',
|
| 47 |
+
name='Operating Expenses',
|
| 48 |
+
line=dict(color='#e74c3c', width=3),
|
| 49 |
+
marker=dict(size=8)
|
| 50 |
+
))
|
| 51 |
+
|
| 52 |
+
if 'Net_Income' in df.columns:
|
| 53 |
+
fig.add_trace(go.Scatter(
|
| 54 |
+
x=df['Period'],
|
| 55 |
+
y=df['Net_Income'],
|
| 56 |
+
mode='lines+markers',
|
| 57 |
+
name='Net Income',
|
| 58 |
+
line=dict(color='#3498db', width=3),
|
| 59 |
+
marker=dict(size=8)
|
| 60 |
+
))
|
| 61 |
+
|
| 62 |
+
fig.update_layout(
|
| 63 |
+
title='Revenue and Expense Trends',
|
| 64 |
+
xaxis_title='Period',
|
| 65 |
+
yaxis_title='Amount (USD)',
|
| 66 |
+
hovermode='x unified',
|
| 67 |
+
template='plotly_white',
|
| 68 |
+
height=400
|
| 69 |
+
)
|
| 70 |
+
|
| 71 |
+
return fig.to_dict()
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
def create_balance_sheet_chart(df: pd.DataFrame) -> Dict[str, Any]:
|
| 75 |
+
"""
|
| 76 |
+
Create a balance sheet visualization.
|
| 77 |
+
|
| 78 |
+
Args:
|
| 79 |
+
df: DataFrame with balance sheet data
|
| 80 |
+
|
| 81 |
+
Returns:
|
| 82 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 83 |
+
"""
|
| 84 |
+
if df.empty:
|
| 85 |
+
return {}
|
| 86 |
+
|
| 87 |
+
# Get the most recent period
|
| 88 |
+
latest = df.iloc[-1] if len(df) > 0 else df.iloc[0]
|
| 89 |
+
|
| 90 |
+
# Assets
|
| 91 |
+
assets = {
|
| 92 |
+
'Cash': latest.get('Cash', 0),
|
| 93 |
+
'Accounts Receivable': latest.get('Accounts_Receivable', 0),
|
| 94 |
+
'Inventory': latest.get('Inventory', 0),
|
| 95 |
+
'PPE': latest.get('PPE', 0)
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
# Liabilities
|
| 99 |
+
liabilities = {
|
| 100 |
+
'Accounts Payable': latest.get('Accounts_Payable', 0),
|
| 101 |
+
'Short-term Debt': latest.get('Short_Term_Debt', 0),
|
| 102 |
+
'Long-term Debt': latest.get('Long_Term_Debt', 0)
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
# Equity
|
| 106 |
+
equity = {
|
| 107 |
+
'Equity': latest.get('Equity', 0)
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
fig = go.Figure()
|
| 111 |
+
|
| 112 |
+
# Assets bar
|
| 113 |
+
fig.add_trace(go.Bar(
|
| 114 |
+
name='Assets',
|
| 115 |
+
x=list(assets.keys()),
|
| 116 |
+
y=list(assets.values()),
|
| 117 |
+
marker_color='#2ecc71'
|
| 118 |
+
))
|
| 119 |
+
|
| 120 |
+
# Liabilities bar
|
| 121 |
+
fig.add_trace(go.Bar(
|
| 122 |
+
name='Liabilities',
|
| 123 |
+
x=list(liabilities.keys()),
|
| 124 |
+
y=list(liabilities.values()),
|
| 125 |
+
marker_color='#e74c3c'
|
| 126 |
+
))
|
| 127 |
+
|
| 128 |
+
# Equity bar
|
| 129 |
+
fig.add_trace(go.Bar(
|
| 130 |
+
name='Equity',
|
| 131 |
+
x=list(equity.keys()),
|
| 132 |
+
y=list(equity.values()),
|
| 133 |
+
marker_color='#3498db'
|
| 134 |
+
))
|
| 135 |
+
|
| 136 |
+
fig.update_layout(
|
| 137 |
+
title='Balance Sheet Overview',
|
| 138 |
+
xaxis_title='Category',
|
| 139 |
+
yaxis_title='Amount (USD)',
|
| 140 |
+
barmode='group',
|
| 141 |
+
template='plotly_white',
|
| 142 |
+
height=400
|
| 143 |
+
)
|
| 144 |
+
|
| 145 |
+
return fig.to_dict()
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
def create_gl_summary_chart(df: pd.DataFrame) -> Dict[str, Any]:
|
| 149 |
+
"""
|
| 150 |
+
Create a GL account transaction summary chart.
|
| 151 |
+
|
| 152 |
+
Args:
|
| 153 |
+
df: DataFrame with GL transaction data
|
| 154 |
+
|
| 155 |
+
Returns:
|
| 156 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 157 |
+
"""
|
| 158 |
+
if df.empty or 'Account_Description' not in df.columns:
|
| 159 |
+
return {}
|
| 160 |
+
|
| 161 |
+
# Aggregate by account
|
| 162 |
+
account_summary = df.groupby('Account_Description').agg({
|
| 163 |
+
'Debit': 'sum',
|
| 164 |
+
'Credit': 'sum'
|
| 165 |
+
}).reset_index()
|
| 166 |
+
|
| 167 |
+
account_summary['Net'] = account_summary['Debit'] - account_summary['Credit']
|
| 168 |
+
account_summary = account_summary.sort_values('Net', ascending=True).tail(15)
|
| 169 |
+
|
| 170 |
+
fig = go.Figure()
|
| 171 |
+
|
| 172 |
+
fig.add_trace(go.Bar(
|
| 173 |
+
y=account_summary['Account_Description'],
|
| 174 |
+
x=account_summary['Net'],
|
| 175 |
+
orientation='h',
|
| 176 |
+
marker=dict(
|
| 177 |
+
color=account_summary['Net'],
|
| 178 |
+
colorscale='RdYlGn',
|
| 179 |
+
showscale=True
|
| 180 |
+
)
|
| 181 |
+
))
|
| 182 |
+
|
| 183 |
+
fig.update_layout(
|
| 184 |
+
title='Top 15 GL Accounts by Net Balance',
|
| 185 |
+
xaxis_title='Net Balance (USD)',
|
| 186 |
+
yaxis_title='Account',
|
| 187 |
+
template='plotly_white',
|
| 188 |
+
height=500
|
| 189 |
+
)
|
| 190 |
+
|
| 191 |
+
return fig.to_dict()
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
def create_sales_analytics_chart(df: pd.DataFrame) -> Dict[str, Any]:
|
| 195 |
+
"""
|
| 196 |
+
Create sales order analytics chart.
|
| 197 |
+
|
| 198 |
+
Args:
|
| 199 |
+
df: DataFrame with sales order data
|
| 200 |
+
|
| 201 |
+
Returns:
|
| 202 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 203 |
+
"""
|
| 204 |
+
if df.empty:
|
| 205 |
+
return {}
|
| 206 |
+
|
| 207 |
+
fig = go.Figure()
|
| 208 |
+
|
| 209 |
+
# Sales by region
|
| 210 |
+
if 'Region' in df.columns and 'Total_Amount' in df.columns:
|
| 211 |
+
region_sales = df.groupby('Region')['Total_Amount'].sum().reset_index()
|
| 212 |
+
|
| 213 |
+
fig.add_trace(go.Bar(
|
| 214 |
+
x=region_sales['Region'],
|
| 215 |
+
y=region_sales['Total_Amount'],
|
| 216 |
+
marker_color='#3498db',
|
| 217 |
+
text=region_sales['Total_Amount'].apply(lambda x: f'${x:,.0f}'),
|
| 218 |
+
textposition='outside'
|
| 219 |
+
))
|
| 220 |
+
|
| 221 |
+
fig.update_layout(
|
| 222 |
+
title='Sales by Region',
|
| 223 |
+
xaxis_title='Region',
|
| 224 |
+
yaxis_title='Total Sales (USD)',
|
| 225 |
+
template='plotly_white',
|
| 226 |
+
height=400
|
| 227 |
+
)
|
| 228 |
+
elif 'Product_Name' in df.columns and 'Total_Amount' in df.columns:
|
| 229 |
+
# Sales by product
|
| 230 |
+
product_sales = df.groupby('Product_Name')['Total_Amount'].sum().reset_index()
|
| 231 |
+
product_sales = product_sales.sort_values('Total_Amount', ascending=False).head(10)
|
| 232 |
+
|
| 233 |
+
fig.add_trace(go.Bar(
|
| 234 |
+
x=product_sales['Product_Name'],
|
| 235 |
+
y=product_sales['Total_Amount'],
|
| 236 |
+
marker_color='#9b59b6',
|
| 237 |
+
text=product_sales['Total_Amount'].apply(lambda x: f'${x:,.0f}'),
|
| 238 |
+
textposition='outside'
|
| 239 |
+
))
|
| 240 |
+
|
| 241 |
+
fig.update_layout(
|
| 242 |
+
title='Top 10 Products by Sales',
|
| 243 |
+
xaxis_title='Product',
|
| 244 |
+
yaxis_title='Total Sales (USD)',
|
| 245 |
+
template='plotly_white',
|
| 246 |
+
height=400,
|
| 247 |
+
xaxis_tickangle=-45
|
| 248 |
+
)
|
| 249 |
+
|
| 250 |
+
return fig.to_dict()
|
| 251 |
+
|
| 252 |
+
|
| 253 |
+
def create_sales_trend_chart(df: pd.DataFrame) -> Dict[str, Any]:
|
| 254 |
+
"""
|
| 255 |
+
Create a sales trend over time chart.
|
| 256 |
+
|
| 257 |
+
Args:
|
| 258 |
+
df: DataFrame with sales order data
|
| 259 |
+
|
| 260 |
+
Returns:
|
| 261 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 262 |
+
"""
|
| 263 |
+
if df.empty or 'Order_Date' not in df.columns:
|
| 264 |
+
return {}
|
| 265 |
+
|
| 266 |
+
df['Order_Date'] = pd.to_datetime(df['Order_Date'])
|
| 267 |
+
df['Month'] = df['Order_Date'].dt.to_period('M').astype(str)
|
| 268 |
+
|
| 269 |
+
monthly_sales = df.groupby('Month')['Total_Amount'].sum().reset_index()
|
| 270 |
+
|
| 271 |
+
fig = go.Figure()
|
| 272 |
+
|
| 273 |
+
fig.add_trace(go.Scatter(
|
| 274 |
+
x=monthly_sales['Month'],
|
| 275 |
+
y=monthly_sales['Total_Amount'],
|
| 276 |
+
mode='lines+markers',
|
| 277 |
+
name='Monthly Sales',
|
| 278 |
+
line=dict(color='#3498db', width=3),
|
| 279 |
+
marker=dict(size=8),
|
| 280 |
+
fill='tonexty',
|
| 281 |
+
fillcolor='rgba(52, 152, 219, 0.2)'
|
| 282 |
+
))
|
| 283 |
+
|
| 284 |
+
fig.update_layout(
|
| 285 |
+
title='Sales Trend Over Time',
|
| 286 |
+
xaxis_title='Month',
|
| 287 |
+
yaxis_title='Total Sales (USD)',
|
| 288 |
+
hovermode='x unified',
|
| 289 |
+
template='plotly_white',
|
| 290 |
+
height=400
|
| 291 |
+
)
|
| 292 |
+
|
| 293 |
+
return fig.to_dict()
|
| 294 |
+
|
| 295 |
+
|
| 296 |
+
def create_pie_chart(df: pd.DataFrame, column: str, title: str) -> Dict[str, Any]:
|
| 297 |
+
"""
|
| 298 |
+
Create a pie chart for categorical data.
|
| 299 |
+
|
| 300 |
+
Args:
|
| 301 |
+
df: DataFrame with data
|
| 302 |
+
column: Column name to aggregate
|
| 303 |
+
title: Chart title
|
| 304 |
+
|
| 305 |
+
Returns:
|
| 306 |
+
Plotly figure as dictionary (JSON-serializable)
|
| 307 |
+
"""
|
| 308 |
+
if df.empty or column not in df.columns:
|
| 309 |
+
return {}
|
| 310 |
+
|
| 311 |
+
value_counts = df[column].value_counts().head(10)
|
| 312 |
+
|
| 313 |
+
fig = go.Figure(data=[go.Pie(
|
| 314 |
+
labels=value_counts.index,
|
| 315 |
+
values=value_counts.values,
|
| 316 |
+
hole=0.3
|
| 317 |
+
)])
|
| 318 |
+
|
| 319 |
+
fig.update_layout(
|
| 320 |
+
title=title,
|
| 321 |
+
template='plotly_white',
|
| 322 |
+
height=400
|
| 323 |
+
)
|
| 324 |
+
|
| 325 |
+
return fig.to_dict()
|
| 326 |
+
|
| 327 |
+
|
| 328 |
+
def get_summary_metrics(df: pd.DataFrame, dataset_type: str) -> Dict[str, Any]:
|
| 329 |
+
"""
|
| 330 |
+
Get summary metrics for a dataset.
|
| 331 |
+
|
| 332 |
+
Args:
|
| 333 |
+
df: DataFrame with data
|
| 334 |
+
dataset_type: Type of dataset ('gl', 'financial', 'sales')
|
| 335 |
+
|
| 336 |
+
Returns:
|
| 337 |
+
Dictionary with summary metrics
|
| 338 |
+
"""
|
| 339 |
+
if df.empty:
|
| 340 |
+
return {}
|
| 341 |
+
|
| 342 |
+
metrics = {}
|
| 343 |
+
|
| 344 |
+
if dataset_type == 'gl':
|
| 345 |
+
metrics = {
|
| 346 |
+
'Total Transactions': len(df),
|
| 347 |
+
'Total Debit': df['Debit'].sum() if 'Debit' in df.columns else 0,
|
| 348 |
+
'Total Credit': df['Credit'].sum() if 'Credit' in df.columns else 0,
|
| 349 |
+
'Unique Accounts': df['Account_Code'].nunique() if 'Account_Code' in df.columns else 0
|
| 350 |
+
}
|
| 351 |
+
elif dataset_type == 'financial':
|
| 352 |
+
latest = df.iloc[-1] if len(df) > 0 else df.iloc[0]
|
| 353 |
+
metrics = {
|
| 354 |
+
'Periods': len(df),
|
| 355 |
+
'Latest Revenue': latest.get('Revenue', 0),
|
| 356 |
+
'Latest Net Income': latest.get('Net_Income', 0),
|
| 357 |
+
'Total Assets': latest.get('Total_Assets', 0)
|
| 358 |
+
}
|
| 359 |
+
elif dataset_type == 'sales':
|
| 360 |
+
metrics = {
|
| 361 |
+
'Total Orders': len(df),
|
| 362 |
+
'Total Sales': df['Total_Amount'].sum() if 'Total_Amount' in df.columns else 0,
|
| 363 |
+
'Average Order Value': df['Total_Amount'].mean() if 'Total_Amount' in df.columns else 0,
|
| 364 |
+
'Unique Customers': df['Customer_ID'].nunique() if 'Customer_ID' in df.columns else 0
|
| 365 |
+
}
|
| 366 |
+
|
| 367 |
+
return metrics
|
| 368 |
+
|
| 369 |
+
|
| 370 |
+
def create_prediction_distribution_chart(predictions: list, labels: dict, title: str = "Prediction Distribution") -> Dict[str, Any]:
|
| 371 |
+
"""
|
| 372 |
+
Create a pie chart showing prediction distribution.
|
| 373 |
+
|
| 374 |
+
Args:
|
| 375 |
+
predictions: List of prediction values (0, 1, etc.)
|
| 376 |
+
labels: Dictionary mapping values to labels
|
| 377 |
+
title: Chart title
|
| 378 |
+
|
| 379 |
+
Returns:
|
| 380 |
+
Plotly figure as dictionary
|
| 381 |
+
"""
|
| 382 |
+
import numpy as np
|
| 383 |
+
|
| 384 |
+
predictions = np.array(predictions)
|
| 385 |
+
unique, counts = np.unique(predictions, return_counts=True)
|
| 386 |
+
|
| 387 |
+
pie_labels = [labels.get(int(val), f"Class {int(val)}") for val in unique]
|
| 388 |
+
|
| 389 |
+
colors = ['#3498db', '#2ecc71', '#e74c3c', '#f39c12', '#9b59b6']
|
| 390 |
+
|
| 391 |
+
fig = go.Figure(data=[go.Pie(
|
| 392 |
+
labels=pie_labels,
|
| 393 |
+
values=counts,
|
| 394 |
+
hole=0.4,
|
| 395 |
+
marker=dict(colors=colors[:len(unique)]),
|
| 396 |
+
textinfo='label+percent+value',
|
| 397 |
+
textfont_size=14
|
| 398 |
+
)])
|
| 399 |
+
|
| 400 |
+
fig.update_layout(
|
| 401 |
+
title=dict(text=title, font=dict(size=20, color='#2c3e50')),
|
| 402 |
+
template='plotly_white',
|
| 403 |
+
height=400,
|
| 404 |
+
showlegend=True,
|
| 405 |
+
legend=dict(
|
| 406 |
+
orientation="h",
|
| 407 |
+
yanchor="bottom",
|
| 408 |
+
y=-0.2,
|
| 409 |
+
xanchor="center",
|
| 410 |
+
x=0.5
|
| 411 |
+
)
|
| 412 |
+
)
|
| 413 |
+
|
| 414 |
+
return fig.to_dict()
|
| 415 |
+
|
| 416 |
+
|
| 417 |
+
def create_prediction_bar_chart(predictions: list, labels: dict, title: str = "Prediction Summary") -> Dict[str, Any]:
|
| 418 |
+
"""
|
| 419 |
+
Create a bar chart showing prediction counts.
|
| 420 |
+
|
| 421 |
+
Args:
|
| 422 |
+
predictions: List of prediction values
|
| 423 |
+
labels: Dictionary mapping values to labels
|
| 424 |
+
title: Chart title
|
| 425 |
+
|
| 426 |
+
Returns:
|
| 427 |
+
Plotly figure as dictionary
|
| 428 |
+
"""
|
| 429 |
+
import numpy as np
|
| 430 |
+
|
| 431 |
+
predictions = np.array(predictions)
|
| 432 |
+
unique, counts = np.unique(predictions, return_counts=True)
|
| 433 |
+
|
| 434 |
+
bar_labels = [labels.get(int(val), f"Class {int(val)}") for val in unique]
|
| 435 |
+
percentages = (counts / len(predictions) * 100).round(1)
|
| 436 |
+
|
| 437 |
+
colors = ['#3498db' if val == 0 else '#2ecc71' for val in unique]
|
| 438 |
+
|
| 439 |
+
fig = go.Figure(data=[go.Bar(
|
| 440 |
+
x=bar_labels,
|
| 441 |
+
y=counts,
|
| 442 |
+
marker_color=colors,
|
| 443 |
+
text=[f'{count}<br>({pct}%)' for count, pct in zip(counts, percentages)],
|
| 444 |
+
textposition='outside',
|
| 445 |
+
textfont=dict(size=14, color='#2c3e50')
|
| 446 |
+
)])
|
| 447 |
+
|
| 448 |
+
fig.update_layout(
|
| 449 |
+
title=dict(text=title, font=dict(size=20, color='#2c3e50')),
|
| 450 |
+
xaxis_title="Classification",
|
| 451 |
+
yaxis_title="Count",
|
| 452 |
+
template='plotly_white',
|
| 453 |
+
height=400,
|
| 454 |
+
showlegend=False
|
| 455 |
+
)
|
| 456 |
+
|
| 457 |
+
return fig.to_dict()
|
| 458 |
+
|
| 459 |
+
|
| 460 |
+
def create_confidence_gauge(confidence_score: float, title: str = "Model Confidence") -> Dict[str, Any]:
|
| 461 |
+
"""
|
| 462 |
+
Create a gauge chart showing model confidence.
|
| 463 |
+
|
| 464 |
+
Args:
|
| 465 |
+
confidence_score: Confidence score (0-100)
|
| 466 |
+
title: Chart title
|
| 467 |
+
|
| 468 |
+
Returns:
|
| 469 |
+
Plotly figure as dictionary
|
| 470 |
+
"""
|
| 471 |
+
fig = go.Figure(go.Indicator(
|
| 472 |
+
mode="gauge+number+delta",
|
| 473 |
+
value=confidence_score,
|
| 474 |
+
domain={'x': [0, 1], 'y': [0, 1]},
|
| 475 |
+
title={'text': title, 'font': {'size': 20}},
|
| 476 |
+
delta={'reference': 50},
|
| 477 |
+
gauge={
|
| 478 |
+
'axis': {'range': [None, 100], 'tickwidth': 1, 'tickcolor': "darkblue"},
|
| 479 |
+
'bar': {'color': "darkblue"},
|
| 480 |
+
'bgcolor': "white",
|
| 481 |
+
'borderwidth': 2,
|
| 482 |
+
'bordercolor': "gray",
|
| 483 |
+
'steps': [
|
| 484 |
+
{'range': [0, 33], 'color': '#e74c3c'},
|
| 485 |
+
{'range': [33, 66], 'color': '#f39c12'},
|
| 486 |
+
{'range': [66, 100], 'color': '#2ecc71'}
|
| 487 |
+
],
|
| 488 |
+
'threshold': {
|
| 489 |
+
'line': {'color': "red", 'width': 4},
|
| 490 |
+
'thickness': 0.75,
|
| 491 |
+
'value': 90
|
| 492 |
+
}
|
| 493 |
+
}
|
| 494 |
+
))
|
| 495 |
+
|
| 496 |
+
fig.update_layout(
|
| 497 |
+
height=300,
|
| 498 |
+
margin=dict(l=20, r=20, t=40, b=20)
|
| 499 |
+
)
|
| 500 |
+
|
| 501 |
+
return fig.to_dict()
|
| 502 |
+
|