From 4e94827206539b69e59b3b287bc9ec3553d5af21 Mon Sep 17 00:00:00 2001 From: kvillers Date: Thu, 30 Apr 2026 16:43:10 +0200 Subject: [PATCH] README --- README.md | 257 ++++++++++++++++++++++++++++++++++++++- docs/images/Octopus8.ico | Bin 0 -> 55365 bytes 2 files changed, 254 insertions(+), 3 deletions(-) create mode 100755 docs/images/Octopus8.ico diff --git a/README.md b/README.md index e722efb..1779ef6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,256 @@ -# Antares get data +# ๐Ÿ™ Antares Data Exporter -Small Rust utility that fetches product data from the Antares B2B web service and saves it as pretty-formatted JSON (`antares.json`). +
-Includes serde-backed structs in `src/template/antares.rs` for deserializing the API response. \ No newline at end of file +![Octopus ERP Converter](docs/images/Octopus8.ico) + +**A powerful Rust utility for fetching Antares B2B product data and exporting to Excel** + +[Features](#features) โ€ข [Installation](#installation) โ€ข [Usage](#usage) โ€ข [Configuration](#configuration) โ€ข [Architecture](#architecture) + +
+ +--- + +## Overview + +**Antares Data Exporter** is a high-performance Rust utility that seamlessly integrates with the Antares B2B web service to fetch product catalog data and export it to Excel with intelligent field mapping and business rule validation. Perfect for inventory management, data migration, and supply chain automation. + +## โœจ Features + +- ๐Ÿš€ **Fast & Efficient** - Blocking HTTP client with 300-second timeout for reliable operations +- ๐Ÿ“Š **Excel Export** - Intelligent field mapping with 8 carefully curated columns +- ๐Ÿง  **Smart Row Filtering** - Automatically skips incomplete records based on business rules +- ๐Ÿ“ **Dual Logging** - All events logged to both terminal and daily log files +- ๐ŸŽฏ **Flexible Output** - Support for custom file paths or directory-based exports +- ๐Ÿ” **Secure Credentials** - Environment-based credential management, no hardcoding +- ๐Ÿ—๏ธ **Modular Architecture** - Clean separation of concerns for easy extension +- ๐Ÿ“ฆ **Auto Directory Creation** - Creates necessary directories on first run + +## ๐Ÿ› ๏ธ Technology Stack + +- **Language:** Rust (2024 edition) +- **HTTP Client:** reqwest with blocking mode +- **Excel:** rust_xlsxwriter +- **Environment:** dotenv +- **Date/Time:** chrono + +## ๐Ÿ“‹ Prerequisites + +- Rust 1.70+ (with Cargo) +- Valid Antares B2B API credentials (usercode & password) +- Write access to create `log/`, `out/`, and `antares.json` at repo root + +## ๐Ÿ“ฅ Installation + +```bash +# Clone the repository +git clone https://github.com/yourusername/antares_get_data.git +cd antares_get_data + +# Create .env from template +cp .env.example .env + +# Configure your credentials +nano .env # or your favorite editor +``` + +## โš™๏ธ Configuration + +Edit `.env` with your Antares credentials and output preferences: + +```env +# Antares B2B API credentials +ANTARES_USERCODE=your_usercode +ANTARES_PASSWORD=your_password_hash + +# Output path for Excel file +# - Directory: Creates 'antares.xlsx' inside +# - File path (*.xlsx): Creates file at exact location +OUT=out +``` + +### OUT Path Examples + +```env +OUT=out # โ†’ out/antares.xlsx +OUT=exports/data.xlsx # โ†’ exports/data.xlsx +OUT=/tmp/antares/report.xlsx # โ†’ /tmp/antares/report.xlsx +``` + +## ๐Ÿš€ Usage + +```bash +# Build the project +cargo build --release + +# Run the data exporter +cargo run + +# Or run the compiled binary directly +./target/release/antares_get_data +``` + +### What Happens on Execution + +1. โœ… **Initialization** - Logger created, output directory prepared +2. ๐Ÿ” **Credential Loading** - Env vars validated and loaded +3. ๐ŸŒ **API Request** - Fetches product data from Antares B2B (300s timeout) +4. ๐Ÿ“Š **Data Processing** - Deserializes JSON into typed structs +5. ๐Ÿ“ **JSON Export** - Saves raw response to `antares.json` +6. ๐Ÿ“‹ **Excel Export** - Generates filtered, formatted Excel file +7. ๐Ÿ“‹ **Logging** - All events logged to `log/YYYY-MM-DD.log` + terminal + +## ๐Ÿ“‹ Excel Output + +The generated Excel file contains 8 columns of curated product data: + +| Column | Source | Notes | +|--------|--------|-------| +| BESZCIKKSZAM | cikkszam | Product ID (required) | +| GYCIKKSZAM | cikkszam | Duplicate of BESZCIKKSZAM | +| BESZCIKKNEV | cikk_megnevezes_rovid / cikk_megnevezes | Product name (required) | +| GYARTO | Constant: "EGYEB" | Manufacturer code | +| CIKKAZON | vonalkod | Barcode (if available) | +| KESZLET | szabad_keszlet | Available stock | +| ME | mennyisegi_egyseg_kod | Unit of measure | +| EGYSEGAR | netto_kisker_ar / "Alap รกr" | Net unit price | + +**Filtering Rules:** +- Rows are skipped if `BESZCIKKSZAM` is empty +- Rows are skipped if both `BESZCIKKNEV` sources are empty +- Product name prefers short form (`cikk_megnevezes_rovid`), falls back to full form +- Unit price prefers direct field; searches `cikk_jellemzok` for "Alap รกr" if zero + +## ๐Ÿ“ Project Structure + +``` +antares_get_data/ +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ main.rs # Pipeline orchestration +โ”‚ โ”œโ”€โ”€ api/ +โ”‚ โ”‚ โ”œโ”€โ”€ mod.rs +โ”‚ โ”‚ โ””โ”€โ”€ client.rs # Antares B2B URL builder +โ”‚ โ”œโ”€โ”€ tools/ +โ”‚ โ”‚ โ”œโ”€โ”€ mod.rs +โ”‚ โ”‚ โ”œโ”€โ”€ excel.rs # Excel export with field mapping +โ”‚ โ”‚ โ””โ”€โ”€ logger.rs # Dual-output logging system +โ”‚ โ””โ”€โ”€ template/ +โ”‚ โ”œโ”€โ”€ mod.rs +โ”‚ โ””โ”€โ”€ antares.rs # Serde models for API schema +โ”œโ”€โ”€ .env.example # Configuration template +โ”œโ”€โ”€ Cargo.toml # Rust dependencies +โ””โ”€โ”€ README.md # This file +``` + +## ๐Ÿ—๏ธ Architecture + +### Modular Design + +- **`src/api/client.rs`** - Builds Antares B2B API URLs +- **`src/tools/excel.rs`** - Intelligent Excel export with business rules +- **`src/tools/logger.rs`** - Dual logging (terminal + file) to `log/{YYYY-MM-DD}.log` +- **`src/template/antares.rs`** - Serde models matching Antares B2B schema +- **`src/main.rs`** - Clean orchestration without implementation details + +### Pipeline Flow + +``` +Load Env Vars + โ†“ +Initialize Logger + โ†“ +Build API URL + โ†“ +Fetch from Antares B2B (300s timeout) + โ†“ +Deserialize JSON โ†’ Save to antares.json + โ†“ +Export Filtered Data โ†’ Excel (with logging) + โ†“ +Log Summary + Results +``` + +## ๐Ÿ“ Logging + +All operations are logged to two destinations simultaneously: + +**Terminal Output:** +``` +[2026-04-30 16:30:15] โ„น Starting Antares data export +[2026-04-30 16:30:22] โœ“ API call successful - Fetched 142 items +[2026-04-30 16:30:25] โœ“ Export successful - 142 rows exported to out/antares_export.xlsx +``` + +**Log Files:** `log/2026-04-30.log` (daily rotation) + +## ๐Ÿงช Development + +```bash +# Format code +cargo fmt --all -- --check + +# Lint with Clippy +cargo clippy --all-targets -- -D warnings + +# Run tests +cargo test + +# Build optimized release +cargo build --release +``` + +## ๐Ÿ“ฆ Generated Artifacts + +After running, you'll find: + +- **`antares.json`** - Full, pretty-printed API response +- **`out/antares_export.xlsx`** - Filtered Excel export (or custom path) +- **`log/YYYY-MM-DD.log`** - Daily operation log + +All are automatically created and git-ignored. + +## ๐Ÿ” Security Notes + +- โœ… Credentials stored only in `.env` (git-ignored) +- โœ… `.env.example` documents required variables without secrets +- โœ… No hardcoded credentials in source code +- โœ… API passwords transmitted over HTTPS only + +## ๐Ÿ› Troubleshooting + +**Missing ANTARES_USERCODE error:** +``` +Create .env file in repo root with: +ANTARES_USERCODE=your_code +ANTARES_PASSWORD=your_password +OUT=out +``` + +**Invalid OUT path error:** +``` +Ensure OUT is either: +- A directory (created if missing): OUT=out +- A .xlsx file: OUT=export/data.xlsx +``` + +**API timeout:** +- Default timeout is 300 seconds (5 minutes) +- Check your network connection +- Verify Antares B2B service is available + +## ๐Ÿ“„ License + +[Add your license here] + +## ๐Ÿค Contributing + +Contributions welcome! Please follow the module structure and keep the architecture clean. + +--- + +
+ +**Built with โค๏ธ for Antares B2B integration** + +
\ No newline at end of file diff --git a/docs/images/Octopus8.ico b/docs/images/Octopus8.ico new file mode 100755 index 0000000000000000000000000000000000000000..8a688db0c73436e0b3b37711750b3509ff6de687 GIT binary patch literal 55365 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 literal 0 HcmV?d00001