Files
roa2web-service-auto/scripts/service-helpers.sh
Claude Agent b4a226409c feat(data-entry): Add unified receipt form with OCR confidence tracking
New unified receipt creation system with:
- UnifiedReceiptForm component with inline OCR preview and confidence indicators
- Compact upload zone with drag-drop and camera support
- TVA and Payment fields with dynamic add/remove
- Supplier dual-field with autocomplete and OCR hint
- Receipt form sections with collapsible auxiliary data

Backend OCR improvements:
- Add confidence_tva and confidence_payment to extraction results
- Update TVA extraction to return confidence scores
- Include TVA (15%) and payment (10%) in overall_confidence calculation

Also includes:
- CSS design system rules documentation
- Port check helper function for service scripts
- Expanded design tokens documentation in CLAUDE.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 21:48:37 +00:00

186 lines
5.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Service Helper Functions for ROA2WEB Unified App
# Shared functions for service management scripts
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Wait for a port to become available
# Usage: wait_for_port <port> <service_name> [timeout_seconds]
wait_for_port() {
local port=$1
local service_name=$2
local timeout=${3:-30}
local elapsed=0
local interval=1
echo -e "${BLUE}⏳ Waiting for ${service_name} on port ${port}...${NC}"
while [ $elapsed -lt $timeout ]; do
if netstat -tuln 2>/dev/null | grep -q ":${port} " || ss -tuln 2>/dev/null | grep -q ":${port} "; then
echo -e "${GREEN}${service_name} is ready on port ${port}${NC}"
return 0
fi
sleep $interval
elapsed=$((elapsed + interval))
done
echo -e "${RED}✗ Timeout waiting for ${service_name} on port ${port}${NC}"
return 1
}
# Kill process on a specific port
# Usage: kill_port <port> <service_name>
kill_port() {
local port=$1
local service_name=$2
echo -e "${YELLOW}🛑 Stopping ${service_name} on port ${port}...${NC}"
# Try lsof first
if command -v lsof &> /dev/null; then
local pids=$(lsof -ti:${port} 2>/dev/null)
if [ -n "$pids" ]; then
echo "$pids" | xargs kill -KILL 2>/dev/null
sleep 1
echo -e "${GREEN}${service_name} stopped${NC}"
return 0
fi
fi
# Fallback to netstat/ss
local pids=$(netstat -tlnp 2>/dev/null | grep ":${port} " | awk '{print $7}' | cut -d'/' -f1)
if [ -z "$pids" ]; then
pids=$(ss -tlnp 2>/dev/null | grep ":${port} " | grep -oP 'pid=\K[0-9]+')
fi
if [ -n "$pids" ]; then
echo "$pids" | xargs kill -KILL 2>/dev/null
sleep 1
echo -e "${GREEN}${service_name} stopped${NC}"
return 0
fi
echo -e "${YELLOW}⚠ No process found on port ${port}${NC}"
return 0
}
# Check if a service is running on a port
# Usage: check_service_status <port> <service_name>
check_service_status() {
local port=$1
local service_name=$2
if netstat -tuln 2>/dev/null | grep -q ":${port} " || ss -tuln 2>/dev/null | grep -q ":${port} "; then
echo -e "${GREEN}${service_name} is RUNNING on port ${port}${NC}"
# Try to get process info
if command -v lsof &> /dev/null; then
local pid=$(lsof -ti:${port} 2>/dev/null | head -1)
if [ -n "$pid" ]; then
echo -e " ${BLUE}PID: ${pid}${NC}"
local cmd=$(ps -p $pid -o comm= 2>/dev/null)
if [ -n "$cmd" ]; then
echo -e " ${BLUE}Command: ${cmd}${NC}"
fi
fi
fi
return 0
else
echo -e "${RED}${service_name} is NOT running (port ${port} not in use)${NC}"
return 1
fi
}
# Tail logs with error highlighting
# Usage: tail_logs <log_file> [lines]
tail_logs() {
local log_file=$1
local lines=${2:-20}
if [ ! -f "$log_file" ]; then
echo -e "${RED}✗ Log file not found: ${log_file}${NC}"
return 1
fi
echo -e "${BLUE}📄 Last ${lines} lines from ${log_file}:${NC}"
echo "─────────────────────────────────────────"
# Highlight errors in red
tail -n $lines "$log_file" | sed -e "s/ERROR/${RED}ERROR${NC}/g" \
-e "s/CRITICAL/${RED}CRITICAL${NC}/g" \
-e "s/WARNING/${YELLOW}WARNING${NC}/g" \
-e "s/INFO/${GREEN}INFO${NC}/g"
echo "─────────────────────────────────────────"
}
# Check if port is already in use
# Usage: check_port_available <port> <service_name>
# Returns 0 if port is FREE, 1 if OCCUPIED
check_port_available() {
local port=$1
local service_name=$2
if netstat -tuln 2>/dev/null | grep -q ":${port} " || ss -tuln 2>/dev/null | grep -q ":${port} "; then
echo -e "${YELLOW}⚠ Port ${port} is already in use (${service_name} may already be running)${NC}"
return 1
else
return 0
fi
}
# Check if port is in use (opposite of check_port_available)
# Usage: check_port_in_use <port>
# Returns 0 if port IS IN USE, 1 if FREE
check_port_in_use() {
local port=$1
if netstat -tuln 2>/dev/null | grep -q ":${port} " || \
ss -tuln 2>/dev/null | grep -q ":${port} " || \
lsof -ti:${port} &>/dev/null; then
return 0 # Port is in use
else
return 1 # Port is free
fi
}
# Display a nice header
# Usage: print_header "Title"
print_header() {
local title=$1
echo ""
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo -e "${BLUE} ${title}${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
}
# Display success message
# Usage: print_success "Message"
print_success() {
echo -e "${GREEN}$1${NC}"
}
# Display error message
# Usage: print_error "Message"
print_error() {
echo -e "${RED}$1${NC}"
}
# Display warning message
# Usage: print_warning "Message"
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
# Display info message
# Usage: print_info "Message"
print_info() {
echo -e "${BLUE} $1${NC}"
}